@powersync/web 0.0.0-dev-20260503073249 → 0.0.0-dev-20260630141119

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 (201) hide show
  1. package/bin/powersync.cjs +1 -1
  2. package/dist/index.react_native_web.js +1879 -0
  3. package/dist/index.react_native_web.js.map +1 -0
  4. package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js +2 -0
  5. package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +1 -0
  6. package/dist/worker/FacadeVFS-d1ZDvud7.js +2 -0
  7. package/dist/worker/FacadeVFS-d1ZDvud7.js.map +1 -0
  8. package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js +2 -0
  9. package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +1 -0
  10. package/dist/worker/OPFSCoopSyncVFS-DRKedN0p.js +2 -0
  11. package/dist/worker/OPFSCoopSyncVFS-DRKedN0p.js.map +1 -0
  12. package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js +2 -0
  13. package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +1 -0
  14. package/dist/worker/mc-wa-sqlite-DiBqIVE5.js +2 -0
  15. package/dist/worker/mc-wa-sqlite-DiBqIVE5.js.map +1 -0
  16. package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js +2 -0
  17. package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js.map +1 -0
  18. package/dist/worker/wa-sqlite-BlSx7-_P.js +2 -0
  19. package/dist/worker/wa-sqlite-BlSx7-_P.js.map +1 -0
  20. package/dist/worker/wa-sqlite-async-BdR24Ucf.js +2 -0
  21. package/dist/worker/wa-sqlite-async-BdR24Ucf.js.map +1 -0
  22. package/dist/worker/websockets-Q8W_lerF.js +9 -0
  23. package/dist/worker/websockets-Q8W_lerF.js.map +1 -0
  24. package/dist/worker/worker.js +7 -0
  25. package/dist/worker/worker.js.map +1 -0
  26. package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.js +1 -0
  27. package/lib/attachments/IndexDBFileSystemAdapter.js.map +1 -0
  28. package/lib/{src/db → db}/NavigatorTriggerClaimManager.d.ts +1 -1
  29. package/lib/{src/db → db}/NavigatorTriggerClaimManager.js +1 -0
  30. package/lib/db/NavigatorTriggerClaimManager.js.map +1 -0
  31. package/lib/db/PowerSyncDatabase.d.ts +67 -0
  32. package/lib/{src/db → db}/PowerSyncDatabase.js +48 -61
  33. package/lib/db/PowerSyncDatabase.js.map +1 -0
  34. package/lib/db/adapters/AsyncWebAdapter.d.ts +32 -0
  35. package/lib/{src/db → db}/adapters/AsyncWebAdapter.js +15 -14
  36. package/lib/db/adapters/AsyncWebAdapter.js.map +1 -0
  37. package/lib/db/adapters/SSRDBAdapter.d.ts +17 -0
  38. package/lib/db/adapters/SSRDBAdapter.js +37 -0
  39. package/lib/db/adapters/SSRDBAdapter.js.map +1 -0
  40. package/lib/{src/db → db}/adapters/WebDBAdapter.d.ts +1 -1
  41. package/lib/db/adapters/WebDBAdapter.js +2 -0
  42. package/lib/db/adapters/WebDBAdapter.js.map +1 -0
  43. package/lib/db/adapters/options.d.ts +87 -0
  44. package/lib/db/adapters/options.js +6 -0
  45. package/lib/db/adapters/options.js.map +1 -0
  46. package/lib/db/adapters/resolveAndValidateOptions.d.ts +5 -0
  47. package/lib/db/adapters/resolveAndValidateOptions.js +33 -0
  48. package/lib/db/adapters/resolveAndValidateOptions.js.map +1 -0
  49. package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.d.ts +3 -4
  50. package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.js +3 -2
  51. package/lib/db/adapters/wa-sqlite/ConcurrentConnection.js.map +1 -0
  52. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.d.ts +4 -4
  53. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.js +12 -37
  54. package/lib/db/adapters/wa-sqlite/DatabaseClient.js.map +1 -0
  55. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.d.ts +5 -5
  56. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.js +12 -7
  57. package/lib/db/adapters/wa-sqlite/DatabaseServer.js.map +1 -0
  58. package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.d.ts +22 -12
  59. package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.js +12 -10
  60. package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -0
  61. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +18 -0
  62. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +131 -0
  63. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -0
  64. package/lib/{src/db → db}/adapters/wa-sqlite/vfs.js +1 -0
  65. package/lib/db/adapters/wa-sqlite/vfs.js.map +1 -0
  66. package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.d.ts +4 -8
  67. package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.js +5 -11
  68. package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -0
  69. package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.d.ts +13 -15
  70. package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.js +32 -69
  71. package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -0
  72. package/lib/db/sync/WebRemote.d.ts +10 -0
  73. package/lib/db/sync/WebRemote.js +33 -0
  74. package/lib/db/sync/WebRemote.js.map +1 -0
  75. package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.d.ts +2 -4
  76. package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.js +4 -2
  77. package/lib/db/sync/WebStreamingSyncImplementation.js.map +1 -0
  78. package/lib/{src/db → db}/sync/userAgent.js +1 -0
  79. package/lib/db/sync/userAgent.js.map +1 -0
  80. package/lib/{src/index.d.ts → index.d.ts} +1 -3
  81. package/lib/{src/index.js → index.js} +2 -3
  82. package/lib/index.js.map +1 -0
  83. package/lib/{src/shared → shared}/navigator.js +1 -0
  84. package/lib/shared/navigator.js.map +1 -0
  85. package/lib/{src/shared → shared}/tab_close_signal.js +1 -0
  86. package/lib/shared/tab_close_signal.js.map +1 -0
  87. package/lib/worker/SharedWorkerConnectionRequest.d.ts +5 -0
  88. package/lib/worker/SharedWorkerConnectionRequest.js +2 -0
  89. package/lib/worker/SharedWorkerConnectionRequest.js.map +1 -0
  90. package/lib/worker/client.d.ts +15 -0
  91. package/lib/worker/client.js +77 -0
  92. package/lib/worker/client.js.map +1 -0
  93. package/lib/worker/db/MultiDatabaseServer.d.ts +22 -0
  94. package/lib/{src/worker → worker}/db/MultiDatabaseServer.js +26 -15
  95. package/lib/worker/db/MultiDatabaseServer.js.map +1 -0
  96. package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +13 -0
  97. package/lib/{src/worker → worker}/sync/AbstractSharedSyncClientProvider.js +1 -0
  98. package/lib/worker/sync/AbstractSharedSyncClientProvider.js.map +1 -0
  99. package/lib/worker/sync/BroadcastLogger.d.ts +27 -0
  100. package/lib/worker/sync/BroadcastLogger.js +65 -0
  101. package/lib/worker/sync/BroadcastLogger.js.map +1 -0
  102. package/lib/{src/worker → worker}/sync/SharedSyncImplementation.d.ts +11 -17
  103. package/lib/{src/worker → worker}/sync/SharedSyncImplementation.js +43 -51
  104. package/lib/worker/sync/SharedSyncImplementation.js.map +1 -0
  105. package/lib/{src/worker → worker}/sync/WorkerClient.d.ts +3 -4
  106. package/lib/{src/worker → worker}/sync/WorkerClient.js +3 -5
  107. package/lib/worker/sync/WorkerClient.js.map +1 -0
  108. package/lib/worker/worker.js +34 -0
  109. package/lib/worker/worker.js.map +1 -0
  110. package/package.json +23 -33
  111. package/src/db/NavigatorTriggerClaimManager.ts +1 -1
  112. package/src/db/PowerSyncDatabase.ts +80 -122
  113. package/src/db/adapters/AsyncWebAdapter.ts +17 -26
  114. package/src/db/adapters/SSRDBAdapter.ts +14 -64
  115. package/src/db/adapters/WebDBAdapter.ts +1 -1
  116. package/src/db/adapters/options.ts +100 -0
  117. package/src/db/adapters/resolveAndValidateOptions.ts +40 -0
  118. package/src/db/adapters/wa-sqlite/ConcurrentConnection.ts +4 -5
  119. package/src/db/adapters/wa-sqlite/DatabaseClient.ts +20 -56
  120. package/src/db/adapters/wa-sqlite/DatabaseServer.ts +15 -12
  121. package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +35 -24
  122. package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +63 -126
  123. package/src/db/sync/SSRWebStreamingSyncImplementation.ts +4 -22
  124. package/src/db/sync/SharedWebStreamingSyncImplementation.ts +38 -81
  125. package/src/db/sync/WebRemote.ts +23 -42
  126. package/src/db/sync/WebStreamingSyncImplementation.ts +4 -5
  127. package/src/index.ts +1 -3
  128. package/src/worker/SharedWorkerConnectionRequest.ts +6 -0
  129. package/src/worker/client.ts +100 -0
  130. package/src/worker/db/MultiDatabaseServer.ts +40 -22
  131. package/src/worker/sync/AbstractSharedSyncClientProvider.ts +4 -10
  132. package/src/worker/sync/BroadcastLogger.ts +35 -103
  133. package/src/worker/sync/SharedSyncImplementation.ts +62 -73
  134. package/src/worker/sync/WorkerClient.ts +4 -8
  135. package/src/worker/worker.ts +38 -0
  136. package/dist/index.umd.js +0 -12277
  137. package/dist/index.umd.js.map +0 -1
  138. package/dist/worker/SharedSyncImplementation.umd.js +0 -16655
  139. package/dist/worker/SharedSyncImplementation.umd.js.map +0 -1
  140. package/dist/worker/WASQLiteDB.umd.js +0 -17810
  141. package/dist/worker/WASQLiteDB.umd.js.map +0 -1
  142. package/dist/worker/node_modules_pnpm_bson_6_10_4_node_modules_bson_lib_bson_mjs.umd.js +0 -4646
  143. package/dist/worker/node_modules_pnpm_bson_6_10_4_node_modules_bson_lib_bson_mjs.umd.js.map +0 -1
  144. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7.umd.js +0 -31
  145. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-9af0a7.umd.js.map +0 -1
  146. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9.umd.js +0 -31
  147. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_mc-wa-s-bbf5a9.umd.js.map +0 -1
  148. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js +0 -31
  149. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqli-c26e0f.umd.js.map +0 -1
  150. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js +0 -31
  151. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_dist_wa-sqlite_mjs.umd.js.map +0 -1
  152. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js +0 -3562
  153. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js.map +0 -1
  154. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js +0 -2478
  155. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js.map +0 -1
  156. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js +0 -1681
  157. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js.map +0 -1
  158. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js +0 -1820
  159. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js.map +0 -1
  160. package/lib/package.json +0 -94
  161. package/lib/src/db/PowerSyncDatabase.d.ts +0 -78
  162. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.d.ts +0 -23
  163. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js +0 -26
  164. package/lib/src/db/adapters/AsyncWebAdapter.d.ts +0 -50
  165. package/lib/src/db/adapters/SSRDBAdapter.d.ts +0 -30
  166. package/lib/src/db/adapters/SSRDBAdapter.js +0 -68
  167. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +0 -45
  168. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +0 -145
  169. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.d.ts +0 -15
  170. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js +0 -21
  171. package/lib/src/db/adapters/web-sql-flags.d.ts +0 -92
  172. package/lib/src/db/adapters/web-sql-flags.js +0 -36
  173. package/lib/src/db/sync/WebRemote.d.ts +0 -9
  174. package/lib/src/db/sync/WebRemote.js +0 -44
  175. package/lib/src/worker/db/MultiDatabaseServer.d.ts +0 -17
  176. package/lib/src/worker/db/WASQLiteDB.worker.d.ts +0 -4
  177. package/lib/src/worker/db/WASQLiteDB.worker.js +0 -30
  178. package/lib/src/worker/db/open-worker-database.d.ts +0 -14
  179. package/lib/src/worker/db/open-worker-database.js +0 -52
  180. package/lib/src/worker/sync/AbstractSharedSyncClientProvider.d.ts +0 -19
  181. package/lib/src/worker/sync/BroadcastLogger.d.ts +0 -47
  182. package/lib/src/worker/sync/BroadcastLogger.js +0 -128
  183. package/lib/src/worker/sync/SharedSyncImplementation.worker.d.ts +0 -1
  184. package/lib/src/worker/sync/SharedSyncImplementation.worker.js +0 -11
  185. package/lib/tsconfig.tsbuildinfo +0 -1
  186. package/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts +0 -47
  187. package/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts +0 -24
  188. package/src/db/adapters/web-sql-flags.ts +0 -141
  189. package/src/worker/db/WASQLiteDB.worker.ts +0 -35
  190. package/src/worker/db/open-worker-database.ts +0 -62
  191. package/src/worker/sync/SharedSyncImplementation.worker.ts +0 -14
  192. /package/dist/{8e97452e297be23b5e50.wasm → worker/assets/mc-wa-sqlite-CnHbhWvs.wasm} +0 -0
  193. /package/dist/{2075a31bb151adbb9767.wasm → worker/assets/mc-wa-sqlite-async-D6idQS2r.wasm} +0 -0
  194. /package/dist/{3322bc84de986b63c2cd.wasm → worker/assets/wa-sqlite-XZW__iJk.wasm} +0 -0
  195. /package/dist/{fbc178b70d530e8ce02b.wasm → worker/assets/wa-sqlite-async-rHzzC98y.wasm} +0 -0
  196. /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.d.ts +0 -0
  197. /package/lib/{src/db → db}/adapters/wa-sqlite/vfs.d.ts +0 -0
  198. /package/lib/{src/db → db}/sync/userAgent.d.ts +0 -0
  199. /package/lib/{src/shared → shared}/navigator.d.ts +0 -0
  200. /package/lib/{src/shared → shared}/tab_close_signal.d.ts +0 -0
  201. /package/lib/{src/db/adapters/WebDBAdapter.js → worker/worker.d.ts} +0 -0
package/src/index.ts CHANGED
@@ -1,10 +1,8 @@
1
1
  export * from '@powersync/common';
2
2
  export * from './attachments/IndexDBFileSystemAdapter.js';
3
- export * from './db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js';
4
3
  export { WASQLiteVFS } from './db/adapters/wa-sqlite/vfs.js';
5
4
  export * from './db/adapters/wa-sqlite/WASQLiteOpenFactory.js';
6
- export * from './db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js';
7
- export * from './db/adapters/web-sql-flags.js';
5
+ export * from './db/adapters/options.js';
8
6
  export * from './db/PowerSyncDatabase.js';
9
7
  export * from './db/sync/SharedWebStreamingSyncImplementation.js';
10
8
  export * from './db/sync/WebRemote.js';
@@ -0,0 +1,6 @@
1
+ export type WorkerService = 'database' | 'sync';
2
+
3
+ export interface SharedWorkerConnectionRequest {
4
+ service: WorkerService;
5
+ port: MessagePort;
6
+ }
@@ -0,0 +1,100 @@
1
+ import { SharedWorkerConnectionRequest, WorkerService } from './SharedWorkerConnectionRequest.js';
2
+
3
+ export interface OpenWorkerOptions {
4
+ service: WorkerService;
5
+ databaseIdentifier: string;
6
+ customWorker?: string | URL;
7
+ shared: boolean;
8
+ }
9
+
10
+ export interface WorkerConnection {
11
+ endpoint: MessagePort | Worker;
12
+ worker: Worker | SharedWorker;
13
+ close: () => void;
14
+ }
15
+
16
+ export function connectToWorker({
17
+ service,
18
+ databaseIdentifier,
19
+ customWorker,
20
+ shared
21
+ }: OpenWorkerOptions): WorkerConnection {
22
+ const name = `${shared ? 'shared-' : ''}powersync-${databaseIdentifier}`;
23
+ let worker: Worker | SharedWorker;
24
+
25
+ if (customWorker) {
26
+ worker = shared
27
+ ? new SharedWorker(customWorker, {
28
+ /* @vite-ignore */
29
+ name,
30
+ type: 'module'
31
+ })
32
+ : new Worker(customWorker, {
33
+ /* @vite-ignore */
34
+ name,
35
+ type: 'module'
36
+ });
37
+ } else {
38
+ worker = spawnDefaultPowerSyncWorker(shared, name);
39
+ }
40
+
41
+ return connectToExistingWorker(worker, service);
42
+ }
43
+
44
+ /**
45
+ * Opens the default PowerSync worker.
46
+ *
47
+ * When users depend on the web SDK, we assume they use their own bundler (either vite or webpack). Both recognize the
48
+ * syntax of worker constructors with a string literal and will rewrite the URL as part of their bundling processes.
49
+ *
50
+ * React Native / Metro users can't rely on this on the web, as their app is not a JavaScript module and import.meta.url
51
+ * is not rewritten by Metro. For those users, we include a pre-bundled worker they can copy into a static assets
52
+ * directory and load with a custom URI. This also means that defaultWorker cannot work with Metro for React Native Web.
53
+ * We have a custom rollup plugin and conditional exports that replaces this function with a throwing stub for that
54
+ * platform. This allows a helpful error message.
55
+ */
56
+ // Note: When changing this function, also update disableDefaultWorkers in rollup.config.ts.
57
+ function spawnDefaultPowerSyncWorker(shared: boolean, name: string): Worker | SharedWorker {
58
+ return shared
59
+ ? new SharedWorker(new URL('./worker.js', import.meta.url), {
60
+ /* @vite-ignore */
61
+ name,
62
+ type: 'module'
63
+ })
64
+ : new Worker(new URL('./worker.js', import.meta.url), {
65
+ /* @vite-ignore */
66
+ name,
67
+ type: 'module'
68
+ });
69
+ }
70
+
71
+ export function connectToExistingWorker(worker: Worker | SharedWorker, service: WorkerService): WorkerConnection {
72
+ const isShared = isSharedWorker(worker);
73
+ if (isShared) {
74
+ const { port1, port2 } = new MessageChannel();
75
+ const mainPort = (worker as SharedWorker).port;
76
+ mainPort.start();
77
+ mainPort.postMessage({ port: port1, service } satisfies SharedWorkerConnectionRequest, [port1]);
78
+
79
+ port2.start();
80
+ return {
81
+ endpoint: port2,
82
+ worker,
83
+ close() {
84
+ port2.close();
85
+ }
86
+ };
87
+ } else {
88
+ return {
89
+ endpoint: worker as Worker,
90
+ worker,
91
+ close() {
92
+ worker.terminate();
93
+ }
94
+ };
95
+ }
96
+ }
97
+
98
+ export function isSharedWorker(worker: Worker | SharedWorker): worker is SharedWorker {
99
+ return 'port' in worker;
100
+ }
@@ -1,27 +1,38 @@
1
- import { ILogger } from '@powersync/common';
1
+ import { LogLevels, PowerSyncLogger } from '@powersync/common';
2
2
  import * as Comlink from 'comlink';
3
3
  import { ClientConnectionView, DatabaseServer } from '../../db/adapters/wa-sqlite/DatabaseServer.js';
4
- import {
5
- ResolvedWASQLiteOpenFactoryOptions,
6
- WorkerDBOpenerOptions
7
- } from '../../db/adapters/wa-sqlite/WASQLiteOpenFactory.js';
8
4
  import { getNavigatorLocks } from '../../shared/navigator.js';
9
- import { RawSqliteConnection } from '../../db/adapters/wa-sqlite/RawSqliteConnection.js';
5
+ import { RawSqliteConnection, RawWaSqliteDatabaseOptions } from '../../db/adapters/wa-sqlite/RawSqliteConnection.js';
10
6
  import { ConcurrentSqliteConnection } from '../../db/adapters/wa-sqlite/ConcurrentConnection.js';
11
7
 
12
8
  const OPEN_DB_LOCK = 'open-wasqlite-db';
13
9
 
10
+ export interface ConnectToMultiDatabaseServerOptions {
11
+ logLevel: number;
12
+ database: RawWaSqliteDatabaseOptions;
13
+ lockName: string;
14
+ }
15
+
14
16
  /**
15
17
  * Shared state to manage multiple database connections hosted by a worker.
16
18
  */
17
19
  export class MultiDatabaseServer {
18
20
  private activeDatabases = new Map<string, DatabaseServer>();
19
21
 
20
- constructor(readonly logger: ILogger) {}
22
+ constructor(readonly logger: PowerSyncLogger) {}
21
23
 
22
- async handleConnection(options: WorkerDBOpenerOptions): Promise<ClientConnectionView> {
23
- this.logger.setLevel(options.logLevel);
24
- return Comlink.proxy(await this.openConnectionLocally(options, options.lockName));
24
+ async handleConnection({
25
+ logLevel,
26
+ database,
27
+ lockName
28
+ }: ConnectToMultiDatabaseServerOptions): Promise<ClientConnectionView> {
29
+ const logger: PowerSyncLogger = {
30
+ log: (record) => {
31
+ if (record.level >= logLevel) this.logger.log(record);
32
+ }
33
+ };
34
+
35
+ return Comlink.proxy(await this.openConnectionLocally(logger, database, lockName));
25
36
  }
26
37
 
27
38
  async connectToExisting(name: string, lockName: string): Promise<ClientConnectionView> {
@@ -35,7 +46,7 @@ export class MultiDatabaseServer {
35
46
  });
36
47
  }
37
48
 
38
- async openConnectionLocally(options: ResolvedWASQLiteOpenFactoryOptions, lockName?: string) {
49
+ async openConnectionLocally(logger: PowerSyncLogger, options: RawWaSqliteDatabaseOptions, lockName?: string) {
39
50
  // Especially on Firefox, we're sometimes seeing "NoModificationAllowedError"s when opening OPFS databases we can
40
51
  // work around by retrying.
41
52
  const maxAttempts = 3;
@@ -43,28 +54,35 @@ export class MultiDatabaseServer {
43
54
 
44
55
  for (let count = 0; count < maxAttempts - 1; count++) {
45
56
  try {
46
- server = await this.databaseOpenAttempt(options);
47
- } catch (ex) {
48
- this.logger.warn(`Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`, ex);
57
+ server = await this.databaseOpenAttempt(logger, options);
58
+ } catch (error) {
59
+ this.logger.log({
60
+ level: LogLevels.warn,
61
+ message: `Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`,
62
+ error
63
+ });
49
64
  await new Promise((resolve) => setTimeout(resolve, 1000));
50
65
  }
51
66
  }
52
67
 
53
68
  // Final attempt if we haven't been able to open the server - rethrow errors if we still can't open.
54
- server ??= await this.databaseOpenAttempt(options);
69
+ server ??= await this.databaseOpenAttempt(logger, options);
55
70
  return server.connect(lockName);
56
71
  }
57
72
 
58
- private async databaseOpenAttempt(options: ResolvedWASQLiteOpenFactoryOptions): Promise<DatabaseServer> {
73
+ private async databaseOpenAttempt(
74
+ logger: PowerSyncLogger,
75
+ options: RawWaSqliteDatabaseOptions
76
+ ): Promise<DatabaseServer> {
59
77
  return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
60
- const { dbFilename } = options;
78
+ const { filename } = options;
61
79
 
62
- let server: DatabaseServer | undefined = this.activeDatabases.get(dbFilename);
80
+ let server: DatabaseServer | undefined = this.activeDatabases.get(filename);
63
81
  if (server == null) {
64
82
  // We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
65
83
  // For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
66
84
  // fine).
67
- const needsNavigatorLocks = !(isSharedWorker || options.isReadOnly);
85
+ const needsNavigatorLocks = !(isSharedWorker || options.readonly);
68
86
  const connection = new RawSqliteConnection(options);
69
87
  const withSafeConcurrency = new ConcurrentSqliteConnection(connection, needsNavigatorLocks);
70
88
 
@@ -81,13 +99,13 @@ export class MultiDatabaseServer {
81
99
  }
82
100
  returnLease();
83
101
 
84
- const onClose = () => this.activeDatabases.delete(dbFilename);
102
+ const onClose = () => this.activeDatabases.delete(filename);
85
103
  server = new DatabaseServer({
86
104
  inner: withSafeConcurrency,
87
- logger: this.logger,
105
+ logger,
88
106
  onClose
89
107
  });
90
- this.activeDatabases.set(dbFilename, server);
108
+ this.activeDatabases.set(filename, server);
91
109
  }
92
110
 
93
111
  return server;
@@ -1,4 +1,5 @@
1
- import type { PowerSyncCredentials, SyncStatusOptions } from '@powersync/common';
1
+ import type { LogRecord, PowerSyncCredentials } from '@powersync/common';
2
+ import { SyncStatusJson } from '@powersync/shared-internals';
2
3
 
3
4
  /**
4
5
  * The client side port should provide these methods.
@@ -7,15 +8,8 @@ export abstract class AbstractSharedSyncClientProvider {
7
8
  abstract fetchCredentials(): Promise<PowerSyncCredentials | null>;
8
9
  abstract invalidateCredentials(): void;
9
10
  abstract uploadCrud(): Promise<void>;
10
- abstract statusChanged(status: SyncStatusOptions): void;
11
+ abstract statusChanged(status: SyncStatusJson): void;
11
12
  abstract getDBWorkerPort(): Promise<MessagePort>;
12
13
 
13
- abstract trace(...x: any[]): void;
14
- abstract debug(...x: any[]): void;
15
- abstract info(...x: any[]): void;
16
- abstract log(...x: any[]): void;
17
- abstract warn(...x: any[]): void;
18
- abstract error(...x: any[]): void;
19
- abstract time(label: string): void;
20
- abstract timeEnd(label: string): void;
14
+ abstract log(record: LogRecord): void;
21
15
  }
@@ -1,113 +1,39 @@
1
- import { type ILogger, type ILogLevel, LogLevel } from '@powersync/common';
1
+ import { PowerSyncLogger, LogLevels, CreateLoggerOptions, createConsoleLogger, LogRecord } from '@powersync/common';
2
2
  import { type WrappedSyncPort } from './SharedSyncImplementation.js';
3
3
 
4
4
  /**
5
5
  * Broadcasts logs to all clients
6
6
  */
7
- export class BroadcastLogger implements ILogger {
8
- TRACE: ILogLevel;
9
- DEBUG: ILogLevel;
10
- INFO: ILogLevel;
11
- TIME: ILogLevel;
12
- WARN: ILogLevel;
13
- ERROR: ILogLevel;
14
- OFF: ILogLevel;
7
+ export class BroadcastLogger implements PowerSyncLogger {
8
+ private readonly inner: PowerSyncLogger & CreateLoggerOptions;
9
+ private currentLevel: number = LogLevels.info;
15
10
 
16
- private currentLevel: ILogLevel = LogLevel.INFO;
11
+ sendBroadcasts = true;
17
12
 
18
- constructor(protected clients: WrappedSyncPort[]) {
19
- this.TRACE = LogLevel.TRACE;
20
- this.DEBUG = LogLevel.DEBUG;
21
- this.INFO = LogLevel.INFO;
22
- this.TIME = LogLevel.TIME;
23
- this.WARN = LogLevel.WARN;
24
- this.ERROR = LogLevel.ERROR;
25
- this.OFF = LogLevel.OFF;
13
+ constructor(
14
+ prefix: string,
15
+ private clients: WrappedSyncPort[]
16
+ ) {
17
+ this.inner = createConsoleLogger({ prefix: prefix });
26
18
  }
27
19
 
28
- trace(...x: any[]): void {
29
- if (!this.enabledFor(this.TRACE)) return;
20
+ log(record: LogRecord) {
21
+ this.inner.log(record);
30
22
 
31
- console.trace(...x);
32
- const sanitized = this.sanitizeArgs(x);
33
- this.iterateClients((client) => client.clientProvider.trace(...sanitized));
34
- }
35
-
36
- debug(...x: any[]): void {
37
- if (!this.enabledFor(this.DEBUG)) return;
38
-
39
- console.debug(...x);
40
- const sanitized = this.sanitizeArgs(x);
41
- this.iterateClients((client) => client.clientProvider.debug(...sanitized));
42
- }
43
-
44
- info(...x: any[]): void {
45
- if (!this.enabledFor(this.INFO)) return;
46
-
47
- console.info(...x);
48
- const sanitized = this.sanitizeArgs(x);
49
- this.iterateClients((client) => client.clientProvider.info(...sanitized));
50
- }
51
-
52
- log(...x: any[]): void {
53
- if (!this.enabledFor(this.INFO)) return;
54
-
55
- console.log(...x);
56
- const sanitized = this.sanitizeArgs(x);
57
- this.iterateClients((client) => client.clientProvider.log(...sanitized));
58
- }
59
-
60
- warn(...x: any[]): void {
61
- if (!this.enabledFor(this.WARN)) return;
62
-
63
- console.warn(...x);
64
- const sanitized = this.sanitizeArgs(x);
65
- this.iterateClients((client) => client.clientProvider.warn(...sanitized));
66
- }
67
-
68
- error(...x: any[]): void {
69
- if (!this.enabledFor(this.ERROR)) return;
70
-
71
- console.error(...x);
72
- const sanitized = this.sanitizeArgs(x);
73
- this.iterateClients((client) => client.clientProvider.error(...sanitized));
74
- }
75
-
76
- time(label: string): void {
77
- if (!this.enabledFor(this.TIME)) return;
78
-
79
- console.time(label);
80
- this.iterateClients((client) => client.clientProvider.time(label));
81
- }
82
-
83
- timeEnd(label: string): void {
84
- if (!this.enabledFor(this.TIME)) return;
85
-
86
- console.timeEnd(label);
87
- this.iterateClients((client) => client.clientProvider.timeEnd(label));
23
+ if (this.sendBroadcasts && record.level >= this.currentLevel) {
24
+ const sanitized = this.sanitizeRecord(record);
25
+ this.iterateClients((client) => client.clientProvider.log(sanitized));
26
+ }
88
27
  }
89
28
 
90
29
  /**
91
30
  * Set the global log level.
92
31
  */
93
- setLevel(level: ILogLevel): void {
32
+ setLevel(level: number): void {
33
+ this.inner.minLevel = level;
94
34
  this.currentLevel = level;
95
35
  }
96
36
 
97
- /**
98
- * Get the current log level.
99
- */
100
- getLevel(): ILogLevel {
101
- return this.currentLevel;
102
- }
103
-
104
- /**
105
- * Returns true if the given level is enabled.
106
- */
107
- enabledFor(level: ILogLevel): boolean {
108
- return level.value >= this.currentLevel.value;
109
- }
110
-
111
37
  /**
112
38
  * Iterates all clients, catches individual client exceptions
113
39
  * and proceeds to execute for all clients.
@@ -126,17 +52,23 @@ export class BroadcastLogger implements ILogger {
126
52
  * Guards against any logging errors.
127
53
  * We don't want a logging exception to cause further issues upstream
128
54
  */
129
- protected sanitizeArgs(x: any[]): any[] {
130
- const sanitizedParams = x.map((param) => {
131
- try {
132
- // Try and clone here first. If it fails it won't be passable over a MessagePort
133
- return structuredClone(param);
134
- } catch (ex) {
135
- console.error(ex);
136
- return 'Could not serialize log params. Check shared worker logs for more details.';
137
- }
138
- });
55
+ protected sanitizeRecord(record: LogRecord): LogRecord {
56
+ if (!record.error) {
57
+ return record;
58
+ }
59
+
60
+ let error;
61
+ try {
62
+ // Try and clone here first. If it fails it won't be passable over a MessagePort
63
+ error = structuredClone(record.error);
64
+ } catch (ex) {
65
+ console.error(ex);
66
+ error = 'Could not serialize log params. Check shared worker logs for more details.';
67
+ }
139
68
 
140
- return sanitizedParams;
69
+ return {
70
+ ...record,
71
+ error
72
+ };
141
73
  }
142
74
  }