@powersync/web 1.39.0 → 2.1.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 (243) hide show
  1. package/README.md +0 -10
  2. package/bin/powersync.cjs +1 -1
  3. package/dist/index.react_native_web.js +1992 -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-BzodSqNq.js +2 -0
  16. package/dist/worker/OPFSWriteAheadVFS-BzodSqNq.js.map +1 -0
  17. package/dist/worker/assets/mc-wa-sqlite-DoDpgFfE.wasm +0 -0
  18. package/dist/worker/assets/mc-wa-sqlite-async-DYagSq56.wasm +0 -0
  19. package/dist/worker/assets/wa-sqlite-CagagB9I.wasm +0 -0
  20. package/dist/worker/assets/wa-sqlite-async-DCIP8kAx.wasm +0 -0
  21. package/dist/worker/mc-wa-sqlite-DDFgWP93.js +2 -0
  22. package/dist/worker/mc-wa-sqlite-DDFgWP93.js.map +1 -0
  23. package/dist/worker/mc-wa-sqlite-async-lGclTjKJ.js +2 -0
  24. package/dist/worker/mc-wa-sqlite-async-lGclTjKJ.js.map +1 -0
  25. package/dist/worker/wa-sqlite-B0tZMM0j.js +2 -0
  26. package/dist/worker/wa-sqlite-B0tZMM0j.js.map +1 -0
  27. package/dist/worker/wa-sqlite-async-CM6BmfRh.js +2 -0
  28. package/dist/worker/wa-sqlite-async-CM6BmfRh.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 +67 -0
  37. package/lib/{src/db → db}/PowerSyncDatabase.js +49 -63
  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 +15 -15
  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/options.d.ts +87 -0
  48. package/lib/db/adapters/options.js +6 -0
  49. package/lib/db/adapters/options.js.map +1 -0
  50. package/lib/db/adapters/resolveAndValidateOptions.d.ts +13 -0
  51. package/lib/db/adapters/resolveAndValidateOptions.js +41 -0
  52. package/lib/db/adapters/resolveAndValidateOptions.js.map +1 -0
  53. package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.d.ts +3 -4
  54. package/lib/{src/db → db}/adapters/wa-sqlite/ConcurrentConnection.js +2 -2
  55. package/lib/db/adapters/wa-sqlite/ConcurrentConnection.js.map +1 -0
  56. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.d.ts +4 -4
  57. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseClient.js +11 -37
  58. package/lib/db/adapters/wa-sqlite/DatabaseClient.js.map +1 -0
  59. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.d.ts +5 -5
  60. package/lib/{src/db → db}/adapters/wa-sqlite/DatabaseServer.js +14 -7
  61. package/lib/db/adapters/wa-sqlite/DatabaseServer.js.map +1 -0
  62. package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.d.ts +22 -12
  63. package/lib/{src/db → db}/adapters/wa-sqlite/RawSqliteConnection.js +12 -9
  64. package/lib/db/adapters/wa-sqlite/RawSqliteConnection.js.map +1 -0
  65. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +18 -0
  66. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +137 -0
  67. package/lib/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +1 -0
  68. package/lib/{src/db → db}/adapters/wa-sqlite/vfs.d.ts +9 -2
  69. package/lib/{src/db → db}/adapters/wa-sqlite/vfs.js +6 -6
  70. package/lib/db/adapters/wa-sqlite/vfs.js.map +1 -0
  71. package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.d.ts +4 -8
  72. package/lib/{src/db → db}/sync/SSRWebStreamingSyncImplementation.js +4 -11
  73. package/lib/db/sync/SSRWebStreamingSyncImplementation.js.map +1 -0
  74. package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.d.ts +13 -14
  75. package/lib/{src/db → db}/sync/SharedWebStreamingSyncImplementation.js +32 -66
  76. package/lib/db/sync/SharedWebStreamingSyncImplementation.js.map +1 -0
  77. package/lib/db/sync/TabLocalStreamingSyncImplementation.d.ts +19 -0
  78. package/lib/db/sync/TabLocalStreamingSyncImplementation.js +70 -0
  79. package/lib/db/sync/TabLocalStreamingSyncImplementation.js.map +1 -0
  80. package/lib/db/sync/WebRemote.d.ts +10 -0
  81. package/lib/db/sync/WebRemote.js +33 -0
  82. package/lib/db/sync/WebRemote.js.map +1 -0
  83. package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.d.ts +2 -4
  84. package/lib/{src/db → db}/sync/WebStreamingSyncImplementation.js +3 -2
  85. package/lib/db/sync/WebStreamingSyncImplementation.js.map +1 -0
  86. package/lib/db/sync/userAgent.js.map +1 -0
  87. package/lib/{src/index.d.ts → index.d.ts} +1 -3
  88. package/lib/{src/index.js → index.js} +1 -3
  89. package/lib/index.js.map +1 -0
  90. package/lib/shared/navigator.js.map +1 -0
  91. package/lib/shared/tab_close_signal.js.map +1 -0
  92. package/lib/worker/SharedWorkerConnectionRequest.d.ts +5 -0
  93. package/lib/worker/SharedWorkerConnectionRequest.js +2 -0
  94. package/lib/worker/SharedWorkerConnectionRequest.js.map +1 -0
  95. package/lib/worker/client.d.ts +17 -0
  96. package/lib/worker/client.js +90 -0
  97. package/lib/worker/client.js.map +1 -0
  98. package/lib/worker/db/MultiDatabaseServer.d.ts +22 -0
  99. package/lib/{src/worker → worker}/db/MultiDatabaseServer.js +25 -15
  100. package/lib/worker/db/MultiDatabaseServer.js.map +1 -0
  101. package/lib/worker/sync/AbstractSharedSyncClientProvider.d.ts +13 -0
  102. package/lib/worker/sync/AbstractSharedSyncClientProvider.js.map +1 -0
  103. package/lib/worker/sync/BroadcastLogger.d.ts +27 -0
  104. package/lib/worker/sync/BroadcastLogger.js +65 -0
  105. package/lib/worker/sync/BroadcastLogger.js.map +1 -0
  106. package/lib/{src/worker → worker}/sync/SharedSyncImplementation.d.ts +12 -15
  107. package/lib/{src/worker → worker}/sync/SharedSyncImplementation.js +44 -44
  108. package/lib/worker/sync/SharedSyncImplementation.js.map +1 -0
  109. package/lib/{src/worker → worker}/sync/WorkerClient.d.ts +3 -3
  110. package/lib/{src/worker → worker}/sync/WorkerClient.js +2 -2
  111. package/lib/worker/sync/WorkerClient.js.map +1 -0
  112. package/lib/worker/worker.js +34 -0
  113. package/lib/worker/worker.js.map +1 -0
  114. package/package.json +23 -31
  115. package/src/db/NavigatorTriggerClaimManager.ts +1 -1
  116. package/src/db/PowerSyncDatabase.ts +83 -127
  117. package/src/db/adapters/AsyncWebAdapter.ts +18 -27
  118. package/src/db/adapters/SSRDBAdapter.ts +14 -64
  119. package/src/db/adapters/WebDBAdapter.ts +1 -1
  120. package/src/db/adapters/options.ts +100 -0
  121. package/src/db/adapters/resolveAndValidateOptions.ts +49 -0
  122. package/src/db/adapters/wa-sqlite/ConcurrentConnection.ts +4 -5
  123. package/src/db/adapters/wa-sqlite/DatabaseClient.ts +20 -56
  124. package/src/db/adapters/wa-sqlite/DatabaseServer.ts +18 -12
  125. package/src/db/adapters/wa-sqlite/RawSqliteConnection.ts +36 -23
  126. package/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.ts +70 -125
  127. package/src/db/adapters/wa-sqlite/vfs.ts +13 -8
  128. package/src/db/sync/SSRWebStreamingSyncImplementation.ts +4 -22
  129. package/src/db/sync/SharedWebStreamingSyncImplementation.ts +39 -77
  130. package/src/db/sync/TabLocalStreamingSyncImplementation.ts +90 -0
  131. package/src/db/sync/WebRemote.ts +23 -26
  132. package/src/db/sync/WebStreamingSyncImplementation.ts +4 -5
  133. package/src/index.ts +1 -3
  134. package/src/worker/SharedWorkerConnectionRequest.ts +6 -0
  135. package/src/worker/client.ts +121 -0
  136. package/src/worker/db/MultiDatabaseServer.ts +40 -22
  137. package/src/worker/sync/AbstractSharedSyncClientProvider.ts +4 -10
  138. package/src/worker/sync/BroadcastLogger.ts +35 -103
  139. package/src/worker/sync/SharedSyncImplementation.ts +65 -64
  140. package/src/worker/sync/WorkerClient.ts +4 -4
  141. package/src/worker/worker.ts +38 -0
  142. package/dist/2075a31bb151adbb9767.wasm +0 -0
  143. package/dist/3322bc84de986b63c2cd.wasm +0 -0
  144. package/dist/8e97452e297be23b5e50.wasm +0 -0
  145. package/dist/fbc178b70d530e8ce02b.wasm +0 -0
  146. package/dist/index.umd.js +0 -7821
  147. package/dist/index.umd.js.map +0 -1
  148. package/dist/worker/SharedSyncImplementation.umd.js +0 -16142
  149. package/dist/worker/SharedSyncImplementation.umd.js.map +0 -1
  150. package/dist/worker/WASQLiteDB.umd.js +0 -17437
  151. package/dist/worker/WASQLiteDB.umd.js.map +0 -1
  152. 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
  153. 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
  154. 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
  155. 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
  156. 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
  157. 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
  158. 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
  159. 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
  160. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-2fb422.umd.js +0 -3562
  161. 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
  162. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-833585.umd.js +0 -1400
  163. 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
  164. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-96fb23.umd.js +0 -2478
  165. 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
  166. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-c89911.umd.js +0 -1681
  167. 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
  168. package/dist/worker/node_modules_pnpm_journeyapps_wa-sqlite_1_7_0_node_modules_journeyapps_wa-sqlite_src_examples-ec4eb1.umd.js +0 -1820
  169. 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
  170. package/lib/package.json +0 -91
  171. package/lib/src/attachments/IndexDBFileSystemAdapter.js.map +0 -1
  172. package/lib/src/db/NavigatorTriggerClaimManager.js.map +0 -1
  173. package/lib/src/db/PowerSyncDatabase.d.ts +0 -78
  174. package/lib/src/db/PowerSyncDatabase.js.map +0 -1
  175. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.d.ts +0 -23
  176. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js +0 -27
  177. package/lib/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.js.map +0 -1
  178. package/lib/src/db/adapters/AsyncWebAdapter.d.ts +0 -50
  179. package/lib/src/db/adapters/AsyncWebAdapter.js.map +0 -1
  180. package/lib/src/db/adapters/SSRDBAdapter.d.ts +0 -30
  181. package/lib/src/db/adapters/SSRDBAdapter.js +0 -69
  182. package/lib/src/db/adapters/SSRDBAdapter.js.map +0 -1
  183. package/lib/src/db/adapters/WebDBAdapter.js.map +0 -1
  184. package/lib/src/db/adapters/wa-sqlite/ConcurrentConnection.js.map +0 -1
  185. package/lib/src/db/adapters/wa-sqlite/DatabaseClient.js.map +0 -1
  186. package/lib/src/db/adapters/wa-sqlite/DatabaseServer.js.map +0 -1
  187. package/lib/src/db/adapters/wa-sqlite/RawSqliteConnection.js.map +0 -1
  188. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.d.ts +0 -45
  189. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js +0 -146
  190. package/lib/src/db/adapters/wa-sqlite/WASQLiteOpenFactory.js.map +0 -1
  191. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.d.ts +0 -15
  192. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js +0 -22
  193. package/lib/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.js.map +0 -1
  194. package/lib/src/db/adapters/wa-sqlite/vfs.js.map +0 -1
  195. package/lib/src/db/adapters/web-sql-flags.d.ts +0 -92
  196. package/lib/src/db/adapters/web-sql-flags.js +0 -37
  197. package/lib/src/db/adapters/web-sql-flags.js.map +0 -1
  198. package/lib/src/db/sync/SSRWebStreamingSyncImplementation.js.map +0 -1
  199. package/lib/src/db/sync/SharedWebStreamingSyncImplementation.js.map +0 -1
  200. package/lib/src/db/sync/WebRemote.d.ts +0 -7
  201. package/lib/src/db/sync/WebRemote.js +0 -33
  202. package/lib/src/db/sync/WebRemote.js.map +0 -1
  203. package/lib/src/db/sync/WebStreamingSyncImplementation.js.map +0 -1
  204. package/lib/src/db/sync/userAgent.js.map +0 -1
  205. package/lib/src/index.js.map +0 -1
  206. package/lib/src/shared/navigator.js.map +0 -1
  207. package/lib/src/shared/tab_close_signal.js.map +0 -1
  208. package/lib/src/worker/db/MultiDatabaseServer.d.ts +0 -17
  209. package/lib/src/worker/db/MultiDatabaseServer.js.map +0 -1
  210. package/lib/src/worker/db/WASQLiteDB.worker.d.ts +0 -4
  211. package/lib/src/worker/db/WASQLiteDB.worker.js +0 -31
  212. package/lib/src/worker/db/WASQLiteDB.worker.js.map +0 -1
  213. package/lib/src/worker/db/open-worker-database.d.ts +0 -14
  214. package/lib/src/worker/db/open-worker-database.js +0 -53
  215. package/lib/src/worker/db/open-worker-database.js.map +0 -1
  216. package/lib/src/worker/sync/AbstractSharedSyncClientProvider.d.ts +0 -19
  217. package/lib/src/worker/sync/AbstractSharedSyncClientProvider.js.map +0 -1
  218. package/lib/src/worker/sync/BroadcastLogger.d.ts +0 -47
  219. package/lib/src/worker/sync/BroadcastLogger.js +0 -129
  220. package/lib/src/worker/sync/BroadcastLogger.js.map +0 -1
  221. package/lib/src/worker/sync/SharedSyncImplementation.js.map +0 -1
  222. package/lib/src/worker/sync/SharedSyncImplementation.worker.js +0 -12
  223. package/lib/src/worker/sync/SharedSyncImplementation.worker.js.map +0 -1
  224. package/lib/src/worker/sync/WorkerClient.js.map +0 -1
  225. package/lib/tsconfig.tsbuildinfo +0 -1
  226. package/src/db/adapters/AbstractWebPowerSyncDatabaseOpenFactory.ts +0 -47
  227. package/src/db/adapters/wa-sqlite/WASQLitePowerSyncDatabaseOpenFactory.ts +0 -24
  228. package/src/db/adapters/web-sql-flags.ts +0 -141
  229. package/src/worker/db/WASQLiteDB.worker.ts +0 -35
  230. package/src/worker/db/open-worker-database.ts +0 -62
  231. package/src/worker/sync/SharedSyncImplementation.worker.ts +0 -14
  232. /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.d.ts +0 -0
  233. /package/lib/{src/attachments → attachments}/IndexDBFileSystemAdapter.js +0 -0
  234. /package/lib/{src/db → db}/NavigatorTriggerClaimManager.js +0 -0
  235. /package/lib/{src/db → db}/adapters/WebDBAdapter.js +0 -0
  236. /package/lib/{src/db → db}/sync/userAgent.d.ts +0 -0
  237. /package/lib/{src/db → db}/sync/userAgent.js +0 -0
  238. /package/lib/{src/shared → shared}/navigator.d.ts +0 -0
  239. /package/lib/{src/shared → shared}/navigator.js +0 -0
  240. /package/lib/{src/shared → shared}/tab_close_signal.d.ts +0 -0
  241. /package/lib/{src/shared → shared}/tab_close_signal.js +0 -0
  242. /package/lib/{src/worker → worker}/sync/AbstractSharedSyncClientProvider.js +0 -0
  243. /package/lib/{src/worker/sync/SharedSyncImplementation.worker.d.ts → worker/worker.d.ts} +0 -0
@@ -2,23 +2,22 @@ import {
2
2
  QueryResult,
3
3
  LockContext,
4
4
  DBLockOptions,
5
- DBAdapterListener,
6
- ConnectionPool,
7
5
  SqlExecutor,
8
- DBGetUtilsDefaultMixin,
9
6
  BatchedUpdateNotification,
10
- BaseObserver,
11
- ConnectionClosedError,
12
- SQLOpenOptions
7
+ SQLOpenOptions,
8
+ DBAdapter,
9
+ RawQueryResult,
10
+ queryResultWithoutRows,
11
+ BaseQueryResult
13
12
  } from '@powersync/common';
14
13
  import { SharedConnectionWorker, WebDBAdapterConfiguration } from '../WebDBAdapter.js';
15
14
  import { ClientConnectionView } from './DatabaseServer.js';
16
- import { RawQueryResult } from './RawSqliteConnection.js';
17
15
  import * as Comlink from 'comlink';
18
- import { WorkerDBOpenerOptions } from './WASQLiteOpenFactory.js';
16
+ import type { ConnectToMultiDatabaseServerOptions } from '../../../worker/db/MultiDatabaseServer.js';
17
+ import { ConnectionClosedError } from '@powersync/shared-internals';
19
18
 
20
19
  export interface OpenWorkerConnection {
21
- connect(config: WorkerDBOpenerOptions): Promise<ClientConnectionView>;
20
+ connect(config: ConnectToMultiDatabaseServerOptions): Promise<ClientConnectionView>;
22
21
  connectToExisting(options: { identifier: string; lockName: string }): Promise<ClientConnectionView>;
23
22
  }
24
23
 
@@ -44,10 +43,7 @@ export interface ClientOptions {
44
43
  /**
45
44
  * A single-connection {@link ConnectionPool} implementation based on a worker connection.
46
45
  */
47
- export class DatabaseClient<Config extends SQLOpenOptions = WebDBAdapterConfiguration>
48
- extends BaseObserver<DBAdapterListener>
49
- implements ConnectionPool
50
- {
46
+ export class DatabaseClient<Config extends SQLOpenOptions = WebDBAdapterConfiguration> extends DBAdapter {
51
47
  #connection: ConnectionState;
52
48
  #shareConnectionAbortController = new AbortController();
53
49
  #receiveTableUpdates: MessagePort;
@@ -70,9 +66,7 @@ export class DatabaseClient<Config extends SQLOpenOptions = WebDBAdapterConfigur
70
66
  port2.onmessage = (event) => {
71
67
  const tables = event.data as string[];
72
68
  const notification: BatchedUpdateNotification = {
73
- tables,
74
- groupedUpdates: {},
75
- rawUpdates: []
69
+ tables
76
70
  };
77
71
  this.iterateListeners((l) => {
78
72
  l.tablesUpdated && l.tablesUpdated(notification);
@@ -185,16 +179,17 @@ export class DatabaseClient<Config extends SQLOpenOptions = WebDBAdapterConfigur
185
179
  }
186
180
 
187
181
  /**
188
- * A {@link SqlExecutor} implemented by sending commands to a worker.
182
+ * A {@link LockContext} implemented by sending commands to a worker.
189
183
  *
190
184
  * While an instance is active, it has exclusive access to the underlying database connection (as represented by its
191
185
  * token).
192
186
  */
193
- class ClientSqlExecutor implements SqlExecutor {
187
+ class ClientLockContext extends LockContext {
194
188
  readonly #connection: ConnectionState;
195
189
  readonly #token: string;
196
190
 
197
191
  constructor(connection: ConnectionState, token: string) {
192
+ super();
198
193
  this.#connection = connection;
199
194
  this.#token = token;
200
195
  }
@@ -223,37 +218,8 @@ class ClientSqlExecutor implements SqlExecutor {
223
218
  }
224
219
  }
225
220
 
226
- async execute(query: string, params?: any[] | undefined): Promise<QueryResult> {
227
- const rs = await this.#executeOnWorker(query, params);
228
- let rows: QueryResult['rows'] | undefined;
229
- if (rs.resultSet) {
230
- const resultSet = rs.resultSet;
231
-
232
- function rowToJavaScriptObject(row: any[]): Record<string, any> {
233
- const obj: Record<string, any> = {};
234
- resultSet.columns.forEach((key, idx) => (obj[key] = row[idx]));
235
- return obj;
236
- }
237
-
238
- const mapped = resultSet.rows.map(rowToJavaScriptObject);
239
-
240
- rows = {
241
- _array: mapped,
242
- length: mapped.length,
243
- item: (idx: number) => mapped[idx]
244
- };
245
- }
246
-
247
- return {
248
- rowsAffected: rs.changes,
249
- insertId: rs.lastInsertRowId,
250
- rows
251
- };
252
- }
253
-
254
- async executeRaw(query: string, params?: any[] | undefined): Promise<any[][]> {
255
- const rs = await this.#executeOnWorker(query, params);
256
- return rs.resultSet?.rows ?? [];
221
+ async executeRaw(query: string, params?: any[] | undefined): Promise<RawQueryResult> {
222
+ return await this.#executeOnWorker(query, params);
257
223
  }
258
224
 
259
225
  async #executeOnWorker(query: string, params: any[] | undefined): Promise<RawQueryResult> {
@@ -263,23 +229,21 @@ class ClientSqlExecutor implements SqlExecutor {
263
229
  );
264
230
  }
265
231
 
266
- async executeBatch(query: string, params: any[][] = []): Promise<QueryResult> {
232
+ async executeBatch(query: string, params: any[][] = []): Promise<QueryResult<never>> {
267
233
  const results = await this.maybeTrace(
268
234
  (c) => c.executeBatch(this.#token, query, params),
269
235
  () => `${query} (batch of ${params.length})`
270
236
  );
271
- const result: QueryResult = { insertId: undefined, rowsAffected: 0 };
237
+ const result: BaseQueryResult = { insertId: undefined, rowsAffected: 0 };
272
238
  for (const source of results) {
273
- result.insertId = source.lastInsertRowId;
274
- result.rowsAffected += source.changes;
239
+ result.insertId = source.insertId;
240
+ result.rowsAffected = (result.rowsAffected ?? 0) + source.rowsAffected;
275
241
  }
276
242
 
277
- return result;
243
+ return queryResultWithoutRows(result);
278
244
  }
279
245
  }
280
246
 
281
- class ClientLockContext extends DBGetUtilsDefaultMixin(ClientSqlExecutor) implements LockContext {}
282
-
283
247
  interface ConnectionState {
284
248
  connection: ClientConnectionView;
285
249
  notifyRemoteClosed: AbortController | undefined;
@@ -1,11 +1,11 @@
1
- import { ILogger } from '@powersync/common';
1
+ import { LogLevels, PowerSyncLogger } from '@powersync/common';
2
2
  import { ConcurrentSqliteConnection, ConnectionLeaseToken } from './ConcurrentConnection.js';
3
- import { RawQueryResult } from './RawSqliteConnection.js';
3
+ import { RawWebResult } from './RawSqliteConnection.js';
4
4
 
5
5
  export interface DatabaseServerOptions {
6
6
  inner: ConcurrentSqliteConnection;
7
7
  onClose: () => void;
8
- logger: ILogger;
8
+ logger: PowerSyncLogger;
9
9
  }
10
10
 
11
11
  /**
@@ -24,7 +24,7 @@ export class DatabaseServer {
24
24
  constructor(options: DatabaseServerOptions) {
25
25
  this.#options = options;
26
26
  const inner = options.inner;
27
- this.#updateBroadcastChannel = new BroadcastChannel(`${inner.options.dbFilename}-table-updates`);
27
+ this.#updateBroadcastChannel = new BroadcastChannel(`${inner.options.filename}-table-updates`);
28
28
 
29
29
  this.#updateBroadcastChannel.onmessage = ({ data }) => {
30
30
  this.#pushTableUpdateToClients(data as string[]);
@@ -85,7 +85,7 @@ export class DatabaseServer {
85
85
 
86
86
  // If the client holds a connection lease it hasn't returned, return that now.
87
87
  for (const { lease } of connectionLeases.values()) {
88
- this.#logger.debug(`Closing connection lease that hasn't been returned.`);
88
+ this.#logger.log({ level: LogLevels.debug, message: `Closing connection lease that hasn't been returned.` });
89
89
  await lease.returnLease();
90
90
  }
91
91
 
@@ -94,7 +94,10 @@ export class DatabaseServer {
94
94
  if (this.#activeClients.size == 0) {
95
95
  await this.forceClose();
96
96
  } else {
97
- this.#logger.debug('Keeping underlying connection active since its used by other clients.');
97
+ this.#logger.log({
98
+ level: LogLevels.debug,
99
+ message: 'Keeping underlying connection active since its used by other clients.'
100
+ });
98
101
  }
99
102
  }
100
103
  };
@@ -133,9 +136,9 @@ export class DatabaseServer {
133
136
  try {
134
137
  if (lease.write) {
135
138
  // Collect update hooks invoked while the client had the write connection.
136
- const { resultSet } = await lease.lease.use((conn) => conn.execute(`SELECT powersync_update_hooks('get')`));
137
- if (resultSet) {
138
- const updatedTables: string[] = JSON.parse(resultSet.rows[0][0] as string);
139
+ const { rawRows } = await lease.lease.use((conn) => conn.execute(`SELECT powersync_update_hooks('get')`));
140
+ if (rawRows.length) {
141
+ const updatedTables: string[] = JSON.parse(rawRows[0][0] as string);
139
142
  if (updatedTables.length) {
140
143
  this.#updateBroadcastChannel.postMessage(updatedTables);
141
144
  this.#pushTableUpdateToClients(updatedTables);
@@ -169,7 +172,10 @@ export class DatabaseServer {
169
172
  }
170
173
 
171
174
  async forceClose() {
172
- this.#logger.debug(`Closing connection to ${this.#inner.options}.`);
175
+ this.#logger.log({
176
+ level: LogLevels.debug,
177
+ message: `Closing connection to ${JSON.stringify(this.#inner.options)}.`
178
+ });
173
179
  const connection = this.#inner;
174
180
  this.#options.onClose();
175
181
  this.#updateBroadcastChannel.close();
@@ -190,8 +196,8 @@ export interface ClientConnectionView {
190
196
  * give other clients access to the database afterwards.
191
197
  */
192
198
  requestAccess(write: boolean, timeoutMs?: number): Promise<string>;
193
- execute(token: string, sql: string, params: any[] | undefined): Promise<RawQueryResult>;
194
- executeBatch(token: string, sql: string, params: any[][]): Promise<RawQueryResult[]>;
199
+ execute(token: string, sql: string, params: any[] | undefined): Promise<RawWebResult>;
200
+ executeBatch(token: string, sql: string, params: any[][]): Promise<RawWebResult[]>;
195
201
  completeAccess(token: string): Promise<void>;
196
202
 
197
203
  /**
@@ -1,18 +1,29 @@
1
1
  import { Factory as WaSqliteFactory, SQLITE_ROW } from '@journeyapps/wa-sqlite';
2
2
 
3
- import { loadModuleAndVfs } from './vfs.js';
4
- import { ResolvedWASQLiteOpenFactoryOptions } from './WASQLiteOpenFactory.js';
3
+ import { loadModuleAndVfs, WASQLiteVFS } from './vfs.js';
4
+ import { TemporaryStorageOption } from '../options.js';
5
+ import { RawQueryResult, SqliteValue } from '@powersync/common';
6
+ import { maxPathNameLength } from '../resolveAndValidateOptions.js';
7
+
8
+ export interface RawWebResult extends Required<RawQueryResult> {
9
+ autocommit: boolean;
10
+ }
5
11
 
6
12
  export interface RawResultSet {
7
- columns: string[];
8
- rows: SQLiteCompatibleType[][];
13
+ columnNames: string[];
14
+ rawRows: SqliteValue[][];
9
15
  }
10
16
 
11
- export interface RawQueryResult {
12
- changes: number;
13
- lastInsertRowId: number;
14
- autocommit: boolean;
15
- resultSet: RawResultSet | undefined;
17
+ /**
18
+ * @internal
19
+ */
20
+ export interface RawWaSqliteDatabaseOptions {
21
+ filename: string;
22
+ readonly: boolean;
23
+ vfs: WASQLiteVFS;
24
+ encryptionKey: string | undefined;
25
+ temporaryStorage: TemporaryStorageOption;
26
+ cacheSizeKb: number;
16
27
  }
17
28
 
18
29
  /**
@@ -28,7 +39,7 @@ export class RawSqliteConnection {
28
39
  */
29
40
  private db: number = 0;
30
41
 
31
- constructor(readonly options: ResolvedWASQLiteOpenFactoryOptions) {}
42
+ constructor(readonly options: RawWaSqliteDatabaseOptions) {}
32
43
 
33
44
  get isOpen(): boolean {
34
45
  return this.db != 0;
@@ -37,8 +48,8 @@ export class RawSqliteConnection {
37
48
  async init() {
38
49
  const api = (this._sqliteAPI = await this.openSQLiteAPI());
39
50
  this.db = await api.open_v2(
40
- this.options.dbFilename,
41
- this.options.isReadOnly ? 1 /* SQLITE_OPEN_READONLY */ : 6 /* SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE */
51
+ this.options.filename,
52
+ this.options.readonly ? 1 /* SQLITE_OPEN_READONLY */ : 6 /* SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE */
42
53
  );
43
54
  await this.executeRaw(`PRAGMA temp_store = ${this.options.temporaryStorage};`);
44
55
  if (this.options.encryptionKey) {
@@ -52,6 +63,7 @@ export class RawSqliteConnection {
52
63
 
53
64
  private async openSQLiteAPI(): Promise<SQLiteAPI> {
54
65
  const { module, vfs } = await loadModuleAndVfs(this.options);
66
+ vfs.mxPathname = maxPathNameLength;
55
67
  const sqlite3 = WaSqliteFactory(module);
56
68
  sqlite3.vfs_register(vfs, true);
57
69
  /**
@@ -63,7 +75,7 @@ export class RawSqliteConnection {
63
75
  * Create the multiple cipher vfs if an encryption key is provided
64
76
  */
65
77
  if (this.options.encryptionKey) {
66
- const createResult = module.ccall('sqlite3mc_vfs_create', 'int', ['string', 'int'], [this.options.dbFilename, 1]);
78
+ const createResult = module.ccall('sqlite3mc_vfs_create', 'int', ['string', 'int'], [this.options.filename, 1]);
67
79
  if (createResult !== 0) {
68
80
  throw new Error('Failed to create multiple cipher vfs, Database encryption will not work');
69
81
  }
@@ -87,12 +99,12 @@ export class RawSqliteConnection {
87
99
  return this.requireSqlite().get_autocommit(this.db) != 0;
88
100
  }
89
101
 
90
- async execute(sql: string, bindings?: any[]): Promise<RawQueryResult> {
102
+ async execute(sql: string, bindings?: any[]): Promise<RawWebResult> {
91
103
  const resultSet = await this.executeSingleStatementRaw(sql, bindings);
92
104
  return this.wrapQueryResults(this.requireSqlite(), resultSet);
93
105
  }
94
106
 
95
- async executeBatch(sql: string, bindings: any[][]): Promise<RawQueryResult[]> {
107
+ async executeBatch(sql: string, bindings: any[][]): Promise<RawWebResult[]> {
96
108
  const results = [];
97
109
  const api = this.requireSqlite();
98
110
  for await (const stmt of api.statements(this.db, sql)) {
@@ -110,21 +122,22 @@ export class RawSqliteConnection {
110
122
  return results;
111
123
  }
112
124
 
113
- private wrapQueryResults(api: SQLiteAPI, rs: RawResultSet | undefined): RawQueryResult {
125
+ private wrapQueryResults(api: SQLiteAPI, { rawRows, columnNames }: RawResultSet): RawWebResult {
114
126
  return {
115
- changes: api.changes(this.db),
116
- lastInsertRowId: api.last_insert_id(this.db),
127
+ rowsAffected: api.changes(this.db),
128
+ insertId: api.last_insert_id(this.db),
117
129
  autocommit: api.get_autocommit(this.db) != 0,
118
- resultSet: rs
130
+ rawRows,
131
+ columnNames
119
132
  };
120
133
  }
121
134
 
122
135
  /**
123
136
  * This executes a single statement using SQLite3 and returns the results as a {@link RawResultSet}.
124
137
  */
125
- private async executeSingleStatementRaw(sql: string, bindings?: any[]): Promise<RawResultSet | undefined> {
138
+ private async executeSingleStatementRaw(sql: string, bindings?: any[]): Promise<RawResultSet> {
126
139
  const results = await this.executeRaw(sql, bindings);
127
- return results.length ? results[0] : undefined;
140
+ return results.length ? results[0] : { columnNames: [], rawRows: [] };
128
141
  }
129
142
 
130
143
  async executeRaw(sql: string, bindings?: any[]): Promise<RawResultSet[]> {
@@ -134,7 +147,7 @@ export class RawSqliteConnection {
134
147
  let columns;
135
148
 
136
149
  const rs = await this.stepThroughStatement(api, stmt, bindings ?? [], columns);
137
- columns = rs.columns;
150
+ columns = rs.columnNames;
138
151
  if (columns.length) {
139
152
  results.push(rs);
140
153
  }
@@ -176,7 +189,7 @@ export class RawSqliteConnection {
176
189
  }
177
190
 
178
191
  knownColumns ??= api.column_names(stmt);
179
- return { columns: knownColumns, rows };
192
+ return { columnNames: knownColumns, rawRows: rows };
180
193
  }
181
194
 
182
195
  async close() {
@@ -1,70 +1,38 @@
1
- import { createLogger, DBAdapter, ILogger, SQLOpenFactory, type ILogLevel } from '@powersync/common';
1
+ import { DBAdapter, LogLevels, PowerSyncLogger, SQLOpenFactory } from '@powersync/common';
2
2
  import * as Comlink from 'comlink';
3
- import { openWorkerDatabasePort, resolveWorkerDatabasePortFactory } from '../../../worker/db/open-worker-database.js';
4
- import {
5
- DEFAULT_CACHE_SIZE_KB,
6
- isServerSide,
7
- ResolvedWebSQLFlags,
8
- ResolvedWebSQLOpenOptions,
9
- resolveWebSQLFlags,
10
- TemporaryStorageOption,
11
- WebSQLOpenFactoryOptions
12
- } from '../web-sql-flags.js';
3
+ import { ResolvedWebSQLOpenOptions, WebSQLOpenOptions } from '../options.js';
13
4
  import { SSRDBAdapter } from '../SSRDBAdapter.js';
14
5
  import { vfsRequiresDedicatedWorkers, WASQLiteVFS } from './vfs.js';
15
6
  import { MultiDatabaseServer } from '../../../worker/db/MultiDatabaseServer.js';
16
7
  import { DatabaseClient, OpenWorkerConnection } from './DatabaseClient.js';
17
8
  import { generateTabCloseSignal } from '../../../shared/tab_close_signal.js';
18
9
  import { AsyncDbAdapter, PoolConnection } from '../AsyncWebAdapter.js';
10
+ import { RawWaSqliteDatabaseOptions } from './RawSqliteConnection.js';
11
+ import { maxPathNameLength, resolveAndValidateOptions } from '../resolveAndValidateOptions.js';
12
+ import { connectToExistingWorker, connectToWorker, WorkerConnection } from '../../../worker/client.js';
19
13
 
20
- export interface WASQLiteOpenFactoryOptions extends WebSQLOpenFactoryOptions {
21
- vfs?: WASQLiteVFS;
22
- /**
23
- * If the {@link vfs} supports it, an additional amount of read-only connections to open. Using additional read
24
- * connections can speed up queries by dispatching them to multiple workers running them concurrently.
25
- *
26
- * {@link WASQLiteVFS.OPFSWriteAheadVFS} is the only VFS with support for multiple connections, so this option is
27
- * ignored for other VFS implementations.
28
- *
29
- * Defaults to 1.
30
- */
31
- additionalReaders?: number;
32
- }
33
-
34
- export interface ResolvedWASQLiteOpenFactoryOptions extends ResolvedWebSQLOpenOptions {
35
- vfs: WASQLiteVFS;
36
-
37
- /**
38
- * Whether this is a read-only connection opened for the `OPFSWriteAheadVFS` file system.
39
- */
40
- isReadOnly: boolean;
41
- }
42
-
43
- export interface WorkerDBOpenerOptions extends ResolvedWASQLiteOpenFactoryOptions {
44
- logLevel: ILogLevel;
45
- /**
46
- * A lock that is currently held by the client. When the lock is returned, we know the client is gone and that we need
47
- * to clean up resources.
48
- */
49
- lockName: string;
14
+ export interface WASQLiteOpenFactoryOptions {
15
+ open: WebSQLOpenOptions;
16
+ logger: PowerSyncLogger;
50
17
  }
51
18
 
52
19
  /**
53
20
  * Opens a SQLite connection using WA-SQLite.
54
21
  */
55
22
  export class WASQLiteOpenFactory implements SQLOpenFactory {
56
- private resolvedFlags: ResolvedWebSQLFlags;
57
- private logger: ILogger;
23
+ private options: ResolvedWebSQLOpenOptions;
24
+ private logger: PowerSyncLogger;
58
25
 
59
- constructor(private options: WASQLiteOpenFactoryOptions) {
60
- assertValidWASQLiteOpenFactoryOptions(options);
61
- this.resolvedFlags = resolveWebSQLFlags(options.flags);
62
- this.logger = options.logger ?? createLogger(`WASQLiteOpenFactory - ${this.options.dbFilename}`);
63
- }
26
+ constructor(options: WASQLiteOpenFactoryOptions) {
27
+ this.options = resolveAndValidateOptions(options.open);
64
28
 
65
- get waOptions(): WASQLiteOpenFactoryOptions {
66
- // Cast to extended type
67
- return this.options;
29
+ // Account for the fact that SQLite might append -journal suffixes
30
+ const maxLength = maxPathNameLength - 16;
31
+ if (this.options.dbFilename.length > maxLength) {
32
+ throw new Error(`dbFilename too long (max length is ${maxLength})`);
33
+ }
34
+
35
+ this.logger = options.logger;
68
36
  }
69
37
 
70
38
  protected openAdapter(): DBAdapter {
@@ -72,84 +40,81 @@ export class WASQLiteOpenFactory implements SQLOpenFactory {
72
40
  }
73
41
 
74
42
  openDB(): DBAdapter {
75
- const {
76
- resolvedFlags: { disableSSRWarning, enableMultiTabs, ssrMode = isServerSide() }
77
- } = this;
43
+ const { disableSSRWarning, enableMultiTabs, ssrMode } = this.options;
44
+
78
45
  if (ssrMode) {
79
46
  if (!disableSSRWarning) {
80
- this.logger.warn(
81
- `
47
+ this.logger.log({
48
+ level: LogLevels.warn,
49
+ message: `
82
50
  Running PowerSync in SSR mode.
83
51
  Only empty query results will be returned.
84
52
  Disable this warning by setting 'disableSSRWarning: true' in options.`
85
- );
53
+ });
86
54
  }
87
55
 
88
56
  return new SSRDBAdapter();
89
57
  }
90
58
 
91
59
  if (!enableMultiTabs) {
92
- this.logger.warn(
93
- 'Multiple tab support is not enabled. Using this site across multiple tabs may not function correctly.'
94
- );
60
+ this.logger.log({
61
+ level: LogLevels.warn,
62
+ message: 'Multiple tab support is not enabled. Using this site across multiple tabs may not function correctly.'
63
+ });
95
64
  }
96
65
 
97
66
  return this.openAdapter();
98
67
  }
99
68
 
100
69
  async openConnection(): Promise<PoolConnection> {
101
- const { enableMultiTabs, useWebWorker } = this.resolvedFlags;
102
- const {
103
- vfs = WASQLiteVFS.IDBBatchAtomicVFS,
104
- temporaryStorage = TemporaryStorageOption.MEMORY,
105
- cacheSizeKb = DEFAULT_CACHE_SIZE_KB,
106
- encryptionKey
107
- } = this.waOptions;
70
+ const { enableMultiTabs, useWebWorker, vfs, dbFilename, encryptionKey, temporaryStorage, cacheSizeKb } =
71
+ this.options;
108
72
 
109
73
  if (!enableMultiTabs) {
110
- this.logger.warn('Multiple tabs are not enabled in this browser');
74
+ this.logger.log({ level: LogLevels.warn, message: 'Multiple tabs are not enabled in this browser' });
111
75
  }
112
76
 
113
- const resolveOptions = (isReadOnly: boolean): ResolvedWASQLiteOpenFactoryOptions => ({
114
- dbFilename: this.options.dbFilename,
115
- dbLocation: this.options.dbLocation,
116
- debugMode: this.options.debugMode,
117
- vfs,
118
- temporaryStorage,
119
- cacheSizeKb,
120
- flags: this.resolvedFlags,
121
- encryptionKey: encryptionKey,
122
- isReadOnly
123
- });
124
-
125
77
  let client: DatabaseClient;
126
78
  let additionalReaders: DatabaseClient[] = [];
127
79
  let requiresPersistentTriggers = vfsRequiresDedicatedWorkers(vfs);
128
80
 
81
+ function resolveRawWaSqliteDatabaseOptions(readonly: boolean): RawWaSqliteDatabaseOptions {
82
+ return {
83
+ filename: dbFilename,
84
+ readonly,
85
+ vfs,
86
+ encryptionKey,
87
+ temporaryStorage,
88
+ cacheSizeKb
89
+ };
90
+ }
91
+
129
92
  if (useWebWorker) {
130
93
  const optionsDbWorker = this.options.worker;
131
94
 
132
- const openDatabaseWorker = async (
133
- resolvedOptions: ResolvedWASQLiteOpenFactoryOptions
134
- ): Promise<DatabaseClient> => {
135
- const workerPort =
136
- typeof optionsDbWorker == 'function'
137
- ? resolveWorkerDatabasePortFactory(() =>
138
- optionsDbWorker({
139
- ...this.options,
140
- temporaryStorage,
141
- cacheSizeKb,
142
- flags: this.resolvedFlags,
143
- encryptionKey
144
- })
145
- )
146
- : openWorkerDatabasePort(this.options.dbFilename, enableMultiTabs, optionsDbWorker, this.waOptions.vfs);
147
-
148
- const source = Comlink.wrap<OpenWorkerConnection>(workerPort);
95
+ const openDatabaseWorker = async (readonly: boolean): Promise<DatabaseClient> => {
96
+ let workerConnection: WorkerConnection;
97
+ if (typeof optionsDbWorker == 'function') {
98
+ const worker = optionsDbWorker(this.options);
99
+ workerConnection = connectToExistingWorker(worker, this.logger, 'database');
100
+ } else {
101
+ const needsDedicated = vfsRequiresDedicatedWorkers(vfs);
102
+ const useShared = !needsDedicated && enableMultiTabs;
103
+
104
+ workerConnection = connectToWorker({
105
+ service: 'database',
106
+ databaseIdentifier: this.options.dbFilename,
107
+ shared: useShared,
108
+ customWorker: optionsDbWorker,
109
+ loggerForErrors: this.logger
110
+ });
111
+ }
112
+
113
+ const source = Comlink.wrap<OpenWorkerConnection>(workerConnection.endpoint);
149
114
  const closeSignal = new AbortController();
150
115
  const connection = await source.connect({
151
- ...resolvedOptions,
152
- logLevel: this.logger.getLevel(),
116
+ database: resolveRawWaSqliteDatabaseOptions(readonly),
117
+ logLevel: this.options.databaseWorkerLogLevel,
153
118
  lockName: await generateTabCloseSignal(closeSignal.signal)
154
119
  });
155
120
  const clientOptions = {
@@ -159,28 +124,24 @@ export class WASQLiteOpenFactory implements SQLOpenFactory {
159
124
  remoteCanCloseUnexpectedly: false,
160
125
  onClose: () => {
161
126
  closeSignal.abort();
162
- if (workerPort instanceof Worker) {
163
- workerPort.terminate();
164
- } else {
165
- workerPort.close();
166
- }
127
+ workerConnection.close();
167
128
  }
168
129
  };
169
130
 
170
131
  return new DatabaseClient(clientOptions, {
171
- ...resolvedOptions,
132
+ ...this.options,
172
133
  requiresPersistentTriggers
173
134
  });
174
135
  };
175
136
 
176
- client = await openDatabaseWorker(resolveOptions(false));
137
+ client = await openDatabaseWorker(false);
177
138
 
178
139
  if (vfs == WASQLiteVFS.OPFSWriteAheadVFS) {
179
140
  // This VFS supports concurrent reads, so we can open additional workers to host read-only connections for
180
141
  // concurrent reads / writes.
181
142
  const additionalReadersCount = this.options.additionalReaders ?? 1;
182
143
  for (let i = 0; i < additionalReadersCount; i++) {
183
- const reader = await openDatabaseWorker(resolveOptions(true));
144
+ const reader = await openDatabaseWorker(true);
184
145
  additionalReaders.push(reader);
185
146
  }
186
147
  }
@@ -189,12 +150,11 @@ export class WASQLiteOpenFactory implements SQLOpenFactory {
189
150
  const localServer = new MultiDatabaseServer(this.logger);
190
151
  requiresPersistentTriggers = true;
191
152
 
192
- const resolvedOptions = resolveOptions(false);
193
- const connection = await localServer.openConnectionLocally(resolvedOptions);
153
+ const connection = await localServer.openConnectionLocally(this.logger, resolveRawWaSqliteDatabaseOptions(false));
194
154
  client = new DatabaseClient(
195
155
  { connection, source: null, remoteCanCloseUnexpectedly: false },
196
156
  {
197
- ...resolvedOptions,
157
+ ...this.options,
198
158
  requiresPersistentTriggers
199
159
  }
200
160
  );
@@ -206,18 +166,3 @@ export class WASQLiteOpenFactory implements SQLOpenFactory {
206
166
  };
207
167
  }
208
168
  }
209
-
210
- /**
211
- * Asserts that the factory options are valid.
212
- */
213
- function assertValidWASQLiteOpenFactoryOptions(options: WASQLiteOpenFactoryOptions): void {
214
- // The OPFS VFS only works in dedicated web workers.
215
- if ('vfs' in options && 'flags' in options) {
216
- const { vfs, flags = {} } = options;
217
- if (vfs && vfsRequiresDedicatedWorkers(vfs) && 'useWebWorker' in flags && !flags.useWebWorker) {
218
- throw new Error(
219
- `Invalid configuration: The 'useWebWorker' flag must be true when using an OPFS-based VFS (${vfs}).`
220
- );
221
- }
222
- }
223
- }