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,145 @@
1
+ import { SyncoreDevtoolsEvent, SyncoreDevtoolsSnapshot } from "../../devtools-protocol/src/index.js";
2
+ import { AnySyncoreSchema, DevtoolsSink, SchedulerOptions, StorageObject, StorageWriteInput, SyncoreCapabilities, SyncoreClient, SyncoreExperimentalPlugin, SyncoreRuntime, SyncoreRuntimeOptions, SyncoreSqlDriver, SyncoreStorageAdapter } from "../../core/src/runtime/runtime.js";
3
+ import { DevtoolsRequestHandler } from "../../core/src/runtime/devtools.js";
4
+ import { AttachNodeIpcRuntimeOptions, AttachedNodeIpcRuntime, NodeIpcSyncoreSchema, RendererQueryWatch, SyncoreIpcMessageEndpoint, SyncoreMainProcessBridge, SyncoreRendererBridge, SyncoreRendererClient, SyncoreWindowBridge, attachNodeIpcRuntime, createNodeIpcMessageEndpoint, createRendererSyncoreBridgeClient, createRendererSyncoreClient, createRendererSyncoreWindowClient, installSyncoreWindowBridge } from "./ipc.js";
5
+
6
+ //#region ../platform-node/src/index.d.ts
7
+ type NodeSyncoreSchema = AnySyncoreSchema;
8
+ declare class NodeSqliteDriver implements SyncoreSqlDriver {
9
+ private readonly database;
10
+ private transactionDepth;
11
+ constructor(filename: string);
12
+ exec(sql: string): Promise<void>;
13
+ run(sql: string, params?: unknown[]): Promise<{
14
+ changes: number;
15
+ lastInsertRowid?: number | string;
16
+ }>;
17
+ get<T>(sql: string, params?: unknown[]): Promise<T | undefined>;
18
+ all<T>(sql: string, params?: unknown[]): Promise<T[]>;
19
+ withTransaction<T>(callback: () => Promise<T>): Promise<T>;
20
+ withSavepoint<T>(name: string, callback: () => Promise<T>): Promise<T>;
21
+ close(): Promise<void>;
22
+ }
23
+ declare class NodeFileStorageAdapter implements SyncoreStorageAdapter {
24
+ private readonly directory;
25
+ constructor(directory: string);
26
+ private filePath;
27
+ put(id: string, input: StorageWriteInput): Promise<StorageObject>;
28
+ get(id: string): Promise<StorageObject | null>;
29
+ read(id: string): Promise<Uint8Array | null>;
30
+ delete(id: string): Promise<void>;
31
+ list(): Promise<StorageObject[]>;
32
+ }
33
+ interface CreateNodeRuntimeOptions {
34
+ databasePath: string;
35
+ storageDirectory: string;
36
+ schema: NodeSyncoreSchema;
37
+ functions: SyncoreRuntimeOptions<NodeSyncoreSchema>["functions"];
38
+ capabilities?: SyncoreCapabilities;
39
+ experimentalPlugins?: Array<SyncoreExperimentalPlugin<NodeSyncoreSchema>>;
40
+ appName?: string;
41
+ origin?: string;
42
+ sessionLabel?: string;
43
+ platform?: string;
44
+ devtools?: DevtoolsSink | false;
45
+ devtoolsUrl?: string;
46
+ scheduler?: SchedulerOptions;
47
+ }
48
+ /**
49
+ * Options for creating a managed Node Syncore client.
50
+ */
51
+ type WithNodeSyncoreClientOptions = CreateNodeRuntimeOptions;
52
+ /**
53
+ * A started local Node runtime paired with its client and a dispose helper.
54
+ */
55
+ interface ManagedNodeSyncoreClient {
56
+ runtime: SyncoreRuntime<NodeSyncoreSchema>;
57
+ client: ReturnType<SyncoreRuntime<NodeSyncoreSchema>["createClient"]>;
58
+ dispose(): Promise<void>;
59
+ }
60
+ interface SyncoreElectronIpcBinding {
61
+ ready: Promise<void>;
62
+ dispose(): Promise<void>;
63
+ }
64
+ interface SyncoreElectronBridgeWindow {
65
+ isDestroyed(): boolean;
66
+ webContents: {
67
+ send(channel: string, message: unknown): void;
68
+ };
69
+ }
70
+ interface CreateElectronSyncoreBridgeOptions {
71
+ window: SyncoreElectronBridgeWindow;
72
+ onRendererMessage(listener: (message: unknown) => void): () => void;
73
+ channel?: string;
74
+ }
75
+ /**
76
+ * The subset of Electron's `ipcMain` used by Syncore's main-process helper.
77
+ */
78
+ interface SyncoreElectronIpcMain {
79
+ on(channel: string, listener: (event: unknown, message: unknown) => void): void;
80
+ off(channel: string, listener: (event: unknown, message: unknown) => void): void;
81
+ }
82
+ interface CreateSyncoreRendererWindowClientOptions {
83
+ bridgeName?: string;
84
+ }
85
+ /**
86
+ * Create a Node or Electron runtime backed by SQLite and local file storage.
87
+ */
88
+ declare function createNodeSyncoreRuntime(options: CreateNodeRuntimeOptions): SyncoreRuntime<NodeSyncoreSchema>;
89
+ /**
90
+ * Create a same-process Syncore client from a started Node runtime.
91
+ */
92
+ declare function createNodeSyncoreClient(runtime: SyncoreRuntime<NodeSyncoreSchema>): SyncoreClient;
93
+ /**
94
+ * Start a Node Syncore runtime and return its client together with a dispose helper.
95
+ */
96
+ declare function createManagedNodeSyncoreClient(options: WithNodeSyncoreClientOptions): Promise<ManagedNodeSyncoreClient>;
97
+ /**
98
+ * Run a callback with a started local Node Syncore client and always stop the runtime.
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * await withNodeSyncoreClient(options, async (client) => {
103
+ * console.log(await client.query(api.tasks.list));
104
+ * });
105
+ * ```
106
+ */
107
+ declare function withNodeSyncoreClient<TResult>(options: WithNodeSyncoreClientOptions, callback: (client: ReturnType<SyncoreRuntime<NodeSyncoreSchema>["createClient"]>, runtime: SyncoreRuntime<NodeSyncoreSchema>) => Promise<TResult> | TResult): Promise<TResult>;
108
+ /**
109
+ * Create the default Electron main-process bridge used to connect a BrowserWindow
110
+ * to a Syncore runtime.
111
+ */
112
+ declare function createElectronSyncoreBridge(options: CreateElectronSyncoreBridgeOptions): SyncoreIpcMessageEndpoint & {
113
+ dispose(): void;
114
+ };
115
+ /**
116
+ * Bind a BrowserWindow to a Syncore runtime with the default Electron IPC transport.
117
+ */
118
+ declare function bindElectronWindowToSyncoreRuntime(options: {
119
+ runtime: SyncoreRuntime<NodeSyncoreSchema>;
120
+ window: SyncoreElectronBridgeWindow;
121
+ onRendererMessage(listener: (message: unknown) => void): () => void;
122
+ channel?: string;
123
+ }): SyncoreElectronIpcBinding;
124
+ declare function bindElectronWindowToSyncoreRuntime(options: {
125
+ runtime: SyncoreRuntime<NodeSyncoreSchema>;
126
+ window: SyncoreElectronBridgeWindow;
127
+ ipcMain: SyncoreElectronIpcMain;
128
+ channel?: string;
129
+ }): SyncoreElectronIpcBinding;
130
+ interface NodeWebSocketDevtoolsSinkOptions {
131
+ url: string;
132
+ reconnectDelayMs?: number;
133
+ appName?: string;
134
+ origin?: string;
135
+ sessionLabel?: string;
136
+ }
137
+ interface NodeWebSocketDevtoolsSink extends DevtoolsSink {
138
+ attachRuntime(getSnapshot: () => SyncoreDevtoolsSnapshot): void;
139
+ attachRequestHandler(handler: DevtoolsRequestHandler): void;
140
+ dispose(): void;
141
+ }
142
+ declare function createNodeWebSocketDevtoolsSink(options: NodeWebSocketDevtoolsSinkOptions): NodeWebSocketDevtoolsSink;
143
+ //#endregion
144
+ export { CreateElectronSyncoreBridgeOptions, CreateNodeRuntimeOptions, CreateSyncoreRendererWindowClientOptions, ManagedNodeSyncoreClient, NodeFileStorageAdapter, NodeSqliteDriver, NodeSyncoreSchema, NodeWebSocketDevtoolsSink, NodeWebSocketDevtoolsSinkOptions, SyncoreElectronBridgeWindow, SyncoreElectronIpcBinding, SyncoreElectronIpcMain, WithNodeSyncoreClientOptions, bindElectronWindowToSyncoreRuntime, createElectronSyncoreBridge, createManagedNodeSyncoreClient, createNodeSyncoreClient, createNodeSyncoreRuntime, createNodeWebSocketDevtoolsSink, withNodeSyncoreClient };
145
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../platform-node/src/index.ts"],"mappings":"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"}
@@ -0,0 +1,407 @@
1
+ import { SyncoreRuntime } from "../../core/src/runtime/runtime.js";
2
+ import { createDevtoolsRequestHandler } from "../../core/src/runtime/devtools.js";
3
+ import "../../core/src/index.js";
4
+ import { attachNodeIpcRuntime, createNodeIpcMessageEndpoint } from "./ipc.js";
5
+ import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
6
+ import path from "node:path";
7
+ import { DatabaseSync } from "node:sqlite";
8
+ import WebSocket from "ws";
9
+ //#region ../platform-node/src/index.ts
10
+ function normalizeData(input) {
11
+ if (typeof input === "string") return Buffer.from(input);
12
+ if (input instanceof Uint8Array) return input;
13
+ return new Uint8Array(input);
14
+ }
15
+ function toSqlParameters(params) {
16
+ return params;
17
+ }
18
+ var NodeSqliteDriver = class {
19
+ database;
20
+ transactionDepth = 0;
21
+ constructor(filename) {
22
+ this.database = new DatabaseSync(filename);
23
+ this.database.exec("PRAGMA foreign_keys = ON;");
24
+ this.database.exec("PRAGMA journal_mode = WAL;");
25
+ }
26
+ async exec(sql) {
27
+ this.database.exec(sql);
28
+ }
29
+ async run(sql, params = []) {
30
+ const result = this.database.prepare(sql).run(...toSqlParameters(params));
31
+ return {
32
+ changes: Number(result.changes ?? 0),
33
+ lastInsertRowid: typeof result.lastInsertRowid === "bigint" ? Number(result.lastInsertRowid) : result.lastInsertRowid
34
+ };
35
+ }
36
+ async get(sql, params = []) {
37
+ return this.database.prepare(sql).get(...toSqlParameters(params));
38
+ }
39
+ async all(sql, params = []) {
40
+ return this.database.prepare(sql).all(...toSqlParameters(params));
41
+ }
42
+ async withTransaction(callback) {
43
+ if (this.transactionDepth > 0) return this.withSavepoint(`nested_${this.transactionDepth}`, callback);
44
+ this.transactionDepth += 1;
45
+ this.database.exec("BEGIN");
46
+ try {
47
+ const result = await callback();
48
+ this.database.exec("COMMIT");
49
+ return result;
50
+ } catch (error) {
51
+ this.database.exec("ROLLBACK");
52
+ throw error;
53
+ } finally {
54
+ this.transactionDepth -= 1;
55
+ }
56
+ }
57
+ async withSavepoint(name, callback) {
58
+ const safeName = name.replaceAll(/[^a-zA-Z0-9_]/g, "_");
59
+ this.database.exec(`SAVEPOINT ${safeName}`);
60
+ try {
61
+ const result = await callback();
62
+ this.database.exec(`RELEASE SAVEPOINT ${safeName}`);
63
+ return result;
64
+ } catch (error) {
65
+ this.database.exec(`ROLLBACK TO SAVEPOINT ${safeName}`);
66
+ this.database.exec(`RELEASE SAVEPOINT ${safeName}`);
67
+ throw error;
68
+ }
69
+ }
70
+ async close() {
71
+ this.database.close();
72
+ }
73
+ };
74
+ var NodeFileStorageAdapter = class {
75
+ constructor(directory) {
76
+ this.directory = directory;
77
+ }
78
+ filePath(id) {
79
+ return path.join(this.directory, id);
80
+ }
81
+ async put(id, input) {
82
+ await mkdir(this.directory, { recursive: true });
83
+ const filePath = this.filePath(id);
84
+ const bytes = normalizeData(input.data);
85
+ await writeFile(filePath, bytes);
86
+ return {
87
+ id,
88
+ path: filePath,
89
+ size: bytes.byteLength,
90
+ contentType: input.contentType ?? null
91
+ };
92
+ }
93
+ async get(id) {
94
+ const filePath = this.filePath(id);
95
+ try {
96
+ return {
97
+ id,
98
+ path: filePath,
99
+ size: (await stat(filePath)).size,
100
+ contentType: null
101
+ };
102
+ } catch {
103
+ return null;
104
+ }
105
+ }
106
+ async read(id) {
107
+ try {
108
+ return await readFile(this.filePath(id));
109
+ } catch {
110
+ return null;
111
+ }
112
+ }
113
+ async delete(id) {
114
+ await rm(this.filePath(id), { force: true });
115
+ }
116
+ async list() {
117
+ try {
118
+ const entries = await readdir(this.directory, { withFileTypes: true });
119
+ return await Promise.all(entries.filter((entry) => entry.isFile()).map(async (entry) => {
120
+ const filePath = this.filePath(entry.name);
121
+ const info = await stat(filePath);
122
+ return {
123
+ id: entry.name,
124
+ path: filePath,
125
+ size: info.size,
126
+ contentType: null
127
+ };
128
+ }));
129
+ } catch {
130
+ return [];
131
+ }
132
+ }
133
+ };
134
+ /**
135
+ * Create a Node or Electron runtime backed by SQLite and local file storage.
136
+ */
137
+ function createNodeSyncoreRuntime(options) {
138
+ const resolvedDevtoolsUrl = options.devtoolsUrl ?? resolveDefaultNodeDevtoolsUrl();
139
+ const websocketDevtools = options.devtools === void 0 && resolvedDevtoolsUrl && shouldAutoConnectNodeDevtools() ? createNodeWebSocketDevtoolsSink({
140
+ url: resolvedDevtoolsUrl,
141
+ ...options.appName ? { appName: options.appName } : {},
142
+ ...options.origin ? { origin: options.origin } : {},
143
+ ...options.sessionLabel ? { sessionLabel: options.sessionLabel } : {}
144
+ }) : void 0;
145
+ const runtimeOptions = {
146
+ schema: options.schema,
147
+ functions: options.functions,
148
+ driver: new NodeSqliteDriver(options.databasePath),
149
+ storage: new NodeFileStorageAdapter(options.storageDirectory),
150
+ platform: options.platform ?? "node"
151
+ };
152
+ if (options.capabilities) runtimeOptions.capabilities = options.capabilities;
153
+ if (options.experimentalPlugins) runtimeOptions.experimentalPlugins = options.experimentalPlugins;
154
+ const resolvedDevtools = options.devtools === false ? void 0 : options.devtools ?? websocketDevtools;
155
+ if (resolvedDevtools) runtimeOptions.devtools = resolvedDevtools;
156
+ if (options.scheduler) runtimeOptions.scheduler = options.scheduler;
157
+ const runtime = new SyncoreRuntime(runtimeOptions);
158
+ websocketDevtools?.attachRuntime(() => runtime.getDevtoolsSnapshot());
159
+ if (websocketDevtools) {
160
+ websocketDevtools.attachRequestHandler(createDevtoolsRequestHandler({
161
+ driver: runtimeOptions.driver,
162
+ schema: options.schema,
163
+ functions: options.functions,
164
+ runtime
165
+ }));
166
+ const stop = runtime.stop.bind(runtime);
167
+ runtime.stop = async () => {
168
+ websocketDevtools.dispose();
169
+ await stop();
170
+ };
171
+ }
172
+ return runtime;
173
+ }
174
+ /**
175
+ * Create a same-process Syncore client from a started Node runtime.
176
+ */
177
+ function createNodeSyncoreClient(runtime) {
178
+ return runtime.createClient();
179
+ }
180
+ /**
181
+ * Start a Node Syncore runtime and return its client together with a dispose helper.
182
+ */
183
+ async function createManagedNodeSyncoreClient(options) {
184
+ const runtime = createNodeSyncoreRuntime(options);
185
+ await runtime.start();
186
+ return {
187
+ runtime,
188
+ client: runtime.createClient(),
189
+ async dispose() {
190
+ await runtime.stop();
191
+ }
192
+ };
193
+ }
194
+ /**
195
+ * Run a callback with a started local Node Syncore client and always stop the runtime.
196
+ *
197
+ * @example
198
+ * ```ts
199
+ * await withNodeSyncoreClient(options, async (client) => {
200
+ * console.log(await client.query(api.tasks.list));
201
+ * });
202
+ * ```
203
+ */
204
+ async function withNodeSyncoreClient(options, callback) {
205
+ const managed = await createManagedNodeSyncoreClient(options);
206
+ try {
207
+ return await callback(managed.client, managed.runtime);
208
+ } finally {
209
+ await managed.dispose();
210
+ }
211
+ }
212
+ /**
213
+ * Create the default Electron main-process bridge used to connect a BrowserWindow
214
+ * to a Syncore runtime.
215
+ */
216
+ function createElectronSyncoreBridge(options) {
217
+ const channel = options.channel ?? "syncore:message";
218
+ return createNodeIpcMessageEndpoint({
219
+ postMessage(message) {
220
+ if (!options.window.isDestroyed()) options.window.webContents.send(channel, message);
221
+ },
222
+ onMessage(listener) {
223
+ return options.onRendererMessage(listener);
224
+ }
225
+ });
226
+ }
227
+ function bindElectronWindowToSyncoreRuntime(options) {
228
+ const cleanupCallbacks = [];
229
+ const channel = options.channel ?? "syncore:message";
230
+ let onRendererMessage;
231
+ if (!options.onRendererMessage) {
232
+ if (!options.ipcMain) throw new Error("bindElectronWindowToSyncoreRuntime requires either onRendererMessage() or ipcMain.");
233
+ const listeners = /* @__PURE__ */ new Set();
234
+ const handleRendererMessage = (_event, message) => {
235
+ for (const listener of listeners) listener(message);
236
+ };
237
+ options.ipcMain.on(channel, handleRendererMessage);
238
+ cleanupCallbacks.push(() => {
239
+ options.ipcMain?.off(channel, handleRendererMessage);
240
+ listeners.clear();
241
+ });
242
+ onRendererMessage = (listener) => {
243
+ listeners.add(listener);
244
+ return () => listeners.delete(listener);
245
+ };
246
+ } else onRendererMessage = (listener) => options.onRendererMessage(listener);
247
+ const endpoint = createElectronSyncoreBridge({
248
+ window: options.window,
249
+ onRendererMessage,
250
+ channel
251
+ });
252
+ const attachedRuntime = attachNodeIpcRuntime({
253
+ endpoint,
254
+ createRuntime: () => options.runtime
255
+ });
256
+ return {
257
+ ready: attachedRuntime.ready,
258
+ async dispose() {
259
+ await attachedRuntime.dispose();
260
+ endpoint.dispose();
261
+ for (const cleanup of cleanupCallbacks) cleanup();
262
+ }
263
+ };
264
+ }
265
+ function createNodeWebSocketDevtoolsSink(options) {
266
+ let socket;
267
+ let disposed = false;
268
+ let connectTimer;
269
+ let getSnapshot;
270
+ let onRequest;
271
+ const pendingMessages = [];
272
+ let latestHello;
273
+ const connect = () => {
274
+ if (disposed) return;
275
+ socket = new WebSocket(options.url);
276
+ socket.on("open", () => {
277
+ if (latestHello) sendNow({
278
+ type: "hello",
279
+ runtimeId: latestHello.runtimeId,
280
+ platform: latestHello.platform,
281
+ ...options.appName ? { appName: options.appName } : {},
282
+ ...options.origin ? { origin: options.origin } : {},
283
+ ...options.sessionLabel ? { sessionLabel: options.sessionLabel } : {}
284
+ });
285
+ if (getSnapshot) sendNow({
286
+ type: "snapshot",
287
+ snapshot: withSnapshotMeta(getSnapshot(), options)
288
+ });
289
+ flushPendingMessages();
290
+ });
291
+ socket.on("message", (payload) => {
292
+ const rawPayload = typeof payload === "string" ? payload : payload instanceof Buffer ? payload.toString("utf8") : Array.isArray(payload) ? Buffer.concat(payload).toString("utf8") : payload instanceof ArrayBuffer ? Buffer.from(payload).toString("utf8") : Buffer.from(payload.buffer, payload.byteOffset, payload.byteLength).toString("utf8");
293
+ if (rawPayload.length === 0) return;
294
+ const message = JSON.parse(rawPayload);
295
+ if (message.type === "ping") send({ type: "pong" });
296
+ else if (message.type === "request" && onRequest) onRequest(message.payload).then((responsePayload) => {
297
+ const runtimeId = latestHello?.runtimeId ?? getSnapshot?.().runtimeId;
298
+ if (!runtimeId) return;
299
+ send({
300
+ type: "response",
301
+ requestId: message.requestId,
302
+ runtimeId,
303
+ payload: responsePayload
304
+ });
305
+ }).catch((err) => {
306
+ const runtimeId = latestHello?.runtimeId ?? getSnapshot?.().runtimeId;
307
+ if (!runtimeId) return;
308
+ send({
309
+ type: "response",
310
+ requestId: message.requestId,
311
+ runtimeId,
312
+ payload: {
313
+ kind: "error",
314
+ message: err instanceof Error ? err.message : "Unknown error"
315
+ }
316
+ });
317
+ });
318
+ });
319
+ socket.on("close", scheduleReconnect);
320
+ socket.on("error", scheduleReconnect);
321
+ };
322
+ const scheduleReconnect = () => {
323
+ if (disposed || connectTimer) return;
324
+ connectTimer = setTimeout(() => {
325
+ connectTimer = void 0;
326
+ connect();
327
+ }, options.reconnectDelayMs ?? 1200);
328
+ };
329
+ const sendNow = (message) => {
330
+ if (socket?.readyState === WebSocket.OPEN) socket.send(JSON.stringify(message));
331
+ };
332
+ const flushPendingMessages = () => {
333
+ while (pendingMessages.length > 0) {
334
+ const nextMessage = pendingMessages.shift();
335
+ if (!nextMessage) continue;
336
+ sendNow(nextMessage);
337
+ }
338
+ };
339
+ const send = (message) => {
340
+ if (socket?.readyState === WebSocket.OPEN) {
341
+ sendNow(message);
342
+ return;
343
+ }
344
+ pendingMessages.push(message);
345
+ };
346
+ connect();
347
+ return {
348
+ emit(event) {
349
+ if (event.type === "runtime.connected") {
350
+ latestHello = {
351
+ runtimeId: event.runtimeId,
352
+ platform: event.platform
353
+ };
354
+ send({
355
+ type: "hello",
356
+ runtimeId: event.runtimeId,
357
+ platform: event.platform,
358
+ ...options.appName ? { appName: options.appName } : {},
359
+ ...options.origin ? { origin: options.origin } : {},
360
+ ...options.sessionLabel ? { sessionLabel: options.sessionLabel } : {}
361
+ });
362
+ }
363
+ send({
364
+ type: "event",
365
+ event
366
+ });
367
+ if (getSnapshot) send({
368
+ type: "snapshot",
369
+ snapshot: withSnapshotMeta(getSnapshot(), options)
370
+ });
371
+ },
372
+ attachRuntime(snapshotGetter) {
373
+ getSnapshot = snapshotGetter;
374
+ if (socket?.readyState === WebSocket.OPEN) send({
375
+ type: "snapshot",
376
+ snapshot: withSnapshotMeta(getSnapshot(), options)
377
+ });
378
+ },
379
+ attachRequestHandler(handler) {
380
+ onRequest = handler;
381
+ },
382
+ dispose() {
383
+ disposed = true;
384
+ if (connectTimer) clearTimeout(connectTimer);
385
+ socket?.close();
386
+ }
387
+ };
388
+ }
389
+ function withSnapshotMeta(snapshot, options) {
390
+ return {
391
+ ...snapshot,
392
+ ...options.appName ? { appName: options.appName } : {},
393
+ ...options.origin ? { origin: options.origin } : {},
394
+ ...options.sessionLabel ? { sessionLabel: options.sessionLabel } : {}
395
+ };
396
+ }
397
+ function shouldAutoConnectNodeDevtools() {
398
+ return process.env.NODE_ENV !== "production";
399
+ }
400
+ function resolveDefaultNodeDevtoolsUrl() {
401
+ if (process.env.SYNCORE_DISABLE_DEVTOOLS === "1") return;
402
+ return process.env.SYNCORE_DEVTOOLS_URL ?? "ws://127.0.0.1:4311";
403
+ }
404
+ //#endregion
405
+ export { NodeFileStorageAdapter, NodeSqliteDriver, bindElectronWindowToSyncoreRuntime, createElectronSyncoreBridge, createManagedNodeSyncoreClient, createNodeSyncoreClient, createNodeSyncoreRuntime, createNodeWebSocketDevtoolsSink, withNodeSyncoreClient };
406
+
407
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../platform-node/src/index.ts"],"sourcesContent":["import {\n mkdir,\n readdir,\n readFile,\n rm,\n stat,\n writeFile\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { DatabaseSync, type SQLInputValue } from \"node:sqlite\";\nimport WebSocket from \"ws\";\nimport type {\n SyncoreDevtoolsMessage,\n SyncoreDevtoolsRequest,\n SyncoreDevtoolsSnapshot\n} from \"@syncore/devtools-protocol\";\nimport {\n type AnySyncoreSchema,\n createDevtoolsRequestHandler,\n type DevtoolsRequestHandler,\n type DevtoolsSink,\n type SchedulerOptions,\n type StorageObject,\n type StorageWriteInput,\n type SyncoreCapabilities,\n type SyncoreExperimentalPlugin,\n SyncoreRuntime,\n type SyncoreRuntimeOptions,\n type SyncoreSqlDriver,\n type SyncoreStorageAdapter\n} from \"@syncore/core\";\nimport { attachNodeIpcRuntime, createNodeIpcMessageEndpoint } from \"./ipc.js\";\nexport * from \"./ipc.js\";\nexport type {\n SyncoreDevtoolsEvent,\n SyncoreDevtoolsSnapshot\n} from \"@syncore/devtools-protocol\";\n\nexport type NodeSyncoreSchema = AnySyncoreSchema;\n\nfunction normalizeData(input: StorageWriteInput[\"data\"]): Uint8Array {\n if (typeof input === \"string\") {\n return Buffer.from(input);\n }\n if (input instanceof Uint8Array) {\n return input;\n }\n return new Uint8Array(input);\n}\n\nfunction toSqlParameters(params: unknown[]): SQLInputValue[] {\n return params as SQLInputValue[];\n}\n\nexport class NodeSqliteDriver implements SyncoreSqlDriver {\n private readonly database: DatabaseSync;\n private transactionDepth = 0;\n\n constructor(filename: string) {\n this.database = new DatabaseSync(filename);\n this.database.exec(\"PRAGMA foreign_keys = ON;\");\n this.database.exec(\"PRAGMA journal_mode = WAL;\");\n }\n\n async exec(sql: string): Promise<void> {\n this.database.exec(sql);\n }\n\n async run(\n sql: string,\n params: unknown[] = []\n ): Promise<{ changes: number; lastInsertRowid?: number | string }> {\n const statement = this.database.prepare(sql);\n const result = statement.run(...toSqlParameters(params));\n return {\n changes: Number(result.changes ?? 0),\n lastInsertRowid:\n typeof result.lastInsertRowid === \"bigint\"\n ? Number(result.lastInsertRowid)\n : result.lastInsertRowid\n };\n }\n\n async get<T>(sql: string, params: unknown[] = []): Promise<T | undefined> {\n const statement = this.database.prepare(sql);\n return statement.get(...toSqlParameters(params)) as T | undefined;\n }\n\n async all<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n const statement = this.database.prepare(sql);\n return statement.all(...toSqlParameters(params)) as T[];\n }\n\n async withTransaction<T>(callback: () => Promise<T>): Promise<T> {\n if (this.transactionDepth > 0) {\n return this.withSavepoint(`nested_${this.transactionDepth}`, callback);\n }\n\n this.transactionDepth += 1;\n this.database.exec(\"BEGIN\");\n try {\n const result = await callback();\n this.database.exec(\"COMMIT\");\n return result;\n } catch (error) {\n this.database.exec(\"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 const safeName = name.replaceAll(/[^a-zA-Z0-9_]/g, \"_\");\n this.database.exec(`SAVEPOINT ${safeName}`);\n try {\n const result = await callback();\n this.database.exec(`RELEASE SAVEPOINT ${safeName}`);\n return result;\n } catch (error) {\n this.database.exec(`ROLLBACK TO SAVEPOINT ${safeName}`);\n this.database.exec(`RELEASE SAVEPOINT ${safeName}`);\n throw error;\n }\n }\n\n async close(): Promise<void> {\n this.database.close();\n }\n}\n\nexport class NodeFileStorageAdapter implements SyncoreStorageAdapter {\n constructor(private readonly directory: string) {}\n\n private filePath(id: string): string {\n return path.join(this.directory, id);\n }\n\n async put(id: string, input: StorageWriteInput): Promise<StorageObject> {\n await mkdir(this.directory, { recursive: true });\n const filePath = this.filePath(id);\n const bytes = normalizeData(input.data);\n await writeFile(filePath, bytes);\n return {\n id,\n path: filePath,\n size: bytes.byteLength,\n contentType: input.contentType ?? null\n };\n }\n\n async get(id: string): Promise<StorageObject | null> {\n const filePath = this.filePath(id);\n try {\n const info = await stat(filePath);\n return {\n id,\n path: filePath,\n size: info.size,\n contentType: null\n };\n } catch {\n return null;\n }\n }\n\n async read(id: string): Promise<Uint8Array | null> {\n try {\n return await readFile(this.filePath(id));\n } catch {\n return null;\n }\n }\n\n async delete(id: string): Promise<void> {\n await rm(this.filePath(id), { force: true });\n }\n\n async list(): Promise<StorageObject[]> {\n try {\n const entries = await readdir(this.directory, { withFileTypes: true });\n const objects = await Promise.all(\n entries\n .filter((entry) => entry.isFile())\n .map(async (entry) => {\n const filePath = this.filePath(entry.name);\n const info = await stat(filePath);\n return {\n id: entry.name,\n path: filePath,\n size: info.size,\n contentType: null\n } satisfies StorageObject;\n })\n );\n return objects;\n } catch {\n return [];\n }\n }\n}\n\nexport interface CreateNodeRuntimeOptions {\n databasePath: string;\n storageDirectory: string;\n schema: NodeSyncoreSchema;\n functions: SyncoreRuntimeOptions<NodeSyncoreSchema>[\"functions\"];\n capabilities?: SyncoreCapabilities;\n experimentalPlugins?: Array<SyncoreExperimentalPlugin<NodeSyncoreSchema>>;\n appName?: string;\n origin?: string;\n sessionLabel?: string;\n platform?: string;\n devtools?: DevtoolsSink | false;\n devtoolsUrl?: string;\n scheduler?: SchedulerOptions;\n}\n\n/**\n * Options for creating a managed Node Syncore client.\n */\nexport type WithNodeSyncoreClientOptions = CreateNodeRuntimeOptions;\n\n/**\n * A started local Node runtime paired with its client and a dispose helper.\n */\nexport interface ManagedNodeSyncoreClient {\n runtime: SyncoreRuntime<NodeSyncoreSchema>;\n client: ReturnType<SyncoreRuntime<NodeSyncoreSchema>[\"createClient\"]>;\n dispose(): Promise<void>;\n}\n\nexport interface SyncoreElectronIpcBinding {\n ready: Promise<void>;\n dispose(): Promise<void>;\n}\n\nexport interface SyncoreElectronBridgeWindow {\n isDestroyed(): boolean;\n webContents: {\n send(channel: string, message: unknown): void;\n };\n}\n\nexport interface CreateElectronSyncoreBridgeOptions {\n window: SyncoreElectronBridgeWindow;\n onRendererMessage(listener: (message: unknown) => void): () => void;\n channel?: string;\n}\n\n/**\n * The subset of Electron's `ipcMain` used by Syncore's main-process helper.\n */\nexport interface SyncoreElectronIpcMain {\n on(\n channel: string,\n listener: (event: unknown, message: unknown) => void\n ): void;\n off(\n channel: string,\n listener: (event: unknown, message: unknown) => void\n ): void;\n}\n\nexport interface CreateSyncoreRendererWindowClientOptions {\n bridgeName?: string;\n}\n\n/**\n * Create a Node or Electron runtime backed by SQLite and local file storage.\n */\nexport function createNodeSyncoreRuntime(\n options: CreateNodeRuntimeOptions\n): SyncoreRuntime<NodeSyncoreSchema> {\n const resolvedDevtoolsUrl =\n options.devtoolsUrl ?? resolveDefaultNodeDevtoolsUrl();\n const websocketDevtools =\n options.devtools === undefined &&\n resolvedDevtoolsUrl &&\n shouldAutoConnectNodeDevtools()\n ? createNodeWebSocketDevtoolsSink({\n url: resolvedDevtoolsUrl,\n ...(options.appName ? { appName: options.appName } : {}),\n ...(options.origin ? { origin: options.origin } : {}),\n ...(options.sessionLabel\n ? { sessionLabel: options.sessionLabel }\n : {})\n })\n : undefined;\n const runtimeOptions: SyncoreRuntimeOptions<NodeSyncoreSchema> = {\n schema: options.schema,\n functions: options.functions,\n driver: new NodeSqliteDriver(options.databasePath),\n storage: new NodeFileStorageAdapter(options.storageDirectory),\n platform: options.platform ?? \"node\"\n };\n if (options.capabilities) {\n runtimeOptions.capabilities = options.capabilities;\n }\n if (options.experimentalPlugins) {\n runtimeOptions.experimentalPlugins = options.experimentalPlugins;\n }\n const resolvedDevtools =\n options.devtools === false\n ? undefined\n : (options.devtools ?? websocketDevtools);\n if (resolvedDevtools) {\n runtimeOptions.devtools = resolvedDevtools;\n }\n if (options.scheduler) {\n runtimeOptions.scheduler = options.scheduler;\n }\n const runtime = new SyncoreRuntime(runtimeOptions);\n websocketDevtools?.attachRuntime(() => runtime.getDevtoolsSnapshot());\n if (websocketDevtools) {\n websocketDevtools.attachRequestHandler(\n createDevtoolsRequestHandler({\n driver: runtimeOptions.driver,\n schema: options.schema,\n functions: options.functions,\n runtime\n })\n );\n const stop = runtime.stop.bind(runtime);\n runtime.stop = async () => {\n websocketDevtools.dispose();\n await stop();\n };\n }\n return runtime;\n}\n\n/**\n * Create a same-process Syncore client from a started Node runtime.\n */\nexport function createNodeSyncoreClient(\n runtime: SyncoreRuntime<NodeSyncoreSchema>\n) {\n return runtime.createClient();\n}\n\n/**\n * Start a Node Syncore runtime and return its client together with a dispose helper.\n */\nexport async function createManagedNodeSyncoreClient(\n options: WithNodeSyncoreClientOptions\n): Promise<ManagedNodeSyncoreClient> {\n const runtime = createNodeSyncoreRuntime(options);\n await runtime.start();\n return {\n runtime,\n client: runtime.createClient(),\n async dispose() {\n await runtime.stop();\n }\n };\n}\n\n/**\n * Run a callback with a started local Node Syncore client and always stop the runtime.\n *\n * @example\n * ```ts\n * await withNodeSyncoreClient(options, async (client) => {\n * console.log(await client.query(api.tasks.list));\n * });\n * ```\n */\nexport async function withNodeSyncoreClient<TResult>(\n options: WithNodeSyncoreClientOptions,\n callback: (\n client: ReturnType<SyncoreRuntime<NodeSyncoreSchema>[\"createClient\"]>,\n runtime: SyncoreRuntime<NodeSyncoreSchema>\n ) => Promise<TResult> | TResult\n): Promise<TResult> {\n const managed = await createManagedNodeSyncoreClient(options);\n try {\n return await callback(managed.client, managed.runtime);\n } finally {\n await managed.dispose();\n }\n}\n\n/**\n * Create the default Electron main-process bridge used to connect a BrowserWindow\n * to a Syncore runtime.\n */\nexport function createElectronSyncoreBridge(\n options: CreateElectronSyncoreBridgeOptions\n) {\n const channel = options.channel ?? \"syncore:message\";\n return createNodeIpcMessageEndpoint({\n postMessage(message: unknown) {\n if (!options.window.isDestroyed()) {\n options.window.webContents.send(channel, message);\n }\n },\n onMessage(listener: (message: unknown) => void) {\n return options.onRendererMessage(listener);\n }\n });\n}\n\n/**\n * Bind a BrowserWindow to a Syncore runtime with the default Electron IPC transport.\n */\nexport function bindElectronWindowToSyncoreRuntime(options: {\n runtime: SyncoreRuntime<NodeSyncoreSchema>;\n window: SyncoreElectronBridgeWindow;\n onRendererMessage(listener: (message: unknown) => void): () => void;\n channel?: string;\n}): SyncoreElectronIpcBinding;\nexport function bindElectronWindowToSyncoreRuntime(options: {\n runtime: SyncoreRuntime<NodeSyncoreSchema>;\n window: SyncoreElectronBridgeWindow;\n ipcMain: SyncoreElectronIpcMain;\n channel?: string;\n}): SyncoreElectronIpcBinding;\nexport function bindElectronWindowToSyncoreRuntime(options: {\n runtime: SyncoreRuntime<NodeSyncoreSchema>;\n window: SyncoreElectronBridgeWindow;\n onRendererMessage?(listener: (message: unknown) => void): () => void;\n ipcMain?: SyncoreElectronIpcMain;\n channel?: string;\n}): SyncoreElectronIpcBinding {\n const cleanupCallbacks: Array<() => void> = [];\n const channel = options.channel ?? \"syncore:message\";\n let onRendererMessage:\n | ((listener: (message: unknown) => void) => () => void)\n | undefined;\n\n if (!options.onRendererMessage) {\n if (!options.ipcMain) {\n throw new Error(\n \"bindElectronWindowToSyncoreRuntime requires either onRendererMessage() or ipcMain.\"\n );\n }\n const listeners = new Set<(message: unknown) => void>();\n const handleRendererMessage = (_event: unknown, message: unknown) => {\n for (const listener of listeners) {\n listener(message);\n }\n };\n options.ipcMain.on(channel, handleRendererMessage);\n cleanupCallbacks.push(() => {\n options.ipcMain?.off(channel, handleRendererMessage);\n listeners.clear();\n });\n onRendererMessage = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n } else {\n onRendererMessage = (listener) => options.onRendererMessage!(listener);\n }\n\n const endpoint = createElectronSyncoreBridge({\n window: options.window,\n onRendererMessage,\n channel\n });\n const attachedRuntime = attachNodeIpcRuntime({\n endpoint,\n createRuntime: () => options.runtime\n });\n\n return {\n ready: attachedRuntime.ready,\n async dispose() {\n await attachedRuntime.dispose();\n endpoint.dispose();\n for (const cleanup of cleanupCallbacks) {\n cleanup();\n }\n }\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Devtools request handler */\n/* ------------------------------------------------------------------ */\n\nexport interface NodeWebSocketDevtoolsSinkOptions {\n url: string;\n reconnectDelayMs?: number;\n appName?: string;\n origin?: string;\n sessionLabel?: string;\n}\n\nexport interface NodeWebSocketDevtoolsSink extends DevtoolsSink {\n attachRuntime(getSnapshot: () => SyncoreDevtoolsSnapshot): void;\n attachRequestHandler(handler: DevtoolsRequestHandler): void;\n dispose(): void;\n}\n\nexport function createNodeWebSocketDevtoolsSink(\n options: NodeWebSocketDevtoolsSinkOptions\n): NodeWebSocketDevtoolsSink {\n let socket: WebSocket | undefined;\n let disposed = false;\n let connectTimer: ReturnType<typeof setTimeout> | undefined;\n let getSnapshot: (() => SyncoreDevtoolsSnapshot) | undefined;\n let onRequest: DevtoolsRequestHandler | undefined;\n const pendingMessages: SyncoreDevtoolsMessage[] = [];\n let latestHello:\n | {\n runtimeId: string;\n platform: string;\n }\n | undefined;\n\n const connect = () => {\n if (disposed) {\n return;\n }\n socket = new WebSocket(options.url);\n socket.on(\"open\", () => {\n if (latestHello) {\n sendNow({\n type: \"hello\",\n runtimeId: latestHello.runtimeId,\n platform: latestHello.platform,\n ...(options.appName ? { appName: options.appName } : {}),\n ...(options.origin ? { origin: options.origin } : {}),\n ...(options.sessionLabel\n ? { sessionLabel: options.sessionLabel }\n : {})\n });\n }\n if (getSnapshot) {\n sendNow({\n type: \"snapshot\",\n snapshot: withSnapshotMeta(getSnapshot(), options)\n });\n }\n flushPendingMessages();\n });\n socket.on(\"message\", (payload) => {\n const rawPayload =\n typeof payload === \"string\"\n ? payload\n : payload instanceof Buffer\n ? payload.toString(\"utf8\")\n : Array.isArray(payload)\n ? Buffer.concat(payload).toString(\"utf8\")\n : payload instanceof ArrayBuffer\n ? Buffer.from(payload).toString(\"utf8\")\n : Buffer.from(\n payload.buffer,\n payload.byteOffset,\n payload.byteLength\n ).toString(\"utf8\");\n if (rawPayload.length === 0) {\n return;\n }\n const message = JSON.parse(rawPayload) as\n | SyncoreDevtoolsMessage\n | SyncoreDevtoolsRequest;\n if (message.type === \"ping\") {\n send({ type: \"pong\" });\n } else if (message.type === \"request\" && onRequest) {\n onRequest(message.payload)\n .then((responsePayload) => {\n const runtimeId =\n latestHello?.runtimeId ?? getSnapshot?.().runtimeId;\n if (!runtimeId) {\n return;\n }\n send({\n type: \"response\",\n requestId: message.requestId,\n runtimeId,\n payload: responsePayload\n });\n })\n .catch((err) => {\n const runtimeId =\n latestHello?.runtimeId ?? getSnapshot?.().runtimeId;\n if (!runtimeId) {\n return;\n }\n send({\n type: \"response\",\n requestId: message.requestId,\n runtimeId,\n payload: {\n kind: \"error\",\n message: err instanceof Error ? err.message : \"Unknown error\"\n }\n });\n });\n }\n });\n socket.on(\"close\", scheduleReconnect);\n socket.on(\"error\", scheduleReconnect);\n };\n\n const scheduleReconnect = () => {\n if (disposed || connectTimer) {\n return;\n }\n connectTimer = setTimeout(() => {\n connectTimer = undefined;\n connect();\n }, options.reconnectDelayMs ?? 1200);\n };\n\n const sendNow = (message: SyncoreDevtoolsMessage) => {\n if (socket?.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n };\n\n const flushPendingMessages = () => {\n while (pendingMessages.length > 0) {\n const nextMessage = pendingMessages.shift();\n if (!nextMessage) {\n continue;\n }\n sendNow(nextMessage);\n }\n };\n\n const send = (message: SyncoreDevtoolsMessage) => {\n if (socket?.readyState === WebSocket.OPEN) {\n sendNow(message);\n return;\n }\n pendingMessages.push(message);\n };\n\n connect();\n\n return {\n emit(event) {\n if (event.type === \"runtime.connected\") {\n latestHello = {\n runtimeId: event.runtimeId,\n platform: event.platform\n };\n send({\n type: \"hello\",\n runtimeId: event.runtimeId,\n platform: event.platform,\n ...(options.appName ? { appName: options.appName } : {}),\n ...(options.origin ? { origin: options.origin } : {}),\n ...(options.sessionLabel\n ? { sessionLabel: options.sessionLabel }\n : {})\n });\n }\n send({\n type: \"event\",\n event\n });\n if (getSnapshot) {\n send({\n type: \"snapshot\",\n snapshot: withSnapshotMeta(getSnapshot(), options)\n });\n }\n },\n attachRuntime(snapshotGetter) {\n getSnapshot = snapshotGetter;\n if (socket?.readyState === WebSocket.OPEN) {\n send({\n type: \"snapshot\",\n snapshot: withSnapshotMeta(getSnapshot(), options)\n });\n }\n },\n attachRequestHandler(handler) {\n onRequest = handler;\n },\n dispose() {\n disposed = true;\n if (connectTimer) {\n clearTimeout(connectTimer);\n }\n socket?.close();\n }\n };\n}\n\nfunction withSnapshotMeta(\n snapshot: SyncoreDevtoolsSnapshot,\n options: NodeWebSocketDevtoolsSinkOptions\n): SyncoreDevtoolsSnapshot {\n return {\n ...snapshot,\n ...(options.appName ? { appName: options.appName } : {}),\n ...(options.origin ? { origin: options.origin } : {}),\n ...(options.sessionLabel ? { sessionLabel: options.sessionLabel } : {})\n };\n}\n\nfunction shouldAutoConnectNodeDevtools(): boolean {\n return process.env.NODE_ENV !== \"production\";\n}\n\nfunction resolveDefaultNodeDevtoolsUrl(): string | undefined {\n if (process.env.SYNCORE_DISABLE_DEVTOOLS === \"1\") {\n return undefined;\n }\n return process.env.SYNCORE_DEVTOOLS_URL ?? \"ws://127.0.0.1:4311\";\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { ReactNode } from "react";
2
+
3
+ //#region ../platform-node/src/ipc-react.d.ts
4
+ /**
5
+ * Props for {@link SyncoreElectronProvider}.
6
+ */
7
+ interface SyncoreElectronProviderProps {
8
+ /** The React subtree that should receive the renderer Syncore client. */
9
+ children: ReactNode;
10
+ /** Optional custom bridge name exposed on `window`. */
11
+ bridgeName?: string;
12
+ /** Optional window-like object for tests or custom shells. */
13
+ windowObject?: Window & typeof globalThis;
14
+ }
15
+ /**
16
+ * Create a renderer Syncore client from `window.syncoreBridge` and provide it to React.
17
+ */
18
+ declare function SyncoreElectronProvider({
19
+ children,
20
+ bridgeName,
21
+ windowObject
22
+ }: SyncoreElectronProviderProps): ReactNode;
23
+ //#endregion
24
+ export { SyncoreElectronProvider, SyncoreElectronProviderProps };
25
+ //# sourceMappingURL=ipc-react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-react.d.ts","names":[],"sources":["../../../../platform-node/src/ipc-react.tsx"],"mappings":";;;;;AAQA;UAAiB,4BAAA;;EAEf,QAAA,EAAU,SAAA;EAMK;EAHf,UAAA;EAGyC;EAAzC,YAAA,GAAe,MAAA,UAAgB,UAAA;AAAA;;;;iBAMjB,uBAAA,CAAA;EACd,QAAA;EACA,UAAA;EACA;AAAA,GACC,4BAAA,GAA+B,SAAA"}
@@ -0,0 +1,21 @@
1
+ import { SyncoreProvider } from "../../react/src/index.js";
2
+ import { createRendererSyncoreWindowClient } from "./ipc.js";
3
+ import { useEffect, useMemo } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region ../platform-node/src/ipc-react.tsx
6
+ /**
7
+ * Create a renderer Syncore client from `window.syncoreBridge` and provide it to React.
8
+ */
9
+ function SyncoreElectronProvider({ children, bridgeName, windowObject }) {
10
+ const resolvedWindow = windowObject ?? window;
11
+ const client = useMemo(() => createRendererSyncoreWindowClient(resolvedWindow, bridgeName ?? "syncoreBridge"), [bridgeName, resolvedWindow]);
12
+ useEffect(() => () => client.dispose(), [client]);
13
+ return /* @__PURE__ */ jsx(SyncoreProvider, {
14
+ client,
15
+ children
16
+ });
17
+ }
18
+ //#endregion
19
+ export { SyncoreElectronProvider };
20
+
21
+ //# sourceMappingURL=ipc-react.js.map