@powersync/op-sqlite 0.9.3 → 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.
- package/lib/commonjs/db/OPSqliteAdapter.js +83 -71
- package/lib/commonjs/db/OPSqliteAdapter.js.map +1 -1
- package/lib/module/db/OPSqliteAdapter.js +84 -72
- package/lib/module/db/OPSqliteAdapter.js.map +1 -1
- package/lib/typescript/commonjs/src/db/OPSQLiteConnection.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts +4 -10
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/lib/typescript/module/src/db/OPSQLiteConnection.d.ts.map +1 -1
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts +4 -10
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/package.json +3 -4
- package/src/db/OPSqliteAdapter.ts +70 -80
|
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.OPSQLiteDBAdapter = void 0;
|
|
7
7
|
var _opSqlite = require("@op-engineering/op-sqlite");
|
|
8
8
|
var _common = require("@powersync/common");
|
|
9
|
-
var _asyncMutex = require("async-mutex");
|
|
10
9
|
var _reactNative = require("react-native");
|
|
11
10
|
var _OPSQLiteConnection = require("./OPSQLiteConnection.js");
|
|
12
11
|
/**
|
|
@@ -15,12 +14,10 @@ var _OPSQLiteConnection = require("./OPSQLiteConnection.js");
|
|
|
15
14
|
|
|
16
15
|
const READ_CONNECTIONS = 5;
|
|
17
16
|
class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
18
|
-
readQueue = [];
|
|
19
17
|
constructor(options) {
|
|
20
18
|
super();
|
|
21
19
|
this.options = options;
|
|
22
20
|
this.name = this.options.name;
|
|
23
|
-
this.writeMutex = new _asyncMutex.Mutex();
|
|
24
21
|
this.readConnections = null;
|
|
25
22
|
this.writeConnection = null;
|
|
26
23
|
this.abortController = new AbortController();
|
|
@@ -36,14 +33,14 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
|
36
33
|
temporaryStorage
|
|
37
34
|
} = this.options.sqliteOptions;
|
|
38
35
|
const dbFilename = this.options.name;
|
|
39
|
-
|
|
36
|
+
const underlyingWriteConnection = await this.openConnection(dbFilename);
|
|
40
37
|
const baseStatements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA cache_size = -${cacheSizeKb}`, `PRAGMA temp_store = ${temporaryStorage}`];
|
|
41
38
|
const writeConnectionStatements = [...baseStatements, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
|
|
42
39
|
const readConnectionStatements = [...baseStatements, 'PRAGMA query_only = true'];
|
|
43
40
|
for (const statement of writeConnectionStatements) {
|
|
44
41
|
for (let tries = 0; tries < 30; tries++) {
|
|
45
42
|
try {
|
|
46
|
-
await
|
|
43
|
+
await underlyingWriteConnection.execute(statement);
|
|
47
44
|
break;
|
|
48
45
|
} catch (e) {
|
|
49
46
|
if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
|
|
@@ -56,20 +53,19 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
|
56
53
|
}
|
|
57
54
|
|
|
58
55
|
// Changes should only occur in the write connection
|
|
59
|
-
|
|
56
|
+
underlyingWriteConnection.registerListener({
|
|
60
57
|
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
61
58
|
});
|
|
62
|
-
|
|
59
|
+
const underlyingReadConnections = [];
|
|
63
60
|
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
64
61
|
const conn = await this.openConnection(dbFilename);
|
|
65
62
|
for (let statement of readConnectionStatements) {
|
|
66
63
|
await conn.execute(statement);
|
|
67
64
|
}
|
|
68
|
-
|
|
69
|
-
busy: false,
|
|
70
|
-
connection: conn
|
|
71
|
-
});
|
|
65
|
+
underlyingReadConnections.push(conn);
|
|
72
66
|
}
|
|
67
|
+
this.writeConnection = new _common.Semaphore([underlyingWriteConnection]);
|
|
68
|
+
this.readConnections = new _common.Semaphore(underlyingReadConnections);
|
|
73
69
|
}
|
|
74
70
|
async openConnection(filenameOverride) {
|
|
75
71
|
const dbFilename = filenameOverride ?? this.options.name;
|
|
@@ -116,77 +112,93 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
|
116
112
|
await this.initialized;
|
|
117
113
|
// Abort any pending operations
|
|
118
114
|
this.abortController.abort();
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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();
|
|
129
|
+
}
|
|
122
130
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
resolve(await fn(availableConnection.connection));
|
|
135
|
-
} catch (error) {
|
|
136
|
-
reject(error);
|
|
137
|
-
} finally {
|
|
138
|
-
availableConnection.busy = false;
|
|
139
|
-
// After query execution, process any queued tasks
|
|
140
|
-
this.processQueue();
|
|
141
|
-
}
|
|
142
|
-
} else {
|
|
143
|
-
// If no available connections, add to the queue
|
|
144
|
-
this.readQueue.push(execute);
|
|
145
|
-
}
|
|
131
|
+
generateNestedAbortSignal(options) {
|
|
132
|
+
const outerSignal = this.abortController.signal;
|
|
133
|
+
let signal;
|
|
134
|
+
let cleanUpInnerSignal;
|
|
135
|
+
if (options?.timeoutMs && !outerSignal.aborted) {
|
|
136
|
+
// This is essentially an AbortSignal.any() polyfill.
|
|
137
|
+
const innerController = new AbortController();
|
|
138
|
+
cleanUpInnerSignal = () => {
|
|
139
|
+
innerController.abort();
|
|
140
|
+
outerSignal.removeEventListener('abort', cleanUpInnerSignal);
|
|
141
|
+
timeout.removeEventListener('abort', cleanUpInnerSignal);
|
|
146
142
|
};
|
|
147
|
-
|
|
148
|
-
|
|
143
|
+
outerSignal.addEventListener('abort', cleanUpInnerSignal);
|
|
144
|
+
const timeout = (0, _common.timeoutSignal)(options.timeoutMs);
|
|
145
|
+
timeout.addEventListener('abort', cleanUpInnerSignal);
|
|
146
|
+
signal = innerController.signal;
|
|
147
|
+
} else {
|
|
148
|
+
signal = outerSignal;
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
signal,
|
|
152
|
+
cleanUpInnerSignal
|
|
153
|
+
};
|
|
149
154
|
}
|
|
150
|
-
async
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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?.();
|
|
156
170
|
}
|
|
157
171
|
}
|
|
158
172
|
async writeLock(fn, options) {
|
|
159
173
|
await this.initialized;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
// flush updates once a write lock has been released
|
|
175
|
-
this.writeConnection.flushUpdates();
|
|
176
|
-
} catch (ex) {
|
|
177
|
-
reject(ex);
|
|
178
|
-
} finally {
|
|
179
|
-
this.abortController.signal.removeEventListener('abort', abortListener);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
174
|
+
const {
|
|
175
|
+
signal,
|
|
176
|
+
cleanUpInnerSignal
|
|
177
|
+
} = this.generateNestedAbortSignal(options);
|
|
178
|
+
const {
|
|
179
|
+
item,
|
|
180
|
+
release
|
|
181
|
+
} = await this.writeConnection.requestOne(signal);
|
|
182
|
+
try {
|
|
183
|
+
return await fn(item).finally(() => item.flushUpdates());
|
|
184
|
+
} finally {
|
|
185
|
+
release();
|
|
186
|
+
cleanUpInnerSignal?.();
|
|
187
|
+
}
|
|
182
188
|
}
|
|
183
189
|
async refreshSchema() {
|
|
184
190
|
await this.initialized;
|
|
185
|
-
await this.
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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();
|
|
189
199
|
}
|
|
200
|
+
} finally {
|
|
201
|
+
release();
|
|
190
202
|
}
|
|
191
203
|
}
|
|
192
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_opSqlite","require","_common","
|
|
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,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { getDylibPath, open } from '@op-engineering/op-sqlite';
|
|
4
|
-
import { BaseObserver, DBAdapterDefaultMixin,
|
|
5
|
-
import { Mutex } from 'async-mutex';
|
|
4
|
+
import { BaseObserver, DBAdapterDefaultMixin, timeoutSignal, Semaphore } from '@powersync/common';
|
|
6
5
|
import { Platform } from 'react-native';
|
|
7
6
|
import { OPSQLiteConnection } from "./OPSQLiteConnection.js";
|
|
8
7
|
|
|
@@ -12,12 +11,10 @@ import { OPSQLiteConnection } from "./OPSQLiteConnection.js";
|
|
|
12
11
|
|
|
13
12
|
const READ_CONNECTIONS = 5;
|
|
14
13
|
class OPSQLiteConnectionPool extends BaseObserver {
|
|
15
|
-
readQueue = [];
|
|
16
14
|
constructor(options) {
|
|
17
15
|
super();
|
|
18
16
|
this.options = options;
|
|
19
17
|
this.name = this.options.name;
|
|
20
|
-
this.writeMutex = new Mutex();
|
|
21
18
|
this.readConnections = null;
|
|
22
19
|
this.writeConnection = null;
|
|
23
20
|
this.abortController = new AbortController();
|
|
@@ -33,14 +30,14 @@ class OPSQLiteConnectionPool extends BaseObserver {
|
|
|
33
30
|
temporaryStorage
|
|
34
31
|
} = this.options.sqliteOptions;
|
|
35
32
|
const dbFilename = this.options.name;
|
|
36
|
-
|
|
33
|
+
const underlyingWriteConnection = await this.openConnection(dbFilename);
|
|
37
34
|
const baseStatements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA cache_size = -${cacheSizeKb}`, `PRAGMA temp_store = ${temporaryStorage}`];
|
|
38
35
|
const writeConnectionStatements = [...baseStatements, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
|
|
39
36
|
const readConnectionStatements = [...baseStatements, 'PRAGMA query_only = true'];
|
|
40
37
|
for (const statement of writeConnectionStatements) {
|
|
41
38
|
for (let tries = 0; tries < 30; tries++) {
|
|
42
39
|
try {
|
|
43
|
-
await
|
|
40
|
+
await underlyingWriteConnection.execute(statement);
|
|
44
41
|
break;
|
|
45
42
|
} catch (e) {
|
|
46
43
|
if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
|
|
@@ -53,20 +50,19 @@ class OPSQLiteConnectionPool extends BaseObserver {
|
|
|
53
50
|
}
|
|
54
51
|
|
|
55
52
|
// Changes should only occur in the write connection
|
|
56
|
-
|
|
53
|
+
underlyingWriteConnection.registerListener({
|
|
57
54
|
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
58
55
|
});
|
|
59
|
-
|
|
56
|
+
const underlyingReadConnections = [];
|
|
60
57
|
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
61
58
|
const conn = await this.openConnection(dbFilename);
|
|
62
59
|
for (let statement of readConnectionStatements) {
|
|
63
60
|
await conn.execute(statement);
|
|
64
61
|
}
|
|
65
|
-
|
|
66
|
-
busy: false,
|
|
67
|
-
connection: conn
|
|
68
|
-
});
|
|
62
|
+
underlyingReadConnections.push(conn);
|
|
69
63
|
}
|
|
64
|
+
this.writeConnection = new Semaphore([underlyingWriteConnection]);
|
|
65
|
+
this.readConnections = new Semaphore(underlyingReadConnections);
|
|
70
66
|
}
|
|
71
67
|
async openConnection(filenameOverride) {
|
|
72
68
|
const dbFilename = filenameOverride ?? this.options.name;
|
|
@@ -113,77 +109,93 @@ class OPSQLiteConnectionPool extends BaseObserver {
|
|
|
113
109
|
await this.initialized;
|
|
114
110
|
// Abort any pending operations
|
|
115
111
|
this.abortController.abort();
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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();
|
|
126
|
+
}
|
|
119
127
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
resolve(await fn(availableConnection.connection));
|
|
132
|
-
} catch (error) {
|
|
133
|
-
reject(error);
|
|
134
|
-
} finally {
|
|
135
|
-
availableConnection.busy = false;
|
|
136
|
-
// After query execution, process any queued tasks
|
|
137
|
-
this.processQueue();
|
|
138
|
-
}
|
|
139
|
-
} else {
|
|
140
|
-
// If no available connections, add to the queue
|
|
141
|
-
this.readQueue.push(execute);
|
|
142
|
-
}
|
|
128
|
+
generateNestedAbortSignal(options) {
|
|
129
|
+
const outerSignal = this.abortController.signal;
|
|
130
|
+
let signal;
|
|
131
|
+
let cleanUpInnerSignal;
|
|
132
|
+
if (options?.timeoutMs && !outerSignal.aborted) {
|
|
133
|
+
// This is essentially an AbortSignal.any() polyfill.
|
|
134
|
+
const innerController = new AbortController();
|
|
135
|
+
cleanUpInnerSignal = () => {
|
|
136
|
+
innerController.abort();
|
|
137
|
+
outerSignal.removeEventListener('abort', cleanUpInnerSignal);
|
|
138
|
+
timeout.removeEventListener('abort', cleanUpInnerSignal);
|
|
143
139
|
};
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
outerSignal.addEventListener('abort', cleanUpInnerSignal);
|
|
141
|
+
const timeout = timeoutSignal(options.timeoutMs);
|
|
142
|
+
timeout.addEventListener('abort', cleanUpInnerSignal);
|
|
143
|
+
signal = innerController.signal;
|
|
144
|
+
} else {
|
|
145
|
+
signal = outerSignal;
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
signal,
|
|
149
|
+
cleanUpInnerSignal
|
|
150
|
+
};
|
|
146
151
|
}
|
|
147
|
-
async
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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?.();
|
|
153
167
|
}
|
|
154
168
|
}
|
|
155
169
|
async writeLock(fn, options) {
|
|
156
170
|
await this.initialized;
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
// flush updates once a write lock has been released
|
|
172
|
-
this.writeConnection.flushUpdates();
|
|
173
|
-
} catch (ex) {
|
|
174
|
-
reject(ex);
|
|
175
|
-
} finally {
|
|
176
|
-
this.abortController.signal.removeEventListener('abort', abortListener);
|
|
177
|
-
}
|
|
178
|
-
});
|
|
171
|
+
const {
|
|
172
|
+
signal,
|
|
173
|
+
cleanUpInnerSignal
|
|
174
|
+
} = this.generateNestedAbortSignal(options);
|
|
175
|
+
const {
|
|
176
|
+
item,
|
|
177
|
+
release
|
|
178
|
+
} = await this.writeConnection.requestOne(signal);
|
|
179
|
+
try {
|
|
180
|
+
return await fn(item).finally(() => item.flushUpdates());
|
|
181
|
+
} finally {
|
|
182
|
+
release();
|
|
183
|
+
cleanUpInnerSignal?.();
|
|
184
|
+
}
|
|
179
185
|
}
|
|
180
186
|
async refreshSchema() {
|
|
181
187
|
await this.initialized;
|
|
182
|
-
await this.
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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();
|
|
186
196
|
}
|
|
197
|
+
} finally {
|
|
198
|
+
release();
|
|
187
199
|
}
|
|
188
200
|
}
|
|
189
201
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getDylibPath","open","BaseObserver","DBAdapterDefaultMixin","
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OPSQLiteConnection.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSQLiteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EACL,YAAY,EAEZ,iBAAiB,EAEjB,WAAW,EACX,WAAW,EAEX,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,mBAAmB,CAAC;IAC/B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,cAAM,gBAAiB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;IAI7F,SAAS,CAAC,OAAO,EAAE,yBAAyB;IAHxD,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACjB,OAAO,CAAC,YAAY,CAAuB;gBAErB,OAAO,EAAE,yBAAyB;IAcxD,cAAc,CAAC,MAAM,EAAE,0BAA0B;IAqBjD,YAAY;IAsBZ,KAAK;IAIC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAa5D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAI3D,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CASpF;;
|
|
1
|
+
{"version":3,"file":"OPSQLiteConnection.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSQLiteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EACL,YAAY,EAEZ,iBAAiB,EAEjB,WAAW,EACX,WAAW,EAEX,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,mBAAmB,CAAC;IAC/B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,cAAM,gBAAiB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;IAI7F,SAAS,CAAC,OAAO,EAAE,yBAAyB;IAHxD,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACjB,OAAO,CAAC,YAAY,CAAuB;gBAErB,OAAO,EAAE,yBAAyB;IAcxD,cAAc,CAAC,MAAM,EAAE,0BAA0B;IAqBjD,YAAY;IAsBZ,KAAK;IAIC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAa5D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAI3D,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CASpF;;qCAOM,CAAC;0CAAsE,CAAC;kCAAmE,CAAC;sCAAgE,CAAC;mCAAyE,CAAC;sCAAwF,CAAC;;AALvX,qBAAa,kBAAmB,SAAQ,uBAAyC,YAAW,WAAW;IAC/F,aAAa;CAGpB"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction } from '@powersync/common';
|
|
2
|
-
import { Mutex } from 'async-mutex';
|
|
1
|
+
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Semaphore } from '@powersync/common';
|
|
3
2
|
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
4
3
|
import { SqliteOptions } from './SqliteOptions';
|
|
5
4
|
/**
|
|
@@ -13,14 +12,9 @@ export type OPSQLiteAdapterOptions = {
|
|
|
13
12
|
declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
|
|
14
13
|
protected options: OPSQLiteAdapterOptions;
|
|
15
14
|
name: string;
|
|
16
|
-
protected writeMutex: Mutex;
|
|
17
15
|
protected initialized: Promise<void>;
|
|
18
|
-
protected readConnections:
|
|
19
|
-
|
|
20
|
-
connection: OPSQLiteConnection;
|
|
21
|
-
}> | null;
|
|
22
|
-
protected writeConnection: OPSQLiteConnection | null;
|
|
23
|
-
private readQueue;
|
|
16
|
+
protected readConnections: Semaphore<OPSQLiteConnection> | null;
|
|
17
|
+
protected writeConnection: Semaphore<OPSQLiteConnection> | null;
|
|
24
18
|
private abortController;
|
|
25
19
|
constructor(options: OPSQLiteAdapterOptions);
|
|
26
20
|
protected init(): Promise<void>;
|
|
@@ -29,8 +23,8 @@ declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> imp
|
|
|
29
23
|
private loadAdditionalExtensions;
|
|
30
24
|
private loadPowerSyncExtension;
|
|
31
25
|
close(): Promise<void>;
|
|
26
|
+
private generateNestedAbortSignal;
|
|
32
27
|
readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
33
|
-
private processQueue;
|
|
34
28
|
writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
35
29
|
refreshSchema(): Promise<void>;
|
|
36
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,
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OPSQLiteConnection.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSQLiteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EACL,YAAY,EAEZ,iBAAiB,EAEjB,WAAW,EACX,WAAW,EAEX,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,mBAAmB,CAAC;IAC/B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,cAAM,gBAAiB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;IAI7F,SAAS,CAAC,OAAO,EAAE,yBAAyB;IAHxD,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACjB,OAAO,CAAC,YAAY,CAAuB;gBAErB,OAAO,EAAE,yBAAyB;IAcxD,cAAc,CAAC,MAAM,EAAE,0BAA0B;IAqBjD,YAAY;IAsBZ,KAAK;IAIC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAa5D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAI3D,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CASpF;;
|
|
1
|
+
{"version":3,"file":"OPSQLiteConnection.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSQLiteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EACL,YAAY,EAEZ,iBAAiB,EAEjB,WAAW,EACX,WAAW,EAEX,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,mBAAmB,CAAC;IAC/B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,cAAM,gBAAiB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;IAI7F,SAAS,CAAC,OAAO,EAAE,yBAAyB;IAHxD,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACjB,OAAO,CAAC,YAAY,CAAuB;gBAErB,OAAO,EAAE,yBAAyB;IAcxD,cAAc,CAAC,MAAM,EAAE,0BAA0B;IAqBjD,YAAY;IAsBZ,KAAK;IAIC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAa5D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAI3D,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CASpF;;qCAOM,CAAC;0CAAsE,CAAC;kCAAmE,CAAC;sCAAgE,CAAC;mCAAyE,CAAC;sCAAwF,CAAC;;AALvX,qBAAa,kBAAmB,SAAQ,uBAAyC,YAAW,WAAW;IAC/F,aAAa;CAGpB"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction } from '@powersync/common';
|
|
2
|
-
import { Mutex } from 'async-mutex';
|
|
1
|
+
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Semaphore } from '@powersync/common';
|
|
3
2
|
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
4
3
|
import { SqliteOptions } from './SqliteOptions';
|
|
5
4
|
/**
|
|
@@ -13,14 +12,9 @@ export type OPSQLiteAdapterOptions = {
|
|
|
13
12
|
declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
|
|
14
13
|
protected options: OPSQLiteAdapterOptions;
|
|
15
14
|
name: string;
|
|
16
|
-
protected writeMutex: Mutex;
|
|
17
15
|
protected initialized: Promise<void>;
|
|
18
|
-
protected readConnections:
|
|
19
|
-
|
|
20
|
-
connection: OPSQLiteConnection;
|
|
21
|
-
}> | null;
|
|
22
|
-
protected writeConnection: OPSQLiteConnection | null;
|
|
23
|
-
private readQueue;
|
|
16
|
+
protected readConnections: Semaphore<OPSQLiteConnection> | null;
|
|
17
|
+
protected writeConnection: Semaphore<OPSQLiteConnection> | null;
|
|
24
18
|
private abortController;
|
|
25
19
|
constructor(options: OPSQLiteAdapterOptions);
|
|
26
20
|
protected init(): Promise<void>;
|
|
@@ -29,8 +23,8 @@ declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> imp
|
|
|
29
23
|
private loadAdditionalExtensions;
|
|
30
24
|
private loadPowerSyncExtension;
|
|
31
25
|
close(): Promise<void>;
|
|
26
|
+
private generateNestedAbortSignal;
|
|
32
27
|
readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
33
|
-
private processQueue;
|
|
34
28
|
writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
35
29
|
refreshSchema(): Promise<void>;
|
|
36
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,
|
|
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.
|
|
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,13 +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.
|
|
62
|
+
"@powersync/common": "^1.51.0",
|
|
63
63
|
"react": "*",
|
|
64
64
|
"react-native": "*"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"
|
|
68
|
-
"@powersync/common": "1.49.0"
|
|
67
|
+
"@powersync/common": "1.51.0"
|
|
69
68
|
},
|
|
70
69
|
"devDependencies": {
|
|
71
70
|
"@op-engineering/op-sqlite": "^15.2.2",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getDylibPath, open,
|
|
1
|
+
import { getDylibPath, open, type DB } from '@op-engineering/op-sqlite';
|
|
2
2
|
import {
|
|
3
3
|
BaseObserver,
|
|
4
4
|
ConnectionPool,
|
|
@@ -8,9 +8,9 @@ import {
|
|
|
8
8
|
DBLockOptions,
|
|
9
9
|
QueryResult,
|
|
10
10
|
Transaction,
|
|
11
|
-
|
|
11
|
+
timeoutSignal,
|
|
12
|
+
Semaphore
|
|
12
13
|
} from '@powersync/common';
|
|
13
|
-
import { Mutex } from 'async-mutex';
|
|
14
14
|
import { Platform } from 'react-native';
|
|
15
15
|
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
16
16
|
import { SqliteOptions } from './SqliteOptions';
|
|
@@ -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:
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
87
|
+
underlyingWriteConnection.registerListener({
|
|
92
88
|
tablesUpdated: (notification) => this.iterateListeners((cb) => cb.tablesUpdated?.(notification))
|
|
93
89
|
});
|
|
94
90
|
|
|
95
|
-
|
|
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
|
-
|
|
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,90 +154,81 @@ 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
157
|
|
|
160
|
-
this.writeConnection!.
|
|
161
|
-
this.readConnections!.
|
|
158
|
+
const { item: writeConnection, release: returnWrite } = await this.writeConnection!.requestOne();
|
|
159
|
+
const { items: readers, release: returnReaders } = await this.readConnections!.requestAll();
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
writeConnection.close();
|
|
163
|
+
readers.forEach((c) => c.close());
|
|
164
|
+
} finally {
|
|
165
|
+
returnWrite();
|
|
166
|
+
returnReaders();
|
|
167
|
+
}
|
|
162
168
|
}
|
|
163
169
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
}
|
|
170
|
+
private generateNestedAbortSignal(options?: DBLockOptions) {
|
|
171
|
+
const outerSignal = this.abortController.signal;
|
|
172
|
+
let signal: AbortSignal;
|
|
173
|
+
let cleanUpInnerSignal: (() => void) | undefined;
|
|
174
|
+
|
|
175
|
+
if (options?.timeoutMs && !outerSignal.aborted) {
|
|
176
|
+
// This is essentially an AbortSignal.any() polyfill.
|
|
177
|
+
const innerController = new AbortController();
|
|
178
|
+
cleanUpInnerSignal = () => {
|
|
179
|
+
innerController.abort();
|
|
180
|
+
outerSignal.removeEventListener('abort', cleanUpInnerSignal!);
|
|
181
|
+
timeout.removeEventListener('abort', cleanUpInnerSignal!);
|
|
187
182
|
};
|
|
188
183
|
|
|
189
|
-
|
|
190
|
-
|
|
184
|
+
outerSignal.addEventListener('abort', cleanUpInnerSignal);
|
|
185
|
+
const timeout = timeoutSignal(options.timeoutMs);
|
|
186
|
+
timeout.addEventListener('abort', cleanUpInnerSignal);
|
|
187
|
+
|
|
188
|
+
signal = innerController.signal;
|
|
189
|
+
} else {
|
|
190
|
+
signal = outerSignal;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return { signal, cleanUpInnerSignal };
|
|
191
194
|
}
|
|
192
195
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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);
|
|
201
|
+
try {
|
|
202
|
+
return await fn(item);
|
|
203
|
+
} finally {
|
|
204
|
+
release();
|
|
205
|
+
cleanUpInnerSignal?.();
|
|
199
206
|
}
|
|
200
207
|
}
|
|
201
208
|
|
|
202
209
|
async writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
203
210
|
await this.initialized;
|
|
204
211
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
await mutexRunExclusive(
|
|
214
|
-
this.writeMutex,
|
|
215
|
-
async () => {
|
|
216
|
-
// Check if operation was aborted before executing
|
|
217
|
-
if (this.abortController.signal.aborted) {
|
|
218
|
-
reject(new Error('Database connection was closed'));
|
|
219
|
-
}
|
|
220
|
-
resolve(await fn(this.writeConnection!));
|
|
221
|
-
},
|
|
222
|
-
options
|
|
223
|
-
);
|
|
224
|
-
// flush updates once a write lock has been released
|
|
225
|
-
this.writeConnection!.flushUpdates();
|
|
226
|
-
} catch (ex) {
|
|
227
|
-
reject(ex);
|
|
228
|
-
} finally {
|
|
229
|
-
this.abortController.signal.removeEventListener('abort', abortListener);
|
|
230
|
-
}
|
|
231
|
-
});
|
|
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
|
+
}
|
|
232
220
|
}
|
|
233
221
|
|
|
234
222
|
async refreshSchema(): Promise<void> {
|
|
235
223
|
await this.initialized;
|
|
236
|
-
await this.
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
for (let readConnection of
|
|
240
|
-
await readConnection.
|
|
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();
|
|
241
229
|
}
|
|
230
|
+
} finally {
|
|
231
|
+
release();
|
|
242
232
|
}
|
|
243
233
|
}
|
|
244
234
|
}
|