Skip to content

Commit 73bed39

Browse files
committed
fix: allow batch_atomic to load in browsers
1 parent 4bbb90f commit 73bed39

File tree

5 files changed

+394
-5
lines changed

5 files changed

+394
-5
lines changed

batched_atomic.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@
2929
* @module
3030
*/
3131

32-
import { estimateSize } from "@deno/kv-utils/estimate-size";
33-
3432
import { BLOB_KEY, BLOB_META_KEY, setBlob } from "./blob_util.ts";
3533
import { keys } from "./keys.ts";
3634

@@ -58,6 +56,26 @@ const MAX_MUTATIONS = 999;
5856
const MAX_TOTAL_MUTATION_SIZE_BYTES = 750_000;
5957
const MAX_TOTAL_KEY_SIZE_BYTES = 75_000;
6058

59+
/**
60+
* Estimates the size of a value in bytes, which is used to determine the size of entries being stored in a Deno KV
61+
* store.
62+
*
63+
* This is done this way to make this module loadable in environments where the V8 `serialize` function is not
64+
* available, such as a web browser.
65+
*/
66+
const estimateSize = await ("Deno" in globalThis || "process" in globalThis
67+
? (async () => {
68+
const { serialize } = await import("node:v8");
69+
return (value: unknown) => {
70+
const buffer = serialize(value);
71+
return buffer.byteLength;
72+
};
73+
})()
74+
: (async () => {
75+
const { estimateSize } = await import("./estimate_size.ts");
76+
return estimateSize;
77+
})());
78+
6179
/**
6280
* The class that encapsulates the batched atomic operations. Works around
6381
* limitations imposed by Deno KV related to individual atomic operations.

deno.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@kitsonk/kv-toolbox",
3-
"version": "0.29.2",
3+
"version": "0.29.3-beta.1",
44
"exports": {
55
".": "./toolbox.ts",
66
"./batched_atomic": "./batched_atomic.ts",

estimate_size.test.ts

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
// Copyright 2024 the Deno authors. All rights reserved. MIT license.
2+
3+
import { assertAlmostEquals, assertEquals } from "@std/assert";
4+
5+
import { estimateSize } from "./estimate_size.ts";
6+
7+
Deno.test({
8+
name: "estimateSize - string",
9+
fn() {
10+
assertEquals(estimateSize("abcdefghijklmnopq"), 21);
11+
assertEquals(estimateSize("🥟🥟"), 12);
12+
},
13+
});
14+
15+
Deno.test({
16+
name: "estimateSize - number",
17+
fn() {
18+
assertEquals(estimateSize(63), 4);
19+
assertEquals(estimateSize(64), 5);
20+
assertEquals(estimateSize(8_191), 5);
21+
assertEquals(estimateSize(8_192), 6);
22+
assertEquals(estimateSize(1_048_575), 6);
23+
assertEquals(estimateSize(1_048_576), 7);
24+
assertEquals(estimateSize(134_217_727), 7);
25+
assertEquals(estimateSize(134_217_728), 8);
26+
assertEquals(estimateSize(2_147_483_647), 8);
27+
assertEquals(estimateSize(2_147_483_648), 11);
28+
assertEquals(estimateSize(Number.MAX_SAFE_INTEGER), 11);
29+
},
30+
});
31+
32+
Deno.test({
33+
name: "estimateSize - boolean",
34+
fn() {
35+
assertEquals(estimateSize(true), 3);
36+
assertEquals(estimateSize(false), 3);
37+
},
38+
});
39+
40+
Deno.test({
41+
name: "estimateSize - bigint",
42+
fn() {
43+
assertEquals(estimateSize(63n), 12);
44+
assertEquals(estimateSize(BigInt(Number.MAX_SAFE_INTEGER + 1)), 12);
45+
},
46+
});
47+
48+
Deno.test({
49+
name: "estimateSize - undefined",
50+
fn() {
51+
assertEquals(estimateSize(undefined), 3);
52+
},
53+
});
54+
55+
Deno.test({
56+
name: "estimateSize - null",
57+
fn() {
58+
assertEquals(estimateSize(null), 3);
59+
},
60+
});
61+
62+
Deno.test({
63+
name: "estimateSize - Date",
64+
fn() {
65+
assertEquals(estimateSize(new Date()), 11);
66+
},
67+
});
68+
69+
Deno.test({
70+
name: "estimateSize - RegExp",
71+
fn() {
72+
assertEquals(estimateSize(/ab[cdefg]hijklmnopq/ig), 25);
73+
},
74+
});
75+
76+
Deno.test({
77+
name: "estimateSize - Error",
78+
fn() {
79+
assertAlmostEquals(
80+
estimateSize(new URIError("boo hoo", { cause: new Error("boo") })),
81+
496,
82+
100,
83+
);
84+
},
85+
});
86+
87+
Deno.test({
88+
name: "estimateSize - Uint8Array",
89+
fn() {
90+
assertEquals(estimateSize(new Uint8Array([1, 2, 3])), 12);
91+
},
92+
});
93+
94+
Deno.test({
95+
name: "estimateSize - ArrayBuffer",
96+
fn() {
97+
assertEquals(estimateSize(new Uint8Array([1, 2, 3]).buffer), 12);
98+
},
99+
});
100+
101+
Deno.test({
102+
name: "estimateSize - Array",
103+
fn() {
104+
assertEquals(estimateSize([1, 2, 3, "boo", true, false, /abc/]), 27);
105+
},
106+
});
107+
108+
Deno.test({
109+
name: "estimateSize - Set",
110+
fn() {
111+
assertEquals(estimateSize(new Set([1, 2, 3, 4, "foo"])), 18);
112+
},
113+
});
114+
115+
Deno.test({
116+
name: "estimateSize - Map",
117+
fn() {
118+
assertEquals(
119+
estimateSize(
120+
new Map<string, string | number>([["a", 1], ["b", 2], ["c", "d"]]),
121+
),
122+
21,
123+
);
124+
},
125+
});
126+
127+
Deno.test({
128+
name: "estimateSize - object",
129+
fn() {
130+
assertEquals(
131+
estimateSize({ a: new Map([[{ a: 1 }, { b: /234/ }]]), b: false }),
132+
36,
133+
);
134+
},
135+
});
136+
137+
Deno.test({
138+
name: "estimateSize - Deno.KvU64",
139+
fn() {
140+
assertEquals(estimateSize(new Deno.KvU64(100n)), 12);
141+
},
142+
});
143+
144+
Deno.test({
145+
name: "estimateSize - object with circular reference",
146+
fn() {
147+
// deno-lint-ignore no-explicit-any
148+
const a = { b: 1 as any };
149+
const b = { a };
150+
a.b = b;
151+
assertEquals(estimateSize(a), 11);
152+
},
153+
});
154+
155+
Deno.test({
156+
name: "estimateSize - symbol",
157+
fn() {
158+
assertEquals(estimateSize(Symbol.for("@deno/kv-utils")), 0);
159+
},
160+
});

0 commit comments

Comments
 (0)