@powersync/common 0.0.0-dev-20260311081226 → 0.0.0-dev-20260414110516
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 +775 -485
- package/dist/bundle.cjs.map +1 -1
- package/dist/bundle.mjs +769 -481
- package/dist/bundle.mjs.map +1 -1
- package/dist/bundle.node.cjs +773 -484
- package/dist/bundle.node.cjs.map +1 -1
- package/dist/bundle.node.mjs +767 -480
- package/dist/bundle.node.mjs.map +1 -1
- package/dist/index.d.cts +175 -94
- package/lib/attachments/AttachmentQueue.d.ts +10 -4
- package/lib/attachments/AttachmentQueue.js +10 -4
- package/lib/attachments/AttachmentQueue.js.map +1 -1
- package/lib/attachments/AttachmentService.js +2 -3
- package/lib/attachments/AttachmentService.js.map +1 -1
- package/lib/attachments/SyncingService.d.ts +2 -1
- package/lib/attachments/SyncingService.js +4 -5
- package/lib/attachments/SyncingService.js.map +1 -1
- package/lib/client/AbstractPowerSyncDatabase.d.ts +5 -1
- package/lib/client/AbstractPowerSyncDatabase.js +9 -5
- package/lib/client/AbstractPowerSyncDatabase.js.map +1 -1
- package/lib/client/sync/stream/AbstractRemote.d.ts +29 -8
- package/lib/client/sync/stream/AbstractRemote.js +154 -177
- package/lib/client/sync/stream/AbstractRemote.js.map +1 -1
- package/lib/client/sync/stream/AbstractStreamingSyncImplementation.d.ts +1 -0
- package/lib/client/sync/stream/AbstractStreamingSyncImplementation.js +69 -88
- package/lib/client/sync/stream/AbstractStreamingSyncImplementation.js.map +1 -1
- package/lib/client/triggers/TriggerManager.d.ts +12 -1
- package/lib/client/triggers/TriggerManagerImpl.d.ts +2 -2
- package/lib/client/triggers/TriggerManagerImpl.js +3 -2
- package/lib/client/triggers/TriggerManagerImpl.js.map +1 -1
- package/lib/db/DBAdapter.d.ts +55 -9
- package/lib/db/DBAdapter.js +126 -0
- package/lib/db/DBAdapter.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +0 -1
- package/lib/index.js.map +1 -1
- package/lib/utils/async.d.ts +0 -9
- package/lib/utils/async.js +0 -9
- package/lib/utils/async.js.map +1 -1
- package/lib/utils/mutex.d.ts +47 -5
- package/lib/utils/mutex.js +146 -21
- package/lib/utils/mutex.js.map +1 -1
- package/lib/utils/queue.d.ts +16 -0
- package/lib/utils/queue.js +42 -0
- package/lib/utils/queue.js.map +1 -0
- package/lib/utils/stream_transform.d.ts +39 -0
- package/lib/utils/stream_transform.js +206 -0
- package/lib/utils/stream_transform.js.map +1 -0
- package/package.json +9 -8
- package/src/attachments/AttachmentQueue.ts +10 -4
- package/src/attachments/AttachmentService.ts +2 -3
- package/src/attachments/README.md +6 -4
- package/src/attachments/SyncingService.ts +4 -5
- package/src/client/AbstractPowerSyncDatabase.ts +9 -5
- package/src/client/sync/stream/AbstractRemote.ts +182 -206
- package/src/client/sync/stream/AbstractStreamingSyncImplementation.ts +82 -83
- package/src/client/triggers/TriggerManager.ts +13 -1
- package/src/client/triggers/TriggerManagerImpl.ts +4 -2
- package/src/db/DBAdapter.ts +167 -9
- package/src/index.ts +1 -1
- package/src/utils/async.ts +0 -11
- package/src/utils/mutex.ts +184 -26
- package/src/utils/queue.ts +48 -0
- package/src/utils/stream_transform.ts +252 -0
- package/lib/utils/DataStream.d.ts +0 -62
- package/lib/utils/DataStream.js +0 -169
- package/lib/utils/DataStream.js.map +0 -1
- package/src/utils/DataStream.ts +0 -222
package/lib/db/DBAdapter.js
CHANGED
|
@@ -2,6 +2,49 @@
|
|
|
2
2
|
* Set of generic interfaces to allow PowerSync compatibility with
|
|
3
3
|
* different SQLite DB implementations.
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* Implements {@link DBGetUtils} on a {@link SqlRunner}.
|
|
7
|
+
*/
|
|
8
|
+
export function DBGetUtilsDefaultMixin(Base) {
|
|
9
|
+
return class extends Base {
|
|
10
|
+
async getAll(sql, parameters) {
|
|
11
|
+
const res = await this.execute(sql, parameters);
|
|
12
|
+
return res.rows?._array ?? [];
|
|
13
|
+
}
|
|
14
|
+
async getOptional(sql, parameters) {
|
|
15
|
+
const res = await this.execute(sql, parameters);
|
|
16
|
+
return res.rows?.item(0) ?? null;
|
|
17
|
+
}
|
|
18
|
+
async get(sql, parameters) {
|
|
19
|
+
const res = await this.execute(sql, parameters);
|
|
20
|
+
const first = res.rows?.item(0);
|
|
21
|
+
if (!first) {
|
|
22
|
+
throw new Error('Result set is empty');
|
|
23
|
+
}
|
|
24
|
+
return first;
|
|
25
|
+
}
|
|
26
|
+
async executeBatch(query, params = []) {
|
|
27
|
+
// If this context can run batch statements natively, use that.
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
if (super.executeBatch) {
|
|
30
|
+
// @ts-ignore
|
|
31
|
+
return super.executeBatch(query, params);
|
|
32
|
+
}
|
|
33
|
+
// Emulate executeBatch by running statements individually.
|
|
34
|
+
let lastInsertId;
|
|
35
|
+
let rowsAffected = 0;
|
|
36
|
+
for (const set of params) {
|
|
37
|
+
const result = await this.execute(query, set);
|
|
38
|
+
lastInsertId = result.insertId;
|
|
39
|
+
rowsAffected += result.rowsAffected;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
rowsAffected,
|
|
43
|
+
insertId: lastInsertId
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
5
48
|
/**
|
|
6
49
|
* Update table operation numbers from SQLite
|
|
7
50
|
*/
|
|
@@ -11,6 +54,89 @@ export var RowUpdateType;
|
|
|
11
54
|
RowUpdateType[RowUpdateType["SQLITE_DELETE"] = 9] = "SQLITE_DELETE";
|
|
12
55
|
RowUpdateType[RowUpdateType["SQLITE_UPDATE"] = 23] = "SQLITE_UPDATE";
|
|
13
56
|
})(RowUpdateType || (RowUpdateType = {}));
|
|
57
|
+
/**
|
|
58
|
+
* A mixin to implement {@link DBAdapter} by delegating to {@link ConnectionPool.readLock} and
|
|
59
|
+
* {@link ConnectionPool.writeLock}.
|
|
60
|
+
*/
|
|
61
|
+
export function DBAdapterDefaultMixin(Base) {
|
|
62
|
+
return class extends Base {
|
|
63
|
+
readTransaction(fn, options) {
|
|
64
|
+
return this.readLock((ctx) => TransactionImplementation.runWith(ctx, fn), options);
|
|
65
|
+
}
|
|
66
|
+
writeTransaction(fn, options) {
|
|
67
|
+
return this.writeLock((ctx) => TransactionImplementation.runWith(ctx, fn), options);
|
|
68
|
+
}
|
|
69
|
+
getAll(sql, parameters) {
|
|
70
|
+
return this.readLock((ctx) => ctx.getAll(sql, parameters));
|
|
71
|
+
}
|
|
72
|
+
getOptional(sql, parameters) {
|
|
73
|
+
return this.readLock((ctx) => ctx.getOptional(sql, parameters));
|
|
74
|
+
}
|
|
75
|
+
get(sql, parameters) {
|
|
76
|
+
return this.readLock((ctx) => ctx.get(sql, parameters));
|
|
77
|
+
}
|
|
78
|
+
execute(query, params) {
|
|
79
|
+
return this.writeLock((ctx) => ctx.execute(query, params));
|
|
80
|
+
}
|
|
81
|
+
executeRaw(query, params) {
|
|
82
|
+
return this.writeLock((ctx) => ctx.executeRaw(query, params));
|
|
83
|
+
}
|
|
84
|
+
executeBatch(query, params) {
|
|
85
|
+
return this.writeTransaction((tx) => tx.executeBatch(query, params));
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
class BaseTransaction {
|
|
90
|
+
inner;
|
|
91
|
+
finalized = false;
|
|
92
|
+
constructor(inner) {
|
|
93
|
+
this.inner = inner;
|
|
94
|
+
}
|
|
95
|
+
async commit() {
|
|
96
|
+
if (this.finalized) {
|
|
97
|
+
return { rowsAffected: 0 };
|
|
98
|
+
}
|
|
99
|
+
this.finalized = true;
|
|
100
|
+
return this.inner.execute('COMMIT');
|
|
101
|
+
}
|
|
102
|
+
async rollback() {
|
|
103
|
+
if (this.finalized) {
|
|
104
|
+
return { rowsAffected: 0 };
|
|
105
|
+
}
|
|
106
|
+
this.finalized = true;
|
|
107
|
+
return this.inner.execute('ROLLBACK');
|
|
108
|
+
}
|
|
109
|
+
execute(query, params) {
|
|
110
|
+
return this.inner.execute(query, params);
|
|
111
|
+
}
|
|
112
|
+
executeRaw(query, params) {
|
|
113
|
+
return this.inner.executeRaw(query, params);
|
|
114
|
+
}
|
|
115
|
+
executeBatch(query, params) {
|
|
116
|
+
return this.inner.executeBatch(query, params);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
class TransactionImplementation extends DBGetUtilsDefaultMixin(BaseTransaction) {
|
|
120
|
+
static async runWith(ctx, fn) {
|
|
121
|
+
let tx = new TransactionImplementation(ctx);
|
|
122
|
+
try {
|
|
123
|
+
await ctx.execute('BEGIN IMMEDIATE');
|
|
124
|
+
const result = await fn(tx);
|
|
125
|
+
await tx.commit();
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
catch (ex) {
|
|
129
|
+
try {
|
|
130
|
+
await tx.rollback();
|
|
131
|
+
}
|
|
132
|
+
catch (ex2) {
|
|
133
|
+
// In rare cases, a rollback may fail.
|
|
134
|
+
// Safe to ignore.
|
|
135
|
+
}
|
|
136
|
+
throw ex;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
14
140
|
export function isBatchedUpdateNotification(update) {
|
|
15
141
|
return 'tables' in update;
|
|
16
142
|
}
|
package/lib/db/DBAdapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DBAdapter.js","sourceRoot":"","sources":["../../src/db/DBAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"DBAdapter.js","sourceRoot":"","sources":["../../src/db/DBAdapter.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -55,8 +55,8 @@ export * from './client/watched/WatchedQuery.js';
|
|
|
55
55
|
export * from './utils/AbortOperation.js';
|
|
56
56
|
export * from './utils/BaseObserver.js';
|
|
57
57
|
export * from './utils/ControlledExecutor.js';
|
|
58
|
-
export * from './utils/DataStream.js';
|
|
59
58
|
export * from './utils/Logger.js';
|
|
60
59
|
export * from './utils/mutex.js';
|
|
61
60
|
export * from './utils/parseQuery.js';
|
|
61
|
+
export type { SimpleAsyncIterator } from './utils/stream_transform.js';
|
|
62
62
|
export * from './types/types.js';
|
package/lib/index.js
CHANGED
|
@@ -54,7 +54,6 @@ export * from './client/watched/WatchedQuery.js';
|
|
|
54
54
|
export * from './utils/AbortOperation.js';
|
|
55
55
|
export * from './utils/BaseObserver.js';
|
|
56
56
|
export * from './utils/ControlledExecutor.js';
|
|
57
|
-
export * from './utils/DataStream.js';
|
|
58
57
|
export * from './utils/Logger.js';
|
|
59
58
|
export * from './utils/mutex.js';
|
|
60
59
|
export * from './utils/parseQuery.js';
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,wCAAwC,CAAC;AAEvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAA+B,MAAM,kCAAkC,CAAC;AACrG,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8CAA8C,CAAC;AAC7D,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAE,SAAS,EAAQ,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAChF,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AACnD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,6DAA6D,CAAC;AAC5E,cAAc,8CAA8C,CAAC;AAC7D,cAAc,+BAA+B,CAAC;AAE9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAA0B,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACjF,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAC9F,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,cAAc,iCAAiC,CAAC;AAChD,cAAc,uDAAuD,CAAC;AACtE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,2DAA2D,CAAC;AAC1E,cAAc,uDAAuD,CAAC;AACtE,cAAc,kCAAkC,CAAC;AAEjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,wCAAwC,CAAC;AAEvD,cAAc,uCAAuC,CAAC;AACtD,cAAc,0CAA0C,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAA+B,MAAM,kCAAkC,CAAC;AACrG,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8CAA8C,CAAC;AAC7D,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAE,SAAS,EAAQ,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAChF,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AACnD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,6DAA6D,CAAC;AAC5E,cAAc,8CAA8C,CAAC;AAC7D,cAAc,+BAA+B,CAAC;AAE9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAA0B,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACjF,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,4BAA4B,EAAE,MAAM,gDAAgD,CAAC;AAC9F,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,cAAc,iCAAiC,CAAC;AAChD,cAAc,uDAAuD,CAAC;AACtE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,2DAA2D,CAAC;AAC1E,cAAc,uDAAuD,CAAC;AACtE,cAAc,kCAAkC,CAAC;AAEjD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,kBAAkB,CAAC"}
|
package/lib/utils/async.d.ts
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A ponyfill for `Symbol.asyncIterator` that is compatible with the
|
|
3
|
-
* [recommended polyfill](https://github.com/Azure/azure-sdk-for-js/blob/%40azure/core-asynciterator-polyfill_1.0.2/sdk/core/core-asynciterator-polyfill/src/index.ts#L4-L6)
|
|
4
|
-
* we recommend for React Native.
|
|
5
|
-
*
|
|
6
|
-
* As long as we use this symbol (instead of `for await` and `async *`) in this package, we can be compatible with async
|
|
7
|
-
* iterators without requiring them.
|
|
8
|
-
*/
|
|
9
|
-
export declare const symbolAsyncIterator: typeof Symbol.asyncIterator;
|
|
10
1
|
/**
|
|
11
2
|
* Throttle a function to be called at most once every "wait" milliseconds,
|
|
12
3
|
* on the trailing edge.
|
package/lib/utils/async.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A ponyfill for `Symbol.asyncIterator` that is compatible with the
|
|
3
|
-
* [recommended polyfill](https://github.com/Azure/azure-sdk-for-js/blob/%40azure/core-asynciterator-polyfill_1.0.2/sdk/core/core-asynciterator-polyfill/src/index.ts#L4-L6)
|
|
4
|
-
* we recommend for React Native.
|
|
5
|
-
*
|
|
6
|
-
* As long as we use this symbol (instead of `for await` and `async *`) in this package, we can be compatible with async
|
|
7
|
-
* iterators without requiring them.
|
|
8
|
-
*/
|
|
9
|
-
export const symbolAsyncIterator = Symbol.asyncIterator ?? Symbol.for('Symbol.asyncIterator');
|
|
10
1
|
/**
|
|
11
2
|
* Throttle a function to be called at most once every "wait" milliseconds,
|
|
12
3
|
* on the trailing edge.
|
package/lib/utils/async.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/utils/async.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/utils/async.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,IAAY;IAC7D,IAAI,SAAS,GAAyC,IAAI,CAAC;IAE3D,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,EAAE,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAgB,EAAE,IAAY;IACpE,IAAI,SAAS,GAAyC,IAAI,CAAC;IAC3D,IAAI,YAAY,GAAW,CAAC,CAAC;IAE7B,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,EAAE,CAAC;QACP,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO;QACL,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;QAE/C,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,wEAAwE;YACxE,cAAc,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACtB,yDAAyD;YACzD,SAAS,GAAG,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/lib/utils/mutex.d.ts
CHANGED
|
@@ -1,7 +1,49 @@
|
|
|
1
|
-
|
|
1
|
+
export type UnlockFn = () => void;
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* An asynchronous semaphore implementation with associated items per lease.
|
|
4
|
+
*
|
|
5
|
+
* @internal This class is meant to be used in PowerSync SDKs only, and is not part of the public API.
|
|
4
6
|
*/
|
|
5
|
-
export declare
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
export declare class Semaphore<T> {
|
|
8
|
+
private readonly available;
|
|
9
|
+
readonly size: number;
|
|
10
|
+
private firstWaiter?;
|
|
11
|
+
private lastWaiter?;
|
|
12
|
+
constructor(elements: Iterable<T>);
|
|
13
|
+
private addWaiter;
|
|
14
|
+
private deactivateWaiter;
|
|
15
|
+
private requestPermits;
|
|
16
|
+
/**
|
|
17
|
+
* Requests a single item from the pool.
|
|
18
|
+
*
|
|
19
|
+
* The returned `release` callback must be invoked to return the item into the pool.
|
|
20
|
+
*/
|
|
21
|
+
requestOne(abort?: AbortSignal): Promise<{
|
|
22
|
+
item: T;
|
|
23
|
+
release: UnlockFn;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Requests access to all items from the pool.
|
|
27
|
+
*
|
|
28
|
+
* The returned `release` callback must be invoked to return items into the pool.
|
|
29
|
+
*/
|
|
30
|
+
requestAll(abort?: AbortSignal): Promise<{
|
|
31
|
+
items: T[];
|
|
32
|
+
release: UnlockFn;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* An asynchronous mutex implementation.
|
|
37
|
+
*
|
|
38
|
+
* @internal This class is meant to be used in PowerSync SDKs only, and is not part of the public API.
|
|
39
|
+
*/
|
|
40
|
+
export declare class Mutex {
|
|
41
|
+
private inner;
|
|
42
|
+
acquire(abort?: AbortSignal): Promise<UnlockFn>;
|
|
43
|
+
runExclusive<T>(fn: () => PromiseLike<T> | T, abort?: AbortSignal): Promise<T>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Creates a signal aborting after the set timeout.
|
|
47
|
+
*/
|
|
48
|
+
export declare function timeoutSignal(timeout: number): AbortSignal;
|
|
49
|
+
export declare function timeoutSignal(timeout?: number): AbortSignal | undefined;
|
package/lib/utils/mutex.js
CHANGED
|
@@ -1,29 +1,154 @@
|
|
|
1
|
+
import { Queue } from './queue.js';
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
+
* An asynchronous semaphore implementation with associated items per lease.
|
|
4
|
+
*
|
|
5
|
+
* @internal This class is meant to be used in PowerSync SDKs only, and is not part of the public API.
|
|
3
6
|
*/
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
export class Semaphore {
|
|
8
|
+
// Available items that are not currently assigned to a waiter.
|
|
9
|
+
available;
|
|
10
|
+
size;
|
|
11
|
+
// Linked list of waiters. We don't expect the wait list to become particularly large, and this allows removing
|
|
12
|
+
// aborted waiters from the middle of the list efficiently.
|
|
13
|
+
firstWaiter;
|
|
14
|
+
lastWaiter;
|
|
15
|
+
constructor(elements) {
|
|
16
|
+
this.available = new Queue(elements);
|
|
17
|
+
this.size = this.available.length;
|
|
18
|
+
}
|
|
19
|
+
addWaiter(requestedItems, onAcquire) {
|
|
20
|
+
const node = {
|
|
21
|
+
isActive: true,
|
|
22
|
+
acquiredItems: [],
|
|
23
|
+
remainingItems: requestedItems,
|
|
24
|
+
onAcquire,
|
|
25
|
+
prev: this.lastWaiter
|
|
26
|
+
};
|
|
27
|
+
if (this.lastWaiter) {
|
|
28
|
+
this.lastWaiter.next = node;
|
|
29
|
+
this.lastWaiter = node;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// First waiter
|
|
33
|
+
this.lastWaiter = this.firstWaiter = node;
|
|
34
|
+
}
|
|
35
|
+
return node;
|
|
36
|
+
}
|
|
37
|
+
deactivateWaiter(waiter) {
|
|
38
|
+
const { prev, next } = waiter;
|
|
39
|
+
waiter.isActive = false;
|
|
40
|
+
if (prev)
|
|
41
|
+
prev.next = next;
|
|
42
|
+
if (next)
|
|
43
|
+
next.prev = prev;
|
|
44
|
+
if (waiter == this.firstWaiter)
|
|
45
|
+
this.firstWaiter = next;
|
|
46
|
+
if (waiter == this.lastWaiter)
|
|
47
|
+
this.lastWaiter = prev;
|
|
48
|
+
}
|
|
49
|
+
requestPermits(amount, abort) {
|
|
50
|
+
if (amount <= 0 || amount > this.size) {
|
|
51
|
+
throw new Error(`Invalid amount of items requested (${amount}), must be between 1 and ${this.size}`);
|
|
52
|
+
}
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
function rejectAborted() {
|
|
55
|
+
reject(abort?.reason ?? new Error('Semaphore acquire aborted'));
|
|
17
56
|
}
|
|
18
|
-
if (
|
|
19
|
-
return;
|
|
20
|
-
try {
|
|
21
|
-
resolve(await callback());
|
|
57
|
+
if (abort?.aborted) {
|
|
58
|
+
return rejectAborted();
|
|
22
59
|
}
|
|
23
|
-
|
|
24
|
-
|
|
60
|
+
let waiter;
|
|
61
|
+
const markCompleted = () => {
|
|
62
|
+
const items = waiter.acquiredItems;
|
|
63
|
+
waiter.acquiredItems = []; // Avoid releasing items twice.
|
|
64
|
+
for (const element of items) {
|
|
65
|
+
// Give to next waiter, if possible.
|
|
66
|
+
const nextWaiter = this.firstWaiter;
|
|
67
|
+
if (nextWaiter) {
|
|
68
|
+
nextWaiter.acquiredItems.push(element);
|
|
69
|
+
nextWaiter.remainingItems--;
|
|
70
|
+
if (nextWaiter.remainingItems == 0) {
|
|
71
|
+
nextWaiter.onAcquire();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// No pending waiter, return lease into pool.
|
|
76
|
+
this.available.addLast(element);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const onAbort = () => {
|
|
81
|
+
abort?.removeEventListener('abort', onAbort);
|
|
82
|
+
if (waiter.isActive) {
|
|
83
|
+
this.deactivateWaiter(waiter);
|
|
84
|
+
rejectAborted();
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const resolvePromise = () => {
|
|
88
|
+
this.deactivateWaiter(waiter);
|
|
89
|
+
abort?.removeEventListener('abort', onAbort);
|
|
90
|
+
const items = waiter.acquiredItems;
|
|
91
|
+
resolve({ items, release: markCompleted });
|
|
92
|
+
};
|
|
93
|
+
waiter = this.addWaiter(amount, resolvePromise);
|
|
94
|
+
// If there are items in the pool that haven't been assigned, we can pull them into this waiter. Note that this is
|
|
95
|
+
// only the case if we're the first waiter (otherwise, items would have been assigned to an earlier waiter).
|
|
96
|
+
while (!this.available.isEmpty && waiter.remainingItems > 0) {
|
|
97
|
+
waiter.acquiredItems.push(this.available.removeFirst());
|
|
98
|
+
waiter.remainingItems--;
|
|
25
99
|
}
|
|
100
|
+
if (waiter.remainingItems == 0) {
|
|
101
|
+
return resolvePromise();
|
|
102
|
+
}
|
|
103
|
+
abort?.addEventListener('abort', onAbort);
|
|
26
104
|
});
|
|
27
|
-
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Requests a single item from the pool.
|
|
108
|
+
*
|
|
109
|
+
* The returned `release` callback must be invoked to return the item into the pool.
|
|
110
|
+
*/
|
|
111
|
+
async requestOne(abort) {
|
|
112
|
+
const { items, release } = await this.requestPermits(1, abort);
|
|
113
|
+
return { release, item: items[0] };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Requests access to all items from the pool.
|
|
117
|
+
*
|
|
118
|
+
* The returned `release` callback must be invoked to return items into the pool.
|
|
119
|
+
*/
|
|
120
|
+
requestAll(abort) {
|
|
121
|
+
return this.requestPermits(this.size, abort);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* An asynchronous mutex implementation.
|
|
126
|
+
*
|
|
127
|
+
* @internal This class is meant to be used in PowerSync SDKs only, and is not part of the public API.
|
|
128
|
+
*/
|
|
129
|
+
export class Mutex {
|
|
130
|
+
inner = new Semaphore([null]);
|
|
131
|
+
async acquire(abort) {
|
|
132
|
+
const { release } = await this.inner.requestOne(abort);
|
|
133
|
+
return release;
|
|
134
|
+
}
|
|
135
|
+
async runExclusive(fn, abort) {
|
|
136
|
+
const returnMutex = await this.acquire(abort);
|
|
137
|
+
try {
|
|
138
|
+
return await fn();
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
returnMutex();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export function timeoutSignal(timeout) {
|
|
146
|
+
if (timeout == null)
|
|
147
|
+
return;
|
|
148
|
+
if ('timeout' in AbortSignal)
|
|
149
|
+
return AbortSignal.timeout(timeout);
|
|
150
|
+
const controller = new AbortController();
|
|
151
|
+
setTimeout(() => controller.abort(new Error('Timeout waiting for lock')), timeout);
|
|
152
|
+
return controller.signal;
|
|
28
153
|
}
|
|
29
154
|
//# sourceMappingURL=mutex.js.map
|
package/lib/utils/mutex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../src/utils/mutex.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../src/utils/mutex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simple fixed-capacity queue implementation.
|
|
3
|
+
*
|
|
4
|
+
* Unlike a naive queue implemented by `array.push()` and `array.shift()`, this avoids moving array elements around
|
|
5
|
+
* and is `O(1)` for {@link addLast} and {@link removeFirst}.
|
|
6
|
+
*/
|
|
7
|
+
export declare class Queue<T> {
|
|
8
|
+
private table;
|
|
9
|
+
private head;
|
|
10
|
+
private _length;
|
|
11
|
+
constructor(initialItems: Iterable<T>);
|
|
12
|
+
get isEmpty(): boolean;
|
|
13
|
+
get length(): number;
|
|
14
|
+
removeFirst(): T;
|
|
15
|
+
addLast(element: T): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simple fixed-capacity queue implementation.
|
|
3
|
+
*
|
|
4
|
+
* Unlike a naive queue implemented by `array.push()` and `array.shift()`, this avoids moving array elements around
|
|
5
|
+
* and is `O(1)` for {@link addLast} and {@link removeFirst}.
|
|
6
|
+
*/
|
|
7
|
+
export class Queue {
|
|
8
|
+
table;
|
|
9
|
+
// Index of the first element in the table.
|
|
10
|
+
head;
|
|
11
|
+
// Amount of items currently in the queue.
|
|
12
|
+
_length;
|
|
13
|
+
constructor(initialItems) {
|
|
14
|
+
this.table = [...initialItems];
|
|
15
|
+
this.head = 0;
|
|
16
|
+
this._length = this.table.length;
|
|
17
|
+
}
|
|
18
|
+
get isEmpty() {
|
|
19
|
+
return this.length == 0;
|
|
20
|
+
}
|
|
21
|
+
get length() {
|
|
22
|
+
return this._length;
|
|
23
|
+
}
|
|
24
|
+
removeFirst() {
|
|
25
|
+
if (this.isEmpty) {
|
|
26
|
+
throw new Error('Queue is empty');
|
|
27
|
+
}
|
|
28
|
+
const result = this.table[this.head];
|
|
29
|
+
this._length--;
|
|
30
|
+
this.table[this.head] = undefined;
|
|
31
|
+
this.head = (this.head + 1) % this.table.length;
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
addLast(element) {
|
|
35
|
+
if (this.length == this.table.length) {
|
|
36
|
+
throw new Error('Queue is full');
|
|
37
|
+
}
|
|
38
|
+
this.table[(this.head + this._length) % this.table.length] = element;
|
|
39
|
+
this._length++;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/utils/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,KAAK;IACR,KAAK,CAAoB;IACjC,2CAA2C;IACnC,IAAI,CAAS;IACrB,0CAA0C;IAClC,OAAO,CAAS;IAExB,YAAY,YAAyB;QACnC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACnC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAM,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,OAAU;QAChB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;QACrE,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An async iterator that can't be cancelled.
|
|
3
|
+
*
|
|
4
|
+
* To keep data flow simple, we always pass an explicit cancellation token when subscribing to async streams. Once the
|
|
5
|
+
* {@link AbortSignal} aborts, iterators are supposed to clean up and then emit a final `{done: true}` event. This means
|
|
6
|
+
* that there's no way to distinguish between streams that have completed normally and streams that have been cancelled,
|
|
7
|
+
* but that is acceptable for our uses of this.
|
|
8
|
+
*/
|
|
9
|
+
export type SimpleAsyncIterator<T> = Pick<AsyncIterator<T>, 'next'>;
|
|
10
|
+
export declare const doneResult: IteratorReturnResult<any>;
|
|
11
|
+
export declare function valueResult<T>(value: T): {
|
|
12
|
+
done: boolean;
|
|
13
|
+
value: T;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* A variant of {@link Array.map} for async iterators.
|
|
17
|
+
*/
|
|
18
|
+
export declare function map<T1, T2>(source: SimpleAsyncIterator<T1>, map: (source: T1) => T2): SimpleAsyncIterator<T2>;
|
|
19
|
+
export interface InjectableIterator<T> extends SimpleAsyncIterator<T> {
|
|
20
|
+
inject(event: T): void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Expands a source async iterator by allowing to inject events asynchronously.
|
|
24
|
+
*
|
|
25
|
+
* The resulting iterator will emit all events from its source. Additionally though, events can be injected. These
|
|
26
|
+
* events are dropped once the main iterator completes, but are otherwise forwarded.
|
|
27
|
+
*
|
|
28
|
+
* The iterator completes when its source completes, and it supports backpressure by only calling `next()` on the source
|
|
29
|
+
* in response to a `next()` call from downstream if no pending injected events can be dispatched.
|
|
30
|
+
*/
|
|
31
|
+
export declare function injectable<T>(source: SimpleAsyncIterator<T>): InjectableIterator<T>;
|
|
32
|
+
/**
|
|
33
|
+
* Splits a byte stream at line endings, emitting each line as a string.
|
|
34
|
+
*/
|
|
35
|
+
export declare function extractJsonLines(source: SimpleAsyncIterator<Uint8Array>, decoder: TextDecoder): SimpleAsyncIterator<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Splits a concatenated stream of BSON objects by emitting individual objects.
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractBsonObjects(source: SimpleAsyncIterator<Uint8Array>): SimpleAsyncIterator<Uint8Array>;
|