syncorejs 0.2.0 → 0.2.2
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.
- package/README.md +2 -1
- package/dist/_vendor/cli/app.d.mts.map +1 -1
- package/dist/_vendor/cli/app.mjs +323 -42
- package/dist/_vendor/cli/app.mjs.map +1 -1
- package/dist/_vendor/cli/context.mjs +27 -9
- package/dist/_vendor/cli/context.mjs.map +1 -1
- package/dist/_vendor/cli/doctor.mjs +513 -46
- package/dist/_vendor/cli/doctor.mjs.map +1 -1
- package/dist/_vendor/cli/messages.mjs +5 -4
- package/dist/_vendor/cli/messages.mjs.map +1 -1
- package/dist/_vendor/cli/project.mjs +110 -12
- package/dist/_vendor/cli/project.mjs.map +1 -1
- package/dist/_vendor/cli/render.mjs +57 -9
- package/dist/_vendor/cli/render.mjs.map +1 -1
- package/dist/_vendor/cli/targets.mjs +4 -3
- package/dist/_vendor/cli/targets.mjs.map +1 -1
- package/dist/_vendor/core/cli.d.mts +13 -3
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +242 -91
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/devtools-auth.mjs +60 -0
- package/dist/_vendor/core/devtools-auth.mjs.map +1 -0
- package/dist/_vendor/core/index.d.mts +5 -3
- package/dist/_vendor/core/index.mjs +22 -2
- package/dist/_vendor/core/index.mjs.map +1 -1
- package/dist/_vendor/core/runtime/components.d.mts +111 -0
- package/dist/_vendor/core/runtime/components.d.mts.map +1 -0
- package/dist/_vendor/core/runtime/components.mjs +186 -0
- package/dist/_vendor/core/runtime/components.mjs.map +1 -0
- package/dist/_vendor/core/runtime/devtools.d.mts +4 -4
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +52 -41
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.d.mts +10 -10
- package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/functions.mjs +2 -2
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +77 -0
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +617 -0
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +186 -0
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +220 -0
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +203 -0
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs +177 -0
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +144 -0
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +220 -0
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs +32 -0
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs +61 -0
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +37 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -0
- package/dist/_vendor/core/runtime/runtime.d.mts +159 -205
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs +16 -1371
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/core/transport.d.mts +111 -0
- package/dist/_vendor/core/transport.d.mts.map +1 -0
- package/dist/_vendor/core/transport.mjs +419 -0
- package/dist/_vendor/core/transport.mjs.map +1 -0
- package/dist/_vendor/devtools-protocol/index.d.ts +39 -1
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js +25 -9
- package/dist/_vendor/devtools-protocol/index.js.map +1 -1
- package/dist/_vendor/next/index.d.ts +1 -1
- package/dist/_vendor/next/index.d.ts.map +1 -1
- package/dist/_vendor/next/index.js +31 -13
- package/dist/_vendor/next/index.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +12 -12
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +4 -2
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-expo/react.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/react.js +11 -10
- package/dist/_vendor/platform-expo/react.js.map +1 -1
- package/dist/_vendor/platform-node/index.d.mts +23 -19
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +13 -5
- package/dist/_vendor/platform-node/index.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.mjs +15 -2
- package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc.d.mts +11 -35
- package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc.mjs +3 -273
- package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +2 -1
- package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
- package/dist/_vendor/platform-web/external-change.js +2 -1
- package/dist/_vendor/platform-web/external-change.js.map +1 -1
- package/dist/_vendor/platform-web/index.d.ts +21 -21
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +44 -7
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/react.d.ts.map +1 -1
- package/dist/_vendor/platform-web/react.js +29 -13
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/platform-web/worker.d.ts +11 -35
- package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
- package/dist/_vendor/platform-web/worker.js +3 -267
- package/dist/_vendor/platform-web/worker.js.map +1 -1
- package/dist/_vendor/react/index.d.ts +36 -20
- package/dist/_vendor/react/index.d.ts.map +1 -1
- package/dist/_vendor/react/index.js +279 -57
- package/dist/_vendor/react/index.js.map +1 -1
- package/dist/_vendor/schema/definition.d.ts +48 -63
- package/dist/_vendor/schema/definition.d.ts.map +1 -1
- package/dist/_vendor/schema/definition.js +22 -39
- package/dist/_vendor/schema/definition.js.map +1 -1
- package/dist/_vendor/schema/index.d.ts +4 -4
- package/dist/_vendor/schema/index.js +2 -2
- package/dist/_vendor/schema/planner.d.ts +19 -2
- package/dist/_vendor/schema/planner.d.ts.map +1 -1
- package/dist/_vendor/schema/planner.js +79 -3
- package/dist/_vendor/schema/planner.js.map +1 -1
- package/dist/_vendor/schema/validators.d.ts +141 -121
- package/dist/_vendor/schema/validators.d.ts.map +1 -1
- package/dist/_vendor/schema/validators.js +300 -42
- package/dist/_vendor/schema/validators.js.map +1 -1
- package/dist/_vendor/svelte/index.d.ts +47 -19
- package/dist/_vendor/svelte/index.d.ts.map +1 -1
- package/dist/_vendor/svelte/index.js +250 -20
- package/dist/_vendor/svelte/index.js.map +1 -1
- package/dist/components.d.ts +2 -0
- package/dist/components.js +2 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/package.json +8 -3
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { AttachNodeIpcRuntimeOptions, AttachedNodeIpcRuntime, NodeIpcSyncoreSchema, RendererQueryWatch, SyncoreIpcMessageEndpoint, SyncoreMainProcessBridge, SyncoreRendererBridge, SyncoreRendererClient, SyncoreWindowBridge, attachNodeIpcRuntime, createNodeIpcMessageEndpoint, createRendererSyncoreBridgeClient, createRendererSyncoreClient, createRendererSyncoreWindowClient, installSyncoreWindowBridge } from "./ipc.mjs";
|
|
2
|
-
import * as _syncore_core0 from "../core/index.d.mts";
|
|
3
|
-
import { AnySyncoreSchema, DevtoolsCommandHandler, DevtoolsSink, DevtoolsSubscriptionHost, SchedulerOptions, StorageObject, StorageWriteInput, SyncoreCapabilities, SyncoreExperimentalPlugin, SyncoreRuntime, SyncoreRuntimeOptions, SyncoreSqlDriver, SyncoreStorageAdapter } from "../core/index.d.mts";
|
|
4
2
|
import { SyncoreActiveQueryInfo, SyncoreDevtoolsEvent, SyncoreRuntimeSummary } from "../devtools-protocol/index.d.ts";
|
|
3
|
+
import * as _syncore_core0 from "../core/index.d.mts";
|
|
4
|
+
import { DevtoolsCommandHandler, DevtoolsSink, DevtoolsSubscriptionHost, SchedulerOptions, StorageObject, StorageWriteInput, SyncoreCapabilities, SyncoreDataModel, SyncoreRuntime, SyncoreRuntimeOptions, SyncoreSqlDriver, SyncoreStorageAdapter } from "../core/index.d.mts";
|
|
5
5
|
|
|
6
6
|
//#region src/index.d.ts
|
|
7
|
-
type NodeSyncoreSchema =
|
|
7
|
+
type NodeSyncoreSchema<TSchema extends SyncoreDataModel = SyncoreDataModel> = TSchema;
|
|
8
8
|
declare class NodeSqliteDriver implements SyncoreSqlDriver {
|
|
9
9
|
private readonly database;
|
|
10
10
|
private transactionDepth;
|
|
@@ -30,13 +30,13 @@ declare class NodeFileStorageAdapter implements SyncoreStorageAdapter {
|
|
|
30
30
|
delete(id: string): Promise<void>;
|
|
31
31
|
list(): Promise<StorageObject[]>;
|
|
32
32
|
}
|
|
33
|
-
interface CreateNodeRuntimeOptions {
|
|
33
|
+
interface CreateNodeRuntimeOptions<TSchema extends NodeSyncoreSchema = NodeSyncoreSchema> {
|
|
34
34
|
databasePath: string;
|
|
35
35
|
storageDirectory: string;
|
|
36
|
-
schema:
|
|
37
|
-
functions: SyncoreRuntimeOptions<
|
|
36
|
+
schema: TSchema;
|
|
37
|
+
functions: SyncoreRuntimeOptions<TSchema>["functions"];
|
|
38
|
+
components?: SyncoreRuntimeOptions<TSchema>["components"];
|
|
38
39
|
capabilities?: SyncoreCapabilities;
|
|
39
|
-
experimentalPlugins?: Array<SyncoreExperimentalPlugin<NodeSyncoreSchema>>;
|
|
40
40
|
appName?: string;
|
|
41
41
|
origin?: string;
|
|
42
42
|
sessionLabel?: string;
|
|
@@ -48,13 +48,13 @@ interface CreateNodeRuntimeOptions {
|
|
|
48
48
|
/**
|
|
49
49
|
* Options for creating a managed Node Syncore client.
|
|
50
50
|
*/
|
|
51
|
-
type WithNodeSyncoreClientOptions = CreateNodeRuntimeOptions
|
|
51
|
+
type WithNodeSyncoreClientOptions<TSchema extends NodeSyncoreSchema = NodeSyncoreSchema> = CreateNodeRuntimeOptions<TSchema>;
|
|
52
52
|
/**
|
|
53
53
|
* A started local Node runtime paired with its client and a dispose helper.
|
|
54
54
|
*/
|
|
55
|
-
interface ManagedNodeSyncoreClient {
|
|
56
|
-
runtime: SyncoreRuntime<
|
|
57
|
-
client: ReturnType<SyncoreRuntime<
|
|
55
|
+
interface ManagedNodeSyncoreClient<TSchema extends NodeSyncoreSchema = NodeSyncoreSchema> {
|
|
56
|
+
runtime: SyncoreRuntime<TSchema>;
|
|
57
|
+
client: ReturnType<SyncoreRuntime<TSchema>["createClient"]>;
|
|
58
58
|
dispose(): Promise<void>;
|
|
59
59
|
}
|
|
60
60
|
interface SyncoreElectronIpcBinding {
|
|
@@ -76,8 +76,12 @@ interface CreateElectronSyncoreBridgeOptions {
|
|
|
76
76
|
* The subset of Electron's `ipcMain` used by Syncore's main-process helper.
|
|
77
77
|
*/
|
|
78
78
|
interface SyncoreElectronIpcMain {
|
|
79
|
-
on(channel: string, listener: (event:
|
|
80
|
-
|
|
79
|
+
on(channel: string, listener: (event: {
|
|
80
|
+
sender: unknown;
|
|
81
|
+
}, message: unknown) => void): void;
|
|
82
|
+
off(channel: string, listener: (event: {
|
|
83
|
+
sender: unknown;
|
|
84
|
+
}, message: unknown) => void): void;
|
|
81
85
|
}
|
|
82
86
|
interface CreateSyncoreRendererWindowClientOptions {
|
|
83
87
|
bridgeName?: string;
|
|
@@ -85,15 +89,15 @@ interface CreateSyncoreRendererWindowClientOptions {
|
|
|
85
89
|
/**
|
|
86
90
|
* Create a Node or Electron runtime backed by SQLite and local file storage.
|
|
87
91
|
*/
|
|
88
|
-
declare function createNodeSyncoreRuntime(options: CreateNodeRuntimeOptions): SyncoreRuntime<
|
|
92
|
+
declare function createNodeSyncoreRuntime<TSchema extends NodeSyncoreSchema>(options: CreateNodeRuntimeOptions<TSchema>): SyncoreRuntime<TSchema>;
|
|
89
93
|
/**
|
|
90
94
|
* Create a same-process Syncore client from a started Node runtime.
|
|
91
95
|
*/
|
|
92
|
-
declare function createNodeSyncoreClient(runtime: SyncoreRuntime<
|
|
96
|
+
declare function createNodeSyncoreClient<TSchema extends NodeSyncoreSchema>(runtime: SyncoreRuntime<TSchema>): _syncore_core0.SyncoreClient;
|
|
93
97
|
/**
|
|
94
98
|
* Start a Node Syncore runtime and return its client together with a dispose helper.
|
|
95
99
|
*/
|
|
96
|
-
declare function createManagedNodeSyncoreClient(options: WithNodeSyncoreClientOptions): Promise<ManagedNodeSyncoreClient
|
|
100
|
+
declare function createManagedNodeSyncoreClient<TSchema extends NodeSyncoreSchema>(options: WithNodeSyncoreClientOptions<TSchema>): Promise<ManagedNodeSyncoreClient<TSchema>>;
|
|
97
101
|
/**
|
|
98
102
|
* Run a callback with a started local Node Syncore client and always stop the runtime.
|
|
99
103
|
*
|
|
@@ -104,12 +108,12 @@ declare function createManagedNodeSyncoreClient(options: WithNodeSyncoreClientOp
|
|
|
104
108
|
* });
|
|
105
109
|
* ```
|
|
106
110
|
*/
|
|
107
|
-
declare function withNodeSyncoreClient<TResult>(options: WithNodeSyncoreClientOptions
|
|
111
|
+
declare function withNodeSyncoreClient<TSchema extends NodeSyncoreSchema, TResult>(options: WithNodeSyncoreClientOptions<TSchema>, callback: (client: ReturnType<SyncoreRuntime<TSchema>["createClient"]>, runtime: SyncoreRuntime<TSchema>) => Promise<TResult> | TResult): Promise<TResult>;
|
|
108
112
|
/**
|
|
109
113
|
* Create the default Electron main-process bridge used to connect a BrowserWindow
|
|
110
114
|
* to a Syncore runtime.
|
|
111
115
|
*/
|
|
112
|
-
declare function createElectronSyncoreBridge(options: CreateElectronSyncoreBridgeOptions):
|
|
116
|
+
declare function createElectronSyncoreBridge(options: CreateElectronSyncoreBridgeOptions): _syncore_core0.SyncoreBridgeMessageEndpoint & {
|
|
113
117
|
dispose(): void;
|
|
114
118
|
};
|
|
115
119
|
/**
|
|
@@ -139,7 +143,7 @@ interface NodeWebSocketDevtoolsSinkOptions {
|
|
|
139
143
|
storageIdentity?: string;
|
|
140
144
|
}
|
|
141
145
|
interface NodeWebSocketDevtoolsSink extends DevtoolsSink {
|
|
142
|
-
attachRuntime(runtime: SyncoreRuntime<
|
|
146
|
+
attachRuntime(runtime: SyncoreRuntime<NodeSyncoreSchema>): void;
|
|
143
147
|
attachCommandHandler(handler: DevtoolsCommandHandler): void;
|
|
144
148
|
attachSubscriptionHost(host: DevtoolsSubscriptionHost): void;
|
|
145
149
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises"
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { DatabaseSync } from "node:sqlite";
|
|
6
6
|
import WebSocket from "ws";
|
|
7
|
+
import { SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION, SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION, SYNCORE_DEVTOOLS_PROTOCOL_VERSION } from "../devtools-protocol/index.js";
|
|
7
8
|
import { SyncoreRuntime, createDevtoolsCommandHandler, createDevtoolsSubscriptionHost } from "../core/index.mjs";
|
|
8
9
|
//#region src/index.ts
|
|
9
10
|
const { Parser: NodeSqlParser } = createRequire(import.meta.url)("node-sql-parser");
|
|
@@ -229,12 +230,12 @@ function createNodeSyncoreRuntime(options) {
|
|
|
229
230
|
const runtimeOptions = {
|
|
230
231
|
schema: options.schema,
|
|
231
232
|
functions: options.functions,
|
|
233
|
+
...options.components ? { components: options.components } : {},
|
|
232
234
|
driver: new NodeSqliteDriver(options.databasePath),
|
|
233
235
|
storage: new NodeFileStorageAdapter(options.storageDirectory),
|
|
234
236
|
platform: options.platform ?? "node"
|
|
235
237
|
};
|
|
236
238
|
if (options.capabilities) runtimeOptions.capabilities = options.capabilities;
|
|
237
|
-
if (options.experimentalPlugins) runtimeOptions.experimentalPlugins = options.experimentalPlugins;
|
|
238
239
|
const resolvedDevtools = options.devtools === false ? void 0 : options.devtools ?? websocketDevtools;
|
|
239
240
|
if (resolvedDevtools) runtimeOptions.devtools = resolvedDevtools;
|
|
240
241
|
if (options.scheduler) runtimeOptions.scheduler = options.scheduler;
|
|
@@ -245,14 +246,14 @@ function createNodeSyncoreRuntime(options) {
|
|
|
245
246
|
driver: runtimeOptions.driver,
|
|
246
247
|
schema: options.schema,
|
|
247
248
|
functions: options.functions,
|
|
248
|
-
runtime,
|
|
249
|
+
admin: runtime.getAdmin(),
|
|
249
250
|
sql: nodeDevtoolsSqlSupport
|
|
250
251
|
}));
|
|
251
252
|
websocketDevtools.attachSubscriptionHost(createDevtoolsSubscriptionHost({
|
|
252
253
|
driver: runtimeOptions.driver,
|
|
253
254
|
schema: options.schema,
|
|
254
255
|
functions: options.functions,
|
|
255
|
-
runtime,
|
|
256
|
+
admin: runtime.getAdmin(),
|
|
256
257
|
sql: nodeDevtoolsSqlSupport
|
|
257
258
|
}));
|
|
258
259
|
const stop = runtime.stop.bind(runtime);
|
|
@@ -323,7 +324,8 @@ function bindElectronWindowToSyncoreRuntime(options) {
|
|
|
323
324
|
if (!options.onRendererMessage) {
|
|
324
325
|
if (!options.ipcMain) throw new Error("bindElectronWindowToSyncoreRuntime requires either onRendererMessage() or ipcMain.");
|
|
325
326
|
const listeners = /* @__PURE__ */ new Set();
|
|
326
|
-
const handleRendererMessage = (
|
|
327
|
+
const handleRendererMessage = (event, message) => {
|
|
328
|
+
if (event.sender !== options.window.webContents) return;
|
|
327
329
|
for (const listener of listeners) listener(message);
|
|
328
330
|
};
|
|
329
331
|
options.ipcMain.on(channel, handleRendererMessage);
|
|
@@ -369,6 +371,9 @@ function createNodeWebSocketDevtoolsSink(options) {
|
|
|
369
371
|
socket.on("open", () => {
|
|
370
372
|
if (latestHello) sendNow({
|
|
371
373
|
type: "hello",
|
|
374
|
+
protocolVersion: SYNCORE_DEVTOOLS_PROTOCOL_VERSION,
|
|
375
|
+
minSupportedProtocolVersion: SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,
|
|
376
|
+
maxSupportedProtocolVersion: SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,
|
|
372
377
|
runtimeId: latestHello.runtimeId,
|
|
373
378
|
platform: latestHello.platform,
|
|
374
379
|
...options.appName ? { appName: options.appName } : {},
|
|
@@ -457,6 +462,9 @@ function createNodeWebSocketDevtoolsSink(options) {
|
|
|
457
462
|
};
|
|
458
463
|
send({
|
|
459
464
|
type: "hello",
|
|
465
|
+
protocolVersion: SYNCORE_DEVTOOLS_PROTOCOL_VERSION,
|
|
466
|
+
minSupportedProtocolVersion: SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,
|
|
467
|
+
maxSupportedProtocolVersion: SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,
|
|
460
468
|
runtimeId: event.runtimeId,
|
|
461
469
|
platform: event.platform,
|
|
462
470
|
...options.appName ? { appName: options.appName } : {},
|
|
@@ -474,7 +482,7 @@ function createNodeWebSocketDevtoolsSink(options) {
|
|
|
474
482
|
});
|
|
475
483
|
},
|
|
476
484
|
attachRuntime(runtime) {
|
|
477
|
-
getSummary = () => withRuntimeSummaryMeta(runtime.getRuntimeSummary(), options);
|
|
485
|
+
getSummary = () => withRuntimeSummaryMeta(runtime.getAdmin().getRuntimeSummary(), options);
|
|
478
486
|
},
|
|
479
487
|
attachCommandHandler(handler) {
|
|
480
488
|
onCommand = handler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["createNodeRequire"],"sources":["../src/index.ts"],"sourcesContent":["import {\n mkdir,\n readdir,\n readFile,\n rm,\n stat,\n writeFile\n} from \"node:fs/promises\";\nimport { createRequire as createNodeRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { DatabaseSync, type SQLInputValue } from \"node:sqlite\";\nimport WebSocket from \"ws\";\nimport type {\n SyncoreDevtoolsClientMessage,\n SyncoreDevtoolsMessage,\n SyncoreRuntimeSummary\n} from \"@syncore/devtools-protocol\";\nimport {\n type AnySyncoreSchema,\n createDevtoolsCommandHandler,\n createDevtoolsSubscriptionHost,\n type DevtoolsSqlAnalysis,\n type DevtoolsCommandHandler,\n type DevtoolsSqlMode,\n type DevtoolsSqlReadResult,\n type DevtoolsSqlSupport,\n type DevtoolsSink,\n type DevtoolsSubscriptionHost,\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 SyncoreActiveQueryInfo,\n SyncoreDevtoolsEvent,\n SyncoreRuntimeSummary\n} from \"@syncore/devtools-protocol\";\n\nexport type NodeSyncoreSchema = AnySyncoreSchema;\n\nconst nodeRequire = createNodeRequire(import.meta.url);\nconst { Parser: NodeSqlParser } = nodeRequire(\"node-sql-parser\") as {\n Parser: new () => {\n astify(sql: string, options?: { database?: string }): unknown;\n };\n};\nconst nodeSqlParser = new NodeSqlParser();\n\ntype SqlAst = {\n type: string;\n from?: Array<{ table?: string; expr?: { ast?: SqlAst } }>;\n table?: Array<{ table?: string }> | { table?: string } | null | string;\n};\n\nconst nodeDevtoolsSqlSupport: DevtoolsSqlSupport = {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis {\n const ast = nodeSqlParser.astify(query, {\n database: \"sqlite\"\n }) as SqlAst | SqlAst[];\n if (Array.isArray(ast)) {\n throw new Error(\"Only a single SQL statement is supported.\");\n }\n\n switch (ast.type) {\n case \"select\":\n return buildReadAnalysis(ast);\n case \"update\":\n case \"delete\":\n case \"insert\":\n case \"replace\":\n return buildWriteAnalysis(extractTables(ast.table), false);\n case \"create\":\n case \"drop\":\n case \"alter\":\n return buildWriteAnalysis(extractTables(ast.table), true);\n default:\n throw new Error(`Unsupported SQL statement type: ${String(ast.type)}`);\n }\n },\n ensureSqlMode(\n analysis: DevtoolsSqlAnalysis,\n expected: DevtoolsSqlMode | \"watch\"\n ): void {\n if (expected === \"watch\") {\n if (analysis.mode !== \"read\") {\n throw new Error(\"Live mode supports read-only SQL only.\");\n }\n return;\n }\n\n if (analysis.mode !== expected) {\n if (expected === \"read\") {\n throw new Error(\"Use SQL Write for mutating statements.\");\n }\n throw new Error(\"Use SQL Read or SQL Live for read-only statements.\");\n }\n },\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult {\n const analysis = this.analyzeSqlStatement(query);\n this.ensureSqlMode(analysis, \"read\");\n\n const database = new DatabaseSync(databasePath, { readOnly: true });\n try {\n const statement = database.prepare(query);\n const rows = statement.all() as Array<Record<string, unknown>>;\n const columnsMeta = statement.columns();\n const columns = columnsMeta.map((column) => column.name);\n const observedTables = Array.from(\n new Set(\n columnsMeta\n .map((column) => column.table)\n .filter((table): table is string => typeof table === \"string\")\n )\n );\n\n return {\n columns,\n rows: rows.map((row) => columns.map((column) => row[column])),\n observedTables:\n observedTables.length > 0 ? observedTables : analysis.readTables\n };\n } finally {\n database.close();\n }\n }\n};\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 buildReadAnalysis(ast: SqlAst): DevtoolsSqlAnalysis {\n const readTables = Array.from(new Set(extractReadTables(ast)));\n return {\n mode: \"read\",\n readTables,\n writeTables: [],\n schemaChanged: false,\n observedScopes:\n readTables.length > 0\n ? readTables.map((table) => `table:${table}` as const)\n : [\"all\"]\n };\n}\n\nfunction buildWriteAnalysis(\n tables: string[],\n schemaChanged: boolean\n): DevtoolsSqlAnalysis {\n const uniqueTables = Array.from(new Set(tables));\n return {\n mode: schemaChanged ? \"ddl\" : \"write\",\n readTables: [],\n writeTables: uniqueTables,\n schemaChanged,\n observedScopes: schemaChanged\n ? [\n \"schema.tables\",\n ...uniqueTables.map((table) => `table:${table}` as const)\n ]\n : uniqueTables.length > 0\n ? uniqueTables.map((table) => `table:${table}` as const)\n : [\"all\"]\n };\n}\n\nfunction extractReadTables(ast: SqlAst): string[] {\n return (ast.from ?? [])\n .flatMap((entry) => {\n if (entry.table) {\n return [entry.table];\n }\n if (entry.expr?.ast) {\n return extractReadTables(entry.expr.ast);\n }\n return [];\n })\n .filter((table) => table !== \"dual\");\n}\n\nfunction extractTables(table: SqlAst[\"table\"]): string[] {\n if (Array.isArray(table)) {\n return table\n .map((entry) => entry?.table)\n .filter((value): value is string => typeof value === \"string\");\n }\n if (table && typeof table === \"object\") {\n return typeof table.table === \"string\" ? [table.table] : [];\n }\n if (typeof table === \"string\") {\n return [table];\n }\n return [];\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 targetKind: \"client\",\n storageProtocol: \"file\",\n databaseLabel: path.basename(options.databasePath),\n storageIdentity: `file::${path.resolve(options.databasePath)}`\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);\n if (websocketDevtools) {\n websocketDevtools.attachCommandHandler(\n createDevtoolsCommandHandler({\n driver: runtimeOptions.driver,\n schema: options.schema,\n functions: options.functions,\n runtime,\n sql: nodeDevtoolsSqlSupport\n })\n );\n websocketDevtools.attachSubscriptionHost(\n createDevtoolsSubscriptionHost({\n driver: runtimeOptions.driver,\n schema: options.schema,\n functions: options.functions,\n runtime,\n sql: nodeDevtoolsSqlSupport\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 targetKind?: \"client\" | \"project\";\n storageProtocol?: string;\n databaseLabel?: string;\n storageIdentity?: string;\n}\n\nexport interface NodeWebSocketDevtoolsSink extends DevtoolsSink {\n attachRuntime(runtime: SyncoreRuntime<AnySyncoreSchema>): void;\n attachCommandHandler(handler: DevtoolsCommandHandler): void;\n attachSubscriptionHost(host: DevtoolsSubscriptionHost): 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 getSummary: (() => SyncoreRuntimeSummary) | undefined;\n let onCommand: DevtoolsCommandHandler | undefined;\n let subscriptionHost: DevtoolsSubscriptionHost | 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 ...(options.targetKind ? { targetKind: options.targetKind } : {}),\n ...(options.storageProtocol\n ? { storageProtocol: options.storageProtocol }\n : {}),\n ...(options.databaseLabel ? { databaseLabel: options.databaseLabel } : {}),\n ...(options.storageIdentity\n ? { storageIdentity: options.storageIdentity }\n : {})\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 | SyncoreDevtoolsClientMessage;\n if (message.type === \"ping\") {\n send({ type: \"pong\" });\n } else if (message.type === \"command\" && onCommand) {\n onCommand(message.payload)\n .then((responsePayload) => {\n const runtimeId =\n latestHello?.runtimeId ?? getSummary?.().runtimeId;\n if (!runtimeId) {\n return;\n }\n send({\n type: \"command.result\",\n commandId: message.commandId,\n runtimeId,\n payload: responsePayload\n });\n })\n .catch((err) => {\n const runtimeId =\n latestHello?.runtimeId ?? getSummary?.().runtimeId;\n if (!runtimeId) {\n return;\n }\n send({\n type: \"command.result\",\n commandId: message.commandId,\n runtimeId,\n payload: {\n kind: \"error\",\n message: err instanceof Error ? err.message : \"Unknown error\"\n }\n });\n });\n } else if (message.type === \"subscribe\" && subscriptionHost) {\n void subscriptionHost.subscribe(\n message.subscriptionId,\n message.payload,\n (payload) => {\n const runtimeId =\n latestHello?.runtimeId ?? getSummary?.().runtimeId;\n if (!runtimeId) {\n return;\n }\n send({\n type: \"subscription.data\",\n subscriptionId: message.subscriptionId,\n runtimeId,\n payload\n });\n }\n );\n } else if (message.type === \"unsubscribe\") {\n subscriptionHost?.unsubscribe(message.subscriptionId);\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 ...(options.targetKind ? { targetKind: options.targetKind } : {}),\n ...(options.storageProtocol\n ? { storageProtocol: options.storageProtocol }\n : {}),\n ...(options.databaseLabel ? { databaseLabel: options.databaseLabel } : {}),\n ...(options.storageIdentity\n ? { storageIdentity: options.storageIdentity }\n : {})\n });\n }\n send({\n type: \"event\",\n event\n });\n },\n attachRuntime(runtime) {\n getSummary = () =>\n withRuntimeSummaryMeta(runtime.getRuntimeSummary(), options);\n },\n attachCommandHandler(handler) {\n onCommand = handler;\n },\n attachSubscriptionHost(host) {\n subscriptionHost = host;\n },\n dispose() {\n disposed = true;\n if (connectTimer) {\n clearTimeout(connectTimer);\n }\n subscriptionHost?.dispose();\n socket?.close();\n }\n };\n}\n\nfunction withRuntimeSummaryMeta(\n summary: SyncoreRuntimeSummary,\n options: NodeWebSocketDevtoolsSinkOptions\n): SyncoreRuntimeSummary {\n return {\n ...summary,\n ...(options.appName ? { appName: options.appName } : {}),\n ...(options.origin ? { origin: options.origin } : {}),\n ...(options.sessionLabel ? { sessionLabel: options.sessionLabel } : {}),\n ...(options.targetKind ? { targetKind: options.targetKind } : {}),\n ...(options.storageProtocol\n ? { storageProtocol: options.storageProtocol }\n : {}),\n ...(options.databaseLabel ? { databaseLabel: options.databaseLabel } : {}),\n ...(options.storageIdentity\n ? { storageIdentity: options.storageIdentity }\n : {})\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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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createNodeRequire"],"sources":["../src/index.ts"],"sourcesContent":["import {\n mkdir,\n readdir,\n readFile,\n rm,\n stat,\n writeFile\n} from \"node:fs/promises\";\nimport { createRequire as createNodeRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { DatabaseSync, type SQLInputValue } from \"node:sqlite\";\nimport WebSocket from \"ws\";\nimport {\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,\n SYNCORE_DEVTOOLS_PROTOCOL_VERSION,\n} from \"@syncore/devtools-protocol\";\nimport type {\n SyncoreDevtoolsClientMessage,\n SyncoreDevtoolsMessage,\n SyncoreRuntimeSummary\n} from \"@syncore/devtools-protocol\";\nimport {\n createDevtoolsCommandHandler,\n createDevtoolsSubscriptionHost,\n type DevtoolsSqlAnalysis,\n type DevtoolsCommandHandler,\n type DevtoolsSqlMode,\n type DevtoolsSqlReadResult,\n type DevtoolsSqlSupport,\n type DevtoolsSink,\n type DevtoolsSubscriptionHost,\n type SchedulerOptions,\n type StorageObject,\n type StorageWriteInput,\n type SyncoreCapabilities,\n type SyncoreDataModel,\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 SyncoreActiveQueryInfo,\n SyncoreDevtoolsEvent,\n SyncoreRuntimeSummary\n} from \"@syncore/devtools-protocol\";\n\nexport type NodeSyncoreSchema<\n TSchema extends SyncoreDataModel = SyncoreDataModel\n> = TSchema;\n\nconst nodeRequire = createNodeRequire(import.meta.url);\nconst { Parser: NodeSqlParser } = nodeRequire(\"node-sql-parser\") as {\n Parser: new () => {\n astify(sql: string, options?: { database?: string }): unknown;\n };\n};\nconst nodeSqlParser = new NodeSqlParser();\n\ntype SqlAst = {\n type: string;\n from?: Array<{ table?: string; expr?: { ast?: SqlAst } }>;\n table?: Array<{ table?: string }> | { table?: string } | null | string;\n};\n\nconst nodeDevtoolsSqlSupport: DevtoolsSqlSupport = {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis {\n const ast = nodeSqlParser.astify(query, {\n database: \"sqlite\"\n }) as SqlAst | SqlAst[];\n if (Array.isArray(ast)) {\n throw new Error(\"Only a single SQL statement is supported.\");\n }\n\n switch (ast.type) {\n case \"select\":\n return buildReadAnalysis(ast);\n case \"update\":\n case \"delete\":\n case \"insert\":\n case \"replace\":\n return buildWriteAnalysis(extractTables(ast.table), false);\n case \"create\":\n case \"drop\":\n case \"alter\":\n return buildWriteAnalysis(extractTables(ast.table), true);\n default:\n throw new Error(`Unsupported SQL statement type: ${String(ast.type)}`);\n }\n },\n ensureSqlMode(\n analysis: DevtoolsSqlAnalysis,\n expected: DevtoolsSqlMode | \"watch\"\n ): void {\n if (expected === \"watch\") {\n if (analysis.mode !== \"read\") {\n throw new Error(\"Live mode supports read-only SQL only.\");\n }\n return;\n }\n\n if (analysis.mode !== expected) {\n if (expected === \"read\") {\n throw new Error(\"Use SQL Write for mutating statements.\");\n }\n throw new Error(\"Use SQL Read or SQL Live for read-only statements.\");\n }\n },\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult {\n const analysis = this.analyzeSqlStatement(query);\n this.ensureSqlMode(analysis, \"read\");\n\n const database = new DatabaseSync(databasePath, { readOnly: true });\n try {\n const statement = database.prepare(query);\n const rows = statement.all() as Array<Record<string, unknown>>;\n const columnsMeta = statement.columns();\n const columns = columnsMeta.map((column) => column.name);\n const observedTables = Array.from(\n new Set(\n columnsMeta\n .map((column) => column.table)\n .filter((table): table is string => typeof table === \"string\")\n )\n );\n\n return {\n columns,\n rows: rows.map((row) => columns.map((column) => row[column])),\n observedTables:\n observedTables.length > 0 ? observedTables : analysis.readTables\n };\n } finally {\n database.close();\n }\n }\n};\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 buildReadAnalysis(ast: SqlAst): DevtoolsSqlAnalysis {\n const readTables = Array.from(new Set(extractReadTables(ast)));\n return {\n mode: \"read\",\n readTables,\n writeTables: [],\n schemaChanged: false,\n observedScopes:\n readTables.length > 0\n ? readTables.map((table) => `table:${table}` as const)\n : [\"all\"]\n };\n}\n\nfunction buildWriteAnalysis(\n tables: string[],\n schemaChanged: boolean\n): DevtoolsSqlAnalysis {\n const uniqueTables = Array.from(new Set(tables));\n return {\n mode: schemaChanged ? \"ddl\" : \"write\",\n readTables: [],\n writeTables: uniqueTables,\n schemaChanged,\n observedScopes: schemaChanged\n ? [\n \"schema.tables\",\n ...uniqueTables.map((table) => `table:${table}` as const)\n ]\n : uniqueTables.length > 0\n ? uniqueTables.map((table) => `table:${table}` as const)\n : [\"all\"]\n };\n}\n\nfunction extractReadTables(ast: SqlAst): string[] {\n return (ast.from ?? [])\n .flatMap((entry) => {\n if (entry.table) {\n return [entry.table];\n }\n if (entry.expr?.ast) {\n return extractReadTables(entry.expr.ast);\n }\n return [];\n })\n .filter((table) => table !== \"dual\");\n}\n\nfunction extractTables(table: SqlAst[\"table\"]): string[] {\n if (Array.isArray(table)) {\n return table\n .map((entry) => entry?.table)\n .filter((value): value is string => typeof value === \"string\");\n }\n if (table && typeof table === \"object\") {\n return typeof table.table === \"string\" ? [table.table] : [];\n }\n if (typeof table === \"string\") {\n return [table];\n }\n return [];\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 TSchema extends NodeSyncoreSchema = NodeSyncoreSchema\n> {\n databasePath: string;\n storageDirectory: string;\n schema: TSchema;\n functions: SyncoreRuntimeOptions<TSchema>[\"functions\"];\n components?: SyncoreRuntimeOptions<TSchema>[\"components\"];\n capabilities?: SyncoreCapabilities;\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<\n TSchema extends NodeSyncoreSchema = NodeSyncoreSchema\n> = CreateNodeRuntimeOptions<TSchema>;\n\n/**\n * A started local Node runtime paired with its client and a dispose helper.\n */\nexport interface ManagedNodeSyncoreClient<\n TSchema extends NodeSyncoreSchema = NodeSyncoreSchema\n> {\n runtime: SyncoreRuntime<TSchema>;\n client: ReturnType<SyncoreRuntime<TSchema>[\"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: { sender: unknown }, message: unknown) => void\n ): void;\n off(\n channel: string,\n listener: (event: { sender: 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 TSchema extends NodeSyncoreSchema\n>(\n options: CreateNodeRuntimeOptions<TSchema>\n): SyncoreRuntime<TSchema> {\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 targetKind: \"client\",\n storageProtocol: \"file\",\n databaseLabel: path.basename(options.databasePath),\n storageIdentity: `file::${path.resolve(options.databasePath)}`\n })\n : undefined;\n const runtimeOptions: SyncoreRuntimeOptions<TSchema> = {\n schema: options.schema,\n functions: options.functions,\n ...(options.components ? { components: options.components } : {}),\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 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);\n if (websocketDevtools) {\n websocketDevtools.attachCommandHandler(\n createDevtoolsCommandHandler({\n driver: runtimeOptions.driver,\n schema: options.schema,\n functions: options.functions,\n admin: runtime.getAdmin(),\n sql: nodeDevtoolsSqlSupport\n })\n );\n websocketDevtools.attachSubscriptionHost(\n createDevtoolsSubscriptionHost({\n driver: runtimeOptions.driver,\n schema: options.schema,\n functions: options.functions,\n admin: runtime.getAdmin(),\n sql: nodeDevtoolsSqlSupport\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 TSchema extends NodeSyncoreSchema\n>(runtime: SyncoreRuntime<TSchema>) {\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 TSchema extends NodeSyncoreSchema\n>(\n options: WithNodeSyncoreClientOptions<TSchema>\n): Promise<ManagedNodeSyncoreClient<TSchema>> {\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<\n TSchema extends NodeSyncoreSchema,\n TResult\n>(\n options: WithNodeSyncoreClientOptions<TSchema>,\n callback: (\n client: ReturnType<SyncoreRuntime<TSchema>[\"createClient\"]>,\n runtime: SyncoreRuntime<TSchema>\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 = (\n event: { sender: unknown },\n message: unknown\n ) => {\n if (event.sender !== options.window.webContents) {\n return;\n }\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 targetKind?: \"client\" | \"project\";\n storageProtocol?: string;\n databaseLabel?: string;\n storageIdentity?: string;\n}\n\nexport interface NodeWebSocketDevtoolsSink extends DevtoolsSink {\n attachRuntime(runtime: SyncoreRuntime<NodeSyncoreSchema>): void;\n attachCommandHandler(handler: DevtoolsCommandHandler): void;\n attachSubscriptionHost(host: DevtoolsSubscriptionHost): 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 getSummary: (() => SyncoreRuntimeSummary) | undefined;\n let onCommand: DevtoolsCommandHandler | undefined;\n let subscriptionHost: DevtoolsSubscriptionHost | 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 protocolVersion: SYNCORE_DEVTOOLS_PROTOCOL_VERSION,\n minSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,\n maxSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,\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 ...(options.targetKind ? { targetKind: options.targetKind } : {}),\n ...(options.storageProtocol\n ? { storageProtocol: options.storageProtocol }\n : {}),\n ...(options.databaseLabel ? { databaseLabel: options.databaseLabel } : {}),\n ...(options.storageIdentity\n ? { storageIdentity: options.storageIdentity }\n : {})\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 | SyncoreDevtoolsClientMessage;\n if (message.type === \"ping\") {\n send({ type: \"pong\" });\n } else if (message.type === \"command\" && onCommand) {\n onCommand(message.payload)\n .then((responsePayload) => {\n const runtimeId =\n latestHello?.runtimeId ?? getSummary?.().runtimeId;\n if (!runtimeId) {\n return;\n }\n send({\n type: \"command.result\",\n commandId: message.commandId,\n runtimeId,\n payload: responsePayload\n });\n })\n .catch((err) => {\n const runtimeId =\n latestHello?.runtimeId ?? getSummary?.().runtimeId;\n if (!runtimeId) {\n return;\n }\n send({\n type: \"command.result\",\n commandId: message.commandId,\n runtimeId,\n payload: {\n kind: \"error\",\n message: err instanceof Error ? err.message : \"Unknown error\"\n }\n });\n });\n } else if (message.type === \"subscribe\" && subscriptionHost) {\n void subscriptionHost.subscribe(\n message.subscriptionId,\n message.payload,\n (payload) => {\n const runtimeId =\n latestHello?.runtimeId ?? getSummary?.().runtimeId;\n if (!runtimeId) {\n return;\n }\n send({\n type: \"subscription.data\",\n subscriptionId: message.subscriptionId,\n runtimeId,\n payload\n });\n }\n );\n } else if (message.type === \"unsubscribe\") {\n subscriptionHost?.unsubscribe(message.subscriptionId);\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 protocolVersion: SYNCORE_DEVTOOLS_PROTOCOL_VERSION,\n minSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,\n maxSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,\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 ...(options.targetKind ? { targetKind: options.targetKind } : {}),\n ...(options.storageProtocol\n ? { storageProtocol: options.storageProtocol }\n : {}),\n ...(options.databaseLabel ? { databaseLabel: options.databaseLabel } : {}),\n ...(options.storageIdentity\n ? { storageIdentity: options.storageIdentity }\n : {})\n });\n }\n send({\n type: \"event\",\n event\n });\n },\n attachRuntime(runtime) {\n getSummary = () =>\n withRuntimeSummaryMeta(runtime.getAdmin().getRuntimeSummary(), options);\n },\n attachCommandHandler(handler) {\n onCommand = handler;\n },\n attachSubscriptionHost(host) {\n subscriptionHost = host;\n },\n dispose() {\n disposed = true;\n if (connectTimer) {\n clearTimeout(connectTimer);\n }\n subscriptionHost?.dispose();\n socket?.close();\n }\n };\n}\n\nfunction withRuntimeSummaryMeta(\n summary: SyncoreRuntimeSummary,\n options: NodeWebSocketDevtoolsSinkOptions\n): SyncoreRuntimeSummary {\n return {\n ...summary,\n ...(options.appName ? { appName: options.appName } : {}),\n ...(options.origin ? { origin: options.origin } : {}),\n ...(options.sessionLabel ? { sessionLabel: options.sessionLabel } : {}),\n ...(options.targetKind ? { targetKind: options.targetKind } : {}),\n ...(options.storageProtocol\n ? { storageProtocol: options.storageProtocol }\n : {}),\n ...(options.databaseLabel ? { databaseLabel: options.databaseLabel } : {}),\n ...(options.storageIdentity\n ? { storageIdentity: options.storageIdentity }\n : {})\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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc-react.d.mts","names":[],"sources":["../src/ipc-react.tsx"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"ipc-react.d.mts","names":[],"sources":["../src/ipc-react.tsx"],"mappings":";;;;;AASA;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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createRendererSyncoreWindowClient } from "./ipc.mjs";
|
|
2
|
+
import { createUnavailableSyncoreClient } from "../core/index.mjs";
|
|
2
3
|
import { useEffect, useMemo } from "react";
|
|
3
4
|
import { SyncoreProvider } from "../react/index.js";
|
|
4
5
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -8,8 +9,20 @@ import { jsx } from "react/jsx-runtime";
|
|
|
8
9
|
*/
|
|
9
10
|
function SyncoreElectronProvider({ children, bridgeName, windowObject }) {
|
|
10
11
|
const resolvedWindow = windowObject ?? window;
|
|
11
|
-
const client = useMemo(() =>
|
|
12
|
-
|
|
12
|
+
const client = useMemo(() => {
|
|
13
|
+
try {
|
|
14
|
+
return createRendererSyncoreWindowClient(resolvedWindow, bridgeName ?? "syncoreBridge");
|
|
15
|
+
} catch (error) {
|
|
16
|
+
return createUnavailableSyncoreClient({
|
|
17
|
+
kind: "unavailable",
|
|
18
|
+
reason: "ipc-unavailable",
|
|
19
|
+
...error instanceof Error ? { error } : {}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}, [bridgeName, resolvedWindow]);
|
|
23
|
+
useEffect(() => () => {
|
|
24
|
+
if ("dispose" in client && typeof client.dispose === "function") client.dispose();
|
|
25
|
+
}, [client]);
|
|
13
26
|
return /* @__PURE__ */ jsx(SyncoreProvider, {
|
|
14
27
|
client,
|
|
15
28
|
children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc-react.mjs","names":[],"sources":["../src/ipc-react.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { SyncoreProvider } from \"@syncore/react\";\nimport { createRendererSyncoreWindowClient } from \"./ipc.js\";\n\n/**\n * Props for {@link SyncoreElectronProvider}.\n */\nexport interface SyncoreElectronProviderProps {\n /** The React subtree that should receive the renderer Syncore client. */\n children: ReactNode;\n\n /** Optional custom bridge name exposed on `window`. */\n bridgeName?: string;\n\n /** Optional window-like object for tests or custom shells. */\n windowObject?: Window & typeof globalThis;\n}\n\n/**\n * Create a renderer Syncore client from `window.syncoreBridge` and provide it to React.\n */\nexport function SyncoreElectronProvider({\n children,\n bridgeName,\n windowObject\n}: SyncoreElectronProviderProps): ReactNode {\n const resolvedWindow = windowObject ?? window;\n const client = useMemo(\n ()
|
|
1
|
+
{"version":3,"file":"ipc-react.mjs","names":[],"sources":["../src/ipc-react.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createUnavailableSyncoreClient } from \"@syncore/core\";\nimport { SyncoreProvider } from \"@syncore/react\";\nimport { createRendererSyncoreWindowClient } from \"./ipc.js\";\n\n/**\n * Props for {@link SyncoreElectronProvider}.\n */\nexport interface SyncoreElectronProviderProps {\n /** The React subtree that should receive the renderer Syncore client. */\n children: ReactNode;\n\n /** Optional custom bridge name exposed on `window`. */\n bridgeName?: string;\n\n /** Optional window-like object for tests or custom shells. */\n windowObject?: Window & typeof globalThis;\n}\n\n/**\n * Create a renderer Syncore client from `window.syncoreBridge` and provide it to React.\n */\nexport function SyncoreElectronProvider({\n children,\n bridgeName,\n windowObject\n}: SyncoreElectronProviderProps): ReactNode {\n const resolvedWindow = windowObject ?? window;\n const client = useMemo(\n () => {\n try {\n return createRendererSyncoreWindowClient(\n resolvedWindow,\n bridgeName ?? \"syncoreBridge\"\n );\n } catch (error) {\n return createUnavailableSyncoreClient({\n kind: \"unavailable\",\n reason: \"ipc-unavailable\",\n ...(error instanceof Error ? { error } : {})\n });\n }\n },\n [bridgeName, resolvedWindow]\n );\n\n useEffect(\n () => () => {\n if (\"dispose\" in client && typeof client.dispose === \"function\") {\n client.dispose();\n }\n },\n [client]\n );\n\n return <SyncoreProvider client={client}>{children}</SyncoreProvider>;\n}\n"],"mappings":";;;;;;;;;AAuBA,SAAgB,wBAAwB,EACtC,UACA,YACA,gBAC0C;CAC1C,MAAM,iBAAiB,gBAAgB;CACvC,MAAM,SAAS,cACP;AACJ,MAAI;AACF,UAAO,kCACL,gBACA,cAAc,gBACf;WACM,OAAO;AACd,UAAO,+BAA+B;IACpC,MAAM;IACN,QAAQ;IACR,GAAI,iBAAiB,QAAQ,EAAE,OAAO,GAAG,EAAE;IAC5C,CAAC;;IAGN,CAAC,YAAY,eAAe,CAC7B;AAED,uBACc;AACV,MAAI,aAAa,UAAU,OAAO,OAAO,YAAY,WACnD,QAAO,SAAS;IAGpB,CAAC,OAAO,CACT;AAED,QAAO,oBAAC,iBAAD;EAAyB;EAAS;EAA2B,CAAA"}
|
|
@@ -1,37 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AttachRuntimeBridgeOptions, AttachedRuntimeBridge, BridgeQueryWatch, SyncoreBridgeClient, SyncoreBridgeMessageEndpoint, SyncoreDataModel } from "../core/index.d.mts";
|
|
2
2
|
|
|
3
3
|
//#region src/ipc.d.ts
|
|
4
|
-
type NodeIpcSyncoreSchema =
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
};
|
|
13
|
-
type OptionalArgsTuple<TArgs> = Record<never, never> extends TArgs ? [args?: TArgs] : [args: TArgs];
|
|
14
|
-
declare class SyncoreRendererClient implements SyncoreClient {
|
|
15
|
-
private readonly endpoint;
|
|
16
|
-
private readonly pendingRequests;
|
|
17
|
-
private readonly watchRecordsByKey;
|
|
18
|
-
private readonly watchKeyBySubscriptionId;
|
|
19
|
-
private disposed;
|
|
20
|
-
private readonly handleMessage;
|
|
21
|
-
constructor(endpoint: SyncoreIpcMessageEndpoint);
|
|
22
|
-
query<TArgs, TResult>(reference: FunctionReference<"query", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): Promise<TResult>;
|
|
23
|
-
mutation<TArgs, TResult>(reference: FunctionReference<"mutation", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): Promise<TResult>;
|
|
24
|
-
action<TArgs, TResult>(reference: FunctionReference<"action", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): Promise<TResult>;
|
|
25
|
-
watchQuery<TArgs, TResult>(reference: FunctionReference<"query", TArgs, TResult>, ...args: OptionalArgsTuple<TArgs>): RendererQueryWatch<TResult>;
|
|
26
|
-
dispose(): void;
|
|
27
|
-
private invoke;
|
|
28
|
-
private rejectAllPending;
|
|
29
|
-
private ensureNotDisposed;
|
|
30
|
-
}
|
|
31
|
-
interface AttachNodeIpcRuntimeOptions {
|
|
32
|
-
endpoint: SyncoreIpcMessageEndpoint;
|
|
33
|
-
createRuntime: (() => Promise<SyncoreRuntime<NodeIpcSyncoreSchema>>) | (() => SyncoreRuntime<NodeIpcSyncoreSchema>);
|
|
4
|
+
type NodeIpcSyncoreSchema<TSchema extends SyncoreDataModel = SyncoreDataModel> = TSchema;
|
|
5
|
+
type SyncoreIpcMessageEndpoint = SyncoreBridgeMessageEndpoint;
|
|
6
|
+
type RendererQueryWatch<TValue> = BridgeQueryWatch<TValue>;
|
|
7
|
+
declare class SyncoreRendererClient extends SyncoreBridgeClient {
|
|
8
|
+
query: SyncoreBridgeClient["query"];
|
|
9
|
+
mutation: SyncoreBridgeClient["mutation"];
|
|
10
|
+
action: SyncoreBridgeClient["action"];
|
|
11
|
+
watchQuery: SyncoreBridgeClient["watchQuery"];
|
|
34
12
|
}
|
|
13
|
+
type AttachNodeIpcRuntimeOptions<TSchema extends NodeIpcSyncoreSchema = NodeIpcSyncoreSchema> = AttachRuntimeBridgeOptions<TSchema>;
|
|
14
|
+
type AttachedNodeIpcRuntime = AttachedRuntimeBridge;
|
|
35
15
|
interface SyncoreRendererBridge {
|
|
36
16
|
postMessage(message: unknown): void;
|
|
37
17
|
onMessage(listener: (message: unknown) => void): () => void;
|
|
@@ -50,10 +30,6 @@ interface SyncoreMainProcessBridge {
|
|
|
50
30
|
declare function installSyncoreWindowBridge(options?: {
|
|
51
31
|
bridgeName?: string;
|
|
52
32
|
}): string;
|
|
53
|
-
interface AttachedNodeIpcRuntime {
|
|
54
|
-
ready: Promise<void>;
|
|
55
|
-
dispose(): Promise<void>;
|
|
56
|
-
}
|
|
57
33
|
/**
|
|
58
34
|
* Create a renderer client from a low-level IPC message endpoint.
|
|
59
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc.d.mts","names":[],"sources":["../src/ipc.ts"],"mappings":";;;KAUY,oBAAA,
|
|
1
|
+
{"version":3,"file":"ipc.d.mts","names":[],"sources":["../src/ipc.ts"],"mappings":";;;KAUY,oBAAA,iBACM,gBAAA,GAAmB,gBAAA,IACjC,OAAA;AAAA,KACQ,yBAAA,GAA4B,4BAAA;AAAA,KAC5B,kBAAA,WAA6B,gBAAA,CAAiB,MAAA;AAAA,cAE7C,qBAAA,SAA8B,mBAAA;EACjC,KAAA,EAAO,mBAAA;EACP,QAAA,EAAU,mBAAA;EACV,MAAA,EAAQ,mBAAA;EACR,UAAA,EAAY,mBAAA;AAAA;AAAA,KAGV,2BAAA,iBACM,oBAAA,GAAuB,oBAAA,IACrC,0BAAA,CAA2B,OAAA;AAAA,KACnB,sBAAA,GAAyB,qBAAA;AAAA,UAEpB,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;;AA/BF;;iBAuCgB,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"}
|