@powersync/op-sqlite 0.9.4 → 0.9.5

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.
@@ -14,12 +14,10 @@ var _OPSQLiteConnection = require("./OPSQLiteConnection.js");
14
14
 
15
15
  const READ_CONNECTIONS = 5;
16
16
  class OPSQLiteConnectionPool extends _common.BaseObserver {
17
- readQueue = [];
18
17
  constructor(options) {
19
18
  super();
20
19
  this.options = options;
21
20
  this.name = this.options.name;
22
- this.writeMutex = new _common.Mutex();
23
21
  this.readConnections = null;
24
22
  this.writeConnection = null;
25
23
  this.abortController = new AbortController();
@@ -35,14 +33,14 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
35
33
  temporaryStorage
36
34
  } = this.options.sqliteOptions;
37
35
  const dbFilename = this.options.name;
38
- this.writeConnection = await this.openConnection(dbFilename);
36
+ const underlyingWriteConnection = await this.openConnection(dbFilename);
39
37
  const baseStatements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA cache_size = -${cacheSizeKb}`, `PRAGMA temp_store = ${temporaryStorage}`];
40
38
  const writeConnectionStatements = [...baseStatements, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
41
39
  const readConnectionStatements = [...baseStatements, 'PRAGMA query_only = true'];
42
40
  for (const statement of writeConnectionStatements) {
43
41
  for (let tries = 0; tries < 30; tries++) {
44
42
  try {
45
- await this.writeConnection.execute(statement);
43
+ await underlyingWriteConnection.execute(statement);
46
44
  break;
47
45
  } catch (e) {
48
46
  if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
@@ -55,20 +53,19 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
55
53
  }
56
54
 
57
55
  // Changes should only occur in the write connection
58
- this.writeConnection.registerListener({
56
+ underlyingWriteConnection.registerListener({
59
57
  tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
60
58
  });
61
- this.readConnections = [];
59
+ const underlyingReadConnections = [];
62
60
  for (let i = 0; i < READ_CONNECTIONS; i++) {
63
61
  const conn = await this.openConnection(dbFilename);
64
62
  for (let statement of readConnectionStatements) {
65
63
  await conn.execute(statement);
66
64
  }
67
- this.readConnections.push({
68
- busy: false,
69
- connection: conn
70
- });
65
+ underlyingReadConnections.push(conn);
71
66
  }
67
+ this.writeConnection = new _common.Semaphore([underlyingWriteConnection]);
68
+ this.readConnections = new _common.Semaphore(underlyingReadConnections);
72
69
  }
73
70
  async openConnection(filenameOverride) {
74
71
  const dbFilename = filenameOverride ?? this.options.name;
@@ -115,47 +112,23 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
115
112
  await this.initialized;
116
113
  // Abort any pending operations
117
114
  this.abortController.abort();
118
- this.readQueue = [];
119
- this.writeConnection.close();
120
- this.readConnections.forEach(c => c.connection.close());
121
- }
122
- async readLock(fn, options) {
123
- await this.initialized;
124
- return new Promise(async (resolve, reject) => {
125
- const execute = async () => {
126
- // Find an available connection that is not busy
127
- const availableConnection = this.readConnections.find(conn => !conn.busy);
128
-
129
- // If we have an available connection, use it
130
- if (availableConnection) {
131
- availableConnection.busy = true;
132
- try {
133
- resolve(await fn(availableConnection.connection));
134
- } catch (error) {
135
- reject(error);
136
- } finally {
137
- availableConnection.busy = false;
138
- // After query execution, process any queued tasks
139
- this.processQueue();
140
- }
141
- } else {
142
- // If no available connections, add to the queue
143
- this.readQueue.push(execute);
144
- }
145
- };
146
- execute();
147
- });
148
- }
149
- async processQueue() {
150
- if (this.readQueue.length > 0) {
151
- const next = this.readQueue.shift();
152
- if (next) {
153
- next();
154
- }
115
+ const {
116
+ item: writeConnection,
117
+ release: returnWrite
118
+ } = await this.writeConnection.requestOne();
119
+ const {
120
+ items: readers,
121
+ release: returnReaders
122
+ } = await this.readConnections.requestAll();
123
+ try {
124
+ writeConnection.close();
125
+ readers.forEach(c => c.close());
126
+ } finally {
127
+ returnWrite();
128
+ returnReaders();
155
129
  }
156
130
  }
157
- async writeLock(fn, options) {
158
- await this.initialized;
131
+ generateNestedAbortSignal(options) {
159
132
  const outerSignal = this.abortController.signal;
160
133
  let signal;
161
134
  let cleanUpInnerSignal;
@@ -174,21 +147,58 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
174
147
  } else {
175
148
  signal = outerSignal;
176
149
  }
150
+ return {
151
+ signal,
152
+ cleanUpInnerSignal
153
+ };
154
+ }
155
+ async readLock(fn, options) {
156
+ await this.initialized;
157
+ const {
158
+ signal,
159
+ cleanUpInnerSignal
160
+ } = this.generateNestedAbortSignal(options);
161
+ const {
162
+ item,
163
+ release
164
+ } = await this.readConnections.requestOne(signal);
165
+ try {
166
+ return await fn(item);
167
+ } finally {
168
+ release();
169
+ cleanUpInnerSignal?.();
170
+ }
171
+ }
172
+ async writeLock(fn, options) {
173
+ await this.initialized;
174
+ const {
175
+ signal,
176
+ cleanUpInnerSignal
177
+ } = this.generateNestedAbortSignal(options);
178
+ const {
179
+ item,
180
+ release
181
+ } = await this.writeConnection.requestOne(signal);
177
182
  try {
178
- return await this.writeMutex.runExclusive(() => fn(this.writeConnection), signal);
183
+ return await fn(item).finally(() => item.flushUpdates());
179
184
  } finally {
180
- // flush updates once a write lock has been released
181
- this.writeConnection.flushUpdates();
185
+ release();
182
186
  cleanUpInnerSignal?.();
183
187
  }
184
188
  }
185
189
  async refreshSchema() {
186
190
  await this.initialized;
187
- await this.writeConnection.refreshSchema();
188
- if (this.readConnections) {
189
- for (let readConnection of this.readConnections) {
190
- await readConnection.connection.refreshSchema();
191
+ await this.writeLock(l => l.refreshSchema());
192
+ const {
193
+ items,
194
+ release
195
+ } = await this.readConnections.requestAll();
196
+ try {
197
+ for (let readConnection of items) {
198
+ await readConnection.refreshSchema();
191
199
  }
200
+ } finally {
201
+ release();
192
202
  }
193
203
  }
194
204
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_opSqlite","require","_common","_reactNative","_OPSQLiteConnection","READ_CONNECTIONS","OPSQLiteConnectionPool","BaseObserver","readQueue","constructor","options","name","writeMutex","Mutex","readConnections","writeConnection","abortController","AbortController","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","cacheSizeKb","temporaryStorage","sqliteOptions","dbFilename","openConnection","baseStatements","writeConnectionStatements","readConnectionStatements","statement","tries","execute","e","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","i","conn","push","busy","connection","filenameOverride","DB","openDatabase","encryptionKey","undefined","loadAdditionalExtensions","loadPowerSyncExtension","OPSQLiteConnection","baseDB","openOptions","dbLocation","location","open","extensions","length","extension","loadExtension","path","entryPoint","Platform","OS","libPath","getDylibPath","close","abort","forEach","c","readLock","fn","Promise","resolve","reject","availableConnection","find","error","processQueue","next","shift","writeLock","outerSignal","signal","cleanUpInnerSignal","timeoutMs","aborted","innerController","removeEventListener","timeout","addEventListener","timeoutSignal","runExclusive","flushUpdates","refreshSchema","readConnection","OPSQLiteDBAdapter","DBAdapterDefaultMixin","executeBatch","query","params","tx","executeNativeBatch","exports"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_opSqlite","require","_common","_reactNative","_OPSQLiteConnection","READ_CONNECTIONS","OPSQLiteConnectionPool","BaseObserver","constructor","options","name","readConnections","writeConnection","abortController","AbortController","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","cacheSizeKb","temporaryStorage","sqliteOptions","dbFilename","underlyingWriteConnection","openConnection","baseStatements","writeConnectionStatements","readConnectionStatements","statement","tries","execute","e","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","underlyingReadConnections","i","conn","push","Semaphore","filenameOverride","DB","openDatabase","encryptionKey","undefined","loadAdditionalExtensions","loadPowerSyncExtension","OPSQLiteConnection","baseDB","openOptions","dbLocation","location","open","extensions","length","extension","loadExtension","path","entryPoint","Platform","OS","libPath","getDylibPath","close","abort","item","release","returnWrite","requestOne","items","readers","returnReaders","requestAll","forEach","c","generateNestedAbortSignal","outerSignal","signal","cleanUpInnerSignal","timeoutMs","aborted","innerController","removeEventListener","timeout","addEventListener","timeoutSignal","readLock","fn","writeLock","finally","flushUpdates","refreshSchema","l","readConnection","OPSQLiteDBAdapter","DBAdapterDefaultMixin","executeBatch","query","params","tx","executeNativeBatch","exports"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { getDylibPath, open } from '@op-engineering/op-sqlite';
4
- import { BaseObserver, DBAdapterDefaultMixin, Mutex, timeoutSignal } from '@powersync/common';
4
+ import { BaseObserver, DBAdapterDefaultMixin, timeoutSignal, Semaphore } from '@powersync/common';
5
5
  import { Platform } from 'react-native';
6
6
  import { OPSQLiteConnection } from "./OPSQLiteConnection.js";
7
7
 
@@ -11,12 +11,10 @@ import { OPSQLiteConnection } from "./OPSQLiteConnection.js";
11
11
 
12
12
  const READ_CONNECTIONS = 5;
13
13
  class OPSQLiteConnectionPool extends BaseObserver {
14
- readQueue = [];
15
14
  constructor(options) {
16
15
  super();
17
16
  this.options = options;
18
17
  this.name = this.options.name;
19
- this.writeMutex = new Mutex();
20
18
  this.readConnections = null;
21
19
  this.writeConnection = null;
22
20
  this.abortController = new AbortController();
@@ -32,14 +30,14 @@ class OPSQLiteConnectionPool extends BaseObserver {
32
30
  temporaryStorage
33
31
  } = this.options.sqliteOptions;
34
32
  const dbFilename = this.options.name;
35
- this.writeConnection = await this.openConnection(dbFilename);
33
+ const underlyingWriteConnection = await this.openConnection(dbFilename);
36
34
  const baseStatements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA cache_size = -${cacheSizeKb}`, `PRAGMA temp_store = ${temporaryStorage}`];
37
35
  const writeConnectionStatements = [...baseStatements, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
38
36
  const readConnectionStatements = [...baseStatements, 'PRAGMA query_only = true'];
39
37
  for (const statement of writeConnectionStatements) {
40
38
  for (let tries = 0; tries < 30; tries++) {
41
39
  try {
42
- await this.writeConnection.execute(statement);
40
+ await underlyingWriteConnection.execute(statement);
43
41
  break;
44
42
  } catch (e) {
45
43
  if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
@@ -52,20 +50,19 @@ class OPSQLiteConnectionPool extends BaseObserver {
52
50
  }
53
51
 
54
52
  // Changes should only occur in the write connection
55
- this.writeConnection.registerListener({
53
+ underlyingWriteConnection.registerListener({
56
54
  tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
57
55
  });
58
- this.readConnections = [];
56
+ const underlyingReadConnections = [];
59
57
  for (let i = 0; i < READ_CONNECTIONS; i++) {
60
58
  const conn = await this.openConnection(dbFilename);
61
59
  for (let statement of readConnectionStatements) {
62
60
  await conn.execute(statement);
63
61
  }
64
- this.readConnections.push({
65
- busy: false,
66
- connection: conn
67
- });
62
+ underlyingReadConnections.push(conn);
68
63
  }
64
+ this.writeConnection = new Semaphore([underlyingWriteConnection]);
65
+ this.readConnections = new Semaphore(underlyingReadConnections);
69
66
  }
70
67
  async openConnection(filenameOverride) {
71
68
  const dbFilename = filenameOverride ?? this.options.name;
@@ -112,47 +109,23 @@ class OPSQLiteConnectionPool extends BaseObserver {
112
109
  await this.initialized;
113
110
  // Abort any pending operations
114
111
  this.abortController.abort();
115
- this.readQueue = [];
116
- this.writeConnection.close();
117
- this.readConnections.forEach(c => c.connection.close());
118
- }
119
- async readLock(fn, options) {
120
- await this.initialized;
121
- return new Promise(async (resolve, reject) => {
122
- const execute = async () => {
123
- // Find an available connection that is not busy
124
- const availableConnection = this.readConnections.find(conn => !conn.busy);
125
-
126
- // If we have an available connection, use it
127
- if (availableConnection) {
128
- availableConnection.busy = true;
129
- try {
130
- resolve(await fn(availableConnection.connection));
131
- } catch (error) {
132
- reject(error);
133
- } finally {
134
- availableConnection.busy = false;
135
- // After query execution, process any queued tasks
136
- this.processQueue();
137
- }
138
- } else {
139
- // If no available connections, add to the queue
140
- this.readQueue.push(execute);
141
- }
142
- };
143
- execute();
144
- });
145
- }
146
- async processQueue() {
147
- if (this.readQueue.length > 0) {
148
- const next = this.readQueue.shift();
149
- if (next) {
150
- next();
151
- }
112
+ const {
113
+ item: writeConnection,
114
+ release: returnWrite
115
+ } = await this.writeConnection.requestOne();
116
+ const {
117
+ items: readers,
118
+ release: returnReaders
119
+ } = await this.readConnections.requestAll();
120
+ try {
121
+ writeConnection.close();
122
+ readers.forEach(c => c.close());
123
+ } finally {
124
+ returnWrite();
125
+ returnReaders();
152
126
  }
153
127
  }
154
- async writeLock(fn, options) {
155
- await this.initialized;
128
+ generateNestedAbortSignal(options) {
156
129
  const outerSignal = this.abortController.signal;
157
130
  let signal;
158
131
  let cleanUpInnerSignal;
@@ -171,21 +144,58 @@ class OPSQLiteConnectionPool extends BaseObserver {
171
144
  } else {
172
145
  signal = outerSignal;
173
146
  }
147
+ return {
148
+ signal,
149
+ cleanUpInnerSignal
150
+ };
151
+ }
152
+ async readLock(fn, options) {
153
+ await this.initialized;
154
+ const {
155
+ signal,
156
+ cleanUpInnerSignal
157
+ } = this.generateNestedAbortSignal(options);
158
+ const {
159
+ item,
160
+ release
161
+ } = await this.readConnections.requestOne(signal);
162
+ try {
163
+ return await fn(item);
164
+ } finally {
165
+ release();
166
+ cleanUpInnerSignal?.();
167
+ }
168
+ }
169
+ async writeLock(fn, options) {
170
+ await this.initialized;
171
+ const {
172
+ signal,
173
+ cleanUpInnerSignal
174
+ } = this.generateNestedAbortSignal(options);
175
+ const {
176
+ item,
177
+ release
178
+ } = await this.writeConnection.requestOne(signal);
174
179
  try {
175
- return await this.writeMutex.runExclusive(() => fn(this.writeConnection), signal);
180
+ return await fn(item).finally(() => item.flushUpdates());
176
181
  } finally {
177
- // flush updates once a write lock has been released
178
- this.writeConnection.flushUpdates();
182
+ release();
179
183
  cleanUpInnerSignal?.();
180
184
  }
181
185
  }
182
186
  async refreshSchema() {
183
187
  await this.initialized;
184
- await this.writeConnection.refreshSchema();
185
- if (this.readConnections) {
186
- for (let readConnection of this.readConnections) {
187
- await readConnection.connection.refreshSchema();
188
+ await this.writeLock(l => l.refreshSchema());
189
+ const {
190
+ items,
191
+ release
192
+ } = await this.readConnections.requestAll();
193
+ try {
194
+ for (let readConnection of items) {
195
+ await readConnection.refreshSchema();
188
196
  }
197
+ } finally {
198
+ release();
189
199
  }
190
200
  }
191
201
  }
@@ -1 +1 @@
1
- {"version":3,"names":["getDylibPath","open","BaseObserver","DBAdapterDefaultMixin","Mutex","timeoutSignal","Platform","OPSQLiteConnection","READ_CONNECTIONS","OPSQLiteConnectionPool","readQueue","constructor","options","name","writeMutex","readConnections","writeConnection","abortController","AbortController","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","cacheSizeKb","temporaryStorage","sqliteOptions","dbFilename","openConnection","baseStatements","writeConnectionStatements","readConnectionStatements","statement","tries","execute","e","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","i","conn","push","busy","connection","filenameOverride","DB","openDatabase","encryptionKey","undefined","loadAdditionalExtensions","loadPowerSyncExtension","baseDB","openOptions","dbLocation","location","extensions","length","extension","loadExtension","path","entryPoint","OS","libPath","close","abort","forEach","c","readLock","fn","Promise","resolve","reject","availableConnection","find","error","processQueue","next","shift","writeLock","outerSignal","signal","cleanUpInnerSignal","timeoutMs","aborted","innerController","removeEventListener","timeout","addEventListener","runExclusive","flushUpdates","refreshSchema","readConnection","OPSQLiteDBAdapter","executeBatch","query","params","tx","executeNativeBatch"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["getDylibPath","open","BaseObserver","DBAdapterDefaultMixin","timeoutSignal","Semaphore","Platform","OPSQLiteConnection","READ_CONNECTIONS","OPSQLiteConnectionPool","constructor","options","name","readConnections","writeConnection","abortController","AbortController","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","cacheSizeKb","temporaryStorage","sqliteOptions","dbFilename","underlyingWriteConnection","openConnection","baseStatements","writeConnectionStatements","readConnectionStatements","statement","tries","execute","e","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","underlyingReadConnections","i","conn","push","filenameOverride","DB","openDatabase","encryptionKey","undefined","loadAdditionalExtensions","loadPowerSyncExtension","baseDB","openOptions","dbLocation","location","extensions","length","extension","loadExtension","path","entryPoint","OS","libPath","close","abort","item","release","returnWrite","requestOne","items","readers","returnReaders","requestAll","forEach","c","generateNestedAbortSignal","outerSignal","signal","cleanUpInnerSignal","timeoutMs","aborted","innerController","removeEventListener","timeout","addEventListener","readLock","fn","writeLock","finally","flushUpdates","refreshSchema","l","readConnection","OPSQLiteDBAdapter","executeBatch","query","params","tx","executeNativeBatch"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Mutex } from '@powersync/common';
1
+ import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Semaphore } from '@powersync/common';
2
2
  import { OPSQLiteConnection } from './OPSQLiteConnection';
3
3
  import { SqliteOptions } from './SqliteOptions';
4
4
  /**
@@ -12,14 +12,9 @@ export type OPSQLiteAdapterOptions = {
12
12
  declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
13
13
  protected options: OPSQLiteAdapterOptions;
14
14
  name: string;
15
- protected writeMutex: Mutex;
16
15
  protected initialized: Promise<void>;
17
- protected readConnections: Array<{
18
- busy: boolean;
19
- connection: OPSQLiteConnection;
20
- }> | null;
21
- protected writeConnection: OPSQLiteConnection | null;
22
- private readQueue;
16
+ protected readConnections: Semaphore<OPSQLiteConnection> | null;
17
+ protected writeConnection: Semaphore<OPSQLiteConnection> | null;
23
18
  private abortController;
24
19
  constructor(options: OPSQLiteAdapterOptions);
25
20
  protected init(): Promise<void>;
@@ -28,8 +23,8 @@ declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> imp
28
23
  private loadAdditionalExtensions;
29
24
  private loadPowerSyncExtension;
30
25
  close(): Promise<void>;
26
+ private generateNestedAbortSignal;
31
27
  readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
32
- private processQueue;
33
28
  writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
34
29
  refreshSchema(): Promise<void>;
35
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EAET,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EACX,KAAK,EAEN,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAIF,cAAM,sBAAuB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,cAAc;IAahF,SAAS,CAAC,OAAO,EAAE,sBAAsB;IAZrD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC;IAE5B,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,kBAAkB,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAE3F,SAAS,CAAC,eAAe,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAErD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,eAAe,CAAkB;gBAEnB,OAAO,EAAE,sBAAsB;cAWrC,IAAI;cAoDJ,cAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAetF,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,wBAAwB;YAQlB,sBAAsB;IAS9B,KAAK;IAUL,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;YA6BpF,YAAY;IASpB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAkC7F,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAUrC;;mEA5CuD,CAAC;oEAG/B,CAAC;qCAEX,CAAC;0CAEe,CAAC;kCACa,CAAC;iCACD,CAAC;oCAEhB,CAAC;sCACqC,CAAC;;;0FAKhD,CAAC;2FAGjB,CAAD;;;;AA0BL,qBAAa,iBAAkB,SAAQ,sBAA8C,YAAW,SAAS;IACjG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CAK9E"}
1
+ {"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EAET,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EAEX,SAAS,EACV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAIF,cAAM,sBAAuB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,cAAc;IAUhF,SAAS,CAAC,OAAO,EAAE,sBAAsB;IATrD,IAAI,EAAE,MAAM,CAAC;IAEb,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;IAChE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;IAEhE,OAAO,CAAC,eAAe,CAAkB;gBAEnB,OAAO,EAAE,sBAAsB;cAUrC,IAAI;cAuDJ,cAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAetF,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,wBAAwB;YAQlB,sBAAsB;IAS9B,KAAK;IAiBX,OAAO,CAAC,yBAAyB;IA0B3B,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAa5F,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAa7F,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAYrC;;mEAtC2D,CAAC;oEAG9B,CAAC;qCACb,CAAC;0CAEd,CAAH;kCAGK,CAAC;iCAIkB,CAAC;oCAAwE,CAAC;sCAG9D,CAAA;;;0FAGP,CAAC;2FAK/B,CAAF;;;;AAgBA,qBAAa,iBAAkB,SAAQ,sBAA8C,YAAW,SAAS;IACjG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CAK9E"}
@@ -1,4 +1,4 @@
1
- import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Mutex } from '@powersync/common';
1
+ import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Semaphore } from '@powersync/common';
2
2
  import { OPSQLiteConnection } from './OPSQLiteConnection';
3
3
  import { SqliteOptions } from './SqliteOptions';
4
4
  /**
@@ -12,14 +12,9 @@ export type OPSQLiteAdapterOptions = {
12
12
  declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
13
13
  protected options: OPSQLiteAdapterOptions;
14
14
  name: string;
15
- protected writeMutex: Mutex;
16
15
  protected initialized: Promise<void>;
17
- protected readConnections: Array<{
18
- busy: boolean;
19
- connection: OPSQLiteConnection;
20
- }> | null;
21
- protected writeConnection: OPSQLiteConnection | null;
22
- private readQueue;
16
+ protected readConnections: Semaphore<OPSQLiteConnection> | null;
17
+ protected writeConnection: Semaphore<OPSQLiteConnection> | null;
23
18
  private abortController;
24
19
  constructor(options: OPSQLiteAdapterOptions);
25
20
  protected init(): Promise<void>;
@@ -28,8 +23,8 @@ declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> imp
28
23
  private loadAdditionalExtensions;
29
24
  private loadPowerSyncExtension;
30
25
  close(): Promise<void>;
26
+ private generateNestedAbortSignal;
31
27
  readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
32
- private processQueue;
33
28
  writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
34
29
  refreshSchema(): Promise<void>;
35
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EAET,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EACX,KAAK,EAEN,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAIF,cAAM,sBAAuB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,cAAc;IAahF,SAAS,CAAC,OAAO,EAAE,sBAAsB;IAZrD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC;IAE5B,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,kBAAkB,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAE3F,SAAS,CAAC,eAAe,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAErD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,eAAe,CAAkB;gBAEnB,OAAO,EAAE,sBAAsB;cAWrC,IAAI;cAoDJ,cAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAetF,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,wBAAwB;YAQlB,sBAAsB;IAS9B,KAAK;IAUL,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;YA6BpF,YAAY;IASpB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAkC7F,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAUrC;;mEA5CuD,CAAC;oEAG/B,CAAC;qCAEX,CAAC;0CAEe,CAAC;kCACa,CAAC;iCACD,CAAC;oCAEhB,CAAC;sCACqC,CAAC;;;0FAKhD,CAAC;2FAGjB,CAAD;;;;AA0BL,qBAAa,iBAAkB,SAAQ,sBAA8C,YAAW,SAAS;IACjG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CAK9E"}
1
+ {"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EAET,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EAEX,SAAS,EACV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAIF,cAAM,sBAAuB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,cAAc;IAUhF,SAAS,CAAC,OAAO,EAAE,sBAAsB;IATrD,IAAI,EAAE,MAAM,CAAC;IAEb,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;IAChE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;IAEhE,OAAO,CAAC,eAAe,CAAkB;gBAEnB,OAAO,EAAE,sBAAsB;cAUrC,IAAI;cAuDJ,cAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAetF,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,wBAAwB;YAQlB,sBAAsB;IAS9B,KAAK;IAiBX,OAAO,CAAC,yBAAyB;IA0B3B,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAa5F,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAa7F,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAYrC;;mEAtC2D,CAAC;oEAG9B,CAAC;qCACb,CAAC;0CAEd,CAAH;kCAGK,CAAC;iCAIkB,CAAC;oCAAwE,CAAC;sCAG9D,CAAA;;;0FAGP,CAAC;2FAK/B,CAAF;;;;AAgBA,qBAAa,iBAAkB,SAAQ,sBAA8C,YAAW,SAAS;IACjG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CAK9E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powersync/op-sqlite",
3
- "version": "0.9.4",
3
+ "version": "0.9.5",
4
4
  "description": "PowerSync - sync Postgres or MongoDB with SQLite in your React Native app for offline-first and real-time data",
5
5
  "source": "./src/index.ts",
6
6
  "main": "./lib/commonjs/index.js",
@@ -59,12 +59,12 @@
59
59
  },
60
60
  "peerDependencies": {
61
61
  "@op-engineering/op-sqlite": "^13.0.0 || ^14.0.0 || ^15.0.0",
62
- "@powersync/common": "^1.50.0",
62
+ "@powersync/common": "^1.51.0",
63
63
  "react": "*",
64
64
  "react-native": "*"
65
65
  },
66
66
  "dependencies": {
67
- "@powersync/common": "1.50.0"
67
+ "@powersync/common": "1.51.0"
68
68
  },
69
69
  "devDependencies": {
70
70
  "@op-engineering/op-sqlite": "^15.2.2",
@@ -8,8 +8,8 @@ import {
8
8
  DBLockOptions,
9
9
  QueryResult,
10
10
  Transaction,
11
- Mutex,
12
- timeoutSignal
11
+ timeoutSignal,
12
+ Semaphore
13
13
  } from '@powersync/common';
14
14
  import { Platform } from 'react-native';
15
15
  import { OPSQLiteConnection } from './OPSQLiteConnection';
@@ -28,22 +28,18 @@ const READ_CONNECTIONS = 5;
28
28
 
29
29
  class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
30
30
  name: string;
31
- protected writeMutex: Mutex;
32
31
 
33
32
  protected initialized: Promise<void>;
34
33
 
35
- protected readConnections: Array<{ busy: boolean; connection: OPSQLiteConnection }> | null;
34
+ protected readConnections: Semaphore<OPSQLiteConnection> | null;
35
+ protected writeConnection: Semaphore<OPSQLiteConnection> | null;
36
36
 
37
- protected writeConnection: OPSQLiteConnection | null;
38
-
39
- private readQueue: Array<() => void> = [];
40
37
  private abortController: AbortController;
41
38
 
42
39
  constructor(protected options: OPSQLiteAdapterOptions) {
43
40
  super();
44
41
  this.name = this.options.name;
45
42
 
46
- this.writeMutex = new Mutex();
47
43
  this.readConnections = null;
48
44
  this.writeConnection = null;
49
45
  this.abortController = new AbortController();
@@ -55,7 +51,7 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
55
51
  this.options.sqliteOptions!;
56
52
  const dbFilename = this.options.name;
57
53
 
58
- this.writeConnection = await this.openConnection(dbFilename);
54
+ const underlyingWriteConnection = await this.openConnection(dbFilename);
59
55
 
60
56
  const baseStatements = [
61
57
  `PRAGMA busy_timeout = ${lockTimeoutMs}`,
@@ -75,7 +71,7 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
75
71
  for (const statement of writeConnectionStatements) {
76
72
  for (let tries = 0; tries < 30; tries++) {
77
73
  try {
78
- await this.writeConnection!.execute(statement);
74
+ await underlyingWriteConnection.execute(statement);
79
75
  break;
80
76
  } catch (e: any) {
81
77
  if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
@@ -88,18 +84,21 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
88
84
  }
89
85
 
90
86
  // Changes should only occur in the write connection
91
- this.writeConnection!.registerListener({
87
+ underlyingWriteConnection.registerListener({
92
88
  tablesUpdated: (notification) => this.iterateListeners((cb) => cb.tablesUpdated?.(notification))
93
89
  });
94
90
 
95
- this.readConnections = [];
91
+ const underlyingReadConnections = [];
96
92
  for (let i = 0; i < READ_CONNECTIONS; i++) {
97
93
  const conn = await this.openConnection(dbFilename);
98
94
  for (let statement of readConnectionStatements) {
99
95
  await conn.execute(statement);
100
96
  }
101
- this.readConnections.push({ busy: false, connection: conn });
97
+ underlyingReadConnections.push(conn);
102
98
  }
99
+
100
+ this.writeConnection = new Semaphore([underlyingWriteConnection]);
101
+ this.readConnections = new Semaphore(underlyingReadConnections);
103
102
  }
104
103
 
105
104
  protected async openConnection(filenameOverride?: string): Promise<OPSQLiteConnection> {
@@ -155,53 +154,20 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
155
154
  await this.initialized;
156
155
  // Abort any pending operations
157
156
  this.abortController.abort();
158
- this.readQueue = [];
159
-
160
- this.writeConnection!.close();
161
- this.readConnections!.forEach((c) => c.connection.close());
162
- }
163
-
164
- async readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T> {
165
- await this.initialized;
166
- return new Promise(async (resolve, reject) => {
167
- const execute = async () => {
168
- // Find an available connection that is not busy
169
- const availableConnection = this.readConnections!.find((conn) => !conn.busy);
170
-
171
- // If we have an available connection, use it
172
- if (availableConnection) {
173
- availableConnection.busy = true;
174
- try {
175
- resolve(await fn(availableConnection.connection));
176
- } catch (error) {
177
- reject(error);
178
- } finally {
179
- availableConnection.busy = false;
180
- // After query execution, process any queued tasks
181
- this.processQueue();
182
- }
183
- } else {
184
- // If no available connections, add to the queue
185
- this.readQueue.push(execute);
186
- }
187
- };
188
157
 
189
- execute();
190
- });
191
- }
158
+ const { item: writeConnection, release: returnWrite } = await this.writeConnection!.requestOne();
159
+ const { items: readers, release: returnReaders } = await this.readConnections!.requestAll();
192
160
 
193
- private async processQueue(): Promise<void> {
194
- if (this.readQueue.length > 0) {
195
- const next = this.readQueue.shift();
196
- if (next) {
197
- next();
198
- }
161
+ try {
162
+ writeConnection.close();
163
+ readers.forEach((c) => c.close());
164
+ } finally {
165
+ returnWrite();
166
+ returnReaders();
199
167
  }
200
168
  }
201
169
 
202
- async writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T> {
203
- await this.initialized;
204
-
170
+ private generateNestedAbortSignal(options?: DBLockOptions) {
205
171
  const outerSignal = this.abortController.signal;
206
172
  let signal: AbortSignal;
207
173
  let cleanUpInnerSignal: (() => void) | undefined;
@@ -224,23 +190,45 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
224
190
  signal = outerSignal;
225
191
  }
226
192
 
193
+ return { signal, cleanUpInnerSignal };
194
+ }
195
+
196
+ async readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T> {
197
+ await this.initialized;
198
+
199
+ const { signal, cleanUpInnerSignal } = this.generateNestedAbortSignal(options);
200
+ const { item, release } = await this.readConnections!.requestOne(signal);
227
201
  try {
228
- return await this.writeMutex.runExclusive(() => fn(this.writeConnection!), signal);
202
+ return await fn(item);
229
203
  } finally {
230
- // flush updates once a write lock has been released
231
- this.writeConnection!.flushUpdates();
204
+ release();
232
205
  cleanUpInnerSignal?.();
233
206
  }
234
207
  }
235
208
 
236
- async refreshSchema(): Promise<void> {
209
+ async writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T> {
237
210
  await this.initialized;
238
- await this.writeConnection!.refreshSchema();
239
211
 
240
- if (this.readConnections) {
241
- for (let readConnection of this.readConnections) {
242
- await readConnection.connection.refreshSchema();
212
+ const { signal, cleanUpInnerSignal } = this.generateNestedAbortSignal(options);
213
+ const { item, release } = await this.writeConnection!.requestOne(signal);
214
+ try {
215
+ return await fn(item).finally(() => item.flushUpdates());
216
+ } finally {
217
+ release();
218
+ cleanUpInnerSignal?.();
219
+ }
220
+ }
221
+
222
+ async refreshSchema(): Promise<void> {
223
+ await this.initialized;
224
+ await this.writeLock((l) => l.refreshSchema());
225
+ const { items, release } = await this.readConnections!.requestAll();
226
+ try {
227
+ for (let readConnection of items) {
228
+ await readConnection.refreshSchema();
243
229
  }
230
+ } finally {
231
+ release();
244
232
  }
245
233
  }
246
234
  }