@powersync/web 1.39.0 → 2.0.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 (234) hide show
  1. package/bin/powersync.cjs +1 -1
  2. package/dist/index.react_native_web.js +1893 -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/MemoryVFS-DVJL5F8j.js +2 -0
  11. package/dist/worker/MemoryVFS-DVJL5F8j.js.map +1 -0
  12. package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js +2 -0
  13. package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js.map +1 -0
  14. package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js +2 -0
  15. package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +1 -0
  16. package/dist/worker/mc-wa-sqlite-DiBqIVE5.js +2 -0
  17. package/dist/worker/mc-wa-sqlite-DiBqIVE5.js.map +1 -0
  18. package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js +2 -0
  19. package/dist/worker/mc-wa-sqlite-async-DUEhO9ef.js.map +1 -0
  20. package/dist/worker/wa-sqlite-BlSx7-_P.js +2 -0
  21. package/dist/worker/wa-sqlite-BlSx7-_P.js.map +1 -0
  22. package/dist/worker/wa-sqlite-async-BdR24Ucf.js +2 -0
  23. package/dist/worker/wa-sqlite-async-BdR24Ucf.js.map +1 -0
  24. package/dist/worker/websockets-Q8W_lerF.js +9 -0
  25. package/dist/worker/websockets-Q8W_lerF.js.map +1 -0
  26. package/dist/worker/worker.js +7 -0
  27. package/dist/worker/worker.js.map +1 -0
  28. package/lib/attachments/IndexDBFileSystemAdapter.js.map +1 -0
  29. package/lib/{src/db → db}/NavigatorTriggerClaimManager.d.ts +1 -1
  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 +47 -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 +14 -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.map +1 -0
  42. package/lib/db/adapters/options.d.ts +87 -0
  43. package/lib/db/adapters/options.js +6 -0
  44. package/lib/db/adapters/options.js.map +1 -0
  45. package/lib/db/adapters/resolveAndValidateOptions.d.ts +5 -0
  46. package/lib/db/adapters/resolveAndValidateOptions.js +33 -0
  47. package/lib/db/adapters/resolveAndValidateOptions.js.map +1 -0
  48. package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.d.ts +3 -4
  49. package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.js +2 -2
  50. package/lib/db/adapters/wa-sqlite/ConcurrentConnection.js.map +1 -0
  51. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.d.ts +4 -4
  52. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.js +11 -37
  53. package/lib/db/adapters/wa-sqlite/DatabaseClient.js.map +1 -0
  54. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.d.ts +5 -5
  55. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.js +11 -7
  56. package/lib/db/adapters/wa-sqlite/DatabaseServer.js.map +1 -0
  57. package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.d.ts +22 -12
  58. package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.js +10 -9
  59. package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -0
  60. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +18 -0
  61. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +131 -0
  62. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -0
  63. package/lib/{src/db → db}/adapters/wa-sqlite/vfs.d.ts +9 -2
  64. package/lib/{src/db → db}/adapters/wa-sqlite/vfs.js +6 -6
  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 +4 -11
  68. package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -0
  69. package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.d.ts +13 -14
  70. package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.js +31 -66
  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 +3 -2
  77. package/lib/db/sync/WebStreamingSyncImplementation.js.map +1 -0
  78. package/lib/db/sync/userAgent.js.map +1 -0
  79. package/lib/{src/index.d.ts → index.d.ts} +1 -3
  80. package/lib/{src/index.js → index.js} +1 -3
  81. package/lib/index.js.map +1 -0
  82. package/lib/shared/navigator.js.map +1 -0
  83. package/lib/shared/tab_close_signal.js.map +1 -0
  84. package/lib/worker/SharedWorkerConnectionRequest.d.ts +5 -0
  85. package/lib/worker/SharedWorkerConnectionRequest.js +2 -0
  86. package/lib/worker/SharedWorkerConnectionRequest.js.map +1 -0
  87. package/lib/worker/client.d.ts +15 -0
  88. package/lib/worker/client.js +77 -0
  89. package/lib/worker/client.js.map +1 -0
  90. package/lib/worker/db/MultiDatabaseServer.d.ts +22 -0
  91. package/lib/{src/worker → worker}/db/MultiDatabaseServer.js +25 -15
  92. package/lib/worker/db/MultiDatabaseServer.js.map +1 -0
  93. package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +13 -0
  94. package/lib/worker/sync/AbstractSharedSyncClientProvider.js.map +1 -0
  95. package/lib/worker/sync/BroadcastLogger.d.ts +27 -0
  96. package/lib/worker/sync/BroadcastLogger.js +65 -0
  97. package/lib/worker/sync/BroadcastLogger.js.map +1 -0
  98. package/lib/{src/worker → worker}/sync/SharedSyncImplementation.d.ts +11 -15
  99. package/lib/{src/worker → worker}/sync/SharedSyncImplementation.js +42 -43
  100. package/lib/worker/sync/SharedSyncImplementation.js.map +1 -0
  101. package/lib/{src/worker → worker}/sync/WorkerClient.d.ts +3 -3
  102. package/lib/{src/worker → worker}/sync/WorkerClient.js +2 -2
  103. package/lib/worker/sync/WorkerClient.js.map +1 -0
  104. package/lib/worker/worker.js +34 -0
  105. package/lib/worker/worker.js.map +1 -0
  106. package/package.json +22 -29
  107. package/src/db/NavigatorTriggerClaimManager.ts +1 -1
  108. package/src/db/PowerSyncDatabase.ts +80 -122
  109. package/src/db/adapters/AsyncWebAdapter.ts +17 -26
  110. package/src/db/adapters/SSRDBAdapter.ts +14 -64
  111. package/src/db/adapters/WebDBAdapter.ts +1 -1
  112. package/src/db/adapters/options.ts +100 -0
  113. package/src/db/adapters/resolveAndValidateOptions.ts +40 -0
  114. package/src/db/adapters/wa-sqlite/ConcurrentConnection.ts +4 -5
  115. package/src/db/adapters/wa-sqlite/DatabaseClient.ts +20 -56
  116. package/src/db/adapters/wa-sqlite/DatabaseServer.ts +15 -12
  117. package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +34 -23
  118. package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +63 -126
  119. package/src/db/adapters/wa-sqlite/vfs.ts +13 -8
  120. package/src/db/sync/SSRWebStreamingSyncImplementation.ts +4 -22
  121. package/src/db/sync/SharedWebStreamingSyncImplementation.ts +38 -77
  122. package/src/db/sync/WebRemote.ts +23 -26
  123. package/src/db/sync/WebStreamingSyncImplementation.ts +4 -5
  124. package/src/index.ts +1 -3
  125. package/src/worker/SharedWorkerConnectionRequest.ts +6 -0
  126. package/src/worker/client.ts +100 -0
  127. package/src/worker/db/MultiDatabaseServer.ts +40 -22
  128. package/src/worker/sync/AbstractSharedSyncClientProvider.ts +4 -10
  129. package/src/worker/sync/BroadcastLogger.ts +35 -103
  130. package/src/worker/sync/SharedSyncImplementation.ts +62 -63
  131. package/src/worker/sync/WorkerClient.ts +4 -4
  132. package/src/worker/worker.ts +38 -0
  133. package/dist/index.umd.js +0 -7821
  134. package/dist/index.umd.js.map +0 -1
  135. package/dist/worker/SharedSyncImplementation.umd.js +0 -16142
  136. package/dist/worker/SharedSyncImplementation.umd.js.map +0 -1
  137. package/dist/worker/WASQLiteDB.umd.js +0 -17437
  138. package/dist/worker/WASQLiteDB.umd.js.map +0 -1
  139. 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
  140. 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
  141. 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
  142. 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
  143. 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
  144. 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
  145. 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
  146. 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
  147. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js +0 -3562
  148. 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
  149. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-833585.umd.js +0 -1400
  150. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-833585.umd.js.map +0 -1
  151. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js +0 -2478
  152. 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
  153. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js +0 -1681
  154. 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
  155. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js +0 -1820
  156. 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
  157. package/lib/package.json +0 -91
  158. package/lib/src/attachments/IndexDBFileSystemAdapter.js.map +0 -1
  159. package/lib/src/db/NavigatorTriggerClaimManager.js.map +0 -1
  160. package/lib/src/db/PowerSyncDatabase.d.ts +0 -78
  161. package/lib/src/db/PowerSyncDatabase.js.map +0 -1
  162. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.d.ts +0 -23
  163. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js +0 -27
  164. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js.map +0 -1
  165. package/lib/src/db/adapters/AsyncWebAdapter.d.ts +0 -50
  166. package/lib/src/db/adapters/AsyncWebAdapter.js.map +0 -1
  167. package/lib/src/db/adapters/SSRDBAdapter.d.ts +0 -30
  168. package/lib/src/db/adapters/SSRDBAdapter.js +0 -69
  169. package/lib/src/db/adapters/SSRDBAdapter.js.map +0 -1
  170. package/lib/src/db/adapters/WebDBAdapter.js.map +0 -1
  171. package/lib/src/db/adapters/wa-sqlite/ConcurrentConnection.js.map +0 -1
  172. package/lib/src/db/adapters/wa-sqlite/DatabaseClient.js.map +0 -1
  173. package/lib/src/db/adapters/wa-sqlite/DatabaseServer.js.map +0 -1
  174. package/lib/src/db/adapters/wa-sqlite/RawSqliteConnection.js.map +0 -1
  175. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +0 -45
  176. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +0 -146
  177. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +0 -1
  178. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.d.ts +0 -15
  179. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js +0 -22
  180. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js.map +0 -1
  181. package/lib/src/db/adapters/wa-sqlite/vfs.js.map +0 -1
  182. package/lib/src/db/adapters/web-sql-flags.d.ts +0 -92
  183. package/lib/src/db/adapters/web-sql-flags.js +0 -37
  184. package/lib/src/db/adapters/web-sql-flags.js.map +0 -1
  185. package/lib/src/db/sync/SSRWebStreamingSyncImplementation.js.map +0 -1
  186. package/lib/src/db/sync/SharedWebStreamingSyncImplementation.js.map +0 -1
  187. package/lib/src/db/sync/WebRemote.d.ts +0 -7
  188. package/lib/src/db/sync/WebRemote.js +0 -33
  189. package/lib/src/db/sync/WebRemote.js.map +0 -1
  190. package/lib/src/db/sync/WebStreamingSyncImplementation.js.map +0 -1
  191. package/lib/src/db/sync/userAgent.js.map +0 -1
  192. package/lib/src/index.js.map +0 -1
  193. package/lib/src/shared/navigator.js.map +0 -1
  194. package/lib/src/shared/tab_close_signal.js.map +0 -1
  195. package/lib/src/worker/db/MultiDatabaseServer.d.ts +0 -17
  196. package/lib/src/worker/db/MultiDatabaseServer.js.map +0 -1
  197. package/lib/src/worker/db/WASQLiteDB.worker.d.ts +0 -4
  198. package/lib/src/worker/db/WASQLiteDB.worker.js +0 -31
  199. package/lib/src/worker/db/WASQLiteDB.worker.js.map +0 -1
  200. package/lib/src/worker/db/open-worker-database.d.ts +0 -14
  201. package/lib/src/worker/db/open-worker-database.js +0 -53
  202. package/lib/src/worker/db/open-worker-database.js.map +0 -1
  203. package/lib/src/worker/sync/AbstractSharedSyncClientProvider.d.ts +0 -19
  204. package/lib/src/worker/sync/AbstractSharedSyncClientProvider.js.map +0 -1
  205. package/lib/src/worker/sync/BroadcastLogger.d.ts +0 -47
  206. package/lib/src/worker/sync/BroadcastLogger.js +0 -129
  207. package/lib/src/worker/sync/BroadcastLogger.js.map +0 -1
  208. package/lib/src/worker/sync/SharedSyncImplementation.js.map +0 -1
  209. package/lib/src/worker/sync/SharedSyncImplementation.worker.js +0 -12
  210. package/lib/src/worker/sync/SharedSyncImplementation.worker.js.map +0 -1
  211. package/lib/src/worker/sync/WorkerClient.js.map +0 -1
  212. package/lib/tsconfig.tsbuildinfo +0 -1
  213. package/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts +0 -47
  214. package/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts +0 -24
  215. package/src/db/adapters/web-sql-flags.ts +0 -141
  216. package/src/worker/db/WASQLiteDB.worker.ts +0 -35
  217. package/src/worker/db/open-worker-database.ts +0 -62
  218. package/src/worker/sync/SharedSyncImplementation.worker.ts +0 -14
  219. /package/dist/{8e97452e297be23b5e50.wasm → worker/assets/mc-wa-sqlite-CnHbhWvs.wasm} +0 -0
  220. /package/dist/{2075a31bb151adbb9767.wasm → worker/assets/mc-wa-sqlite-async-D6idQS2r.wasm} +0 -0
  221. /package/dist/{3322bc84de986b63c2cd.wasm → worker/assets/wa-sqlite-XZW__iJk.wasm} +0 -0
  222. /package/dist/{fbc178b70d530e8ce02b.wasm → worker/assets/wa-sqlite-async-rHzzC98y.wasm} +0 -0
  223. /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.d.ts +0 -0
  224. /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.js +0 -0
  225. /package/lib/{src/db → db}/NavigatorTriggerClaimManager.js +0 -0
  226. /package/lib/{src/db → db}/adapters/WebDBAdapter.js +0 -0
  227. /package/lib/{src/db → db}/sync/userAgent.d.ts +0 -0
  228. /package/lib/{src/db → db}/sync/userAgent.js +0 -0
  229. /package/lib/{src/shared → shared}/navigator.d.ts +0 -0
  230. /package/lib/{src/shared → shared}/navigator.js +0 -0
  231. /package/lib/{src/shared → shared}/tab_close_signal.d.ts +0 -0
  232. /package/lib/{src/shared → shared}/tab_close_signal.js +0 -0
  233. /package/lib/{src/worker → worker}/sync/AbstractSharedSyncClientProvider.js +0 -0
  234. /package/lib/{src/worker/sync/SharedSyncImplementation.worker.d.ts → worker/worker.d.ts} +0 -0
@@ -1,43 +1,40 @@
1
- import {
2
- AbstractRemote,
3
- AbstractRemoteOptions,
4
- DEFAULT_REMOTE_LOGGER,
5
- FetchImplementation,
6
- FetchImplementationProvider,
7
- ILogger,
8
- RemoteConnector
9
- } from '@powersync/common';
1
+ import { LogLevels, PowerSyncLogger } from '@powersync/common';
2
+ import { AbstractRemote, FetchOptions, RemoteConnector } from '@powersync/shared-internals';
10
3
 
11
4
  import { getUserAgentInfo } from './userAgent.js';
12
-
13
- /*
14
- * Depends on browser's implementation of global fetch.
15
- */
16
- class WebFetchProvider extends FetchImplementationProvider {
17
- getFetch(): FetchImplementation {
18
- return fetch.bind(globalThis);
19
- }
20
- }
5
+ import type { WebSocketSyncStreamPlatform, WebSocketSupport } from '@powersync/shared-internals/websockets';
21
6
 
22
7
  export class WebRemote extends AbstractRemote {
23
8
  constructor(
24
9
  protected connector: RemoteConnector,
25
- protected logger: ILogger = DEFAULT_REMOTE_LOGGER,
26
- options?: Partial<AbstractRemoteOptions>
10
+ logger: PowerSyncLogger
27
11
  ) {
28
- super(connector, logger, {
29
- ...(options ?? {}),
30
- fetchImplementation: options?.fetchImplementation ?? new WebFetchProvider()
31
- });
12
+ super(connector, logger);
13
+ }
14
+
15
+ protected fetch({ resource, request }: FetchOptions): Promise<Response> {
16
+ return fetch(resource, request);
17
+ }
18
+
19
+ protected async loadWebSocketSupport(platform: WebSocketSyncStreamPlatform): Promise<WebSocketSupport> {
20
+ if (!websockets) {
21
+ // loadWebSocketSupport being called concurrently is safe, the import resolves to the same module in that case.
22
+ const module = await import('@powersync/shared-internals/websockets');
23
+ websockets = new module.WebSocketSupport(platform);
24
+ }
25
+
26
+ return websockets;
32
27
  }
33
28
 
34
29
  getUserAgent(): string {
35
30
  let ua = [super.getUserAgent(), `powersync-web`];
36
31
  try {
37
32
  ua.push(...getUserAgentInfo());
38
- } catch (e) {
39
- this.logger.warn('Failed to get user agent info', e);
33
+ } catch (error) {
34
+ this.logger.log({ level: LogLevels.warn, message: 'Failed to get user agent info', error });
40
35
  }
41
36
  return ua.join(' ');
42
37
  }
43
38
  }
39
+
40
+ let websockets: WebSocketSupport | undefined;
@@ -1,16 +1,15 @@
1
+ import { LogLevels } from '@powersync/common';
1
2
  import {
2
3
  AbstractStreamingSyncImplementation,
3
4
  AbstractStreamingSyncImplementationOptions,
4
5
  LockOptions,
5
6
  LockType
6
- } from '@powersync/common';
7
+ } from '@powersync/shared-internals';
7
8
  import { getNavigatorLocks } from '../../shared/navigator.js';
8
- import { ResolvedWebSQLOpenOptions, WebSQLFlags } from '../adapters/web-sql-flags.js';
9
9
 
10
10
  export interface WebStreamingSyncImplementationOptions extends AbstractStreamingSyncImplementationOptions {
11
- flags?: WebSQLFlags;
12
11
  sync?: {
13
- worker?: string | URL | ((options: ResolvedWebSQLOpenOptions) => SharedWorker);
12
+ worker?: string | URL | (() => SharedWorker);
14
13
  };
15
14
  }
16
15
 
@@ -27,7 +26,7 @@ export class WebStreamingSyncImplementation extends AbstractStreamingSyncImpleme
27
26
  async obtainLock<T>(lockOptions: LockOptions<T>): Promise<T> {
28
27
  const identifier = `streaming-sync-${lockOptions.type}-${this.webOptions.identifier}`;
29
28
  if (lockOptions.type == LockType.SYNC) {
30
- this.logger.debug('requesting lock for ', identifier);
29
+ this.logger.log({ level: LogLevels.debug, message: `requesting lock for ${identifier}` });
31
30
  }
32
31
  return getNavigatorLocks().request(identifier, { signal: lockOptions.signal }, lockOptions.callback);
33
32
  }
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,28 +1,39 @@
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
  import { WASQLiteVFS } from '../../db/adapters/wa-sqlite/vfs.js';
12
8
 
13
9
  const OPEN_DB_LOCK = 'open-wasqlite-db';
14
10
 
11
+ export interface ConnectToMultiDatabaseServerOptions {
12
+ logLevel: number;
13
+ database: RawWaSqliteDatabaseOptions;
14
+ lockName: string;
15
+ }
16
+
15
17
  /**
16
18
  * Shared state to manage multiple database connections hosted by a worker.
17
19
  */
18
20
  export class MultiDatabaseServer {
19
21
  private activeDatabases = new Map<string, DatabaseServer>();
20
22
 
21
- constructor(readonly logger: ILogger) {}
23
+ constructor(readonly logger: PowerSyncLogger) {}
22
24
 
23
- async handleConnection(options: WorkerDBOpenerOptions): Promise<ClientConnectionView> {
24
- this.logger.setLevel(options.logLevel);
25
- return Comlink.proxy(await this.openConnectionLocally(options, options.lockName));
25
+ async handleConnection({
26
+ logLevel,
27
+ database,
28
+ lockName
29
+ }: ConnectToMultiDatabaseServerOptions): Promise<ClientConnectionView> {
30
+ const logger: PowerSyncLogger = {
31
+ log: (record) => {
32
+ if (record.level >= logLevel) this.logger.log(record);
33
+ }
34
+ };
35
+
36
+ return Comlink.proxy(await this.openConnectionLocally(logger, database, lockName));
26
37
  }
27
38
 
28
39
  async connectToExisting(name: string, lockName: string): Promise<ClientConnectionView> {
@@ -36,7 +47,7 @@ export class MultiDatabaseServer {
36
47
  });
37
48
  }
38
49
 
39
- async openConnectionLocally(options: ResolvedWASQLiteOpenFactoryOptions, lockName?: string) {
50
+ async openConnectionLocally(logger: PowerSyncLogger, options: RawWaSqliteDatabaseOptions, lockName?: string) {
40
51
  // Especially on Firefox, we're sometimes seeing "NoModificationAllowedError"s when opening OPFS databases we can
41
52
  // work around by retrying.
42
53
  const maxAttempts = 3;
@@ -44,29 +55,36 @@ export class MultiDatabaseServer {
44
55
 
45
56
  for (let count = 0; count < maxAttempts - 1; count++) {
46
57
  try {
47
- server = await this.databaseOpenAttempt(options);
48
- } catch (ex) {
49
- this.logger.warn(`Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`, ex);
58
+ server = await this.databaseOpenAttempt(logger, options);
59
+ } catch (error) {
60
+ this.logger.log({
61
+ level: LogLevels.warn,
62
+ message: `Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`,
63
+ error
64
+ });
50
65
  await new Promise((resolve) => setTimeout(resolve, 1000));
51
66
  }
52
67
  }
53
68
 
54
69
  // Final attempt if we haven't been able to open the server - rethrow errors if we still can't open.
55
- server ??= await this.databaseOpenAttempt(options);
70
+ server ??= await this.databaseOpenAttempt(logger, options);
56
71
  return server.connect(lockName);
57
72
  }
58
73
 
59
- private async databaseOpenAttempt(options: ResolvedWASQLiteOpenFactoryOptions): Promise<DatabaseServer> {
74
+ private async databaseOpenAttempt(
75
+ logger: PowerSyncLogger,
76
+ options: RawWaSqliteDatabaseOptions
77
+ ): Promise<DatabaseServer> {
60
78
  return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
61
- const { dbFilename, isReadOnly, vfs } = options;
79
+ const { filename, readonly, vfs } = options;
62
80
 
63
- let server: DatabaseServer | undefined = this.activeDatabases.get(dbFilename);
81
+ let server: DatabaseServer | undefined = this.activeDatabases.get(filename);
64
82
  if (server == null) {
65
83
  // We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
66
84
  // For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
67
85
  // fine). In-memory databases either run in a shared worker or aren't shared across tabs at all, so the internal
68
86
  // lock is enough.
69
- const needsNavigatorLocks = !(isSharedWorker || isReadOnly || vfs == WASQLiteVFS.InMemoryVfs);
87
+ const needsNavigatorLocks = !(isSharedWorker || readonly || vfs == WASQLiteVFS.InMemoryVfs);
70
88
  const connection = new RawSqliteConnection(options);
71
89
  const withSafeConcurrency = new ConcurrentSqliteConnection(connection, needsNavigatorLocks);
72
90
 
@@ -83,13 +101,13 @@ export class MultiDatabaseServer {
83
101
  }
84
102
  returnLease();
85
103
 
86
- const onClose = () => this.activeDatabases.delete(dbFilename);
104
+ const onClose = () => this.activeDatabases.delete(filename);
87
105
  server = new DatabaseServer({
88
106
  inner: withSafeConcurrency,
89
- logger: this.logger,
107
+ logger,
90
108
  onClose
91
109
  });
92
- this.activeDatabases.set(dbFilename, server);
110
+ this.activeDatabases.set(filename, server);
93
111
  }
94
112
 
95
113
  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
  }