jazz-tools 2.0.0-alpha.50 → 2.0.0-alpha.52

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 (414) hide show
  1. package/bin/docs-index.txt +5 -6
  2. package/bin/native/jazz-tools-darwin-arm64 +0 -0
  3. package/bin/native/jazz-tools-darwin-x64 +0 -0
  4. package/bin/native/jazz-tools-linux-arm64 +0 -0
  5. package/bin/native/jazz-tools-linux-x64 +0 -0
  6. package/dist/backend/index.d.ts +1 -0
  7. package/dist/backend/index.d.ts.map +1 -1
  8. package/dist/backend/index.js +1 -0
  9. package/dist/backend/index.js.map +1 -1
  10. package/dist/better-auth-adapter/index.test.js +11 -11
  11. package/dist/better-auth-adapter/index.test.js.map +1 -1
  12. package/dist/better-auth-adapter/utils.d.ts.map +1 -1
  13. package/dist/better-auth-adapter/utils.js +3 -37
  14. package/dist/better-auth-adapter/utils.js.map +1 -1
  15. package/dist/better-auth-adapter/utils.test.js +44 -0
  16. package/dist/better-auth-adapter/utils.test.js.map +1 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/cli.js +125 -1055
  19. package/dist/cli.js.map +1 -1
  20. package/dist/codegen/schema-reader.d.ts.map +1 -1
  21. package/dist/codegen/schema-reader.js +6 -0
  22. package/dist/codegen/schema-reader.js.map +1 -1
  23. package/dist/dev/catalogue.d.ts +212 -0
  24. package/dist/dev/catalogue.d.ts.map +1 -0
  25. package/dist/dev/catalogue.js +879 -0
  26. package/dist/dev/catalogue.js.map +1 -0
  27. package/dist/dev/catalogue.test.d.ts +2 -0
  28. package/dist/dev/catalogue.test.d.ts.map +1 -0
  29. package/dist/dev/catalogue.test.js +607 -0
  30. package/dist/dev/catalogue.test.js.map +1 -0
  31. package/dist/dev/dev-server.d.ts +16 -15
  32. package/dist/dev/dev-server.d.ts.map +1 -1
  33. package/dist/dev/dev-server.js +23 -34
  34. package/dist/dev/dev-server.js.map +1 -1
  35. package/dist/dev/dev-server.test.js +12 -7
  36. package/dist/dev/dev-server.test.js.map +1 -1
  37. package/dist/dev/expo.test.js +3 -3
  38. package/dist/dev/expo.test.js.map +1 -1
  39. package/dist/dev/index.d.ts +2 -1
  40. package/dist/dev/index.d.ts.map +1 -1
  41. package/dist/dev/index.js +2 -1
  42. package/dist/dev/index.js.map +1 -1
  43. package/dist/dev/managed-runtime.d.ts.map +1 -1
  44. package/dist/dev/managed-runtime.js +5 -4
  45. package/dist/dev/managed-runtime.js.map +1 -1
  46. package/dist/dev/managed-runtime.test.js +11 -4
  47. package/dist/dev/managed-runtime.test.js.map +1 -1
  48. package/dist/dev/migrations.d.ts +8 -0
  49. package/dist/dev/migrations.d.ts.map +1 -0
  50. package/dist/dev/migrations.js +300 -0
  51. package/dist/dev/migrations.js.map +1 -0
  52. package/dist/dev/next.js +1 -1
  53. package/dist/dev/next.js.map +1 -1
  54. package/dist/dev/next.test.js +21 -10
  55. package/dist/dev/next.test.js.map +1 -1
  56. package/dist/dev/schema-utils.d.ts +7 -0
  57. package/dist/dev/schema-utils.d.ts.map +1 -0
  58. package/dist/dev/schema-utils.js +60 -0
  59. package/dist/dev/schema-utils.js.map +1 -0
  60. package/dist/dev/schema-watcher.js +3 -3
  61. package/dist/dev/schema-watcher.js.map +1 -1
  62. package/dist/dev/sveltekit.test.js +33 -22
  63. package/dist/dev/sveltekit.test.js.map +1 -1
  64. package/dist/dev/vite.test.js +13 -3
  65. package/dist/dev/vite.test.js.map +1 -1
  66. package/dist/dev-tools/dev-tools.js +1 -1
  67. package/dist/dev-tools/dev-tools.test.js +5 -5
  68. package/dist/dev-tools/extension-panel.js +0 -3
  69. package/dist/dev-tools/extension-panel.js.map +1 -1
  70. package/dist/drivers/types.d.ts +1 -1
  71. package/dist/drivers/types.d.ts.map +1 -1
  72. package/dist/dsl.d.ts +9 -1
  73. package/dist/dsl.d.ts.map +1 -1
  74. package/dist/dsl.js +8 -2
  75. package/dist/dsl.js.map +1 -1
  76. package/dist/dsl.test.js +34 -0
  77. package/dist/dsl.test.js.map +1 -1
  78. package/dist/index.d.ts +2 -0
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +1 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/permissions/index.d.ts +3 -3
  83. package/dist/permissions/index.d.ts.map +1 -1
  84. package/dist/react-core/provider.d.ts.map +1 -1
  85. package/dist/react-core/provider.js +43 -43
  86. package/dist/react-core/provider.js.map +1 -1
  87. package/dist/react-core/provider.onjwtexpired.test.js +49 -1
  88. package/dist/react-core/provider.onjwtexpired.test.js.map +1 -1
  89. package/dist/react-core/use-all.d.ts +13 -1
  90. package/dist/react-core/use-all.d.ts.map +1 -1
  91. package/dist/react-core/use-all.js +67 -37
  92. package/dist/react-core/use-all.js.map +1 -1
  93. package/dist/react-core/use-all.test.d.ts +2 -0
  94. package/dist/react-core/use-all.test.d.ts.map +1 -0
  95. package/dist/react-core/use-all.test.js +130 -0
  96. package/dist/react-core/use-all.test.js.map +1 -0
  97. package/dist/react-native/db.test.js +6 -6
  98. package/dist/react-native/jazz-rn-handoff.test.js +0 -7
  99. package/dist/react-native/jazz-rn-handoff.test.js.map +1 -1
  100. package/dist/react-native/jazz-rn-runtime-adapter.d.ts +19 -37
  101. package/dist/react-native/jazz-rn-runtime-adapter.d.ts.map +1 -1
  102. package/dist/react-native/jazz-rn-runtime-adapter.js +24 -78
  103. package/dist/react-native/jazz-rn-runtime-adapter.js.map +1 -1
  104. package/dist/react-native/jazz-rn-runtime-adapter.test.js +55 -80
  105. package/dist/react-native/jazz-rn-runtime-adapter.test.js.map +1 -1
  106. package/dist/runtime/browser-broker-client.d.ts +101 -0
  107. package/dist/runtime/browser-broker-client.d.ts.map +1 -0
  108. package/dist/runtime/browser-broker-client.js +598 -0
  109. package/dist/runtime/browser-broker-client.js.map +1 -0
  110. package/dist/runtime/browser-broker-client.test.d.ts +2 -0
  111. package/dist/runtime/browser-broker-client.test.d.ts.map +1 -0
  112. package/dist/runtime/browser-broker-client.test.js +798 -0
  113. package/dist/runtime/browser-broker-client.test.js.map +1 -0
  114. package/dist/runtime/browser-broker-errors.d.ts +10 -0
  115. package/dist/runtime/browser-broker-errors.d.ts.map +1 -0
  116. package/dist/runtime/browser-broker-errors.js +22 -0
  117. package/dist/runtime/browser-broker-errors.js.map +1 -0
  118. package/dist/runtime/browser-broker-protocol.d.ts +196 -0
  119. package/dist/runtime/browser-broker-protocol.d.ts.map +1 -0
  120. package/dist/runtime/browser-broker-protocol.js +159 -0
  121. package/dist/runtime/browser-broker-protocol.js.map +1 -0
  122. package/dist/runtime/browser-broker-protocol.test.d.ts +2 -0
  123. package/dist/runtime/browser-broker-protocol.test.d.ts.map +1 -0
  124. package/dist/runtime/browser-broker-protocol.test.js +67 -0
  125. package/dist/runtime/browser-broker-protocol.test.js.map +1 -0
  126. package/dist/runtime/client-registry.d.ts +20 -0
  127. package/dist/runtime/client-registry.d.ts.map +1 -0
  128. package/dist/runtime/client-registry.js +80 -0
  129. package/dist/runtime/client-registry.js.map +1 -0
  130. package/dist/runtime/client-registry.test.d.ts +2 -0
  131. package/dist/runtime/client-registry.test.d.ts.map +1 -0
  132. package/dist/runtime/client-registry.test.js +59 -0
  133. package/dist/runtime/client-registry.test.js.map +1 -0
  134. package/dist/runtime/client-tests/for-request.test.js +12 -17
  135. package/dist/runtime/client-tests/for-request.test.js.map +1 -1
  136. package/dist/runtime/client-tests/support.d.ts +8 -2
  137. package/dist/runtime/client-tests/support.d.ts.map +1 -1
  138. package/dist/runtime/client-tests/support.js +18 -12
  139. package/dist/runtime/client-tests/support.js.map +1 -1
  140. package/dist/runtime/client.d.ts +55 -179
  141. package/dist/runtime/client.d.ts.map +1 -1
  142. package/dist/runtime/client.js +75 -548
  143. package/dist/runtime/client.js.map +1 -1
  144. package/dist/runtime/client.mutations.test.js +41 -230
  145. package/dist/runtime/client.mutations.test.js.map +1 -1
  146. package/dist/runtime/client.test.js +46 -195
  147. package/dist/runtime/client.test.js.map +1 -1
  148. package/dist/runtime/context.d.ts +3 -0
  149. package/dist/runtime/context.d.ts.map +1 -1
  150. package/dist/runtime/db-runtime-module.d.ts +1 -0
  151. package/dist/runtime/db-runtime-module.d.ts.map +1 -1
  152. package/dist/runtime/db-runtime-module.js.map +1 -1
  153. package/dist/runtime/db.d.ts +122 -54
  154. package/dist/runtime/db.d.ts.map +1 -1
  155. package/dist/runtime/db.driver-mode.test.js +51 -1
  156. package/dist/runtime/db.driver-mode.test.js.map +1 -1
  157. package/dist/runtime/db.js +890 -357
  158. package/dist/runtime/db.js.map +1 -1
  159. package/dist/runtime/db.one.test.d.ts +2 -0
  160. package/dist/runtime/db.one.test.d.ts.map +1 -0
  161. package/dist/runtime/db.one.test.js +69 -0
  162. package/dist/runtime/db.one.test.js.map +1 -0
  163. package/dist/runtime/db.persisted.test.js +17 -17
  164. package/dist/runtime/db.persisted.test.js.map +1 -1
  165. package/dist/runtime/db.schema-order.test.js +32 -89
  166. package/dist/runtime/db.schema-order.test.js.map +1 -1
  167. package/dist/runtime/db.transaction.test.js +81 -1184
  168. package/dist/runtime/db.transaction.test.js.map +1 -1
  169. package/dist/runtime/db.transport.test.js +26 -1
  170. package/dist/runtime/db.transport.test.js.map +1 -1
  171. package/dist/runtime/db.worker-bootstrap.test.js +339 -19
  172. package/dist/runtime/db.worker-bootstrap.test.js.map +1 -1
  173. package/dist/runtime/index.d.ts +6 -5
  174. package/dist/runtime/index.d.ts.map +1 -1
  175. package/dist/runtime/index.js +4 -3
  176. package/dist/runtime/index.js.map +1 -1
  177. package/dist/runtime/leader-lock.d.ts +21 -3
  178. package/dist/runtime/leader-lock.d.ts.map +1 -1
  179. package/dist/runtime/leader-lock.js +131 -33
  180. package/dist/runtime/leader-lock.js.map +1 -1
  181. package/dist/runtime/napi.auth-failure.test.js +1 -1
  182. package/dist/runtime/napi.auth-failure.test.js.map +1 -1
  183. package/dist/runtime/napi.for-request.test.js +1 -1
  184. package/dist/runtime/napi.for-request.test.js.map +1 -1
  185. package/dist/runtime/napi.integration.test.js +4 -8
  186. package/dist/runtime/napi.integration.test.js.map +1 -1
  187. package/dist/runtime/permissions.repro.test.js +1 -1
  188. package/dist/runtime/permissions.repro.test.js.map +1 -1
  189. package/dist/runtime/query-adapter-tests/condition-translation.test.js +20 -0
  190. package/dist/runtime/query-adapter-tests/condition-translation.test.js.map +1 -1
  191. package/dist/runtime/query-adapter.d.ts.map +1 -1
  192. package/dist/runtime/query-adapter.js +14 -12
  193. package/dist/runtime/query-adapter.js.map +1 -1
  194. package/dist/runtime/query-builder-shape.d.ts +1 -0
  195. package/dist/runtime/query-builder-shape.d.ts.map +1 -1
  196. package/dist/runtime/query-builder-shape.js +1 -0
  197. package/dist/runtime/query-builder-shape.js.map +1 -1
  198. package/dist/runtime/runtime-config.d.ts +1 -0
  199. package/dist/runtime/runtime-config.d.ts.map +1 -1
  200. package/dist/runtime/runtime-config.js +11 -5
  201. package/dist/runtime/runtime-config.js.map +1 -1
  202. package/dist/runtime/runtime-config.test.d.ts +2 -0
  203. package/dist/runtime/runtime-config.test.d.ts.map +1 -0
  204. package/dist/runtime/runtime-config.test.js +21 -0
  205. package/dist/runtime/runtime-config.test.js.map +1 -0
  206. package/dist/runtime/schema-fetch.d.ts +5 -0
  207. package/dist/runtime/schema-fetch.d.ts.map +1 -1
  208. package/dist/runtime/schema-fetch.js +33 -2
  209. package/dist/runtime/schema-fetch.js.map +1 -1
  210. package/dist/runtime/schema-fetch.test.js +31 -0
  211. package/dist/runtime/schema-fetch.test.js.map +1 -1
  212. package/dist/runtime/select-projection.d.ts +0 -1
  213. package/dist/runtime/select-projection.d.ts.map +1 -1
  214. package/dist/runtime/select-projection.js +0 -3
  215. package/dist/runtime/select-projection.js.map +1 -1
  216. package/dist/runtime/subscription-manager.d.ts +8 -3
  217. package/dist/runtime/subscription-manager.d.ts.map +1 -1
  218. package/dist/runtime/subscription-manager.js +1 -1
  219. package/dist/runtime/subscription-manager.js.map +1 -1
  220. package/dist/runtime/value-converter.d.ts +6 -17
  221. package/dist/runtime/value-converter.d.ts.map +1 -1
  222. package/dist/runtime/value-converter.js +6 -36
  223. package/dist/runtime/value-converter.js.map +1 -1
  224. package/dist/runtime/value-converter.test.js +13 -74
  225. package/dist/runtime/value-converter.test.js.map +1 -1
  226. package/dist/runtime/wasm-runtime-module.d.ts +1 -1
  227. package/dist/runtime/wasm-runtime-module.d.ts.map +1 -1
  228. package/dist/runtime/wasm-runtime-module.js +6 -2
  229. package/dist/runtime/wasm-runtime-module.js.map +1 -1
  230. package/dist/runtime/wasm-teardown-trap-suppressor.d.ts +27 -0
  231. package/dist/runtime/wasm-teardown-trap-suppressor.d.ts.map +1 -0
  232. package/dist/runtime/wasm-teardown-trap-suppressor.js +73 -0
  233. package/dist/runtime/wasm-teardown-trap-suppressor.js.map +1 -0
  234. package/dist/runtime/wasm-teardown-trap-suppressor.test.d.ts +2 -0
  235. package/dist/runtime/wasm-teardown-trap-suppressor.test.d.ts.map +1 -0
  236. package/dist/runtime/wasm-teardown-trap-suppressor.test.js +60 -0
  237. package/dist/runtime/wasm-teardown-trap-suppressor.test.js.map +1 -0
  238. package/dist/runtime/worker-bridge.d.ts +25 -2
  239. package/dist/runtime/worker-bridge.d.ts.map +1 -1
  240. package/dist/runtime/worker-bridge.js +48 -2
  241. package/dist/runtime/worker-bridge.js.map +1 -1
  242. package/dist/runtime/worker-bridge.test.d.ts +2 -0
  243. package/dist/runtime/worker-bridge.test.d.ts.map +1 -0
  244. package/dist/runtime/worker-bridge.test.js +53 -0
  245. package/dist/runtime/worker-bridge.test.js.map +1 -0
  246. package/dist/schema-loader.d.ts.map +1 -1
  247. package/dist/schema-loader.js +2 -0
  248. package/dist/schema-loader.js.map +1 -1
  249. package/dist/schema.d.ts +1 -1
  250. package/dist/schema.d.ts.map +1 -1
  251. package/dist/shared/index.d.ts +25 -0
  252. package/dist/shared/index.d.ts.map +1 -0
  253. package/dist/shared/index.js +22 -0
  254. package/dist/shared/index.js.map +1 -0
  255. package/dist/shared/index.test.d.ts +2 -0
  256. package/dist/shared/index.test.d.ts.map +1 -0
  257. package/dist/shared/index.test.js +79 -0
  258. package/dist/shared/index.test.js.map +1 -0
  259. package/dist/solid/create-solid-jazz-client-internal.d.ts +13 -0
  260. package/dist/solid/create-solid-jazz-client-internal.d.ts.map +1 -0
  261. package/dist/solid/create-solid-jazz-client-internal.js +47 -0
  262. package/dist/solid/create-solid-jazz-client-internal.js.map +1 -0
  263. package/dist/solid/create-solid-jazz-client-internal.ssr.js +64 -0
  264. package/dist/solid/create-solid-jazz-client-internal.ssr.js.map +1 -0
  265. package/dist/solid/create-solid-jazz-client-internal.test.d.ts +2 -0
  266. package/dist/solid/create-solid-jazz-client-internal.test.d.ts.map +1 -0
  267. package/dist/solid/create-solid-jazz-client.d.ts +34 -0
  268. package/dist/solid/create-solid-jazz-client.d.ts.map +1 -0
  269. package/dist/solid/create-solid-jazz-client.integration.test.d.ts +2 -0
  270. package/dist/solid/create-solid-jazz-client.integration.test.d.ts.map +1 -0
  271. package/dist/solid/create-solid-jazz-client.js +38 -0
  272. package/dist/solid/create-solid-jazz-client.js.map +1 -0
  273. package/dist/solid/create-solid-jazz-client.ssr.js +41 -0
  274. package/dist/solid/create-solid-jazz-client.ssr.js.map +1 -0
  275. package/dist/solid/index.d.ts +8 -0
  276. package/dist/solid/index.d.ts.map +1 -0
  277. package/dist/solid/index.js +7 -0
  278. package/dist/solid/index.ssr.js +7 -0
  279. package/dist/solid/provider.d.ts +27 -0
  280. package/dist/solid/provider.d.ts.map +1 -0
  281. package/dist/solid/provider.js +44 -0
  282. package/dist/solid/provider.js.map +1 -0
  283. package/dist/solid/provider.ssr.js +44 -0
  284. package/dist/solid/provider.ssr.js.map +1 -0
  285. package/dist/solid/solid-jazz-client-store.d.ts +11 -0
  286. package/dist/solid/solid-jazz-client-store.d.ts.map +1 -0
  287. package/dist/solid/solid-jazz-client-store.js +35 -0
  288. package/dist/solid/solid-jazz-client-store.js.map +1 -0
  289. package/dist/solid/solid-jazz-client-store.ssr.js +37 -0
  290. package/dist/solid/solid-jazz-client-store.ssr.js.map +1 -0
  291. package/dist/solid/solid-jazz-client-store.test.d.ts +2 -0
  292. package/dist/solid/solid-jazz-client-store.test.d.ts.map +1 -0
  293. package/dist/solid/use-all.d.ts +16 -0
  294. package/dist/solid/use-all.d.ts.map +1 -0
  295. package/dist/solid/use-all.js +60 -0
  296. package/dist/solid/use-all.js.map +1 -0
  297. package/dist/solid/use-all.ssr.js +68 -0
  298. package/dist/solid/use-all.ssr.js.map +1 -0
  299. package/dist/solid/use-all.test.d.ts +2 -0
  300. package/dist/solid/use-all.test.d.ts.map +1 -0
  301. package/dist/solid/use-local-first-auth.d.ts +11 -0
  302. package/dist/solid/use-local-first-auth.d.ts.map +1 -0
  303. package/dist/solid/use-local-first-auth.js +65 -0
  304. package/dist/solid/use-local-first-auth.js.map +1 -0
  305. package/dist/solid/use-local-first-auth.ssr.js +83 -0
  306. package/dist/solid/use-local-first-auth.ssr.js.map +1 -0
  307. package/dist/solid/use-local-first-auth.test.d.ts +2 -0
  308. package/dist/solid/use-local-first-auth.test.d.ts.map +1 -0
  309. package/dist/subscriptions-orchestrator.d.ts +33 -1
  310. package/dist/subscriptions-orchestrator.d.ts.map +1 -1
  311. package/dist/subscriptions-orchestrator.js +97 -7
  312. package/dist/subscriptions-orchestrator.js.map +1 -1
  313. package/dist/subscriptions-orchestrator.test.js +96 -0
  314. package/dist/subscriptions-orchestrator.test.js.map +1 -1
  315. package/dist/svelte/context.svelte.d.ts +6 -2
  316. package/dist/svelte/context.svelte.d.ts.map +1 -1
  317. package/dist/svelte/context.svelte.js +9 -2
  318. package/dist/svelte/context.svelte.test.js +14 -3
  319. package/dist/svelte/create-jazz-client.d.ts.map +1 -1
  320. package/dist/svelte/create-jazz-client.dedup.test.d.ts +2 -0
  321. package/dist/svelte/create-jazz-client.dedup.test.d.ts.map +1 -0
  322. package/dist/svelte/create-jazz-client.dedup.test.js +69 -0
  323. package/dist/svelte/create-jazz-client.js +14 -1
  324. package/dist/svelte/create-jazz-client.test.js +3 -3
  325. package/dist/svelte/use-all.svelte.d.ts +1 -2
  326. package/dist/svelte/use-all.svelte.d.ts.map +1 -1
  327. package/dist/svelte/use-all.svelte.js +14 -15
  328. package/dist/svelte/use-all.svelte.test.js +11 -0
  329. package/dist/testing/index.d.ts +2 -2
  330. package/dist/testing/index.d.ts.map +1 -1
  331. package/dist/testing/index.js +2 -2
  332. package/dist/testing/index.js.map +1 -1
  333. package/dist/testing/index.test.js +11 -69
  334. package/dist/testing/index.test.js.map +1 -1
  335. package/dist/testing/policy-test-app.d.ts +3 -3
  336. package/dist/testing/policy-test-app.d.ts.map +1 -1
  337. package/dist/testing/policy-test-app.js +1 -1
  338. package/dist/testing/policy-test-app.js.map +1 -1
  339. package/dist/testing/test-jwt-issuer.d.ts +16 -0
  340. package/dist/testing/test-jwt-issuer.d.ts.map +1 -0
  341. package/dist/testing/test-jwt-issuer.js +23 -0
  342. package/dist/testing/test-jwt-issuer.js.map +1 -0
  343. package/dist/typed-app.d.ts +24 -32
  344. package/dist/typed-app.d.ts.map +1 -1
  345. package/dist/typed-app.js +12 -1
  346. package/dist/typed-app.js.map +1 -1
  347. package/dist/vue/create-jazz-client.d.ts.map +1 -1
  348. package/dist/vue/create-jazz-client.dedup.test.d.ts +2 -0
  349. package/dist/vue/create-jazz-client.dedup.test.d.ts.map +1 -0
  350. package/dist/vue/create-jazz-client.dedup.test.js +70 -0
  351. package/dist/vue/create-jazz-client.dedup.test.js.map +1 -0
  352. package/dist/vue/create-jazz-client.js +14 -1
  353. package/dist/vue/create-jazz-client.js.map +1 -1
  354. package/dist/vue/provider.d.ts +5 -3
  355. package/dist/vue/provider.d.ts.map +1 -1
  356. package/dist/vue/provider.js +9 -3
  357. package/dist/vue/provider.js.map +1 -1
  358. package/dist/vue/provider.test.d.ts +2 -0
  359. package/dist/vue/provider.test.d.ts.map +1 -0
  360. package/dist/vue/provider.test.js +71 -0
  361. package/dist/vue/provider.test.js.map +1 -0
  362. package/dist/vue/use-all.d.ts +44 -3
  363. package/dist/vue/use-all.d.ts.map +1 -1
  364. package/dist/vue/use-all.js +56 -8
  365. package/dist/vue/use-all.js.map +1 -1
  366. package/dist/vue/use-all.test.js +73 -40
  367. package/dist/vue/use-all.test.js.map +1 -1
  368. package/dist/web/create-jazz-client.d.ts +20 -0
  369. package/dist/web/create-jazz-client.d.ts.map +1 -0
  370. package/dist/web/create-jazz-client.js +61 -0
  371. package/dist/web/create-jazz-client.js.map +1 -0
  372. package/dist/web/create-jazz-client.test.d.ts +2 -0
  373. package/dist/web/create-jazz-client.test.d.ts.map +1 -0
  374. package/dist/web/create-jazz-client.test.js +159 -0
  375. package/dist/web/create-jazz-client.test.js.map +1 -0
  376. package/dist/where-operators.d.ts +12 -0
  377. package/dist/where-operators.d.ts.map +1 -0
  378. package/dist/where-operators.js +46 -0
  379. package/dist/where-operators.js.map +1 -0
  380. package/dist/worker/broker-worker-bundle.test.d.ts +2 -0
  381. package/dist/worker/broker-worker-bundle.test.d.ts.map +1 -0
  382. package/dist/worker/broker-worker-bundle.test.js +40 -0
  383. package/dist/worker/broker-worker-bundle.test.js.map +1 -0
  384. package/dist/worker/jazz-broker-worker.d.ts +2 -0
  385. package/dist/worker/jazz-broker-worker.d.ts.map +1 -0
  386. package/dist/worker/jazz-broker-worker.js +1090 -0
  387. package/dist/worker/jazz-worker.js +80 -2
  388. package/dist/worker/jazz-worker.js.map +1 -1
  389. package/dist/worker/jazz-worker.ts +104 -2
  390. package/package.json +27 -8
  391. package/dist/runtime/client-tests/schema-order.test.d.ts +0 -2
  392. package/dist/runtime/client-tests/schema-order.test.d.ts.map +0 -1
  393. package/dist/runtime/client-tests/schema-order.test.js +0 -700
  394. package/dist/runtime/client-tests/schema-order.test.js.map +0 -1
  395. package/dist/runtime/storage-reset-coordinator.d.ts +0 -58
  396. package/dist/runtime/storage-reset-coordinator.d.ts.map +0 -1
  397. package/dist/runtime/storage-reset-coordinator.js +0 -402
  398. package/dist/runtime/storage-reset-coordinator.js.map +0 -1
  399. package/dist/runtime/tab-leader-election.d.ts +0 -97
  400. package/dist/runtime/tab-leader-election.d.ts.map +0 -1
  401. package/dist/runtime/tab-leader-election.js +0 -339
  402. package/dist/runtime/tab-leader-election.js.map +0 -1
  403. package/dist/runtime/tab-leader-election.test.d.ts +0 -2
  404. package/dist/runtime/tab-leader-election.test.d.ts.map +0 -1
  405. package/dist/runtime/tab-leader-election.test.js +0 -278
  406. package/dist/runtime/tab-leader-election.test.js.map +0 -1
  407. package/dist/runtime/tab-sync-protocol.d.ts +0 -55
  408. package/dist/runtime/tab-sync-protocol.d.ts.map +0 -1
  409. package/dist/runtime/tab-sync-protocol.js +0 -54
  410. package/dist/runtime/tab-sync-protocol.js.map +0 -1
  411. package/dist/testing/local-jazz-server.d.ts +0 -2
  412. package/dist/testing/local-jazz-server.d.ts.map +0 -1
  413. package/dist/testing/local-jazz-server.js +0 -2
  414. package/dist/testing/local-jazz-server.js.map +0 -1
@@ -0,0 +1,1090 @@
1
+ // src/runtime/browser-broker-protocol.ts
2
+ var DEFAULT_BROKER_PING_INTERVAL_MS = 1e3;
3
+ var DEFAULT_BROKER_PONG_TIMEOUT_MS = 3e3;
4
+ function normalizePositiveTimeout(value, fallback) {
5
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
6
+ return fallback;
7
+ }
8
+ return Math.max(1, Math.floor(value));
9
+ }
10
+ function createRandomId(prefix) {
11
+ const cryptoObj = globalThis.crypto;
12
+ const raw = cryptoObj && typeof cryptoObj.randomUUID === "function" ? cryptoObj.randomUUID() : `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
13
+ return prefix ? `${prefix}-${raw}` : raw;
14
+ }
15
+ function selectLeaderCandidate(candidates) {
16
+ const visible = candidates.filter((candidate) => candidate.visibility === "visible");
17
+ const pool = visible.length > 0 ? visible : candidates;
18
+ let selected = null;
19
+ for (const candidate of pool) {
20
+ if (!selected) {
21
+ selected = candidate;
22
+ continue;
23
+ }
24
+ if (candidate.lastVisibleAt > selected.lastVisibleAt) {
25
+ selected = candidate;
26
+ continue;
27
+ }
28
+ if (candidate.lastVisibleAt === selected.lastVisibleAt && candidate.tabId > selected.tabId) {
29
+ selected = candidate;
30
+ }
31
+ }
32
+ return selected;
33
+ }
34
+
35
+ // src/runtime/browser-broker-errors.ts
36
+ var INCOMPATIBLE_BROWSER_BROKER_CONFIGURATION_CODE = "incompatible-browser-broker-configuration";
37
+
38
+ // src/runtime/leader-lock.ts
39
+ function resolveNavigatorLocks() {
40
+ const nav = globalThis.navigator;
41
+ if (!nav || !nav.locks) return null;
42
+ const locks = nav.locks;
43
+ if (typeof locks.request !== "function") return null;
44
+ return locks;
45
+ }
46
+ async function tryAcquireWebLock(lockName, optionsOrLockManager) {
47
+ const { lockManager, onLost } = normalizeAcquireOptions(optionsOrLockManager);
48
+ if (!lockManager) return null;
49
+ let resolveAcquired = null;
50
+ const acquiredPromise = new Promise((resolve) => {
51
+ resolveAcquired = resolve;
52
+ });
53
+ let acquired = false;
54
+ let releasedIntentionally = false;
55
+ let lossReported = false;
56
+ let releaseLock = null;
57
+ const heldUntilReleased = new Promise((resolve) => {
58
+ releaseLock = () => resolve();
59
+ });
60
+ void lockManager.request(lockName, { mode: "exclusive", ifAvailable: true }, async (lock) => {
61
+ if (!lock) {
62
+ resolveAcquired?.(null);
63
+ resolveAcquired = null;
64
+ return;
65
+ }
66
+ acquired = true;
67
+ resolveAcquired?.({
68
+ release: () => {
69
+ if (!releaseLock) return;
70
+ releasedIntentionally = true;
71
+ releaseLock();
72
+ releaseLock = null;
73
+ }
74
+ });
75
+ resolveAcquired = null;
76
+ await heldUntilReleased;
77
+ }).then(
78
+ () => {
79
+ if (acquired && !releasedIntentionally) {
80
+ reportLockLost();
81
+ }
82
+ },
83
+ (error) => {
84
+ if (acquired && !releasedIntentionally) {
85
+ reportLockLost(error);
86
+ return;
87
+ }
88
+ resolveAcquired?.(null);
89
+ resolveAcquired = null;
90
+ }
91
+ );
92
+ function reportLockLost(reason = new Error(`Web Lock ${lockName} was lost`)) {
93
+ if (lossReported) return;
94
+ lossReported = true;
95
+ onLost?.(reason);
96
+ }
97
+ return await acquiredPromise;
98
+ }
99
+ function normalizeAcquireOptions(optionsOrLockManager) {
100
+ if (optionsOrLockManager === void 0) {
101
+ return { lockManager: resolveNavigatorLocks() };
102
+ }
103
+ if (optionsOrLockManager === null) {
104
+ return { lockManager: null };
105
+ }
106
+ if (isLockManagerLike(optionsOrLockManager)) {
107
+ return { lockManager: optionsOrLockManager };
108
+ }
109
+ return {
110
+ lockManager: optionsOrLockManager.lockManager === void 0 ? resolveNavigatorLocks() : optionsOrLockManager.lockManager,
111
+ onLost: optionsOrLockManager.onLost
112
+ };
113
+ }
114
+ function isLockManagerLike(value) {
115
+ return typeof value === "object" && value !== null && typeof value.request === "function";
116
+ }
117
+ function monitorWebLockRelease(lockName, options) {
118
+ const lockManager = options.lockManager === void 0 ? resolveNavigatorLocks() : options.lockManager;
119
+ if (!lockManager) {
120
+ queueMicrotask(() => options.onError?.(new Error("Web Locks are unavailable")));
121
+ return { cancel() {
122
+ } };
123
+ }
124
+ const controller = new AbortController();
125
+ let cancelled = false;
126
+ void lockManager.request(lockName, { mode: "exclusive", signal: controller.signal }, (lock) => {
127
+ if (lock && !cancelled) {
128
+ options.onGranted();
129
+ }
130
+ return void 0;
131
+ }).catch((error) => {
132
+ if (cancelled || isAbortError(error)) {
133
+ return;
134
+ }
135
+ options.onError?.(error);
136
+ });
137
+ return {
138
+ cancel() {
139
+ if (cancelled) return;
140
+ cancelled = true;
141
+ controller.abort();
142
+ }
143
+ };
144
+ }
145
+ async function stealAndReleaseWebLock(lockName, lockManager = resolveNavigatorLocks()) {
146
+ if (!lockManager) {
147
+ throw new Error("Web Locks are unavailable");
148
+ }
149
+ await lockManager.request(lockName, { mode: "exclusive", steal: true }, () => void 0);
150
+ }
151
+ function isAbortError(error) {
152
+ return error instanceof DOMException && (error.name === "AbortError" || error.name === "InvalidStateError");
153
+ }
154
+
155
+ // src/worker/jazz-broker-worker.ts
156
+ var DEFAULT_FORCE_TAKEOVER_TIMEOUT_MS = 1e3;
157
+ var LEADER_FAILURE_RETRY_BACKOFF_MS = 1e3;
158
+ var INITIAL_FOLLOWER_ATTACHMENT_TIMEOUT_MS = 1e3;
159
+ var MAX_FOLLOWER_ATTACHMENT_TIMEOUT_MS = 3e4;
160
+ var COMPLETED_STORAGE_RESET_OUTCOME_TTL_MS = 3e4;
161
+ var MAX_COMPLETED_STORAGE_RESET_OUTCOMES = 100;
162
+ var workerGlobal = globalThis;
163
+ var brokerInstanceId = createRandomId("broker");
164
+ var tabs = /* @__PURE__ */ new Map();
165
+ var namespace = null;
166
+ var leader = null;
167
+ var currentLeadershipId = 0;
168
+ var pendingFollowerAttachments = /* @__PURE__ */ new Set();
169
+ var pendingFollowerAttachmentTimers = /* @__PURE__ */ new Map();
170
+ var followerAttachmentRetryCounts = /* @__PURE__ */ new Map();
171
+ var attachedFollowerPorts = /* @__PURE__ */ new Set();
172
+ var warnedStaleInstanceDrop = false;
173
+ var replacementElectionInFlight = false;
174
+ var replacementElectionGeneration = 0;
175
+ var brokerPingTimer = null;
176
+ var leaderFailureRetryTimer = null;
177
+ var resetState = null;
178
+ var completedStorageResetOutcomes = /* @__PURE__ */ new Map();
179
+ var failedLeaderRetryAfterByTabId = /* @__PURE__ */ new Map();
180
+ workerGlobal.onconnect = (event) => {
181
+ const port = event.ports[0];
182
+ if (!port) return;
183
+ let tabId = null;
184
+ port.addEventListener("message", (messageEvent) => {
185
+ const message = messageEvent.data;
186
+ if (!message || typeof message !== "object") return;
187
+ if (message.type === "hello") {
188
+ tabId = handleHello(port, message);
189
+ return;
190
+ }
191
+ if (!tabId) return;
192
+ handleTabMessage(tabId, message);
193
+ });
194
+ port.start();
195
+ };
196
+ function handleHello(port, message) {
197
+ if (message.type !== "hello") return null;
198
+ if (!namespace) {
199
+ namespace = {
200
+ appId: message.appId,
201
+ dbName: message.dbName,
202
+ fingerprint: message.fingerprint,
203
+ forceTakeoverTimeoutMs: normalizeForceTakeoverTimeout(message.forceTakeoverTimeoutMs),
204
+ brokerPingIntervalMs: normalizePositiveTimeout(
205
+ message.brokerPingIntervalMs,
206
+ DEFAULT_BROKER_PING_INTERVAL_MS
207
+ ),
208
+ brokerPongTimeoutMs: normalizePositiveTimeout(
209
+ message.brokerPongTimeoutMs,
210
+ DEFAULT_BROKER_PONG_TIMEOUT_MS
211
+ ),
212
+ schemaFingerprint: null
213
+ };
214
+ }
215
+ if (namespace.appId !== message.appId || namespace.dbName !== message.dbName || namespace.fingerprint !== message.fingerprint) {
216
+ post(port, {
217
+ type: "unsupported",
218
+ brokerInstanceId,
219
+ code: INCOMPATIBLE_BROWSER_BROKER_CONFIGURATION_CODE,
220
+ reason: "incompatible persistent browser configuration"
221
+ });
222
+ port.close();
223
+ return null;
224
+ }
225
+ const now = Date.now();
226
+ const previousTab = tabs.get(message.tabId);
227
+ if (previousTab && previousTab.port !== port) {
228
+ previousTab.port.close();
229
+ }
230
+ clearFollowerAttachmentState(message.tabId);
231
+ tabs.set(message.tabId, {
232
+ tabId: message.tabId,
233
+ appId: message.appId,
234
+ dbName: message.dbName,
235
+ fingerprint: message.fingerprint,
236
+ schemaFingerprint: null,
237
+ visibility: message.visibility,
238
+ lastVisibleAt: message.visibility === "visible" ? now : 0,
239
+ port,
240
+ lastPongAt: now
241
+ });
242
+ startBrokerPingTimer();
243
+ post(port, { type: "broker-hello", brokerInstanceId });
244
+ redeliverFinishedStorageResets(port);
245
+ if (resetState) {
246
+ addTabToActiveReset(message.tabId);
247
+ return message.tabId;
248
+ }
249
+ if (leader && leader.tabId === message.tabId) {
250
+ clearLeader(leader.leadershipId, {
251
+ demoteLeader: false,
252
+ removeLeaderTab: false
253
+ });
254
+ }
255
+ if (leader?.ready) {
256
+ post(port, {
257
+ type: "leader-ready",
258
+ brokerInstanceId,
259
+ leaderTabId: leader.tabId,
260
+ leadershipId: leader.leadershipId
261
+ });
262
+ assignFollowerPorts(leader);
263
+ } else {
264
+ electIfNeeded();
265
+ }
266
+ return message.tabId;
267
+ }
268
+ function handleTabMessage(tabId, message) {
269
+ if (message.type === "hello") return;
270
+ if (message.brokerInstanceId !== brokerInstanceId) {
271
+ if (!warnedStaleInstanceDrop) {
272
+ warnedStaleInstanceDrop = true;
273
+ console.warn(
274
+ `[jazz-broker] dropping "${message.type}" from tab ${tabId}: stamped for broker instance ${String(message.brokerInstanceId)}, current is ${brokerInstanceId}. This usually means tabs are running different jazz-tools versions against one broker.`
275
+ );
276
+ }
277
+ return;
278
+ }
279
+ switch (message.type) {
280
+ case "visibility":
281
+ updateVisibility(tabId, message.visibility);
282
+ evictStaleTabs();
283
+ return;
284
+ case "leader-ready": {
285
+ if (!leader || leader.tabId !== tabId || leader.leadershipId !== message.leadershipId) {
286
+ const tab = tabs.get(tabId);
287
+ if (tab) {
288
+ post(tab.port, {
289
+ type: "demote",
290
+ brokerInstanceId,
291
+ leadershipId: message.leadershipId
292
+ });
293
+ }
294
+ return;
295
+ }
296
+ const activeReset = resetState;
297
+ const leaderTab = tabs.get(tabId);
298
+ if (activeReset?.promotedLeadershipId === message.leadershipId && message.bridgelessStorageReset && !leaderTab?.schemaFingerprint) {
299
+ clearLeader(message.leadershipId, { demoteLeader: true, removeLeaderTab: false });
300
+ finishStorageReset(activeReset, true);
301
+ return;
302
+ }
303
+ leader.ready = true;
304
+ leader.tabLockName = message.tabLockName;
305
+ leader.workerLockName = message.workerLockName;
306
+ announceLeaderReady(leader);
307
+ startLeaderLockMonitors(leader);
308
+ if (resetState?.promotedLeadershipId === message.leadershipId) {
309
+ resetState.phase = "reconnecting";
310
+ assignFollowerPorts(leader);
311
+ finishStorageResetIfReconnected(resetState);
312
+ return;
313
+ }
314
+ assignFollowerPorts(leader);
315
+ return;
316
+ }
317
+ case "follower-port-attached":
318
+ if (!leader || leader.tabId !== tabId || leader.leadershipId !== message.leadershipId) return;
319
+ markFollowerPortAttached(message.followerTabId, message.leadershipId);
320
+ return;
321
+ case "follower-port-closed":
322
+ if (!leader || leader.tabId !== tabId || leader.leadershipId !== message.leadershipId) return;
323
+ clearFollowerAttachmentKey(message.followerTabId, message.leadershipId);
324
+ assignFollowerPorts(leader);
325
+ return;
326
+ case "schema-ready":
327
+ handleSchemaReady(tabId, message.schemaFingerprint);
328
+ return;
329
+ case "leader-failed":
330
+ if (resetState?.promotedLeadershipId === message.leadershipId) {
331
+ resetState.errors.push(message.reason);
332
+ removeTab(tabId, { closePort: false, notifyLeader: false });
333
+ removeTabFromActiveReset(tabId);
334
+ leader = null;
335
+ resetState.promotedLeadershipId = null;
336
+ void promoteResetLeader(resetState);
337
+ return;
338
+ }
339
+ if (leader?.tabId === tabId && leader.leadershipId === message.leadershipId) {
340
+ markLeaderCandidateFailed(tabId);
341
+ const cleared = clearLeader(message.leadershipId, {
342
+ demoteLeader: true,
343
+ removeLeaderTab: false
344
+ });
345
+ scheduleReplacementElection(cleared);
346
+ }
347
+ return;
348
+ case "storage-reset-request":
349
+ startStorageReset(tabId, message.requestId);
350
+ return;
351
+ case "storage-reset-ready":
352
+ handleStorageResetReady(tabId, message.requestId, message.success, message.errorMessage);
353
+ return;
354
+ case "shutdown":
355
+ if (leader?.tabId === tabId) {
356
+ const leadershipId = leader.leadershipId;
357
+ const activeReset = resetState;
358
+ removeTab(tabId, { closePort: false, notifyLeader: false });
359
+ const cleared = clearLeader(leadershipId, {
360
+ demoteLeader: false,
361
+ removeLeaderTab: false
362
+ });
363
+ removeTabFromActiveReset(tabId);
364
+ if (activeReset && activeReset.promotedLeadershipId === leadershipId && activeReset.phase !== "preparing") {
365
+ activeReset.promotedLeadershipId = null;
366
+ void promoteResetLeader(activeReset);
367
+ resetIfIdle();
368
+ return;
369
+ }
370
+ scheduleReplacementElection(cleared);
371
+ } else {
372
+ removeTab(tabId, { closePort: false, notifyLeader: true });
373
+ removeTabFromActiveReset(tabId);
374
+ }
375
+ resetIfIdle();
376
+ return;
377
+ case "broker-pong":
378
+ {
379
+ const tab = tabs.get(tabId);
380
+ if (!tab) return;
381
+ tab.lastPongAt = Date.now();
382
+ }
383
+ return;
384
+ }
385
+ }
386
+ function updateVisibility(tabId, visibility) {
387
+ const tab = tabs.get(tabId);
388
+ if (!tab) return;
389
+ tab.visibility = visibility;
390
+ if (visibility === "visible") {
391
+ tab.lastVisibleAt = Date.now();
392
+ }
393
+ }
394
+ function electIfNeeded() {
395
+ if (resetState) return;
396
+ if (replacementElectionInFlight) return;
397
+ if (leader?.ready || tabs.size === 0) return;
398
+ if (leader && !namespace?.schemaFingerprint) return;
399
+ const candidate = selectLeaderCandidate(eligibleLeaderCandidates());
400
+ if (!candidate) {
401
+ scheduleLeaderFailureRetryElection();
402
+ return;
403
+ }
404
+ if (leader) {
405
+ const currentLeaderTab = tabs.get(leader.tabId);
406
+ if (currentLeaderTab?.schemaFingerprint === namespace?.schemaFingerprint) {
407
+ return;
408
+ }
409
+ if (candidate.tabId === leader.tabId) {
410
+ return;
411
+ }
412
+ clearLeader(leader.leadershipId, {
413
+ demoteLeader: true,
414
+ removeLeaderTab: false
415
+ });
416
+ }
417
+ const tab = tabs.get(candidate.tabId);
418
+ if (!tab) return;
419
+ const lockNames = currentLeaderLockNames();
420
+ if (!lockNames) return;
421
+ currentLeadershipId += 1;
422
+ leader = {
423
+ tabId: tab.tabId,
424
+ leadershipId: currentLeadershipId,
425
+ ready: false,
426
+ tabLockName: lockNames.tabLockName,
427
+ workerLockName: lockNames.workerLockName,
428
+ tabLockMonitor: null,
429
+ workerLockMonitor: null
430
+ };
431
+ post(tab.port, {
432
+ type: "become-leader",
433
+ brokerInstanceId,
434
+ leadershipId: currentLeadershipId
435
+ });
436
+ }
437
+ function resetIfIdle() {
438
+ if (tabs.size > 0) return;
439
+ namespace = null;
440
+ leader = null;
441
+ clearAllFollowerAttachmentState();
442
+ resetState = null;
443
+ replacementElectionGeneration += 1;
444
+ replacementElectionInFlight = false;
445
+ failedLeaderRetryAfterByTabId.clear();
446
+ stopLeaderFailureRetryTimer();
447
+ stopBrokerPingTimer();
448
+ }
449
+ function removeTab(tabId, options) {
450
+ const tab = tabs.get(tabId);
451
+ if (!tab) return null;
452
+ if (options.notifyLeader && leader && leader.tabId !== tabId) {
453
+ notifyLeaderToDetachFollower(tabId, leader.leadershipId);
454
+ }
455
+ tabs.delete(tabId);
456
+ failedLeaderRetryAfterByTabId.delete(tabId);
457
+ clearFollowerAttachmentState(tabId);
458
+ reelectSchemaFingerprintIfUnheld(tab);
459
+ if (options.closePort) {
460
+ tab.port.close();
461
+ }
462
+ return tab;
463
+ }
464
+ function notifyLeaderToDetachFollower(followerTabId, leadershipId) {
465
+ const leaderTab = leader ? tabs.get(leader.tabId) : null;
466
+ if (!leaderTab) return;
467
+ post(leaderTab.port, {
468
+ type: "detach-follower-port",
469
+ brokerInstanceId,
470
+ followerTabId,
471
+ leadershipId
472
+ });
473
+ }
474
+ function clearFollowerAttachmentState(followerTabId) {
475
+ for (const key of pendingFollowerAttachments) {
476
+ if (key.endsWith(`:${followerTabId}`)) {
477
+ clearPendingFollowerAttachment(key);
478
+ }
479
+ }
480
+ for (const key of attachedFollowerPorts) {
481
+ if (key.endsWith(`:${followerTabId}`)) {
482
+ attachedFollowerPorts.delete(key);
483
+ }
484
+ }
485
+ }
486
+ function clearFollowerAttachmentKey(followerTabId, leadershipId) {
487
+ const key = followerAttachmentKey(followerTabId, leadershipId);
488
+ clearPendingFollowerAttachment(key);
489
+ attachedFollowerPorts.delete(key);
490
+ }
491
+ function clearAllFollowerAttachmentState() {
492
+ for (const timer of pendingFollowerAttachmentTimers.values()) {
493
+ clearTimeout(timer);
494
+ }
495
+ pendingFollowerAttachmentTimers.clear();
496
+ pendingFollowerAttachments.clear();
497
+ followerAttachmentRetryCounts.clear();
498
+ attachedFollowerPorts.clear();
499
+ }
500
+ function clearPendingFollowerAttachment(key) {
501
+ pendingFollowerAttachments.delete(key);
502
+ followerAttachmentRetryCounts.delete(key);
503
+ const timer = pendingFollowerAttachmentTimers.get(key);
504
+ if (timer) {
505
+ clearTimeout(timer);
506
+ pendingFollowerAttachmentTimers.delete(key);
507
+ }
508
+ }
509
+ function handleSchemaReady(tabId, schemaFingerprint) {
510
+ if (!namespace) return;
511
+ const tab = tabs.get(tabId);
512
+ if (!tab) return;
513
+ if (!namespace.schemaFingerprint) {
514
+ namespace.schemaFingerprint = schemaFingerprint;
515
+ }
516
+ tab.schemaFingerprint = schemaFingerprint;
517
+ if (namespace.schemaFingerprint !== schemaFingerprint) {
518
+ blockTabForSchemaMismatch(tab);
519
+ return;
520
+ }
521
+ if (leader?.ready) {
522
+ assignFollowerPorts(leader);
523
+ return;
524
+ }
525
+ electIfNeeded();
526
+ }
527
+ function blockTabForSchemaMismatch(tab) {
528
+ post(tab.port, {
529
+ type: "schema-blocked",
530
+ brokerInstanceId,
531
+ reason: "incompatible persistent browser schema"
532
+ });
533
+ if (leader?.tabId === tab.tabId) {
534
+ const cleared = clearLeader(leader.leadershipId, {
535
+ demoteLeader: true,
536
+ removeLeaderTab: false
537
+ });
538
+ scheduleReplacementElection(cleared);
539
+ }
540
+ }
541
+ function reelectSchemaFingerprintIfUnheld(departed) {
542
+ if (!namespace?.schemaFingerprint) return;
543
+ if (departed.schemaFingerprint !== namespace.schemaFingerprint) return;
544
+ for (const tab of tabs.values()) {
545
+ if (tab.schemaFingerprint === namespace.schemaFingerprint) return;
546
+ }
547
+ let next = null;
548
+ for (const tab of tabs.values()) {
549
+ if (tab.schemaFingerprint) {
550
+ next = tab.schemaFingerprint;
551
+ break;
552
+ }
553
+ }
554
+ namespace.schemaFingerprint = next;
555
+ if (!next) return;
556
+ if (leader?.ready) {
557
+ assignFollowerPorts(leader);
558
+ } else {
559
+ electIfNeeded();
560
+ }
561
+ }
562
+ function announceLeaderReady(nextLeader) {
563
+ for (const tab of tabs.values()) {
564
+ post(tab.port, {
565
+ type: "leader-ready",
566
+ brokerInstanceId,
567
+ leaderTabId: nextLeader.tabId,
568
+ leadershipId: nextLeader.leadershipId
569
+ });
570
+ }
571
+ }
572
+ function startLeaderLockMonitors(nextLeader) {
573
+ cancelLeaderMonitors(nextLeader);
574
+ if (!nextLeader.tabLockName || !nextLeader.workerLockName) return;
575
+ nextLeader.tabLockMonitor = monitorWebLockRelease(nextLeader.tabLockName, {
576
+ onGranted: () => {
577
+ handleLeaderLockReleased(nextLeader.leadershipId);
578
+ },
579
+ onError: () => {
580
+ handleLeaderLockReleased(nextLeader.leadershipId);
581
+ }
582
+ });
583
+ nextLeader.workerLockMonitor = monitorWebLockRelease(nextLeader.workerLockName, {
584
+ onGranted: () => {
585
+ handleLeaderLockReleased(nextLeader.leadershipId);
586
+ },
587
+ onError: () => {
588
+ handleLeaderLockReleased(nextLeader.leadershipId);
589
+ }
590
+ });
591
+ }
592
+ function handleLeaderLockReleased(leadershipId) {
593
+ if (!leader || leader.leadershipId !== leadershipId) return;
594
+ const cleared = clearLeader(leadershipId, { demoteLeader: true, removeLeaderTab: true });
595
+ scheduleReplacementElection(cleared);
596
+ }
597
+ function clearLeader(leadershipId, options) {
598
+ const current = leader;
599
+ if (!current || current.leadershipId !== leadershipId) return null;
600
+ cancelLeaderMonitors(current);
601
+ clearAllFollowerAttachmentState();
602
+ const leaderTab = tabs.get(current.tabId);
603
+ if (options.demoteLeader && leaderTab) {
604
+ post(leaderTab.port, {
605
+ type: "demote",
606
+ brokerInstanceId,
607
+ leadershipId
608
+ });
609
+ }
610
+ for (const tab of tabs.values()) {
611
+ if (tab.tabId === current.tabId) continue;
612
+ post(tab.port, {
613
+ type: "close-follower-port",
614
+ brokerInstanceId,
615
+ leadershipId
616
+ });
617
+ }
618
+ if (options.removeLeaderTab) {
619
+ removeTab(current.tabId, { closePort: false, notifyLeader: false });
620
+ }
621
+ leader = null;
622
+ return {
623
+ tabId: current.tabId,
624
+ leadershipId: current.leadershipId,
625
+ tabLockName: current.tabLockName,
626
+ workerLockName: current.workerLockName
627
+ };
628
+ }
629
+ function cancelLeaderMonitors(current) {
630
+ current.tabLockMonitor?.cancel();
631
+ current.tabLockMonitor = null;
632
+ current.workerLockMonitor?.cancel();
633
+ current.workerLockMonitor = null;
634
+ }
635
+ function startStorageReset(requestingTabId, requestId) {
636
+ if (resetState) {
637
+ resetState.requestIds.add(requestId);
638
+ const tab = tabs.get(requestingTabId);
639
+ if (tab) {
640
+ post(tab.port, {
641
+ type: "storage-reset-started",
642
+ brokerInstanceId,
643
+ requestId
644
+ });
645
+ }
646
+ return;
647
+ }
648
+ const previousLeader = leader ? clearLeader(leader.leadershipId, {
649
+ demoteLeader: false,
650
+ removeLeaderTab: false
651
+ }) : null;
652
+ const leadershipId = previousLeader?.leadershipId ?? currentLeadershipId;
653
+ resetState = {
654
+ requestId,
655
+ requestIds: /* @__PURE__ */ new Set([requestId]),
656
+ participants: new Set(tabs.keys()),
657
+ preparedTabs: /* @__PURE__ */ new Set(),
658
+ errors: [],
659
+ previousLeader,
660
+ promotedLeadershipId: null,
661
+ phase: "preparing"
662
+ };
663
+ const requestingTab = tabs.get(requestingTabId);
664
+ if (requestingTab) {
665
+ post(requestingTab.port, {
666
+ type: "storage-reset-started",
667
+ brokerInstanceId,
668
+ requestId
669
+ });
670
+ }
671
+ for (const tab of tabs.values()) {
672
+ post(tab.port, {
673
+ type: "storage-reset-begin",
674
+ brokerInstanceId,
675
+ requestId,
676
+ leadershipId
677
+ });
678
+ }
679
+ continueStorageResetIfReady(resetState);
680
+ }
681
+ function addTabToActiveReset(tabId) {
682
+ const activeReset = resetState;
683
+ const tab = tabs.get(tabId);
684
+ if (!activeReset || !tab) return;
685
+ if (activeReset.phase !== "preparing") return;
686
+ activeReset.participants.add(tabId);
687
+ post(tab.port, {
688
+ type: "storage-reset-begin",
689
+ brokerInstanceId,
690
+ requestId: activeReset.requestId,
691
+ leadershipId: activeReset.previousLeader?.leadershipId ?? currentLeadershipId
692
+ });
693
+ }
694
+ function handleStorageResetReady(tabId, requestId, success, errorMessage) {
695
+ const activeReset = resetState;
696
+ if (!activeReset || activeReset.requestId !== requestId || activeReset.phase !== "preparing") {
697
+ return;
698
+ }
699
+ if (!activeReset.participants.has(tabId)) {
700
+ return;
701
+ }
702
+ if (!success) {
703
+ activeReset.errors.push(errorMessage ?? `Tab ${tabId} failed to prepare storage reset`);
704
+ }
705
+ activeReset.preparedTabs.add(tabId);
706
+ continueStorageResetIfReady(activeReset);
707
+ }
708
+ function continueStorageResetIfReady(activeReset) {
709
+ if (resetState !== activeReset || activeReset.phase !== "preparing") return;
710
+ for (const participant of activeReset.participants) {
711
+ if (!activeReset.preparedTabs.has(participant)) return;
712
+ }
713
+ activeReset.phase = "promoting";
714
+ void (async () => {
715
+ await waitForPreviousLeaderLocks(activeReset.previousLeader, () => resetState === activeReset);
716
+ if (activeReset.errors.length > 0) {
717
+ finishStorageReset(activeReset, false, activeReset.errors.join("; "));
718
+ return;
719
+ }
720
+ await promoteResetLeader(activeReset);
721
+ })();
722
+ }
723
+ async function promoteResetLeader(activeReset) {
724
+ if (resetState !== activeReset) return;
725
+ const candidate = selectLeaderCandidate(eligibleLeaderCandidates());
726
+ if (!candidate) {
727
+ finishStorageReset(activeReset, false, "No connected tab is available to reset storage");
728
+ return;
729
+ }
730
+ const tab = tabs.get(candidate.tabId);
731
+ if (!tab) {
732
+ finishStorageReset(activeReset, false, "No connected tab is available to reset storage");
733
+ return;
734
+ }
735
+ const lockNames = currentLeaderLockNames();
736
+ if (!lockNames) {
737
+ finishStorageReset(activeReset, false, "No connected tab is available to reset storage");
738
+ return;
739
+ }
740
+ currentLeadershipId += 1;
741
+ activeReset.promotedLeadershipId = currentLeadershipId;
742
+ leader = {
743
+ tabId: tab.tabId,
744
+ leadershipId: currentLeadershipId,
745
+ ready: false,
746
+ tabLockName: lockNames.tabLockName,
747
+ workerLockName: lockNames.workerLockName,
748
+ tabLockMonitor: null,
749
+ workerLockMonitor: null
750
+ };
751
+ post(tab.port, {
752
+ type: "become-leader",
753
+ brokerInstanceId,
754
+ leadershipId: currentLeadershipId,
755
+ resetRequestId: activeReset.requestId
756
+ });
757
+ }
758
+ function finishStorageReset(completedReset, success, errorMessage) {
759
+ if (resetState === completedReset) {
760
+ resetState = null;
761
+ }
762
+ const outcomes = rememberStorageResetOutcomes(completedReset.requestIds, success, errorMessage);
763
+ for (const tab of tabs.values()) {
764
+ for (const outcome of outcomes) {
765
+ postStorageResetOutcome(tab.port, outcome);
766
+ }
767
+ }
768
+ if (!success) {
769
+ electIfNeeded();
770
+ }
771
+ }
772
+ function rememberStorageResetOutcomes(requestIds, success, errorMessage) {
773
+ const now = Date.now();
774
+ const outcomes = [];
775
+ for (const requestId of requestIds) {
776
+ const outcome = {
777
+ requestId,
778
+ success,
779
+ ...errorMessage ? { errorMessage } : {},
780
+ finishedAt: now
781
+ };
782
+ completedStorageResetOutcomes.delete(requestId);
783
+ completedStorageResetOutcomes.set(requestId, outcome);
784
+ outcomes.push(outcome);
785
+ }
786
+ pruneCompletedStorageResetOutcomes(now);
787
+ return outcomes;
788
+ }
789
+ function redeliverFinishedStorageResets(port) {
790
+ pruneCompletedStorageResetOutcomes();
791
+ for (const outcome of completedStorageResetOutcomes.values()) {
792
+ postStorageResetOutcome(port, outcome);
793
+ }
794
+ }
795
+ function postStorageResetOutcome(port, outcome) {
796
+ post(port, {
797
+ type: "storage-reset-finished",
798
+ brokerInstanceId,
799
+ requestId: outcome.requestId,
800
+ success: outcome.success,
801
+ ...outcome.errorMessage ? { errorMessage: outcome.errorMessage } : {}
802
+ });
803
+ }
804
+ function pruneCompletedStorageResetOutcomes(now = Date.now()) {
805
+ for (const [requestId, outcome] of completedStorageResetOutcomes) {
806
+ if (now - outcome.finishedAt > COMPLETED_STORAGE_RESET_OUTCOME_TTL_MS) {
807
+ completedStorageResetOutcomes.delete(requestId);
808
+ }
809
+ }
810
+ while (completedStorageResetOutcomes.size > MAX_COMPLETED_STORAGE_RESET_OUTCOMES) {
811
+ const oldestRequestId = completedStorageResetOutcomes.keys().next().value;
812
+ if (!oldestRequestId) return;
813
+ completedStorageResetOutcomes.delete(oldestRequestId);
814
+ }
815
+ }
816
+ function finishStorageResetIfReconnected(activeReset) {
817
+ if (resetState !== activeReset || activeReset.phase !== "reconnecting") return;
818
+ if (!leader || !leader.ready || activeReset.promotedLeadershipId !== leader.leadershipId) return;
819
+ for (const tabId of activeReset.participants) {
820
+ const tab = tabs.get(tabId);
821
+ if (!tab || !shouldAssignFollowerPort(tab, leader)) continue;
822
+ if (!attachedFollowerPorts.has(followerAttachmentKey(tabId, leader.leadershipId))) {
823
+ return;
824
+ }
825
+ }
826
+ finishStorageReset(activeReset, true);
827
+ }
828
+ function scheduleReplacementElection(previousLeader) {
829
+ if (replacementElectionInFlight) return;
830
+ replacementElectionInFlight = true;
831
+ const electionGeneration = ++replacementElectionGeneration;
832
+ void (async () => {
833
+ try {
834
+ await waitForPreviousLeaderLocks(
835
+ previousLeader,
836
+ () => replacementElectionInFlight && replacementElectionGeneration === electionGeneration && leader === null
837
+ );
838
+ } finally {
839
+ if (replacementElectionGeneration === electionGeneration) {
840
+ replacementElectionInFlight = false;
841
+ }
842
+ }
843
+ if (replacementElectionGeneration !== electionGeneration) return;
844
+ electIfNeeded();
845
+ })();
846
+ }
847
+ function startBrokerPingTimer() {
848
+ if (brokerPingTimer || !namespace) return;
849
+ sendBrokerPings();
850
+ brokerPingTimer = setTimeout(() => {
851
+ brokerPingTimer = null;
852
+ sendBrokerPings();
853
+ if (namespace && tabs.size > 0) {
854
+ startBrokerPingTimer();
855
+ }
856
+ }, namespace.brokerPingIntervalMs);
857
+ }
858
+ function stopBrokerPingTimer() {
859
+ if (!brokerPingTimer) return;
860
+ clearTimeout(brokerPingTimer);
861
+ brokerPingTimer = null;
862
+ }
863
+ function sendBrokerPings() {
864
+ if (!namespace) return;
865
+ const now = Date.now();
866
+ const tabSnapshot = Array.from(tabs.values());
867
+ for (const tab of tabSnapshot) {
868
+ if (isBrokerPongTimedOut(tab, now)) {
869
+ evictTab(tab.tabId, "missed broker pong");
870
+ continue;
871
+ }
872
+ post(tab.port, {
873
+ type: "broker-ping",
874
+ brokerInstanceId
875
+ });
876
+ }
877
+ }
878
+ function evictStaleTabs(now = Date.now()) {
879
+ if (!namespace) return;
880
+ const tabSnapshot = Array.from(tabs.values());
881
+ for (const tab of tabSnapshot) {
882
+ if (isBrokerPongTimedOut(tab, now)) {
883
+ evictTab(tab.tabId, "missed broker pong");
884
+ }
885
+ }
886
+ }
887
+ function isBrokerPongTimedOut(tab, now) {
888
+ return namespace !== null && now - tab.lastPongAt > namespace.brokerPongTimeoutMs;
889
+ }
890
+ function evictTab(tabId, reason) {
891
+ const tab = tabs.get(tabId);
892
+ if (!tab) return;
893
+ removeTab(tabId, { closePort: true, notifyLeader: true });
894
+ if (leader?.tabId === tabId) {
895
+ const leadershipId = leader.leadershipId;
896
+ const activeReset = resetState;
897
+ const cleared = clearLeader(leadershipId, {
898
+ demoteLeader: false,
899
+ removeLeaderTab: false
900
+ });
901
+ removeTabFromActiveReset(tabId);
902
+ if (activeReset && activeReset.promotedLeadershipId === leadershipId && activeReset.phase !== "preparing") {
903
+ activeReset.promotedLeadershipId = null;
904
+ void promoteResetLeader(activeReset);
905
+ resetIfIdle();
906
+ return;
907
+ }
908
+ scheduleReplacementElection(cleared);
909
+ } else {
910
+ removeTabFromActiveReset(tabId);
911
+ }
912
+ resetIfIdle();
913
+ }
914
+ async function waitForPreviousLeaderLocks(previousLeader, shouldForceTakeover = () => true) {
915
+ if (!previousLeader?.tabLockName || !previousLeader.workerLockName) {
916
+ return;
917
+ }
918
+ if (!shouldForceTakeover()) return;
919
+ const takeoverLockNames = [previousLeader.tabLockName, previousLeader.workerLockName].filter(
920
+ (lockName) => lockName !== null
921
+ );
922
+ if (await acquireAndReleaseLocks(takeoverLockNames)) {
923
+ return;
924
+ }
925
+ await sleep(namespace?.forceTakeoverTimeoutMs ?? DEFAULT_FORCE_TAKEOVER_TIMEOUT_MS);
926
+ if (!shouldForceTakeover()) return;
927
+ for (const lockName of takeoverLockNames) {
928
+ await stealAndReleaseWebLock(lockName).catch(() => void 0);
929
+ }
930
+ }
931
+ async function acquireAndReleaseLocks(lockNames) {
932
+ const leases = await Promise.all(lockNames.map((lockName) => tryAcquireWebLock(lockName)));
933
+ for (const lease of leases) {
934
+ lease?.release();
935
+ }
936
+ return leases.every((lease) => lease !== null);
937
+ }
938
+ function assignFollowerPorts(nextLeader) {
939
+ if (resetState && resetState.phase !== "reconnecting") return;
940
+ const leaderTab = tabs.get(nextLeader.tabId);
941
+ if (!leaderTab) return;
942
+ for (const follower of tabs.values()) {
943
+ if (!shouldAssignFollowerPort(follower, nextLeader)) continue;
944
+ const key = followerAttachmentKey(follower.tabId, nextLeader.leadershipId);
945
+ if (pendingFollowerAttachments.has(key)) continue;
946
+ if (attachedFollowerPorts.has(key)) continue;
947
+ const channel = new MessageChannel();
948
+ markFollowerPortPending(follower.tabId, nextLeader.leadershipId);
949
+ post(
950
+ leaderTab.port,
951
+ {
952
+ type: "attach-follower-port",
953
+ brokerInstanceId,
954
+ followerTabId: follower.tabId,
955
+ leadershipId: nextLeader.leadershipId,
956
+ port: channel.port1
957
+ },
958
+ [channel.port1]
959
+ );
960
+ post(
961
+ follower.port,
962
+ {
963
+ type: "use-follower-port",
964
+ brokerInstanceId,
965
+ leaderTabId: nextLeader.tabId,
966
+ leadershipId: nextLeader.leadershipId,
967
+ port: channel.port2
968
+ },
969
+ [channel.port2]
970
+ );
971
+ }
972
+ }
973
+ function markFollowerPortPending(followerTabId, leadershipId) {
974
+ const key = followerAttachmentKey(followerTabId, leadershipId);
975
+ pendingFollowerAttachments.add(key);
976
+ const retryCount = followerAttachmentRetryCounts.get(key) ?? 0;
977
+ const timeoutMs = Math.min(
978
+ INITIAL_FOLLOWER_ATTACHMENT_TIMEOUT_MS * 2 ** retryCount,
979
+ MAX_FOLLOWER_ATTACHMENT_TIMEOUT_MS
980
+ );
981
+ const timer = setTimeout(() => {
982
+ pendingFollowerAttachmentTimers.delete(key);
983
+ if (!pendingFollowerAttachments.delete(key)) return;
984
+ if (!leader || !leader.ready || leader.leadershipId !== leadershipId) return;
985
+ if (!tabs.has(followerTabId)) return;
986
+ followerAttachmentRetryCounts.set(key, retryCount + 1);
987
+ assignFollowerPorts(leader);
988
+ }, timeoutMs);
989
+ pendingFollowerAttachmentTimers.set(key, timer);
990
+ }
991
+ function eligibleLeaderCandidates() {
992
+ const schemaFingerprint = namespace?.schemaFingerprint;
993
+ return [...tabs.values()].filter((tab) => {
994
+ if (isLeaderCandidateInFailureBackoff(tab.tabId)) {
995
+ return false;
996
+ }
997
+ return !schemaFingerprint || tab.schemaFingerprint === schemaFingerprint;
998
+ });
999
+ }
1000
+ function markLeaderCandidateFailed(tabId) {
1001
+ failedLeaderRetryAfterByTabId.set(tabId, Date.now() + LEADER_FAILURE_RETRY_BACKOFF_MS);
1002
+ }
1003
+ function isLeaderCandidateInFailureBackoff(tabId, now = Date.now()) {
1004
+ const retryAfter = failedLeaderRetryAfterByTabId.get(tabId);
1005
+ if (retryAfter === void 0) return false;
1006
+ if (retryAfter <= now) {
1007
+ failedLeaderRetryAfterByTabId.delete(tabId);
1008
+ return false;
1009
+ }
1010
+ return true;
1011
+ }
1012
+ function scheduleLeaderFailureRetryElection(now = Date.now()) {
1013
+ if (leaderFailureRetryTimer || resetState || replacementElectionInFlight || leader?.ready) return;
1014
+ let retryAt = null;
1015
+ for (const [tabId, candidateRetryAt] of failedLeaderRetryAfterByTabId) {
1016
+ if (!tabs.has(tabId)) {
1017
+ failedLeaderRetryAfterByTabId.delete(tabId);
1018
+ continue;
1019
+ }
1020
+ retryAt = retryAt === null ? candidateRetryAt : Math.min(retryAt, candidateRetryAt);
1021
+ }
1022
+ if (retryAt === null) return;
1023
+ leaderFailureRetryTimer = setTimeout(
1024
+ () => {
1025
+ leaderFailureRetryTimer = null;
1026
+ electIfNeeded();
1027
+ },
1028
+ Math.max(0, retryAt - now)
1029
+ );
1030
+ }
1031
+ function stopLeaderFailureRetryTimer() {
1032
+ if (!leaderFailureRetryTimer) return;
1033
+ clearTimeout(leaderFailureRetryTimer);
1034
+ leaderFailureRetryTimer = null;
1035
+ }
1036
+ function currentLeaderLockNames() {
1037
+ if (!namespace) return null;
1038
+ return {
1039
+ tabLockName: `jazz-leader-tab:${namespace.appId}:${namespace.dbName}`,
1040
+ workerLockName: `jazz-leader-worker:${namespace.appId}:${namespace.dbName}`
1041
+ };
1042
+ }
1043
+ function shouldAssignFollowerPort(tab, nextLeader) {
1044
+ if (tab.tabId === nextLeader.tabId) return false;
1045
+ return !namespace?.schemaFingerprint || tab.schemaFingerprint === namespace.schemaFingerprint;
1046
+ }
1047
+ function removeTabFromActiveReset(tabId) {
1048
+ const activeReset = resetState;
1049
+ if (!activeReset) return;
1050
+ activeReset.participants.delete(tabId);
1051
+ activeReset.preparedTabs.delete(tabId);
1052
+ continueStorageResetIfReady(activeReset);
1053
+ }
1054
+ function markFollowerPortAttached(followerTabId, leadershipId) {
1055
+ const key = followerAttachmentKey(followerTabId, leadershipId);
1056
+ if (!pendingFollowerAttachments.has(key)) return;
1057
+ clearPendingFollowerAttachment(key);
1058
+ if (!leader || leader.leadershipId !== leadershipId) return;
1059
+ const follower = tabs.get(followerTabId);
1060
+ if (!follower) return;
1061
+ attachedFollowerPorts.add(key);
1062
+ post(follower.port, {
1063
+ type: "follower-ready",
1064
+ brokerInstanceId,
1065
+ leaderTabId: leader.tabId,
1066
+ leadershipId
1067
+ });
1068
+ if (resetState?.phase === "reconnecting" && resetState.promotedLeadershipId === leadershipId) {
1069
+ finishStorageResetIfReconnected(resetState);
1070
+ }
1071
+ }
1072
+ function followerAttachmentKey(followerTabId, leadershipId) {
1073
+ return `${leadershipId}:${followerTabId}`;
1074
+ }
1075
+ function post(port, message, transfer) {
1076
+ if (transfer) {
1077
+ port.postMessage(message, transfer);
1078
+ return;
1079
+ }
1080
+ port.postMessage(message);
1081
+ }
1082
+ function normalizeForceTakeoverTimeout(value) {
1083
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
1084
+ return DEFAULT_FORCE_TAKEOVER_TIMEOUT_MS;
1085
+ }
1086
+ return Math.max(0, Math.floor(value));
1087
+ }
1088
+ function sleep(ms) {
1089
+ return new Promise((resolve) => setTimeout(resolve, ms));
1090
+ }