@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
@@ -1,26 +1,24 @@
1
1
  import {
2
- AbortOperation,
3
2
  BaseObserver,
4
- ConnectionManager,
5
- ConnectionPool,
6
3
  DBAdapter,
7
- DBAdapterDefaultMixin,
8
- DBAdapterListener,
9
4
  DBLockOptions,
10
5
  LockContext,
11
6
  PowerSyncBackendConnector,
7
+ SyncStatus,
8
+ LogLevels,
9
+ SyncStreamConnectionMethod
10
+ } from '@powersync/common';
11
+ import {
12
+ AbortOperation,
13
+ ConnectionManager,
12
14
  SqliteBucketStorage,
13
15
  SubscribedStream,
14
- SyncStatus,
15
- createLogger,
16
- Mutex,
17
- type ILogLevel,
18
- type ILogger,
19
- type PowerSyncConnectionOptions,
20
16
  type StreamingSyncImplementation,
21
17
  type StreamingSyncImplementationListener,
22
- type SyncStatusOptions
23
- } from '@powersync/common';
18
+ Mutex,
19
+ ResolvedSyncOptions,
20
+ SyncStatusSnapshot
21
+ } from '@powersync/shared-internals';
24
22
  import * as Comlink from 'comlink';
25
23
  import { WebRemote } from '../../db/sync/WebRemote.js';
26
24
  import {
@@ -28,11 +26,11 @@ import {
28
26
  WebStreamingSyncImplementationOptions
29
27
  } from '../../db/sync/WebStreamingSyncImplementation.js';
30
28
 
31
- import { ResolvedWebSQLOpenOptions } from '../../db/adapters/web-sql-flags.js';
32
29
  import { AbstractSharedSyncClientProvider } from './AbstractSharedSyncClientProvider.js';
33
30
  import { BroadcastLogger } from './BroadcastLogger.js';
34
31
  import { DatabaseClient, OpenWorkerConnection } from '../../db/adapters/wa-sqlite/DatabaseClient.js';
35
32
  import { generateTabCloseSignal } from '../../shared/tab_close_signal.js';
33
+ import { ResolvedWebSQLOpenOptions } from '../../db/adapters/options.js';
36
34
 
37
35
  /**
38
36
  * @internal
@@ -60,8 +58,12 @@ export type ManualSharedSyncPayload = {
60
58
  * @internal
61
59
  */
62
60
  export type SharedSyncInitOptions = {
63
- streamOptions: Omit<WebStreamingSyncImplementationOptions, 'adapter' | 'uploadCrud' | 'remote' | 'subscriptions'>;
61
+ streamOptions: Omit<
62
+ WebStreamingSyncImplementationOptions,
63
+ 'adapter' | 'uploadCrud' | 'remote' | 'subscriptions' | 'logger'
64
+ >;
64
65
  dbParams: ResolvedWebSQLOpenOptions;
66
+ enableBroadcastLogs: boolean;
65
67
  };
66
68
 
67
69
  /**
@@ -112,21 +114,19 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
112
114
  protected uploadDataController?: RemoteOperationAbortController;
113
115
 
114
116
  protected syncParams: SharedSyncInitOptions | null;
115
- protected logger: ILogger;
116
- protected lastConnectOptions: PowerSyncConnectionOptions | undefined;
117
+ protected lastConnectOptions: ResolvedSyncOptions | undefined;
117
118
  protected portMutex: Mutex;
118
119
  private subscriptions: SubscribedStream[] = [];
119
120
 
120
121
  protected connectionManager: ConnectionManager;
121
- syncStatus: SyncStatus;
122
- broadCastLogger: ILogger;
122
+ private syncStatus?: SyncStatusSnapshot;
123
+ logger: BroadcastLogger;
123
124
  protected readonly database = this.generateReconnectableDatabase();
124
125
 
125
126
  constructor() {
126
127
  super();
127
128
  this.ports = [];
128
129
  this.syncParams = null;
129
- this.logger = createLogger('shared-sync');
130
130
  this.lastConnectOptions = undefined;
131
131
  this.portMutex = new Mutex();
132
132
 
@@ -139,8 +139,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
139
139
  });
140
140
  });
141
141
 
142
- this.syncStatus = new SyncStatus({});
143
- this.broadCastLogger = new BroadcastLogger(this.ports);
142
+ this.logger = new BroadcastLogger('shared-sync', this.ports);
144
143
 
145
144
  this.connectionManager = new ConnectionManager({
146
145
  createSyncImplementation: async () => {
@@ -148,8 +147,10 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
148
147
 
149
148
  const sync = this.generateStreamingImplementation();
150
149
  const onDispose = sync.registerListener({
151
- statusChanged: (status) => {
152
- this.updateAllStatuses(status.toJSON());
150
+ statusChanged: (snapshot) => {
151
+ this.syncStatus = snapshot;
152
+ const json = snapshot.toJSON();
153
+ this.ports.forEach((p) => p.clientProvider.statusChanged(json));
153
154
  }
154
155
  });
155
156
 
@@ -158,14 +159,11 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
158
159
  onDispose
159
160
  };
160
161
  },
161
- logger: this.logger
162
+ logger: this.logger,
163
+ defaultConnectionMethod: SyncStreamConnectionMethod.HTTP
162
164
  });
163
165
  }
164
166
 
165
- get lastSyncedAt(): Date | undefined {
166
- return this.connectionManager.syncStreamImplementation?.lastSyncedAt;
167
- }
168
-
169
167
  get isConnected(): boolean {
170
168
  return this.connectionManager.syncStreamImplementation?.isConnected ?? false;
171
169
  }
@@ -196,12 +194,6 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
196
194
  });
197
195
  }
198
196
 
199
- async waitForStatus(status: SyncStatusOptions): Promise<void> {
200
- return this.withSyncImplementation(async (sync) => {
201
- return sync.waitForStatus(status);
202
- });
203
- }
204
-
205
197
  async waitUntilStatusMatches(predicate: (status: SyncStatus) => boolean): Promise<void> {
206
198
  return this.withSyncImplementation(async (sync) => {
207
199
  return sync.waitUntilStatusMatches(predicate);
@@ -213,7 +205,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
213
205
  }
214
206
 
215
207
  private collectActiveSubscriptions() {
216
- this.logger.debug('Collecting active stream subscriptions across tabs');
208
+ this.logger.log({ level: LogLevels.debug, message: 'Collecting active stream subscriptions across tabs' });
217
209
  const active = new Map<string, SubscribedStream>();
218
210
  for (const port of this.ports) {
219
211
  for (const stream of port.currentSubscriptions) {
@@ -222,7 +214,10 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
222
214
  }
223
215
  }
224
216
  this.subscriptions = [...active.values()];
225
- this.logger.debug('Collected stream subscriptions', this.subscriptions);
217
+ this.logger.log({
218
+ level: LogLevels.debug,
219
+ message: `Collected stream subscriptions, ${JSON.stringify(this.subscriptions)}`
220
+ });
226
221
  this.connectionManager.syncStreamImplementation?.updateSubscriptions(this.subscriptions);
227
222
  }
228
223
 
@@ -231,9 +226,8 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
231
226
  this.collectActiveSubscriptions();
232
227
  }
233
228
 
234
- setLogLevel(level: ILogLevel) {
229
+ setLogLevel(level: number) {
235
230
  this.logger.setLevel(level);
236
- this.broadCastLogger.setLevel(level);
237
231
  }
238
232
 
239
233
  /**
@@ -251,16 +245,18 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
251
245
 
252
246
  // First time setting params
253
247
  this.syncParams = params;
254
- if (params.streamOptions?.flags?.broadcastLogs) {
255
- this.logger = this.broadCastLogger;
256
- }
248
+ this.logger.sendBroadcasts = params.enableBroadcastLogs;
257
249
 
258
250
  // Ensure we have a usable database connection, the reconnectable database will connect lazily on first use.
259
251
  await this.database.readLock(async () => {});
260
252
 
261
253
  self.onerror = (event) => {
262
254
  // Share any uncaught events on the broadcast logger
263
- this.logger.error('Uncaught exception in PowerSync shared sync worker', event);
255
+ this.logger.log({
256
+ level: LogLevels.error,
257
+ message: 'Uncaught exception in PowerSync shared sync worker',
258
+ error: event
259
+ });
264
260
  };
265
261
 
266
262
  this.iterateListeners((l) => l.initialized?.());
@@ -278,9 +274,9 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
278
274
  * The connection will simply be reconnected whenever a new tab
279
275
  * connects.
280
276
  */
281
- async connect(options?: PowerSyncConnectionOptions) {
277
+ async connect(options: ResolvedSyncOptions, serializedSchema: any) {
282
278
  this.lastConnectOptions = options;
283
- return this.connectionManager.connect(CONNECTOR_PLACEHOLDER, options ?? {});
279
+ return this.connectionManager.connect(CONNECTOR_PLACEHOLDER, options ?? {}, serializedSchema);
284
280
  }
285
281
 
286
282
  async disconnect() {
@@ -302,7 +298,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
302
298
  this.ports.push(portProvider);
303
299
 
304
300
  // Give the newly connected client the latest status
305
- const status = this.connectionManager.syncStreamImplementation?.syncStatus;
301
+ const status = this.syncStatus;
306
302
  if (status) {
307
303
  portProvider.clientProvider.statusChanged(status.toJSON());
308
304
  }
@@ -325,7 +321,10 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
325
321
  return await this.portMutex.runExclusive(async () => {
326
322
  const index = this.ports.findIndex((p) => p == port);
327
323
  if (index < 0) {
328
- this.logger.warn(`Could not remove port ${port} since it is not present in active ports.`);
324
+ this.logger.log({
325
+ level: LogLevels.warn,
326
+ message: `Could not remove port ${port} since it is not present in active ports.`
327
+ });
329
328
  return () => {};
330
329
  }
331
330
 
@@ -362,12 +361,6 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
362
361
  });
363
362
  }
364
363
 
365
- async hasCompletedSync(): Promise<boolean> {
366
- return this.withSyncImplementation(async (sync) => {
367
- return sync.hasCompletedSync();
368
- });
369
- }
370
-
371
364
  async getWriteCheckpoint(): Promise<string> {
372
365
  return this.withSyncImplementation(async (sync) => {
373
366
  return sync.getWriteCheckpoint();
@@ -407,10 +400,13 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
407
400
  throw new Error('No client port found to invalidate credentials');
408
401
  }
409
402
  try {
410
- this.logger.log('calling the last port client provider to invalidate credentials');
403
+ this.logger.log({
404
+ level: LogLevels.info,
405
+ message: 'calling the last port client provider to invalidate credentials'
406
+ });
411
407
  lastPort.clientProvider.invalidateCredentials();
412
- } catch (ex) {
413
- this.logger.error('error invalidating credentials', ex);
408
+ } catch (error) {
409
+ this.logger.log({ level: LogLevels.error, message: 'error invalidating credentials', error });
414
410
  }
415
411
  },
416
412
  fetchCredentials: async () => {
@@ -427,7 +423,10 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
427
423
 
428
424
  abortController.signal.onabort = reject;
429
425
  try {
430
- this.logger.log('calling the last port client provider for credentials');
426
+ this.logger.log({
427
+ level: LogLevels.info,
428
+ message: 'calling the last port client provider for credentials'
429
+ });
431
430
  resolve(await lastPort.clientProvider.fetchCredentials());
432
431
  } catch (ex) {
433
432
  reject(ex);
@@ -552,7 +551,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
552
551
  clearTimeout(timeout);
553
552
 
554
553
  client.closeListeners.push(async () => {
555
- this.logger.info('Aborting open connection because associated tab closed.');
554
+ this.logger.log({ level: LogLevels.info, message: 'Aborting open connection because associated tab closed.' });
556
555
  handleClosed(db);
557
556
  /**
558
557
  * Don't await this close operation. It might never resolve if the tab is closed.
@@ -560,7 +559,9 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
560
559
  * We then call close. The close operation is configured to fire-and-forget, the main promise will reject immediately.
561
560
  */
562
561
  db.markRemoteClosed();
563
- db.close().catch((ex) => this.logger.warn('error closing database connection', ex));
562
+ db.close().catch((error) =>
563
+ this.logger.log({ level: LogLevels.warn, message: 'error closing database connection', error })
564
+ );
564
565
  });
565
566
  return db;
566
567
  }
@@ -569,7 +570,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
569
570
  const syncParams = this.syncParams;
570
571
  const sharedSync = this;
571
572
 
572
- class ReconnectPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
573
+ return new (class extends DBAdapter {
573
574
  private connectionState:
574
575
  | null
575
576
  | DatabaseClient<ResolvedWebSQLOpenOptions>
@@ -638,19 +639,7 @@ export class SharedSyncImplementation extends BaseObserver<SharedSyncImplementat
638
639
  async refreshSchema(): Promise<void> {
639
640
  // Not used by sync client.
640
641
  }
641
- }
642
-
643
- const Adapter = DBAdapterDefaultMixin(ReconnectPool);
644
- return new Adapter();
645
- }
646
-
647
- /**
648
- * A method to update the all shared statuses for each
649
- * client.
650
- */
651
- private updateAllStatuses(status: SyncStatusOptions) {
652
- this.syncStatus = new SyncStatus(status);
653
- this.ports.forEach((p) => p.clientProvider.statusChanged(status));
642
+ })();
654
643
  }
655
644
  }
656
645
 
@@ -1,4 +1,3 @@
1
- import { ILogLevel, PowerSyncConnectionOptions, SubscribedStream } from '@powersync/common';
2
1
  import * as Comlink from 'comlink';
3
2
  import { getNavigatorLocks } from '../../shared/navigator.js';
4
3
  import {
@@ -8,6 +7,7 @@ import {
8
7
  SharedSyncInitOptions,
9
8
  WrappedSyncPort
10
9
  } from './SharedSyncImplementation.js';
10
+ import { SubscribedStream, ResolvedSyncOptions } from '@powersync/shared-internals';
11
11
 
12
12
  /**
13
13
  * A client to the shared sync worker.
@@ -65,7 +65,7 @@ export class WorkerClient {
65
65
  });
66
66
  }
67
67
 
68
- setLogLevel(level: ILogLevel) {
68
+ setLogLevel(level: number) {
69
69
  this.sync.setLogLevel(level);
70
70
  }
71
71
 
@@ -82,12 +82,8 @@ export class WorkerClient {
82
82
  return this.sync.getWriteCheckpoint();
83
83
  }
84
84
 
85
- hasCompletedSync() {
86
- return this.sync.hasCompletedSync();
87
- }
88
-
89
- connect(options?: PowerSyncConnectionOptions) {
90
- return this.sync.connect(options);
85
+ connect(options: ResolvedSyncOptions, schema: any) {
86
+ return this.sync.connect(options, schema);
91
87
  }
92
88
 
93
89
  updateSubscriptions(subscriptions: SubscribedStream[]) {
@@ -0,0 +1,38 @@
1
+ import * as Comlink from 'comlink';
2
+
3
+ import { createConsoleLogger, LogLevels } from '@powersync/common';
4
+ import { isSharedWorker, MultiDatabaseServer } from './db/MultiDatabaseServer.js';
5
+ import { SharedSyncImplementation } from './sync/SharedSyncImplementation.js';
6
+ import { OpenWorkerConnection } from '../db/adapters/wa-sqlite/DatabaseClient.js';
7
+ import { SharedWorkerConnectionRequest } from './SharedWorkerConnectionRequest.js';
8
+ import { WorkerClient } from './sync/WorkerClient.js';
9
+
10
+ const server = new MultiDatabaseServer(createConsoleLogger({ prefix: 'db-worker', minLevel: LogLevels.trace }));
11
+
12
+ const exposedDatabaseFunctions: OpenWorkerConnection = {
13
+ connect: (config) => server.handleConnection(config),
14
+ connectToExisting: ({ identifier, lockName }) => server.connectToExisting(identifier, lockName)
15
+ };
16
+
17
+ if (isSharedWorker) {
18
+ const sharedSyncImplementation = new SharedSyncImplementation();
19
+
20
+ // A shared worker can either be an IndexedDB-VFS database server or a shared sync coordinator.
21
+ // To be able to know what service a client is connecting to, we let clients send an inner MessagePort through the
22
+ // top-level port along with a tag describing what they need.
23
+ const _self = self as unknown as SharedWorkerGlobalScope;
24
+ _self.onconnect = (outerEvent: MessageEvent) => {
25
+ const port = outerEvent.ports[0];
26
+ port.onmessage = (event: MessageEvent<SharedWorkerConnectionRequest>) => {
27
+ const { service, port } = event.data;
28
+ if (service === 'database') {
29
+ Comlink.expose(exposedDatabaseFunctions, port);
30
+ } else if (service === 'sync') {
31
+ new WorkerClient(sharedSyncImplementation, port);
32
+ }
33
+ };
34
+ };
35
+ } else {
36
+ // Dedicated workers are only used for databases, so we don't need an intermediate layer.
37
+ Comlink.expose(exposedDatabaseFunctions);
38
+ }