@powersync/web 2.1.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/index.react_native_web.js +212 -92
  2. package/dist/index.react_native_web.js.map +1 -1
  3. package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +1 -1
  4. package/dist/worker/FacadeVFS-d1ZDvud7.js.map +1 -1
  5. package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +1 -1
  6. package/dist/worker/MemoryVFS-DVJL5F8j.js.map +1 -1
  7. package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js.map +1 -1
  8. package/dist/worker/OPFSWriteAheadVFS-Rt5CGCZP.js +2 -0
  9. package/dist/worker/OPFSWriteAheadVFS-Rt5CGCZP.js.map +1 -0
  10. package/dist/worker/mc-wa-sqlite-DDFgWP93.js.map +1 -1
  11. package/dist/worker/mc-wa-sqlite-async-lGclTjKJ.js.map +1 -1
  12. package/dist/worker/wa-sqlite-B0tZMM0j.js.map +1 -1
  13. package/dist/worker/wa-sqlite-async-CM6BmfRh.js.map +1 -1
  14. package/dist/worker/worker.js +1 -1
  15. package/dist/worker/worker.js.map +1 -1
  16. package/lib/db/PowerSyncDatabase.js +16 -11
  17. package/lib/db/PowerSyncDatabase.js.map +1 -1
  18. package/lib/db/adapters/AsyncWebAdapter.js +4 -55
  19. package/lib/db/adapters/AsyncWebAdapter.js.map +1 -1
  20. package/lib/db/adapters/acquireFromPool.d.ts +7 -0
  21. package/lib/db/adapters/acquireFromPool.js +60 -0
  22. package/lib/db/adapters/acquireFromPool.js.map +1 -0
  23. package/lib/db/adapters/memory-pool/client.d.ts +70 -0
  24. package/lib/db/adapters/memory-pool/client.js +269 -0
  25. package/lib/db/adapters/memory-pool/client.js.map +1 -0
  26. package/lib/db/adapters/memory-pool/shared.d.ts +51 -0
  27. package/lib/db/adapters/memory-pool/shared.js +16 -0
  28. package/lib/db/adapters/memory-pool/shared.js.map +1 -0
  29. package/lib/db/adapters/memory-pool/vfs.d.ts +19 -0
  30. package/lib/db/adapters/memory-pool/vfs.js +247 -0
  31. package/lib/db/adapters/memory-pool/vfs.js.map +1 -0
  32. package/lib/db/adapters/memory-pool/worker.d.ts +1 -0
  33. package/lib/db/adapters/memory-pool/worker.js +45 -0
  34. package/lib/db/adapters/memory-pool/worker.js.map +1 -0
  35. package/lib/db/adapters/options.d.ts +7 -0
  36. package/lib/db/adapters/options.js.map +1 -1
  37. package/lib/db/adapters/wa-sqlite/RawSqliteConnection.d.ts +8 -0
  38. package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js +56 -5
  39. package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -1
  40. package/lib/db/adapters/wa-sqlite/StatementCache.d.ts +16 -0
  41. package/lib/db/adapters/wa-sqlite/StatementCache.js +44 -0
  42. package/lib/db/adapters/wa-sqlite/StatementCache.js.map +1 -0
  43. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +7 -4
  44. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -1
  45. package/lib/worker/db/MultiDatabaseServer.d.ts +1 -2
  46. package/lib/worker/db/MultiDatabaseServer.js +28 -17
  47. package/lib/worker/db/MultiDatabaseServer.js.map +1 -1
  48. package/package.json +13 -6
  49. package/src/db/PowerSyncDatabase.ts +18 -11
  50. package/src/db/adapters/AsyncWebAdapter.ts +13 -61
  51. package/src/db/adapters/acquireFromPool.ts +73 -0
  52. package/src/db/adapters/memory-pool/client.ts +367 -0
  53. package/src/db/adapters/memory-pool/shared.ts +79 -0
  54. package/src/db/adapters/memory-pool/vfs.ts +293 -0
  55. package/src/db/adapters/memory-pool/worker.ts +53 -0
  56. package/src/db/adapters/options.ts +8 -0
  57. package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +71 -6
  58. package/src/db/adapters/wa-sqlite/StatementCache.ts +50 -0
  59. package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +17 -5
  60. package/src/worker/db/MultiDatabaseServer.ts +29 -21
  61. package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js +0 -2
  62. package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +0 -1
@@ -102,27 +102,32 @@ export class WebPowerSyncDatabase extends BasePowerSyncDatabase {
102
102
  identifier: this.database.name,
103
103
  logger: this.logger
104
104
  };
105
- switch (true) {
106
- case this.resolvedOpenOptions.ssrMode:
107
- return new SSRStreamingSyncImplementation();
108
- case this.resolvedOpenOptions.enableMultiTabs:
109
- if (!this.enableBroadcastLogs) {
110
- const warning = `
105
+ if (this.resolvedOpenOptions.ssrMode) {
106
+ return new SSRStreamingSyncImplementation();
107
+ }
108
+ else if (this.resolvedOpenOptions.enableMultiTabs) {
109
+ if (!this.enableBroadcastLogs) {
110
+ const warning = `
111
111
  Multiple tabs are enabled, but broadcasting of logs is disabled.
112
112
  Logs for shared sync worker will only be available in the shared worker context
113
113
  `;
114
- const logger = this.options.logger;
115
- logger ? logger.log({ level: LogLevels.warn, message: warning }) : console.warn(warning);
116
- }
114
+ const logger = this.options.logger;
115
+ logger ? logger.log({ level: LogLevels.warn, message: warning }) : console.warn(warning);
116
+ }
117
+ if ('shareConnection' in this.database) {
117
118
  return new SharedWebStreamingSyncImplementation({
118
119
  ...syncOptions,
119
120
  db: this.database, // This should always be the case
120
121
  logLevel: this.options.sync?.logLevel ?? LogLevels.info,
121
122
  enableBroadcastLogs: this.enableBroadcastLogs
122
123
  });
123
- default:
124
- return new TabLocalStreamingSyncImplementation(syncOptions);
124
+ }
125
+ this.logger.log({
126
+ level: LogLevels.warn,
127
+ message: "Not using a shared sync worker because the database adapter doesn't support it."
128
+ });
125
129
  }
130
+ return new TabLocalStreamingSyncImplementation(syncOptions);
126
131
  }
127
132
  }
128
133
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"PowerSyncDatabase.js","sourceRoot":"","sources":["../../src/db/PowerSyncDatabase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PowerSyncDatabase.js","sourceRoot":"","sources":["../../src/db/PowerSyncDatabase.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EAMV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,qBAAqB,EAGrB,KAAK,EACL,mBAAmB,EAGnB,YAAY,EACb,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAElF,OAAO,EAAE,8BAA8B,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,oCAAoC,EAAE,MAAM,gDAAgD,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,mCAAmC,EAAE,MAAM,+CAA+C,CAAC;AAiCpG;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,qBAAkD;IAC1F,MAAM,CAAC,YAAY,GAAG,IAAI,KAAK,EAAE,CAAC;IAExB,mBAAmB,CAAyB;IAC5C,mBAAmB,CAAU;IAEvC,YAAY,OAAoC;QAC9C,MAAM,mBAAmB,GAAG,yBAAyB,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAErG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QAC/C,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,QAAQ,YAAY,cAAc,EAAE,CAAC;YAC5C;;;;eAIG;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,4FAA4F;QAC5F,IAAI,OAAQ,IAAI,CAAC,QAAyB,CAAC,gBAAgB,IAAI,UAAU,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAI,IAAI,CAAC,QAAyB,CAAC,gBAAgB,EAAE,CAAC;YAClE,IAAI,MAAM,CAAC,0BAA0B,EAAE,CAAC;gBACtC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;oBAC/B,mBAAmB,EAAE,IAAI;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAES,4BAA4B;QACpC,OAAO;YACL,yDAAyD;YACzD,YAAY,EAAE,+BAA+B;SAC9C,CAAC;IACJ,CAAC;IAEkB,aAAa;QAC9B,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YAC5C,MAAM,cAAc,GAAG,IAAI,mBAAmB,CAAC;gBAC7C,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;YACH,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAA+B;QACnC,OAAO,KAAK,CAAC,KAAK,CAAC;YACjB,2DAA2D;YAC3D,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,eAAe;SAC7E,CAAC,CAAC;IACL,CAAC;IAES,KAAK,CAAC,WAAW;QACzB,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAES,KAAK,CAAC,wBAAwB;QACtC,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,OAAO,KAAK,CAAC,wBAAwB,EAAE,CAAC;IAC1C,CAAC;IAES,4BAA4B;QACpC,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAES,KAAK,CAAC,YAAY,CAAI,EAAoB;QAClD,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO,oBAAoB,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,iBAAiB,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC;IAES,gCAAgC,CACxC,SAAoC,EACpC,OAAwC;QAExC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,WAAW,GAA0C;YACzD,GAAI,IAAI,CAAC,OAAc;YACvB,GAAG,OAAO;YACV,OAAO,EAAE,IAAI,CAAC,oBAAoB;YAClC,MAAM;YACN,UAAU,EAAE,KAAK,IAAI,EAAE;gBACrB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1B,MAAM,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;YACD,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;QAEF,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO,IAAI,8BAA8B,EAAE,CAAC;QAC9C,CAAC;aAAM,IAAI,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG;;;WAGb,CAAC;gBACJ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBACnC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3F,CAAC;YAED,IAAI,iBAAiB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvC,OAAO,IAAI,oCAAoC,CAAC;oBAC9C,GAAG,WAAW;oBACd,EAAE,EAAE,IAAI,CAAC,QAAwB,EAAE,iCAAiC;oBACpE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC,IAAI;oBACvD,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;iBAC9C,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBACd,KAAK,EAAE,SAAS,CAAC,IAAI;gBACrB,OAAO,EAAE,iFAAiF;aAC3F,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,mCAAmC,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC;;AAEH;;;;;;;;;;;;;GAaG;AACH,yFAAyF;AACzF,MAAM,CAAC,MAAM,iBAAiB,GAA8D,oBAAoB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { DBAdapter } from '@powersync/common';
2
2
  import { Mutex, Semaphore } from '@powersync/shared-internals';
3
+ import { acquireFromPool } from './acquireFromPool.js';
3
4
  /**
4
5
  * A connection pool implementation delegating to another pool opened asynchronnously.
5
6
  */
@@ -95,61 +96,9 @@ function readWritePoolState(writer, readers) {
95
96
  return {
96
97
  writer,
97
98
  async withConnection(allowReadOnly, fn, options) {
98
- const abortController = new AbortController();
99
- const abortSignal = abortController.signal;
100
- let timeout = null;
101
- let release;
102
- if (options?.timeoutMs) {
103
- timeout = setTimeout(() => abortController.abort('requesting database timed out'), options.timeoutMs);
104
- }
105
- try {
106
- if (allowReadOnly) {
107
- let connection;
108
- // Even if we have a pool of read connections, it's typically very small and we assume that most queries are
109
- // reads. So, we want to request any connection from the read pool and the dedicated write connection (which
110
- // can also serve reads). We race for the first connection we can obtain this way, and then abort the other
111
- // request.
112
- [connection, release] = await new Promise((resolve, reject) => {
113
- let didComplete = false;
114
- function complete() {
115
- didComplete = true;
116
- abortController.abort();
117
- }
118
- function completeSuccess(connection, returnFn) {
119
- if (didComplete) {
120
- // We're not going to use this connection, so return it immediately.
121
- returnFn();
122
- }
123
- else {
124
- complete();
125
- resolve([connection, returnFn]);
126
- }
127
- }
128
- function completeError(error) {
129
- // We either have a working connection already, or we've rejected the promise. Either way, we don't need
130
- // to do either thing again.
131
- if (didComplete)
132
- return;
133
- complete();
134
- reject(error);
135
- }
136
- writerMutex.acquire(abortSignal).then((unlock) => completeSuccess(writer, unlock), completeError);
137
- readerSemaphore
138
- .requestOne(abortSignal)
139
- .then(({ item, release }) => completeSuccess(item, release), completeError);
140
- });
141
- return await connection.readLock(fn);
142
- }
143
- else {
144
- return await writerMutex.runExclusive(() => writer.writeLock(fn), abortSignal);
145
- }
146
- }
147
- finally {
148
- if (timeout != null) {
149
- clearTimeout(timeout);
150
- }
151
- release?.();
152
- }
99
+ return acquireFromPool(writerMutex, writer, readerSemaphore, (connection) => {
100
+ return allowReadOnly ? connection.readLock(fn) : connection.writeLock(fn);
101
+ }, options, allowReadOnly);
153
102
  },
154
103
  async close() {
155
104
  await writer.close();
@@ -1 +1 @@
1
- {"version":3,"file":"AsyncWebAdapter.js","sourceRoot":"","sources":["../../../src/db/adapters/AsyncWebAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AsyncWebAdapter.js","sourceRoot":"","sources":["../../../src/db/adapters/AsyncWebAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { DBLockOptions } from '@powersync/common';
2
+ import type { Mutex, Semaphore } from '@powersync/shared-internals';
3
+ /**
4
+ * Internal helper function to acquire a connection from a pool that has a designated writer, additional readers, and
5
+ * also allows dispatching reads to the writer.
6
+ */
7
+ export declare function acquireFromPool<Connection, Res>(writerMutex: Mutex, writer: Connection, readers: Semaphore<Connection> | undefined, callback: (connection: Connection) => Promise<Res>, options: DBLockOptions | undefined, allowReadOnly: boolean): Promise<Res>;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Internal helper function to acquire a connection from a pool that has a designated writer, additional readers, and
3
+ * also allows dispatching reads to the writer.
4
+ */
5
+ export async function acquireFromPool(writerMutex, writer, readers, callback, options, allowReadOnly) {
6
+ const abortController = new AbortController();
7
+ const abortSignal = abortController.signal;
8
+ let timeout = null;
9
+ let release;
10
+ if (options?.timeoutMs) {
11
+ timeout = setTimeout(() => abortController.abort('requesting database timed out'), options.timeoutMs);
12
+ }
13
+ try {
14
+ if (allowReadOnly) {
15
+ let connection;
16
+ // Even if we have a pool of read connections, it's typically very small and we assume that most queries are
17
+ // reads. So, we want to request any connection from the read pool and the dedicated write connection (which
18
+ // can also serve reads). We race for the first connection we can obtain this way, and then abort the other
19
+ // request.
20
+ [connection, release] = await new Promise((resolve, reject) => {
21
+ let didComplete = false;
22
+ function complete() {
23
+ didComplete = true;
24
+ abortController.abort();
25
+ }
26
+ function completeSuccess(connection, returnFn) {
27
+ if (didComplete) {
28
+ // We're not going to use this connection, so return it immediately.
29
+ returnFn();
30
+ }
31
+ else {
32
+ complete();
33
+ resolve([connection, returnFn]);
34
+ }
35
+ }
36
+ function completeError(error) {
37
+ // We either have a working connection already, or we've rejected the promise. Either way, we don't need
38
+ // to do either thing again.
39
+ if (didComplete)
40
+ return;
41
+ complete();
42
+ reject(error);
43
+ }
44
+ writerMutex.acquire(abortSignal).then((unlock) => completeSuccess(writer, unlock), completeError);
45
+ readers?.requestOne(abortSignal).then(({ item, release }) => completeSuccess(item, release), completeError);
46
+ });
47
+ return await callback(connection);
48
+ }
49
+ else {
50
+ return await writerMutex.runExclusive(() => callback(writer), abortSignal);
51
+ }
52
+ }
53
+ finally {
54
+ if (timeout != null) {
55
+ clearTimeout(timeout);
56
+ }
57
+ release?.();
58
+ }
59
+ }
60
+ //# sourceMappingURL=acquireFromPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acquireFromPool.js","sourceRoot":"","sources":["../../../src/db/adapters/acquireFromPool.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAkB,EAClB,MAAkB,EAClB,OAA0C,EAC1C,QAAkD,EAClD,OAAkC,EAClC,aAAsB;IAEtB,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC;IAE3C,IAAI,OAAO,GAAQ,IAAI,CAAC;IACxB,IAAI,OAA6B,CAAC;IAClC,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;QACvB,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,+BAA+B,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,CAAC;QACH,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,UAAsB,CAAC;YAE3B,4GAA4G;YAC5G,4GAA4G;YAC5G,2GAA2G;YAC3G,WAAW;YACX,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACpF,IAAI,WAAW,GAAG,KAAK,CAAC;gBACxB,SAAS,QAAQ;oBACf,WAAW,GAAG,IAAI,CAAC;oBACnB,eAAe,CAAC,KAAK,EAAE,CAAC;gBAC1B,CAAC;gBAED,SAAS,eAAe,CAAC,UAAsB,EAAE,QAAkB;oBACjE,IAAI,WAAW,EAAE,CAAC;wBAChB,oEAAoE;wBACpE,QAAQ,EAAE,CAAC;oBACb,CAAC;yBAAM,CAAC;wBACN,QAAQ,EAAE,CAAC;wBACX,OAAO,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAED,SAAS,aAAa,CAAC,KAAc;oBACnC,wGAAwG;oBACxG,4BAA4B;oBAC5B,IAAI,WAAW;wBAAE,OAAO;oBAExB,QAAQ,EAAE,CAAC;oBACX,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;gBAED,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC;gBAClG,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;YAC9G,CAAC,CAAC,CAAC;YAEH,OAAO,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { DBAdapter, DBLockOptions, LockContext } from '@powersync/common';
2
+ import type { RawWaSqliteDatabaseOptions } from '../wa-sqlite/RawSqliteConnection.js';
3
+ /**
4
+ * Options for a {@link InMemoryWriteAheadLogPool}.
5
+ */
6
+ export interface InMemoryWriteAheadLogPoolOptions {
7
+ /**
8
+ * The amount of workers to use, must at least be `1`.
9
+ */
10
+ numWorkers: number;
11
+ /**
12
+ * Optional additional options used to configure how the database is opened in workers.
13
+ */
14
+ database?: Partial<RawWaSqliteDatabaseOptions>;
15
+ /**
16
+ * The maximum size of the database buffer, in bytes.
17
+ *
18
+ * This VFS uses a growable buffer, so not all of this is allocated immediately. By default, the VFS attempts to use
19
+ * 16 GB and falls back to 1 GB if that fails (e.g. on 32-bit platforms).
20
+ */
21
+ maxDatabaseSize?: number;
22
+ /**
23
+ * The maximum size of the write-ahead log, in bytes.
24
+ *
25
+ * The size of the write-ahead log constraints the amount of data that can be written in a single transaction.
26
+ *
27
+ * This VFS uses a growable buffer, so not all of this is allocated immediately. By default, the VFS attempts to use
28
+ * 1 GB.
29
+ */
30
+ maxWriteAheadLogSize?: number;
31
+ }
32
+ /**
33
+ * An in-memory database backed by a pool of workers.
34
+ *
35
+ * Multiple workers can execute readonly transactions in parallel, and a single writer is allowed to write to the
36
+ * database in parallel to readers. To allow multiple workers to access the same database, this is based on shared array
37
+ * buffers and requires the page to be [cross-origin isolated](https://web.dev/articles/cross-origin-isolation-guide).
38
+ *
39
+ * To use this VFS, pass it to the {@link PowerSyncDatabase} constructor:
40
+ *
41
+ * ```TypeScript
42
+ * import { PowerSyncDatabase, Schema } from '@powersync/web';
43
+ * import InMemoryWriteAheadLogPool from '@powersync/web/extra/shared-memory-pool';
44
+ *
45
+ * const db = new PowerSyncDatabase({
46
+ * opened: new InMemoryWriteAheadLogPool({numWorkers: 3}),
47
+ * schema: new Schema(...),
48
+ * });
49
+ * ```
50
+ *
51
+ * This database uses a concept known as a write-ahead log: Instead of writing changes directly to the database (which
52
+ * would cause conflicts with readers), the writer appends modified database pages into an append-only overlay log. When
53
+ * readers start a transaction, they consider the main database and items from the log until a specific position,
54
+ * meaning that future appends won't disrupt existing readers.
55
+ *
56
+ * To avoid the write-ahead log from growing indefinitely, it is regularly copied back into the main database file. This
57
+ * process is called a checkpoint, and in this implementation it blocks all other database access. However, it only
58
+ * needs to copy between memory and is usually fairly fast. This implementation checkpoints after a transaction
59
+ * completes and at least 10% of the WAL are used. We might fine-tune this later.
60
+ */
61
+ export declare class InMemoryWriteAheadLogPool extends DBAdapter {
62
+ #private;
63
+ readonly name: string;
64
+ constructor(options: InMemoryWriteAheadLogPoolOptions);
65
+ readLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T>;
66
+ writeLock<T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions): Promise<T>;
67
+ refreshSchema(): Promise<void>;
68
+ close(): Promise<void>;
69
+ }
70
+ export default InMemoryWriteAheadLogPool;
@@ -0,0 +1,269 @@
1
+ import * as Comlink from 'comlink';
2
+ import { DBAdapter, LockContext, queryResultWithoutRows } from '@powersync/common';
3
+ import { applyWalChanges, emptyWalState } from './shared.js';
4
+ import { Mutex, Semaphore } from '@powersync/shared-internals';
5
+ import { acquireFromPool } from '../acquireFromPool.js';
6
+ function createWriteAheadLogBuffers(options) {
7
+ const gigabyte = 1024 * 1024 * 1024;
8
+ let database;
9
+ if (options.maxDatabaseSize) {
10
+ database = new SharedArrayBuffer(0, { maxByteLength: options.maxDatabaseSize });
11
+ }
12
+ else {
13
+ try {
14
+ database = new SharedArrayBuffer(0, { maxByteLength: 16 * gigabyte });
15
+ }
16
+ catch {
17
+ database = new SharedArrayBuffer(0, { maxByteLength: 1 * gigabyte });
18
+ }
19
+ }
20
+ return {
21
+ database,
22
+ writeAheadLog: new SharedArrayBuffer(0, { maxByteLength: options.maxWriteAheadLogSize ?? 1 * gigabyte })
23
+ };
24
+ }
25
+ /**
26
+ * An in-memory database backed by a pool of workers.
27
+ *
28
+ * Multiple workers can execute readonly transactions in parallel, and a single writer is allowed to write to the
29
+ * database in parallel to readers. To allow multiple workers to access the same database, this is based on shared array
30
+ * buffers and requires the page to be [cross-origin isolated](https://web.dev/articles/cross-origin-isolation-guide).
31
+ *
32
+ * To use this VFS, pass it to the {@link PowerSyncDatabase} constructor:
33
+ *
34
+ * ```TypeScript
35
+ * import { PowerSyncDatabase, Schema } from '@powersync/web';
36
+ * import InMemoryWriteAheadLogPool from '@powersync/web/extra/shared-memory-pool';
37
+ *
38
+ * const db = new PowerSyncDatabase({
39
+ * opened: new InMemoryWriteAheadLogPool({numWorkers: 3}),
40
+ * schema: new Schema(...),
41
+ * });
42
+ * ```
43
+ *
44
+ * This database uses a concept known as a write-ahead log: Instead of writing changes directly to the database (which
45
+ * would cause conflicts with readers), the writer appends modified database pages into an append-only overlay log. When
46
+ * readers start a transaction, they consider the main database and items from the log until a specific position,
47
+ * meaning that future appends won't disrupt existing readers.
48
+ *
49
+ * To avoid the write-ahead log from growing indefinitely, it is regularly copied back into the main database file. This
50
+ * process is called a checkpoint, and in this implementation it blocks all other database access. However, it only
51
+ * needs to copy between memory and is usually fairly fast. This implementation checkpoints after a transaction
52
+ * completes and at least 10% of the WAL are used. We might fine-tune this later.
53
+ */
54
+ export class InMemoryWriteAheadLogPool extends DBAdapter {
55
+ // Note that this name is also used as an identifier for sync navigator locks, so we want it to be unique. As there is
56
+ // no persistence, the name is not configurable and serves no other purpose.
57
+ name = `in-memory-${crypto.randomUUID()}`;
58
+ #buffers;
59
+ // There is nothing that tells the read and write workers apart, and we will use a write worker for reads too. But we
60
+ // must have a single designated write worker, because sync state is stored on the connection and the sync client
61
+ // relies on this.
62
+ #readers;
63
+ #underlyingReaders = [];
64
+ #writer;
65
+ #writeLock = new Mutex();
66
+ #walState = emptyWalState();
67
+ #checkpointThreshold;
68
+ constructor(options) {
69
+ super();
70
+ if (options.numWorkers < 1) {
71
+ throw new Error('Need at least one worker');
72
+ }
73
+ this.#buffers = createWriteAheadLogBuffers(options);
74
+ this.#checkpointThreshold = this.#buffers.writeAheadLog.maxByteLength / 10;
75
+ this.#writer = new PoolWorker(this.#buffers, options.database ?? {});
76
+ for (let i = 0; i < options.numWorkers - 1; i++) {
77
+ this.#underlyingReaders.push(new PoolWorker(this.#buffers, options.database ?? {}));
78
+ }
79
+ if (this.#underlyingReaders.length) {
80
+ this.#readers = new Semaphore(this.#underlyingReaders);
81
+ }
82
+ }
83
+ async #withWorker(allowReadOnly, fn, lockOptions) {
84
+ return acquireFromPool(this.#writeLock, this.#writer, this.#readers, async (worker) => {
85
+ await worker.pushWalState();
86
+ return await fn(worker);
87
+ }, lockOptions, allowReadOnly);
88
+ }
89
+ readLock(fn, options) {
90
+ return this.#withWorker(true, fn, options);
91
+ }
92
+ /**
93
+ * Moves data from the write-ahead log overlay into the main database file.
94
+ *
95
+ * This may only be called with the writers and all readers locked.
96
+ */
97
+ #checkpoint(changes) {
98
+ const walBuffer = this.#buffers.writeAheadLog;
99
+ const databaseBuffer = this.#buffers.database;
100
+ const newFileSize = changes.fileSize;
101
+ // Note: Checkpointing can fail (e.g. due to us exceeding the max db size), in which case we must tell the
102
+ // writer to drop the WAL changes it has made to consistently roll back the failure after throwing.
103
+ try {
104
+ if (databaseBuffer.byteLength < newFileSize) {
105
+ databaseBuffer.grow(newFileSize);
106
+ }
107
+ function copyFromWal(dbOffset, overlayEntry) {
108
+ const source = new Uint8Array(walBuffer, overlayEntry.logOffset, overlayEntry.size);
109
+ new Uint8Array(databaseBuffer, dbOffset).set(source);
110
+ }
111
+ // Checkpoint existing entries from previous writes.
112
+ for (const [pageOffset, overlayEntry] of this.#walState.overlay.entries()) {
113
+ copyFromWal(pageOffset, overlayEntry);
114
+ }
115
+ // Checkpoint changes from the last writeLock call that haven't been applied yet.
116
+ for (let i = 0; i < changes.added.length; i += 2) {
117
+ const dbOffset = changes.added[i];
118
+ const walEntry = changes.added[i + 1];
119
+ copyFromWal(dbOffset, walEntry);
120
+ }
121
+ }
122
+ catch (e) {
123
+ // Checkpointing failed, reset the state in the write worker to the local state here.
124
+ const allEntries = [];
125
+ this.#walState.overlay.forEach((entry, offset) => allEntries.push(offset, entry));
126
+ this.#writer.addChanges({
127
+ cleared: true,
128
+ fileSize: this.#walState.fileSize,
129
+ walEnd: this.#walState.walEnd,
130
+ added: allEntries
131
+ });
132
+ throw e;
133
+ }
134
+ // Checkpoint complete, inform all workers to reset their WAL view when they're used again.
135
+ const cleared = { cleared: true, fileSize: newFileSize, walEnd: 0, added: [] };
136
+ applyWalChanges(this.#walState, cleared);
137
+ this.#writer.addChanges(cleared);
138
+ for (const worker of this.#underlyingReaders) {
139
+ worker.addChanges(cleared);
140
+ }
141
+ }
142
+ /**
143
+ * Propagates WAL additions from the writer to other workers, checkpointing if necessary.
144
+ *
145
+ * The caller must hold the write lock for the duration of the call.
146
+ */
147
+ async #propagateChangesFromWriter(writer) {
148
+ const changes = await writer.takeWalChanges();
149
+ if (changes.walEnd > this.#checkpointThreshold) {
150
+ // Instead of applying these changes to the local overlay and other workers, checkpoint! This can't run
151
+ // concurrently with anything else, so acquire read workers workers (we already have the write lock when this
152
+ // gets called).
153
+ const acquiredReaders = await this.#readers?.requestAll();
154
+ try {
155
+ this.#checkpoint(changes);
156
+ }
157
+ finally {
158
+ acquiredReaders?.release();
159
+ }
160
+ }
161
+ else {
162
+ // No checkpoint necessary, just forward WAL changes to other workers.
163
+ applyWalChanges(this.#walState, changes);
164
+ for (const otherWorker of this.#underlyingReaders) {
165
+ otherWorker.addChanges(changes);
166
+ }
167
+ }
168
+ }
169
+ writeLock(fn, options) {
170
+ return this.#withWorker(false, // Don't allow read-only connection
171
+ async (worker) => {
172
+ try {
173
+ const res = await fn(worker);
174
+ const { rawRows: [[updates]] } = await worker.executeRaw(`SELECT powersync_update_hooks('get')`);
175
+ const updatedTables = JSON.parse(updates);
176
+ if (updatedTables.length) {
177
+ const notification = { tables: updatedTables };
178
+ this.iterateListeners((l) => l.tablesUpdated?.(notification));
179
+ }
180
+ return res;
181
+ }
182
+ finally {
183
+ await this.#propagateChangesFromWriter(worker);
184
+ }
185
+ }, options);
186
+ }
187
+ async refreshSchema() {
188
+ // We only have to refresh readers, as the schema change itself was made on the write connection.
189
+ if (this.#readers) {
190
+ const { items, release } = await this.#readers.requestAll();
191
+ try {
192
+ await Promise.all(items.map(async (worker) => {
193
+ await worker.pushWalState();
194
+ await worker.executeRaw("pragma table_info('sqlite_master')");
195
+ }));
196
+ }
197
+ finally {
198
+ release();
199
+ }
200
+ }
201
+ }
202
+ async close() {
203
+ const releaseWriter = await this.#writeLock.acquire();
204
+ const readers = await this.#readers?.requestAll();
205
+ await Promise.race([this.#writer.close(), ...(readers?.items ?? []).map((e) => e.close())]);
206
+ releaseWriter();
207
+ readers?.release();
208
+ }
209
+ }
210
+ export default InMemoryWriteAheadLogPool;
211
+ class PoolWorker extends LockContext {
212
+ #buffers;
213
+ #options;
214
+ #worker;
215
+ #server;
216
+ #isInitialized = false;
217
+ #outstandingChanges = null;
218
+ constructor(buffers, options) {
219
+ super();
220
+ this.#buffers = buffers;
221
+ this.#options = options;
222
+ this.#worker = new Worker(new URL('./worker.js', import.meta.url), { type: 'module' });
223
+ this.#worker.onerror = (e) => {
224
+ console.error('Worker error', e);
225
+ };
226
+ this.#server = Comlink.wrap(this.#worker);
227
+ }
228
+ addChanges(changes) {
229
+ if (changes.cleared) {
230
+ this.#outstandingChanges = { fileSize: changes.fileSize, walEnd: 0, cleared: true, added: [] };
231
+ }
232
+ else {
233
+ const outstandingChanges = (this.#outstandingChanges ??= { fileSize: 0, walEnd: 0, added: [], cleared: false });
234
+ outstandingChanges.fileSize = changes.fileSize;
235
+ outstandingChanges.walEnd = changes.walEnd;
236
+ outstandingChanges.added.push(...changes.added);
237
+ }
238
+ }
239
+ async pushWalState() {
240
+ if (!this.#isInitialized) {
241
+ await this.#server.open(this.#buffers, this.#options);
242
+ this.#isInitialized = true;
243
+ }
244
+ const pending = this.#outstandingChanges;
245
+ if (pending) {
246
+ this.#outstandingChanges = null;
247
+ await this.#server.updateWalState(pending);
248
+ }
249
+ }
250
+ takeWalChanges() {
251
+ return this.#server.takeWalChanges();
252
+ }
253
+ executeRaw(query, params) {
254
+ return this.#server.executeRaw(query, params);
255
+ }
256
+ async executeBatch(query, params) {
257
+ const results = await this.#server.executeBatch(query, params ?? []);
258
+ const result = { insertId: undefined, rowsAffected: 0 };
259
+ for (const source of results) {
260
+ result.insertId = source.insertId;
261
+ result.rowsAffected = (result.rowsAffected ?? 0) + source.rowsAffected;
262
+ }
263
+ return queryResultWithoutRows(result);
264
+ }
265
+ close() {
266
+ this.#worker.terminate();
267
+ }
268
+ }
269
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/db/adapters/memory-pool/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { RawQueryResult } from '@powersync/common';
2
+ import type { RawWaSqliteDatabaseOptions, RawWebResult } from '../wa-sqlite/RawSqliteConnection.js';
3
+ export interface WriteAheadBuffers {
4
+ database: SharedArrayBuffer;
5
+ writeAheadLog: SharedArrayBuffer;
6
+ }
7
+ export interface WriteAheadState {
8
+ /**
9
+ * Length of the main database file.
10
+ */
11
+ fileSize: number;
12
+ walEnd: number;
13
+ /**
14
+ * A map of database position offsets to offsets in the WAL logs at which position contents of the page are stored.
15
+ */
16
+ overlay: Map<number, WalOverlayEntry>;
17
+ }
18
+ export interface WalOverlayEntry {
19
+ logOffset: number;
20
+ size: number;
21
+ }
22
+ export interface WalIndexChange {
23
+ fileSize: number;
24
+ walEnd: number;
25
+ /**
26
+ * New overlay entries to add, encoded as (key, value) pairs of {@link WriteAheadState.overlay}.
27
+ */
28
+ added: (number | WalOverlayEntry)[];
29
+ /**
30
+ * Whether to clear the overlay (meaning that we ran a checkpoint).
31
+ */
32
+ cleared: boolean;
33
+ }
34
+ export interface DatabaseServer {
35
+ /**
36
+ * Open a database connection from the given database and write-ahead log buffers.
37
+ */
38
+ open(buffers: WriteAheadBuffers, options: Partial<RawWaSqliteDatabaseOptions>): Promise<void>;
39
+ /**
40
+ * Push new wal changes to this worker.
41
+ */
42
+ updateWalState(overlay: WalIndexChange): Promise<void>;
43
+ executeRaw(query: string, params?: any[] | undefined): Promise<RawQueryResult>;
44
+ executeBatch(query: string, params?: any[][] | undefined): Promise<RawWebResult[]>;
45
+ /**
46
+ * Takes WAL changes made by this worker during its active write iteration.
47
+ */
48
+ takeWalChanges(): Promise<WalIndexChange>;
49
+ }
50
+ export declare function emptyWalState(): WriteAheadState;
51
+ export declare function applyWalChanges(state: WriteAheadState, changes: WalIndexChange): void;