@livestore/sqlite-wasm 0.4.0-dev.21 → 0.4.0-dev.23
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/README.md +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/FacadeVFS.d.ts +0 -1
- package/dist/FacadeVFS.d.ts.map +1 -1
- package/dist/FacadeVFS.js +9 -14
- package/dist/FacadeVFS.js.map +1 -1
- package/dist/browser/mod.d.ts +2 -2
- package/dist/browser/mod.d.ts.map +1 -1
- package/dist/browser/mod.js +2 -2
- package/dist/browser/mod.js.map +1 -1
- package/dist/browser/opfs/AccessHandlePoolVFS.d.ts.map +1 -1
- package/dist/browser/opfs/AccessHandlePoolVFS.js +15 -13
- package/dist/browser/opfs/AccessHandlePoolVFS.js.map +1 -1
- package/dist/browser/opfs/opfs-sah-pool.js +3 -3
- package/dist/browser/opfs/opfs-sah-pool.js.map +1 -1
- package/dist/cf/CloudflareDurableObjectVFS.d.ts +104 -0
- package/dist/cf/CloudflareDurableObjectVFS.d.ts.map +1 -0
- package/dist/cf/CloudflareDurableObjectVFS.js +281 -0
- package/dist/cf/CloudflareDurableObjectVFS.js.map +1 -0
- package/dist/cf/CloudflareWorkerVFS.d.ts.map +1 -1
- package/dist/cf/CloudflareWorkerVFS.js +29 -28
- package/dist/cf/CloudflareWorkerVFS.js.map +1 -1
- package/dist/cf/mod.d.ts +3 -4
- package/dist/cf/mod.d.ts.map +1 -1
- package/dist/cf/mod.js +4 -12
- package/dist/cf/mod.js.map +1 -1
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js +5 -4
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.js.map +1 -1
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js +3 -3
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-core.test.js.map +1 -1
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js +3 -3
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-integration.test.js.map +1 -1
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js +3 -3
- package/dist/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.js.map +1 -1
- package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js +194 -179
- package/dist/cf/test/sql/cloudflare-sql-vfs-core.test.js.map +1 -1
- package/dist/in-memory-vfs.d.ts.map +1 -1
- package/dist/in-memory-vfs.js +0 -1
- package/dist/in-memory-vfs.js.map +1 -1
- package/dist/load-wasm/mod.node.js +1 -1
- package/dist/load-wasm/mod.node.js.map +1 -1
- package/dist/load-wasm/mod.workerd.d.ts.map +1 -1
- package/dist/load-wasm/mod.workerd.js.map +1 -1
- package/dist/make-sqlite-db.d.ts.map +1 -1
- package/dist/make-sqlite-db.js +16 -4
- package/dist/make-sqlite-db.js.map +1 -1
- package/dist/node/NodeFS.d.ts.map +1 -1
- package/dist/node/NodeFS.js +13 -13
- package/dist/node/NodeFS.js.map +1 -1
- package/package.json +54 -15
- package/src/FacadeVFS.ts +9 -14
- package/src/browser/mod.ts +1 -1
- package/src/browser/opfs/AccessHandlePoolVFS.ts +33 -25
- package/src/browser/opfs/opfs-sah-pool.ts +3 -3
- package/src/cf/CloudflareDurableObjectVFS.ts +325 -0
- package/src/cf/CloudflareWorkerVFS.ts +41 -39
- package/src/cf/README.md +3 -3
- package/src/cf/mod.ts +10 -15
- package/src/cf/test/README.md +55 -26
- package/src/cf/test/async-storage/cloudflare-worker-vfs-advanced.test.ts +6 -4
- package/src/cf/test/async-storage/cloudflare-worker-vfs-core.test.ts +4 -3
- package/src/cf/test/async-storage/cloudflare-worker-vfs-integration.test.ts +4 -3
- package/src/cf/test/async-storage/cloudflare-worker-vfs-reliability.test.ts +4 -3
- package/src/cf/test/sql/cloudflare-sql-vfs-core.test.ts +228 -197
- package/src/in-memory-vfs.ts +0 -1
- package/src/load-wasm/mod.node.ts +1 -1
- package/src/load-wasm/mod.workerd.ts +0 -1
- package/src/make-sqlite-db.ts +24 -4
- package/src/node/NodeFS.ts +24 -23
- package/dist/cf/BlockManager.d.ts +0 -61
- package/dist/cf/BlockManager.d.ts.map +0 -1
- package/dist/cf/BlockManager.js +0 -157
- package/dist/cf/BlockManager.js.map +0 -1
- package/dist/cf/CloudflareSqlVFS.d.ts +0 -51
- package/dist/cf/CloudflareSqlVFS.d.ts.map +0 -1
- package/dist/cf/CloudflareSqlVFS.js +0 -351
- package/dist/cf/CloudflareSqlVFS.js.map +0 -1
- package/src/cf/BlockManager.ts +0 -225
- package/src/cf/CloudflareSqlVFS.ts +0 -450
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.workerd.d.ts","sourceRoot":"","sources":["../../src/load-wasm/mod.workerd.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mod.workerd.d.ts","sourceRoot":"","sources":["../../src/load-wasm/mod.workerd.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,0BAoB3B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.workerd.js","sourceRoot":"","sources":["../../src/load-wasm/mod.workerd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAChD,OAAO,eAAe,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"mod.workerd.js","sourceRoot":"","sources":["../../src/load-wasm/mod.workerd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAChD,OAAO,eAAe,MAAM,yCAAyC,CAAA;AACrE,+CAA+C;AAC/C,OAAO,IAAI,MAAM,0CAA0C,CAAA;AAE3D,sHAAsH;AACtH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;IACxC,2EAA2E;IAC3E,kGAAkG;IAClG,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;QACnC,eAAe,EAAE,CAAC,IAAS,EAAE,eAAoB,EAAE,EAAE;YACnD,IAAI,CAAC;gBACH,uCAAuC;gBACvC,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;gBACrD,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAC/B,OAAO,QAAQ,CAAC,OAAO,CAAA;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAA;gBACnD,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;KACF,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACxC,kCAAkC;IAClC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;IACvB,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-sqlite-db.d.ts","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGf,QAAQ,EAET,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"make-sqlite-db.d.ts","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAGf,QAAQ,EAET,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAKrD,eAAO,MAAM,YAAY,GACvB,SAAS,SAAS;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,eAAe,CAAA;IAChC,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,CAAA;CAC/C,EACD,wBAGC;IACD,OAAO,EAAE,SAAS,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;CACpB,KAAG,QAAQ,CAAC,SAAS,CAiQrB,CAAA"}
|
package/dist/make-sqlite-db.js
CHANGED
|
@@ -27,7 +27,7 @@ export const makeSqliteDb = ({ sqlite3, metadata, }) => {
|
|
|
27
27
|
sqlite3.step(stmt);
|
|
28
28
|
}
|
|
29
29
|
finally {
|
|
30
|
-
if (options?.onRowsChanged) {
|
|
30
|
+
if (options?.onRowsChanged !== undefined) {
|
|
31
31
|
options.onRowsChanged(sqlite3.changes(dbPointer));
|
|
32
32
|
}
|
|
33
33
|
sqlite3.reset(stmt); // Reset is needed for next execution
|
|
@@ -79,7 +79,7 @@ export const makeSqliteDb = ({ sqlite3, metadata, }) => {
|
|
|
79
79
|
},
|
|
80
80
|
finalize: () => {
|
|
81
81
|
// Avoid double finalization which leads to a crash
|
|
82
|
-
if (isFinalized) {
|
|
82
|
+
if (isFinalized === true) {
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
85
|
isFinalized = true;
|
|
@@ -117,7 +117,7 @@ export const makeSqliteDb = ({ sqlite3, metadata, }) => {
|
|
|
117
117
|
metadata.deleteDb();
|
|
118
118
|
},
|
|
119
119
|
close: () => {
|
|
120
|
-
if (isClosed) {
|
|
120
|
+
if (isClosed === true) {
|
|
121
121
|
return;
|
|
122
122
|
}
|
|
123
123
|
for (const stmt of preparedStmts) {
|
|
@@ -195,7 +195,19 @@ export const makeSqliteDb = ({ sqlite3, metadata, }) => {
|
|
|
195
195
|
},
|
|
196
196
|
apply: () => {
|
|
197
197
|
try {
|
|
198
|
-
sqlite3.changeset_apply(dbPointer, data)
|
|
198
|
+
sqlite3.changeset_apply(dbPointer, data, null, (eConflict) => {
|
|
199
|
+
// During rollback we apply inverted changesets to undo local events
|
|
200
|
+
// before replaying them on top of remote state. We want the undo to
|
|
201
|
+
// succeed unconditionally: if the row was already changed by another
|
|
202
|
+
// tab (DATA) or reinserted (CONFLICT), force-overwrite it. For
|
|
203
|
+
// NOTFOUND, CONSTRAINT, and FOREIGN_KEY the row is already gone or
|
|
204
|
+
// can't be replaced, so we skip.
|
|
205
|
+
if (eConflict === SqliteConstants.SQLITE_CHANGESET_DATA ||
|
|
206
|
+
eConflict === SqliteConstants.SQLITE_CHANGESET_CONFLICT) {
|
|
207
|
+
return SqliteConstants.SQLITE_CHANGESET_REPLACE;
|
|
208
|
+
}
|
|
209
|
+
return SqliteConstants.SQLITE_CHANGESET_OMIT;
|
|
210
|
+
});
|
|
199
211
|
// @ts-expect-error data should be garbage collected after use
|
|
200
212
|
// biome-ignore lint/style/noParameterAssign: ...
|
|
201
213
|
data = undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-sqlite-db.js","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,OAAO,KAAK,eAAe,MAAM,8CAA8C,CAAA;
|
|
1
|
+
{"version":3,"file":"make-sqlite-db.js","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeFS.d.ts","sourceRoot":"","sources":["../../src/node/NodeFS.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQ3C,qBAAa,MAAO,SAAQ,SAAS;IACnC,OAAO,CAAC,WAAW,CAAgC;IAEnD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBACtB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"NodeFS.d.ts","sourceRoot":"","sources":["../../src/node/NodeFS.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQ3C,qBAAa,MAAO,SAAQ,SAAS;IACnC,OAAO,CAAC,WAAW,CAAgC;IAEnD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBACtB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM;IAM/D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKnC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,MAAM;IAoCvF,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAoB9E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAe/E,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAoB9B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM;IAcpD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAahD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAc7C,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAWhD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM;IAY1E,QAAQ,CAAC,QAAQ,EAAE,MAAM;CAG1B"}
|
package/dist/node/NodeFS.js
CHANGED
|
@@ -18,19 +18,19 @@ export class NodeFS extends FacadeVFS {
|
|
|
18
18
|
}
|
|
19
19
|
jOpen(zName, fileId, flags, pOutFlags) {
|
|
20
20
|
try {
|
|
21
|
-
const pathname = zName ? path.resolve(this.directory, zName) : Math.random().toString(36).slice(2);
|
|
21
|
+
const pathname = zName !== null && zName !== '' ? path.resolve(this.directory, zName) : Math.random().toString(36).slice(2);
|
|
22
22
|
const file = { pathname, flags, fileHandle: null };
|
|
23
23
|
this.mapIdToFile.set(fileId, file);
|
|
24
24
|
const create = !!(flags & VFS.SQLITE_OPEN_CREATE);
|
|
25
25
|
const readwrite = !!(flags & VFS.SQLITE_OPEN_READWRITE);
|
|
26
26
|
// Convert SQLite flags to Node.js flags
|
|
27
27
|
let fsFlags = 'r';
|
|
28
|
-
if (create && readwrite) {
|
|
28
|
+
if (create === true && readwrite === true) {
|
|
29
29
|
// Check if file exists first
|
|
30
30
|
const exists = fs.existsSync(pathname);
|
|
31
|
-
fsFlags = exists ? 'r+' : 'w+'; // Use r+ for existing files, w+ only for new files
|
|
31
|
+
fsFlags = exists === true ? 'r+' : 'w+'; // Use r+ for existing files, w+ only for new files
|
|
32
32
|
}
|
|
33
|
-
else if (readwrite) {
|
|
33
|
+
else if (readwrite === true) {
|
|
34
34
|
fsFlags = 'r+'; // Open file for reading and writing
|
|
35
35
|
}
|
|
36
36
|
try {
|
|
@@ -39,7 +39,7 @@ export class NodeFS extends FacadeVFS {
|
|
|
39
39
|
return VFS.SQLITE_OK;
|
|
40
40
|
}
|
|
41
41
|
catch (err) {
|
|
42
|
-
if (err.code === 'ENOENT' &&
|
|
42
|
+
if (err.code === 'ENOENT' && create == null) {
|
|
43
43
|
return VFS.SQLITE_CANTOPEN;
|
|
44
44
|
}
|
|
45
45
|
throw err;
|
|
@@ -53,7 +53,7 @@ export class NodeFS extends FacadeVFS {
|
|
|
53
53
|
jRead(fileId, pData, iOffset) {
|
|
54
54
|
try {
|
|
55
55
|
const file = this.mapIdToFile.get(fileId);
|
|
56
|
-
if (
|
|
56
|
+
if (file?.fileHandle == null)
|
|
57
57
|
return VFS.SQLITE_IOERR_READ;
|
|
58
58
|
// const view = new DataView(pData.buffer, pData.byteOffset, pData.length)
|
|
59
59
|
// const bytesRead = fs.readSync(file.fileHandle, view, 0, pData.length, iOffset)
|
|
@@ -72,7 +72,7 @@ export class NodeFS extends FacadeVFS {
|
|
|
72
72
|
jWrite(fileId, pData, iOffset) {
|
|
73
73
|
try {
|
|
74
74
|
const file = this.mapIdToFile.get(fileId);
|
|
75
|
-
if (
|
|
75
|
+
if (file?.fileHandle == null)
|
|
76
76
|
return VFS.SQLITE_IOERR_WRITE;
|
|
77
77
|
// const view = new DataView(pData.buffer, pData.byteOffset, pData.length)
|
|
78
78
|
// fs.writeSync(file.fileHandle, view, 0, pData.length, iOffset)
|
|
@@ -87,13 +87,13 @@ export class NodeFS extends FacadeVFS {
|
|
|
87
87
|
jClose(fileId) {
|
|
88
88
|
try {
|
|
89
89
|
const file = this.mapIdToFile.get(fileId);
|
|
90
|
-
if (
|
|
90
|
+
if (file == null)
|
|
91
91
|
return VFS.SQLITE_OK;
|
|
92
92
|
this.mapIdToFile.delete(fileId);
|
|
93
93
|
if (file.fileHandle !== null) {
|
|
94
94
|
fs.closeSync(file.fileHandle);
|
|
95
95
|
}
|
|
96
|
-
if (file.flags & VFS.SQLITE_OPEN_DELETEONCLOSE) {
|
|
96
|
+
if ((file.flags & VFS.SQLITE_OPEN_DELETEONCLOSE) !== 0) {
|
|
97
97
|
fs.unlinkSync(file.pathname);
|
|
98
98
|
}
|
|
99
99
|
return VFS.SQLITE_OK;
|
|
@@ -106,7 +106,7 @@ export class NodeFS extends FacadeVFS {
|
|
|
106
106
|
jFileSize(fileId, pSize64) {
|
|
107
107
|
try {
|
|
108
108
|
const file = this.mapIdToFile.get(fileId);
|
|
109
|
-
if (
|
|
109
|
+
if (file?.fileHandle == null)
|
|
110
110
|
return VFS.SQLITE_IOERR_FSTAT;
|
|
111
111
|
const stats = fs.fstatSync(file.fileHandle);
|
|
112
112
|
pSize64.setBigInt64(0, BigInt(stats.size), true);
|
|
@@ -120,7 +120,7 @@ export class NodeFS extends FacadeVFS {
|
|
|
120
120
|
jTruncate(fileId, iSize) {
|
|
121
121
|
try {
|
|
122
122
|
const file = this.mapIdToFile.get(fileId);
|
|
123
|
-
if (
|
|
123
|
+
if (file?.fileHandle == null)
|
|
124
124
|
return VFS.SQLITE_IOERR_TRUNCATE;
|
|
125
125
|
fs.ftruncateSync(file.fileHandle, iSize);
|
|
126
126
|
return VFS.SQLITE_OK;
|
|
@@ -133,7 +133,7 @@ export class NodeFS extends FacadeVFS {
|
|
|
133
133
|
jSync(fileId, _flags) {
|
|
134
134
|
try {
|
|
135
135
|
const file = this.mapIdToFile.get(fileId);
|
|
136
|
-
if (
|
|
136
|
+
if (file?.fileHandle == null)
|
|
137
137
|
return VFS.SQLITE_OK;
|
|
138
138
|
// TODO do this out of band (for now we disable it to speed up the node vfs)
|
|
139
139
|
// fs.fsyncSync(file.fileHandle)
|
|
@@ -159,7 +159,7 @@ export class NodeFS extends FacadeVFS {
|
|
|
159
159
|
try {
|
|
160
160
|
const pathname = path.resolve(this.directory, zName);
|
|
161
161
|
const exists = fs.existsSync(pathname);
|
|
162
|
-
pResOut.setInt32(0, exists ? 1 : 0, true);
|
|
162
|
+
pResOut.setInt32(0, exists === true ? 1 : 0, true);
|
|
163
163
|
return VFS.SQLITE_OK;
|
|
164
164
|
}
|
|
165
165
|
catch (e) {
|
package/dist/node/NodeFS.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeFS.js","sourceRoot":"","sources":["../../src/node/NodeFS.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,OAAO,KAAK,GAAG,MAAM,iCAAiC,CAAA;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQ3C,MAAM,OAAO,MAAO,SAAQ,SAAS;IAC3B,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAA;IACnD,2EAA2E;IACnE,SAAS,GAAiB,IAAI,CAAA;IACrB,SAAS,CAAQ;IAClC,YAAY,IAAY,EAAE,OAA2B,EAAE,SAAiB;QACtE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAEpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;
|
|
1
|
+
{"version":3,"file":"NodeFS.js","sourceRoot":"","sources":["../../src/node/NodeFS.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,OAAO,KAAK,GAAG,MAAM,iCAAiC,CAAA;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQ3C,MAAM,OAAO,MAAO,SAAQ,SAAS;IAC3B,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAA;IACnD,2EAA2E;IACnE,SAAS,GAAiB,IAAI,CAAA;IACrB,SAAS,CAAQ;IAClC,YAAY,IAAY,EAAE,OAA2B,EAAE,SAAiB;QACtE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAEpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAEQ,WAAW,CAAC,MAAc;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAA;QACvD,OAAO,UAAU,QAAQ,EAAE,CAAA;IAC7B,CAAC;IAEQ,KAAK,CAAC,KAAoB,EAAE,MAAc,EAAE,KAAa,EAAE,SAAmB;QACrF,IAAI,CAAC;YACH,MAAM,QAAQ,GACZ,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAC5G,MAAM,IAAI,GAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;YAC9D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAElC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAA;YACjD,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAA;YAEvD,wCAAwC;YACxC,IAAI,OAAO,GAAG,GAAG,CAAA;YACjB,IAAI,MAAM,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC1C,6BAA6B;gBAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;gBACtC,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA,CAAC,mDAAmD;YAC7F,CAAC;iBAAM,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC9B,OAAO,GAAG,IAAI,CAAA,CAAC,oCAAoC;YACrD,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;gBAChD,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;gBAClC,OAAO,GAAG,CAAC,SAAS,CAAA;YACtB,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBAC5C,OAAO,GAAG,CAAC,eAAe,CAAA;gBAC5B,CAAC;gBACD,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAO,GAAG,CAAC,eAAe,CAAA;QAC5B,CAAC;IACH,CAAC;IAEQ,KAAK,CAAC,MAAc,EAAE,KAA8B,EAAE,OAAe;QAC5E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACzC,IAAI,IAAI,EAAE,UAAU,IAAI,IAAI;gBAAE,OAAO,GAAG,CAAC,iBAAiB,CAAA;YAE1D,0EAA0E;YAC1E,iFAAiF;YACjF,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;YAEvF,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;gBACxB,OAAO,GAAG,CAAC,uBAAuB,CAAA;YACpC,CAAC;YACD,OAAO,GAAG,CAAC,SAAS,CAAA;QACtB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAO,GAAG,CAAC,iBAAiB,CAAA;QAC9B,CAAC;IACH,CAAC;IAEQ,MAAM,CAAC,MAAc,EAAE,KAA8B,EAAE,OAAe;QAC7E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACzC,IAAI,IAAI,EAAE,UAAU,IAAI,IAAI;gBAAE,OAAO,GAAG,CAAC,kBAAkB,CAAA;YAE3D,0EAA0E;YAC1E,gEAAgE;YAChE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACtF,OAAO,GAAG,CAAC,SAAS,CAAA;QACtB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAO,GAAG,CAAC,kBAAkB,CAAA;QAC/B,CAAC;IACH,CAAC;IAEQ,MAAM,CAAC,MAAc;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACzC,IAAI,IAAI,IAAI,IAAI;gBAAE,OAAO,GAAG,CAAC,SAAS,CAAA;YAEtC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC/B,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC7B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC/B,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC9B,CAAC;YACD,OAAO,GAAG,CAAC,SAAS,CAAA;QACtB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAO,GAAG,CAAC,kBAAkB,CAAA;QAC/B,CAAC;IACH,CAAC;IAEQ,SAAS,CAAC,MAAc,EAAE,OAAiB;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACzC,IAAI,IAAI,EAAE,UAAU,IAAI,IAAI;gBAAE,OAAO,GAAG,CAAC,kBAAkB,CAAA;YAE3D,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC3C,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;YAChD,OAAO,GAAG,CAAC,SAAS,CAAA;QACtB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAO,GAAG,CAAC,kBAAkB,CAAA;QAC/B,CAAC;IACH,CAAC;IAEQ,SAAS,CAAC,MAAc,EAAE,KAAa;QAC9C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACzC,IAAI,IAAI,EAAE,UAAU,IAAI,IAAI;gBAAE,OAAO,GAAG,CAAC,qBAAqB,CAAA;YAE9D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;YACxC,OAAO,GAAG,CAAC,SAAS,CAAA;QACtB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAO,GAAG,CAAC,qBAAqB,CAAA;QAClC,CAAC;IACH,CAAC;IAEQ,KAAK,CAAC,MAAc,EAAE,MAAc;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACzC,IAAI,IAAI,EAAE,UAAU,IAAI,IAAI;gBAAE,OAAO,GAAG,CAAC,SAAS,CAAA;YAElD,4EAA4E;YAC5E,gCAAgC;YAChC,OAAO,GAAG,CAAC,SAAS,CAAA;QACtB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAO,GAAG,CAAC,kBAAkB,CAAA;QAC/B,CAAC;IACH,CAAC;IAEQ,OAAO,CAAC,KAAa,EAAE,QAAgB;QAC9C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACpD,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;YACvB,OAAO,GAAG,CAAC,SAAS,CAAA;QACtB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAO,GAAG,CAAC,mBAAmB,CAAA;QAChC,CAAC;IACH,CAAC;IAEQ,OAAO,CAAC,KAAa,EAAE,MAAc,EAAE,OAAiB;QAC/D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACpD,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;YACtC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAClD,OAAO,GAAG,CAAC,SAAS,CAAA;QACtB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YAClB,OAAO,GAAG,CAAC,mBAAmB,CAAA;QAChC,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,QAAgB;QACvB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;IACpD,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/sqlite-wasm",
|
|
3
|
-
"version": "0.4.0-dev.
|
|
3
|
+
"version": "0.4.0-dev.23",
|
|
4
|
+
"license": "Apache-2.0",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/livestorejs/livestore.git"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"package.json",
|
|
12
|
+
"src"
|
|
13
|
+
],
|
|
4
14
|
"type": "module",
|
|
15
|
+
"sideEffects": false,
|
|
5
16
|
"exports": {
|
|
6
17
|
".": {
|
|
7
18
|
"types": "./dist/index.d.ts",
|
|
@@ -28,28 +39,56 @@
|
|
|
28
39
|
"default": "./dist/browser/mod.js"
|
|
29
40
|
}
|
|
30
41
|
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
31
45
|
"dependencies": {
|
|
32
46
|
"@cloudflare/workers-types": "4.20251118.0",
|
|
33
|
-
"@livestore/common": "0.4.0-dev.
|
|
34
|
-
"@livestore/
|
|
35
|
-
"@livestore/
|
|
36
|
-
"@livestore/wa-sqlite": "0.4.0-dev.
|
|
47
|
+
"@livestore/common": "^0.4.0-dev.23",
|
|
48
|
+
"@livestore/common-cf": "^0.4.0-dev.23",
|
|
49
|
+
"@livestore/utils": "^0.4.0-dev.23",
|
|
50
|
+
"@livestore/wa-sqlite": "^0.4.0-dev.23"
|
|
37
51
|
},
|
|
38
52
|
"devDependencies": {
|
|
39
53
|
"@types/chrome": "0.1.4",
|
|
40
|
-
"@types/node": "
|
|
41
|
-
"@types/wicg-file-system-access": "
|
|
54
|
+
"@types/node": "25.3.3",
|
|
55
|
+
"@types/wicg-file-system-access": "2023.10.6",
|
|
42
56
|
"vitest": "3.2.4",
|
|
43
57
|
"wrangler": "4.42.2"
|
|
44
58
|
},
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"
|
|
59
|
+
"peerDependencies": {
|
|
60
|
+
"@effect/ai": "^0.35.0",
|
|
61
|
+
"@effect/cli": "^0.75.1",
|
|
62
|
+
"@effect/cluster": "^0.58.2",
|
|
63
|
+
"@effect/experimental": "^0.60.0",
|
|
64
|
+
"@effect/opentelemetry": "^0.63.0",
|
|
65
|
+
"@effect/platform": "^0.96.1",
|
|
66
|
+
"@effect/platform-browser": "^0.76.0",
|
|
67
|
+
"@effect/platform-bun": "^0.89.0",
|
|
68
|
+
"@effect/platform-node": "^0.106.0",
|
|
69
|
+
"@effect/printer": "^0.49.0",
|
|
70
|
+
"@effect/printer-ansi": "^0.49.0",
|
|
71
|
+
"@effect/rpc": "^0.75.1",
|
|
72
|
+
"@effect/sql": "^0.51.1",
|
|
73
|
+
"@effect/typeclass": "^0.40.0",
|
|
74
|
+
"@effect/vitest": "^0.29.0",
|
|
75
|
+
"@opentelemetry/api": "^1.9.0",
|
|
76
|
+
"@opentelemetry/resources": "^2.2.0",
|
|
77
|
+
"@standard-schema/spec": "^1.1.0",
|
|
78
|
+
"effect": "^3.21.2"
|
|
79
|
+
},
|
|
80
|
+
"$genie": {
|
|
81
|
+
"source": "package.json.genie.ts",
|
|
82
|
+
"warning": "DO NOT EDIT - changes will be overwritten",
|
|
83
|
+
"workspaceClosureDirs": [
|
|
84
|
+
"packages/@livestore/common",
|
|
85
|
+
"packages/@livestore/common-cf",
|
|
86
|
+
"packages/@livestore/sqlite-wasm",
|
|
87
|
+
"packages/@livestore/utils",
|
|
88
|
+
"packages/@livestore/utils-dev",
|
|
89
|
+
"packages/@livestore/wa-sqlite",
|
|
90
|
+
"packages/@livestore/webmesh"
|
|
91
|
+
]
|
|
53
92
|
},
|
|
54
93
|
"scripts": {
|
|
55
94
|
"test": "vitest",
|
package/src/FacadeVFS.ts
CHANGED
|
@@ -18,9 +18,6 @@ export class FacadeVFS extends VFS.Base {
|
|
|
18
18
|
* @param {string} name
|
|
19
19
|
* @param {object} module
|
|
20
20
|
*/
|
|
21
|
-
constructor(name, module) {
|
|
22
|
-
super(name, module)
|
|
23
|
-
}
|
|
24
21
|
|
|
25
22
|
/**
|
|
26
23
|
* Override to indicate which methods are asynchronous.
|
|
@@ -429,17 +426,17 @@ export class FacadeVFS extends VFS.Base {
|
|
|
429
426
|
}
|
|
430
427
|
if (prop === getter) {
|
|
431
428
|
return (byteOffset, littleEndian) => {
|
|
432
|
-
if (
|
|
429
|
+
if (littleEndian === false) throw new Error('must be little endian')
|
|
433
430
|
return dataView[prop](byteOffset, littleEndian)
|
|
434
431
|
}
|
|
435
432
|
}
|
|
436
433
|
if (prop === setter) {
|
|
437
434
|
return (byteOffset, value, littleEndian) => {
|
|
438
|
-
if (
|
|
435
|
+
if (littleEndian === false) throw new Error('must be little endian')
|
|
439
436
|
return dataView[prop](byteOffset, value, littleEndian)
|
|
440
437
|
}
|
|
441
438
|
}
|
|
442
|
-
if (typeof prop === 'string' && /^(get)|(set)/.test(prop)) {
|
|
439
|
+
if (typeof prop === 'string' && /^(get)|(set)/.test(prop) === true) {
|
|
443
440
|
throw new Error('invalid type')
|
|
444
441
|
}
|
|
445
442
|
const result = dataView[prop]
|
|
@@ -467,19 +464,19 @@ export class FacadeVFS extends VFS.Base {
|
|
|
467
464
|
}
|
|
468
465
|
|
|
469
466
|
#decodeFilename(zName, flags) {
|
|
470
|
-
if (flags & VFS.SQLITE_OPEN_URI) {
|
|
467
|
+
if ((flags & VFS.SQLITE_OPEN_URI) !== 0) {
|
|
471
468
|
// The first null-terminated string is the URI path. Subsequent
|
|
472
469
|
// strings are query parameter keys and values.
|
|
473
470
|
// https://www.sqlite.org/c3ref/open.html#urifilenamesinsqlite3open
|
|
474
471
|
let pName = zName
|
|
475
472
|
let state = 1
|
|
476
473
|
const charCodes = []
|
|
477
|
-
while (state) {
|
|
474
|
+
while (state !== null) {
|
|
478
475
|
const charCode = this._module.HEAPU8[pName++]
|
|
479
|
-
if (charCode) {
|
|
476
|
+
if (charCode !== 0) {
|
|
480
477
|
charCodes.push(charCode)
|
|
481
478
|
} else {
|
|
482
|
-
if (
|
|
479
|
+
if (this._module.HEAPU8[pName] === 0) state = null
|
|
483
480
|
switch (state) {
|
|
484
481
|
case 1: {
|
|
485
482
|
// path
|
|
@@ -504,11 +501,9 @@ export class FacadeVFS extends VFS.Base {
|
|
|
504
501
|
}
|
|
505
502
|
return new TextDecoder().decode(new Uint8Array(charCodes))
|
|
506
503
|
}
|
|
507
|
-
return zName ? this._module.UTF8ToString(zName) : null
|
|
504
|
+
return zName !== 0 ? this._module.UTF8ToString(zName) : null
|
|
508
505
|
}
|
|
509
506
|
}
|
|
510
507
|
// Emscripten "legalizes" 64-bit integer arguments by passing them as
|
|
511
508
|
// two 32-bit signed integers.
|
|
512
|
-
|
|
513
|
-
return hi32 * 0x1_00_00_00_00 + lo32 + (lo32 < 0 ? 2 ** 32 : 0)
|
|
514
|
-
}
|
|
509
|
+
const delegalize = (lo32, hi32) => hi32 * 0x1_00_00_00_00 + lo32 + (lo32 < 0 ? 2 ** 32 : 0)
|
package/src/browser/mod.ts
CHANGED
|
@@ -62,7 +62,7 @@ type MakeOpfsWebDatabase = MakeSqliteDb<
|
|
|
62
62
|
Opfs.Opfs | Scope.Scope
|
|
63
63
|
>
|
|
64
64
|
|
|
65
|
-
export
|
|
65
|
+
export const sqliteDbFactory = ({ sqlite3 }: { sqlite3: SQLiteAPI }) => {
|
|
66
66
|
function makeDb(input: WebDatabaseInputInMemory): ReturnType<MakeInMemoryWebDatabase>
|
|
67
67
|
function makeDb(input: WebDatabaseInputOpfs): ReturnType<MakeOpfsWebDatabase>
|
|
68
68
|
function makeDb(
|
|
@@ -5,6 +5,7 @@ import { shouldNeverHappen } from '@livestore/utils'
|
|
|
5
5
|
import { Effect, Runtime, Schedule, type Scope, Stream } from '@livestore/utils/effect'
|
|
6
6
|
import { Opfs, type WebError } from '@livestore/utils/effect/browser'
|
|
7
7
|
import * as VFS from '@livestore/wa-sqlite/src/VFS.js'
|
|
8
|
+
|
|
8
9
|
import { FacadeVFS } from '../../FacadeVFS.ts'
|
|
9
10
|
|
|
10
11
|
const SECTOR_SIZE = 4096
|
|
@@ -94,7 +95,12 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
94
95
|
directoryPath,
|
|
95
96
|
module,
|
|
96
97
|
runtime,
|
|
97
|
-
}: {
|
|
98
|
+
}: {
|
|
99
|
+
name: string
|
|
100
|
+
directoryPath: string
|
|
101
|
+
module: any
|
|
102
|
+
runtime: Runtime.Runtime<Opfs.Opfs | Scope.Scope>
|
|
103
|
+
}) {
|
|
98
104
|
super(name, module)
|
|
99
105
|
this.#directoryPath = directoryPath
|
|
100
106
|
this.#runtime = runtime
|
|
@@ -163,12 +169,13 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
163
169
|
}),
|
|
164
170
|
)
|
|
165
171
|
|
|
166
|
-
jOpen(zName: string, fileId: number, flags: number, pOutFlags: DataView): number {
|
|
172
|
+
override jOpen(zName: string, fileId: number, flags: number, pOutFlags: DataView): number {
|
|
167
173
|
return Effect.gen(this, function* () {
|
|
168
174
|
// First try to open a path that already exists in the file system.
|
|
169
|
-
const
|
|
175
|
+
const name = zName as unknown
|
|
176
|
+
const path = typeof name === 'string' && name !== '' ? this.#getPath(name) : Math.random().toString(36)
|
|
170
177
|
let accessHandle = this.#mapPathToAccessHandle.get(path)
|
|
171
|
-
if (
|
|
178
|
+
if (accessHandle == null && (flags & VFS.SQLITE_OPEN_CREATE) !== 0) {
|
|
172
179
|
// File not found so try to create it.
|
|
173
180
|
if (this.getSize() < this.getCapacity()) {
|
|
174
181
|
// Choose an unassociated OPFS file from the pool.
|
|
@@ -180,7 +187,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
180
187
|
return yield* Effect.dieMessage('cannot create file')
|
|
181
188
|
}
|
|
182
189
|
}
|
|
183
|
-
if (
|
|
190
|
+
if (accessHandle == null) return yield* Effect.dieMessage('file not found')
|
|
184
191
|
|
|
185
192
|
// Subsequent methods are only passed the fileId, so make sure we have
|
|
186
193
|
// a way to get the file resources.
|
|
@@ -196,13 +203,13 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
196
203
|
)
|
|
197
204
|
}
|
|
198
205
|
|
|
199
|
-
jClose(fileId: number): number {
|
|
206
|
+
override jClose(fileId: number): number {
|
|
200
207
|
return Effect.gen(this, function* () {
|
|
201
208
|
const file = this.#mapIdToFile.get(fileId)
|
|
202
|
-
if (file) {
|
|
209
|
+
if (file !== undefined) {
|
|
203
210
|
yield* Opfs.Opfs.syncFlush(file.accessHandle)
|
|
204
211
|
this.#mapIdToFile.delete(fileId)
|
|
205
|
-
if (file.flags & VFS.SQLITE_OPEN_DELETEONCLOSE) {
|
|
212
|
+
if ((file.flags & VFS.SQLITE_OPEN_DELETEONCLOSE) !== 0) {
|
|
206
213
|
yield* this.#deletePath(file.path)
|
|
207
214
|
}
|
|
208
215
|
}
|
|
@@ -214,7 +221,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
214
221
|
)
|
|
215
222
|
}
|
|
216
223
|
|
|
217
|
-
jRead(fileId: number, pData: Uint8Array<ArrayBuffer>, iOffset: number): number {
|
|
224
|
+
override jRead(fileId: number, pData: Uint8Array<ArrayBuffer>, iOffset: number): number {
|
|
218
225
|
return Effect.gen(this, function* () {
|
|
219
226
|
const file = this.#mapIdToFile.get(fileId)!
|
|
220
227
|
const nBytes = yield* Opfs.Opfs.syncRead(file.accessHandle, pData.subarray(), {
|
|
@@ -232,7 +239,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
232
239
|
)
|
|
233
240
|
}
|
|
234
241
|
|
|
235
|
-
jWrite(fileId: number, pData: Uint8Array<ArrayBuffer>, iOffset: number): number {
|
|
242
|
+
override jWrite(fileId: number, pData: Uint8Array<ArrayBuffer>, iOffset: number): number {
|
|
236
243
|
return Effect.gen(this, function* () {
|
|
237
244
|
const file = this.#mapIdToFile.get(fileId)!
|
|
238
245
|
const nBytes = yield* Opfs.Opfs.syncWrite(file.accessHandle, pData.subarray(), {
|
|
@@ -249,7 +256,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
249
256
|
)
|
|
250
257
|
}
|
|
251
258
|
|
|
252
|
-
jTruncate(fileId: number, iSize: number): number {
|
|
259
|
+
override jTruncate(fileId: number, iSize: number): number {
|
|
253
260
|
return Effect.gen(this, function* () {
|
|
254
261
|
const file = this.#mapIdToFile.get(fileId)!
|
|
255
262
|
yield* Opfs.Opfs.syncTruncate(file.accessHandle, HEADER_OFFSET_DATA + iSize)
|
|
@@ -261,7 +268,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
261
268
|
)
|
|
262
269
|
}
|
|
263
270
|
|
|
264
|
-
jSync(fileId: number, _flags: number): number {
|
|
271
|
+
override jSync(fileId: number, _flags: number): number {
|
|
265
272
|
return Effect.gen(this, function* () {
|
|
266
273
|
const file = this.#mapIdToFile.get(fileId)!
|
|
267
274
|
yield* Opfs.Opfs.syncFlush(file.accessHandle)
|
|
@@ -273,7 +280,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
273
280
|
)
|
|
274
281
|
}
|
|
275
282
|
|
|
276
|
-
jFileSize(fileId: number, pSize64: DataView): number {
|
|
283
|
+
override jFileSize(fileId: number, pSize64: DataView): number {
|
|
277
284
|
return Effect.gen(this, function* () {
|
|
278
285
|
const file = this.#mapIdToFile.get(fileId)!
|
|
279
286
|
const opfsFileSize = yield* Opfs.Opfs.syncGetSize(file.accessHandle)
|
|
@@ -287,18 +294,18 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
287
294
|
)
|
|
288
295
|
}
|
|
289
296
|
|
|
290
|
-
jSectorSize(_fileId: number): number {
|
|
297
|
+
override jSectorSize(_fileId: number): number {
|
|
291
298
|
return SECTOR_SIZE
|
|
292
299
|
}
|
|
293
300
|
|
|
294
|
-
jDeviceCharacteristics(_fileId: number): number {
|
|
301
|
+
override jDeviceCharacteristics(_fileId: number): number {
|
|
295
302
|
return VFS.SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN
|
|
296
303
|
}
|
|
297
304
|
|
|
298
|
-
jAccess(zName: string, _flags: number, pResOut: DataView): number {
|
|
305
|
+
override jAccess(zName: string, _flags: number, pResOut: DataView): number {
|
|
299
306
|
return Effect.gen(this, function* () {
|
|
300
307
|
const path = this.#getPath(zName)
|
|
301
|
-
pResOut.setInt32(0, this.#mapPathToAccessHandle.has(path) ? 1 : 0, true)
|
|
308
|
+
pResOut.setInt32(0, this.#mapPathToAccessHandle.has(path) === true ? 1 : 0, true)
|
|
302
309
|
return VFS.SQLITE_OK
|
|
303
310
|
}).pipe(
|
|
304
311
|
Effect.tapCauseLogPretty,
|
|
@@ -307,7 +314,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
307
314
|
)
|
|
308
315
|
}
|
|
309
316
|
|
|
310
|
-
jDelete(zName: string, _syncDir: number): number {
|
|
317
|
+
override jDelete(zName: string, _syncDir: number): number {
|
|
311
318
|
return Effect.gen(this, function* () {
|
|
312
319
|
const path = this.#getPath(zName)
|
|
313
320
|
yield* this.#deletePath(path)
|
|
@@ -325,7 +332,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
325
332
|
|
|
326
333
|
async isReady() {
|
|
327
334
|
return Effect.gen(this, function* () {
|
|
328
|
-
if (
|
|
335
|
+
if (this.#directoryHandle == null) {
|
|
329
336
|
// All files are stored in a single directory.
|
|
330
337
|
this.#directoryHandle = yield* Opfs.getDirectoryHandleByPath(this.#directoryPath, { create: true })
|
|
331
338
|
|
|
@@ -401,6 +408,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
401
408
|
this.#mapAccessHandleToName.delete(accessHandle)
|
|
402
409
|
this.#availableAccessHandles.delete(accessHandle)
|
|
403
410
|
++nRemoved
|
|
411
|
+
return nRemoved
|
|
404
412
|
}),
|
|
405
413
|
{ discard: true },
|
|
406
414
|
)
|
|
@@ -429,7 +437,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
429
437
|
Stream.runForEach(({ opfsFileName, accessHandle, path }) =>
|
|
430
438
|
Effect.gen(this, function* () {
|
|
431
439
|
this.#mapAccessHandleToName.set(accessHandle, opfsFileName)
|
|
432
|
-
if (path) {
|
|
440
|
+
if (path !== '') {
|
|
433
441
|
this.#mapPathToAccessHandle.set(path, accessHandle)
|
|
434
442
|
} else {
|
|
435
443
|
this.#availableAccessHandles.add(accessHandle)
|
|
@@ -467,7 +475,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
467
475
|
// Delete files not expected to be present.
|
|
468
476
|
const dataView = new DataView(corpus.buffer, corpus.byteOffset)
|
|
469
477
|
const flags = dataView.getUint32(HEADER_OFFSET_FLAGS)
|
|
470
|
-
if (corpus[0] && (flags & VFS.SQLITE_OPEN_DELETEONCLOSE || (flags & PERSISTENT_FILE_TYPES) === 0)) {
|
|
478
|
+
if (corpus[0] !== 0 && ((flags & VFS.SQLITE_OPEN_DELETEONCLOSE) !== 0 || (flags & PERSISTENT_FILE_TYPES) === 0)) {
|
|
471
479
|
yield* Effect.logWarning(`Remove file with unexpected flags ${flags.toString(16)}`)
|
|
472
480
|
yield* this.#setAssociatedPath(accessHandle, '', 0)
|
|
473
481
|
return ''
|
|
@@ -478,7 +486,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
478
486
|
|
|
479
487
|
// Verify the digest.
|
|
480
488
|
const computedDigest = this.#computeDigest(corpus)
|
|
481
|
-
if (fileDigest.every((value, i) => value === computedDigest[i])) {
|
|
489
|
+
if (fileDigest.every((value, i) => value === computedDigest[i]) === true) {
|
|
482
490
|
// Good digest. Decode the null-terminated path string.
|
|
483
491
|
const pathBytes = corpus.indexOf(0)
|
|
484
492
|
if (pathBytes === 0) {
|
|
@@ -520,7 +528,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
520
528
|
yield* Opfs.Opfs.syncWrite(accessHandle, digest, { at: HEADER_OFFSET_DIGEST })
|
|
521
529
|
yield* Opfs.Opfs.syncFlush(accessHandle)
|
|
522
530
|
|
|
523
|
-
if (path) {
|
|
531
|
+
if (path !== '') {
|
|
524
532
|
this.#mapPathToAccessHandle.set(path, accessHandle)
|
|
525
533
|
this.#availableAccessHandles.delete(accessHandle)
|
|
526
534
|
} else {
|
|
@@ -538,7 +546,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
538
546
|
* @returns {ArrayBuffer} 64-bit digest
|
|
539
547
|
*/
|
|
540
548
|
#computeDigest(corpus: Uint8Array): Uint32Array {
|
|
541
|
-
if (
|
|
549
|
+
if (corpus[0] === 0) {
|
|
542
550
|
// Optimization for deleted file.
|
|
543
551
|
return new Uint32Array([0xfe_cc_5f_80, 0xac_ce_c0_37])
|
|
544
552
|
}
|
|
@@ -572,7 +580,7 @@ export class AccessHandlePoolVFS extends FacadeVFS {
|
|
|
572
580
|
#deletePath = Effect.fn((path: string) =>
|
|
573
581
|
Effect.gen(this, function* () {
|
|
574
582
|
const accessHandle = this.#mapPathToAccessHandle.get(path)
|
|
575
|
-
if (accessHandle) {
|
|
583
|
+
if (accessHandle !== undefined) {
|
|
576
584
|
// Un-associate the SQLite path from the OPFS file.
|
|
577
585
|
this.#mapPathToAccessHandle.delete(path)
|
|
578
586
|
yield* this.#setAssociatedPath(accessHandle, '', 0)
|
|
@@ -21,7 +21,7 @@ export const decodeAccessHandlePoolFilename = async (file: File): Promise<string
|
|
|
21
21
|
// Delete files not expected to be present.
|
|
22
22
|
const dataView = new DataView(corpus.buffer, corpus.byteOffset)
|
|
23
23
|
const flags = dataView.getUint32(HEADER_OFFSET_FLAGS)
|
|
24
|
-
if (corpus[0] && (flags & VFS.SQLITE_OPEN_DELETEONCLOSE || (flags & PERSISTENT_FILE_TYPES) === 0)) {
|
|
24
|
+
if (corpus[0] !== 0 && ((flags & VFS.SQLITE_OPEN_DELETEONCLOSE) !== 0 || (flags & PERSISTENT_FILE_TYPES) === 0)) {
|
|
25
25
|
console.warn(`Remove file with unexpected flags ${flags.toString(16)}`)
|
|
26
26
|
return ''
|
|
27
27
|
}
|
|
@@ -32,7 +32,7 @@ export const decodeAccessHandlePoolFilename = async (file: File): Promise<string
|
|
|
32
32
|
|
|
33
33
|
// Verify the digest.
|
|
34
34
|
const computedDigest = computeDigest(corpus)
|
|
35
|
-
if (fileDigest.every((value, i) => value === computedDigest[i])) {
|
|
35
|
+
if (fileDigest.every((value, i) => value === computedDigest[i]) === true) {
|
|
36
36
|
// Good digest. Decode the null-terminated path string.
|
|
37
37
|
const pathBytes = corpus.indexOf(0)
|
|
38
38
|
if (pathBytes === 0) {
|
|
@@ -48,7 +48,7 @@ export const decodeAccessHandlePoolFilename = async (file: File): Promise<string
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
const computeDigest = (corpus: Uint8Array): Uint32Array => {
|
|
51
|
-
if (
|
|
51
|
+
if (corpus[0] === 0) {
|
|
52
52
|
// Optimization for deleted file.
|
|
53
53
|
return new Uint32Array([0xfe_cc_5f_80, 0xac_ce_c0_37])
|
|
54
54
|
}
|