Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(ext/kv): align error messages #25500

Merged
merged 1 commit into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 21 additions & 17 deletions ext/kv/01_db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,15 @@ const maxQueueDelay = 30 * 24 * 60 * 60 * 1000;

function validateQueueDelay(delay: number) {
if (delay < 0) {
throw new TypeError("delay cannot be negative");
throw new TypeError(`Delay must be >= 0: received ${delay}`);
}
if (delay > maxQueueDelay) {
throw new TypeError("delay cannot be greater than 30 days");
throw new TypeError(
`Delay cannot be greater than 30 days: received ${delay}`,
);
}
if (NumberIsNaN(delay)) {
throw new TypeError("delay cannot be NaN");
throw new TypeError("Delay cannot be NaN");
}
}

Expand All @@ -75,15 +77,15 @@ const maxQueueBackoffInterval = 60 * 60 * 1000;

function validateBackoffSchedule(backoffSchedule: number[]) {
if (backoffSchedule.length > maxQueueBackoffIntervals) {
throw new TypeError("invalid backoffSchedule");
throw new TypeError("Invalid backoffSchedule");
}
for (let i = 0; i < backoffSchedule.length; ++i) {
const interval = backoffSchedule[i];
if (
interval < 0 || interval > maxQueueBackoffInterval ||
NumberIsNaN(interval)
) {
throw new TypeError("invalid backoffSchedule");
throw new TypeError("Invalid backoffSchedule");
}
}
}
Expand Down Expand Up @@ -115,7 +117,7 @@ class Kv {
constructor(rid: number = undefined, symbol: symbol = undefined) {
if (kvSymbol !== symbol) {
throw new TypeError(
"Deno.Kv can not be constructed, use Deno.openKv instead.",
"Deno.Kv can not be constructed: use Deno.openKv instead",
);
}
this.#rid = rid;
Expand Down Expand Up @@ -213,7 +215,7 @@ class Kv {
} = { __proto__: null },
): KvListIterator {
if (options.limit !== undefined && options.limit <= 0) {
throw new Error("limit must be positive");
throw new Error(`Limit must be positive: received ${options.limit}`);
}

let batchSize = options.batchSize ?? (options.limit ?? 100);
Expand Down Expand Up @@ -291,7 +293,7 @@ class Kv {
handler: (message: unknown) => Promise<void> | void,
): Promise<void> {
if (this.#isClosed) {
throw new Error("already closed");
throw new Error("Queue already closed");
}
const finishMessageOps = new SafeMap<number, Promise<void>>();
while (true) {
Expand Down Expand Up @@ -368,7 +370,7 @@ class Kv {
if (updates[i] === "unchanged") {
if (lastEntries[i] === undefined) {
throw new Error(
"watch: invalid unchanged update (internal error)",
"'watch': invalid unchanged update (internal error)",
);
}
continue;
Expand Down Expand Up @@ -449,7 +451,7 @@ class AtomicOperation {
case "delete":
type = "delete";
if (mutation.value) {
throw new TypeError("invalid mutation 'delete' with value");
throw new TypeError("Invalid mutation 'delete' with value");
}
break;
case "set":
Expand All @@ -462,7 +464,7 @@ class AtomicOperation {
case "max":
type = mutation.type;
if (!ObjectHasOwn(mutation, "value")) {
throw new TypeError(`invalid mutation '${type}' without value`);
throw new TypeError(`Invalid mutation '${type}' without value`);
}
value = serializeValue(mutation.value);
break;
Expand Down Expand Up @@ -559,7 +561,7 @@ class AtomicOperation {

then() {
throw new TypeError(
"`Deno.AtomicOperation` is not a promise. Did you forget to call `commit()`?",
"'Deno.AtomicOperation' is not a promise: did you forget to call 'commit()'",
);
}
}
Expand All @@ -572,13 +574,15 @@ class KvU64 {

constructor(value: bigint) {
if (typeof value !== "bigint") {
throw new TypeError("value must be a bigint");
throw new TypeError(`Value must be a bigint: received ${typeof value}`);
}
if (value < MIN_U64) {
throw new RangeError("value must be a positive bigint");
throw new RangeError(
`Value must be a positive bigint: received ${value}`,
);
}
if (value > MAX_U64) {
throw new RangeError("value must fit in a 64-bit unsigned integer");
throw new RangeError("Value must fit in a 64-bit unsigned integer");
}
this.value = value;
ObjectFreeze(this);
Expand Down Expand Up @@ -709,7 +713,7 @@ class KvListIterator extends AsyncIterator
if (prefix) {
if (start && end) {
throw new TypeError(
"Selector can not specify both 'start' and 'end' key when specifying 'prefix'.",
"Selector can not specify both 'start' and 'end' key when specifying 'prefix'",
);
}
if (start) {
Expand All @@ -724,7 +728,7 @@ class KvListIterator extends AsyncIterator
this.#selector = { start, end };
} else {
throw new TypeError(
"Selector must specify either 'prefix' or both 'start' and 'end' key.",
"Selector must specify either 'prefix' or both 'start' and 'end' key",
);
}
}
Expand Down
36 changes: 18 additions & 18 deletions ext/kv/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ where

if ranges.len() > config.max_read_ranges {
return Err(type_error(format!(
"too many ranges (max {})",
"Too many ranges (max {})",
config.max_read_ranges
)));
}
Expand Down Expand Up @@ -311,7 +311,7 @@ where

if total_entries > config.max_read_entries {
return Err(type_error(format!(
"too many entries (max {})",
"Too many entries (max {})",
config.max_read_entries
)));
}
Expand Down Expand Up @@ -393,7 +393,7 @@ where

if keys.len() > config.max_watched_keys {
return Err(type_error(format!(
"too many keys (max {})",
"Too many keys (max {})",
config.max_watched_keys
)));
}
Expand Down Expand Up @@ -544,10 +544,10 @@ fn mutation_from_v8(
MutationKind::SetSuffixVersionstampedKey(value.try_into()?)
}
(op, Some(_)) => {
return Err(type_error(format!("invalid mutation '{op}' with value")))
return Err(type_error(format!("Invalid mutation '{op}' with value")))
}
(op, None) => {
return Err(type_error(format!("invalid mutation '{op}' without value")))
return Err(type_error(format!("Invalid mutation '{op}' without value")))
}
};
Ok(Mutation {
Expand Down Expand Up @@ -613,7 +613,7 @@ impl RawSelector {
(Some(prefix), Some(start), None) => {
if !start.starts_with(&prefix) || start.len() == prefix.len() {
return Err(type_error(
"start key is not in the keyspace defined by prefix",
"Start key is not in the keyspace defined by prefix",
));
}
Ok(Self::Prefixed {
Expand All @@ -625,7 +625,7 @@ impl RawSelector {
(Some(prefix), None, Some(end)) => {
if !end.starts_with(&prefix) || end.len() == prefix.len() {
return Err(type_error(
"end key is not in the keyspace defined by prefix",
"End key is not in the keyspace defined by prefix",
));
}
Ok(Self::Prefixed {
Expand All @@ -636,15 +636,15 @@ impl RawSelector {
}
(None, Some(start), Some(end)) => {
if start > end {
return Err(type_error("start key is greater than end key"));
return Err(type_error("Start key is greater than end key"));
}
Ok(Self::Range { start, end })
}
(None, Some(start), None) => {
let end = start.iter().copied().chain(Some(0)).collect();
Ok(Self::Range { start, end })
}
_ => Err(type_error("invalid range")),
_ => Err(type_error("Invalid range")),
}
}

Expand Down Expand Up @@ -706,7 +706,7 @@ fn encode_cursor(
) -> Result<String, AnyError> {
let common_prefix = selector.common_prefix();
if !boundary_key.starts_with(common_prefix) {
return Err(type_error("invalid boundary key"));
return Err(type_error("Invalid boundary key"));
}
Ok(BASE64_URL_SAFE.encode(&boundary_key[common_prefix.len()..]))
}
Expand Down Expand Up @@ -788,14 +788,14 @@ where

if checks.len() > config.max_checks {
return Err(type_error(format!(
"too many checks (max {})",
"Too many checks (max {})",
config.max_checks
)));
}

if mutations.len() + enqueues.len() > config.max_mutations {
return Err(type_error(format!(
"too many mutations (max {})",
"Too many mutations (max {})",
config.max_mutations
)));
}
Expand All @@ -809,7 +809,7 @@ where
.into_iter()
.map(|mutation| mutation_from_v8((mutation, current_timestamp)))
.collect::<Result<Vec<Mutation>, AnyError>>()
.with_context(|| "invalid mutation")?;
.with_context(|| "Invalid mutation")?;
let enqueues = enqueues
.into_iter()
.map(|e| enqueue_from_v8(e, current_timestamp))
Expand Down Expand Up @@ -850,14 +850,14 @@ where

if total_payload_size > config.max_total_mutation_size_bytes {
return Err(type_error(format!(
"total mutation size too large (max {} bytes)",
"Total mutation size too large (max {} bytes)",
config.max_total_mutation_size_bytes
)));
}

if total_key_size > config.max_total_key_size_bytes {
return Err(type_error(format!(
"total key size too large (max {} bytes)",
"Total key size too large (max {} bytes)",
config.max_total_key_size_bytes
)));
}
Expand Down Expand Up @@ -891,7 +891,7 @@ fn op_kv_encode_cursor(
fn check_read_key_size(key: &[u8], config: &KvConfig) -> Result<(), AnyError> {
if key.len() > config.max_read_key_size_bytes {
Err(type_error(format!(
"key too large for read (max {} bytes)",
"Key too large for read (max {} bytes)",
config.max_read_key_size_bytes
)))
} else {
Expand All @@ -905,7 +905,7 @@ fn check_write_key_size(
) -> Result<usize, AnyError> {
if key.len() > config.max_write_key_size_bytes {
Err(type_error(format!(
"key too large for write (max {} bytes)",
"Key too large for write (max {} bytes)",
config.max_write_key_size_bytes
)))
} else {
Expand All @@ -925,7 +925,7 @@ fn check_value_size(

if payload.len() > config.max_value_size_bytes {
Err(type_error(format!(
"value too large (max {} bytes)",
"Value too large (max {} bytes)",
config.max_value_size_bytes
)))
} else {
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/kv_queue_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ Deno.test({}, async function queueTestDbClose() {
await db.listenQueue(() => {});
assertFalse(false);
} catch (e) {
assertEquals((e as Error).message, "already closed");
assertEquals((e as Error).message, "Queue already closed");
}
});
Loading