@livestore/wa-sqlite 1.0.8-dev.2 → 1.0.8-dev.4

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 CHANGED
@@ -8,6 +8,10 @@ This fork adds synchronous APIs and session extensions needed for LiveStore's re
8
8
  - **Session extensions**: Enables change tracking and replication for collaborative features
9
9
  - **Node.js compatibility**: Additional build targets for server-side testing
10
10
 
11
+ ## Future work
12
+
13
+ - **Async build investigation**: Some VFS implementations (e.g., IndexedDB) require async APIs ([#131](https://github.com/livestorejs/livestore/issues/131)). We're investigating whether to support this through a unified hybrid build or separate builds.
14
+
11
15
  ### Changes include:
12
16
 
13
17
  - `src/sqlite-api.js`:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livestore/wa-sqlite",
3
- "version": "1.0.8-dev.2",
3
+ "version": "1.0.8-dev.4",
4
4
  "type": "module",
5
5
  "main": "src/sqlite-api.js",
6
6
  "types": "src/types/index.d.ts",
@@ -23,8 +23,8 @@
23
23
  "comlink": "^4.4.1",
24
24
  "jasmine-core": "^4.5.0",
25
25
  "monaco-editor": "^0.34.1",
26
- "typedoc": "^0.25.7",
27
- "typescript": "^5.3.3",
26
+ "typedoc": "^0.28.9",
27
+ "typescript": "^5.9.2",
28
28
  "web-test-runner-jasmine": "^0.0.6"
29
29
  },
30
30
  "dependenciesMeta": {
package/src/sqlite-api.js CHANGED
@@ -260,18 +260,21 @@ export function Factory(Module) {
260
260
  return function(db, schema) {
261
261
  verifyDatabase(db);
262
262
  const piSize = tmpPtr[0];
263
- let address = f(db, schema, piSize, 0);
263
+ let address = f(db, schema, piSize, 0); // 0 means no flags
264
264
  if (address === 0) {
265
265
  address = f(db, schema, piSize, SQLITE_SERIALIZE_NOCOPY);
266
266
  const size = Module.getValue(piSize, '*');
267
267
  const result = Module.HEAPU8.subarray(address, address + size);
268
268
  // NOTE Given that the memory is owned by SQLite, we must copy it.
269
+ // Warning: We're not super confident yet about this code path. There might be dragons.
269
270
  return new Uint8Array(result.slice());
270
271
  } else {
271
272
  const size = Module.getValue(piSize, '*');
272
273
  const result = Module.HEAPU8.subarray(address, address + size);
273
- // Here we're getting a copy of the memory, so we can return it directly.
274
- return new Uint8Array(result);
274
+ // Copy the data immediately, then free the SQLite buffer to prevent ref-count issues
275
+ const copy = new Uint8Array(result);
276
+ Module._sqlite3_free(address);
277
+ return copy;
275
278
  }
276
279
  };
277
280
  })();
@@ -290,10 +293,15 @@ export function Factory(Module) {
290
293
  const errMsg = Module.ccall('sqlite3_errmsg', 'string', ['number'], [dest]);
291
294
  throw new SQLiteError(`backup failed: ${errMsg}`, SQLite.SQLITE_ERROR);
292
295
  }
293
- fStep(backup, -1);
296
+ // TODO also allow run in chunks with some yielding mechanism
297
+ fStep(backup, -1); // -1 means do it in one go
294
298
  return fFinish(backup);
295
299
  };
296
300
  })();
301
+
302
+
303
+ // TODO implement this at some point
304
+ // sqlite3.backup_step = (function() {
297
305
 
298
306
  sqlite3.clear_bindings = (function() {
299
307
  const fname = 'sqlite3_clear_bindings';
@@ -11,11 +11,11 @@
11
11
  * Javascript types that SQLite can use
12
12
  *
13
13
  * C integer and floating-point types both map to/from Javascript `number`.
14
- * Blob data can be provided to SQLite as `Uint8Array` or `number[]` (with
14
+ * Blob data can be provided to SQLite as `Uint8Array<ArrayBuffer>` or `number[]` (with
15
15
  * each element converted to a byte); SQLite always returns blob data as
16
- * `Uint8Array`
16
+ * `Uint8Array<ArrayBuffer>`
17
17
  */
18
- type SQLiteCompatibleType = number|string|Uint8Array|Array<number>|bigint|null;
18
+ type SQLiteCompatibleType = number|string|Uint8Array<ArrayBuffer>|Array<number>|bigint|null;
19
19
 
20
20
  /**
21
21
  * SQLite Virtual File System object
@@ -244,7 +244,7 @@ interface SQLiteAPI {
244
244
  * @param value
245
245
  * @returns `SQLITE_OK` (throws exception on error)
246
246
  */
247
- bind_blob(stmt: number, i: number, value: Uint8Array|Array<number>): number;
247
+ bind_blob(stmt: number, i: number, value: Uint8Array<ArrayBuffer>|Array<number>): number;
248
248
 
249
249
  /**
250
250
  * Bind number to prepared statement parameter
@@ -346,7 +346,7 @@ interface SQLiteAPI {
346
346
  deserialize(
347
347
  db: number,
348
348
  zSchema: string,
349
- pData: Uint8Array,
349
+ pData: Uint8Array<ArrayBuffer>,
350
350
  szDb: number,
351
351
  szBuf: number,
352
352
  mFlags: number
@@ -364,7 +364,7 @@ interface SQLiteAPI {
364
364
  db: number,
365
365
  zSchema: string,
366
366
  // mFlags: number
367
- ): Uint8Array;
367
+ ): Uint8Array<ArrayBuffer>;
368
368
 
369
369
  // sqlite3_backup *sqlite3_backup_init(
370
370
  // sqlite3 *pDest, /* Destination database handle */
@@ -440,7 +440,7 @@ interface SQLiteAPI {
440
440
  * @param i column index
441
441
  * @returns column value
442
442
  */
443
- column_blob(stmt: number, i: number): Uint8Array;
443
+ column_blob(stmt: number, i: number): Uint8Array<ArrayBuffer>;
444
444
 
445
445
  /**
446
446
  * Get storage size for column text or blob
@@ -699,7 +699,7 @@ interface SQLiteAPI {
699
699
  * @param context context pointer
700
700
  * @param value
701
701
  */
702
- result_blob(context: number, value: Uint8Array|number[]): void;
702
+ result_blob(context: number, value: Uint8Array<ArrayBuffer>|number[]): void;
703
703
 
704
704
  /**
705
705
  * Set the result of a function or vtable column
@@ -869,7 +869,7 @@ interface SQLiteAPI {
869
869
  * @param pValue `sqlite3_value` pointer
870
870
  * @returns value
871
871
  */
872
- value_blob(pValue: number): Uint8Array;
872
+ value_blob(pValue: number): Uint8Array<ArrayBuffer>;
873
873
 
874
874
  /**
875
875
  * Get blob or text size for value
@@ -961,18 +961,18 @@ interface SQLiteAPI {
961
961
  * Get the changeset for a session.
962
962
  *
963
963
  * @param pSession session pointer
964
- * @returns {result: number, size: number, changeset: Uint8Array}
964
+ * @returns {result: number, size: number, changeset: Uint8Array<ArrayBuffer>}
965
965
  */
966
966
  session_changeset(pSession: number): {
967
967
  result: number;
968
968
  size: number;
969
- changeset: Uint8Array | null;
969
+ changeset: Uint8Array<ArrayBuffer> | null;
970
970
  };
971
971
 
972
972
  session_changeset_inverted(pSession: number): {
973
973
  result: number;
974
974
  size: number;
975
- changeset: Uint8Array;
975
+ changeset: Uint8Array<ArrayBuffer>;
976
976
  };
977
977
 
978
978
  /**
@@ -988,7 +988,7 @@ interface SQLiteAPI {
988
988
  * @param changeset changeset blob to import from
989
989
  * @returns changeset iterator pointer
990
990
  */
991
- changeset_start(changesetBlob: Uint8Array): number;
991
+ changeset_start(changesetBlob: Uint8Array<ArrayBuffer>): number;
992
992
 
993
993
  /**
994
994
  * Finalize a changeset iterator.
@@ -1004,7 +1004,7 @@ interface SQLiteAPI {
1004
1004
  * @param input changeset to invert
1005
1005
  * @returns inverted changeset
1006
1006
  */
1007
- changeset_invert(input: Uint8Array): Uint8Array;
1007
+ changeset_invert(input: Uint8Array<ArrayBuffer>): Uint8Array<ArrayBuffer>;
1008
1008
 
1009
1009
  /**
1010
1010
  * Apply a changeset to a database.
@@ -1013,7 +1013,7 @@ interface SQLiteAPI {
1013
1013
  * @param changeset changeset to apply
1014
1014
  * @returns `SQLITE_OK` (throws exception on error)
1015
1015
  */
1016
- changeset_apply(db: number, changeset: Uint8Array, options?: {
1016
+ changeset_apply(db: number, changeset: Uint8Array<ArrayBuffer>, options?: {
1017
1017
  onConflict?: (conflictType: number) => 0 | 1 | 2
1018
1018
  }): number;
1019
1019
 
@@ -1309,23 +1309,23 @@ declare module '@livestore/wa-sqlite/src/VFS.js' {
1309
1309
  xClose(fileId: number): number;
1310
1310
  /**
1311
1311
  * @param {number} fileId
1312
- * @param {Uint8Array} pData
1312
+ * @param {Uint8Array<ArrayBuffer>} pData
1313
1313
  * @param {number} iOffset
1314
1314
  * @returns {number}
1315
1315
  */
1316
1316
  xRead(fileId: number, pData: {
1317
1317
  size: number;
1318
- value: Uint8Array;
1318
+ value: Uint8Array<ArrayBuffer>;
1319
1319
  }, iOffset: number): number;
1320
1320
  /**
1321
1321
  * @param {number} fileId
1322
- * @param {Uint8Array} pData
1322
+ * @param {Uint8Array<ArrayBuffer>} pData
1323
1323
  * @param {number} iOffset
1324
1324
  * @returns {number}
1325
1325
  */
1326
1326
  xWrite(fileId: number, pData: {
1327
1327
  size: number;
1328
- value: Uint8Array;
1328
+ value: Uint8Array<ArrayBuffer>;
1329
1329
  }, iOffset: number): number;
1330
1330
  /**
1331
1331
  * @param {number} fileId