@powersync/web 0.0.0-dev-20260708104358 → 0.0.0-dev-20260917074240

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 (267) hide show
  1. package/README.md +1 -11
  2. package/bin/powersync.cjs +1 -1
  3. package/dist/index.react_native_web.js +2095 -0
  4. package/dist/index.react_native_web.js.map +1 -0
  5. package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js +2 -0
  6. package/dist/worker/AccessHandlePoolVFS-BPUHfZME.js.map +1 -0
  7. package/dist/worker/FacadeVFS-d1ZDvud7.js +2 -0
  8. package/dist/worker/FacadeVFS-d1ZDvud7.js.map +1 -0
  9. package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js +2 -0
  10. package/dist/worker/IDBBatchAtomicVFS-DbkDb777.js.map +1 -0
  11. package/dist/worker/MemoryVFS-DVJL5F8j.js +2 -0
  12. package/dist/worker/MemoryVFS-DVJL5F8j.js.map +1 -0
  13. package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js +2 -0
  14. package/dist/worker/OPFSCoopSyncVFS-BgTiWPfa.js.map +1 -0
  15. package/dist/worker/OPFSWriteAheadVFS-Rt5CGCZP.js +2 -0
  16. package/dist/worker/OPFSWriteAheadVFS-Rt5CGCZP.js.map +1 -0
  17. package/dist/worker/assets/mc-wa-sqlite-BHScYYZw.wasm +0 -0
  18. package/dist/worker/assets/mc-wa-sqlite-async-DdlQmAUV.wasm +0 -0
  19. package/dist/worker/assets/wa-sqlite-CIxTmRHQ.wasm +0 -0
  20. package/dist/worker/assets/wa-sqlite-async-zc68fxQq.wasm +0 -0
  21. package/dist/worker/mc-wa-sqlite-PubB6u8c.js +2 -0
  22. package/dist/worker/mc-wa-sqlite-PubB6u8c.js.map +1 -0
  23. package/dist/worker/mc-wa-sqlite-async-DJG_ANKO.js +2 -0
  24. package/dist/worker/mc-wa-sqlite-async-DJG_ANKO.js.map +1 -0
  25. package/dist/worker/wa-sqlite-D1_4mGs8.js +2 -0
  26. package/dist/worker/wa-sqlite-D1_4mGs8.js.map +1 -0
  27. package/dist/worker/wa-sqlite-async-BxkwNY-2.js +2 -0
  28. package/dist/worker/wa-sqlite-async-BxkwNY-2.js.map +1 -0
  29. package/dist/worker/websockets-Q8W_lerF.js +9 -0
  30. package/dist/worker/websockets-Q8W_lerF.js.map +1 -0
  31. package/dist/worker/worker.js +7 -0
  32. package/dist/worker/worker.js.map +1 -0
  33. package/lib/attachments/IndexDBFileSystemAdapter.js.map +1 -0
  34. package/lib/{src/db → db}/NavigatorTriggerClaimManager.d.ts +1 -1
  35. package/lib/db/NavigatorTriggerClaimManager.js.map +1 -0
  36. package/lib/db/PowerSyncDatabase.d.ts +66 -0
  37. package/lib/{src/db → db}/PowerSyncDatabase.js +60 -79
  38. package/lib/db/PowerSyncDatabase.js.map +1 -0
  39. package/lib/db/adapters/AsyncWebAdapter.d.ts +32 -0
  40. package/lib/{src/db → db}/adapters/AsyncWebAdapter.js +18 -69
  41. package/lib/db/adapters/AsyncWebAdapter.js.map +1 -0
  42. package/lib/db/adapters/SSRDBAdapter.d.ts +17 -0
  43. package/lib/db/adapters/SSRDBAdapter.js +37 -0
  44. package/lib/db/adapters/SSRDBAdapter.js.map +1 -0
  45. package/lib/{src/db → db}/adapters/WebDBAdapter.d.ts +1 -1
  46. package/lib/db/adapters/WebDBAdapter.js.map +1 -0
  47. package/lib/db/adapters/acquireFromPool.d.ts +7 -0
  48. package/lib/db/adapters/acquireFromPool.js +60 -0
  49. package/lib/db/adapters/acquireFromPool.js.map +1 -0
  50. package/lib/db/adapters/memory-pool/client.d.ts +70 -0
  51. package/lib/db/adapters/memory-pool/client.js +269 -0
  52. package/lib/db/adapters/memory-pool/client.js.map +1 -0
  53. package/lib/db/adapters/memory-pool/shared.d.ts +51 -0
  54. package/lib/db/adapters/memory-pool/shared.js +16 -0
  55. package/lib/db/adapters/memory-pool/shared.js.map +1 -0
  56. package/lib/db/adapters/memory-pool/vfs.d.ts +19 -0
  57. package/lib/db/adapters/memory-pool/vfs.js +247 -0
  58. package/lib/db/adapters/memory-pool/vfs.js.map +1 -0
  59. package/lib/db/adapters/memory-pool/worker.js +45 -0
  60. package/lib/db/adapters/memory-pool/worker.js.map +1 -0
  61. package/lib/db/adapters/options.d.ts +94 -0
  62. package/lib/db/adapters/options.js +6 -0
  63. package/lib/db/adapters/options.js.map +1 -0
  64. package/lib/db/adapters/resolveAndValidateOptions.d.ts +13 -0
  65. package/lib/db/adapters/resolveAndValidateOptions.js +41 -0
  66. package/lib/db/adapters/resolveAndValidateOptions.js.map +1 -0
  67. package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.d.ts +3 -4
  68. package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.js +2 -2
  69. package/lib/db/adapters/wa-sqlite/ConcurrentConnection.js.map +1 -0
  70. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.d.ts +4 -4
  71. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.js +11 -37
  72. package/lib/db/adapters/wa-sqlite/DatabaseClient.js.map +1 -0
  73. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.d.ts +5 -5
  74. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.js +14 -7
  75. package/lib/db/adapters/wa-sqlite/DatabaseServer.js.map +1 -0
  76. package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.d.ts +30 -12
  77. package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.js +70 -16
  78. package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -0
  79. package/lib/db/adapters/wa-sqlite/StatementCache.d.ts +16 -0
  80. package/lib/db/adapters/wa-sqlite/StatementCache.js +44 -0
  81. package/lib/db/adapters/wa-sqlite/StatementCache.js.map +1 -0
  82. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +18 -0
  83. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +140 -0
  84. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -0
  85. package/lib/{src/db → db}/adapters/wa-sqlite/vfs.d.ts +9 -2
  86. package/lib/{src/db → db}/adapters/wa-sqlite/vfs.js +6 -6
  87. package/lib/db/adapters/wa-sqlite/vfs.js.map +1 -0
  88. package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.d.ts +5 -16
  89. package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.js +7 -23
  90. package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -0
  91. package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.d.ts +15 -15
  92. package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.js +38 -70
  93. package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -0
  94. package/lib/db/sync/TabLocalStreamingSyncImplementation.d.ts +19 -0
  95. package/lib/db/sync/TabLocalStreamingSyncImplementation.js +70 -0
  96. package/lib/db/sync/TabLocalStreamingSyncImplementation.js.map +1 -0
  97. package/lib/db/sync/WebRemote.d.ts +10 -0
  98. package/lib/db/sync/WebRemote.js +33 -0
  99. package/lib/db/sync/WebRemote.js.map +1 -0
  100. package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.d.ts +2 -4
  101. package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.js +3 -2
  102. package/lib/db/sync/WebStreamingSyncImplementation.js.map +1 -0
  103. package/lib/db/sync/userAgent.js.map +1 -0
  104. package/lib/{src/index.d.ts → index.d.ts} +1 -3
  105. package/lib/{src/index.js → index.js} +1 -3
  106. package/lib/index.js.map +1 -0
  107. package/lib/shared/navigator.js.map +1 -0
  108. package/lib/shared/tab_close_signal.js.map +1 -0
  109. package/lib/worker/SharedWorkerConnectionRequest.d.ts +5 -0
  110. package/lib/worker/SharedWorkerConnectionRequest.js +2 -0
  111. package/lib/worker/SharedWorkerConnectionRequest.js.map +1 -0
  112. package/lib/worker/client.d.ts +17 -0
  113. package/lib/worker/client.js +90 -0
  114. package/lib/worker/client.js.map +1 -0
  115. package/lib/worker/db/MultiDatabaseServer.d.ts +21 -0
  116. package/lib/{src/worker → worker}/db/MultiDatabaseServer.js +45 -24
  117. package/lib/worker/db/MultiDatabaseServer.js.map +1 -0
  118. package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +14 -0
  119. package/lib/worker/sync/AbstractSharedSyncClientProvider.js.map +1 -0
  120. package/lib/worker/sync/BroadcastLogger.d.ts +27 -0
  121. package/lib/worker/sync/BroadcastLogger.js +65 -0
  122. package/lib/worker/sync/BroadcastLogger.js.map +1 -0
  123. package/lib/{src/worker → worker}/sync/SharedSyncImplementation.d.ts +14 -25
  124. package/lib/{src/worker → worker}/sync/SharedSyncImplementation.js +140 -107
  125. package/lib/worker/sync/SharedSyncImplementation.js.map +1 -0
  126. package/lib/{src/worker → worker}/sync/WorkerClient.d.ts +4 -4
  127. package/lib/{src/worker → worker}/sync/WorkerClient.js +5 -5
  128. package/lib/worker/sync/WorkerClient.js.map +1 -0
  129. package/lib/worker/worker.d.ts +1 -0
  130. package/lib/worker/worker.js +34 -0
  131. package/lib/worker/worker.js.map +1 -0
  132. package/package.json +31 -32
  133. package/src/db/NavigatorTriggerClaimManager.ts +1 -1
  134. package/src/db/PowerSyncDatabase.ts +96 -144
  135. package/src/db/adapters/AsyncWebAdapter.ts +29 -86
  136. package/src/db/adapters/SSRDBAdapter.ts +14 -64
  137. package/src/db/adapters/WebDBAdapter.ts +1 -1
  138. package/src/db/adapters/acquireFromPool.ts +73 -0
  139. package/src/db/adapters/memory-pool/client.ts +367 -0
  140. package/src/db/adapters/memory-pool/shared.ts +79 -0
  141. package/src/db/adapters/memory-pool/vfs.ts +293 -0
  142. package/src/db/adapters/memory-pool/worker.ts +53 -0
  143. package/src/db/adapters/options.ts +108 -0
  144. package/src/db/adapters/resolveAndValidateOptions.ts +49 -0
  145. package/src/db/adapters/wa-sqlite/ConcurrentConnection.ts +4 -5
  146. package/src/db/adapters/wa-sqlite/DatabaseClient.ts +20 -56
  147. package/src/db/adapters/wa-sqlite/DatabaseServer.ts +18 -12
  148. package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +108 -30
  149. package/src/db/adapters/wa-sqlite/StatementCache.ts +50 -0
  150. package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +82 -125
  151. package/src/db/adapters/wa-sqlite/vfs.ts +13 -8
  152. package/src/db/sync/SSRWebStreamingSyncImplementation.ts +8 -36
  153. package/src/db/sync/SharedWebStreamingSyncImplementation.ts +47 -82
  154. package/src/db/sync/TabLocalStreamingSyncImplementation.ts +90 -0
  155. package/src/db/sync/WebRemote.ts +23 -26
  156. package/src/db/sync/WebStreamingSyncImplementation.ts +4 -5
  157. package/src/index.ts +1 -3
  158. package/src/worker/SharedWorkerConnectionRequest.ts +6 -0
  159. package/src/worker/client.ts +121 -0
  160. package/src/worker/db/MultiDatabaseServer.ts +59 -33
  161. package/src/worker/sync/AbstractSharedSyncClientProvider.ts +5 -10
  162. package/src/worker/sync/BroadcastLogger.ts +35 -103
  163. package/src/worker/sync/SharedSyncImplementation.ts +197 -138
  164. package/src/worker/sync/WorkerClient.ts +8 -8
  165. package/src/worker/worker.ts +38 -0
  166. package/dist/2075a31bb151adbb9767.wasm +0 -0
  167. package/dist/3322bc84de986b63c2cd.wasm +0 -0
  168. package/dist/8e97452e297be23b5e50.wasm +0 -0
  169. package/dist/fbc178b70d530e8ce02b.wasm +0 -0
  170. package/dist/index.umd.js +0 -7821
  171. package/dist/index.umd.js.map +0 -1
  172. package/dist/worker/SharedSyncImplementation.umd.js +0 -16139
  173. package/dist/worker/SharedSyncImplementation.umd.js.map +0 -1
  174. package/dist/worker/WASQLiteDB.umd.js +0 -17434
  175. package/dist/worker/WASQLiteDB.umd.js.map +0 -1
  176. 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
  177. 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
  178. 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
  179. 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
  180. 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
  181. 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
  182. 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
  183. 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
  184. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js +0 -3562
  185. 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
  186. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-833585.umd.js +0 -1400
  187. 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
  188. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js +0 -2478
  189. 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
  190. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js +0 -1681
  191. 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
  192. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js +0 -1820
  193. 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
  194. package/lib/package.json +0 -91
  195. package/lib/src/attachments/IndexDBFileSystemAdapter.js.map +0 -1
  196. package/lib/src/db/NavigatorTriggerClaimManager.js.map +0 -1
  197. package/lib/src/db/PowerSyncDatabase.d.ts +0 -78
  198. package/lib/src/db/PowerSyncDatabase.js.map +0 -1
  199. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.d.ts +0 -23
  200. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js +0 -27
  201. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js.map +0 -1
  202. package/lib/src/db/adapters/AsyncWebAdapter.d.ts +0 -50
  203. package/lib/src/db/adapters/AsyncWebAdapter.js.map +0 -1
  204. package/lib/src/db/adapters/SSRDBAdapter.d.ts +0 -30
  205. package/lib/src/db/adapters/SSRDBAdapter.js +0 -69
  206. package/lib/src/db/adapters/SSRDBAdapter.js.map +0 -1
  207. package/lib/src/db/adapters/WebDBAdapter.js.map +0 -1
  208. package/lib/src/db/adapters/wa-sqlite/ConcurrentConnection.js.map +0 -1
  209. package/lib/src/db/adapters/wa-sqlite/DatabaseClient.js.map +0 -1
  210. package/lib/src/db/adapters/wa-sqlite/DatabaseServer.js.map +0 -1
  211. package/lib/src/db/adapters/wa-sqlite/RawSqliteConnection.js.map +0 -1
  212. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +0 -45
  213. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +0 -146
  214. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +0 -1
  215. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.d.ts +0 -15
  216. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js +0 -22
  217. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js.map +0 -1
  218. package/lib/src/db/adapters/wa-sqlite/vfs.js.map +0 -1
  219. package/lib/src/db/adapters/web-sql-flags.d.ts +0 -92
  220. package/lib/src/db/adapters/web-sql-flags.js +0 -37
  221. package/lib/src/db/adapters/web-sql-flags.js.map +0 -1
  222. package/lib/src/db/sync/SSRWebStreamingSyncImplementation.js.map +0 -1
  223. package/lib/src/db/sync/SharedWebStreamingSyncImplementation.js.map +0 -1
  224. package/lib/src/db/sync/WebRemote.d.ts +0 -7
  225. package/lib/src/db/sync/WebRemote.js +0 -33
  226. package/lib/src/db/sync/WebRemote.js.map +0 -1
  227. package/lib/src/db/sync/WebStreamingSyncImplementation.js.map +0 -1
  228. package/lib/src/db/sync/userAgent.js.map +0 -1
  229. package/lib/src/index.js.map +0 -1
  230. package/lib/src/shared/navigator.js.map +0 -1
  231. package/lib/src/shared/tab_close_signal.js.map +0 -1
  232. package/lib/src/worker/db/MultiDatabaseServer.d.ts +0 -17
  233. package/lib/src/worker/db/MultiDatabaseServer.js.map +0 -1
  234. package/lib/src/worker/db/WASQLiteDB.worker.d.ts +0 -4
  235. package/lib/src/worker/db/WASQLiteDB.worker.js +0 -31
  236. package/lib/src/worker/db/WASQLiteDB.worker.js.map +0 -1
  237. package/lib/src/worker/db/open-worker-database.d.ts +0 -14
  238. package/lib/src/worker/db/open-worker-database.js +0 -53
  239. package/lib/src/worker/db/open-worker-database.js.map +0 -1
  240. package/lib/src/worker/sync/AbstractSharedSyncClientProvider.d.ts +0 -19
  241. package/lib/src/worker/sync/AbstractSharedSyncClientProvider.js.map +0 -1
  242. package/lib/src/worker/sync/BroadcastLogger.d.ts +0 -47
  243. package/lib/src/worker/sync/BroadcastLogger.js +0 -129
  244. package/lib/src/worker/sync/BroadcastLogger.js.map +0 -1
  245. package/lib/src/worker/sync/SharedSyncImplementation.js.map +0 -1
  246. package/lib/src/worker/sync/SharedSyncImplementation.worker.js +0 -12
  247. package/lib/src/worker/sync/SharedSyncImplementation.worker.js.map +0 -1
  248. package/lib/src/worker/sync/WorkerClient.js.map +0 -1
  249. package/lib/tsconfig.tsbuildinfo +0 -1
  250. package/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts +0 -47
  251. package/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts +0 -24
  252. package/src/db/adapters/web-sql-flags.ts +0 -141
  253. package/src/worker/db/WASQLiteDB.worker.ts +0 -35
  254. package/src/worker/db/open-worker-database.ts +0 -62
  255. package/src/worker/sync/SharedSyncImplementation.worker.ts +0 -14
  256. /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.d.ts +0 -0
  257. /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.js +0 -0
  258. /package/lib/{src/db → db}/NavigatorTriggerClaimManager.js +0 -0
  259. /package/lib/{src/db → db}/adapters/WebDBAdapter.js +0 -0
  260. /package/lib/{src/worker/sync/SharedSyncImplementation.worker.d.ts → db/adapters/memory-pool/worker.d.ts} +0 -0
  261. /package/lib/{src/db → db}/sync/userAgent.d.ts +0 -0
  262. /package/lib/{src/db → db}/sync/userAgent.js +0 -0
  263. /package/lib/{src/shared → shared}/navigator.d.ts +0 -0
  264. /package/lib/{src/shared → shared}/navigator.js +0 -0
  265. /package/lib/{src/shared → shared}/tab_close_signal.d.ts +0 -0
  266. /package/lib/{src/shared → shared}/tab_close_signal.js +0 -0
  267. /package/lib/{src/worker → worker}/sync/AbstractSharedSyncClientProvider.js +0 -0
@@ -0,0 +1,121 @@
1
+ import { LogLevels, PowerSyncLogger } from '@powersync/common';
2
+ import { SharedWorkerConnectionRequest, WorkerService } from './SharedWorkerConnectionRequest.js';
3
+
4
+ export interface OpenWorkerOptions {
5
+ service: WorkerService;
6
+ databaseIdentifier: string;
7
+ customWorker?: string | URL;
8
+ shared: boolean;
9
+ loggerForErrors: PowerSyncLogger;
10
+ }
11
+
12
+ export interface WorkerConnection {
13
+ endpoint: MessagePort | Worker;
14
+ worker: Worker | SharedWorker;
15
+ close: () => void;
16
+ }
17
+
18
+ export function connectToWorker({
19
+ service,
20
+ databaseIdentifier,
21
+ customWorker,
22
+ shared,
23
+ loggerForErrors
24
+ }: OpenWorkerOptions): WorkerConnection {
25
+ const name = `${shared ? 'shared-' : ''}powersync-${databaseIdentifier}`;
26
+ let worker: Worker | SharedWorker;
27
+
28
+ if (customWorker) {
29
+ worker = shared
30
+ ? new SharedWorker(customWorker, {
31
+ /* @vite-ignore */
32
+ name,
33
+ type: 'module'
34
+ })
35
+ : new Worker(customWorker, {
36
+ /* @vite-ignore */
37
+ name,
38
+ type: 'module'
39
+ });
40
+ } else {
41
+ worker = spawnDefaultPowerSyncWorker(shared, name);
42
+ }
43
+
44
+ return connectToExistingWorker(worker, loggerForErrors, service);
45
+ }
46
+
47
+ /**
48
+ * Opens the default PowerSync worker.
49
+ *
50
+ * When users depend on the web SDK, we assume they use their own bundler (either vite or webpack). Both recognize the
51
+ * syntax of worker constructors with a string literal and will rewrite the URL as part of their bundling processes.
52
+ *
53
+ * React Native / Metro users can't rely on this on the web, as their app is not a JavaScript module and import.meta.url
54
+ * is not rewritten by Metro. For those users, we include a pre-bundled worker they can copy into a static assets
55
+ * directory and load with a custom URI. This also means that defaultWorker cannot work with Metro for React Native Web.
56
+ * We have a custom rollup plugin and conditional exports that replaces this function with a throwing stub for that
57
+ * platform. This allows a helpful error message.
58
+ */
59
+ // Note: When changing this function, also update disableDefaultWorkers in rollup.config.ts.
60
+ function spawnDefaultPowerSyncWorker(shared: boolean, name: string): Worker | SharedWorker {
61
+ return shared
62
+ ? new SharedWorker(new URL('./worker.js', import.meta.url), {
63
+ /* @vite-ignore */
64
+ name,
65
+ type: 'module'
66
+ })
67
+ : new Worker(new URL('./worker.js', import.meta.url), {
68
+ /* @vite-ignore */
69
+ name,
70
+ type: 'module'
71
+ });
72
+ }
73
+
74
+ export function connectToExistingWorker(
75
+ worker: Worker | SharedWorker,
76
+ logger: PowerSyncLogger,
77
+ service: WorkerService
78
+ ): WorkerConnection {
79
+ function logError(event: ErrorEvent) {
80
+ // TODO: Ideally, we should be able to handle worker errors by forwarding them to async Comlink callers.
81
+ // Currently, comlink calls on errored workers would just be stuck forever.
82
+ logger.log({
83
+ level: LogLevels.error,
84
+ error: event.error,
85
+ message: 'Error in database or sync worker, this likely disrupts PowerSync.'
86
+ });
87
+ }
88
+
89
+ (worker as AbstractWorker).addEventListener('error', logError);
90
+
91
+ const isShared = isSharedWorker(worker);
92
+ if (isShared) {
93
+ const { port1, port2 } = new MessageChannel();
94
+ const mainPort = (worker as SharedWorker).port;
95
+ mainPort.start();
96
+ mainPort.postMessage({ port: port1, service } satisfies SharedWorkerConnectionRequest, [port1]);
97
+
98
+ port2.start();
99
+ return {
100
+ endpoint: port2,
101
+ worker,
102
+ close() {
103
+ worker.removeEventListener('error', logError);
104
+ port2.close();
105
+ }
106
+ };
107
+ } else {
108
+ return {
109
+ endpoint: worker as Worker,
110
+ worker,
111
+ close() {
112
+ worker.removeEventListener('error', logError);
113
+ worker.terminate();
114
+ }
115
+ };
116
+ }
117
+ }
118
+
119
+ export function isSharedWorker(worker: Worker | SharedWorker): worker is SharedWorker {
120
+ return 'port' in worker;
121
+ }
@@ -1,33 +1,46 @@
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';
8
+ import { Mutex } from '@powersync/shared-internals';
12
9
 
13
10
  const OPEN_DB_LOCK = 'open-wasqlite-db';
14
11
 
12
+ export interface ConnectToMultiDatabaseServerOptions {
13
+ logLevel: number;
14
+ database: RawWaSqliteDatabaseOptions;
15
+ lockName: string;
16
+ }
17
+
15
18
  /**
16
19
  * Shared state to manage multiple database connections hosted by a worker.
17
20
  */
18
21
  export class MultiDatabaseServer {
19
- private activeDatabases = new Map<string, DatabaseServer>();
20
-
21
- constructor(readonly logger: ILogger) {}
22
+ readonly #activeDatabases = new Map<string, DatabaseServer>();
23
+ readonly #localOpenLock = new Mutex();
24
+
25
+ constructor(readonly logger: PowerSyncLogger) {}
26
+
27
+ async handleConnection({
28
+ logLevel,
29
+ database,
30
+ lockName
31
+ }: ConnectToMultiDatabaseServerOptions): Promise<ClientConnectionView> {
32
+ const logger: PowerSyncLogger = {
33
+ log: (record) => {
34
+ if (record.level >= logLevel) this.logger.log(record);
35
+ }
36
+ };
22
37
 
23
- async handleConnection(options: WorkerDBOpenerOptions): Promise<ClientConnectionView> {
24
- this.logger.setLevel(options.logLevel);
25
- return Comlink.proxy(await this.openConnectionLocally(options, options.lockName));
38
+ return Comlink.proxy(await this.openConnectionLocally(logger, database, lockName));
26
39
  }
27
40
 
28
41
  async connectToExisting(name: string, lockName: string): Promise<ClientConnectionView> {
29
42
  return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
30
- const server = this.activeDatabases.get(name);
43
+ const server = this.#activeDatabases.get(name);
31
44
  if (server == null) {
32
45
  throw new Error(`connectToExisting(${name}) failed because the worker doesn't own a database with that name.`);
33
46
  }
@@ -36,7 +49,7 @@ export class MultiDatabaseServer {
36
49
  });
37
50
  }
38
51
 
39
- async openConnectionLocally(options: ResolvedWASQLiteOpenFactoryOptions, lockName?: string) {
52
+ async openConnectionLocally(logger: PowerSyncLogger, options: RawWaSqliteDatabaseOptions, lockName?: string) {
40
53
  // Especially on Firefox, we're sometimes seeing "NoModificationAllowedError"s when opening OPFS databases we can
41
54
  // work around by retrying.
42
55
  const maxAttempts = 3;
@@ -44,29 +57,34 @@ export class MultiDatabaseServer {
44
57
 
45
58
  for (let count = 0; count < maxAttempts - 1; count++) {
46
59
  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);
60
+ server = await this.#databaseOpenAttempt(logger, options);
61
+ } catch (error) {
62
+ this.logger.log({
63
+ level: LogLevels.warn,
64
+ message: `Attempt ${count + 1} of ${maxAttempts} to open database failed, retrying in 1 second...`,
65
+ error
66
+ });
50
67
  await new Promise((resolve) => setTimeout(resolve, 1000));
51
68
  }
52
69
  }
53
70
 
54
71
  // 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);
72
+ server ??= await this.#databaseOpenAttempt(logger, options);
56
73
  return server.connect(lockName);
57
74
  }
58
75
 
59
- private async databaseOpenAttempt(options: ResolvedWASQLiteOpenFactoryOptions): Promise<DatabaseServer> {
60
- return getNavigatorLocks().request(OPEN_DB_LOCK, async () => {
61
- const { dbFilename, isReadOnly, vfs } = options;
62
-
63
- let server: DatabaseServer | undefined = this.activeDatabases.get(dbFilename);
76
+ async #databaseOpenAttempt(logger: PowerSyncLogger, options: RawWaSqliteDatabaseOptions): Promise<DatabaseServer> {
77
+ const { filename, readonly, vfs } = options;
78
+ // We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
79
+ // For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
80
+ // fine). In-memory databases either run in a shared worker or aren't shared across tabs at all, so the internal
81
+ // lock is enough.
82
+ const needsNavigatorLocks = !(isSharedWorker || readonly || vfs == WASQLiteVFS.InMemoryVfs);
83
+ const activeDatabases = this.#activeDatabases;
84
+
85
+ async function openDatabase() {
86
+ let server: DatabaseServer | undefined = activeDatabases.get(filename);
64
87
  if (server == null) {
65
- // We don't need navigator locks for shared workers because all queries run in this shared worker exclusively.
66
- // For read-only connections, we use a VFS that supports concurrent reads (so a single lock on the connection is
67
- // fine). In-memory databases either run in a shared worker or aren't shared across tabs at all, so the internal
68
- // lock is enough.
69
- const needsNavigatorLocks = !(isSharedWorker || isReadOnly || vfs == WASQLiteVFS.InMemoryVfs);
70
88
  const connection = new RawSqliteConnection(options);
71
89
  const withSafeConcurrency = new ConcurrentSqliteConnection(connection, needsNavigatorLocks);
72
90
 
@@ -83,21 +101,29 @@ export class MultiDatabaseServer {
83
101
  }
84
102
  returnLease();
85
103
 
86
- const onClose = () => this.activeDatabases.delete(dbFilename);
104
+ const onClose = () => 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
+ activeDatabases.set(filename, server);
93
111
  }
94
112
 
95
113
  return server;
96
- });
114
+ }
115
+
116
+ if (needsNavigatorLocks) {
117
+ return getNavigatorLocks().request(OPEN_DB_LOCK, openDatabase);
118
+ } else {
119
+ // Even if we don't need navigator locks, this avoids a race between the activeDatabases.get() call, the async
120
+ // open logic and the final activeDatabases.set() step.
121
+ return this.#localOpenLock.runExclusive(openDatabase);
122
+ }
97
123
  }
98
124
 
99
125
  closeAll() {
100
- const existingDatabases = [...this.activeDatabases.values()];
126
+ const existingDatabases = [...this.#activeDatabases.values()];
101
127
  return Promise.all(
102
128
  existingDatabases.map((db) => {
103
129
  db.forceClose();
@@ -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,9 @@ 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 postCheckpointRequest(clientId: string, requestId: string): Promise<string | null>;
12
+ abstract statusChanged(status: SyncStatusJson): void;
11
13
  abstract getDBWorkerPort(): Promise<MessagePort>;
12
14
 
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;
15
+ abstract log(record: LogRecord): void;
21
16
  }
@@ -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
  }