@powersync/node 0.13.0 → 0.14.1

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.
Files changed (52) hide show
  1. package/dist/DefaultWorker.cjs.map +1 -1
  2. package/dist/bundle.cjs +38 -18
  3. package/dist/bundle.cjs.map +1 -1
  4. package/dist/worker.cjs.map +1 -1
  5. package/lib/db/AsyncDatabase.js +1 -0
  6. package/lib/db/AsyncDatabase.js.map +1 -0
  7. package/lib/db/BetterSqliteWorker.js +1 -0
  8. package/lib/db/BetterSqliteWorker.js.map +1 -0
  9. package/lib/db/DefaultWorker.js +1 -0
  10. package/lib/db/DefaultWorker.js.map +1 -0
  11. package/lib/db/NodeSqliteWorker.js +1 -0
  12. package/lib/db/NodeSqliteWorker.js.map +1 -0
  13. package/lib/db/PowerSyncDatabase.js +1 -0
  14. package/lib/db/PowerSyncDatabase.js.map +1 -0
  15. package/lib/db/RemoteConnection.d.ts +3 -2
  16. package/lib/db/RemoteConnection.js +30 -12
  17. package/lib/db/RemoteConnection.js.map +1 -0
  18. package/lib/db/SqliteWorker.js +1 -0
  19. package/lib/db/SqliteWorker.js.map +1 -0
  20. package/lib/db/WorkerConnectionPool.js +2 -1
  21. package/lib/db/WorkerConnectionPool.js.map +1 -0
  22. package/lib/db/options.js +1 -0
  23. package/lib/db/options.js.map +1 -0
  24. package/lib/index.js +1 -0
  25. package/lib/index.js.map +1 -0
  26. package/lib/sync/stream/NodeRemote.js +1 -0
  27. package/lib/sync/stream/NodeRemote.js.map +1 -0
  28. package/lib/sync/stream/NodeStreamingSyncImplementation.d.ts +3 -3
  29. package/lib/sync/stream/NodeStreamingSyncImplementation.js +8 -4
  30. package/lib/sync/stream/NodeStreamingSyncImplementation.js.map +1 -0
  31. package/lib/utils/modules.js +1 -0
  32. package/lib/utils/modules.js.map +1 -0
  33. package/lib/utils/modules_commonjs.js +1 -0
  34. package/lib/utils/modules_commonjs.js.map +1 -0
  35. package/lib/worker.js +1 -0
  36. package/lib/worker.js.map +1 -0
  37. package/package.json +10 -10
  38. package/src/db/AsyncDatabase.ts +26 -0
  39. package/src/db/BetterSqliteWorker.ts +72 -0
  40. package/src/db/DefaultWorker.ts +3 -0
  41. package/src/db/NodeSqliteWorker.ts +63 -0
  42. package/src/db/PowerSyncDatabase.ts +100 -0
  43. package/src/db/RemoteConnection.ts +129 -0
  44. package/src/db/SqliteWorker.ts +119 -0
  45. package/src/db/WorkerConnectionPool.ts +328 -0
  46. package/src/db/options.ts +51 -0
  47. package/src/index.ts +4 -0
  48. package/src/sync/stream/NodeRemote.ts +123 -0
  49. package/src/sync/stream/NodeStreamingSyncImplementation.ts +57 -0
  50. package/src/utils/modules.ts +6 -0
  51. package/src/utils/modules_commonjs.ts +7 -0
  52. package/src/worker.ts +1 -0
@@ -101,3 +101,4 @@ class DatabaseOpenHelper {
101
101
  return Comlink.proxy(database);
102
102
  }
103
103
  }
104
+ //# sourceMappingURL=SqliteWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteWorker.js","sourceRoot":"","sources":["../../src/db/SqliteWorker.ts"],"names":[],"mappings":"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"}
@@ -167,7 +167,7 @@ export class WorkerConnectionPool extends BaseObserver {
167
167
  return await fn(this.writeConnection);
168
168
  }
169
169
  finally {
170
- const serializedUpdates = await this.writeConnection.database.executeRaw("SELECT powersync_update_hooks('get');", []);
170
+ const serializedUpdates = await this.writeConnection.executeRaw("SELECT powersync_update_hooks('get');", []);
171
171
  const updates = JSON.parse(serializedUpdates[0][0]);
172
172
  if (updates.length > 0) {
173
173
  const event = {
@@ -263,3 +263,4 @@ export class WorkerConnectionPool extends BaseObserver {
263
263
  }
264
264
  }
265
265
  }
266
+ //# sourceMappingURL=WorkerConnectionPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerConnectionPool.js","sourceRoot":"","sources":["../../src/db/WorkerConnectionPool.ts"],"names":[],"mappings":"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"}
package/lib/db/options.js CHANGED
@@ -1 +1,2 @@
1
1
  export {};
2
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/db/options.ts"],"names":[],"mappings":""}
package/lib/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  // Re export to only require one import in client side code
2
2
  export * from '@powersync/common';
3
3
  export * from './db/PowerSyncDatabase.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,cAAc,mBAAmB,CAAC;AAElC,cAAc,2BAA2B,CAAC"}
@@ -76,3 +76,4 @@ function getProxyForProtocol(protocol) {
76
76
  process.env[`all_proxy`] ??
77
77
  process.env[`ALL_PROXY`]);
78
78
  }
79
+ //# sourceMappingURL=NodeRemote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeRemote.js","sourceRoot":"","sources":["../../../src/sync/stream/NodeRemote.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { AbstractStreamingSyncImplementation, AbstractStreamingSyncImplementationOptions, LockOptions } from '@powersync/common';
2
- import Lock from 'async-lock';
1
+ import { AbstractStreamingSyncImplementation, AbstractStreamingSyncImplementationOptions, LockOptions, LockType } from '@powersync/common';
2
+ import { Mutex } from 'async-mutex';
3
3
  export declare class NodeStreamingSyncImplementation extends AbstractStreamingSyncImplementation {
4
- locks: Lock;
4
+ locks: Map<LockType, Mutex>;
5
5
  constructor(options: AbstractStreamingSyncImplementationOptions);
6
6
  /**
7
7
  * Configures global locks on sync process
@@ -1,5 +1,5 @@
1
1
  import { AbstractStreamingSyncImplementation, LockType } from '@powersync/common';
2
- import Lock from 'async-lock';
2
+ import { Mutex } from 'async-mutex';
3
3
  /**
4
4
  * Global locks which prevent multiple instances from syncing
5
5
  * concurrently.
@@ -21,16 +21,19 @@ export class NodeStreamingSyncImplementation extends AbstractStreamingSyncImplem
21
21
  this.locks = LOCKS.get(identifier);
22
22
  return;
23
23
  }
24
- this.locks = new Lock();
24
+ this.locks = new Map();
25
+ this.locks.set(LockType.CRUD, new Mutex());
26
+ this.locks.set(LockType.SYNC, new Mutex());
25
27
  if (identifier) {
26
28
  LOCKS.set(identifier, this.locks);
27
29
  }
28
30
  }
29
31
  obtainLock(lockOptions) {
30
- if (!lockTypes.has(lockOptions.type)) {
32
+ const lock = this.locks.get(lockOptions.type);
33
+ if (!lock) {
31
34
  throw new Error(`Lock type ${lockOptions.type} not found`);
32
35
  }
33
- return this.locks.acquire(lockOptions.type, async () => {
36
+ return lock.runExclusive(async () => {
34
37
  if (lockOptions.signal?.aborted) {
35
38
  throw new Error('Aborted');
36
39
  }
@@ -38,3 +41,4 @@ export class NodeStreamingSyncImplementation extends AbstractStreamingSyncImplem
38
41
  });
39
42
  }
40
43
  }
44
+ //# sourceMappingURL=NodeStreamingSyncImplementation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeStreamingSyncImplementation.js","sourceRoot":"","sources":["../../../src/sync/stream/NodeStreamingSyncImplementation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mCAAmC,EAGnC,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;;GAGG;AACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAgC,CAAC;AAEtD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEnD,MAAM,OAAO,+BAAgC,SAAQ,mCAAmC;IACtF,KAAK,CAAuB;IAE5B,YAAY,OAAmD;QAC7D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,SAAS;QACP,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,IAAI,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;QAE3C,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,UAAU,CAAI,WAA2B;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,aAAa,WAAW,CAAC,IAAI,YAAY,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;YAClC,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -3,3 +3,4 @@ export const isBundledToCommonJs = false;
3
3
  export async function dynamicImport(path) {
4
4
  return await import(path);
5
5
  }
6
+ //# sourceMappingURL=modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules.js","sourceRoot":"","sources":["../../src/utils/modules.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,mBAAmB,GAAY,KAAK,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -4,3 +4,4 @@ export const isBundledToCommonJs = true;
4
4
  export async function dynamicImport(path) {
5
5
  return require(path);
6
6
  }
7
+ //# sourceMappingURL=modules_commonjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules_commonjs.js","sourceRoot":"","sources":["../../src/utils/modules_commonjs.ts"],"names":[],"mappings":"AAAA,wHAAwH;AACxH,wBAAwB;AACxB,MAAM,CAAC,MAAM,mBAAmB,GAAY,IAAI,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC"}
package/lib/worker.js CHANGED
@@ -1 +1,2 @@
1
1
  export * from './db/SqliteWorker.js';
2
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powersync/node",
3
- "version": "0.13.0",
3
+ "version": "0.14.1",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -10,7 +10,8 @@
10
10
  "files": [
11
11
  "lib",
12
12
  "dist",
13
- "download_core.js"
13
+ "download_core.js",
14
+ "src"
14
15
  ],
15
16
  "type": "module",
16
17
  "exports": {
@@ -47,7 +48,7 @@
47
48
  },
48
49
  "homepage": "https://docs.powersync.com/",
49
50
  "peerDependencies": {
50
- "@powersync/common": "^1.41.0",
51
+ "@powersync/common": "^1.42.0",
51
52
  "better-sqlite3": "12.x"
52
53
  },
53
54
  "peerDependenciesMeta": {
@@ -56,21 +57,20 @@
56
57
  }
57
58
  },
58
59
  "dependencies": {
59
- "async-lock": "^1.4.0",
60
- "bson": "^6.6.0",
60
+ "async-mutex": "^0.5.0",
61
61
  "comlink": "^4.4.2",
62
62
  "undici": "^7.11.0",
63
- "@powersync/common": "1.41.0"
63
+ "bson": "^6.10.4",
64
+ "@powersync/common": "1.42.0"
64
65
  },
65
66
  "devDependencies": {
66
- "@types/async-lock": "^1.4.0",
67
67
  "@types/node": "^24.2.0",
68
68
  "better-sqlite3": "^12.2.0",
69
- "drizzle-orm": "^0.35.2",
69
+ "drizzle-orm": "^0.44.7",
70
70
  "rollup": "4.14.3",
71
71
  "typescript": "^5.5.3",
72
72
  "vitest": "^3.2.4",
73
- "@powersync/drizzle-driver": "0.6.0"
73
+ "@powersync/drizzle-driver": "0.7.0"
74
74
  },
75
75
  "keywords": [
76
76
  "data sync",
@@ -82,7 +82,7 @@
82
82
  "scripts": {
83
83
  "prepare:core": "node download_core.js",
84
84
  "build": " pnpm prepare:core && tsc -b && rollup --config",
85
- "build:prod": "pnpm prepare:core && tsc -b --sourceMap false && rollup --config",
85
+ "build:prod": "pnpm prepare:core && tsc -b && rollup --config",
86
86
  "clean": "rm -rf lib dist tsconfig.tsbuildinfo",
87
87
  "watch": "tsc -b -w",
88
88
  "test": " pnpm prepare:core && vitest",
@@ -0,0 +1,26 @@
1
+ import { QueryResult } from '@powersync/common';
2
+ import { NodeDatabaseImplementation } from './options.js';
3
+
4
+ export type ProxiedQueryResult = Omit<QueryResult, 'rows'> & {
5
+ rows?: {
6
+ _array: any[];
7
+ length: number;
8
+ };
9
+ };
10
+
11
+ export interface AsyncDatabaseOpenOptions {
12
+ path: string;
13
+ isWriter: boolean;
14
+ implementation: NodeDatabaseImplementation;
15
+ }
16
+
17
+ export interface AsyncDatabaseOpener {
18
+ open(options: AsyncDatabaseOpenOptions): Promise<AsyncDatabase>;
19
+ }
20
+
21
+ export interface AsyncDatabase {
22
+ execute: (query: string, params: any[]) => Promise<ProxiedQueryResult>;
23
+ executeRaw: (query: string, params: any[]) => Promise<any[][]>;
24
+ executeBatch: (query: string, params: any[][]) => Promise<ProxiedQueryResult>;
25
+ close: () => Promise<void>;
26
+ }
@@ -0,0 +1,72 @@
1
+ import type { Database } from 'better-sqlite3';
2
+ import { AsyncDatabase, AsyncDatabaseOpenOptions } from './AsyncDatabase.js';
3
+ import { PowerSyncWorkerOptions } from './SqliteWorker.js';
4
+ import { threadId } from 'node:worker_threads';
5
+
6
+ class BlockingAsyncDatabase implements AsyncDatabase {
7
+ private readonly db: Database;
8
+
9
+ constructor(db: Database) {
10
+ this.db = db;
11
+
12
+ db.function('node_thread_id', () => threadId);
13
+ }
14
+
15
+ async close() {
16
+ this.db.close();
17
+ }
18
+
19
+ async execute(query: string, params: any[]) {
20
+ const stmt = this.db.prepare(query);
21
+ if (stmt.reader) {
22
+ const rows = stmt.all(params);
23
+ return {
24
+ rowsAffected: 0,
25
+ rows: {
26
+ _array: rows,
27
+ length: rows.length
28
+ }
29
+ };
30
+ } else {
31
+ const info = stmt.run(params);
32
+ return {
33
+ rowsAffected: info.changes,
34
+ insertId: Number(info.lastInsertRowid)
35
+ };
36
+ }
37
+ }
38
+
39
+ async executeRaw(query: string, params: any[]) {
40
+ const stmt = this.db.prepare(query);
41
+
42
+ if (stmt.reader) {
43
+ return stmt.raw().all(params) as any[][];
44
+ } else {
45
+ stmt.raw().run(params);
46
+ return [];
47
+ }
48
+ }
49
+
50
+ async executeBatch(query: string, params: any[][]) {
51
+ params = params ?? [];
52
+
53
+ let rowsAffected = 0;
54
+
55
+ const stmt = this.db.prepare(query);
56
+ for (const paramSet of params) {
57
+ const info = stmt.run(paramSet);
58
+ rowsAffected += info.changes;
59
+ }
60
+
61
+ return { rowsAffected };
62
+ }
63
+ }
64
+
65
+ export async function openDatabase(worker: PowerSyncWorkerOptions, options: AsyncDatabaseOpenOptions) {
66
+ const BetterSQLite3Database = await worker.loadBetterSqlite3();
67
+ const baseDB = new BetterSQLite3Database(options.path);
68
+ baseDB.loadExtension(worker.extensionPath(), 'sqlite3_powersync_init');
69
+
70
+ const asyncDb = new BlockingAsyncDatabase(baseDB);
71
+ return asyncDb;
72
+ }
@@ -0,0 +1,3 @@
1
+ import { startPowerSyncWorker } from './SqliteWorker.js';
2
+
3
+ startPowerSyncWorker();
@@ -0,0 +1,63 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import { threadId } from 'node:worker_threads';
3
+
4
+ import { dynamicImport } from '../utils/modules.js';
5
+ import { AsyncDatabase, AsyncDatabaseOpenOptions } from './AsyncDatabase.js';
6
+ import { PowerSyncWorkerOptions } from './SqliteWorker.js';
7
+
8
+ class BlockingNodeDatabase implements AsyncDatabase {
9
+ private readonly db: DatabaseSync;
10
+
11
+ constructor(db: DatabaseSync, write: boolean) {
12
+ this.db = db;
13
+
14
+ db.function('node_thread_id', () => threadId);
15
+ }
16
+
17
+ async close() {
18
+ this.db.close();
19
+ }
20
+
21
+ async execute(query: string, params: any[]) {
22
+ const stmt = this.db.prepare(query);
23
+ const rows = stmt.all(...params);
24
+ return {
25
+ rowsAffected: 0,
26
+ rows: {
27
+ _array: rows,
28
+ length: rows.length
29
+ }
30
+ };
31
+ }
32
+
33
+ async executeRaw(query: string, params: any[]) {
34
+ const stmt = this.db.prepare(query);
35
+ (stmt as any).setReturnArrays(true); // Missing in @types/node, https://nodejs.org/api/sqlite.html#statementsetreturnarraysenabled
36
+ return stmt.all(...params) as any as any[][];
37
+ }
38
+
39
+ async executeBatch(query: string, params: any[][]) {
40
+ params = params ?? [];
41
+
42
+ let rowsAffected = 0;
43
+
44
+ const stmt = this.db.prepare(query);
45
+ for (const paramSet of params) {
46
+ const info = stmt.run(...paramSet);
47
+ rowsAffected += info.changes as number;
48
+ }
49
+
50
+ return { rowsAffected };
51
+ }
52
+ }
53
+
54
+ export async function openDatabase(worker: PowerSyncWorkerOptions, options: AsyncDatabaseOpenOptions) {
55
+ // NOTE: We want to import node:sqlite dynamically, to avoid bundlers unconditionally requiring node:sqlite in the
56
+ // end, since that would make us incompatible with older Node.JS versions.
57
+ const { DatabaseSync } = await dynamicImport('node:sqlite');
58
+
59
+ const baseDB = new DatabaseSync(options.path, { allowExtension: true });
60
+ baseDB.loadExtension(worker.extensionPath(), 'sqlite3_powersync_init');
61
+
62
+ return new BlockingNodeDatabase(baseDB, options.isWriter);
63
+ }
@@ -0,0 +1,100 @@
1
+ import {
2
+ AbstractPowerSyncDatabase,
3
+ AbstractRemoteOptions,
4
+ AbstractStreamingSyncImplementation,
5
+ AdditionalConnectionOptions,
6
+ BucketStorageAdapter,
7
+ DBAdapter,
8
+ PowerSyncBackendConnector,
9
+ PowerSyncConnectionOptions,
10
+ PowerSyncDatabaseOptions,
11
+ PowerSyncDatabaseOptionsWithSettings,
12
+ RequiredAdditionalConnectionOptions,
13
+ SqliteBucketStorage,
14
+ SQLOpenFactory
15
+ } from '@powersync/common';
16
+
17
+ import { NodeCustomConnectionOptions, NodeRemote } from '../sync/stream/NodeRemote.js';
18
+ import { NodeStreamingSyncImplementation } from '../sync/stream/NodeStreamingSyncImplementation.js';
19
+
20
+ import { WorkerConnectionPool } from './WorkerConnectionPool.js';
21
+ import { NodeSQLOpenOptions } from './options.js';
22
+
23
+ export type NodePowerSyncDatabaseOptions = PowerSyncDatabaseOptions & {
24
+ database: DBAdapter | SQLOpenFactory | NodeSQLOpenOptions;
25
+ /**
26
+ * Options to override how the SDK will connect to the sync service.
27
+ *
28
+ * This option is intended to be used for internal tests.
29
+ */
30
+ remoteOptions?: Partial<AbstractRemoteOptions>;
31
+ };
32
+
33
+ export type NodeAdditionalConnectionOptions = AdditionalConnectionOptions & NodeCustomConnectionOptions;
34
+
35
+ export type NodePowerSyncConnectionOptions = PowerSyncConnectionOptions & NodeAdditionalConnectionOptions;
36
+
37
+ /**
38
+ * A PowerSync database which provides SQLite functionality
39
+ * which is automatically synced.
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * export const db = new PowerSyncDatabase({
44
+ * schema: AppSchema,
45
+ * database: {
46
+ * dbFilename: 'example.db'
47
+ * }
48
+ * });
49
+ * ```
50
+ */
51
+ export class PowerSyncDatabase extends AbstractPowerSyncDatabase {
52
+ constructor(options: NodePowerSyncDatabaseOptions) {
53
+ super(options);
54
+ }
55
+
56
+ async _initialize(): Promise<void> {
57
+ await (this.database as WorkerConnectionPool).initialize();
58
+ }
59
+
60
+ /**
61
+ * Opens a DBAdapter using better-sqlite3 as the default SQLite open factory.
62
+ */
63
+ protected openDBAdapter(options: PowerSyncDatabaseOptionsWithSettings): DBAdapter {
64
+ return new WorkerConnectionPool(options.database);
65
+ }
66
+
67
+ protected generateBucketStorageAdapter(): BucketStorageAdapter {
68
+ return new SqliteBucketStorage(this.database, this.logger);
69
+ }
70
+
71
+ connect(
72
+ connector: PowerSyncBackendConnector,
73
+ options?: PowerSyncConnectionOptions & NodeCustomConnectionOptions
74
+ ): Promise<void> {
75
+ return super.connect(connector, options);
76
+ }
77
+
78
+ protected generateSyncStreamImplementation(
79
+ connector: PowerSyncBackendConnector,
80
+ options: RequiredAdditionalConnectionOptions & NodeAdditionalConnectionOptions
81
+ ): AbstractStreamingSyncImplementation {
82
+ const logger = this.logger;
83
+ const remote = new NodeRemote(connector, logger, {
84
+ dispatcher: options.dispatcher,
85
+ ...(this.options as NodePowerSyncDatabaseOptions).remoteOptions
86
+ });
87
+
88
+ return new NodeStreamingSyncImplementation({
89
+ adapter: this.bucketStorageAdapter,
90
+ remote,
91
+ uploadCrud: async () => {
92
+ await this.waitForReady();
93
+ await connector.uploadData(this);
94
+ },
95
+ ...options,
96
+ identifier: this.database.name,
97
+ logger
98
+ });
99
+ }
100
+ }
@@ -0,0 +1,129 @@
1
+ import { Worker } from 'node:worker_threads';
2
+ import { LockContext, QueryResult } from '@powersync/common';
3
+ import { releaseProxy, Remote } from 'comlink';
4
+ import { AsyncDatabase, AsyncDatabaseOpener, ProxiedQueryResult } from './AsyncDatabase.js';
5
+
6
+ /**
7
+ * A PowerSync database connection implemented with RPC calls to a background worker.
8
+ */
9
+ export class RemoteConnection implements LockContext {
10
+ isBusy = false;
11
+
12
+ private readonly worker: Worker;
13
+ private readonly comlink: Remote<AsyncDatabaseOpener>;
14
+ private readonly database: Remote<AsyncDatabase>;
15
+
16
+ private readonly notifyWorkerClosed = new AbortController();
17
+
18
+ constructor(worker: Worker, comlink: Remote<AsyncDatabaseOpener>, database: Remote<AsyncDatabase>) {
19
+ this.worker = worker;
20
+ this.comlink = comlink;
21
+ this.database = database;
22
+
23
+ this.worker.once('exit', (_) => {
24
+ this.notifyWorkerClosed.abort();
25
+ });
26
+ }
27
+
28
+ /**
29
+ * Runs the inner function, but appends the stack trace where this function was called. This is useful for workers
30
+ * because stack traces from worker errors are otherwise unrelated to the application issue that has caused them.
31
+ */
32
+ private withRemote<T>(inner: () => Promise<T>): Promise<T> {
33
+ const trace = {};
34
+ Error.captureStackTrace(trace);
35
+ const controller = this.notifyWorkerClosed;
36
+
37
+ return new Promise((resolve, reject) => {
38
+ if (controller.signal.aborted) {
39
+ reject(new Error('Called operation on closed remote'));
40
+ }
41
+
42
+ function handleAbort() {
43
+ reject(new Error('Remote peer closed with request in flight'));
44
+ }
45
+
46
+ function completePromise(action: () => void) {
47
+ controller!.signal.removeEventListener('abort', handleAbort);
48
+ action();
49
+ }
50
+
51
+ controller.signal.addEventListener('abort', handleAbort);
52
+
53
+ inner()
54
+ .then((data) => completePromise(() => resolve(data)))
55
+ .catch((e) => {
56
+ if (e instanceof Error && e.stack) {
57
+ e.stack += (trace as any).stack;
58
+ }
59
+
60
+ return completePromise(() => reject(e));
61
+ });
62
+ });
63
+ }
64
+
65
+ executeBatch(query: string, params: any[][] = []): Promise<QueryResult> {
66
+ return this.withRemote(async () => {
67
+ const result = await this.database.executeBatch(query, params ?? []);
68
+ return RemoteConnection.wrapQueryResult(result);
69
+ });
70
+ }
71
+
72
+ execute(query: string, params?: any[] | undefined): Promise<QueryResult> {
73
+ return this.withRemote(async () => {
74
+ const result = await this.database.execute(query, params ?? []);
75
+ return RemoteConnection.wrapQueryResult(result);
76
+ });
77
+ }
78
+
79
+ executeRaw(query: string, params?: any[] | undefined): Promise<any[][]> {
80
+ return this.withRemote(async () => {
81
+ return await this.database.executeRaw(query, params ?? []);
82
+ });
83
+ }
84
+
85
+ async getAll<T>(sql: string, parameters?: any[]): Promise<T[]> {
86
+ const res = await this.execute(sql, parameters);
87
+ return res.rows?._array ?? [];
88
+ }
89
+
90
+ async getOptional<T>(sql: string, parameters?: any[]): Promise<T | null> {
91
+ const res = await this.execute(sql, parameters);
92
+ return res.rows?.item(0) ?? null;
93
+ }
94
+
95
+ async get<T>(sql: string, parameters?: any[]): Promise<T> {
96
+ const res = await this.execute(sql, parameters);
97
+ const first = res.rows?.item(0);
98
+ if (!first) {
99
+ throw new Error('Result set is empty');
100
+ }
101
+ return first;
102
+ }
103
+
104
+ async refreshSchema() {
105
+ await this.execute("pragma table_info('sqlite_master')");
106
+ }
107
+
108
+ async close() {
109
+ await this.database.close();
110
+ this.database[releaseProxy]();
111
+ this.comlink[releaseProxy]();
112
+ await this.worker.terminate();
113
+ }
114
+
115
+ static wrapQueryResult(result: ProxiedQueryResult): QueryResult {
116
+ let rows: QueryResult['rows'] | undefined = undefined;
117
+ if (result.rows) {
118
+ rows = {
119
+ ...result.rows,
120
+ item: (idx) => result.rows?._array[idx]
121
+ } satisfies QueryResult['rows'];
122
+ }
123
+
124
+ return {
125
+ ...result,
126
+ rows
127
+ };
128
+ }
129
+ }