@evolu/sqlite-wasm 2.2.4 → 3.53.4-build1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +55 -218
- package/dist/src/CApi.d.ts +2108 -0
- package/dist/src/CApi.d.ts.map +1 -0
- package/dist/src/CApi.js +1919 -0
- package/dist/src/Constants.d.ts +868 -0
- package/dist/src/Constants.d.ts.map +1 -0
- package/dist/src/Constants.js +602 -0
- package/dist/src/Database.d.ts +641 -0
- package/dist/src/Database.d.ts.map +1 -0
- package/dist/src/Database.js +1177 -0
- package/dist/src/Memory.d.ts +119 -0
- package/dist/src/Memory.d.ts.map +1 -0
- package/dist/src/Memory.js +207 -0
- package/dist/src/Pointer.d.ts +100 -0
- package/dist/src/Pointer.d.ts.map +1 -0
- package/dist/src/Pointer.js +15 -0
- package/dist/src/SahPool.d.ts +744 -0
- package/dist/src/SahPool.d.ts.map +1 -0
- package/dist/src/SahPool.js +1985 -0
- package/dist/src/Wasm.d.ts +315 -0
- package/dist/src/Wasm.d.ts.map +1 -0
- package/dist/src/Wasm.js +756 -0
- package/dist/src/WasmUrl.d.ts +21 -0
- package/dist/src/WasmUrl.d.ts.map +1 -0
- package/dist/src/WasmUrl.js +20 -0
- package/dist/src/c-api/index.d.ts +9 -0
- package/dist/src/c-api/index.d.ts.map +1 -0
- package/dist/src/c-api/index.js +8 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -0
- package/dist/wasm/sqlite3.wasm +0 -0
- package/package.json +60 -60
- package/src/CApi.test.ts +217 -0
- package/src/CApi.ts +3294 -0
- package/src/Constants.ts +803 -0
- package/src/Database.ts +1714 -0
- package/src/Memory.test.ts +319 -0
- package/src/Memory.ts +237 -0
- package/src/Pointer.ts +121 -0
- package/src/SahPool.test.ts +180 -0
- package/src/SahPool.ts +2627 -0
- package/src/Wasm.test.ts +444 -0
- package/src/Wasm.ts +1026 -0
- package/src/WasmUrl.ts +26 -0
- package/src/c-api/index.ts +9 -0
- package/src/index.ts +15 -0
- package/bin/index.js +0 -110
- package/index.d.ts +0 -8118
- package/index.mjs +0 -7
- package/node.mjs +0 -3
- package/sqlite-wasm/jswasm/sqlite3-bundler-friendly.mjs +0 -13659
- package/sqlite-wasm/jswasm/sqlite3-node.mjs +0 -11671
- package/sqlite-wasm/jswasm/sqlite3-opfs-async-proxy.js +0 -691
- package/sqlite-wasm/jswasm/sqlite3-worker1-bundler-friendly.mjs +0 -35
- package/sqlite-wasm/jswasm/sqlite3-worker1-promiser.js +0 -193
- package/sqlite-wasm/jswasm/sqlite3-worker1-promiser.mjs +0 -187
- package/sqlite-wasm/jswasm/sqlite3-worker1.js +0 -46
- package/sqlite-wasm/jswasm/sqlite3.js +0 -13697
- package/sqlite-wasm/jswasm/sqlite3.mjs +0 -13661
- package/sqlite-wasm/jswasm/sqlite3.wasm +0 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertEqual,
|
|
3
|
+
assertErr,
|
|
4
|
+
assertOk,
|
|
5
|
+
assertSame,
|
|
6
|
+
assertType,
|
|
7
|
+
type Brand,
|
|
8
|
+
type NonEmptyReadonlyArray,
|
|
9
|
+
} from "@evolu/common";
|
|
10
|
+
import { test } from "node:test";
|
|
11
|
+
import {
|
|
12
|
+
SQLITE_OPEN_CREATE,
|
|
13
|
+
SQLITE_OPEN_MAIN_DB,
|
|
14
|
+
SQLITE_OPEN_MAIN_JOURNAL,
|
|
15
|
+
SQLITE_OPEN_MEMORY,
|
|
16
|
+
SQLITE_OPEN_READWRITE,
|
|
17
|
+
SQLITE_OPEN_SUPER_JOURNAL,
|
|
18
|
+
SQLITE_OPEN_WAL,
|
|
19
|
+
} from "./Constants.ts";
|
|
20
|
+
import {
|
|
21
|
+
computeSahPoolDigest,
|
|
22
|
+
OpfsName,
|
|
23
|
+
openSahPool,
|
|
24
|
+
sahPoolDefaultCapacity,
|
|
25
|
+
sahPoolDigestV2Flag,
|
|
26
|
+
sahPoolHeaderCorpusSize,
|
|
27
|
+
sahPoolHeaderDigestOffset,
|
|
28
|
+
sahPoolHeaderFlagsOffset,
|
|
29
|
+
sahPoolHeaderPathSize,
|
|
30
|
+
sahPoolHeaderSize,
|
|
31
|
+
sahPoolOpaqueDirectoryName,
|
|
32
|
+
sahPoolPersistentFileTypes,
|
|
33
|
+
type OpfsNameError,
|
|
34
|
+
type SahPoolOptions,
|
|
35
|
+
} from "./SahPool.ts";
|
|
36
|
+
|
|
37
|
+
// https://fs.spec.whatwg.org/#valid-file-name
|
|
38
|
+
test("OpfsName accepts a valid file name of the File System Standard and rejects an empty name, . and .., and a name with / or \\, a separator on Windows, with OpfsNameError", () => {
|
|
39
|
+
for (const value of [
|
|
40
|
+
".evolu",
|
|
41
|
+
"evolu1.db",
|
|
42
|
+
"...",
|
|
43
|
+
" ",
|
|
44
|
+
"a b",
|
|
45
|
+
"žluťoučký kůň",
|
|
46
|
+
"日本語",
|
|
47
|
+
"😀",
|
|
48
|
+
])
|
|
49
|
+
assertOk(OpfsName.fromUnknown(value), value);
|
|
50
|
+
for (const value of ["", ".", "..", "a/b", "a\\b", "/", "\\", "./", "a/"])
|
|
51
|
+
assertErr(OpfsName.fromUnknown(value), { type: "OpfsName", value });
|
|
52
|
+
|
|
53
|
+
assertSame(
|
|
54
|
+
OpfsName.formatError({ type: "OpfsName", value: "a/b" }),
|
|
55
|
+
'The value "a/b" is not a valid OpfsName.',
|
|
56
|
+
);
|
|
57
|
+
assertType<OpfsName, string & Brand<"OpfsName">>();
|
|
58
|
+
assertType<typeof OpfsName.Error, OpfsNameError>();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("OpfsName rejects a name with NUL or a lone surrogate, which SQLite or an engine reads as another name, with OpfsNameError", () => {
|
|
62
|
+
assertOk(OpfsName.fromUnknown("\uFFFD"));
|
|
63
|
+
for (const value of ["\0", "a\0b", "\uD800", "a\uDC00b", "\uDC00\uD800"])
|
|
64
|
+
assertErr(OpfsName.fromUnknown(value), { type: "OpfsName", value });
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test("OpfsName rejects a name not in Unicode NFC, which names the directory of its NFC spelling in WebKit on macOS, with OpfsNameError", () => {
|
|
68
|
+
assertOk(OpfsName.fromUnknown("\u00E9"));
|
|
69
|
+
assertErr(OpfsName.fromUnknown("e\u0301"), {
|
|
70
|
+
type: "OpfsName",
|
|
71
|
+
value: "e\u0301",
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test("openSahPool takes the directory as a non-empty array of OpfsName", () => {
|
|
76
|
+
assertType<SahPoolOptions["directory"], NonEmptyReadonlyArray<OpfsName>>();
|
|
77
|
+
openSahPool({ directory: [OpfsName.orThrow("a"), OpfsName.orThrow("b")] });
|
|
78
|
+
|
|
79
|
+
// @ts-expect-error A directory is an array of OpfsName, not a path string.
|
|
80
|
+
openSahPool({ directory: ".evolu" });
|
|
81
|
+
// @ts-expect-error A directory has at least one OpfsName.
|
|
82
|
+
openSahPool({ directory: [] });
|
|
83
|
+
// @ts-expect-error A name is an OpfsName, which validation proves, not a string.
|
|
84
|
+
openSahPool({ directory: [".evolu"] });
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
/** A header's path and big-endian flags, which the digest covers. */
|
|
88
|
+
const createCorpus = (path: string, flags: number): Uint8Array => {
|
|
89
|
+
const corpus = new Uint8Array(sahPoolHeaderCorpusSize);
|
|
90
|
+
new TextEncoder().encodeInto(path, corpus);
|
|
91
|
+
new DataView(corpus.buffer).setUint32(sahPoolHeaderFlagsOffset, flags);
|
|
92
|
+
return corpus;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
test("the header layout and pool constants are opfs-sahpool's", () => {
|
|
96
|
+
assertEqual(
|
|
97
|
+
[
|
|
98
|
+
sahPoolHeaderSize,
|
|
99
|
+
sahPoolHeaderPathSize,
|
|
100
|
+
sahPoolHeaderFlagsOffset,
|
|
101
|
+
sahPoolHeaderCorpusSize,
|
|
102
|
+
sahPoolHeaderDigestOffset,
|
|
103
|
+
sahPoolDigestV2Flag,
|
|
104
|
+
sahPoolPersistentFileTypes,
|
|
105
|
+
sahPoolOpaqueDirectoryName,
|
|
106
|
+
sahPoolDefaultCapacity,
|
|
107
|
+
],
|
|
108
|
+
[
|
|
109
|
+
4096,
|
|
110
|
+
512,
|
|
111
|
+
512,
|
|
112
|
+
516,
|
|
113
|
+
516,
|
|
114
|
+
SQLITE_OPEN_MEMORY,
|
|
115
|
+
SQLITE_OPEN_MAIN_DB |
|
|
116
|
+
SQLITE_OPEN_MAIN_JOURNAL |
|
|
117
|
+
SQLITE_OPEN_SUPER_JOURNAL |
|
|
118
|
+
SQLITE_OPEN_WAL,
|
|
119
|
+
".opaque",
|
|
120
|
+
6,
|
|
121
|
+
],
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// The vectors come from opfs-sahpool's computeDigest in SQLite trunk
|
|
126
|
+
// ac5f698ccb (public domain), run on the same corpora.
|
|
127
|
+
test("computeSahPoolDigest matches opfs-sahpool's digest for V2 headers, including bytes of 0x80 and above and long paths", () => {
|
|
128
|
+
const v2 = sahPoolDigestV2Flag;
|
|
129
|
+
const highBytes = createCorpus("", SQLITE_OPEN_MAIN_DB | v2);
|
|
130
|
+
for (let index = 0; index < sahPoolHeaderPathSize; index++)
|
|
131
|
+
highBytes[index] = 0x80 + (index % 128);
|
|
132
|
+
|
|
133
|
+
for (const [corpus, flags, digest] of [
|
|
134
|
+
[
|
|
135
|
+
createCorpus(
|
|
136
|
+
"/my.db",
|
|
137
|
+
SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | v2,
|
|
138
|
+
),
|
|
139
|
+
SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | v2,
|
|
140
|
+
[733623307, 1377321499],
|
|
141
|
+
],
|
|
142
|
+
[
|
|
143
|
+
createCorpus(
|
|
144
|
+
"/my.db-journal",
|
|
145
|
+
SQLITE_OPEN_MAIN_JOURNAL |
|
|
146
|
+
SQLITE_OPEN_READWRITE |
|
|
147
|
+
SQLITE_OPEN_CREATE |
|
|
148
|
+
v2,
|
|
149
|
+
),
|
|
150
|
+
SQLITE_OPEN_MAIN_JOURNAL |
|
|
151
|
+
SQLITE_OPEN_READWRITE |
|
|
152
|
+
SQLITE_OPEN_CREATE |
|
|
153
|
+
v2,
|
|
154
|
+
[2999105150, 2527126710],
|
|
155
|
+
],
|
|
156
|
+
[
|
|
157
|
+
createCorpus("/žluťoučký kůň.db", SQLITE_OPEN_MAIN_DB | v2),
|
|
158
|
+
SQLITE_OPEN_MAIN_DB | v2,
|
|
159
|
+
[2971795857, 1848248641],
|
|
160
|
+
],
|
|
161
|
+
[
|
|
162
|
+
createCorpus(`/${"a".repeat(509)}`, SQLITE_OPEN_MAIN_DB | v2),
|
|
163
|
+
SQLITE_OPEN_MAIN_DB | v2,
|
|
164
|
+
[3503626032, 3496446816],
|
|
165
|
+
],
|
|
166
|
+
[createCorpus("", v2), v2, [119094703, 3552220663]],
|
|
167
|
+
[highBytes, SQLITE_OPEN_MAIN_DB | v2, [3258915406, 481079430]],
|
|
168
|
+
] as const)
|
|
169
|
+
assertEqual([...computeSahPoolDigest(corpus, flags)], digest);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test("computeSahPoolDigest is the legacy [0, 0] without sahPoolDigestV2Flag", () => {
|
|
173
|
+
const flags =
|
|
174
|
+
SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
|
|
175
|
+
|
|
176
|
+
assertEqual(
|
|
177
|
+
[...computeSahPoolDigest(createCorpus("/my.db", flags), flags)],
|
|
178
|
+
[0, 0],
|
|
179
|
+
);
|
|
180
|
+
});
|