syncorejs 0.1.0 → 0.2.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.
- package/dist/{core/src/cli.d.ts → _vendor/cli/app.d.mts} +4 -2
- package/dist/_vendor/cli/app.d.mts.map +1 -0
- package/dist/_vendor/cli/app.mjs +997 -0
- package/dist/_vendor/cli/app.mjs.map +1 -0
- package/dist/_vendor/cli/context.mjs +180 -0
- package/dist/_vendor/cli/context.mjs.map +1 -0
- package/dist/_vendor/cli/dev-session.mjs +49 -0
- package/dist/_vendor/cli/dev-session.mjs.map +1 -0
- package/dist/_vendor/cli/doctor.mjs +80 -0
- package/dist/_vendor/cli/doctor.mjs.map +1 -0
- package/dist/_vendor/cli/errors.mjs +22 -0
- package/dist/_vendor/cli/errors.mjs.map +1 -0
- package/dist/_vendor/cli/help.mjs +26 -0
- package/dist/_vendor/cli/help.mjs.map +1 -0
- package/dist/_vendor/cli/index.d.mts +2 -0
- package/dist/_vendor/cli/index.mjs +23 -0
- package/dist/_vendor/cli/index.mjs.map +1 -0
- package/dist/_vendor/cli/messages.mjs +32 -0
- package/dist/_vendor/cli/messages.mjs.map +1 -0
- package/dist/_vendor/cli/preflight.mjs +35 -0
- package/dist/_vendor/cli/preflight.mjs.map +1 -0
- package/dist/_vendor/cli/project.mjs +583 -0
- package/dist/_vendor/cli/project.mjs.map +1 -0
- package/dist/_vendor/cli/render.mjs +133 -0
- package/dist/_vendor/cli/render.mjs.map +1 -0
- package/dist/_vendor/cli/targets.mjs +87 -0
- package/dist/_vendor/cli/targets.mjs.map +1 -0
- package/dist/_vendor/core/cli.d.mts +59 -1
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +528 -75
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/index.d.mts +12 -4
- package/dist/_vendor/core/index.d.mts.map +1 -0
- package/dist/_vendor/core/index.mjs +4 -3
- package/dist/_vendor/core/index.mjs.map +1 -1
- package/dist/_vendor/core/runtime/devtools.d.mts +32 -6
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +397 -182
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/runtime.d.mts +89 -7
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs +303 -32
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/devtools-protocol/index.d.ts +189 -82
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js +39 -0
- package/dist/_vendor/devtools-protocol/index.js.map +1 -0
- package/dist/_vendor/next/config.d.ts.map +1 -1
- package/dist/_vendor/next/config.js +2 -5
- package/dist/_vendor/next/config.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +15 -5
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +33 -3
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-expo/react.js.map +1 -1
- package/dist/_vendor/platform-node/index.d.mts +10 -5
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +145 -35
- package/dist/_vendor/platform-node/index.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +39 -0
- package/dist/_vendor/platform-web/external-change.d.ts.map +1 -0
- package/dist/_vendor/platform-web/external-change.js +61 -0
- package/dist/_vendor/platform-web/external-change.js.map +1 -0
- package/dist/_vendor/platform-web/index.d.ts +27 -5
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +310 -44
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
- package/dist/_vendor/platform-web/opfs.js.map +1 -1
- package/dist/_vendor/platform-web/persistence.js.map +1 -1
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/platform-web/sqljs.js +22 -2
- package/dist/_vendor/platform-web/sqljs.js.map +1 -1
- package/dist/_vendor/schema/definition.js.map +1 -1
- package/dist/_vendor/schema/planner.js.map +1 -1
- package/dist/_vendor/schema/validators.js.map +1 -1
- package/dist/browser-react.d.ts +1 -1
- package/dist/browser-react.js +1 -1
- package/dist/browser.d.ts +6 -7
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +4 -5
- package/dist/browser.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +12 -3
- package/dist/cli.js.map +1 -1
- package/dist/expo-react.d.ts +1 -1
- package/dist/expo-react.js +1 -1
- package/dist/expo.d.ts +1 -2
- package/dist/expo.js +1 -2
- package/dist/index.d.ts +3 -7
- package/dist/index.js +3 -8
- package/dist/next-config.d.ts +1 -2
- package/dist/next-config.js +1 -2
- package/dist/next.d.ts +1 -3
- package/dist/next.js +1 -3
- package/dist/node-ipc-react.d.ts +1 -1
- package/dist/node-ipc-react.js +1 -1
- package/dist/node-ipc.d.ts +1 -2
- package/dist/node-ipc.js +1 -2
- package/dist/node.d.ts +1 -4
- package/dist/node.js +1 -3
- package/dist/react.d.ts +1 -2
- package/dist/react.js +1 -2
- package/dist/svelte.d.ts +1 -2
- package/dist/svelte.js +1 -2
- package/package.json +6 -3
- package/dist/core/src/cli.d.ts.map +0 -1
- package/dist/core/src/cli.js +0 -1196
- package/dist/core/src/cli.js.map +0 -1
- package/dist/core/src/index.js +0 -7
- package/dist/core/src/runtime/devtools.d.ts +0 -7
- package/dist/core/src/runtime/devtools.d.ts.map +0 -1
- package/dist/core/src/runtime/devtools.js +0 -300
- package/dist/core/src/runtime/devtools.js.map +0 -1
- package/dist/core/src/runtime/functions.d.ts +0 -123
- package/dist/core/src/runtime/functions.d.ts.map +0 -1
- package/dist/core/src/runtime/functions.js +0 -71
- package/dist/core/src/runtime/functions.js.map +0 -1
- package/dist/core/src/runtime/id.d.ts +0 -13
- package/dist/core/src/runtime/id.d.ts.map +0 -1
- package/dist/core/src/runtime/id.js +0 -28
- package/dist/core/src/runtime/id.js.map +0 -1
- package/dist/core/src/runtime/runtime.d.ts +0 -371
- package/dist/core/src/runtime/runtime.d.ts.map +0 -1
- package/dist/core/src/runtime/runtime.js +0 -1143
- package/dist/core/src/runtime/runtime.js.map +0 -1
- package/dist/devtools-protocol/src/index.d.ts +0 -201
- package/dist/devtools-protocol/src/index.d.ts.map +0 -1
- package/dist/next/src/config.d.ts +0 -17
- package/dist/next/src/config.d.ts.map +0 -1
- package/dist/next/src/config.js +0 -73
- package/dist/next/src/config.js.map +0 -1
- package/dist/next/src/index.d.ts +0 -80
- package/dist/next/src/index.d.ts.map +0 -1
- package/dist/next/src/index.js +0 -82
- package/dist/next/src/index.js.map +0 -1
- package/dist/platform-expo/src/index.d.ts +0 -96
- package/dist/platform-expo/src/index.d.ts.map +0 -1
- package/dist/platform-expo/src/index.js +0 -198
- package/dist/platform-expo/src/index.js.map +0 -1
- package/dist/platform-expo/src/react.d.ts +0 -26
- package/dist/platform-expo/src/react.d.ts.map +0 -1
- package/dist/platform-expo/src/react.js +0 -30
- package/dist/platform-expo/src/react.js.map +0 -1
- package/dist/platform-node/src/index.d.ts +0 -145
- package/dist/platform-node/src/index.d.ts.map +0 -1
- package/dist/platform-node/src/index.js +0 -407
- package/dist/platform-node/src/index.js.map +0 -1
- package/dist/platform-node/src/ipc-react.d.ts +0 -25
- package/dist/platform-node/src/ipc-react.d.ts.map +0 -1
- package/dist/platform-node/src/ipc-react.js +0 -21
- package/dist/platform-node/src/ipc-react.js.map +0 -1
- package/dist/platform-node/src/ipc.d.ts +0 -76
- package/dist/platform-node/src/ipc.d.ts.map +0 -1
- package/dist/platform-node/src/ipc.js +0 -344
- package/dist/platform-node/src/ipc.js.map +0 -1
- package/dist/platform-web/src/index.d.ts +0 -106
- package/dist/platform-web/src/index.d.ts.map +0 -1
- package/dist/platform-web/src/index.js +0 -311
- package/dist/platform-web/src/index.js.map +0 -1
- package/dist/platform-web/src/indexeddb.js +0 -125
- package/dist/platform-web/src/indexeddb.js.map +0 -1
- package/dist/platform-web/src/opfs.js +0 -146
- package/dist/platform-web/src/opfs.js.map +0 -1
- package/dist/platform-web/src/persistence.d.ts +0 -20
- package/dist/platform-web/src/persistence.d.ts.map +0 -1
- package/dist/platform-web/src/persistence.js +0 -23
- package/dist/platform-web/src/persistence.js.map +0 -1
- package/dist/platform-web/src/react.d.ts +0 -35
- package/dist/platform-web/src/react.d.ts.map +0 -1
- package/dist/platform-web/src/react.js +0 -42
- package/dist/platform-web/src/react.js.map +0 -1
- package/dist/platform-web/src/sqljs.js +0 -133
- package/dist/platform-web/src/sqljs.js.map +0 -1
- package/dist/platform-web/src/worker.d.ts +0 -79
- package/dist/platform-web/src/worker.d.ts.map +0 -1
- package/dist/platform-web/src/worker.js +0 -308
- package/dist/platform-web/src/worker.js.map +0 -1
- package/dist/react/src/index.d.ts +0 -59
- package/dist/react/src/index.d.ts.map +0 -1
- package/dist/react/src/index.js +0 -151
- package/dist/react/src/index.js.map +0 -1
- package/dist/schema/src/definition.d.ts +0 -98
- package/dist/schema/src/definition.d.ts.map +0 -1
- package/dist/schema/src/definition.js +0 -84
- package/dist/schema/src/definition.js.map +0 -1
- package/dist/schema/src/planner.d.ts +0 -42
- package/dist/schema/src/planner.d.ts.map +0 -1
- package/dist/schema/src/planner.js +0 -131
- package/dist/schema/src/planner.js.map +0 -1
- package/dist/schema/src/validators.d.ts +0 -194
- package/dist/schema/src/validators.d.ts.map +0 -1
- package/dist/schema/src/validators.js +0 -158
- package/dist/schema/src/validators.js.map +0 -1
- package/dist/svelte/src/index.d.ts +0 -44
- package/dist/svelte/src/index.d.ts.map +0 -1
- package/dist/svelte/src/index.js +0 -75
- package/dist/svelte/src/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../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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"}
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ipc-react.mjs","names":[],"sources":["../src/ipc-react.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\
|
|
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 () =>\n createRendererSyncoreWindowClient(\n resolvedWindow,\n bridgeName ?? \"syncoreBridge\"\n ),\n [bridgeName, resolvedWindow]\n );\n\n useEffect(() => () => client.dispose(), [client]);\n\n return <SyncoreProvider client={client}>{children}</SyncoreProvider>;\n}\n"],"mappings":";;;;;;;;AAsBA,SAAgB,wBAAwB,EACtC,UACA,YACA,gBAC0C;CAC1C,MAAM,iBAAiB,gBAAgB;CACvC,MAAM,SAAS,cAEX,kCACE,gBACA,cAAc,gBACf,EACH,CAAC,YAAY,eAAe,CAC7B;AAED,uBAAsB,OAAO,SAAS,EAAE,CAAC,OAAO,CAAC;AAEjD,QAAO,oBAAC,iBAAD;EAAyB;EAAS;EAA2B,CAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { SyncoreWebPersistence } from "./persistence.js";
|
|
2
|
+
import { SyncoreExternalChangeApplier, SyncoreExternalChangeEvent, SyncoreExternalChangeSignal } from "../core/index.d.mts";
|
|
3
|
+
import initSqlJs from "sql.js";
|
|
4
|
+
|
|
5
|
+
//#region src/external-change.d.ts
|
|
6
|
+
type SqlJsDatabase = initSqlJs.Database;
|
|
7
|
+
interface BroadcastChannelExternalChangeSignalOptions {
|
|
8
|
+
channelName: string;
|
|
9
|
+
}
|
|
10
|
+
declare class BroadcastChannelExternalChangeSignal implements SyncoreExternalChangeSignal {
|
|
11
|
+
private readonly channel;
|
|
12
|
+
private readonly listeners;
|
|
13
|
+
constructor(options: BroadcastChannelExternalChangeSignalOptions);
|
|
14
|
+
subscribe(listener: (event: SyncoreExternalChangeEvent) => void): () => void;
|
|
15
|
+
publish(event: SyncoreExternalChangeEvent): void;
|
|
16
|
+
close(): void;
|
|
17
|
+
private readonly messageListener;
|
|
18
|
+
}
|
|
19
|
+
interface SqlJsExternalChangeApplierOptions {
|
|
20
|
+
databaseName: string;
|
|
21
|
+
persistence: SyncoreWebPersistence;
|
|
22
|
+
createDatabase: (bytes?: Uint8Array) => SqlJsDatabase;
|
|
23
|
+
replaceDatabase(database: SqlJsDatabase): void;
|
|
24
|
+
}
|
|
25
|
+
declare class SqlJsExternalChangeApplier implements SyncoreExternalChangeApplier {
|
|
26
|
+
private readonly databaseName;
|
|
27
|
+
private readonly persistence;
|
|
28
|
+
private readonly createDatabase;
|
|
29
|
+
private readonly replaceDatabase;
|
|
30
|
+
constructor(options: SqlJsExternalChangeApplierOptions);
|
|
31
|
+
applyExternalChange(event: SyncoreExternalChangeEvent): Promise<{
|
|
32
|
+
databaseChanged: boolean;
|
|
33
|
+
storageChanged: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
declare function createDefaultSyncChannelName(databaseName: string): string;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { BroadcastChannelExternalChangeSignal, BroadcastChannelExternalChangeSignalOptions, SqlJsExternalChangeApplier, SqlJsExternalChangeApplierOptions, createDefaultSyncChannelName };
|
|
39
|
+
//# sourceMappingURL=external-change.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-change.d.ts","names":[],"sources":["../src/external-change.ts"],"mappings":";;;;;KAQK,aAAA,GAAgB,SAAA,CAAU,QAAA;AAAA,UAEd,2CAAA;EACf,WAAA;AAAA;AAAA,cAGW,oCAAA,YAAgD,2BAAA;EAAA,iBAC1C,OAAA;EAAA,iBACA,SAAA;cAIL,OAAA,EAAS,2CAAA;EAOrB,SAAA,CAAU,QAAA,GAAW,KAAA,EAAO,0BAAA;EAO5B,OAAA,CAAQ,KAAA,EAAO,0BAAA;EAIf,KAAA,CAAA;EAAA,iBAKiB,eAAA;AAAA;AAAA,UAUF,iCAAA;EACf,YAAA;EACA,WAAA,EAAa,qBAAA;EACb,cAAA,GAAiB,KAAA,GAAQ,UAAA,KAAe,aAAA;EACxC,eAAA,CAAgB,QAAA,EAAU,aAAA;AAAA;AAAA,cAGf,0BAAA,YAAsC,4BAAA;EAAA,iBAChC,YAAA;EAAA,iBACA,WAAA;EAAA,iBACA,cAAA;EAAA,iBACA,eAAA;cAEL,OAAA,EAAS,iCAAA;EAOf,mBAAA,CAAoB,KAAA,EAAO,0BAAA,GAA0B,OAAA;;;;;iBAe7C,4BAAA,CAA6B,YAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
//#region src/external-change.ts
|
|
2
|
+
var BroadcastChannelExternalChangeSignal = class {
|
|
3
|
+
channel;
|
|
4
|
+
listeners = /* @__PURE__ */ new Set();
|
|
5
|
+
constructor(options) {
|
|
6
|
+
if (typeof BroadcastChannel !== "undefined") {
|
|
7
|
+
this.channel = new BroadcastChannel(options.channelName);
|
|
8
|
+
this.channel.addEventListener("message", this.messageListener);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
subscribe(listener) {
|
|
12
|
+
this.listeners.add(listener);
|
|
13
|
+
return () => {
|
|
14
|
+
this.listeners.delete(listener);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
publish(event) {
|
|
18
|
+
this.channel?.postMessage(event);
|
|
19
|
+
}
|
|
20
|
+
close() {
|
|
21
|
+
this.channel?.removeEventListener("message", this.messageListener);
|
|
22
|
+
this.channel?.close();
|
|
23
|
+
}
|
|
24
|
+
messageListener = (event) => {
|
|
25
|
+
if (!isExternalChangeEvent(event.data)) return;
|
|
26
|
+
for (const listener of this.listeners) listener(event.data);
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
var SqlJsExternalChangeApplier = class {
|
|
30
|
+
databaseName;
|
|
31
|
+
persistence;
|
|
32
|
+
createDatabase;
|
|
33
|
+
replaceDatabase;
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.databaseName = options.databaseName;
|
|
36
|
+
this.persistence = options.persistence;
|
|
37
|
+
this.createDatabase = (bytes) => options.createDatabase(bytes);
|
|
38
|
+
this.replaceDatabase = (database) => options.replaceDatabase(database);
|
|
39
|
+
}
|
|
40
|
+
async applyExternalChange(event) {
|
|
41
|
+
const databaseChanged = event.scope === "database" || event.scope === "all";
|
|
42
|
+
if (databaseChanged) {
|
|
43
|
+
const bytes = await this.persistence.loadDatabase(this.databaseName);
|
|
44
|
+
if (bytes) this.replaceDatabase(this.createDatabase(bytes));
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
databaseChanged,
|
|
48
|
+
storageChanged: event.scope === "storage" || event.scope === "all"
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
function createDefaultSyncChannelName(databaseName) {
|
|
53
|
+
return `syncore:external:${databaseName}`;
|
|
54
|
+
}
|
|
55
|
+
function isExternalChangeEvent(value) {
|
|
56
|
+
return typeof value === "object" && value !== null && "sourceId" in value && "scope" in value && "reason" in value && "timestamp" in value;
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { BroadcastChannelExternalChangeSignal, SqlJsExternalChangeApplier, createDefaultSyncChannelName };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=external-change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-change.js","names":[],"sources":["../src/external-change.ts"],"sourcesContent":["import type {\n SyncoreExternalChangeApplier,\n SyncoreExternalChangeEvent,\n SyncoreExternalChangeSignal\n} from \"@syncore/core\";\nimport type initSqlJs from \"sql.js\";\nimport type { SyncoreWebPersistence } from \"./persistence.js\";\n\ntype SqlJsDatabase = initSqlJs.Database;\n\nexport interface BroadcastChannelExternalChangeSignalOptions {\n channelName: string;\n}\n\nexport class BroadcastChannelExternalChangeSignal implements SyncoreExternalChangeSignal {\n private readonly channel: BroadcastChannel | undefined;\n private readonly listeners = new Set<\n (event: SyncoreExternalChangeEvent) => void\n >();\n\n constructor(options: BroadcastChannelExternalChangeSignalOptions) {\n if (typeof BroadcastChannel !== \"undefined\") {\n this.channel = new BroadcastChannel(options.channelName);\n this.channel.addEventListener(\"message\", this.messageListener);\n }\n }\n\n subscribe(listener: (event: SyncoreExternalChangeEvent) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n publish(event: SyncoreExternalChangeEvent): void {\n this.channel?.postMessage(event);\n }\n\n close(): void {\n this.channel?.removeEventListener(\"message\", this.messageListener);\n this.channel?.close();\n }\n\n private readonly messageListener = (event: MessageEvent<unknown>) => {\n if (!isExternalChangeEvent(event.data)) {\n return;\n }\n for (const listener of this.listeners) {\n listener(event.data);\n }\n };\n}\n\nexport interface SqlJsExternalChangeApplierOptions {\n databaseName: string;\n persistence: SyncoreWebPersistence;\n createDatabase: (bytes?: Uint8Array) => SqlJsDatabase;\n replaceDatabase(database: SqlJsDatabase): void;\n}\n\nexport class SqlJsExternalChangeApplier implements SyncoreExternalChangeApplier {\n private readonly databaseName: string;\n private readonly persistence: SyncoreWebPersistence;\n private readonly createDatabase: (bytes?: Uint8Array) => SqlJsDatabase;\n private readonly replaceDatabase: (database: SqlJsDatabase) => void;\n\n constructor(options: SqlJsExternalChangeApplierOptions) {\n this.databaseName = options.databaseName;\n this.persistence = options.persistence;\n this.createDatabase = (bytes) => options.createDatabase(bytes);\n this.replaceDatabase = (database) => options.replaceDatabase(database);\n }\n\n async applyExternalChange(event: SyncoreExternalChangeEvent) {\n const databaseChanged = event.scope === \"database\" || event.scope === \"all\";\n if (databaseChanged) {\n const bytes = await this.persistence.loadDatabase(this.databaseName);\n if (bytes) {\n this.replaceDatabase(this.createDatabase(bytes));\n }\n }\n return {\n databaseChanged,\n storageChanged: event.scope === \"storage\" || event.scope === \"all\"\n };\n }\n}\n\nexport function createDefaultSyncChannelName(databaseName: string): string {\n return `syncore:external:${databaseName}`;\n}\n\nfunction isExternalChangeEvent(\n value: unknown\n): value is SyncoreExternalChangeEvent {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"sourceId\" in value &&\n \"scope\" in value &&\n \"reason\" in value &&\n \"timestamp\" in value\n );\n}\n"],"mappings":";AAcA,IAAa,uCAAb,MAAyF;CACvF;CACA,4BAA6B,IAAI,KAE9B;CAEH,YAAY,SAAsD;AAChE,MAAI,OAAO,qBAAqB,aAAa;AAC3C,QAAK,UAAU,IAAI,iBAAiB,QAAQ,YAAY;AACxD,QAAK,QAAQ,iBAAiB,WAAW,KAAK,gBAAgB;;;CAIlE,UAAU,UAAmE;AAC3E,OAAK,UAAU,IAAI,SAAS;AAC5B,eAAa;AACX,QAAK,UAAU,OAAO,SAAS;;;CAInC,QAAQ,OAAyC;AAC/C,OAAK,SAAS,YAAY,MAAM;;CAGlC,QAAc;AACZ,OAAK,SAAS,oBAAoB,WAAW,KAAK,gBAAgB;AAClE,OAAK,SAAS,OAAO;;CAGvB,mBAAoC,UAAiC;AACnE,MAAI,CAAC,sBAAsB,MAAM,KAAK,CACpC;AAEF,OAAK,MAAM,YAAY,KAAK,UAC1B,UAAS,MAAM,KAAK;;;AAY1B,IAAa,6BAAb,MAAgF;CAC9E;CACA;CACA;CACA;CAEA,YAAY,SAA4C;AACtD,OAAK,eAAe,QAAQ;AAC5B,OAAK,cAAc,QAAQ;AAC3B,OAAK,kBAAkB,UAAU,QAAQ,eAAe,MAAM;AAC9D,OAAK,mBAAmB,aAAa,QAAQ,gBAAgB,SAAS;;CAGxE,MAAM,oBAAoB,OAAmC;EAC3D,MAAM,kBAAkB,MAAM,UAAU,cAAc,MAAM,UAAU;AACtE,MAAI,iBAAiB;GACnB,MAAM,QAAQ,MAAM,KAAK,YAAY,aAAa,KAAK,aAAa;AACpE,OAAI,MACF,MAAK,gBAAgB,KAAK,eAAe,MAAM,CAAC;;AAGpD,SAAO;GACL;GACA,gBAAgB,MAAM,UAAU,aAAa,MAAM,UAAU;GAC9D;;;AAIL,SAAgB,6BAA6B,cAA8B;AACzE,QAAO,oBAAoB;;AAG7B,SAAS,sBACP,OACqC;AACrC,QACE,OAAO,UAAU,YACjB,UAAU,QACV,cAAc,SACd,WAAW,SACX,YAAY,SACZ,eAAe"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { AttachWebWorkerRuntimeOptions, AttachedWebWorkerRuntime, CreateWebWorkerClientProviderOptions, ManagedWebWorkerClient, SyncoreWebWorkerClient, SyncoreWorkerMessageEndpoint, WebWorkerSyncoreSchema, WorkerQueryWatch, attachWebWorkerRuntime, createManagedWebWorkerClient, createSyncoreWebWorkerClient, createWebWorkerClient } from "./worker.js";
|
|
2
2
|
import { CreateWebPersistenceOptions, StoredWebFile, SyncoreWebPersistence, WebPersistenceMode, createWebPersistence, isOpfsAvailable } from "./persistence.js";
|
|
3
|
+
import { BroadcastChannelExternalChangeSignal, BroadcastChannelExternalChangeSignalOptions, SqlJsExternalChangeApplier, SqlJsExternalChangeApplierOptions, createDefaultSyncChannelName } from "./external-change.js";
|
|
3
4
|
import { IndexedDbPersistenceOptions, SyncoreIndexedDbPersistence } from "./indexeddb.js";
|
|
4
5
|
import { OpfsPersistenceOptions, SyncoreOpfsPersistence } from "./opfs.js";
|
|
5
6
|
import * as _syncore_core0 from "../core/index.d.mts";
|
|
6
|
-
import { AnySyncoreSchema,
|
|
7
|
-
import { SyncoreDevtoolsSnapshot } from "../devtools-protocol/index.d.ts";
|
|
7
|
+
import { AnySyncoreSchema, DevtoolsCommandHandler, DevtoolsSink, DevtoolsSubscriptionHost, SchedulerOptions, StorageObject, StorageWriteInput, SyncoreCapabilities, SyncoreExperimentalPlugin, SyncoreRuntime, SyncoreRuntimeOptions, SyncoreStorageAdapter } from "../core/index.d.mts";
|
|
8
8
|
|
|
9
9
|
//#region src/index.d.ts
|
|
10
10
|
type WebSyncoreSchema = AnySyncoreSchema;
|
|
@@ -65,6 +65,10 @@ type CreateBrowserRuntimeOptions = CreateWebRuntimeOptions;
|
|
|
65
65
|
* Options for hosting a Syncore runtime inside a browser Worker.
|
|
66
66
|
*/
|
|
67
67
|
type CreateBrowserWorkerRuntimeOptions = CreateWebWorkerRuntimeOptions;
|
|
68
|
+
interface WebExternalChangeSupport {
|
|
69
|
+
signal: BroadcastChannelExternalChangeSignal;
|
|
70
|
+
applier?: SqlJsExternalChangeApplier;
|
|
71
|
+
}
|
|
68
72
|
/**
|
|
69
73
|
* Create a full Syncore runtime directly in the browser.
|
|
70
74
|
*
|
|
@@ -72,6 +76,19 @@ type CreateBrowserWorkerRuntimeOptions = CreateWebWorkerRuntimeOptions;
|
|
|
72
76
|
* stay off the main thread.
|
|
73
77
|
*/
|
|
74
78
|
declare function createWebSyncoreRuntime(options: CreateWebRuntimeOptions): Promise<SyncoreRuntime<WebSyncoreSchema>>;
|
|
79
|
+
declare function createWebExternalChangeSupport(options: {
|
|
80
|
+
databaseName: string;
|
|
81
|
+
persistence: SyncoreWebPersistence;
|
|
82
|
+
driver: CreateWebRuntimeOptions["driver"] | undefined;
|
|
83
|
+
}): WebExternalChangeSupport;
|
|
84
|
+
declare function createExpoWebExternalChangeSupport(options: {
|
|
85
|
+
databaseName: string;
|
|
86
|
+
locateFile?: (fileName: string) => string;
|
|
87
|
+
wasmUrl?: string;
|
|
88
|
+
persistenceDatabaseName?: string;
|
|
89
|
+
opfsRootDirectoryName?: string;
|
|
90
|
+
persistenceMode?: WebPersistenceMode;
|
|
91
|
+
}): Promise<WebExternalChangeSupport>;
|
|
75
92
|
/**
|
|
76
93
|
* Attach a Syncore runtime to a browser Worker endpoint.
|
|
77
94
|
*/
|
|
@@ -98,10 +115,15 @@ interface BrowserWebSocketDevtoolsSinkOptions {
|
|
|
98
115
|
appName?: string;
|
|
99
116
|
origin?: string;
|
|
100
117
|
sessionLabel?: string;
|
|
118
|
+
targetKind?: "client";
|
|
119
|
+
storageProtocol?: string;
|
|
120
|
+
databaseLabel?: string;
|
|
121
|
+
storageIdentity?: string;
|
|
101
122
|
}
|
|
102
123
|
interface BrowserWebSocketDevtoolsSink extends DevtoolsSink {
|
|
103
|
-
attachRuntime(
|
|
104
|
-
|
|
124
|
+
attachRuntime(runtime: SyncoreRuntime<AnySyncoreSchema>): void;
|
|
125
|
+
attachCommandHandler(handler: DevtoolsCommandHandler): void;
|
|
126
|
+
attachSubscriptionHost(host: DevtoolsSubscriptionHost): void;
|
|
105
127
|
dispose(): void;
|
|
106
128
|
}
|
|
107
129
|
declare function createBrowserWebSocketDevtoolsSink(options: BrowserWebSocketDevtoolsSinkOptions): BrowserWebSocketDevtoolsSink;
|
|
@@ -119,5 +141,5 @@ declare class BrowserFileStorageAdapter implements SyncoreStorageAdapter {
|
|
|
119
141
|
list(): Promise<StorageObject[]>;
|
|
120
142
|
}
|
|
121
143
|
//#endregion
|
|
122
|
-
export { AttachWebWorkerRuntimeOptions, AttachedWebWorkerRuntime, BrowserFileStorageAdapter, BrowserSyncoreSchema, BrowserWebSocketDevtoolsSink, BrowserWebSocketDevtoolsSinkOptions, CreateBrowserRuntimeOptions, CreateBrowserWorkerRuntimeOptions, CreateWebPersistenceOptions, CreateWebRuntimeOptions, CreateWebWorkerClientProviderOptions, CreateWebWorkerRuntimeOptions, IndexedDbPersistenceOptions, ManagedWebWorkerClient, OpfsPersistenceOptions, StoredWebFile, SyncoreIndexedDbPersistence, SyncoreOpfsPersistence, SyncoreWebPersistence, SyncoreWebWorkerClient, SyncoreWorkerMessageEndpoint, WebPersistenceMode, WebSyncoreSchema, WebWorkerSyncoreSchema, WorkerQueryWatch, attachWebWorkerRuntime, createBrowserSyncoreClient, createBrowserSyncoreRuntime, createBrowserWebSocketDevtoolsSink, createBrowserWorkerRuntime, createManagedWebWorkerClient, createSyncoreWebWorkerClient, createWebPersistence, createWebSyncoreClient, createWebSyncoreRuntime, createWebWorkerClient, createWebWorkerRuntime, isOpfsAvailable };
|
|
144
|
+
export { AttachWebWorkerRuntimeOptions, AttachedWebWorkerRuntime, BroadcastChannelExternalChangeSignal, BroadcastChannelExternalChangeSignalOptions, BrowserFileStorageAdapter, BrowserSyncoreSchema, BrowserWebSocketDevtoolsSink, BrowserWebSocketDevtoolsSinkOptions, CreateBrowserRuntimeOptions, CreateBrowserWorkerRuntimeOptions, CreateWebPersistenceOptions, CreateWebRuntimeOptions, CreateWebWorkerClientProviderOptions, CreateWebWorkerRuntimeOptions, IndexedDbPersistenceOptions, ManagedWebWorkerClient, OpfsPersistenceOptions, SqlJsExternalChangeApplier, SqlJsExternalChangeApplierOptions, StoredWebFile, SyncoreIndexedDbPersistence, SyncoreOpfsPersistence, SyncoreWebPersistence, SyncoreWebWorkerClient, SyncoreWorkerMessageEndpoint, WebExternalChangeSupport, WebPersistenceMode, WebSyncoreSchema, WebWorkerSyncoreSchema, WorkerQueryWatch, attachWebWorkerRuntime, createBrowserSyncoreClient, createBrowserSyncoreRuntime, createBrowserWebSocketDevtoolsSink, createBrowserWorkerRuntime, createDefaultSyncChannelName, createExpoWebExternalChangeSupport, createManagedWebWorkerClient, createSyncoreWebWorkerClient, createWebExternalChangeSupport, createWebPersistence, createWebSyncoreClient, createWebSyncoreRuntime, createWebWorkerClient, createWebWorkerRuntime, isOpfsAvailable };
|
|
123
145
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;;;KA0CY,gBAAA,GAAmB,gBAAA;AAAA,KACnB,oBAAA,GAAuB,gBAAA;;;;AAAnC;;UAOiB,uBAAA;EAPkB;EASjC,MAAA,EAAQ,gBAAA;EAFO;EAKf,SAAA,EAAW,qBAAA,CAAsB,gBAAA;;EAGjC,YAAA,GAAe,mBAAA;EAHkB;EAMjC,MAAA,GAAS,qBAAA,CAAsB,gBAAA;EAHhB;EAMf,OAAA,GAAU,qBAAA;EAHD;EAMT,mBAAA,GAAsB,KAAA,CAAM,yBAAA,CAA0B,gBAAA;EAAA;EAGtD,WAAA,GAAc,qBAAA;EAHQ;EAMtB,eAAA,GAAkB,kBAAA;EAAA;EAGlB,YAAA;EAwBY;EArBZ,uBAAA;EAqB4B;EAlB5B,qBAAA;EA9BQ;EAiCR,gBAAA;EA9BW;EAiCX,OAAA;EA9BA;EAiCA,UAAA,IAAc,QAAA;EA9Bd;EAiCA,QAAA;EAjC+B;EAoC/B,QAAA,GAAW,YAAA;EAjCD;EAoCV,SAAA,GAAY,gBAAA;AAAA;;;;UAMG,6BAAA,SAAsC,uBAAA;EAjCrD;EAmCA,QAAA,EAAU,4BAAA;AAAA;;;;KAMA,2BAAA,GAA8B,uBAAA;;;;KAK9B,iCAAA,GAAoC,6BAAA;AAAA,UAE/B,wBAAA;EACf,MAAA,EAAQ,oCAAA;EACR,OAAA,GAAU,0BAAA;AAAA;;AAjBZ;;;;;iBA0BsB,uBAAA,CACpB,OAAA,EAAS,uBAAA,GACR,OAAA,CAAQ,cAAA,CAAe,gBAAA;AAAA,iBAoHV,8BAAA,CAA+B,OAAA;EAC7C,YAAA;EACA,WAAA,EAAa,qBAAA;EACb,MAAA,EAAQ,uBAAA;AAAA,IACN,wBAAA;AAAA,iBAwBkB,kCAAA,CAAmC,OAAA;EACvD,YAAA;EACA,UAAA,IAAc,QAAA;EACd,OAAA;EACA,uBAAA;EACA,qBAAA;EACA,eAAA,GAAkB,kBAAA;AAAA,IAChB,OAAA,CAAQ,wBAAA;AApKZ;;;AAAA,iBA6LgB,sBAAA,CAAuB,OAAA,EAAS,6BAAA,GAA6B,wBAAA;;;;iBAU7D,0BAAA,CACd,OAAA,EAAS,iCAAA,GAAiC,wBAAA;;;AA7L5C;iBAqMgB,sBAAA,CACd,OAAA,EAAS,cAAA,CAAe,gBAAA,IAAD,cAAA,CAAkB,aAAA;;;;iBAQ3B,2BAAA,CACd,OAAA,EAAS,2BAAA,GAA2B,OAAA,CAAA,cAAA,CAAA,gBAAA;;;;iBAQtB,0BAAA,CACd,OAAA,EAAS,cAAA,CAAe,oBAAA,IAAD,cAAA,CAAsB,aAAA;AAAA,UAK9B,mCAAA;EACf,GAAA;EACA,gBAAA;EACA,OAAA;EACA,MAAA;EACA,YAAA;EACA,UAAA;EACA,eAAA;EACA,aAAA;EACA,eAAA;AAAA;AAAA,UAGe,4BAAA,SAAqC,YAAA;EACpD,aAAA,CAAc,OAAA,EAAS,cAAA,CAAe,gBAAA;EACtC,oBAAA,CAAqB,OAAA,EAAS,sBAAA;EAC9B,sBAAA,CAAuB,IAAA,EAAM,wBAAA;EAC7B,OAAA;AAAA;AAAA,iBAGc,kCAAA,CACd,OAAA,EAAS,mCAAA,GACR,4BAAA;;;;cA0hBU,yBAAA,YAAqC,qBAAA;EAAA,iBAE7B,WAAA;EAAA,iBACA,SAAA;cADA,WAAA,EAAa,qBAAA,EACb,SAAA;EAGb,GAAA,CAAI,EAAA,UAAY,KAAA,EAAO,iBAAA,GAAoB,OAAA,CAAQ,aAAA;EAgBnD,GAAA,CAAI,EAAA,WAAa,OAAA,CAAQ,aAAA;EAazB,IAAA,CAAK,EAAA,WAAa,OAAA,CAAQ,UAAA;EAK1B,MAAA,CAAO,EAAA,WAAa,OAAA;EAIpB,IAAA,CAAA,GAAQ,OAAA,CAAQ,aAAA;AAAA"}
|