syncorejs 0.2.1 → 0.2.3

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 (169) hide show
  1. package/README.md +2 -1
  2. package/dist/_vendor/cli/app.d.mts.map +1 -1
  3. package/dist/_vendor/cli/app.mjs +330 -46
  4. package/dist/_vendor/cli/app.mjs.map +1 -1
  5. package/dist/_vendor/cli/context.mjs +27 -9
  6. package/dist/_vendor/cli/context.mjs.map +1 -1
  7. package/dist/_vendor/cli/dev-session.mjs.map +1 -1
  8. package/dist/_vendor/cli/doctor.mjs +513 -46
  9. package/dist/_vendor/cli/doctor.mjs.map +1 -1
  10. package/dist/_vendor/cli/errors.mjs.map +1 -1
  11. package/dist/_vendor/cli/help.mjs.map +1 -1
  12. package/dist/_vendor/cli/index.mjs +9 -2
  13. package/dist/_vendor/cli/index.mjs.map +1 -1
  14. package/dist/_vendor/cli/messages.mjs +5 -4
  15. package/dist/_vendor/cli/messages.mjs.map +1 -1
  16. package/dist/_vendor/cli/preflight.mjs.map +1 -1
  17. package/dist/_vendor/cli/project.mjs +125 -27
  18. package/dist/_vendor/cli/project.mjs.map +1 -1
  19. package/dist/_vendor/cli/render.mjs +57 -9
  20. package/dist/_vendor/cli/render.mjs.map +1 -1
  21. package/dist/_vendor/cli/targets.mjs +4 -3
  22. package/dist/_vendor/cli/targets.mjs.map +1 -1
  23. package/dist/_vendor/core/cli.d.mts +20 -4
  24. package/dist/_vendor/core/cli.d.mts.map +1 -1
  25. package/dist/_vendor/core/cli.mjs +458 -133
  26. package/dist/_vendor/core/cli.mjs.map +1 -1
  27. package/dist/_vendor/core/devtools-auth.mjs +60 -0
  28. package/dist/_vendor/core/devtools-auth.mjs.map +1 -0
  29. package/dist/_vendor/core/index.d.mts +5 -3
  30. package/dist/_vendor/core/index.mjs +22 -2
  31. package/dist/_vendor/core/index.mjs.map +1 -1
  32. package/dist/_vendor/core/runtime/components.d.mts +111 -0
  33. package/dist/_vendor/core/runtime/components.d.mts.map +1 -0
  34. package/dist/_vendor/core/runtime/components.mjs +186 -0
  35. package/dist/_vendor/core/runtime/components.mjs.map +1 -0
  36. package/dist/_vendor/core/runtime/devtools.d.mts +4 -4
  37. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
  38. package/dist/_vendor/core/runtime/devtools.mjs +178 -60
  39. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
  40. package/dist/_vendor/core/runtime/functions.d.mts +398 -16
  41. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
  42. package/dist/_vendor/core/runtime/functions.mjs +74 -3
  43. package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
  44. package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
  45. package/dist/_vendor/core/runtime/id.mjs.map +1 -1
  46. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +83 -0
  47. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -0
  48. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +720 -0
  49. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -0
  50. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +234 -0
  51. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -0
  52. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +255 -0
  53. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -0
  54. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +200 -0
  55. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -0
  56. package/dist/_vendor/core/runtime/internal/engines/shared.mjs +252 -0
  57. package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -0
  58. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +145 -0
  59. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -0
  60. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +221 -0
  61. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -0
  62. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs +32 -0
  63. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -0
  64. package/dist/_vendor/core/runtime/internal/systemMeta.mjs +61 -0
  65. package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -0
  66. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +41 -0
  67. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -0
  68. package/dist/_vendor/core/runtime/runtime.d.mts +1187 -202
  69. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
  70. package/dist/_vendor/core/runtime/runtime.mjs +73 -1365
  71. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
  72. package/dist/_vendor/core/transport.d.mts +113 -0
  73. package/dist/_vendor/core/transport.d.mts.map +1 -0
  74. package/dist/_vendor/core/transport.mjs +428 -0
  75. package/dist/_vendor/core/transport.mjs.map +1 -0
  76. package/dist/_vendor/devtools-protocol/index.d.ts +187 -4
  77. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
  78. package/dist/_vendor/devtools-protocol/index.js +25 -9
  79. package/dist/_vendor/devtools-protocol/index.js.map +1 -1
  80. package/dist/_vendor/next/config.d.ts +3 -4
  81. package/dist/_vendor/next/config.d.ts.map +1 -1
  82. package/dist/_vendor/next/config.js +37 -19
  83. package/dist/_vendor/next/config.js.map +1 -1
  84. package/dist/_vendor/next/index.d.ts +109 -29
  85. package/dist/_vendor/next/index.d.ts.map +1 -1
  86. package/dist/_vendor/next/index.js +104 -26
  87. package/dist/_vendor/next/index.js.map +1 -1
  88. package/dist/_vendor/platform-expo/index.d.ts +156 -37
  89. package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
  90. package/dist/_vendor/platform-expo/index.js +80 -12
  91. package/dist/_vendor/platform-expo/index.js.map +1 -1
  92. package/dist/_vendor/platform-expo/react.d.ts.map +1 -1
  93. package/dist/_vendor/platform-expo/react.js +11 -10
  94. package/dist/_vendor/platform-expo/react.js.map +1 -1
  95. package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
  96. package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
  97. package/dist/_vendor/platform-node/index.d.mts +192 -24
  98. package/dist/_vendor/platform-node/index.d.mts.map +1 -1
  99. package/dist/_vendor/platform-node/index.mjs +236 -97
  100. package/dist/_vendor/platform-node/index.mjs.map +1 -1
  101. package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -1
  102. package/dist/_vendor/platform-node/ipc-react.mjs +15 -2
  103. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
  104. package/dist/_vendor/platform-node/ipc.d.mts +11 -35
  105. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
  106. package/dist/_vendor/platform-node/ipc.mjs +3 -273
  107. package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
  108. package/dist/_vendor/platform-web/external-change.d.ts +43 -1
  109. package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
  110. package/dist/_vendor/platform-web/external-change.js +32 -1
  111. package/dist/_vendor/platform-web/external-change.js.map +1 -1
  112. package/dist/_vendor/platform-web/index.d.ts +323 -51
  113. package/dist/_vendor/platform-web/index.d.ts.map +1 -1
  114. package/dist/_vendor/platform-web/index.js +233 -30
  115. package/dist/_vendor/platform-web/index.js.map +1 -1
  116. package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
  117. package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
  118. package/dist/_vendor/platform-web/indexeddb.js +10 -0
  119. package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
  120. package/dist/_vendor/platform-web/opfs.d.ts +13 -0
  121. package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
  122. package/dist/_vendor/platform-web/opfs.js +12 -0
  123. package/dist/_vendor/platform-web/opfs.js.map +1 -1
  124. package/dist/_vendor/platform-web/persistence.d.ts +54 -0
  125. package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
  126. package/dist/_vendor/platform-web/persistence.js +15 -0
  127. package/dist/_vendor/platform-web/persistence.js.map +1 -1
  128. package/dist/_vendor/platform-web/react.d.ts +1 -2
  129. package/dist/_vendor/platform-web/react.d.ts.map +1 -1
  130. package/dist/_vendor/platform-web/react.js +27 -13
  131. package/dist/_vendor/platform-web/react.js.map +1 -1
  132. package/dist/_vendor/platform-web/sqljs.js +10 -1
  133. package/dist/_vendor/platform-web/sqljs.js.map +1 -1
  134. package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
  135. package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
  136. package/dist/_vendor/platform-web/worker.d.ts +71 -44
  137. package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
  138. package/dist/_vendor/platform-web/worker.js +40 -271
  139. package/dist/_vendor/platform-web/worker.js.map +1 -1
  140. package/dist/_vendor/react/index.d.ts +222 -23
  141. package/dist/_vendor/react/index.d.ts.map +1 -1
  142. package/dist/_vendor/react/index.js +476 -63
  143. package/dist/_vendor/react/index.js.map +1 -1
  144. package/dist/_vendor/schema/definition.d.ts +151 -37
  145. package/dist/_vendor/schema/definition.d.ts.map +1 -1
  146. package/dist/_vendor/schema/definition.js +102 -20
  147. package/dist/_vendor/schema/definition.js.map +1 -1
  148. package/dist/_vendor/schema/index.d.ts +4 -4
  149. package/dist/_vendor/schema/index.js +2 -2
  150. package/dist/_vendor/schema/planner.d.ts +19 -2
  151. package/dist/_vendor/schema/planner.d.ts.map +1 -1
  152. package/dist/_vendor/schema/planner.js +79 -3
  153. package/dist/_vendor/schema/planner.js.map +1 -1
  154. package/dist/_vendor/schema/validators.d.ts +279 -83
  155. package/dist/_vendor/schema/validators.d.ts.map +1 -1
  156. package/dist/_vendor/schema/validators.js +330 -38
  157. package/dist/_vendor/schema/validators.js.map +1 -1
  158. package/dist/_vendor/svelte/index.d.ts +245 -19
  159. package/dist/_vendor/svelte/index.d.ts.map +1 -1
  160. package/dist/_vendor/svelte/index.js +443 -20
  161. package/dist/_vendor/svelte/index.js.map +1 -1
  162. package/dist/browser.d.ts.map +1 -1
  163. package/dist/cli.js +3 -1
  164. package/dist/cli.js.map +1 -1
  165. package/dist/components.d.ts +2 -0
  166. package/dist/components.js +2 -0
  167. package/dist/index.d.ts +3 -2
  168. package/dist/index.js +2 -1
  169. package/package.json +29 -21
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","names":[],"sources":["../src/react.tsx"],"mappings":";;;;;;;;UAYiB,uBAAA,SAAgC,oCAAA;EAAR;EAEvC,QAAA,EAAU,SAAA;EAAA;EAGV,QAAA,GAAW,SAAA;AAAA;;;;KAMD,2BAAA,GAA8B,uBAAA;;;;iBAK1B,kBAAA,CAAA;EACd,QAAA;EACA,SAAA;EACA,UAAA;EACA,UAAA;EACA;AAAA,GACC,uBAAA,GAA0B,SAAA;;AAX7B;;iBAyCgB,sBAAA,CAAuB,KAAA,EAAO,2BAAA,GAA2B,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"react.d.ts","names":[],"sources":["../src/react.tsx"],"mappings":";;;;;;AAgBA;UAAiB,uBAAA,SAAgC,oCAAA;;EAE/C,QAAA,EAAU,SAAA;EAGC;EAAX,QAAA,GAAW,SAAA;AAAA;;;;KAMD,2BAAA,GAA8B,uBAAuB;;;;iBAKjD,kBAAA,CAAA;EACd,QAAA;EACA,SAAA;EACA,UAAA;EACA,UAAA;EACA;AAAA,GACC,uBAAA,GAA0B,SAAA;AAX7B;;;AAAA,iBA2DgB,sBAAA,CAAuB,KAAA,EAAO,2BAA2B,+BAAA,GAAA,CAAA,OAAA"}
@@ -1,5 +1,6 @@
1
1
  import { createSyncoreWebWorkerClient } from "./worker.js";
2
- import { useEffect, useState } from "react";
2
+ import { createUnavailableSyncoreClient } from "../core/index.mjs";
3
+ import { useEffect, useMemo, useState } from "react";
3
4
  import { SyncoreProvider } from "../react/index.js";
4
5
  import { jsx } from "react/jsx-runtime";
5
6
  //#region src/react.tsx
@@ -7,27 +8,40 @@ import { jsx } from "react/jsx-runtime";
7
8
  * Start a worker-backed Syncore client and provide it to React descendants.
8
9
  */
9
10
  function SyncoreWebProvider({ children, workerUrl, workerType, workerName, fallback = null }) {
10
- const [managedClient, setManagedClient] = useState(null);
11
+ const bootingClient = useMemo(() => createUnavailableSyncoreClient({
12
+ kind: "starting",
13
+ reason: "booting"
14
+ }), []);
15
+ const [client, setClient] = useState(bootingClient);
11
16
  useEffect(() => {
12
- const nextClient = createSyncoreWebWorkerClient({
13
- workerUrl,
14
- ...workerType ? { workerType } : {},
15
- ...workerName ? { workerName } : {}
16
- });
17
- setManagedClient(nextClient);
17
+ let managedClient;
18
+ setClient(bootingClient);
19
+ try {
20
+ managedClient = createSyncoreWebWorkerClient({
21
+ workerUrl,
22
+ ...workerType ? { workerType } : {},
23
+ ...workerName ? { workerName } : {}
24
+ });
25
+ setClient(managedClient.client);
26
+ } catch (error) {
27
+ setClient(createUnavailableSyncoreClient({
28
+ kind: "unavailable",
29
+ reason: "worker-unavailable",
30
+ ...error instanceof Error ? { error } : {}
31
+ }));
32
+ }
18
33
  return () => {
19
- nextClient.dispose();
20
- setManagedClient(null);
34
+ managedClient?.dispose();
21
35
  };
22
36
  }, [
37
+ bootingClient,
23
38
  workerName,
24
39
  workerType,
25
40
  workerUrl
26
41
  ]);
27
- if (!managedClient) return fallback;
28
42
  return /* @__PURE__ */ jsx(SyncoreProvider, {
29
- client: managedClient.client,
30
- children
43
+ client,
44
+ children: children ?? fallback
31
45
  });
32
46
  }
33
47
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","names":[],"sources":["../src/react.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { SyncoreProvider } from \"@syncore/react\";\nimport {\n createSyncoreWebWorkerClient,\n type CreateWebWorkerClientProviderOptions,\n type ManagedWebWorkerClient\n} from \"./worker.js\";\n\n/**\n * Props for {@link SyncoreWebProvider}.\n */\nexport interface SyncoreWebProviderProps extends CreateWebWorkerClientProviderOptions {\n /** The React subtree that should receive the Syncore client. */\n children: ReactNode;\n\n /** Optional fallback content rendered before the worker client is ready. */\n fallback?: ReactNode;\n}\n\n/**\n * Props for {@link SyncoreBrowserProvider}.\n */\nexport type SyncoreBrowserProviderProps = SyncoreWebProviderProps;\n\n/**\n * Start a worker-backed Syncore client and provide it to React descendants.\n */\nexport function SyncoreWebProvider({\n children,\n workerUrl,\n workerType,\n workerName,\n fallback = null\n}: SyncoreWebProviderProps): ReactNode {\n const [managedClient, setManagedClient] =\n useState<ManagedWebWorkerClient | null>(null);\n\n useEffect(() => {\n const nextClient = createSyncoreWebWorkerClient({\n workerUrl,\n ...(workerType ? { workerType } : {}),\n ...(workerName ? { workerName } : {})\n });\n setManagedClient(nextClient);\n\n return () => {\n nextClient.dispose();\n setManagedClient(null);\n };\n }, [workerName, workerType, workerUrl]);\n\n if (!managedClient) {\n return fallback;\n }\n\n return (\n <SyncoreProvider client={managedClient.client}>{children}</SyncoreProvider>\n );\n}\n\n/**\n * Start a worker-backed Syncore client and provide it to React descendants.\n */\nexport function SyncoreBrowserProvider(props: SyncoreBrowserProviderProps) {\n return <SyncoreWebProvider {...props} />;\n}\n"],"mappings":";;;;;;;;AA4BA,SAAgB,mBAAmB,EACjC,UACA,WACA,YACA,YACA,WAAW,QAC0B;CACrC,MAAM,CAAC,eAAe,oBACpB,SAAwC,KAAK;AAE/C,iBAAgB;EACd,MAAM,aAAa,6BAA6B;GAC9C;GACA,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;GACpC,GAAI,aAAa,EAAE,YAAY,GAAG,EAAE;GACrC,CAAC;AACF,mBAAiB,WAAW;AAE5B,eAAa;AACX,cAAW,SAAS;AACpB,oBAAiB,KAAK;;IAEvB;EAAC;EAAY;EAAY;EAAU,CAAC;AAEvC,KAAI,CAAC,cACH,QAAO;AAGT,QACE,oBAAC,iBAAD;EAAiB,QAAQ,cAAc;EAAS;EAA2B,CAAA;;;;;AAO/E,SAAgB,uBAAuB,OAAoC;AACzE,QAAO,oBAAC,oBAAD,EAAoB,GAAI,OAAS,CAAA"}
1
+ {"version":3,"file":"react.js","names":[],"sources":["../src/react.tsx"],"sourcesContent":["import {\n createUnavailableSyncoreClient,\n type SyncoreClient\n} from \"@syncore/core\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { SyncoreProvider } from \"@syncore/react\";\nimport {\n createSyncoreWebWorkerClient,\n type CreateWebWorkerClientProviderOptions,\n type ManagedWebWorkerClient\n} from \"./worker.js\";\n\n/**\n * Props for {@link SyncoreWebProvider}.\n */\nexport interface SyncoreWebProviderProps extends CreateWebWorkerClientProviderOptions {\n /** The React subtree that should receive the Syncore client. */\n children: ReactNode;\n\n /** Optional fallback content rendered before the worker client is ready. */\n fallback?: ReactNode;\n}\n\n/**\n * Props for {@link SyncoreBrowserProvider}.\n */\nexport type SyncoreBrowserProviderProps = SyncoreWebProviderProps;\n\n/**\n * Start a worker-backed Syncore client and provide it to React descendants.\n */\nexport function SyncoreWebProvider({\n children,\n workerUrl,\n workerType,\n workerName,\n fallback = null\n}: SyncoreWebProviderProps): ReactNode {\n const bootingClient = useMemo(\n () =>\n createUnavailableSyncoreClient({\n kind: \"starting\",\n reason: \"booting\"\n }),\n []\n );\n const [client, setClient] = useState<SyncoreClient>(bootingClient);\n\n useEffect(() => {\n let managedClient: ManagedWebWorkerClient | undefined;\n\n setClient(bootingClient);\n\n try {\n managedClient = createSyncoreWebWorkerClient({\n workerUrl,\n ...(workerType ? { workerType } : {}),\n ...(workerName ? { workerName } : {})\n });\n setClient(managedClient.client);\n } catch (error) {\n setClient(\n createUnavailableSyncoreClient({\n kind: \"unavailable\",\n reason: \"worker-unavailable\",\n ...(error instanceof Error ? { error } : {})\n })\n );\n }\n\n return () => {\n managedClient?.dispose();\n };\n }, [bootingClient, workerName, workerType, workerUrl]);\n\n return (\n <SyncoreProvider client={client}>\n {children ?? fallback}\n </SyncoreProvider>\n );\n}\n\n/**\n * Start a worker-backed Syncore client and provide it to React descendants.\n */\nexport function SyncoreBrowserProvider(props: SyncoreBrowserProviderProps) {\n return <SyncoreWebProvider {...props} />;\n}\n"],"mappings":";;;;;;;;;AAgCA,SAAgB,mBAAmB,EACjC,UACA,WACA,YACA,YACA,WAAW,QAC0B;CACrC,MAAM,gBAAgB,cAElB,+BAA+B;EAC7B,MAAM;EACN,QAAQ;CACV,CAAC,GACH,CAAC,CACH;CACA,MAAM,CAAC,QAAQ,aAAa,SAAwB,aAAa;CAEjE,gBAAgB;EACd,IAAI;EAEJ,UAAU,aAAa;EAEvB,IAAI;GACF,gBAAgB,6BAA6B;IAC3C;IACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;IACnC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACrC,CAAC;GACD,UAAU,cAAc,MAAM;EAChC,SAAS,OAAO;GACd,UACE,+BAA+B;IAC7B,MAAM;IACN,QAAQ;IACR,GAAI,iBAAiB,QAAQ,EAAE,MAAM,IAAI,CAAC;GAC5C,CAAC,CACH;EACF;EAEA,aAAa;GACX,eAAe,QAAQ;EACzB;CACF,GAAG;EAAC;EAAe;EAAY;EAAY;CAAS,CAAC;CAErD,OACE,oBAAC,iBAAD;EAAyB;YACtB,YAAY;CACE,CAAA;AAErB;;;;AAKA,SAAgB,uBAAuB,OAAoC;CACzE,OAAO,oBAAC,oBAAD,EAAoB,GAAI,MAAQ,CAAA;AACzC"}
@@ -2,6 +2,10 @@ import { SyncoreIndexedDbPersistence } from "./indexeddb.js";
2
2
  import initSqlJs from "sql.js";
3
3
  //#region src/sqljs.ts
4
4
  var SqlJsDriver = class SqlJsDriver {
5
+ database;
6
+ persistence;
7
+ databaseName;
8
+ createDatabase;
5
9
  transactionDepth = 0;
6
10
  closed = false;
7
11
  constructor(database, persistence, databaseName, createDatabase) {
@@ -12,7 +16,9 @@ var SqlJsDriver = class SqlJsDriver {
12
16
  }
13
17
  static async create(options) {
14
18
  const persistence = options.persistence ?? new SyncoreIndexedDbPersistence();
15
- const SQL = await initSqlJs(typeof window === "undefined" && !options.locateFile && !options.wasmUrl ? void 0 : { locateFile: options.locateFile ?? (() => options.wasmUrl ?? "/sql-wasm.wasm") });
19
+ const hasExplicitWasmResolver = Boolean(options.locateFile ?? options.wasmUrl);
20
+ if (isBrowserLikeRuntime() && !hasExplicitWasmResolver) throw new Error("SqlJsDriver requires an explicit wasmUrl or locateFile in browser runtimes. Use createWebSyncoreRuntime/createBrowserWorkerRuntime for the default Syncore web resolver.");
21
+ const SQL = await initSqlJs(!hasExplicitWasmResolver ? void 0 : { locateFile: options.locateFile ?? (() => options.wasmUrl) });
16
22
  const existingBytes = await persistence.loadDatabase(options.databaseName);
17
23
  return new SqlJsDriver(existingBytes ? new SQL.Database(existingBytes) : new SQL.Database(), persistence, options.databaseName, (bytes) => bytes ? new SQL.Database(bytes) : new SQL.Database());
18
24
  }
@@ -130,6 +136,9 @@ var SqlJsDriver = class SqlJsDriver {
130
136
  previousDatabase.close();
131
137
  }
132
138
  };
139
+ function isBrowserLikeRuntime() {
140
+ return typeof window !== "undefined" || globalThis.WorkerGlobalScope !== void 0;
141
+ }
133
142
  function normalizeParams(values) {
134
143
  return values.map((value) => {
135
144
  if (typeof value === "boolean") return value ? 1 : 0;
@@ -1 +1 @@
1
- {"version":3,"file":"sqljs.js","names":[],"sources":["../src/sqljs.ts"],"sourcesContent":["import initSqlJs from \"sql.js\";\nimport type { RunResult, SyncoreSqlDriver } from \"@syncore/core\";\nimport { SyncoreIndexedDbPersistence } from \"./indexeddb.js\";\nimport type { SyncoreWebPersistence } from \"./persistence.js\";\n\ntype SqlJsDatabase = initSqlJs.Database;\ntype SqlJsValue = initSqlJs.SqlValue;\n\nexport interface CreateSqlJsDriverOptions {\n databaseName: string;\n persistence?: SyncoreWebPersistence;\n wasmUrl?: string;\n locateFile?: (fileName: string) => string;\n}\n\nexport class SqlJsDriver implements SyncoreSqlDriver {\n private transactionDepth = 0;\n private closed = false;\n\n constructor(\n private database: SqlJsDatabase,\n private readonly persistence: SyncoreWebPersistence,\n private readonly databaseName: string,\n private readonly createDatabase: (bytes?: Uint8Array) => SqlJsDatabase\n ) {}\n\n static async create(options: CreateSqlJsDriverOptions): Promise<SqlJsDriver> {\n const persistence =\n options.persistence ?? new SyncoreIndexedDbPersistence();\n const SQL = await initSqlJs(\n typeof window === \"undefined\" && !options.locateFile && !options.wasmUrl\n ? undefined\n : {\n locateFile:\n options.locateFile ?? (() => options.wasmUrl ?? \"/sql-wasm.wasm\")\n }\n );\n const existingBytes = await persistence.loadDatabase(options.databaseName);\n const database = existingBytes\n ? new SQL.Database(existingBytes)\n : new SQL.Database();\n return new SqlJsDriver(\n database,\n persistence,\n options.databaseName,\n (bytes) => (bytes ? new SQL.Database(bytes) : new SQL.Database())\n );\n }\n\n async exec(sql: string): Promise<void> {\n this.ensureOpen();\n this.database.run(sql);\n await this.persistIfNeeded();\n }\n\n async run(sql: string, params: unknown[] = []): Promise<RunResult> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.run(normalizeParams(params));\n const lastInsertRowid = readScalarNumber(\n this.database,\n \"SELECT last_insert_rowid()\"\n );\n const result = {\n changes: this.database.getRowsModified(),\n ...(lastInsertRowid !== null ? { lastInsertRowid } : {})\n };\n await this.persistIfNeeded();\n return result;\n } finally {\n statement.free();\n }\n }\n\n async get<T>(sql: string, params: unknown[] = []): Promise<T | undefined> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.bind(normalizeParams(params));\n if (!statement.step()) {\n return undefined;\n }\n return statement.getAsObject() as T;\n } finally {\n statement.free();\n }\n }\n\n async all<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.bind(normalizeParams(params));\n const rows: T[] = [];\n while (statement.step()) {\n rows.push(statement.getAsObject() as T);\n }\n return rows;\n } finally {\n statement.free();\n }\n }\n\n async withTransaction<T>(callback: () => Promise<T>): Promise<T> {\n this.ensureOpen();\n if (this.transactionDepth > 0) {\n return this.withSavepoint(`nested_${this.transactionDepth}`, callback);\n }\n\n this.transactionDepth += 1;\n this.database.run(\"BEGIN IMMEDIATE\");\n try {\n const result = await callback();\n this.database.run(\"COMMIT\");\n await this.persistNow();\n return result;\n } catch (error) {\n this.database.run(\"ROLLBACK\");\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async withSavepoint<T>(name: string, callback: () => Promise<T>): Promise<T> {\n this.ensureOpen();\n const safeName = name.replaceAll(/[^a-zA-Z0-9_]/g, \"_\");\n this.database.run(`SAVEPOINT ${safeName}`);\n this.transactionDepth += 1;\n try {\n const result = await callback();\n this.database.run(`RELEASE SAVEPOINT ${safeName}`);\n return result;\n } catch (error) {\n this.database.run(`ROLLBACK TO SAVEPOINT ${safeName}`);\n this.database.run(`RELEASE SAVEPOINT ${safeName}`);\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n await this.persistNow();\n this.database.close();\n this.closed = true;\n }\n\n async reloadFromPersistence(): Promise<boolean> {\n this.ensureOpen();\n const bytes = await this.persistence.loadDatabase(this.databaseName);\n if (!bytes) {\n return false;\n }\n const nextDatabase = this.createDatabase(bytes);\n const previousDatabase = this.database;\n this.database = nextDatabase;\n previousDatabase.close();\n return true;\n }\n\n createDatabaseFromBytes(bytes?: Uint8Array): SqlJsDatabase {\n return this.createDatabase(bytes);\n }\n\n private async persistIfNeeded(): Promise<void> {\n if (this.transactionDepth === 0) {\n await this.persistNow();\n }\n }\n\n private async persistNow(): Promise<void> {\n this.ensureOpen();\n await this.persistence.saveDatabase(\n this.databaseName,\n this.database.export()\n );\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw new Error(\"The sql.js driver is already closed.\");\n }\n }\n\n replaceDatabase(database: SqlJsDatabase): void {\n this.ensureOpen();\n const previousDatabase = this.database;\n this.database = database;\n previousDatabase.close();\n }\n}\n\nfunction normalizeParams(values: unknown[]): SqlJsValue[] {\n return values.map((value) => {\n if (typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n value instanceof Uint8Array\n ) {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n return JSON.stringify(value);\n });\n}\n\nfunction readScalarNumber(database: SqlJsDatabase, sql: string): number | null {\n const rows = database.exec(sql);\n const firstSet = rows[0];\n const firstRow = firstSet?.values[0];\n const firstValue = firstRow?.[0];\n if (typeof firstValue === \"number\") {\n return firstValue;\n }\n if (typeof firstValue === \"string\") {\n const parsed = Number(firstValue);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n"],"mappings":";;;AAeA,IAAa,cAAb,MAAa,YAAwC;CACnD,mBAA2B;CAC3B,SAAiB;CAEjB,YACE,UACA,aACA,cACA,gBACA;AAJQ,OAAA,WAAA;AACS,OAAA,cAAA;AACA,OAAA,eAAA;AACA,OAAA,iBAAA;;CAGnB,aAAa,OAAO,SAAyD;EAC3E,MAAM,cACJ,QAAQ,eAAe,IAAI,6BAA6B;EAC1D,MAAM,MAAM,MAAM,UAChB,OAAO,WAAW,eAAe,CAAC,QAAQ,cAAc,CAAC,QAAQ,UAC7D,KAAA,IACA,EACE,YACE,QAAQ,qBAAqB,QAAQ,WAAW,mBACnD,CACN;EACD,MAAM,gBAAgB,MAAM,YAAY,aAAa,QAAQ,aAAa;AAI1E,SAAO,IAAI,YAHM,gBACb,IAAI,IAAI,SAAS,cAAc,GAC/B,IAAI,IAAI,UAAU,EAGpB,aACA,QAAQ,eACP,UAAW,QAAQ,IAAI,IAAI,SAAS,MAAM,GAAG,IAAI,IAAI,UAAU,CACjE;;CAGH,MAAM,KAAK,KAA4B;AACrC,OAAK,YAAY;AACjB,OAAK,SAAS,IAAI,IAAI;AACtB,QAAM,KAAK,iBAAiB;;CAG9B,MAAM,IAAI,KAAa,SAAoB,EAAE,EAAsB;AACjE,OAAK,YAAY;EACjB,MAAM,YAAY,KAAK,SAAS,QAAQ,IAAI;AAC5C,MAAI;AACF,aAAU,IAAI,gBAAgB,OAAO,CAAC;GACtC,MAAM,kBAAkB,iBACtB,KAAK,UACL,6BACD;GACD,MAAM,SAAS;IACb,SAAS,KAAK,SAAS,iBAAiB;IACxC,GAAI,oBAAoB,OAAO,EAAE,iBAAiB,GAAG,EAAE;IACxD;AACD,SAAM,KAAK,iBAAiB;AAC5B,UAAO;YACC;AACR,aAAU,MAAM;;;CAIpB,MAAM,IAAO,KAAa,SAAoB,EAAE,EAA0B;AACxE,OAAK,YAAY;EACjB,MAAM,YAAY,KAAK,SAAS,QAAQ,IAAI;AAC5C,MAAI;AACF,aAAU,KAAK,gBAAgB,OAAO,CAAC;AACvC,OAAI,CAAC,UAAU,MAAM,CACnB;AAEF,UAAO,UAAU,aAAa;YACtB;AACR,aAAU,MAAM;;;CAIpB,MAAM,IAAO,KAAa,SAAoB,EAAE,EAAgB;AAC9D,OAAK,YAAY;EACjB,MAAM,YAAY,KAAK,SAAS,QAAQ,IAAI;AAC5C,MAAI;AACF,aAAU,KAAK,gBAAgB,OAAO,CAAC;GACvC,MAAM,OAAY,EAAE;AACpB,UAAO,UAAU,MAAM,CACrB,MAAK,KAAK,UAAU,aAAa,CAAM;AAEzC,UAAO;YACC;AACR,aAAU,MAAM;;;CAIpB,MAAM,gBAAmB,UAAwC;AAC/D,OAAK,YAAY;AACjB,MAAI,KAAK,mBAAmB,EAC1B,QAAO,KAAK,cAAc,UAAU,KAAK,oBAAoB,SAAS;AAGxE,OAAK,oBAAoB;AACzB,OAAK,SAAS,IAAI,kBAAkB;AACpC,MAAI;GACF,MAAM,SAAS,MAAM,UAAU;AAC/B,QAAK,SAAS,IAAI,SAAS;AAC3B,SAAM,KAAK,YAAY;AACvB,UAAO;WACA,OAAO;AACd,QAAK,SAAS,IAAI,WAAW;AAC7B,SAAM;YACE;AACR,QAAK,oBAAoB;;;CAI7B,MAAM,cAAiB,MAAc,UAAwC;AAC3E,OAAK,YAAY;EACjB,MAAM,WAAW,KAAK,WAAW,kBAAkB,IAAI;AACvD,OAAK,SAAS,IAAI,aAAa,WAAW;AAC1C,OAAK,oBAAoB;AACzB,MAAI;GACF,MAAM,SAAS,MAAM,UAAU;AAC/B,QAAK,SAAS,IAAI,qBAAqB,WAAW;AAClD,UAAO;WACA,OAAO;AACd,QAAK,SAAS,IAAI,yBAAyB,WAAW;AACtD,QAAK,SAAS,IAAI,qBAAqB,WAAW;AAClD,SAAM;YACE;AACR,QAAK,oBAAoB;;;CAI7B,MAAM,QAAuB;AAC3B,MAAI,KAAK,OACP;AAEF,QAAM,KAAK,YAAY;AACvB,OAAK,SAAS,OAAO;AACrB,OAAK,SAAS;;CAGhB,MAAM,wBAA0C;AAC9C,OAAK,YAAY;EACjB,MAAM,QAAQ,MAAM,KAAK,YAAY,aAAa,KAAK,aAAa;AACpE,MAAI,CAAC,MACH,QAAO;EAET,MAAM,eAAe,KAAK,eAAe,MAAM;EAC/C,MAAM,mBAAmB,KAAK;AAC9B,OAAK,WAAW;AAChB,mBAAiB,OAAO;AACxB,SAAO;;CAGT,wBAAwB,OAAmC;AACzD,SAAO,KAAK,eAAe,MAAM;;CAGnC,MAAc,kBAAiC;AAC7C,MAAI,KAAK,qBAAqB,EAC5B,OAAM,KAAK,YAAY;;CAI3B,MAAc,aAA4B;AACxC,OAAK,YAAY;AACjB,QAAM,KAAK,YAAY,aACrB,KAAK,cACL,KAAK,SAAS,QAAQ,CACvB;;CAGH,aAA2B;AACzB,MAAI,KAAK,OACP,OAAM,IAAI,MAAM,uCAAuC;;CAI3D,gBAAgB,UAA+B;AAC7C,OAAK,YAAY;EACjB,MAAM,mBAAmB,KAAK;AAC9B,OAAK,WAAW;AAChB,mBAAiB,OAAO;;;AAI5B,SAAS,gBAAgB,QAAiC;AACxD,QAAO,OAAO,KAAK,UAAU;AAC3B,MAAI,OAAO,UAAU,UACnB,QAAO,QAAQ,IAAI;AAErB,MACE,UAAU,QACV,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,iBAAiB,WAEjB,QAAO;AAET,MAAI,iBAAiB,YACnB,QAAO,IAAI,WAAW,MAAM;AAE9B,SAAO,KAAK,UAAU,MAAM;GAC5B;;AAGJ,SAAS,iBAAiB,UAAyB,KAA4B;CAI7E,MAAM,cAHO,SAAS,KAAK,IAAI,CACT,IACK,OAAO,MACJ;AAC9B,KAAI,OAAO,eAAe,SACxB,QAAO;AAET,KAAI,OAAO,eAAe,UAAU;EAClC,MAAM,SAAS,OAAO,WAAW;AACjC,SAAO,OAAO,MAAM,OAAO,GAAG,OAAO;;AAEvC,QAAO"}
1
+ {"version":3,"file":"sqljs.js","names":["scope"],"sources":["../src/sqljs.ts"],"sourcesContent":["import initSqlJs from \"sql.js\";\nimport type { RunResult, SyncoreSqlDriver } from \"@syncore/core\";\nimport { SyncoreIndexedDbPersistence } from \"./indexeddb.js\";\nimport type { SyncoreWebPersistence } from \"./persistence.js\";\n\ntype SqlJsDatabase = initSqlJs.Database;\ntype SqlJsValue = initSqlJs.SqlValue;\n\nexport interface CreateSqlJsDriverOptions {\n databaseName: string;\n persistence?: SyncoreWebPersistence;\n wasmUrl?: string;\n locateFile?: (fileName: string) => string;\n}\n\nexport class SqlJsDriver implements SyncoreSqlDriver {\n private transactionDepth = 0;\n private closed = false;\n\n constructor(\n private database: SqlJsDatabase,\n private readonly persistence: SyncoreWebPersistence,\n private readonly databaseName: string,\n private readonly createDatabase: (bytes?: Uint8Array) => SqlJsDatabase\n ) {}\n\n static async create(options: CreateSqlJsDriverOptions): Promise<SqlJsDriver> {\n const persistence =\n options.persistence ?? new SyncoreIndexedDbPersistence();\n const hasExplicitWasmResolver = Boolean(options.locateFile ?? options.wasmUrl);\n if (isBrowserLikeRuntime() && !hasExplicitWasmResolver) {\n throw new Error(\n \"SqlJsDriver requires an explicit wasmUrl or locateFile in browser runtimes. \" +\n \"Use createWebSyncoreRuntime/createBrowserWorkerRuntime for the default Syncore web resolver.\"\n );\n }\n const SQL = await initSqlJs(\n !hasExplicitWasmResolver\n ? undefined\n : {\n locateFile:\n options.locateFile ?? (() => options.wasmUrl as string)\n }\n );\n const existingBytes = await persistence.loadDatabase(options.databaseName);\n const database = existingBytes\n ? new SQL.Database(existingBytes)\n : new SQL.Database();\n return new SqlJsDriver(\n database,\n persistence,\n options.databaseName,\n (bytes) => (bytes ? new SQL.Database(bytes) : new SQL.Database())\n );\n }\n\n async exec(sql: string): Promise<void> {\n this.ensureOpen();\n this.database.run(sql);\n await this.persistIfNeeded();\n }\n\n async run(sql: string, params: unknown[] = []): Promise<RunResult> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.run(normalizeParams(params));\n const lastInsertRowid = readScalarNumber(\n this.database,\n \"SELECT last_insert_rowid()\"\n );\n const result = {\n changes: this.database.getRowsModified(),\n ...(lastInsertRowid !== null ? { lastInsertRowid } : {})\n };\n await this.persistIfNeeded();\n return result;\n } finally {\n statement.free();\n }\n }\n\n async get<T>(sql: string, params: unknown[] = []): Promise<T | undefined> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.bind(normalizeParams(params));\n if (!statement.step()) {\n return undefined;\n }\n return statement.getAsObject() as T;\n } finally {\n statement.free();\n }\n }\n\n async all<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n this.ensureOpen();\n const statement = this.database.prepare(sql);\n try {\n statement.bind(normalizeParams(params));\n const rows: T[] = [];\n while (statement.step()) {\n rows.push(statement.getAsObject() as T);\n }\n return rows;\n } finally {\n statement.free();\n }\n }\n\n async withTransaction<T>(callback: () => Promise<T>): Promise<T> {\n this.ensureOpen();\n if (this.transactionDepth > 0) {\n return this.withSavepoint(`nested_${this.transactionDepth}`, callback);\n }\n\n this.transactionDepth += 1;\n this.database.run(\"BEGIN IMMEDIATE\");\n try {\n const result = await callback();\n this.database.run(\"COMMIT\");\n await this.persistNow();\n return result;\n } catch (error) {\n this.database.run(\"ROLLBACK\");\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async withSavepoint<T>(name: string, callback: () => Promise<T>): Promise<T> {\n this.ensureOpen();\n const safeName = name.replaceAll(/[^a-zA-Z0-9_]/g, \"_\");\n this.database.run(`SAVEPOINT ${safeName}`);\n this.transactionDepth += 1;\n try {\n const result = await callback();\n this.database.run(`RELEASE SAVEPOINT ${safeName}`);\n return result;\n } catch (error) {\n this.database.run(`ROLLBACK TO SAVEPOINT ${safeName}`);\n this.database.run(`RELEASE SAVEPOINT ${safeName}`);\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n await this.persistNow();\n this.database.close();\n this.closed = true;\n }\n\n async reloadFromPersistence(): Promise<boolean> {\n this.ensureOpen();\n const bytes = await this.persistence.loadDatabase(this.databaseName);\n if (!bytes) {\n return false;\n }\n const nextDatabase = this.createDatabase(bytes);\n const previousDatabase = this.database;\n this.database = nextDatabase;\n previousDatabase.close();\n return true;\n }\n\n createDatabaseFromBytes(bytes?: Uint8Array): SqlJsDatabase {\n return this.createDatabase(bytes);\n }\n\n private async persistIfNeeded(): Promise<void> {\n if (this.transactionDepth === 0) {\n await this.persistNow();\n }\n }\n\n private async persistNow(): Promise<void> {\n this.ensureOpen();\n await this.persistence.saveDatabase(\n this.databaseName,\n this.database.export()\n );\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw new Error(\"The sql.js driver is already closed.\");\n }\n }\n\n replaceDatabase(database: SqlJsDatabase): void {\n this.ensureOpen();\n const previousDatabase = this.database;\n this.database = database;\n previousDatabase.close();\n }\n}\n\nfunction isBrowserLikeRuntime(): boolean {\n const scope = globalThis as typeof globalThis & {\n WorkerGlobalScope?: unknown;\n };\n return typeof window !== \"undefined\" || scope.WorkerGlobalScope !== undefined;\n}\n\nfunction normalizeParams(values: unknown[]): SqlJsValue[] {\n return values.map((value) => {\n if (typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n value instanceof Uint8Array\n ) {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n return JSON.stringify(value);\n });\n}\n\nfunction readScalarNumber(database: SqlJsDatabase, sql: string): number | null {\n const rows = database.exec(sql);\n const firstSet = rows[0];\n const firstRow = firstSet?.values[0];\n const firstValue = firstRow?.[0];\n if (typeof firstValue === \"number\") {\n return firstValue;\n }\n if (typeof firstValue === \"string\") {\n const parsed = Number(firstValue);\n return Number.isNaN(parsed) ? null : parsed;\n }\n return null;\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ //#region src/web-sqljs-wasm.ts
2
+ function resolveDefaultWebSqlJsWasmUrl() {
3
+ return new URL("sql.js/dist/sql-wasm.wasm", import.meta.url).toString();
4
+ }
5
+ //#endregion
6
+ export { resolveDefaultWebSqlJsWasmUrl };
7
+
8
+ //# sourceMappingURL=web-sqljs-wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-sqljs-wasm.js","names":[],"sources":["../src/web-sqljs-wasm.ts"],"sourcesContent":["export function resolveDefaultWebSqlJsWasmUrl(): string {\n return new URL(\"sql.js/dist/sql-wasm.wasm\", import.meta.url).toString();\n}\n"],"mappings":";AAAA,SAAgB,gCAAwC;CACtD,OAAO,IAAI,IAAI,6BAA6B,OAAO,KAAK,GAAG,EAAE,SAAS;AACxE"}
@@ -1,76 +1,103 @@
1
- import { AnySyncoreSchema, FunctionReference, SyncoreClient, SyncoreRuntime, SyncoreWatch } from "../core/index.d.mts";
1
+ import { AttachRuntimeBridgeOptions, AttachedRuntimeBridge, BridgeQueryWatch, SyncoreBridgeClient, SyncoreBridgeMessageEndpoint, SyncoreDataModel } from "../core/index.d.mts";
2
2
 
3
3
  //#region src/worker.d.ts
4
- type WebWorkerSyncoreSchema = AnySyncoreSchema;
5
- interface SyncoreWorkerMessageEndpoint {
6
- postMessage(message: unknown): void;
7
- addEventListener(type: "message", listener: (event: MessageEvent<unknown>) => void): void;
8
- removeEventListener(type: "message", listener: (event: MessageEvent<unknown>) => void): void;
9
- }
10
- type WorkerQueryWatch<TValue> = SyncoreWatch<TValue> & {
11
- dispose(): void;
12
- };
13
- type OptionalArgsTuple<TArgs> = Record<never, never> extends TArgs ? [args?: TArgs] : [args: TArgs];
14
- declare class SyncoreWebWorkerClient implements SyncoreClient {
15
- private readonly endpoint;
16
- private readonly pendingRequests;
17
- private readonly watchRecordsByKey;
18
- private readonly watchKeyBySubscriptionId;
19
- private disposed;
20
- private readonly handleMessage;
21
- constructor(endpoint: SyncoreWorkerMessageEndpoint);
22
- query<TArgs, TResult>(reference: FunctionReference<"query", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): Promise<TResult>;
23
- mutation<TArgs, TResult>(reference: FunctionReference<"mutation", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): Promise<TResult>;
24
- action<TArgs, TResult>(reference: FunctionReference<"action", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): Promise<TResult>;
25
- watchQuery<TArgs, TResult>(reference: FunctionReference<"query", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): WorkerQueryWatch<TResult>;
26
- dispose(): void;
27
- private invoke;
28
- private rejectAllPending;
29
- private ensureNotDisposed;
30
- }
31
- interface AttachWebWorkerRuntimeOptions {
32
- endpoint: SyncoreWorkerMessageEndpoint;
33
- createRuntime: (() => Promise<SyncoreRuntime<WebWorkerSyncoreSchema>>) | (() => SyncoreRuntime<WebWorkerSyncoreSchema>);
34
- }
35
- interface AttachedWebWorkerRuntime {
36
- ready: Promise<void>;
37
- dispose(): Promise<void>;
4
+ /**
5
+ * Schema type constraint for worker-side Syncore runtimes.
6
+ *
7
+ * Pass any schema produced by `defineSchema()` where this type is expected.
8
+ * Defaults to the unconstrained `SyncoreDataModel` when omitted.
9
+ */
10
+ type WebWorkerSyncoreSchema<TSchema extends SyncoreDataModel = SyncoreDataModel> = TSchema;
11
+ /** Message endpoint shape required by the browser worker bridge (alias of `SyncoreBridgeMessageEndpoint`). */
12
+ type SyncoreWorkerMessageEndpoint = SyncoreBridgeMessageEndpoint;
13
+ /** Live-query subscription handle returned by `SyncoreWebWorkerClient.watchQuery`. */
14
+ type WorkerQueryWatch<TValue> = BridgeQueryWatch<TValue>;
15
+ /**
16
+ * Syncore client that communicates with a runtime running in a browser Worker
17
+ * over the `postMessage` bridge.
18
+ *
19
+ * Use `createSyncoreWebWorkerClient()` or `createManagedWebWorkerClient()` to
20
+ * create instances. Prefer the React hooks (`useQuery`, `useMutation`, etc.)
21
+ * over calling this directly in React apps.
22
+ */
23
+ declare class SyncoreWebWorkerClient extends SyncoreBridgeClient {
24
+ query: SyncoreBridgeClient["query"];
25
+ mutation: SyncoreBridgeClient["mutation"];
26
+ action: SyncoreBridgeClient["action"];
27
+ watchQuery: SyncoreBridgeClient["watchQuery"];
38
28
  }
29
+ /** Options for attaching a runtime to a worker bridge endpoint. Alias of `AttachRuntimeBridgeOptions`. */
30
+ type AttachWebWorkerRuntimeOptions<TSchema extends WebWorkerSyncoreSchema = WebWorkerSyncoreSchema> = AttachRuntimeBridgeOptions<TSchema>;
31
+ /** Handle returned by `attachWebWorkerRuntime` for controlling the attached bridge. */
32
+ type AttachedWebWorkerRuntime = AttachedRuntimeBridge;
39
33
  /**
40
- * A worker-backed browser client plus the Worker instance it owns.
34
+ * A browser Worker and its associated Syncore client, bundled for easy
35
+ * lifecycle management.
36
+ *
37
+ * Returned by `createSyncoreWebWorkerClient` and `createManagedWebWorkerClient`.
38
+ * Call `dispose()` to terminate the worker and release its resources.
41
39
  */
42
40
  interface ManagedWebWorkerClient {
41
+ /** The Syncore client connected to the worker. */
43
42
  client: SyncoreWebWorkerClient;
43
+ /** The underlying `Worker` instance. Useful for low-level control. */
44
44
  worker: Worker;
45
+ /** Terminate the worker and dispose the client. Call on app unmount or navigation. */
45
46
  dispose(): void;
46
47
  }
47
48
  /**
48
- * Options for creating a worker-backed Syncore client in the browser.
49
+ * Options for creating a managed worker Syncore client via
50
+ * `createSyncoreWebWorkerClient`.
49
51
  */
50
52
  interface CreateWebWorkerClientProviderOptions {
51
- /** The worker module URL passed to `new Worker(...)`. */
53
+ /** The worker module URL passed to `new Worker(...)`. Typically an `import.meta.url`-relative `URL`. */
52
54
  workerUrl: URL | string;
53
- /** Optional worker type, defaults to `module`. */
55
+ /** Worker module type. Defaults to `"module"` (ESM worker). */
54
56
  workerType?: WorkerOptions["type"];
55
- /** Optional name shown in browser devtools. */
57
+ /** Optional label shown in browser devtools’ Sources panel. */
56
58
  workerName?: string;
57
59
  }
58
60
  /**
59
- * Create a web worker Syncore client from a low-level message endpoint.
61
+ * Create a {@link SyncoreWebWorkerClient} from a low-level message endpoint.
62
+ *
63
+ * Use this when you already have a `Worker` or `MessagePort` reference and
64
+ * want to wrap it manually. For the common case of spawning a new Worker from
65
+ * a URL, use `createSyncoreWebWorkerClient` instead.
60
66
  */
61
67
  declare function createWebWorkerClient(endpoint: SyncoreWorkerMessageEndpoint): SyncoreWebWorkerClient;
62
68
  /**
63
- * Create and manage both a browser Worker and the Syncore client that talks to it.
69
+ * Create a {@link ManagedWebWorkerClient} using a provided Worker factory.
70
+ *
71
+ * Useful when you need control over how the Worker is constructed (e.g. to
72
+ * pass constructor options not exposed by `CreateWebWorkerClientProviderOptions`).
73
+ * For the common URL-based case, use `createSyncoreWebWorkerClient`.
64
74
  */
65
75
  declare function createManagedWebWorkerClient(options: {
66
76
  createWorker: () => Worker;
67
77
  }): ManagedWebWorkerClient;
68
78
  /**
69
- * Create a worker-backed Syncore client using the standard Worker constructor.
79
+ * Create a {@link ManagedWebWorkerClient} by spawning a new Worker from a URL.
80
+ *
81
+ * This is the standard way to create a main-thread client in a browser app.
82
+ * Pass the URL of your `syncore.worker.ts` file (which calls
83
+ * `createWebWorkerRuntime`) and connect the returned `client` to your React
84
+ * `SyncoreProvider` or Svelte context.
85
+ *
86
+ * ```ts
87
+ * // main.ts (or React root)
88
+ * import { createSyncoreWebWorkerClient } from "syncorejs/browser";
89
+ *
90
+ * const { client, dispose } = createSyncoreWebWorkerClient({
91
+ * workerUrl: new URL("./syncore.worker.ts", import.meta.url),
92
+ * });
93
+ * ```
70
94
  */
71
95
  declare function createSyncoreWebWorkerClient(options: CreateWebWorkerClientProviderOptions): ManagedWebWorkerClient;
72
96
  /**
73
- * Attach a Syncore runtime implementation to a worker message endpoint.
97
+ * Wire a Syncore runtime factory to a worker message endpoint.
98
+ *
99
+ * Called internally by `createWebWorkerRuntime`. Exposed for cases where you
100
+ * need to attach a runtime to a custom bridge endpoint (e.g. a `MessagePort`).
74
101
  */
75
102
  declare function attachWebWorkerRuntime(options: AttachWebWorkerRuntimeOptions): AttachedWebWorkerRuntime;
76
103
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","names":[],"sources":["../src/worker.ts"],"mappings":";;;KASY,sBAAA,GAAyB,gBAAA;AAAA,UAEpB,4BAAA;EACf,WAAA,CAAY,OAAA;EACZ,gBAAA,CACE,IAAA,aACA,QAAA,GAAW,KAAA,EAAO,YAAA;EAEpB,mBAAA,CACE,IAAA,aACA,QAAA,GAAW,KAAA,EAAO,YAAA;AAAA;AAAA,KAmFV,gBAAA,WAA2B,YAAA,CAAa,MAAA;EAClD,OAAA;AAAA;AAAA,KAGG,iBAAA,UACH,MAAA,uBAA6B,KAAA,IAAS,IAAA,GAAO,KAAA,KAAU,IAAA,EAAM,KAAA;AAAA,cAElD,sBAAA,YAAkC,aAAA;EAAA,iBAuDhB,QAAA;EAAA,iBAtDZ,eAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,wBAAA;EAAA,QACT,QAAA;EAAA,iBAES,aAAA;cAiDY,QAAA,EAAU,4BAAA;EAIvC,KAAA,gBAAA,CACE,SAAA,EAAW,iBAAA,UAA2B,KAAA,EAAO,OAAA,MAC1C,IAAA,EAAM,iBAAA,CAAkB,KAAA,IAC1B,OAAA,CAAQ,OAAA;EAQX,QAAA,gBAAA,CACE,SAAA,EAAW,iBAAA,aAA8B,KAAA,EAAO,OAAA,MAC7C,IAAA,EAAM,iBAAA,CAAkB,KAAA,IAC1B,OAAA,CAAQ,OAAA;EAQX,MAAA,gBAAA,CACE,SAAA,EAAW,iBAAA,WAA4B,KAAA,EAAO,OAAA,MAC3C,IAAA,EAAM,iBAAA,CAAkB,KAAA,IAC1B,OAAA,CAAQ,OAAA;EAQX,UAAA,gBAAA,CACE,SAAA,EAAW,iBAAA,UAA2B,KAAA,EAAO,OAAA,MAC1C,IAAA,EAAM,iBAAA,CAAkB,KAAA,IAC1B,gBAAA,CAAiB,OAAA;EA8DpB,OAAA,CAAA;EAAA,QAiBQ,MAAA;EAAA,QAqCA,gBAAA;EAAA,QAOA,iBAAA;AAAA;AAAA,UAOO,6BAAA;EACf,QAAA,EAAU,4BAAA;EACV,aAAA,SACW,OAAA,CAAQ,cAAA,CAAe,sBAAA,aACvB,cAAA,CAAe,sBAAA;AAAA;AAAA,UAGX,wBAAA;EACf,KAAA,EAAO,OAAA;EACP,OAAA,IAAW,OAAA;AAAA;AA/OX;;;AAAA,UAqPe,sBAAA;EACf,MAAA,EAAQ,sBAAA;EACR,MAAA,EAAQ,MAAA;EACR,OAAA;AAAA;;;;UAMe,oCAAA;EA3PuB;EA6PtC,SAAA,EAAW,GAAA;EA7P4C;EAgQvD,UAAA,GAAa,aAAA;EAhQqD;EAmQlE,UAAA;AAAA;;;;iBAMc,qBAAA,CACd,QAAA,EAAU,4BAAA,GACT,sBAAA;;;;iBAOa,4BAAA,CAA6B,OAAA;EAC3C,YAAA,QAAoB,MAAA;AAAA,IAClB,sBAAA;;;;iBAgBY,4BAAA,CACd,OAAA,EAAS,oCAAA,GACR,sBAAA;;;;iBAaa,sBAAA,CACd,OAAA,EAAS,6BAAA,GACR,wBAAA"}
1
+ {"version":3,"file":"worker.d.ts","names":[],"sources":["../src/worker.ts"],"mappings":";;;;;AAgBA;;;;KAAY,sBAAA,iBACM,gBAAA,GAAmB,gBAAA,IACjC,OAAA;;KAEQ,4BAAA,GAA+B,4BAA4B;;KAE3D,gBAAA,WAA2B,gBAAgB,CAAC,MAAA;;;;;AAJ7C;AAEX;;;cAYa,sBAAA,SAA+B,mBAAA;EAClC,KAAA,EAAO,mBAAA;EACP,QAAA,EAAU,mBAAA;EACV,MAAA,EAAQ,mBAAA;EACR,UAAA,EAAY,mBAAA;AAAA;;KAIV,6BAAA,iBACM,sBAAA,GAAyB,sBAAA,IACvC,0BAAA,CAA2B,OAAA;;KAEnB,wBAAA,GAA2B,qBAAqB;AAtBE;AAU9D;;;;;;AAV8D,UA+B7C,sBAAA;EArB2B;EAuB1C,MAAA,EAAQ,sBAAA;EAvBqD;EAyB7D,MAAA,EAAQ,MAAM;EAxBN;EA0BR,OAAA;AAAA;;;;;UAOe,oCAAA;EA9BwB;EAgCvC,SAAA,EAAW,GAAA;EA5BD;EA8BV,UAAA,GAAa,aAAa;EA9Ba;EAgCvC,UAAA;AAAA;;;;;;;;iBAUc,qBAAA,CACd,QAAA,EAAU,4BAAA,GACT,sBAAsB;;;AA1Ca;AAEtC;;;;iBAmDgB,4BAAA,CAA6B,OAAA;EAC3C,YAAA,QAAoB,MAAA;AAAA,IAClB,sBAAsB;;;;;;;;;AAtCjB;AAOT;;;;;;;;iBA6DgB,4BAAA,CACd,OAAA,EAAS,oCAAA,GACR,sBAAsB;;AAzDb;AAUZ;;;;iBA+DgB,sBAAA,CACd,OAAA,EAAS,6BAAA,GACR,wBAAwB"}