syncorejs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/README.md +30 -0
  2. package/dist/_vendor/core/_virtual/_rolldown/runtime.mjs +27 -0
  3. package/dist/_vendor/core/cli.d.mts +5 -0
  4. package/dist/_vendor/core/cli.d.mts.map +1 -0
  5. package/dist/_vendor/core/cli.mjs +1196 -0
  6. package/dist/_vendor/core/cli.mjs.map +1 -0
  7. package/dist/_vendor/core/index.d.mts +7 -0
  8. package/dist/_vendor/core/index.mjs +25 -0
  9. package/dist/_vendor/core/index.mjs.map +1 -0
  10. package/dist/_vendor/core/runtime/devtools.d.mts +15 -0
  11. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -0
  12. package/dist/_vendor/core/runtime/devtools.mjs +300 -0
  13. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -0
  14. package/dist/_vendor/core/runtime/functions.d.mts +123 -0
  15. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -0
  16. package/dist/_vendor/core/runtime/functions.mjs +71 -0
  17. package/dist/_vendor/core/runtime/functions.mjs.map +1 -0
  18. package/dist/_vendor/core/runtime/id.d.mts +13 -0
  19. package/dist/_vendor/core/runtime/id.d.mts.map +1 -0
  20. package/dist/_vendor/core/runtime/id.mjs +28 -0
  21. package/dist/_vendor/core/runtime/id.mjs.map +1 -0
  22. package/dist/_vendor/core/runtime/runtime.d.mts +370 -0
  23. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -0
  24. package/dist/_vendor/core/runtime/runtime.mjs +1143 -0
  25. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -0
  26. package/dist/_vendor/devtools-protocol/index.d.ts +230 -0
  27. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -0
  28. package/dist/_vendor/devtools-protocol/index.js +0 -0
  29. package/dist/_vendor/next/config.d.ts +17 -0
  30. package/dist/_vendor/next/config.d.ts.map +1 -0
  31. package/dist/_vendor/next/config.js +73 -0
  32. package/dist/_vendor/next/config.js.map +1 -0
  33. package/dist/_vendor/next/index.d.ts +80 -0
  34. package/dist/_vendor/next/index.d.ts.map +1 -0
  35. package/dist/_vendor/next/index.js +81 -0
  36. package/dist/_vendor/next/index.js.map +1 -0
  37. package/dist/_vendor/platform-expo/index.d.ts +97 -0
  38. package/dist/_vendor/platform-expo/index.d.ts.map +1 -0
  39. package/dist/_vendor/platform-expo/index.js +197 -0
  40. package/dist/_vendor/platform-expo/index.js.map +1 -0
  41. package/dist/_vendor/platform-expo/react.d.ts +26 -0
  42. package/dist/_vendor/platform-expo/react.d.ts.map +1 -0
  43. package/dist/_vendor/platform-expo/react.js +30 -0
  44. package/dist/_vendor/platform-expo/react.js.map +1 -0
  45. package/dist/_vendor/platform-node/index.d.mts +145 -0
  46. package/dist/_vendor/platform-node/index.d.mts.map +1 -0
  47. package/dist/_vendor/platform-node/index.mjs +405 -0
  48. package/dist/_vendor/platform-node/index.mjs.map +1 -0
  49. package/dist/_vendor/platform-node/ipc-react.d.mts +25 -0
  50. package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -0
  51. package/dist/_vendor/platform-node/ipc-react.mjs +21 -0
  52. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -0
  53. package/dist/_vendor/platform-node/ipc.d.mts +75 -0
  54. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -0
  55. package/dist/_vendor/platform-node/ipc.mjs +343 -0
  56. package/dist/_vendor/platform-node/ipc.mjs.map +1 -0
  57. package/dist/_vendor/platform-web/index.d.ts +123 -0
  58. package/dist/_vendor/platform-web/index.d.ts.map +1 -0
  59. package/dist/_vendor/platform-web/index.js +309 -0
  60. package/dist/_vendor/platform-web/index.js.map +1 -0
  61. package/dist/_vendor/platform-web/indexeddb.d.ts +25 -0
  62. package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -0
  63. package/dist/_vendor/platform-web/indexeddb.js +125 -0
  64. package/dist/_vendor/platform-web/indexeddb.js.map +1 -0
  65. package/dist/_vendor/platform-web/opfs.d.ts +27 -0
  66. package/dist/_vendor/platform-web/opfs.d.ts.map +1 -0
  67. package/dist/_vendor/platform-web/opfs.js +146 -0
  68. package/dist/_vendor/platform-web/opfs.js.map +1 -0
  69. package/dist/_vendor/platform-web/persistence.d.ts +27 -0
  70. package/dist/_vendor/platform-web/persistence.d.ts.map +1 -0
  71. package/dist/_vendor/platform-web/persistence.js +23 -0
  72. package/dist/_vendor/platform-web/persistence.js.map +1 -0
  73. package/dist/_vendor/platform-web/react.d.ts +35 -0
  74. package/dist/_vendor/platform-web/react.d.ts.map +1 -0
  75. package/dist/_vendor/platform-web/react.js +42 -0
  76. package/dist/_vendor/platform-web/react.js.map +1 -0
  77. package/dist/_vendor/platform-web/sqljs.js +133 -0
  78. package/dist/_vendor/platform-web/sqljs.js.map +1 -0
  79. package/dist/_vendor/platform-web/worker.d.ts +78 -0
  80. package/dist/_vendor/platform-web/worker.d.ts.map +1 -0
  81. package/dist/_vendor/platform-web/worker.js +307 -0
  82. package/dist/_vendor/platform-web/worker.js.map +1 -0
  83. package/dist/_vendor/react/index.d.ts +58 -0
  84. package/dist/_vendor/react/index.d.ts.map +1 -0
  85. package/dist/_vendor/react/index.js +151 -0
  86. package/dist/_vendor/react/index.js.map +1 -0
  87. package/dist/_vendor/schema/definition.d.ts +98 -0
  88. package/dist/_vendor/schema/definition.d.ts.map +1 -0
  89. package/dist/_vendor/schema/definition.js +84 -0
  90. package/dist/_vendor/schema/definition.js.map +1 -0
  91. package/dist/_vendor/schema/index.d.ts +4 -0
  92. package/dist/_vendor/schema/index.js +4 -0
  93. package/dist/_vendor/schema/planner.d.ts +42 -0
  94. package/dist/_vendor/schema/planner.d.ts.map +1 -0
  95. package/dist/_vendor/schema/planner.js +131 -0
  96. package/dist/_vendor/schema/planner.js.map +1 -0
  97. package/dist/_vendor/schema/validators.d.ts +194 -0
  98. package/dist/_vendor/schema/validators.d.ts.map +1 -0
  99. package/dist/_vendor/schema/validators.js +158 -0
  100. package/dist/_vendor/schema/validators.js.map +1 -0
  101. package/dist/_vendor/svelte/index.d.ts +43 -0
  102. package/dist/_vendor/svelte/index.d.ts.map +1 -0
  103. package/dist/_vendor/svelte/index.js +75 -0
  104. package/dist/_vendor/svelte/index.js.map +1 -0
  105. package/dist/browser-react.d.ts +2 -0
  106. package/dist/browser-react.js +2 -0
  107. package/dist/browser.d.ts +12 -0
  108. package/dist/browser.d.ts.map +1 -0
  109. package/dist/browser.js +10 -0
  110. package/dist/browser.js.map +1 -0
  111. package/dist/cli.d.ts +2 -0
  112. package/dist/cli.js +11 -0
  113. package/dist/cli.js.map +1 -0
  114. package/dist/core/src/cli.d.ts +5 -0
  115. package/dist/core/src/cli.d.ts.map +1 -0
  116. package/dist/core/src/cli.js +1196 -0
  117. package/dist/core/src/cli.js.map +1 -0
  118. package/dist/core/src/index.js +7 -0
  119. package/dist/core/src/runtime/devtools.d.ts +7 -0
  120. package/dist/core/src/runtime/devtools.d.ts.map +1 -0
  121. package/dist/core/src/runtime/devtools.js +300 -0
  122. package/dist/core/src/runtime/devtools.js.map +1 -0
  123. package/dist/core/src/runtime/functions.d.ts +123 -0
  124. package/dist/core/src/runtime/functions.d.ts.map +1 -0
  125. package/dist/core/src/runtime/functions.js +71 -0
  126. package/dist/core/src/runtime/functions.js.map +1 -0
  127. package/dist/core/src/runtime/id.d.ts +13 -0
  128. package/dist/core/src/runtime/id.d.ts.map +1 -0
  129. package/dist/core/src/runtime/id.js +28 -0
  130. package/dist/core/src/runtime/id.js.map +1 -0
  131. package/dist/core/src/runtime/runtime.d.ts +371 -0
  132. package/dist/core/src/runtime/runtime.d.ts.map +1 -0
  133. package/dist/core/src/runtime/runtime.js +1143 -0
  134. package/dist/core/src/runtime/runtime.js.map +1 -0
  135. package/dist/devtools-protocol/src/index.d.ts +201 -0
  136. package/dist/devtools-protocol/src/index.d.ts.map +1 -0
  137. package/dist/expo-react.d.ts +2 -0
  138. package/dist/expo-react.js +2 -0
  139. package/dist/expo.d.ts +2 -0
  140. package/dist/expo.js +2 -0
  141. package/dist/index.d.ts +7 -0
  142. package/dist/index.js +8 -0
  143. package/dist/next/src/config.d.ts +17 -0
  144. package/dist/next/src/config.d.ts.map +1 -0
  145. package/dist/next/src/config.js +73 -0
  146. package/dist/next/src/config.js.map +1 -0
  147. package/dist/next/src/index.d.ts +80 -0
  148. package/dist/next/src/index.d.ts.map +1 -0
  149. package/dist/next/src/index.js +82 -0
  150. package/dist/next/src/index.js.map +1 -0
  151. package/dist/next-config.d.ts +2 -0
  152. package/dist/next-config.js +2 -0
  153. package/dist/next.d.ts +3 -0
  154. package/dist/next.js +3 -0
  155. package/dist/node-ipc-react.d.ts +2 -0
  156. package/dist/node-ipc-react.js +2 -0
  157. package/dist/node-ipc.d.ts +2 -0
  158. package/dist/node-ipc.js +2 -0
  159. package/dist/node.d.ts +4 -0
  160. package/dist/node.js +3 -0
  161. package/dist/platform-expo/src/index.d.ts +96 -0
  162. package/dist/platform-expo/src/index.d.ts.map +1 -0
  163. package/dist/platform-expo/src/index.js +198 -0
  164. package/dist/platform-expo/src/index.js.map +1 -0
  165. package/dist/platform-expo/src/react.d.ts +26 -0
  166. package/dist/platform-expo/src/react.d.ts.map +1 -0
  167. package/dist/platform-expo/src/react.js +30 -0
  168. package/dist/platform-expo/src/react.js.map +1 -0
  169. package/dist/platform-node/src/index.d.ts +145 -0
  170. package/dist/platform-node/src/index.d.ts.map +1 -0
  171. package/dist/platform-node/src/index.js +407 -0
  172. package/dist/platform-node/src/index.js.map +1 -0
  173. package/dist/platform-node/src/ipc-react.d.ts +25 -0
  174. package/dist/platform-node/src/ipc-react.d.ts.map +1 -0
  175. package/dist/platform-node/src/ipc-react.js +21 -0
  176. package/dist/platform-node/src/ipc-react.js.map +1 -0
  177. package/dist/platform-node/src/ipc.d.ts +76 -0
  178. package/dist/platform-node/src/ipc.d.ts.map +1 -0
  179. package/dist/platform-node/src/ipc.js +344 -0
  180. package/dist/platform-node/src/ipc.js.map +1 -0
  181. package/dist/platform-web/src/index.d.ts +106 -0
  182. package/dist/platform-web/src/index.d.ts.map +1 -0
  183. package/dist/platform-web/src/index.js +311 -0
  184. package/dist/platform-web/src/index.js.map +1 -0
  185. package/dist/platform-web/src/indexeddb.js +125 -0
  186. package/dist/platform-web/src/indexeddb.js.map +1 -0
  187. package/dist/platform-web/src/opfs.js +146 -0
  188. package/dist/platform-web/src/opfs.js.map +1 -0
  189. package/dist/platform-web/src/persistence.d.ts +20 -0
  190. package/dist/platform-web/src/persistence.d.ts.map +1 -0
  191. package/dist/platform-web/src/persistence.js +23 -0
  192. package/dist/platform-web/src/persistence.js.map +1 -0
  193. package/dist/platform-web/src/react.d.ts +35 -0
  194. package/dist/platform-web/src/react.d.ts.map +1 -0
  195. package/dist/platform-web/src/react.js +42 -0
  196. package/dist/platform-web/src/react.js.map +1 -0
  197. package/dist/platform-web/src/sqljs.js +133 -0
  198. package/dist/platform-web/src/sqljs.js.map +1 -0
  199. package/dist/platform-web/src/worker.d.ts +79 -0
  200. package/dist/platform-web/src/worker.d.ts.map +1 -0
  201. package/dist/platform-web/src/worker.js +308 -0
  202. package/dist/platform-web/src/worker.js.map +1 -0
  203. package/dist/react/src/index.d.ts +59 -0
  204. package/dist/react/src/index.d.ts.map +1 -0
  205. package/dist/react/src/index.js +151 -0
  206. package/dist/react/src/index.js.map +1 -0
  207. package/dist/react.d.ts +2 -0
  208. package/dist/react.js +2 -0
  209. package/dist/schema/src/definition.d.ts +98 -0
  210. package/dist/schema/src/definition.d.ts.map +1 -0
  211. package/dist/schema/src/definition.js +84 -0
  212. package/dist/schema/src/definition.js.map +1 -0
  213. package/dist/schema/src/planner.d.ts +42 -0
  214. package/dist/schema/src/planner.d.ts.map +1 -0
  215. package/dist/schema/src/planner.js +131 -0
  216. package/dist/schema/src/planner.js.map +1 -0
  217. package/dist/schema/src/validators.d.ts +194 -0
  218. package/dist/schema/src/validators.d.ts.map +1 -0
  219. package/dist/schema/src/validators.js +158 -0
  220. package/dist/schema/src/validators.js.map +1 -0
  221. package/dist/svelte/src/index.d.ts +44 -0
  222. package/dist/svelte/src/index.d.ts.map +1 -0
  223. package/dist/svelte/src/index.js +75 -0
  224. package/dist/svelte/src/index.js.map +1 -0
  225. package/dist/svelte.d.ts +2 -0
  226. package/dist/svelte.js +2 -0
  227. package/package.json +152 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-react.js","names":[],"sources":["../../../../platform-node/src/ipc-react.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\r\nimport type { ReactNode } from \"react\";\r\nimport { SyncoreProvider } from \"@syncore/react\";\r\nimport { createRendererSyncoreWindowClient } from \"./ipc.js\";\r\n\r\n/**\r\n * Props for {@link SyncoreElectronProvider}.\r\n */\r\nexport interface SyncoreElectronProviderProps {\r\n /** The React subtree that should receive the renderer Syncore client. */\r\n children: ReactNode;\r\n\r\n /** Optional custom bridge name exposed on `window`. */\r\n bridgeName?: string;\r\n\r\n /** Optional window-like object for tests or custom shells. */\r\n windowObject?: Window & typeof globalThis;\r\n}\r\n\r\n/**\r\n * Create a renderer Syncore client from `window.syncoreBridge` and provide it to React.\r\n */\r\nexport function SyncoreElectronProvider({\r\n children,\r\n bridgeName,\r\n windowObject\r\n}: SyncoreElectronProviderProps): ReactNode {\r\n const resolvedWindow = windowObject ?? window;\r\n const client = useMemo(\r\n () =>\r\n createRendererSyncoreWindowClient(\r\n resolvedWindow,\r\n bridgeName ?? \"syncoreBridge\"\r\n ),\r\n [bridgeName, resolvedWindow]\r\n );\r\n\r\n useEffect(() => () => client.dispose(), [client]);\r\n\r\n return <SyncoreProvider client={client}>{children}</SyncoreProvider>;\r\n}\r\n"],"mappings":";;;;;;;;AAsBA,SAAgB,wBAAwB,EACtC,UACA,YACA,gBAC0C;CAC1C,MAAM,iBAAiB,gBAAgB;CACvC,MAAM,SAAS,cAEX,kCACE,gBACA,cAAc,gBACf,EACH,CAAC,YAAY,eAAe,CAC7B;AAED,uBAAsB,OAAO,SAAS,EAAE,CAAC,OAAO,CAAC;AAEjD,QAAO,oBAAC,iBAAD;EAAyB;EAAS;EAA2B,CAAA"}
@@ -0,0 +1,76 @@
1
+ import { FunctionReference } from "../../core/src/runtime/functions.js";
2
+ import { AnySyncoreSchema, SyncoreClient, SyncoreRuntime, SyncoreWatch } from "../../core/src/runtime/runtime.js";
3
+
4
+ //#region ../platform-node/src/ipc.d.ts
5
+ type NodeIpcSyncoreSchema = AnySyncoreSchema;
6
+ interface SyncoreIpcMessageEndpoint {
7
+ postMessage(message: unknown): void;
8
+ addEventListener(type: "message", listener: (event: MessageEvent<unknown>) => void): void;
9
+ removeEventListener(type: "message", listener: (event: MessageEvent<unknown>) => void): void;
10
+ }
11
+ type RendererQueryWatch<TValue> = SyncoreWatch<TValue> & {
12
+ dispose(): void;
13
+ };
14
+ type OptionalArgsTuple<TArgs> = Record<never, never> extends TArgs ? [args?: TArgs] : [args: TArgs];
15
+ declare class SyncoreRendererClient implements SyncoreClient {
16
+ private readonly endpoint;
17
+ private readonly pendingRequests;
18
+ private readonly watchRecordsByKey;
19
+ private readonly watchKeyBySubscriptionId;
20
+ private disposed;
21
+ private readonly handleMessage;
22
+ constructor(endpoint: SyncoreIpcMessageEndpoint);
23
+ query<TArgs, TResult>(reference: FunctionReference<"query", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): Promise<TResult>;
24
+ mutation<TArgs, TResult>(reference: FunctionReference<"mutation", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): Promise<TResult>;
25
+ action<TArgs, TResult>(reference: FunctionReference<"action", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): Promise<TResult>;
26
+ watchQuery<TArgs, TResult>(reference: FunctionReference<"query", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): RendererQueryWatch<TResult>;
27
+ dispose(): void;
28
+ private invoke;
29
+ private rejectAllPending;
30
+ private ensureNotDisposed;
31
+ }
32
+ interface AttachNodeIpcRuntimeOptions {
33
+ endpoint: SyncoreIpcMessageEndpoint;
34
+ createRuntime: (() => Promise<SyncoreRuntime<NodeIpcSyncoreSchema>>) | (() => SyncoreRuntime<NodeIpcSyncoreSchema>);
35
+ }
36
+ interface SyncoreRendererBridge {
37
+ postMessage(message: unknown): void;
38
+ onMessage(listener: (message: unknown) => void): () => void;
39
+ }
40
+ interface SyncoreWindowBridge {
41
+ postMessage(message: unknown): void;
42
+ onMessage(listener: (message: unknown) => void): () => void;
43
+ }
44
+ interface SyncoreMainProcessBridge {
45
+ postMessage(message: unknown): void;
46
+ onMessage(listener: (message: unknown) => void): () => void;
47
+ }
48
+ /**
49
+ * Install the default Electron preload bridge used by Syncore renderer helpers.
50
+ */
51
+ declare function installSyncoreWindowBridge(options?: {
52
+ bridgeName?: string;
53
+ }): string;
54
+ interface AttachedNodeIpcRuntime {
55
+ ready: Promise<void>;
56
+ dispose(): Promise<void>;
57
+ }
58
+ /**
59
+ * Create a renderer client from a low-level IPC message endpoint.
60
+ */
61
+ declare function createRendererSyncoreClient(endpoint: SyncoreIpcMessageEndpoint): SyncoreRendererClient;
62
+ /**
63
+ * Create a renderer client from a bridge object exposed by preload code.
64
+ */
65
+ declare function createRendererSyncoreBridgeClient(bridge: SyncoreRendererBridge): SyncoreRendererClient;
66
+ /**
67
+ * Create a renderer client from `window.syncoreBridge` or another named bridge.
68
+ */
69
+ declare function createRendererSyncoreWindowClient(windowObject: Window & typeof globalThis, bridgeName?: string): SyncoreRendererClient;
70
+ declare function createNodeIpcMessageEndpoint(bridge: SyncoreMainProcessBridge): SyncoreIpcMessageEndpoint & {
71
+ dispose(): void;
72
+ };
73
+ declare function attachNodeIpcRuntime(options: AttachNodeIpcRuntimeOptions): AttachedNodeIpcRuntime;
74
+ //#endregion
75
+ export { AttachNodeIpcRuntimeOptions, AttachedNodeIpcRuntime, NodeIpcSyncoreSchema, RendererQueryWatch, SyncoreIpcMessageEndpoint, SyncoreMainProcessBridge, SyncoreRendererBridge, SyncoreRendererClient, SyncoreWindowBridge, attachNodeIpcRuntime, createNodeIpcMessageEndpoint, createRendererSyncoreBridgeClient, createRendererSyncoreClient, createRendererSyncoreWindowClient, installSyncoreWindowBridge };
76
+ //# sourceMappingURL=ipc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.d.ts","names":[],"sources":["../../../../platform-node/src/ipc.ts"],"mappings":";;;;KAUY,oBAAA,GAAuB,gBAAA;AAAA,UAElB,yBAAA;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,kBAAA,WAA6B,YAAA,CAAa,MAAA;EACpD,OAAA;AAAA;AAAA,KAGG,iBAAA,UACH,MAAA,uBAA6B,KAAA,IAAS,IAAA,GAAO,KAAA,KAAU,IAAA,EAAM,KAAA;AAAA,cAElD,qBAAA,YAAiC,aAAA;EAAA,iBAuDf,QAAA;EAAA,iBAtDZ,eAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,wBAAA;EAAA,QACT,QAAA;EAAA,iBAES,aAAA;cAiDY,QAAA,EAAU,yBAAA;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,kBAAA,CAAmB,OAAA;EA8DtB,OAAA,CAAA;EAAA,QAiBQ,MAAA;EAAA,QA2CA,gBAAA;EAAA,QAOA,iBAAA;AAAA;AAAA,UAOO,2BAAA;EACf,QAAA,EAAU,yBAAA;EACV,aAAA,SACW,OAAA,CAAQ,cAAA,CAAe,oBAAA,aACvB,cAAA,CAAe,oBAAA;AAAA;AAAA,UAGX,qBAAA;EACf,WAAA,CAAY,OAAA;EACZ,SAAA,CAAU,QAAA,GAAW,OAAA;AAAA;AAAA,UAGN,mBAAA;EACf,WAAA,CAAY,OAAA;EACZ,SAAA,CAAU,QAAA,GAAW,OAAA;AAAA;AAAA,UAGN,wBAAA;EACf,WAAA,CAAY,OAAA;EACZ,SAAA,CAAU,QAAA,GAAW,OAAA;AAAA;;;;iBAMP,0BAAA,CAA2B,OAAA;EACzC,UAAA;AAAA;AAAA,UAKe,sBAAA;EACf,KAAA,EAAO,OAAA;EACP,OAAA,IAAW,OAAA;AAAA;;AAxQb;;iBA8QgB,2BAAA,CACd,QAAA,EAAU,yBAAA,GACT,qBAAA;;;;iBAOa,iCAAA,CACd,MAAA,EAAQ,qBAAA,GACP,qBAAA;;;;iBA4Ba,iCAAA,CACd,YAAA,EAAc,MAAA,UAAgB,UAAA,EAC9B,UAAA,YACC,qBAAA;AAAA,iBAqBa,4BAAA,CACd,MAAA,EAAQ,wBAAA,GACP,yBAAA;EAA8B,OAAA;AAAA;AAAA,iBA+BjB,oBAAA,CACd,OAAA,EAAS,2BAAA,GACR,sBAAA"}
@@ -0,0 +1,344 @@
1
+ import { generateId } from "../../core/src/runtime/id.js";
2
+ import "../../core/src/index.js";
3
+ //#region ../platform-node/src/ipc.ts
4
+ var SyncoreRendererClient = class {
5
+ pendingRequests = /* @__PURE__ */ new Map();
6
+ watchRecordsByKey = /* @__PURE__ */ new Map();
7
+ watchKeyBySubscriptionId = /* @__PURE__ */ new Map();
8
+ disposed = false;
9
+ handleMessage = (event) => {
10
+ const message = event.data;
11
+ if (!message || typeof message !== "object" || !("type" in message)) return;
12
+ switch (message.type) {
13
+ case "runtime.ready": return;
14
+ case "runtime.error":
15
+ this.rejectAllPending(new Error(message.error));
16
+ return;
17
+ case "invoke.result": {
18
+ const pending = this.pendingRequests.get(message.requestId);
19
+ if (!pending) return;
20
+ this.pendingRequests.delete(message.requestId);
21
+ if (message.success) pending.resolve(message.value);
22
+ else pending.reject(new Error(message.error));
23
+ return;
24
+ }
25
+ case "watch.update": {
26
+ const watchKey = this.watchKeyBySubscriptionId.get(message.subscriptionId);
27
+ if (!watchKey) return;
28
+ const watchRecord = this.watchRecordsByKey.get(watchKey);
29
+ if (!watchRecord) return;
30
+ if (message.success) {
31
+ watchRecord.result = message.value;
32
+ watchRecord.error = void 0;
33
+ } else watchRecord.error = new Error(message.error);
34
+ for (const listener of watchRecord.listeners) listener();
35
+ }
36
+ }
37
+ };
38
+ constructor(endpoint) {
39
+ this.endpoint = endpoint;
40
+ this.endpoint.addEventListener("message", this.handleMessage);
41
+ }
42
+ query(reference, ...args) {
43
+ return this.invoke("query", reference, normalizeOptionalArgs(args));
44
+ }
45
+ mutation(reference, ...args) {
46
+ return this.invoke("mutation", reference, normalizeOptionalArgs(args));
47
+ }
48
+ action(reference, ...args) {
49
+ return this.invoke("action", reference, normalizeOptionalArgs(args));
50
+ }
51
+ watchQuery(reference, ...args) {
52
+ this.ensureNotDisposed();
53
+ const normalizedArgs = normalizeOptionalArgs(args);
54
+ const watchKey = createWatchKey(reference, normalizedArgs);
55
+ let watchRecord = this.watchRecordsByKey.get(watchKey);
56
+ if (!watchRecord) {
57
+ watchRecord = {
58
+ subscriptionId: generateId(),
59
+ listeners: /* @__PURE__ */ new Set(),
60
+ consumers: 0,
61
+ result: void 0,
62
+ error: void 0
63
+ };
64
+ this.watchRecordsByKey.set(watchKey, watchRecord);
65
+ this.watchKeyBySubscriptionId.set(watchRecord.subscriptionId, watchKey);
66
+ this.endpoint.postMessage({
67
+ type: "watch.subscribe",
68
+ subscriptionId: watchRecord.subscriptionId,
69
+ reference,
70
+ args: normalizedArgs
71
+ });
72
+ }
73
+ watchRecord.consumers += 1;
74
+ let disposed = false;
75
+ const ownedListeners = /* @__PURE__ */ new Set();
76
+ return {
77
+ onUpdate: (callback) => {
78
+ watchRecord.listeners.add(callback);
79
+ ownedListeners.add(callback);
80
+ queueMicrotask(callback);
81
+ return () => {
82
+ watchRecord.listeners.delete(callback);
83
+ ownedListeners.delete(callback);
84
+ };
85
+ },
86
+ localQueryResult: () => watchRecord.result,
87
+ localQueryError: () => watchRecord.error,
88
+ dispose: () => {
89
+ if (disposed) return;
90
+ disposed = true;
91
+ for (const callback of ownedListeners) watchRecord.listeners.delete(callback);
92
+ ownedListeners.clear();
93
+ watchRecord.consumers = Math.max(0, watchRecord.consumers - 1);
94
+ if (watchRecord.consumers > 0) return;
95
+ this.endpoint.postMessage({
96
+ type: "watch.unsubscribe",
97
+ subscriptionId: watchRecord.subscriptionId
98
+ });
99
+ this.watchKeyBySubscriptionId.delete(watchRecord.subscriptionId);
100
+ this.watchRecordsByKey.delete(watchKey);
101
+ }
102
+ };
103
+ }
104
+ dispose() {
105
+ if (this.disposed) return;
106
+ this.disposed = true;
107
+ this.endpoint.removeEventListener("message", this.handleMessage);
108
+ for (const watchRecord of this.watchRecordsByKey.values()) this.endpoint.postMessage({
109
+ type: "watch.unsubscribe",
110
+ subscriptionId: watchRecord.subscriptionId
111
+ });
112
+ this.watchKeyBySubscriptionId.clear();
113
+ this.watchRecordsByKey.clear();
114
+ this.rejectAllPending(/* @__PURE__ */ new Error("Syncore renderer client was disposed."));
115
+ }
116
+ invoke(kind, reference, args) {
117
+ this.ensureNotDisposed();
118
+ const requestId = generateId();
119
+ const promise = new Promise((resolve, reject) => {
120
+ this.pendingRequests.set(requestId, {
121
+ resolve,
122
+ reject
123
+ });
124
+ });
125
+ switch (kind) {
126
+ case "query":
127
+ case "mutation":
128
+ case "action":
129
+ this.endpoint.postMessage(createInvokeRequest(requestId, kind, reference, args));
130
+ break;
131
+ }
132
+ return promise;
133
+ }
134
+ rejectAllPending(error) {
135
+ for (const pending of this.pendingRequests.values()) pending.reject(error);
136
+ this.pendingRequests.clear();
137
+ }
138
+ ensureNotDisposed() {
139
+ if (this.disposed) throw new Error("Syncore renderer client was disposed.");
140
+ }
141
+ };
142
+ /**
143
+ * Install the default Electron preload bridge used by Syncore renderer helpers.
144
+ */
145
+ function installSyncoreWindowBridge(options) {
146
+ return `(function(){const bridgeName=${JSON.stringify(options?.bridgeName ?? "syncoreBridge")};const {contextBridge,ipcRenderer}=require("electron");const channel="syncore:message";const listeners=new Map();contextBridge.exposeInMainWorld(bridgeName,{postMessage(message){ipcRenderer.send(channel,message);},onMessage(listener){const wrapped=(_event,payload)=>{listener(payload);};listeners.set(listener,wrapped);ipcRenderer.on(channel,wrapped);return()=>{ipcRenderer.off(channel,wrapped);listeners.delete(listener);};}});})();`;
147
+ }
148
+ /**
149
+ * Create a renderer client from a low-level IPC message endpoint.
150
+ */
151
+ function createRendererSyncoreClient(endpoint) {
152
+ return new SyncoreRendererClient(endpoint);
153
+ }
154
+ /**
155
+ * Create a renderer client from a bridge object exposed by preload code.
156
+ */
157
+ function createRendererSyncoreBridgeClient(bridge) {
158
+ const listeners = /* @__PURE__ */ new Map();
159
+ return createRendererSyncoreClient({
160
+ postMessage(message) {
161
+ bridge.postMessage(message);
162
+ },
163
+ addEventListener(_type, listener) {
164
+ listeners.set(listener, bridge.onMessage((message) => {
165
+ listener({ data: message });
166
+ }));
167
+ },
168
+ removeEventListener(_type, listener) {
169
+ listeners.get(listener)?.();
170
+ listeners.delete(listener);
171
+ }
172
+ });
173
+ }
174
+ /**
175
+ * Create a renderer client from `window.syncoreBridge` or another named bridge.
176
+ */
177
+ function createRendererSyncoreWindowClient(windowObject, bridgeName = "syncoreBridge") {
178
+ const bridge = windowObject[bridgeName];
179
+ if (!bridge || typeof bridge !== "object") throw new Error(`Missing window.${bridgeName} bridge.`);
180
+ const candidate = bridge;
181
+ if (typeof candidate.postMessage !== "function" || typeof candidate.onMessage !== "function") throw new Error(`window.${bridgeName} must expose postMessage() and onMessage().`);
182
+ return createRendererSyncoreBridgeClient(candidate);
183
+ }
184
+ function createNodeIpcMessageEndpoint(bridge) {
185
+ const listeners = /* @__PURE__ */ new Map();
186
+ return {
187
+ postMessage(message) {
188
+ bridge.postMessage(message);
189
+ },
190
+ addEventListener(_type, listener) {
191
+ listeners.set(listener, bridge.onMessage((message) => {
192
+ listener({ data: message });
193
+ }));
194
+ },
195
+ removeEventListener(_type, listener) {
196
+ listeners.get(listener)?.();
197
+ listeners.delete(listener);
198
+ },
199
+ dispose() {
200
+ for (const dispose of listeners.values()) dispose();
201
+ listeners.clear();
202
+ }
203
+ };
204
+ }
205
+ function attachNodeIpcRuntime(options) {
206
+ const subscriptions = /* @__PURE__ */ new Map();
207
+ const runtimePromise = Promise.resolve(options.createRuntime()).then(async (runtime) => {
208
+ await runtime.start();
209
+ return runtime;
210
+ });
211
+ const clientPromise = runtimePromise.then((runtime) => runtime.createClient());
212
+ const ready = clientPromise.then(() => {
213
+ options.endpoint.postMessage({ type: "runtime.ready" });
214
+ }).catch((error) => {
215
+ options.endpoint.postMessage({
216
+ type: "runtime.error",
217
+ error: error instanceof Error ? error.message : String(error)
218
+ });
219
+ throw error;
220
+ });
221
+ const handleMessage = (event) => {
222
+ (async () => {
223
+ const message = event.data;
224
+ if (!message || typeof message !== "object" || !("type" in message)) return;
225
+ try {
226
+ const client = await clientPromise;
227
+ switch (message.type) {
228
+ case "invoke": {
229
+ const value = message.kind === "query" ? await client.query(message.reference, message.args) : message.kind === "mutation" ? await client.mutation(message.reference, message.args) : await client.action(message.reference, message.args);
230
+ options.endpoint.postMessage({
231
+ type: "invoke.result",
232
+ requestId: message.requestId,
233
+ success: true,
234
+ value
235
+ });
236
+ return;
237
+ }
238
+ case "watch.subscribe": {
239
+ if (subscriptions.has(message.subscriptionId)) return;
240
+ const watch = client.watchQuery(message.reference, message.args);
241
+ const sendCurrentState = () => {
242
+ const error = watch.localQueryError();
243
+ if (error) {
244
+ options.endpoint.postMessage({
245
+ type: "watch.update",
246
+ subscriptionId: message.subscriptionId,
247
+ success: false,
248
+ error: error.message
249
+ });
250
+ return;
251
+ }
252
+ options.endpoint.postMessage({
253
+ type: "watch.update",
254
+ subscriptionId: message.subscriptionId,
255
+ success: true,
256
+ value: watch.localQueryResult()
257
+ });
258
+ };
259
+ const unsubscribe = watch.onUpdate(sendCurrentState);
260
+ subscriptions.set(message.subscriptionId, {
261
+ watch,
262
+ unsubscribe
263
+ });
264
+ sendCurrentState();
265
+ return;
266
+ }
267
+ case "watch.unsubscribe": {
268
+ const subscription = subscriptions.get(message.subscriptionId);
269
+ if (!subscription) return;
270
+ subscription.unsubscribe();
271
+ subscriptions.delete(message.subscriptionId);
272
+ }
273
+ }
274
+ } catch (error) {
275
+ const errorMessage = error instanceof Error ? error.message : String(error);
276
+ if (message.type === "invoke") options.endpoint.postMessage({
277
+ type: "invoke.result",
278
+ requestId: message.requestId,
279
+ success: false,
280
+ error: errorMessage
281
+ });
282
+ if (message.type === "watch.subscribe") options.endpoint.postMessage({
283
+ type: "watch.update",
284
+ subscriptionId: message.subscriptionId,
285
+ success: false,
286
+ error: errorMessage
287
+ });
288
+ }
289
+ })();
290
+ };
291
+ options.endpoint.addEventListener("message", handleMessage);
292
+ return {
293
+ ready,
294
+ async dispose() {
295
+ options.endpoint.removeEventListener("message", handleMessage);
296
+ for (const subscription of subscriptions.values()) subscription.unsubscribe();
297
+ subscriptions.clear();
298
+ await (await runtimePromise).stop();
299
+ }
300
+ };
301
+ }
302
+ function createInvokeRequest(requestId, kind, reference, args) {
303
+ switch (kind) {
304
+ case "query": return {
305
+ type: "invoke",
306
+ requestId,
307
+ kind,
308
+ reference,
309
+ args
310
+ };
311
+ case "mutation": return {
312
+ type: "invoke",
313
+ requestId,
314
+ kind,
315
+ reference,
316
+ args
317
+ };
318
+ case "action": return {
319
+ type: "invoke",
320
+ requestId,
321
+ kind,
322
+ reference,
323
+ args
324
+ };
325
+ }
326
+ }
327
+ function createWatchKey(reference, args) {
328
+ return `${reference.name}:${stableStringify(args)}`;
329
+ }
330
+ function normalizeOptionalArgs(args) {
331
+ return args[0] ?? {};
332
+ }
333
+ function stableStringify(value) {
334
+ return JSON.stringify(sortValue(value));
335
+ }
336
+ function sortValue(value) {
337
+ if (Array.isArray(value)) return value.map(sortValue);
338
+ if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, nested]) => [key, sortValue(nested)]));
339
+ return value;
340
+ }
341
+ //#endregion
342
+ export { SyncoreRendererClient, attachNodeIpcRuntime, createNodeIpcMessageEndpoint, createRendererSyncoreBridgeClient, createRendererSyncoreClient, createRendererSyncoreWindowClient, installSyncoreWindowBridge };
343
+
344
+ //# sourceMappingURL=ipc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.js","names":[],"sources":["../../../../platform-node/src/ipc.ts"],"sourcesContent":["import {\n generateId,\n type AnySyncoreSchema,\n type FunctionReference,\n type JsonObject,\n type SyncoreClient,\n type SyncoreRuntime,\n type SyncoreWatch\n} from \"@syncore/core\";\n\nexport type NodeIpcSyncoreSchema = AnySyncoreSchema;\n\nexport interface SyncoreIpcMessageEndpoint {\n postMessage(message: unknown): void;\n addEventListener(\n type: \"message\",\n listener: (event: MessageEvent<unknown>) => void\n ): void;\n removeEventListener(\n type: \"message\",\n listener: (event: MessageEvent<unknown>) => void\n ): void;\n}\n\ntype SyncoreIpcRequest =\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"query\";\n reference: FunctionReference<\"query\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"mutation\";\n reference: FunctionReference<\"mutation\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"action\";\n reference: FunctionReference<\"action\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"watch.subscribe\";\n subscriptionId: string;\n reference: FunctionReference<\"query\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"watch.unsubscribe\";\n subscriptionId: string;\n };\n\ntype SyncoreIpcResponse =\n | {\n type: \"runtime.ready\";\n }\n | {\n type: \"runtime.error\";\n error: string;\n }\n | {\n type: \"invoke.result\";\n requestId: string;\n success: true;\n value: unknown;\n }\n | {\n type: \"invoke.result\";\n requestId: string;\n success: false;\n error: string;\n }\n | {\n type: \"watch.update\";\n subscriptionId: string;\n success: true;\n value: unknown;\n }\n | {\n type: \"watch.update\";\n subscriptionId: string;\n success: false;\n error: string;\n };\n\ninterface PendingRequest {\n resolve(value: unknown): void;\n reject(error: Error): void;\n}\n\ninterface WatchRecord {\n subscriptionId: string;\n listeners: Set<() => void>;\n consumers: number;\n result: unknown;\n error: Error | undefined;\n}\n\nexport type RendererQueryWatch<TValue> = SyncoreWatch<TValue> & {\n dispose(): void;\n};\n\ntype OptionalArgsTuple<TArgs> =\n Record<never, never> extends TArgs ? [args?: TArgs] : [args: TArgs];\n\nexport class SyncoreRendererClient implements SyncoreClient {\n private readonly pendingRequests = new Map<string, PendingRequest>();\n private readonly watchRecordsByKey = new Map<string, WatchRecord>();\n private readonly watchKeyBySubscriptionId = new Map<string, string>();\n private disposed = false;\n\n private readonly handleMessage = (event: MessageEvent<unknown>) => {\n const message = event.data as SyncoreIpcResponse;\n if (!message || typeof message !== \"object\" || !(\"type\" in message)) {\n return;\n }\n\n switch (message.type) {\n case \"runtime.ready\":\n return;\n case \"runtime.error\":\n this.rejectAllPending(new Error(message.error));\n return;\n case \"invoke.result\": {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) {\n return;\n }\n this.pendingRequests.delete(message.requestId);\n if (message.success) {\n pending.resolve(message.value);\n } else {\n pending.reject(new Error(message.error));\n }\n return;\n }\n case \"watch.update\": {\n const watchKey = this.watchKeyBySubscriptionId.get(\n message.subscriptionId\n );\n if (!watchKey) {\n return;\n }\n const watchRecord = this.watchRecordsByKey.get(watchKey);\n if (!watchRecord) {\n return;\n }\n if (message.success) {\n watchRecord.result = message.value;\n watchRecord.error = undefined;\n } else {\n watchRecord.error = new Error(message.error);\n }\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n }\n };\n\n constructor(private readonly endpoint: SyncoreIpcMessageEndpoint) {\n this.endpoint.addEventListener(\"message\", this.handleMessage);\n }\n\n query<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\n \"query\",\n reference,\n normalizeOptionalArgs(args) as JsonObject\n );\n }\n\n mutation<TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\n \"mutation\",\n reference,\n normalizeOptionalArgs(args) as JsonObject\n );\n }\n\n action<TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\n \"action\",\n reference,\n normalizeOptionalArgs(args) as JsonObject\n );\n }\n\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): RendererQueryWatch<TResult> {\n this.ensureNotDisposed();\n const normalizedArgs = normalizeOptionalArgs(args) as JsonObject;\n const watchKey = createWatchKey(reference, normalizedArgs);\n let watchRecord = this.watchRecordsByKey.get(watchKey);\n if (!watchRecord) {\n watchRecord = {\n subscriptionId: generateId(),\n listeners: new Set<() => void>(),\n consumers: 0,\n result: undefined,\n error: undefined\n };\n this.watchRecordsByKey.set(watchKey, watchRecord);\n this.watchKeyBySubscriptionId.set(watchRecord.subscriptionId, watchKey);\n this.endpoint.postMessage({\n type: \"watch.subscribe\",\n subscriptionId: watchRecord.subscriptionId,\n reference,\n args: normalizedArgs\n } satisfies SyncoreIpcRequest);\n }\n\n watchRecord.consumers += 1;\n let disposed = false;\n const ownedListeners = new Set<() => void>();\n\n return {\n onUpdate: (callback) => {\n watchRecord.listeners.add(callback);\n ownedListeners.add(callback);\n queueMicrotask(callback);\n return () => {\n watchRecord.listeners.delete(callback);\n ownedListeners.delete(callback);\n };\n },\n localQueryResult: () => watchRecord.result as TResult | undefined,\n localQueryError: () => watchRecord.error,\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n for (const callback of ownedListeners) {\n watchRecord.listeners.delete(callback);\n }\n ownedListeners.clear();\n watchRecord.consumers = Math.max(0, watchRecord.consumers - 1);\n if (watchRecord.consumers > 0) {\n return;\n }\n this.endpoint.postMessage({\n type: \"watch.unsubscribe\",\n subscriptionId: watchRecord.subscriptionId\n } satisfies SyncoreIpcRequest);\n this.watchKeyBySubscriptionId.delete(watchRecord.subscriptionId);\n this.watchRecordsByKey.delete(watchKey);\n }\n };\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.endpoint.removeEventListener(\"message\", this.handleMessage);\n for (const watchRecord of this.watchRecordsByKey.values()) {\n this.endpoint.postMessage({\n type: \"watch.unsubscribe\",\n subscriptionId: watchRecord.subscriptionId\n } satisfies SyncoreIpcRequest);\n }\n this.watchKeyBySubscriptionId.clear();\n this.watchRecordsByKey.clear();\n this.rejectAllPending(new Error(\"Syncore renderer client was disposed.\"));\n }\n\n private invoke<TArgs, TResult>(\n kind: \"query\",\n reference: FunctionReference<\"query\", TArgs, TResult>,\n args: JsonObject\n ): Promise<TResult>;\n private invoke<TArgs, TResult>(\n kind: \"mutation\",\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n args: JsonObject\n ): Promise<TResult>;\n private invoke<TArgs, TResult>(\n kind: \"action\",\n reference: FunctionReference<\"action\", TArgs, TResult>,\n args: JsonObject\n ): Promise<TResult>;\n private invoke<TArgs, TResult>(\n kind: \"query\" | \"mutation\" | \"action\",\n reference: FunctionReference<\n \"query\" | \"mutation\" | \"action\",\n TArgs,\n TResult\n >,\n args: JsonObject\n ): Promise<TResult> {\n this.ensureNotDisposed();\n const requestId = generateId();\n const promise = new Promise<TResult>((resolve, reject) => {\n this.pendingRequests.set(requestId, { resolve, reject });\n });\n\n switch (kind) {\n case \"query\":\n case \"mutation\":\n case \"action\":\n this.endpoint.postMessage(\n createInvokeRequest(requestId, kind, reference, args)\n );\n break;\n }\n\n return promise;\n }\n\n private rejectAllPending(error: Error): void {\n for (const pending of this.pendingRequests.values()) {\n pending.reject(error);\n }\n this.pendingRequests.clear();\n }\n\n private ensureNotDisposed(): void {\n if (this.disposed) {\n throw new Error(\"Syncore renderer client was disposed.\");\n }\n }\n}\n\nexport interface AttachNodeIpcRuntimeOptions {\n endpoint: SyncoreIpcMessageEndpoint;\n createRuntime:\n | (() => Promise<SyncoreRuntime<NodeIpcSyncoreSchema>>)\n | (() => SyncoreRuntime<NodeIpcSyncoreSchema>);\n}\n\nexport interface SyncoreRendererBridge {\n postMessage(message: unknown): void;\n onMessage(listener: (message: unknown) => void): () => void;\n}\n\nexport interface SyncoreWindowBridge {\n postMessage(message: unknown): void;\n onMessage(listener: (message: unknown) => void): () => void;\n}\n\nexport interface SyncoreMainProcessBridge {\n postMessage(message: unknown): void;\n onMessage(listener: (message: unknown) => void): () => void;\n}\n\n/**\n * Install the default Electron preload bridge used by Syncore renderer helpers.\n */\nexport function installSyncoreWindowBridge(options?: {\n bridgeName?: string;\n}): string {\n return `(function(){const bridgeName=${JSON.stringify(options?.bridgeName ?? \"syncoreBridge\")};const {contextBridge,ipcRenderer}=require(\"electron\");const channel=\"syncore:message\";const listeners=new Map();contextBridge.exposeInMainWorld(bridgeName,{postMessage(message){ipcRenderer.send(channel,message);},onMessage(listener){const wrapped=(_event,payload)=>{listener(payload);};listeners.set(listener,wrapped);ipcRenderer.on(channel,wrapped);return()=>{ipcRenderer.off(channel,wrapped);listeners.delete(listener);};}});})();`;\n}\n\nexport interface AttachedNodeIpcRuntime {\n ready: Promise<void>;\n dispose(): Promise<void>;\n}\n\n/**\n * Create a renderer client from a low-level IPC message endpoint.\n */\nexport function createRendererSyncoreClient(\n endpoint: SyncoreIpcMessageEndpoint\n): SyncoreRendererClient {\n return new SyncoreRendererClient(endpoint);\n}\n\n/**\n * Create a renderer client from a bridge object exposed by preload code.\n */\nexport function createRendererSyncoreBridgeClient(\n bridge: SyncoreRendererBridge\n): SyncoreRendererClient {\n const listeners = new Map<\n (event: MessageEvent<unknown>) => void,\n () => void\n >();\n\n return createRendererSyncoreClient({\n postMessage(message) {\n bridge.postMessage(message);\n },\n addEventListener(_type, listener) {\n listeners.set(\n listener,\n bridge.onMessage((message) => {\n listener({ data: message } as MessageEvent<unknown>);\n })\n );\n },\n removeEventListener(_type, listener) {\n listeners.get(listener)?.();\n listeners.delete(listener);\n }\n });\n}\n\n/**\n * Create a renderer client from `window.syncoreBridge` or another named bridge.\n */\nexport function createRendererSyncoreWindowClient(\n windowObject: Window & typeof globalThis,\n bridgeName = \"syncoreBridge\"\n): SyncoreRendererClient {\n const bridge = (\n windowObject as typeof windowObject & Record<string, unknown>\n )[bridgeName];\n if (!bridge || typeof bridge !== \"object\") {\n throw new Error(`Missing window.${bridgeName} bridge.`);\n }\n\n const candidate = bridge as SyncoreWindowBridge;\n if (\n typeof candidate.postMessage !== \"function\" ||\n typeof candidate.onMessage !== \"function\"\n ) {\n throw new Error(\n `window.${bridgeName} must expose postMessage() and onMessage().`\n );\n }\n\n return createRendererSyncoreBridgeClient(candidate);\n}\n\nexport function createNodeIpcMessageEndpoint(\n bridge: SyncoreMainProcessBridge\n): SyncoreIpcMessageEndpoint & { dispose(): void } {\n const listeners = new Map<\n (event: MessageEvent<unknown>) => void,\n () => void\n >();\n\n return {\n postMessage(message) {\n bridge.postMessage(message);\n },\n addEventListener(_type, listener) {\n listeners.set(\n listener,\n bridge.onMessage((message) => {\n listener({ data: message } as MessageEvent<unknown>);\n })\n );\n },\n removeEventListener(_type, listener) {\n listeners.get(listener)?.();\n listeners.delete(listener);\n },\n dispose() {\n for (const dispose of listeners.values()) {\n dispose();\n }\n listeners.clear();\n }\n };\n}\n\nexport function attachNodeIpcRuntime(\n options: AttachNodeIpcRuntimeOptions\n): AttachedNodeIpcRuntime {\n const subscriptions = new Map<\n string,\n {\n watch: SyncoreWatch<unknown>;\n unsubscribe: () => void;\n }\n >();\n\n const runtimePromise = Promise.resolve(options.createRuntime()).then(\n async (runtime) => {\n await runtime.start();\n return runtime;\n }\n );\n\n const clientPromise = runtimePromise.then((runtime) =>\n runtime.createClient()\n );\n\n const ready = clientPromise\n .then(() => {\n options.endpoint.postMessage({\n type: \"runtime.ready\"\n } satisfies SyncoreIpcResponse);\n })\n .catch((error) => {\n options.endpoint.postMessage({\n type: \"runtime.error\",\n error: error instanceof Error ? error.message : String(error)\n } satisfies SyncoreIpcResponse);\n throw error;\n });\n\n const handleMessage = (event: MessageEvent<unknown>) => {\n void (async () => {\n const message = event.data as SyncoreIpcRequest;\n if (!message || typeof message !== \"object\" || !(\"type\" in message)) {\n return;\n }\n\n try {\n const client = await clientPromise;\n switch (message.type) {\n case \"invoke\": {\n const value =\n message.kind === \"query\"\n ? await client.query(message.reference, message.args)\n : message.kind === \"mutation\"\n ? await client.mutation(message.reference, message.args)\n : await client.action(message.reference, message.args);\n options.endpoint.postMessage({\n type: \"invoke.result\",\n requestId: message.requestId,\n success: true,\n value\n } satisfies SyncoreIpcResponse);\n return;\n }\n case \"watch.subscribe\": {\n if (subscriptions.has(message.subscriptionId)) {\n return;\n }\n const watch = client.watchQuery(message.reference, message.args);\n const sendCurrentState = () => {\n const error = watch.localQueryError();\n if (error) {\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: false,\n error: error.message\n } satisfies SyncoreIpcResponse);\n return;\n }\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: true,\n value: watch.localQueryResult()\n } satisfies SyncoreIpcResponse);\n };\n const unsubscribe = watch.onUpdate(sendCurrentState);\n subscriptions.set(message.subscriptionId, { watch, unsubscribe });\n sendCurrentState();\n return;\n }\n case \"watch.unsubscribe\": {\n const subscription = subscriptions.get(message.subscriptionId);\n if (!subscription) {\n return;\n }\n subscription.unsubscribe();\n subscriptions.delete(message.subscriptionId);\n }\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (message.type === \"invoke\") {\n options.endpoint.postMessage({\n type: \"invoke.result\",\n requestId: message.requestId,\n success: false,\n error: errorMessage\n } satisfies SyncoreIpcResponse);\n }\n if (message.type === \"watch.subscribe\") {\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: false,\n error: errorMessage\n } satisfies SyncoreIpcResponse);\n }\n }\n })();\n };\n\n options.endpoint.addEventListener(\"message\", handleMessage);\n\n return {\n ready,\n async dispose() {\n options.endpoint.removeEventListener(\"message\", handleMessage);\n for (const subscription of subscriptions.values()) {\n subscription.unsubscribe();\n }\n subscriptions.clear();\n const runtime = await runtimePromise;\n await runtime.stop();\n }\n };\n}\n\nfunction createInvokeRequest(\n requestId: string,\n kind: \"query\" | \"mutation\" | \"action\",\n reference:\n | FunctionReference<\"query\", unknown, unknown>\n | FunctionReference<\"mutation\", unknown, unknown>\n | FunctionReference<\"action\", unknown, unknown>,\n args: JsonObject\n): SyncoreIpcRequest {\n switch (kind) {\n case \"query\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"query\">,\n args\n };\n case \"mutation\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"mutation\">,\n args\n };\n case \"action\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"action\">,\n args\n };\n }\n}\n\nfunction createWatchKey(\n reference: FunctionReference<\"query\", unknown, unknown>,\n args: JsonObject\n): string {\n return `${reference.name}:${stableStringify(args)}`;\n}\n\nfunction normalizeOptionalArgs<TArgs>(\n args: [] | [TArgs] | readonly unknown[]\n): TArgs {\n return (args[0] ?? {}) as TArgs;\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortValue);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, sortValue(nested)])\n );\n }\n return value;\n}\n"],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { AnySyncoreSchema, DevtoolsSink, SchedulerOptions, StorageObject, StorageWriteInput, SyncoreCapabilities, SyncoreClient, SyncoreExperimentalPlugin, SyncoreRuntime, SyncoreRuntimeOptions, SyncoreStorageAdapter } from "../../core/src/runtime/runtime.js";
2
+ import { AttachWebWorkerRuntimeOptions, AttachedWebWorkerRuntime, CreateWebWorkerClientProviderOptions, ManagedWebWorkerClient, SyncoreWebWorkerClient, SyncoreWorkerMessageEndpoint, WebWorkerSyncoreSchema, WorkerQueryWatch, attachWebWorkerRuntime, createManagedWebWorkerClient, createSyncoreWebWorkerClient, createWebWorkerClient } from "./worker.js";
3
+ import { StoredWebFile, SyncoreWebPersistence, WebPersistenceMode } from "./persistence.js";
4
+
5
+ //#region ../platform-web/src/index.d.ts
6
+ type WebSyncoreSchema = AnySyncoreSchema;
7
+ type BrowserSyncoreSchema = WebSyncoreSchema;
8
+ /**
9
+ * Options for constructing a browser Syncore runtime.
10
+ *
11
+ * Use this when you want to host the full runtime in a browser tab or worker.
12
+ */
13
+ interface CreateWebRuntimeOptions {
14
+ /** The schema for the local Syncore app. */
15
+ schema: WebSyncoreSchema;
16
+ /** The generated function registry for the local Syncore app. */
17
+ functions: SyncoreRuntimeOptions<WebSyncoreSchema>["functions"];
18
+ /** Optional platform capabilities exposed to function handlers. */
19
+ capabilities?: SyncoreCapabilities;
20
+ /** Optional custom SQL driver. Defaults to SQL.js with local persistence. */
21
+ driver?: SyncoreRuntimeOptions<WebSyncoreSchema>["driver"];
22
+ /** Optional custom file/blob storage adapter. */
23
+ storage?: SyncoreStorageAdapter;
24
+ /** Optional experimental plugins for runtime hooks. */
25
+ experimentalPlugins?: Array<SyncoreExperimentalPlugin<WebSyncoreSchema>>;
26
+ /** Optional explicit persistence implementation. */
27
+ persistence?: SyncoreWebPersistence;
28
+ /** Which browser persistence mode to use when Syncore creates one for you. */
29
+ persistenceMode?: WebPersistenceMode;
30
+ /** Logical database name for SQL.js and local storage namespaces. */
31
+ databaseName?: string;
32
+ /** Optional IndexedDB database name for persistence metadata. */
33
+ persistenceDatabaseName?: string;
34
+ /** Optional OPFS directory name for persistent files. */
35
+ opfsRootDirectoryName?: string;
36
+ /** Optional namespace for file/blob storage. */
37
+ storageNamespace?: string;
38
+ /** Optional direct wasm URL for SQL.js. */
39
+ wasmUrl?: string;
40
+ /** Optional callback for resolving SQL.js support files. */
41
+ locateFile?: (fileName: string) => string;
42
+ /** Optional runtime platform label shown in devtools snapshots. */
43
+ platform?: string;
44
+ /** Optional devtools sink used during development. */
45
+ devtools?: DevtoolsSink | false;
46
+ /** Optional scheduler configuration for jobs and recurring work. */
47
+ scheduler?: SchedulerOptions;
48
+ }
49
+ /**
50
+ * Options for hosting a Syncore runtime inside a browser Worker.
51
+ */
52
+ interface CreateWebWorkerRuntimeOptions extends CreateWebRuntimeOptions {
53
+ /** The message endpoint exposed by the current worker global. */
54
+ endpoint: SyncoreWorkerMessageEndpoint;
55
+ }
56
+ /**
57
+ * Options for constructing a browser Syncore runtime.
58
+ */
59
+ type CreateBrowserRuntimeOptions = CreateWebRuntimeOptions;
60
+ /**
61
+ * Options for hosting a Syncore runtime inside a browser Worker.
62
+ */
63
+ type CreateBrowserWorkerRuntimeOptions = CreateWebWorkerRuntimeOptions;
64
+ /**
65
+ * Create a full Syncore runtime directly in the browser.
66
+ *
67
+ * Most React apps should use a worker runtime instead so queries and SQLite work
68
+ * stay off the main thread.
69
+ */
70
+ declare function createWebSyncoreRuntime(options: CreateWebRuntimeOptions): Promise<SyncoreRuntime<WebSyncoreSchema>>;
71
+ /**
72
+ * Attach a Syncore runtime to a browser Worker endpoint.
73
+ */
74
+ declare function createWebWorkerRuntime(options: CreateWebWorkerRuntimeOptions): AttachedWebWorkerRuntime;
75
+ /**
76
+ * Attach a Syncore runtime to a browser Worker endpoint.
77
+ */
78
+ declare function createBrowserWorkerRuntime(options: CreateBrowserWorkerRuntimeOptions): AttachedWebWorkerRuntime;
79
+ /**
80
+ * Create a client directly from a browser Syncore runtime.
81
+ */
82
+ declare function createWebSyncoreClient(runtime: SyncoreRuntime<WebSyncoreSchema>): SyncoreClient;
83
+ /**
84
+ * Create a full Syncore runtime directly in the browser.
85
+ */
86
+ declare function createBrowserSyncoreRuntime(options: CreateBrowserRuntimeOptions): Promise<SyncoreRuntime<AnySyncoreSchema>>;
87
+ /**
88
+ * Create a client directly from a browser Syncore runtime.
89
+ */
90
+ declare function createBrowserSyncoreClient(runtime: SyncoreRuntime<BrowserSyncoreSchema>): SyncoreClient;
91
+ /**
92
+ * Browser file/blob storage built on top of Syncore web persistence.
93
+ */
94
+ declare class BrowserFileStorageAdapter implements SyncoreStorageAdapter {
95
+ private readonly persistence;
96
+ private readonly namespace;
97
+ constructor(persistence: SyncoreWebPersistence, namespace: string);
98
+ put(id: string, input: StorageWriteInput): Promise<StorageObject>;
99
+ get(id: string): Promise<StorageObject | null>;
100
+ read(id: string): Promise<Uint8Array | null>;
101
+ delete(id: string): Promise<void>;
102
+ list(): Promise<StorageObject[]>;
103
+ }
104
+ //#endregion
105
+ export { BrowserFileStorageAdapter, BrowserSyncoreSchema, CreateBrowserRuntimeOptions, CreateBrowserWorkerRuntimeOptions, createBrowserSyncoreClient, createBrowserSyncoreRuntime, createBrowserWorkerRuntime, createWebSyncoreClient, createWebSyncoreRuntime, createWebWorkerRuntime };
106
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../platform-web/src/index.ts"],"mappings":";;;;;KAkCY,gBAAA,GAAmB,gBAAA;AAAA,KACnB,oBAAA,GAAuB,gBAAA;AAAnC;;;;;AAAA,UAOiB,uBAAA;EAAuB;EAEtC,MAAA,EAAQ,gBAAA;EAAA;EAGR,SAAA,EAAW,qBAAA,CAAsB,gBAAA;EAAtB;EAGX,YAAA,GAAe,mBAAA;EAGgB;EAA/B,MAAA,GAAS,qBAAA,CAAsB,gBAAA;EAGrB;EAAV,OAAA,GAAU,qBAAA;EAGkB;EAA5B,mBAAA,GAAsB,KAAA,CAAM,yBAAA,CAA0B,gBAAA;EAGxC;EAAd,WAAA,GAAc,qBAAA;EA2BH;EAxBX,eAAA,GAAkB,kBAAA;EA2BU;EAxB5B,YAAA;EAxBA;EA2BA,uBAAA;EAxBA;EA2BA,qBAAA;EA3BiC;EA8BjC,gBAAA;EA3Be;EA8Bf,OAAA;EA3BS;EA8BT,UAAA,IAAc,QAAA;EA3Bd;EA8BA,QAAA;EA3BA;EA8BA,QAAA,GAAW,YAAA;EA9BiB;EAiC5B,SAAA,GAAY,gBAAA;AAAA;;;;UAMG,6BAAA,SAAsC,uBAAA;EA3BrD;EA6BA,QAAA,EAAU,4BAAA;AAAA;;;;KAMA,2BAAA,GAA8B,uBAAA;;;;KAK9B,iCAAA,GAAoC,6BAAA;;;AAbhD;;;;iBAqBsB,uBAAA,CACpB,OAAA,EAAS,uBAAA,GACR,OAAA,CAAQ,cAAA,CAAe,gBAAA;;;;iBAiFV,sBAAA,CAAuB,OAAA,EAAS,6BAAA,GAA6B,wBAAA;AAhG7E;;;AAAA,iBA0GgB,0BAAA,CACd,OAAA,EAAS,iCAAA,GAAiC,wBAAA;;AAtG5C;;iBA8GgB,sBAAA,CACd,OAAA,EAAS,cAAA,CAAe,gBAAA,IAAD,aAAA;;;AAvGzB;iBA+GgB,2BAAA,CACd,OAAA,EAAS,2BAAA,GAA2B,OAAA,CAAA,cAAA,CAAA,gBAAA;;;;iBAQtB,0BAAA,CACd,OAAA,EAAS,cAAA,CAAe,oBAAA,IAAD,aAAA;;;;cAoQZ,yBAAA,YAAqC,qBAAA;EAAA,iBAE7B,WAAA;EAAA,iBACA,SAAA;cADA,WAAA,EAAa,qBAAA,EACb,SAAA;EAGb,GAAA,CAAI,EAAA,UAAY,KAAA,EAAO,iBAAA,GAAoB,OAAA,CAAQ,aAAA;EAgBnD,GAAA,CAAI,EAAA,WAAa,OAAA,CAAQ,aAAA;EAazB,IAAA,CAAK,EAAA,WAAa,OAAA,CAAQ,UAAA;EAK1B,MAAA,CAAO,EAAA,WAAa,OAAA;EAIpB,IAAA,CAAA,GAAQ,OAAA,CAAQ,aAAA;AAAA"}