@powersync/node 0.18.2 → 0.18.3

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/dist/bundle.cjs CHANGED
@@ -8,7 +8,6 @@ var Comlink = require('comlink');
8
8
  var fs = require('node:fs/promises');
9
9
  var path = require('node:path');
10
10
  var node_worker_threads = require('node:worker_threads');
11
- var node_async_hooks = require('node:async_hooks');
12
11
  var fs$1 = require('fs');
13
12
  var path$1 = require('path');
14
13
 
@@ -150,7 +149,6 @@ class NodeStreamingSyncImplementation extends common.AbstractStreamingSyncImplem
150
149
  * A PowerSync database connection implemented with RPC calls to a background worker.
151
150
  */
152
151
  class BaseRemoteConnection {
153
- isBusy = false;
154
152
  worker;
155
153
  comlink;
156
154
  database;
@@ -246,10 +244,8 @@ const defaultDatabaseImplementation = {
246
244
  class WorkerConnectionPool extends common.BaseObserver {
247
245
  options;
248
246
  name;
249
- readConnections;
250
247
  writeConnection;
251
- readQueue = [];
252
- writeQueue = [];
248
+ readConnections;
253
249
  constructor(options) {
254
250
  super();
255
251
  if (options.readWorkerCount != null && options.readWorkerCount < 1) {
@@ -331,94 +327,67 @@ class WorkerConnectionPool extends common.BaseObserver {
331
327
  return connection;
332
328
  };
333
329
  // Open the writer first to avoid multiple threads enabling WAL concurrently (causing "database is locked" errors).
334
- this.writeConnection = await openWorker(true);
330
+ this.writeConnection = new common.Semaphore([await openWorker(true)]);
335
331
  const createWorkers = [];
336
332
  const amountOfReaders = this.options.readWorkerCount ?? READ_CONNECTIONS;
337
333
  for (let i = 0; i < amountOfReaders; i++) {
338
334
  createWorkers.push(openWorker(false));
339
335
  }
340
- this.readConnections = await Promise.all(createWorkers);
336
+ this.readConnections = new common.Semaphore(await Promise.all(createWorkers));
341
337
  }
342
338
  async close() {
343
- await this.writeConnection.close();
344
- for (const connection of this.readConnections) {
345
- await connection.close();
339
+ const { item: writeConnection, release: returnWrite } = await this.writeConnection.requestOne();
340
+ const { items: readers, release: returnReaders } = await this.readConnections.requestAll();
341
+ try {
342
+ await writeConnection.close();
343
+ await Promise.all(readers.map((r) => r.close()));
344
+ }
345
+ finally {
346
+ returnWrite();
347
+ returnReaders();
346
348
  }
347
349
  }
348
- readLock(fn, _options) {
349
- let resolveConnectionPromise;
350
- const connectionPromise = new Promise((resolve, _reject) => {
351
- resolveConnectionPromise = node_async_hooks.AsyncResource.bind(resolve);
352
- });
353
- const connection = this.readConnections.find((connection) => !connection.isBusy);
354
- if (connection) {
355
- connection.isBusy = true;
356
- resolveConnectionPromise(connection);
350
+ async readLock(fn, options) {
351
+ const lease = await this.readConnections.requestOne(common.timeoutSignal(options?.timeoutMs));
352
+ try {
353
+ return await fn(lease.item);
357
354
  }
358
- else {
359
- this.readQueue.push(resolveConnectionPromise);
355
+ finally {
356
+ lease.release();
360
357
  }
361
- return (async () => {
362
- const connection = await connectionPromise;
358
+ }
359
+ async writeLock(fn, options) {
360
+ const { item, release } = await this.writeConnection.requestOne(common.timeoutSignal(options?.timeoutMs));
361
+ try {
363
362
  try {
364
- return await fn(connection);
363
+ return await fn(item);
365
364
  }
366
365
  finally {
367
- const next = this.readQueue.shift();
368
- if (next) {
369
- next(connection);
370
- }
371
- else {
372
- connection.isBusy = false;
366
+ const serializedUpdates = await item.executeRaw("SELECT powersync_update_hooks('get');", []);
367
+ const updates = JSON.parse(serializedUpdates[0][0]);
368
+ if (updates.length > 0) {
369
+ const event = {
370
+ tables: updates,
371
+ groupedUpdates: {},
372
+ rawUpdates: []
373
+ };
374
+ this.iterateListeners((cb) => cb.tablesUpdated?.(event));
373
375
  }
374
376
  }
375
- })();
376
- }
377
- writeLock(fn, _options) {
378
- let resolveLockPromise;
379
- const lockPromise = new Promise((resolve, _reject) => {
380
- resolveLockPromise = node_async_hooks.AsyncResource.bind(resolve);
381
- });
382
- if (!this.writeConnection.isBusy) {
383
- this.writeConnection.isBusy = true;
384
- resolveLockPromise();
385
377
  }
386
- else {
387
- this.writeQueue.push(resolveLockPromise);
378
+ finally {
379
+ release();
388
380
  }
389
- return (async () => {
390
- await lockPromise;
391
- try {
392
- try {
393
- return await fn(this.writeConnection);
394
- }
395
- finally {
396
- const serializedUpdates = await this.writeConnection.executeRaw("SELECT powersync_update_hooks('get');", []);
397
- const updates = JSON.parse(serializedUpdates[0][0]);
398
- if (updates.length > 0) {
399
- const event = {
400
- tables: updates,
401
- groupedUpdates: {},
402
- rawUpdates: []
403
- };
404
- this.iterateListeners((cb) => cb.tablesUpdated?.(event));
405
- }
406
- }
407
- }
408
- finally {
409
- const next = this.writeQueue.shift();
410
- if (next) {
411
- next();
412
- }
413
- else {
414
- this.writeConnection.isBusy = false;
415
- }
416
- }
417
- })();
418
381
  }
419
382
  async refreshSchema() {
420
- await this.writeConnection.refreshSchema();
421
- await Promise.all(this.readConnections.map((c) => c.refreshSchema()));
383
+ await this.writeLock((l) => l.refreshSchema());
384
+ const { items, release } = await this.readConnections.requestAll();
385
+ try {
386
+ await Promise.all(items.map((c) => c.refreshSchema()));
387
+ }
388
+ finally {
389
+ release();
390
+ }
422
391
  }
423
392
  }
424
393
  class WorkerPoolDatabaseAdapter extends common.DBAdapterDefaultMixin(WorkerConnectionPool) {
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.cjs","sources":["../lib/sync/stream/NodeRemote.js","../lib/sync/stream/NodeStreamingSyncImplementation.js","../lib/db/RemoteConnection.js","../lib/db/WorkerConnectionPool.js","../lib/db/PowerSyncDatabase.js","../lib/attachments/NodeFileSystemAdapter.js"],"sourcesContent":["import * as os from 'node:os';\nimport { AbstractRemote, DEFAULT_REMOTE_LOGGER, FetchImplementationProvider } from '@powersync/common';\nimport { BSON } from 'bson';\nimport { EnvHttpProxyAgent, getGlobalDispatcher, ProxyAgent, WebSocket as UndiciWebSocket } from 'undici';\nexport const STREAMING_POST_TIMEOUT_MS = 30_000;\nclass NodeFetchProvider extends FetchImplementationProvider {\n getFetch() {\n return fetch.bind(globalThis);\n }\n}\nexport class NodeRemote extends AbstractRemote {\n connector;\n logger;\n wsDispatcher;\n constructor(connector, logger = DEFAULT_REMOTE_LOGGER, options) {\n const fetchDispatcher = options?.dispatcher ?? defaultFetchDispatcher();\n super(connector, logger, {\n fetchImplementation: options?.fetchImplementation ?? new NodeFetchProvider(),\n fetchOptions: {\n dispatcher: fetchDispatcher\n },\n ...(options ?? {})\n });\n this.connector = connector;\n this.logger = logger;\n this.wsDispatcher = options?.dispatcher;\n }\n createSocket(url) {\n // Create dedicated dispatcher for this WebSocket\n const baseDispatcher = this.getWebsocketDispatcher(url);\n // Create WebSocket with dedicated dispatcher\n const ws = new UndiciWebSocket(url, {\n dispatcher: baseDispatcher,\n headers: {\n 'User-Agent': this.getUserAgent()\n }\n });\n return ws;\n }\n getWebsocketDispatcher(url) {\n if (this.wsDispatcher != null) {\n return this.wsDispatcher;\n }\n const protocol = new URL(url).protocol.replace(':', '');\n const proxy = getProxyForProtocol(protocol);\n if (proxy != null) {\n return new ProxyAgent(proxy);\n }\n else {\n return getGlobalDispatcher();\n }\n }\n getUserAgent() {\n return [\n super.getUserAgent(),\n `powersync-node`,\n `node/${process.versions.node}`,\n `${os.platform()}/${os.release()}`\n ].join(' ');\n }\n async getBSON() {\n return BSON;\n }\n}\nfunction defaultFetchDispatcher() {\n // EnvHttpProxyAgent automatically uses HTTP_PROXY, HTTPS_PROXY and NO_PROXY env vars by default.\n // We add ALL_PROXY support.\n return new EnvHttpProxyAgent({\n httpProxy: getProxyForProtocol('http'),\n httpsProxy: getProxyForProtocol('https')\n });\n}\nfunction getProxyForProtocol(protocol) {\n return (process.env[`${protocol.toLowerCase()}_proxy`] ??\n process.env[`${protocol.toUpperCase()}_PROXY`] ??\n process.env[`all_proxy`] ??\n process.env[`ALL_PROXY`]);\n}\n//# sourceMappingURL=NodeRemote.js.map","import { AbstractStreamingSyncImplementation, LockType, Mutex } from '@powersync/common';\n/**\n * Global locks which prevent multiple instances from syncing\n * concurrently.\n */\nconst LOCKS = new Map();\nexport class NodeStreamingSyncImplementation extends AbstractStreamingSyncImplementation {\n locks;\n constructor(options) {\n super(options);\n this.initLocks();\n }\n /**\n * Configures global locks on sync process\n */\n initLocks() {\n const { identifier } = this.options;\n if (identifier && LOCKS.has(identifier)) {\n this.locks = LOCKS.get(identifier);\n return;\n }\n this.locks = new Map();\n this.locks.set(LockType.CRUD, new Mutex());\n this.locks.set(LockType.SYNC, new Mutex());\n if (identifier) {\n LOCKS.set(identifier, this.locks);\n }\n }\n obtainLock(lockOptions) {\n const lock = this.locks.get(lockOptions.type);\n if (!lock) {\n throw new Error(`Lock type ${lockOptions.type} not found`);\n }\n return lock.runExclusive(async () => {\n return lockOptions.callback();\n }, lockOptions.signal);\n }\n}\n//# sourceMappingURL=NodeStreamingSyncImplementation.js.map","import { ConnectionClosedError, DBGetUtilsDefaultMixin } from '@powersync/common';\nimport { releaseProxy } from 'comlink';\n/**\n * A PowerSync database connection implemented with RPC calls to a background worker.\n */\nclass BaseRemoteConnection {\n isBusy = false;\n worker;\n comlink;\n database;\n notifyWorkerClosed = new AbortController();\n constructor(worker, comlink, database) {\n this.worker = worker;\n this.comlink = comlink;\n this.database = database;\n this.worker.once('exit', (_) => {\n this.notifyWorkerClosed.abort();\n });\n }\n /**\n * Runs the inner function, but appends the stack trace where this function was called. This is useful for workers\n * because stack traces from worker errors are otherwise unrelated to the application issue that has caused them.\n */\n withRemote(inner) {\n const trace = {};\n Error.captureStackTrace(trace);\n const controller = this.notifyWorkerClosed;\n return new Promise((resolve, reject) => {\n if (controller.signal.aborted) {\n reject(new ConnectionClosedError('Called operation on closed remote'));\n }\n function handleAbort() {\n reject(new ConnectionClosedError('Remote peer closed with request in flight'));\n }\n function completePromise(action) {\n controller.signal.removeEventListener('abort', handleAbort);\n action();\n }\n controller.signal.addEventListener('abort', handleAbort);\n inner()\n .then((data) => completePromise(() => resolve(data)))\n .catch((e) => {\n if (e instanceof Error && e.stack) {\n e.stack += trace.stack;\n }\n return completePromise(() => reject(e));\n });\n });\n }\n executeBatch(query, params = []) {\n return this.withRemote(async () => {\n const result = await this.database.executeBatch(query, params ?? []);\n return BaseRemoteConnection.wrapQueryResult(result);\n });\n }\n execute(query, params) {\n return this.withRemote(async () => {\n const result = await this.database.execute(query, params ?? []);\n return BaseRemoteConnection.wrapQueryResult(result);\n });\n }\n executeRaw(query, params) {\n return this.withRemote(async () => {\n return await this.database.executeRaw(query, params ?? []);\n });\n }\n async refreshSchema() {\n await this.execute(\"pragma table_info('sqlite_master')\");\n }\n async close() {\n await this.database.close();\n this.database[releaseProxy]();\n this.comlink[releaseProxy]();\n await this.worker.terminate();\n }\n static wrapQueryResult(result) {\n let rows = undefined;\n if (result.rows) {\n rows = {\n ...result.rows,\n item: (idx) => result.rows?._array[idx]\n };\n }\n return {\n ...result,\n rows\n };\n }\n}\nexport class RemoteConnection extends DBGetUtilsDefaultMixin(BaseRemoteConnection) {\n}\n//# sourceMappingURL=RemoteConnection.js.map","import * as Comlink from 'comlink';\nimport fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Worker } from 'node:worker_threads';\nimport { BaseObserver, DBAdapterDefaultMixin } from '@powersync/common';\nimport { AsyncResource } from 'node:async_hooks';\nimport { isBundledToCommonJs } from '../utils/modules.js';\nimport { RemoteConnection } from './RemoteConnection.js';\nconst READ_CONNECTIONS = 5;\nconst defaultDatabaseImplementation = {\n type: 'better-sqlite3'\n};\n/**\n * Adapter for better-sqlite3\n */\nexport class WorkerConnectionPool extends BaseObserver {\n options;\n name;\n readConnections;\n writeConnection;\n readQueue = [];\n writeQueue = [];\n constructor(options) {\n super();\n if (options.readWorkerCount != null && options.readWorkerCount < 1) {\n throw `Needs at least one worker for reads, got ${options.readWorkerCount}`;\n }\n this.options = options;\n this.name = options.dbFilename;\n }\n async initialize() {\n let dbFilePath = this.options.dbFilename;\n if (this.options.dbLocation !== undefined) {\n // Make sure the dbLocation exists, we get a TypeError from better-sqlite3 otherwise.\n let directoryExists = false;\n try {\n const stat = await fs.stat(this.options.dbLocation);\n directoryExists = stat.isDirectory();\n }\n catch (_) {\n // If we can't even stat, the directory won't be accessible to SQLite either.\n }\n if (!directoryExists) {\n throw new Error(`The dbLocation directory at \"${this.options.dbLocation}\" does not exist. Please create it before opening the PowerSync database!`);\n }\n dbFilePath = path.join(this.options.dbLocation, dbFilePath);\n }\n const openWorker = async (isWriter) => {\n const isCommonJsModule = isBundledToCommonJs;\n let worker;\n const workerName = isWriter ? `write ${dbFilePath}` : `read ${dbFilePath}`;\n const workerFactory = this.options.openWorker ?? ((...args) => new Worker(...args));\n if (isCommonJsModule) {\n worker = workerFactory(path.resolve(__dirname, 'DefaultWorker.cjs'), { name: workerName });\n }\n else {\n worker = workerFactory(new URL('./DefaultWorker.js', import.meta.url), { name: workerName });\n }\n const listeners = new WeakMap();\n const comlink = Comlink.wrap({\n postMessage: worker.postMessage.bind(worker),\n addEventListener: (type, listener) => {\n let resolved = 'handleEvent' in listener ? listener.handleEvent.bind(listener) : listener;\n // Comlink wants message events, but the message event on workers in Node returns the data only.\n if (type === 'message') {\n const original = resolved;\n resolved = (data) => {\n original({ data });\n };\n }\n listeners.set(listener, resolved);\n worker.addListener(type, resolved);\n },\n removeEventListener: (type, listener) => {\n const resolved = listeners.get(listener);\n if (!resolved) {\n return;\n }\n worker.removeListener(type, resolved);\n }\n });\n worker.once('error', (e) => {\n console.error('Unexpected PowerSync database worker error', e);\n });\n const database = (await comlink.open({\n path: dbFilePath,\n isWriter,\n implementation: this.options.implementation ?? defaultDatabaseImplementation\n }));\n if (isWriter) {\n await database.execute(\"SELECT powersync_update_hooks('install');\", []);\n }\n const connection = new RemoteConnection(worker, comlink, database);\n if (this.options.initializeConnection) {\n await this.options.initializeConnection(connection, isWriter);\n }\n if (!isWriter) {\n await connection.execute('pragma query_only = true');\n }\n else {\n // We only need to enable this on the writer connection.\n // We can get `database is locked` errors if we enable this on concurrently opening read connections.\n await connection.execute('pragma journal_mode = WAL');\n }\n return connection;\n };\n // Open the writer first to avoid multiple threads enabling WAL concurrently (causing \"database is locked\" errors).\n this.writeConnection = await openWorker(true);\n const createWorkers = [];\n const amountOfReaders = this.options.readWorkerCount ?? READ_CONNECTIONS;\n for (let i = 0; i < amountOfReaders; i++) {\n createWorkers.push(openWorker(false));\n }\n this.readConnections = await Promise.all(createWorkers);\n }\n async close() {\n await this.writeConnection.close();\n for (const connection of this.readConnections) {\n await connection.close();\n }\n }\n readLock(fn, _options) {\n let resolveConnectionPromise;\n const connectionPromise = new Promise((resolve, _reject) => {\n resolveConnectionPromise = AsyncResource.bind(resolve);\n });\n const connection = this.readConnections.find((connection) => !connection.isBusy);\n if (connection) {\n connection.isBusy = true;\n resolveConnectionPromise(connection);\n }\n else {\n this.readQueue.push(resolveConnectionPromise);\n }\n return (async () => {\n const connection = await connectionPromise;\n try {\n return await fn(connection);\n }\n finally {\n const next = this.readQueue.shift();\n if (next) {\n next(connection);\n }\n else {\n connection.isBusy = false;\n }\n }\n })();\n }\n writeLock(fn, _options) {\n let resolveLockPromise;\n const lockPromise = new Promise((resolve, _reject) => {\n resolveLockPromise = AsyncResource.bind(resolve);\n });\n if (!this.writeConnection.isBusy) {\n this.writeConnection.isBusy = true;\n resolveLockPromise();\n }\n else {\n this.writeQueue.push(resolveLockPromise);\n }\n return (async () => {\n await lockPromise;\n try {\n try {\n return await fn(this.writeConnection);\n }\n finally {\n const serializedUpdates = await this.writeConnection.executeRaw(\"SELECT powersync_update_hooks('get');\", []);\n const updates = JSON.parse(serializedUpdates[0][0]);\n if (updates.length > 0) {\n const event = {\n tables: updates,\n groupedUpdates: {},\n rawUpdates: []\n };\n this.iterateListeners((cb) => cb.tablesUpdated?.(event));\n }\n }\n }\n finally {\n const next = this.writeQueue.shift();\n if (next) {\n next();\n }\n else {\n this.writeConnection.isBusy = false;\n }\n }\n })();\n }\n async refreshSchema() {\n await this.writeConnection.refreshSchema();\n await Promise.all(this.readConnections.map((c) => c.refreshSchema()));\n }\n}\nexport class WorkerPoolDatabaseAdapter extends DBAdapterDefaultMixin(WorkerConnectionPool) {\n}\n//# sourceMappingURL=WorkerConnectionPool.js.map","import { AbstractPowerSyncDatabase, SqliteBucketStorage } from '@powersync/common';\nimport { NodeRemote } from '../sync/stream/NodeRemote.js';\nimport { NodeStreamingSyncImplementation } from '../sync/stream/NodeStreamingSyncImplementation.js';\nimport { WorkerPoolDatabaseAdapter } from './WorkerConnectionPool.js';\n/**\n * A PowerSync database which provides SQLite functionality\n * which is automatically synced.\n *\n * @example\n * ```typescript\n * export const db = new PowerSyncDatabase({\n * schema: AppSchema,\n * database: {\n * dbFilename: 'example.db'\n * }\n * });\n * ```\n */\nexport class PowerSyncDatabase extends AbstractPowerSyncDatabase {\n constructor(options) {\n super(options);\n }\n async _initialize() {\n if ('initialize' in this.database) {\n await this.database.initialize();\n }\n }\n /**\n * Opens a DBAdapter using better-sqlite3 as the default SQLite open factory.\n */\n openDBAdapter(options) {\n return new WorkerPoolDatabaseAdapter(options.database);\n }\n generateBucketStorageAdapter() {\n return new SqliteBucketStorage(this.database, this.logger);\n }\n connect(connector, options) {\n return super.connect(connector, options);\n }\n generateSyncStreamImplementation(connector, options) {\n const logger = this.logger;\n const remote = new NodeRemote(connector, logger, {\n dispatcher: options.dispatcher,\n ...this.options.remoteOptions\n });\n return new NodeStreamingSyncImplementation({\n adapter: this.bucketStorageAdapter,\n remote,\n uploadCrud: async () => {\n await this.waitForReady();\n await connector.uploadData(this);\n },\n ...options,\n identifier: this.database.name,\n logger\n });\n }\n}\n//# sourceMappingURL=PowerSyncDatabase.js.map","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { EncodingType } from '@powersync/common';\n/**\n * NodeFileSystemAdapter implements LocalStorageAdapter using Node.js filesystem.\n * Suitable for Node.js environments and Electron applications.\n */\nexport class NodeFileSystemAdapter {\n storageDirectory;\n constructor(storageDirectory = './user_data') {\n this.storageDirectory = storageDirectory;\n }\n async initialize() {\n const dir = path.resolve(this.storageDirectory);\n await fs.mkdir(dir, { recursive: true });\n }\n async clear() {\n const dir = path.resolve(this.storageDirectory);\n await fs.rmdir(dir, { recursive: true });\n }\n getLocalUri(filename) {\n return path.join(path.resolve(this.storageDirectory), filename);\n }\n async uploadFile(filePath, data, options) {\n const buffer = Buffer.from(data);\n await fs.writeFile(filePath, buffer, {\n encoding: options?.encoding\n });\n }\n async downloadFile(filePath) {\n const data = await fs.readFile(filePath);\n return new Blob([new Uint8Array(data)]);\n }\n async saveFile(filePath, data, options) {\n let buffer;\n if (typeof data === 'string') {\n buffer = Buffer.from(data, options?.encoding ?? EncodingType.Base64);\n }\n else {\n buffer = Buffer.from(data);\n }\n await fs.writeFile(filePath, buffer);\n return buffer.length;\n }\n async readFile(filePath, options) {\n const data = await fs.readFile(filePath);\n if (options?.encoding === EncodingType.Base64) {\n return Buffer.from(data.toString(), 'base64').buffer;\n }\n else {\n return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);\n }\n }\n async deleteFile(path, options) {\n await fs.unlink(path).catch((err) => {\n if (err.code !== 'ENOENT') {\n throw err;\n }\n });\n }\n async fileExists(filePath) {\n try {\n await fs.access(filePath);\n return true;\n }\n catch {\n return false;\n }\n }\n async makeDir(path) {\n await fs.mkdir(path, { recursive: true });\n }\n async rmDir(path) {\n await fs.rmdir(path, { recursive: true });\n }\n}\n//# sourceMappingURL=NodeFileSystemAdapter.js.map"],"names":["FetchImplementationProvider","AbstractRemote","DEFAULT_REMOTE_LOGGER","UndiciWebSocket","ProxyAgent","getGlobalDispatcher","os","BSON","EnvHttpProxyAgent","AbstractStreamingSyncImplementation","LockType","Mutex","ConnectionClosedError","releaseProxy","DBGetUtilsDefaultMixin","BaseObserver","path","Worker","Comlink","AsyncResource","DBAdapterDefaultMixin","AbstractPowerSyncDatabase","SqliteBucketStorage","fs","EncodingType"],"mappings":"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"}
1
+ {"version":3,"file":"bundle.cjs","sources":["../lib/sync/stream/NodeRemote.js","../lib/sync/stream/NodeStreamingSyncImplementation.js","../lib/db/RemoteConnection.js","../lib/db/WorkerConnectionPool.js","../lib/db/PowerSyncDatabase.js","../lib/attachments/NodeFileSystemAdapter.js"],"sourcesContent":["import * as os from 'node:os';\nimport { AbstractRemote, DEFAULT_REMOTE_LOGGER, FetchImplementationProvider } from '@powersync/common';\nimport { BSON } from 'bson';\nimport { EnvHttpProxyAgent, getGlobalDispatcher, ProxyAgent, WebSocket as UndiciWebSocket } from 'undici';\nexport const STREAMING_POST_TIMEOUT_MS = 30_000;\nclass NodeFetchProvider extends FetchImplementationProvider {\n getFetch() {\n return fetch.bind(globalThis);\n }\n}\nexport class NodeRemote extends AbstractRemote {\n connector;\n logger;\n wsDispatcher;\n constructor(connector, logger = DEFAULT_REMOTE_LOGGER, options) {\n const fetchDispatcher = options?.dispatcher ?? defaultFetchDispatcher();\n super(connector, logger, {\n fetchImplementation: options?.fetchImplementation ?? new NodeFetchProvider(),\n fetchOptions: {\n dispatcher: fetchDispatcher\n },\n ...(options ?? {})\n });\n this.connector = connector;\n this.logger = logger;\n this.wsDispatcher = options?.dispatcher;\n }\n createSocket(url) {\n // Create dedicated dispatcher for this WebSocket\n const baseDispatcher = this.getWebsocketDispatcher(url);\n // Create WebSocket with dedicated dispatcher\n const ws = new UndiciWebSocket(url, {\n dispatcher: baseDispatcher,\n headers: {\n 'User-Agent': this.getUserAgent()\n }\n });\n return ws;\n }\n getWebsocketDispatcher(url) {\n if (this.wsDispatcher != null) {\n return this.wsDispatcher;\n }\n const protocol = new URL(url).protocol.replace(':', '');\n const proxy = getProxyForProtocol(protocol);\n if (proxy != null) {\n return new ProxyAgent(proxy);\n }\n else {\n return getGlobalDispatcher();\n }\n }\n getUserAgent() {\n return [\n super.getUserAgent(),\n `powersync-node`,\n `node/${process.versions.node}`,\n `${os.platform()}/${os.release()}`\n ].join(' ');\n }\n async getBSON() {\n return BSON;\n }\n}\nfunction defaultFetchDispatcher() {\n // EnvHttpProxyAgent automatically uses HTTP_PROXY, HTTPS_PROXY and NO_PROXY env vars by default.\n // We add ALL_PROXY support.\n return new EnvHttpProxyAgent({\n httpProxy: getProxyForProtocol('http'),\n httpsProxy: getProxyForProtocol('https')\n });\n}\nfunction getProxyForProtocol(protocol) {\n return (process.env[`${protocol.toLowerCase()}_proxy`] ??\n process.env[`${protocol.toUpperCase()}_PROXY`] ??\n process.env[`all_proxy`] ??\n process.env[`ALL_PROXY`]);\n}\n//# sourceMappingURL=NodeRemote.js.map","import { AbstractStreamingSyncImplementation, LockType, Mutex } from '@powersync/common';\n/**\n * Global locks which prevent multiple instances from syncing\n * concurrently.\n */\nconst LOCKS = new Map();\nexport class NodeStreamingSyncImplementation extends AbstractStreamingSyncImplementation {\n locks;\n constructor(options) {\n super(options);\n this.initLocks();\n }\n /**\n * Configures global locks on sync process\n */\n initLocks() {\n const { identifier } = this.options;\n if (identifier && LOCKS.has(identifier)) {\n this.locks = LOCKS.get(identifier);\n return;\n }\n this.locks = new Map();\n this.locks.set(LockType.CRUD, new Mutex());\n this.locks.set(LockType.SYNC, new Mutex());\n if (identifier) {\n LOCKS.set(identifier, this.locks);\n }\n }\n obtainLock(lockOptions) {\n const lock = this.locks.get(lockOptions.type);\n if (!lock) {\n throw new Error(`Lock type ${lockOptions.type} not found`);\n }\n return lock.runExclusive(async () => {\n return lockOptions.callback();\n }, lockOptions.signal);\n }\n}\n//# sourceMappingURL=NodeStreamingSyncImplementation.js.map","import { ConnectionClosedError, DBGetUtilsDefaultMixin } from '@powersync/common';\nimport { releaseProxy } from 'comlink';\n/**\n * A PowerSync database connection implemented with RPC calls to a background worker.\n */\nclass BaseRemoteConnection {\n worker;\n comlink;\n database;\n notifyWorkerClosed = new AbortController();\n constructor(worker, comlink, database) {\n this.worker = worker;\n this.comlink = comlink;\n this.database = database;\n this.worker.once('exit', (_) => {\n this.notifyWorkerClosed.abort();\n });\n }\n /**\n * Runs the inner function, but appends the stack trace where this function was called. This is useful for workers\n * because stack traces from worker errors are otherwise unrelated to the application issue that has caused them.\n */\n withRemote(inner) {\n const trace = {};\n Error.captureStackTrace(trace);\n const controller = this.notifyWorkerClosed;\n return new Promise((resolve, reject) => {\n if (controller.signal.aborted) {\n reject(new ConnectionClosedError('Called operation on closed remote'));\n }\n function handleAbort() {\n reject(new ConnectionClosedError('Remote peer closed with request in flight'));\n }\n function completePromise(action) {\n controller.signal.removeEventListener('abort', handleAbort);\n action();\n }\n controller.signal.addEventListener('abort', handleAbort);\n inner()\n .then((data) => completePromise(() => resolve(data)))\n .catch((e) => {\n if (e instanceof Error && e.stack) {\n e.stack += trace.stack;\n }\n return completePromise(() => reject(e));\n });\n });\n }\n executeBatch(query, params = []) {\n return this.withRemote(async () => {\n const result = await this.database.executeBatch(query, params ?? []);\n return BaseRemoteConnection.wrapQueryResult(result);\n });\n }\n execute(query, params) {\n return this.withRemote(async () => {\n const result = await this.database.execute(query, params ?? []);\n return BaseRemoteConnection.wrapQueryResult(result);\n });\n }\n executeRaw(query, params) {\n return this.withRemote(async () => {\n return await this.database.executeRaw(query, params ?? []);\n });\n }\n async refreshSchema() {\n await this.execute(\"pragma table_info('sqlite_master')\");\n }\n async close() {\n await this.database.close();\n this.database[releaseProxy]();\n this.comlink[releaseProxy]();\n await this.worker.terminate();\n }\n static wrapQueryResult(result) {\n let rows = undefined;\n if (result.rows) {\n rows = {\n ...result.rows,\n item: (idx) => result.rows?._array[idx]\n };\n }\n return {\n ...result,\n rows\n };\n }\n}\nexport class RemoteConnection extends DBGetUtilsDefaultMixin(BaseRemoteConnection) {\n}\n//# sourceMappingURL=RemoteConnection.js.map","import * as Comlink from 'comlink';\nimport fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Worker } from 'node:worker_threads';\nimport { BaseObserver, DBAdapterDefaultMixin, Semaphore, timeoutSignal } from '@powersync/common';\nimport { isBundledToCommonJs } from '../utils/modules.js';\nimport { RemoteConnection } from './RemoteConnection.js';\nconst READ_CONNECTIONS = 5;\nconst defaultDatabaseImplementation = {\n type: 'better-sqlite3'\n};\n/**\n * Adapter for better-sqlite3\n */\nexport class WorkerConnectionPool extends BaseObserver {\n options;\n name;\n writeConnection;\n readConnections;\n constructor(options) {\n super();\n if (options.readWorkerCount != null && options.readWorkerCount < 1) {\n throw `Needs at least one worker for reads, got ${options.readWorkerCount}`;\n }\n this.options = options;\n this.name = options.dbFilename;\n }\n async initialize() {\n let dbFilePath = this.options.dbFilename;\n if (this.options.dbLocation !== undefined) {\n // Make sure the dbLocation exists, we get a TypeError from better-sqlite3 otherwise.\n let directoryExists = false;\n try {\n const stat = await fs.stat(this.options.dbLocation);\n directoryExists = stat.isDirectory();\n }\n catch (_) {\n // If we can't even stat, the directory won't be accessible to SQLite either.\n }\n if (!directoryExists) {\n throw new Error(`The dbLocation directory at \"${this.options.dbLocation}\" does not exist. Please create it before opening the PowerSync database!`);\n }\n dbFilePath = path.join(this.options.dbLocation, dbFilePath);\n }\n const openWorker = async (isWriter) => {\n const isCommonJsModule = isBundledToCommonJs;\n let worker;\n const workerName = isWriter ? `write ${dbFilePath}` : `read ${dbFilePath}`;\n const workerFactory = this.options.openWorker ?? ((...args) => new Worker(...args));\n if (isCommonJsModule) {\n worker = workerFactory(path.resolve(__dirname, 'DefaultWorker.cjs'), { name: workerName });\n }\n else {\n worker = workerFactory(new URL('./DefaultWorker.js', import.meta.url), { name: workerName });\n }\n const listeners = new WeakMap();\n const comlink = Comlink.wrap({\n postMessage: worker.postMessage.bind(worker),\n addEventListener: (type, listener) => {\n let resolved = 'handleEvent' in listener ? listener.handleEvent.bind(listener) : listener;\n // Comlink wants message events, but the message event on workers in Node returns the data only.\n if (type === 'message') {\n const original = resolved;\n resolved = (data) => {\n original({ data });\n };\n }\n listeners.set(listener, resolved);\n worker.addListener(type, resolved);\n },\n removeEventListener: (type, listener) => {\n const resolved = listeners.get(listener);\n if (!resolved) {\n return;\n }\n worker.removeListener(type, resolved);\n }\n });\n worker.once('error', (e) => {\n console.error('Unexpected PowerSync database worker error', e);\n });\n const database = (await comlink.open({\n path: dbFilePath,\n isWriter,\n implementation: this.options.implementation ?? defaultDatabaseImplementation\n }));\n if (isWriter) {\n await database.execute(\"SELECT powersync_update_hooks('install');\", []);\n }\n const connection = new RemoteConnection(worker, comlink, database);\n if (this.options.initializeConnection) {\n await this.options.initializeConnection(connection, isWriter);\n }\n if (!isWriter) {\n await connection.execute('pragma query_only = true');\n }\n else {\n // We only need to enable this on the writer connection.\n // We can get `database is locked` errors if we enable this on concurrently opening read connections.\n await connection.execute('pragma journal_mode = WAL');\n }\n return connection;\n };\n // Open the writer first to avoid multiple threads enabling WAL concurrently (causing \"database is locked\" errors).\n this.writeConnection = new Semaphore([await openWorker(true)]);\n const createWorkers = [];\n const amountOfReaders = this.options.readWorkerCount ?? READ_CONNECTIONS;\n for (let i = 0; i < amountOfReaders; i++) {\n createWorkers.push(openWorker(false));\n }\n this.readConnections = new Semaphore(await Promise.all(createWorkers));\n }\n async close() {\n const { item: writeConnection, release: returnWrite } = await this.writeConnection.requestOne();\n const { items: readers, release: returnReaders } = await this.readConnections.requestAll();\n try {\n await writeConnection.close();\n await Promise.all(readers.map((r) => r.close()));\n }\n finally {\n returnWrite();\n returnReaders();\n }\n }\n async readLock(fn, options) {\n const lease = await this.readConnections.requestOne(timeoutSignal(options?.timeoutMs));\n try {\n return await fn(lease.item);\n }\n finally {\n lease.release();\n }\n }\n async writeLock(fn, options) {\n const { item, release } = await this.writeConnection.requestOne(timeoutSignal(options?.timeoutMs));\n try {\n try {\n return await fn(item);\n }\n finally {\n const serializedUpdates = await item.executeRaw(\"SELECT powersync_update_hooks('get');\", []);\n const updates = JSON.parse(serializedUpdates[0][0]);\n if (updates.length > 0) {\n const event = {\n tables: updates,\n groupedUpdates: {},\n rawUpdates: []\n };\n this.iterateListeners((cb) => cb.tablesUpdated?.(event));\n }\n }\n }\n finally {\n release();\n }\n }\n async refreshSchema() {\n await this.writeLock((l) => l.refreshSchema());\n const { items, release } = await this.readConnections.requestAll();\n try {\n await Promise.all(items.map((c) => c.refreshSchema()));\n }\n finally {\n release();\n }\n }\n}\nexport class WorkerPoolDatabaseAdapter extends DBAdapterDefaultMixin(WorkerConnectionPool) {\n}\n//# sourceMappingURL=WorkerConnectionPool.js.map","import { AbstractPowerSyncDatabase, SqliteBucketStorage } from '@powersync/common';\nimport { NodeRemote } from '../sync/stream/NodeRemote.js';\nimport { NodeStreamingSyncImplementation } from '../sync/stream/NodeStreamingSyncImplementation.js';\nimport { WorkerPoolDatabaseAdapter } from './WorkerConnectionPool.js';\n/**\n * A PowerSync database which provides SQLite functionality\n * which is automatically synced.\n *\n * @example\n * ```typescript\n * export const db = new PowerSyncDatabase({\n * schema: AppSchema,\n * database: {\n * dbFilename: 'example.db'\n * }\n * });\n * ```\n */\nexport class PowerSyncDatabase extends AbstractPowerSyncDatabase {\n constructor(options) {\n super(options);\n }\n async _initialize() {\n if ('initialize' in this.database) {\n await this.database.initialize();\n }\n }\n /**\n * Opens a DBAdapter using better-sqlite3 as the default SQLite open factory.\n */\n openDBAdapter(options) {\n return new WorkerPoolDatabaseAdapter(options.database);\n }\n generateBucketStorageAdapter() {\n return new SqliteBucketStorage(this.database, this.logger);\n }\n connect(connector, options) {\n return super.connect(connector, options);\n }\n generateSyncStreamImplementation(connector, options) {\n const logger = this.logger;\n const remote = new NodeRemote(connector, logger, {\n dispatcher: options.dispatcher,\n ...this.options.remoteOptions\n });\n return new NodeStreamingSyncImplementation({\n adapter: this.bucketStorageAdapter,\n remote,\n uploadCrud: async () => {\n await this.waitForReady();\n await connector.uploadData(this);\n },\n ...options,\n identifier: this.database.name,\n logger\n });\n }\n}\n//# sourceMappingURL=PowerSyncDatabase.js.map","import { promises as fs } from 'fs';\nimport * as path from 'path';\nimport { EncodingType } from '@powersync/common';\n/**\n * NodeFileSystemAdapter implements LocalStorageAdapter using Node.js filesystem.\n * Suitable for Node.js environments and Electron applications.\n */\nexport class NodeFileSystemAdapter {\n storageDirectory;\n constructor(storageDirectory = './user_data') {\n this.storageDirectory = storageDirectory;\n }\n async initialize() {\n const dir = path.resolve(this.storageDirectory);\n await fs.mkdir(dir, { recursive: true });\n }\n async clear() {\n const dir = path.resolve(this.storageDirectory);\n await fs.rmdir(dir, { recursive: true });\n }\n getLocalUri(filename) {\n return path.join(path.resolve(this.storageDirectory), filename);\n }\n async uploadFile(filePath, data, options) {\n const buffer = Buffer.from(data);\n await fs.writeFile(filePath, buffer, {\n encoding: options?.encoding\n });\n }\n async downloadFile(filePath) {\n const data = await fs.readFile(filePath);\n return new Blob([new Uint8Array(data)]);\n }\n async saveFile(filePath, data, options) {\n let buffer;\n if (typeof data === 'string') {\n buffer = Buffer.from(data, options?.encoding ?? EncodingType.Base64);\n }\n else {\n buffer = Buffer.from(data);\n }\n await fs.writeFile(filePath, buffer);\n return buffer.length;\n }\n async readFile(filePath, options) {\n const data = await fs.readFile(filePath);\n if (options?.encoding === EncodingType.Base64) {\n return Buffer.from(data.toString(), 'base64').buffer;\n }\n else {\n return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);\n }\n }\n async deleteFile(path, options) {\n await fs.unlink(path).catch((err) => {\n if (err.code !== 'ENOENT') {\n throw err;\n }\n });\n }\n async fileExists(filePath) {\n try {\n await fs.access(filePath);\n return true;\n }\n catch {\n return false;\n }\n }\n async makeDir(path) {\n await fs.mkdir(path, { recursive: true });\n }\n async rmDir(path) {\n await fs.rmdir(path, { recursive: true });\n }\n}\n//# sourceMappingURL=NodeFileSystemAdapter.js.map"],"names":["FetchImplementationProvider","AbstractRemote","DEFAULT_REMOTE_LOGGER","UndiciWebSocket","ProxyAgent","getGlobalDispatcher","os","BSON","EnvHttpProxyAgent","AbstractStreamingSyncImplementation","LockType","Mutex","ConnectionClosedError","releaseProxy","DBGetUtilsDefaultMixin","BaseObserver","path","Worker","Comlink","Semaphore","timeoutSignal","DBAdapterDefaultMixin","AbstractPowerSyncDatabase","SqliteBucketStorage","fs","EncodingType"],"mappings":"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"}
@@ -6,7 +6,6 @@ import { AsyncDatabase, AsyncDatabaseOpener, ProxiedQueryResult } from './AsyncD
6
6
  * A PowerSync database connection implemented with RPC calls to a background worker.
7
7
  */
8
8
  declare class BaseRemoteConnection implements SqlExecutor {
9
- isBusy: boolean;
10
9
  private readonly worker;
11
10
  private readonly comlink;
12
11
  private readonly database;
@@ -4,7 +4,6 @@ import { releaseProxy } from 'comlink';
4
4
  * A PowerSync database connection implemented with RPC calls to a background worker.
5
5
  */
6
6
  class BaseRemoteConnection {
7
- isBusy = false;
8
7
  worker;
9
8
  comlink;
10
9
  database;
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteConnection.js","sourceRoot":"","sources":["../../src/db/RemoteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EAIvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAU,MAAM,SAAS,CAAC;AAI/C;;GAEG;AACH,MAAM,oBAAoB;IACxB,MAAM,GAAG,KAAK,CAAC;IAEE,MAAM,CAAS;IACf,OAAO,CAA8B;IACrC,QAAQ,CAAwB;IAEhC,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAC;IAE5D,YAAY,MAAc,EAAE,OAAoC,EAAE,QAA+B;QAC/F,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YAC7B,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,UAAU,CAAI,KAAuB;QAC3C,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAE3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,qBAAqB,CAAC,mCAAmC,CAAC,CAAC,CAAC;YACzE,CAAC;YAED,SAAS,WAAW;gBAClB,MAAM,CAAC,IAAI,qBAAqB,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACjF,CAAC;YAED,SAAS,eAAe,CAAC,MAAkB;gBACzC,UAAW,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBAC7D,MAAM,EAAE,CAAC;YACX,CAAC;YAED,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAEzD,KAAK,EAAE;iBACJ,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;iBACpD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACX,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBAClC,CAAC,CAAC,KAAK,IAAK,KAAa,CAAC,KAAK,CAAC;gBAClC,CAAC;gBAED,OAAO,eAAe,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,KAAa,EAAE,SAAkB,EAAE;QAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;YACrE,OAAO,oBAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,MAA0B;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;YAChE,OAAO,oBAAoB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,MAA0B;QAClD,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YAChC,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,MAA0B;QAC/C,IAAI,IAAI,GAAoC,SAAS,CAAC;QACtD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,GAAG;gBACL,GAAG,MAAM,CAAC,IAAI;gBACd,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC;aACV,CAAC;QAClC,CAAC;QAED,OAAO;YACL,GAAG,MAAM;YACT,IAAI;SACL,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,sBAAsB,CAAC,oBAAoB,CAAC;CAA0B"}
1
+ {"version":3,"file":"RemoteConnection.js","sourceRoot":"","sources":["../../src/db/RemoteConnection.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { BaseObserver, ConnectionPool, DBAdapterListener, DBLockOptions, LockContext, QueryResult, Transaction } from '@powersync/common';
2
+ import { RemoteConnection } from './RemoteConnection.js';
2
3
  import { NodeSQLOpenOptions } from './options.js';
3
4
  export type BetterSQLite3LockContext = LockContext & {
4
5
  executeBatch(query: string, params?: any[][]): Promise<QueryResult>;
@@ -10,15 +11,13 @@ export type BetterSQLite3Transaction = Transaction & BetterSQLite3LockContext;
10
11
  export declare class WorkerConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
11
12
  private readonly options;
12
13
  readonly name: string;
13
- private readConnections;
14
14
  private writeConnection;
15
- private readonly readQueue;
16
- private readonly writeQueue;
15
+ private readConnections;
17
16
  constructor(options: NodeSQLOpenOptions);
18
17
  initialize(): Promise<void>;
19
18
  close(): Promise<void>;
20
- readLock<T>(fn: (tx: BetterSQLite3LockContext) => Promise<T>, _options?: DBLockOptions | undefined): Promise<T>;
21
- writeLock<T>(fn: (tx: BetterSQLite3LockContext) => Promise<T>, _options?: DBLockOptions | undefined): Promise<T>;
19
+ readLock<T>(fn: (tx: RemoteConnection) => Promise<T>, options?: DBLockOptions | undefined): Promise<T>;
20
+ writeLock<T>(fn: (tx: RemoteConnection) => Promise<T>, options?: DBLockOptions | undefined): Promise<T>;
22
21
  refreshSchema(): Promise<void>;
23
22
  }
24
23
  declare const WorkerPoolDatabaseAdapter_base: (new (...args: any[]) => {
@@ -2,8 +2,7 @@ import * as Comlink from 'comlink';
2
2
  import fs from 'node:fs/promises';
3
3
  import * as path from 'node:path';
4
4
  import { Worker } from 'node:worker_threads';
5
- import { BaseObserver, DBAdapterDefaultMixin } from '@powersync/common';
6
- import { AsyncResource } from 'node:async_hooks';
5
+ import { BaseObserver, DBAdapterDefaultMixin, Semaphore, timeoutSignal } from '@powersync/common';
7
6
  import { isBundledToCommonJs } from '../utils/modules.js';
8
7
  import { RemoteConnection } from './RemoteConnection.js';
9
8
  const READ_CONNECTIONS = 5;
@@ -16,10 +15,8 @@ const defaultDatabaseImplementation = {
16
15
  export class WorkerConnectionPool extends BaseObserver {
17
16
  options;
18
17
  name;
19
- readConnections;
20
18
  writeConnection;
21
- readQueue = [];
22
- writeQueue = [];
19
+ readConnections;
23
20
  constructor(options) {
24
21
  super();
25
22
  if (options.readWorkerCount != null && options.readWorkerCount < 1) {
@@ -105,94 +102,67 @@ export class WorkerConnectionPool extends BaseObserver {
105
102
  return connection;
106
103
  };
107
104
  // Open the writer first to avoid multiple threads enabling WAL concurrently (causing "database is locked" errors).
108
- this.writeConnection = await openWorker(true);
105
+ this.writeConnection = new Semaphore([await openWorker(true)]);
109
106
  const createWorkers = [];
110
107
  const amountOfReaders = this.options.readWorkerCount ?? READ_CONNECTIONS;
111
108
  for (let i = 0; i < amountOfReaders; i++) {
112
109
  createWorkers.push(openWorker(false));
113
110
  }
114
- this.readConnections = await Promise.all(createWorkers);
111
+ this.readConnections = new Semaphore(await Promise.all(createWorkers));
115
112
  }
116
113
  async close() {
117
- await this.writeConnection.close();
118
- for (const connection of this.readConnections) {
119
- await connection.close();
114
+ const { item: writeConnection, release: returnWrite } = await this.writeConnection.requestOne();
115
+ const { items: readers, release: returnReaders } = await this.readConnections.requestAll();
116
+ try {
117
+ await writeConnection.close();
118
+ await Promise.all(readers.map((r) => r.close()));
119
+ }
120
+ finally {
121
+ returnWrite();
122
+ returnReaders();
120
123
  }
121
124
  }
122
- readLock(fn, _options) {
123
- let resolveConnectionPromise;
124
- const connectionPromise = new Promise((resolve, _reject) => {
125
- resolveConnectionPromise = AsyncResource.bind(resolve);
126
- });
127
- const connection = this.readConnections.find((connection) => !connection.isBusy);
128
- if (connection) {
129
- connection.isBusy = true;
130
- resolveConnectionPromise(connection);
125
+ async readLock(fn, options) {
126
+ const lease = await this.readConnections.requestOne(timeoutSignal(options?.timeoutMs));
127
+ try {
128
+ return await fn(lease.item);
131
129
  }
132
- else {
133
- this.readQueue.push(resolveConnectionPromise);
130
+ finally {
131
+ lease.release();
134
132
  }
135
- return (async () => {
136
- const connection = await connectionPromise;
133
+ }
134
+ async writeLock(fn, options) {
135
+ const { item, release } = await this.writeConnection.requestOne(timeoutSignal(options?.timeoutMs));
136
+ try {
137
137
  try {
138
- return await fn(connection);
138
+ return await fn(item);
139
139
  }
140
140
  finally {
141
- const next = this.readQueue.shift();
142
- if (next) {
143
- next(connection);
144
- }
145
- else {
146
- connection.isBusy = false;
141
+ const serializedUpdates = await item.executeRaw("SELECT powersync_update_hooks('get');", []);
142
+ const updates = JSON.parse(serializedUpdates[0][0]);
143
+ if (updates.length > 0) {
144
+ const event = {
145
+ tables: updates,
146
+ groupedUpdates: {},
147
+ rawUpdates: []
148
+ };
149
+ this.iterateListeners((cb) => cb.tablesUpdated?.(event));
147
150
  }
148
151
  }
149
- })();
150
- }
151
- writeLock(fn, _options) {
152
- let resolveLockPromise;
153
- const lockPromise = new Promise((resolve, _reject) => {
154
- resolveLockPromise = AsyncResource.bind(resolve);
155
- });
156
- if (!this.writeConnection.isBusy) {
157
- this.writeConnection.isBusy = true;
158
- resolveLockPromise();
159
152
  }
160
- else {
161
- this.writeQueue.push(resolveLockPromise);
153
+ finally {
154
+ release();
162
155
  }
163
- return (async () => {
164
- await lockPromise;
165
- try {
166
- try {
167
- return await fn(this.writeConnection);
168
- }
169
- finally {
170
- const serializedUpdates = await this.writeConnection.executeRaw("SELECT powersync_update_hooks('get');", []);
171
- const updates = JSON.parse(serializedUpdates[0][0]);
172
- if (updates.length > 0) {
173
- const event = {
174
- tables: updates,
175
- groupedUpdates: {},
176
- rawUpdates: []
177
- };
178
- this.iterateListeners((cb) => cb.tablesUpdated?.(event));
179
- }
180
- }
181
- }
182
- finally {
183
- const next = this.writeQueue.shift();
184
- if (next) {
185
- next();
186
- }
187
- else {
188
- this.writeConnection.isBusy = false;
189
- }
190
- }
191
- })();
192
156
  }
193
157
  async refreshSchema() {
194
- await this.writeConnection.refreshSchema();
195
- await Promise.all(this.readConnections.map((c) => c.refreshSchema()));
158
+ await this.writeLock((l) => l.refreshSchema());
159
+ const { items, release } = await this.readConnections.requestAll();
160
+ try {
161
+ await Promise.all(items.map((c) => c.refreshSchema()));
162
+ }
163
+ finally {
164
+ release();
165
+ }
196
166
  }
197
167
  }
198
168
  export class WorkerPoolDatabaseAdapter extends DBAdapterDefaultMixin(WorkerConnectionPool) {
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerConnectionPool.js","sourceRoot":"","sources":["../../src/db/WorkerConnectionPool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkerConnectionPool.js","sourceRoot":"","sources":["../../src/db/WorkerConnectionPool.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powersync/node",
3
- "version": "0.18.2",
3
+ "version": "0.18.3",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -48,7 +48,7 @@
48
48
  },
49
49
  "homepage": "https://docs.powersync.com/",
50
50
  "peerDependencies": {
51
- "@powersync/common": "^1.50.0",
51
+ "@powersync/common": "^1.51.0",
52
52
  "better-sqlite3": "12.x"
53
53
  },
54
54
  "peerDependenciesMeta": {
@@ -60,7 +60,7 @@
60
60
  "bson": "^6.10.4",
61
61
  "comlink": "^4.4.2",
62
62
  "undici": "^7.11.0",
63
- "@powersync/common": "1.50.0"
63
+ "@powersync/common": "1.51.0"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@types/node": "^24.0.0",
@@ -13,8 +13,6 @@ import { AsyncDatabase, AsyncDatabaseOpener, ProxiedQueryResult } from './AsyncD
13
13
  * A PowerSync database connection implemented with RPC calls to a background worker.
14
14
  */
15
15
  class BaseRemoteConnection implements SqlExecutor {
16
- isBusy = false;
17
-
18
16
  private readonly worker: Worker;
19
17
  private readonly comlink: Remote<AsyncDatabaseOpener>;
20
18
  private readonly database: Remote<AsyncDatabase>;
@@ -12,10 +12,11 @@ import {
12
12
  DBLockOptions,
13
13
  LockContext,
14
14
  QueryResult,
15
+ Semaphore,
16
+ timeoutSignal,
15
17
  Transaction
16
18
  } from '@powersync/common';
17
19
  import { Remote } from 'comlink';
18
- import { AsyncResource } from 'node:async_hooks';
19
20
  import { isBundledToCommonJs } from '../utils/modules.js';
20
21
  import { AsyncDatabase, AsyncDatabaseOpener } from './AsyncDatabase.js';
21
22
  import { RemoteConnection } from './RemoteConnection.js';
@@ -40,11 +41,8 @@ export class WorkerConnectionPool extends BaseObserver<DBAdapterListener> implem
40
41
  private readonly options: NodeSQLOpenOptions;
41
42
  public readonly name: string;
42
43
 
43
- private readConnections: RemoteConnection[];
44
- private writeConnection: RemoteConnection;
45
-
46
- private readonly readQueue: Array<(connection: RemoteConnection) => void> = [];
47
- private readonly writeQueue: Array<() => void> = [];
44
+ private writeConnection: Semaphore<RemoteConnection>;
45
+ private readConnections: Semaphore<RemoteConnection>;
48
46
 
49
47
  constructor(options: NodeSQLOpenOptions) {
50
48
  super();
@@ -148,99 +146,70 @@ export class WorkerConnectionPool extends BaseObserver<DBAdapterListener> implem
148
146
  };
149
147
 
150
148
  // Open the writer first to avoid multiple threads enabling WAL concurrently (causing "database is locked" errors).
151
- this.writeConnection = await openWorker(true);
149
+ this.writeConnection = new Semaphore([await openWorker(true)]);
152
150
  const createWorkers: Promise<RemoteConnection>[] = [];
153
151
  const amountOfReaders = this.options.readWorkerCount ?? READ_CONNECTIONS;
154
152
  for (let i = 0; i < amountOfReaders; i++) {
155
153
  createWorkers.push(openWorker(false));
156
154
  }
157
- this.readConnections = await Promise.all(createWorkers);
155
+ this.readConnections = new Semaphore(await Promise.all(createWorkers));
158
156
  }
159
157
 
160
158
  async close() {
161
- await this.writeConnection.close();
162
- for (const connection of this.readConnections) {
163
- await connection.close();
159
+ const { item: writeConnection, release: returnWrite } = await this.writeConnection.requestOne();
160
+ const { items: readers, release: returnReaders } = await this.readConnections.requestAll();
161
+
162
+ try {
163
+ await writeConnection.close();
164
+ await Promise.all(readers.map((r) => r.close()));
165
+ } finally {
166
+ returnWrite();
167
+ returnReaders();
164
168
  }
165
169
  }
166
170
 
167
- readLock<T>(fn: (tx: BetterSQLite3LockContext) => Promise<T>, _options?: DBLockOptions | undefined): Promise<T> {
168
- let resolveConnectionPromise!: (connection: RemoteConnection) => void;
169
- const connectionPromise = new Promise<RemoteConnection>((resolve, _reject) => {
170
- resolveConnectionPromise = AsyncResource.bind(resolve);
171
- });
172
-
173
- const connection = this.readConnections.find((connection) => !connection.isBusy);
174
- if (connection) {
175
- connection.isBusy = true;
176
- resolveConnectionPromise(connection);
177
- } else {
178
- this.readQueue.push(resolveConnectionPromise);
171
+ async readLock<T>(fn: (tx: RemoteConnection) => Promise<T>, options?: DBLockOptions | undefined): Promise<T> {
172
+ const lease = await this.readConnections.requestOne(timeoutSignal(options?.timeoutMs));
173
+ try {
174
+ return await fn(lease.item);
175
+ } finally {
176
+ lease.release();
179
177
  }
180
-
181
- return (async () => {
182
- const connection = await connectionPromise;
183
-
184
- try {
185
- return await fn(connection);
186
- } finally {
187
- const next = this.readQueue.shift();
188
- if (next) {
189
- next(connection);
190
- } else {
191
- connection.isBusy = false;
192
- }
193
- }
194
- })();
195
178
  }
196
179
 
197
- writeLock<T>(fn: (tx: BetterSQLite3LockContext) => Promise<T>, _options?: DBLockOptions | undefined): Promise<T> {
198
- let resolveLockPromise!: () => void;
199
- const lockPromise = new Promise<void>((resolve, _reject) => {
200
- resolveLockPromise = AsyncResource.bind(resolve);
201
- });
202
-
203
- if (!this.writeConnection.isBusy) {
204
- this.writeConnection.isBusy = true;
205
- resolveLockPromise();
206
- } else {
207
- this.writeQueue.push(resolveLockPromise);
208
- }
209
-
210
- return (async () => {
211
- await lockPromise;
180
+ async writeLock<T>(fn: (tx: RemoteConnection) => Promise<T>, options?: DBLockOptions | undefined): Promise<T> {
181
+ const { item, release } = await this.writeConnection.requestOne(timeoutSignal(options?.timeoutMs));
212
182
 
183
+ try {
213
184
  try {
214
- try {
215
- return await fn(this.writeConnection);
216
- } finally {
217
- const serializedUpdates = await this.writeConnection.executeRaw("SELECT powersync_update_hooks('get');", []);
218
- const updates = JSON.parse(serializedUpdates[0][0] as string) as string[];
219
-
220
- if (updates.length > 0) {
221
- const event: BatchedUpdateNotification = {
222
- tables: updates,
223
- groupedUpdates: {},
224
- rawUpdates: []
225
- };
226
- this.iterateListeners((cb) => cb.tablesUpdated?.(event));
227
- }
228
- }
185
+ return await fn(item);
229
186
  } finally {
230
- const next = this.writeQueue.shift();
231
- if (next) {
232
- next();
233
- } else {
234
- this.writeConnection.isBusy = false;
187
+ const serializedUpdates = await item.executeRaw("SELECT powersync_update_hooks('get');", []);
188
+ const updates = JSON.parse(serializedUpdates[0][0] as string) as string[];
189
+
190
+ if (updates.length > 0) {
191
+ const event: BatchedUpdateNotification = {
192
+ tables: updates,
193
+ groupedUpdates: {},
194
+ rawUpdates: []
195
+ };
196
+ this.iterateListeners((cb) => cb.tablesUpdated?.(event));
235
197
  }
236
198
  }
237
- })();
199
+ } finally {
200
+ release();
201
+ }
238
202
  }
239
203
 
240
204
  async refreshSchema() {
241
- await this.writeConnection.refreshSchema();
205
+ await this.writeLock((l) => l.refreshSchema());
242
206
 
243
- await Promise.all(this.readConnections.map((c) => c.refreshSchema()));
207
+ const { items, release } = await this.readConnections.requestAll();
208
+ try {
209
+ await Promise.all(items.map((c) => c.refreshSchema()));
210
+ } finally {
211
+ release();
212
+ }
244
213
  }
245
214
  }
246
215