syncorejs 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/_vendor/cli/app.d.mts.map +1 -1
  2. package/dist/_vendor/cli/app.mjs +8 -5
  3. package/dist/_vendor/cli/app.mjs.map +1 -1
  4. package/dist/_vendor/cli/context.mjs.map +1 -1
  5. package/dist/_vendor/cli/dev-session.mjs.map +1 -1
  6. package/dist/_vendor/cli/doctor.mjs.map +1 -1
  7. package/dist/_vendor/cli/errors.mjs.map +1 -1
  8. package/dist/_vendor/cli/help.mjs.map +1 -1
  9. package/dist/_vendor/cli/index.mjs +9 -2
  10. package/dist/_vendor/cli/index.mjs.map +1 -1
  11. package/dist/_vendor/cli/messages.mjs.map +1 -1
  12. package/dist/_vendor/cli/preflight.mjs.map +1 -1
  13. package/dist/_vendor/cli/project.mjs +20 -20
  14. package/dist/_vendor/cli/project.mjs.map +1 -1
  15. package/dist/_vendor/cli/render.mjs.map +1 -1
  16. package/dist/_vendor/cli/targets.mjs.map +1 -1
  17. package/dist/_vendor/core/cli.d.mts +8 -2
  18. package/dist/_vendor/core/cli.d.mts.map +1 -1
  19. package/dist/_vendor/core/cli.mjs +510 -71
  20. package/dist/_vendor/core/cli.mjs.map +1 -1
  21. package/dist/_vendor/core/devtools-auth.mjs.map +1 -1
  22. package/dist/_vendor/core/index.d.mts +3 -3
  23. package/dist/_vendor/core/runtime/components.d.mts.map +1 -1
  24. package/dist/_vendor/core/runtime/components.mjs.map +1 -1
  25. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
  26. package/dist/_vendor/core/runtime/devtools.mjs +261 -23
  27. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
  28. package/dist/_vendor/core/runtime/functions.d.mts +388 -6
  29. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
  30. package/dist/_vendor/core/runtime/functions.mjs +72 -1
  31. package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
  32. package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
  33. package/dist/_vendor/core/runtime/id.mjs.map +1 -1
  34. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +12 -6
  35. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -1
  36. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +123 -20
  37. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -1
  38. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +56 -8
  39. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -1
  40. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +49 -14
  41. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -1
  42. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +4 -7
  43. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -1
  44. package/dist/_vendor/core/runtime/internal/engines/shared.mjs +81 -2
  45. package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -1
  46. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +100 -13
  47. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -1
  48. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +42 -7
  49. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -1
  50. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -1
  51. package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -1
  52. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +4 -0
  53. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -1
  54. package/dist/_vendor/core/runtime/runtime.d.mts +1100 -12
  55. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
  56. package/dist/_vendor/core/runtime/runtime.mjs +63 -0
  57. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
  58. package/dist/_vendor/core/transport.d.mts +2 -0
  59. package/dist/_vendor/core/transport.d.mts.map +1 -1
  60. package/dist/_vendor/core/transport.mjs +61 -27
  61. package/dist/_vendor/core/transport.mjs.map +1 -1
  62. package/dist/_vendor/devtools-protocol/index.d.ts +223 -4
  63. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
  64. package/dist/_vendor/devtools-protocol/index.js.map +1 -1
  65. package/dist/_vendor/next/config.d.ts +3 -4
  66. package/dist/_vendor/next/config.d.ts.map +1 -1
  67. package/dist/_vendor/next/config.js +37 -19
  68. package/dist/_vendor/next/config.js.map +1 -1
  69. package/dist/_vendor/next/index.d.ts +109 -29
  70. package/dist/_vendor/next/index.d.ts.map +1 -1
  71. package/dist/_vendor/next/index.js +86 -18
  72. package/dist/_vendor/next/index.js.map +1 -1
  73. package/dist/_vendor/platform-expo/index.d.ts +146 -27
  74. package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
  75. package/dist/_vendor/platform-expo/index.js +81 -10
  76. package/dist/_vendor/platform-expo/index.js.map +1 -1
  77. package/dist/_vendor/platform-expo/react.js.map +1 -1
  78. package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
  79. package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
  80. package/dist/_vendor/platform-node/index.d.mts +174 -9
  81. package/dist/_vendor/platform-node/index.d.mts.map +1 -1
  82. package/dist/_vendor/platform-node/index.mjs +251 -95
  83. package/dist/_vendor/platform-node/index.mjs.map +1 -1
  84. package/dist/_vendor/platform-node/ipc-react.mjs +4 -0
  85. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
  86. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
  87. package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
  88. package/dist/_vendor/platform-web/external-change.d.ts +41 -0
  89. package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
  90. package/dist/_vendor/platform-web/external-change.js +30 -0
  91. package/dist/_vendor/platform-web/external-change.js.map +1 -1
  92. package/dist/_vendor/platform-web/index.d.ts +312 -37
  93. package/dist/_vendor/platform-web/index.d.ts.map +1 -1
  94. package/dist/_vendor/platform-web/index.js +247 -25
  95. package/dist/_vendor/platform-web/index.js.map +1 -1
  96. package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
  97. package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
  98. package/dist/_vendor/platform-web/indexeddb.js +10 -0
  99. package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
  100. package/dist/_vendor/platform-web/opfs.d.ts +16 -1
  101. package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
  102. package/dist/_vendor/platform-web/opfs.js +41 -3
  103. package/dist/_vendor/platform-web/opfs.js.map +1 -1
  104. package/dist/_vendor/platform-web/persistence.d.ts +85 -1
  105. package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
  106. package/dist/_vendor/platform-web/persistence.js +15 -0
  107. package/dist/_vendor/platform-web/persistence.js.map +1 -1
  108. package/dist/_vendor/platform-web/react.d.ts +1 -2
  109. package/dist/_vendor/platform-web/react.d.ts.map +1 -1
  110. package/dist/_vendor/platform-web/react.js +11 -5
  111. package/dist/_vendor/platform-web/react.js.map +1 -1
  112. package/dist/_vendor/platform-web/sqljs.js +10 -1
  113. package/dist/_vendor/platform-web/sqljs.js.map +1 -1
  114. package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
  115. package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
  116. package/dist/_vendor/platform-web/worker.d.ts +60 -9
  117. package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
  118. package/dist/_vendor/platform-web/worker.js +37 -4
  119. package/dist/_vendor/platform-web/worker.js.map +1 -1
  120. package/dist/_vendor/react/index.d.ts +197 -13
  121. package/dist/_vendor/react/index.d.ts.map +1 -1
  122. package/dist/_vendor/react/index.js +209 -17
  123. package/dist/_vendor/react/index.js.map +1 -1
  124. package/dist/_vendor/schema/definition.d.ts +129 -0
  125. package/dist/_vendor/schema/definition.d.ts.map +1 -1
  126. package/dist/_vendor/schema/definition.js +99 -0
  127. package/dist/_vendor/schema/definition.js.map +1 -1
  128. package/dist/_vendor/schema/planner.d.ts.map +1 -1
  129. package/dist/_vendor/schema/planner.js.map +1 -1
  130. package/dist/_vendor/schema/validators.d.ts +180 -4
  131. package/dist/_vendor/schema/validators.d.ts.map +1 -1
  132. package/dist/_vendor/schema/validators.js +35 -1
  133. package/dist/_vendor/schema/validators.js.map +1 -1
  134. package/dist/_vendor/svelte/index.d.ts +207 -7
  135. package/dist/_vendor/svelte/index.d.ts.map +1 -1
  136. package/dist/_vendor/svelte/index.js +201 -6
  137. package/dist/_vendor/svelte/index.js.map +1 -1
  138. package/dist/browser.d.ts.map +1 -1
  139. package/dist/cli.js +3 -1
  140. package/dist/cli.js.map +1 -1
  141. package/dist/index.d.ts +1 -1
  142. package/package.json +24 -21
@@ -1 +1 @@
1
- {"version":3,"file":"transport.mjs","names":[],"sources":["../src/transport.ts"],"sourcesContent":["import {\n type SyncoreClient,\n type SyncoreRuntime,\n type JsonObject,\n type SyncoreRuntimeStatus,\n type SyncoreWatch\n} from \"./runtime/runtime.js\";\nimport type { SyncoreSchema } from \"@syncore/schema\";\nimport { generateId } from \"./runtime/id.js\";\nimport type { FunctionReference } from \"./runtime/functions.js\";\nimport { RuntimeStatusController } from \"./runtime/internal/runtimeStatus.js\";\n\nexport interface SyncoreBridgeMessageEndpoint {\n postMessage(message: unknown): void;\n addEventListener(\n type: \"message\",\n listener: (event: MessageEvent<unknown>) => void\n ): void;\n removeEventListener(\n type: \"message\",\n listener: (event: MessageEvent<unknown>) => void\n ): void;\n}\n\nexport type SyncoreBridgeRequest =\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"query\";\n reference: FunctionReference<\"query\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"mutation\";\n reference: FunctionReference<\"mutation\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"action\";\n reference: FunctionReference<\"action\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"watch.subscribe\";\n subscriptionId: string;\n reference: FunctionReference<\"query\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"watch.unsubscribe\";\n subscriptionId: string;\n };\n\nexport type SyncoreBridgeResponse =\n | { type: \"runtime.ready\" }\n | { type: \"runtime.error\"; error: string }\n | { type: \"runtime.status\"; status: SyncoreRuntimeStatus }\n | {\n type: \"invoke.result\";\n requestId: string;\n success: true;\n value: unknown;\n }\n | {\n type: \"invoke.result\";\n requestId: string;\n success: false;\n error: string;\n }\n | {\n type: \"watch.update\";\n subscriptionId: string;\n success: true;\n value: unknown;\n }\n | {\n type: \"watch.update\";\n subscriptionId: string;\n success: false;\n error: string;\n };\n\ntype PendingRequest = {\n resolve(value: unknown): void;\n reject(error: Error): void;\n};\n\ntype WatchRecord = {\n subscriptionId: string;\n listeners: Set<() => void>;\n consumers: number;\n result: unknown;\n error: Error | undefined;\n};\n\ntype OptionalArgsTuple<TArgs> =\n Record<never, never> extends TArgs ? [args?: TArgs] : [args: TArgs];\n\nexport type BridgeQueryWatch<TValue> = SyncoreWatch<TValue> & {\n dispose(): void;\n};\n\nexport class SyncoreBridgeClient implements SyncoreClient {\n private readonly pendingRequests = new Map<string, PendingRequest>();\n private readonly watchRecordsByKey = new Map<string, WatchRecord>();\n private readonly watchKeyBySubscriptionId = new Map<string, string>();\n private readonly runtimeStatus = new RuntimeStatusController({\n kind: \"starting\",\n reason: \"booting\"\n });\n private disposed = false;\n\n private readonly handleMessage = (event: MessageEvent<unknown>) => {\n const message = event.data as SyncoreBridgeResponse;\n if (!message || typeof message !== \"object\" || !(\"type\" in message)) {\n return;\n }\n\n switch (message.type) {\n case \"runtime.ready\":\n this.runtimeStatus.setStatus({\n kind: \"ready\"\n });\n return;\n case \"runtime.error\":\n this.runtimeStatus.setStatus({\n kind: \"error\",\n reason: \"runtime-unavailable\",\n error: new Error(message.error)\n });\n for (const watchRecord of this.watchRecordsByKey.values()) {\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n this.rejectAllPending(new Error(message.error));\n return;\n case \"runtime.status\":\n this.runtimeStatus.setStatus(message.status);\n for (const watchRecord of this.watchRecordsByKey.values()) {\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n if (message.status.error) {\n this.rejectAllPending(message.status.error);\n }\n return;\n case \"invoke.result\": {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) {\n return;\n }\n this.pendingRequests.delete(message.requestId);\n if (message.success) {\n pending.resolve(message.value);\n } else {\n pending.reject(new Error(message.error));\n }\n return;\n }\n case \"watch.update\": {\n const watchKey = this.watchKeyBySubscriptionId.get(\n message.subscriptionId\n );\n if (!watchKey) {\n return;\n }\n const watchRecord = this.watchRecordsByKey.get(watchKey);\n if (!watchRecord) {\n return;\n }\n if (message.success) {\n watchRecord.result = message.value;\n watchRecord.error = undefined;\n } else {\n watchRecord.error = new Error(message.error);\n }\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n }\n };\n\n constructor(private readonly endpoint: SyncoreBridgeMessageEndpoint) {\n this.endpoint.addEventListener(\"message\", this.handleMessage);\n }\n\n query<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\"query\", reference, normalizeOptionalArgs(args) as JsonObject);\n }\n\n mutation<TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\n \"mutation\",\n reference,\n normalizeOptionalArgs(args) as JsonObject\n );\n }\n\n action<TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\n \"action\",\n reference,\n normalizeOptionalArgs(args) as JsonObject\n );\n }\n\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): BridgeQueryWatch<TResult> {\n this.ensureNotDisposed();\n const normalizedArgs = normalizeOptionalArgs(args) as JsonObject;\n const watchKey = createWatchKey(reference, normalizedArgs);\n let watchRecord = this.watchRecordsByKey.get(watchKey);\n if (!watchRecord) {\n watchRecord = {\n subscriptionId: generateId(),\n listeners: new Set<() => void>(),\n consumers: 0,\n result: undefined,\n error: undefined\n };\n this.watchRecordsByKey.set(watchKey, watchRecord);\n this.watchKeyBySubscriptionId.set(watchRecord.subscriptionId, watchKey);\n this.endpoint.postMessage({\n type: \"watch.subscribe\",\n subscriptionId: watchRecord.subscriptionId,\n reference,\n args: normalizedArgs\n } satisfies SyncoreBridgeRequest);\n }\n\n watchRecord.consumers += 1;\n let disposed = false;\n const ownedListeners = new Set<() => void>();\n\n return {\n onUpdate: (callback: () => void) => {\n watchRecord.listeners.add(callback);\n ownedListeners.add(callback);\n queueMicrotask(callback);\n return () => {\n watchRecord.listeners.delete(callback);\n ownedListeners.delete(callback);\n };\n },\n localQueryResult: () => watchRecord.result as TResult | undefined,\n localQueryError: () => watchRecord.error,\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n for (const callback of ownedListeners) {\n watchRecord.listeners.delete(callback);\n }\n ownedListeners.clear();\n watchRecord.consumers = Math.max(0, watchRecord.consumers - 1);\n if (watchRecord.consumers > 0) {\n return;\n }\n this.endpoint.postMessage({\n type: \"watch.unsubscribe\",\n subscriptionId: watchRecord.subscriptionId\n } satisfies SyncoreBridgeRequest);\n this.watchKeyBySubscriptionId.delete(watchRecord.subscriptionId);\n this.watchRecordsByKey.delete(watchKey);\n }\n };\n }\n\n watchRuntimeStatus(): SyncoreWatch<SyncoreRuntimeStatus> {\n return this.runtimeStatus.watch();\n }\n\n dispose(errorMessage = \"Syncore bridge client was disposed.\"): void {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.runtimeStatus.setStatus({\n kind: \"unavailable\",\n reason: \"disposed\",\n error: new Error(errorMessage)\n });\n this.endpoint.removeEventListener(\"message\", this.handleMessage);\n for (const watchRecord of this.watchRecordsByKey.values()) {\n this.endpoint.postMessage({\n type: \"watch.unsubscribe\",\n subscriptionId: watchRecord.subscriptionId\n } satisfies SyncoreBridgeRequest);\n }\n this.watchKeyBySubscriptionId.clear();\n this.watchRecordsByKey.clear();\n this.rejectAllPending(new Error(errorMessage));\n }\n\n private invoke<TArgs, TResult>(\n kind: \"query\" | \"mutation\" | \"action\",\n reference: FunctionReference<\n \"query\" | \"mutation\" | \"action\",\n TArgs,\n TResult\n >,\n args: JsonObject\n ): Promise<TResult> {\n this.ensureNotDisposed();\n const requestId = generateId();\n const promise = new Promise<TResult>((resolve, reject) => {\n this.pendingRequests.set(requestId, { resolve, reject });\n });\n\n this.endpoint.postMessage(\n createInvokeRequest(requestId, kind, reference, args)\n );\n\n return promise;\n }\n\n private rejectAllPending(error: Error): void {\n for (const pending of this.pendingRequests.values()) {\n pending.reject(error);\n }\n this.pendingRequests.clear();\n }\n\n private ensureNotDisposed(): void {\n if (this.disposed) {\n throw new Error(\"Syncore bridge client was disposed.\");\n }\n }\n}\n\nexport function createUnavailableSyncoreClient(\n status: SyncoreRuntimeStatus\n): SyncoreClient {\n const runtimeStatus = new RuntimeStatusController(status);\n const error =\n status.error ??\n new Error(\n status.reason\n ? `Syncore client is unavailable (${status.reason}).`\n : \"Syncore client is unavailable.\"\n );\n\n return {\n query: async () => Promise.reject(error),\n mutation: async () => Promise.reject(error),\n action: async () => Promise.reject(error),\n watchQuery: () => ({\n onUpdate: (callback) => {\n queueMicrotask(callback);\n return () => undefined;\n },\n localQueryResult: () => undefined,\n localQueryError: () => undefined\n }),\n watchRuntimeStatus: () => runtimeStatus.watch()\n };\n}\n\nexport function createDeferredSyncoreClient(options: {\n loadClient: () => Promise<SyncoreClient>;\n initialStatus?: SyncoreRuntimeStatus;\n failureReason?: SyncoreRuntimeStatus[\"reason\"];\n}): SyncoreClient {\n const runtimeStatus = new RuntimeStatusController(\n options.initialStatus ?? {\n kind: \"starting\",\n reason: \"booting\"\n }\n );\n const resolvedFailureReason = options.failureReason ?? \"runtime-unavailable\";\n let currentClient: SyncoreClient | undefined;\n let detachStatusListener: (() => void) | undefined;\n\n const clientPromise = Promise.resolve()\n .then(() => options.loadClient())\n .then((client) => {\n currentClient = client;\n const statusWatch = client.watchRuntimeStatus();\n const syncStatus = () => {\n const nextStatus = statusWatch.localQueryResult();\n if (nextStatus) {\n runtimeStatus.setStatus(nextStatus);\n }\n };\n syncStatus();\n detachStatusListener = statusWatch.onUpdate(syncStatus);\n return client;\n })\n .catch((error) => {\n const resolvedError =\n error instanceof Error ? error : new Error(String(error));\n runtimeStatus.setStatus({\n kind: \"error\",\n reason: resolvedFailureReason,\n error: resolvedError\n });\n throw resolvedError;\n });\n\n const waitForClient = () => clientPromise;\n\n return {\n query: async (reference, ...args) =>\n waitForClient().then((client) => client.query(reference, ...args)),\n mutation: async (reference, ...args) =>\n waitForClient().then((client) => client.mutation(reference, ...args)),\n action: async (reference, ...args) =>\n waitForClient().then((client) => client.action(reference, ...args)),\n watchQuery(reference, ...args) {\n let innerWatch: SyncoreWatch<unknown> | undefined;\n let detachInner: (() => void) | undefined;\n let result: unknown;\n let error: Error | undefined;\n const listeners = new Set<() => void>();\n let disposed = false;\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n void waitForClient()\n .then((client) => {\n if (disposed) {\n return;\n }\n innerWatch = client.watchQuery(reference, ...args);\n const sync = () => {\n result = innerWatch?.localQueryResult();\n error = innerWatch?.localQueryError();\n notify();\n };\n sync();\n detachInner = innerWatch.onUpdate(sync);\n })\n .catch((nextError) => {\n error = undefined;\n notify();\n });\n\n return {\n onUpdate(callback) {\n listeners.add(callback);\n queueMicrotask(callback);\n return () => {\n listeners.delete(callback);\n };\n },\n localQueryResult: () => result as typeof reference.__result | undefined,\n localQueryError: () => error,\n dispose() {\n if (disposed) {\n return;\n }\n disposed = true;\n detachInner?.();\n innerWatch?.dispose?.();\n listeners.clear();\n }\n };\n },\n watchRuntimeStatus: () => runtimeStatus.watch()\n };\n}\n\nexport interface AttachRuntimeBridgeOptions<\n TSchema extends SyncoreSchema<any>\n> {\n endpoint: SyncoreBridgeMessageEndpoint;\n createRuntime:\n | (() => Promise<SyncoreRuntime<TSchema>>)\n | (() => SyncoreRuntime<TSchema>);\n}\n\nexport interface AttachedRuntimeBridge {\n ready: Promise<void>;\n dispose(): Promise<void>;\n}\n\nexport function attachRuntimeBridge<\n TSchema extends SyncoreSchema<any>\n>(\n options: AttachRuntimeBridgeOptions<TSchema>\n): AttachedRuntimeBridge {\n const subscriptions = new Map<\n string,\n {\n watch: SyncoreWatch<unknown>;\n unsubscribe: () => void;\n }\n >();\n\n const runtimePromise = Promise.resolve(options.createRuntime()).then(\n async (runtime) => {\n await runtime.start();\n return runtime;\n }\n );\n\n const clientPromise = runtimePromise.then((runtime) => runtime.createClient());\n\n const ready = clientPromise\n .then(() => {\n options.endpoint.postMessage({\n type: \"runtime.status\",\n status: {\n kind: \"ready\"\n }\n } satisfies SyncoreBridgeResponse);\n options.endpoint.postMessage({\n type: \"runtime.ready\"\n } satisfies SyncoreBridgeResponse);\n })\n .catch((error) => {\n options.endpoint.postMessage({\n type: \"runtime.status\",\n status: {\n kind: \"error\",\n reason: \"runtime-unavailable\",\n ...(error instanceof Error ? { error } : {})\n }\n } satisfies SyncoreBridgeResponse);\n options.endpoint.postMessage({\n type: \"runtime.error\",\n error: error instanceof Error ? error.message : String(error)\n } satisfies SyncoreBridgeResponse);\n throw error;\n });\n\n const handleMessage = (event: MessageEvent<unknown>) => {\n void (async () => {\n const message = event.data as SyncoreBridgeRequest;\n if (!message || typeof message !== \"object\" || !(\"type\" in message)) {\n return;\n }\n\n try {\n const client = await clientPromise;\n switch (message.type) {\n case \"invoke\": {\n const value =\n message.kind === \"query\"\n ? await client.query(message.reference, message.args)\n : message.kind === \"mutation\"\n ? await client.mutation(message.reference, message.args)\n : await client.action(message.reference, message.args);\n options.endpoint.postMessage({\n type: \"invoke.result\",\n requestId: message.requestId,\n success: true,\n value\n } satisfies SyncoreBridgeResponse);\n return;\n }\n case \"watch.subscribe\": {\n if (subscriptions.has(message.subscriptionId)) {\n return;\n }\n const watch = client.watchQuery(message.reference, message.args);\n const sendCurrentState = () => {\n const error = watch.localQueryError();\n if (error) {\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: false,\n error: error.message\n } satisfies SyncoreBridgeResponse);\n return;\n }\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: true,\n value: watch.localQueryResult()\n } satisfies SyncoreBridgeResponse);\n };\n const unsubscribe = watch.onUpdate(sendCurrentState);\n subscriptions.set(message.subscriptionId, { watch, unsubscribe });\n sendCurrentState();\n return;\n }\n case \"watch.unsubscribe\": {\n const subscription = subscriptions.get(message.subscriptionId);\n if (!subscription) {\n return;\n }\n subscription.unsubscribe();\n subscriptions.delete(message.subscriptionId);\n }\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (message.type === \"invoke\") {\n options.endpoint.postMessage({\n type: \"invoke.result\",\n requestId: message.requestId,\n success: false,\n error: errorMessage\n } satisfies SyncoreBridgeResponse);\n }\n if (message.type === \"watch.subscribe\") {\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: false,\n error: errorMessage\n } satisfies SyncoreBridgeResponse);\n }\n }\n })();\n };\n\n options.endpoint.addEventListener(\"message\", handleMessage);\n options.endpoint.postMessage({\n type: \"runtime.status\",\n status: {\n kind: \"starting\",\n reason: \"booting\"\n }\n } satisfies SyncoreBridgeResponse);\n\n return {\n ready,\n async dispose() {\n options.endpoint.postMessage({\n type: \"runtime.status\",\n status: {\n kind: \"unavailable\",\n reason: \"disposed\"\n }\n } satisfies SyncoreBridgeResponse);\n options.endpoint.removeEventListener(\"message\", handleMessage);\n for (const subscription of subscriptions.values()) {\n subscription.unsubscribe();\n }\n subscriptions.clear();\n const runtime = await runtimePromise;\n await runtime.stop();\n }\n };\n}\n\nexport function createInvokeRequest(\n requestId: string,\n kind: \"query\" | \"mutation\" | \"action\",\n reference:\n | FunctionReference<\"query\", unknown, unknown>\n | FunctionReference<\"mutation\", unknown, unknown>\n | FunctionReference<\"action\", unknown, unknown>,\n args: JsonObject\n): SyncoreBridgeRequest {\n switch (kind) {\n case \"query\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"query\">,\n args\n };\n case \"mutation\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"mutation\">,\n args\n };\n case \"action\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"action\">,\n args\n };\n }\n}\n\nexport function createWatchKey(\n reference: FunctionReference<\"query\", unknown, unknown>,\n args: JsonObject\n): string {\n return `${reference.name}:${stableStringify(args)}`;\n}\n\nexport function normalizeOptionalArgs<TArgs>(\n args: [] | [TArgs] | readonly unknown[]\n): TArgs {\n return (args[0] ?? {}) as TArgs;\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortValue);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, sortValue(nested)])\n );\n }\n return value;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transport.mjs","names":[],"sources":["../src/transport.ts"],"sourcesContent":["import {\n type SyncoreClient,\n type SyncoreRuntime,\n type JsonObject,\n type SyncoreRuntimeStatus,\n type SyncoreWatch\n} from \"./runtime/runtime.js\";\nimport type { SyncoreSchema } from \"@syncore/schema\";\nimport { generateId } from \"./runtime/id.js\";\nimport type { FunctionReference } from \"./runtime/functions.js\";\nimport { RuntimeStatusController } from \"./runtime/internal/runtimeStatus.js\";\n\nexport interface SyncoreBridgeMessageEndpoint {\n postMessage(message: unknown): void;\n addEventListener(\n type: \"message\",\n listener: (event: MessageEvent<unknown>) => void\n ): void;\n removeEventListener(\n type: \"message\",\n listener: (event: MessageEvent<unknown>) => void\n ): void;\n}\n\nexport type SyncoreBridgeRequest =\n | {\n type: \"runtime.status.request\";\n }\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"query\";\n reference: FunctionReference<\"query\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"mutation\";\n reference: FunctionReference<\"mutation\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"action\";\n reference: FunctionReference<\"action\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"watch.subscribe\";\n subscriptionId: string;\n reference: FunctionReference<\"query\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"watch.unsubscribe\";\n subscriptionId: string;\n };\n\nexport type SyncoreBridgeResponse =\n | { type: \"runtime.ready\" }\n | { type: \"runtime.error\"; error: string }\n | { type: \"runtime.status\"; status: SyncoreRuntimeStatus }\n | {\n type: \"invoke.result\";\n requestId: string;\n success: true;\n value: unknown;\n }\n | {\n type: \"invoke.result\";\n requestId: string;\n success: false;\n error: string;\n }\n | {\n type: \"watch.update\";\n subscriptionId: string;\n success: true;\n value: unknown;\n }\n | {\n type: \"watch.update\";\n subscriptionId: string;\n success: false;\n error: string;\n };\n\ntype PendingRequest = {\n resolve(value: unknown): void;\n reject(error: Error): void;\n};\n\ntype WatchRecord = {\n subscriptionId: string;\n listeners: Set<() => void>;\n consumers: number;\n result: unknown;\n error: Error | undefined;\n};\n\ntype OptionalArgsTuple<TArgs> =\n Record<never, never> extends TArgs ? [args?: TArgs] : [args: TArgs];\n\nexport type BridgeQueryWatch<TValue> = SyncoreWatch<TValue> & {\n dispose(): void;\n};\n\nexport class SyncoreBridgeClient implements SyncoreClient {\n private readonly pendingRequests = new Map<string, PendingRequest>();\n private readonly watchRecordsByKey = new Map<string, WatchRecord>();\n private readonly watchKeyBySubscriptionId = new Map<string, string>();\n private readonly runtimeStatus = new RuntimeStatusController({\n kind: \"starting\",\n reason: \"booting\"\n });\n private disposed = false;\n\n private readonly handleMessage = (event: MessageEvent<unknown>) => {\n const message = event.data as SyncoreBridgeResponse;\n if (!message || typeof message !== \"object\" || !(\"type\" in message)) {\n return;\n }\n\n switch (message.type) {\n case \"runtime.ready\": {\n const currentStatus = this.runtimeStatus.getStatus();\n this.runtimeStatus.setStatus({\n kind: \"ready\",\n ...(currentStatus.capabilities\n ? { capabilities: currentStatus.capabilities }\n : {})\n });\n return;\n }\n case \"runtime.error\": {\n const statusBeforeError = this.runtimeStatus.getStatus();\n this.runtimeStatus.setStatus({\n kind: \"error\",\n reason: \"runtime-unavailable\",\n ...(statusBeforeError.capabilities\n ? { capabilities: statusBeforeError.capabilities }\n : {}),\n error: new Error(message.error)\n });\n for (const watchRecord of this.watchRecordsByKey.values()) {\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n this.rejectAllPending(new Error(message.error));\n return;\n }\n case \"runtime.status\":\n this.runtimeStatus.setStatus(message.status);\n for (const watchRecord of this.watchRecordsByKey.values()) {\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n if (message.status.error) {\n this.rejectAllPending(message.status.error);\n }\n return;\n case \"invoke.result\": {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) {\n return;\n }\n this.pendingRequests.delete(message.requestId);\n if (message.success) {\n pending.resolve(message.value);\n } else {\n pending.reject(new Error(message.error));\n }\n return;\n }\n case \"watch.update\": {\n const watchKey = this.watchKeyBySubscriptionId.get(\n message.subscriptionId\n );\n if (!watchKey) {\n return;\n }\n const watchRecord = this.watchRecordsByKey.get(watchKey);\n if (!watchRecord) {\n return;\n }\n if (message.success) {\n watchRecord.result = message.value;\n watchRecord.error = undefined;\n } else {\n watchRecord.error = new Error(message.error);\n }\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n }\n };\n\n constructor(private readonly endpoint: SyncoreBridgeMessageEndpoint) {\n this.endpoint.addEventListener(\"message\", this.handleMessage);\n this.endpoint.postMessage({ type: \"runtime.status.request\" });\n }\n\n query<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\"query\", reference, normalizeOptionalArgs(args) as JsonObject);\n }\n\n mutation<TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\n \"mutation\",\n reference,\n normalizeOptionalArgs(args) as JsonObject\n );\n }\n\n action<TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\n \"action\",\n reference,\n normalizeOptionalArgs(args) as JsonObject\n );\n }\n\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): BridgeQueryWatch<TResult> {\n this.ensureNotDisposed();\n const normalizedArgs = normalizeOptionalArgs(args) as JsonObject;\n const watchKey = createWatchKey(reference, normalizedArgs);\n let watchRecord = this.watchRecordsByKey.get(watchKey);\n if (!watchRecord) {\n watchRecord = {\n subscriptionId: generateId(),\n listeners: new Set<() => void>(),\n consumers: 0,\n result: undefined,\n error: undefined\n };\n this.watchRecordsByKey.set(watchKey, watchRecord);\n this.watchKeyBySubscriptionId.set(watchRecord.subscriptionId, watchKey);\n this.endpoint.postMessage({\n type: \"watch.subscribe\",\n subscriptionId: watchRecord.subscriptionId,\n reference,\n args: normalizedArgs\n } satisfies SyncoreBridgeRequest);\n }\n\n watchRecord.consumers += 1;\n let disposed = false;\n const ownedListeners = new Set<() => void>();\n\n return {\n onUpdate: (callback: () => void) => {\n watchRecord.listeners.add(callback);\n ownedListeners.add(callback);\n queueMicrotask(callback);\n return () => {\n watchRecord.listeners.delete(callback);\n ownedListeners.delete(callback);\n };\n },\n localQueryResult: () => watchRecord.result as TResult | undefined,\n localQueryError: () => watchRecord.error,\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n for (const callback of ownedListeners) {\n watchRecord.listeners.delete(callback);\n }\n ownedListeners.clear();\n watchRecord.consumers = Math.max(0, watchRecord.consumers - 1);\n if (watchRecord.consumers > 0) {\n return;\n }\n this.endpoint.postMessage({\n type: \"watch.unsubscribe\",\n subscriptionId: watchRecord.subscriptionId\n } satisfies SyncoreBridgeRequest);\n this.watchKeyBySubscriptionId.delete(watchRecord.subscriptionId);\n this.watchRecordsByKey.delete(watchKey);\n }\n };\n }\n\n watchRuntimeStatus(): SyncoreWatch<SyncoreRuntimeStatus> {\n return this.runtimeStatus.watch();\n }\n\n dispose(errorMessage = \"Syncore bridge client was disposed.\"): void {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.runtimeStatus.setStatus({\n kind: \"unavailable\",\n reason: \"disposed\",\n error: new Error(errorMessage)\n });\n this.endpoint.removeEventListener(\"message\", this.handleMessage);\n for (const watchRecord of this.watchRecordsByKey.values()) {\n this.endpoint.postMessage({\n type: \"watch.unsubscribe\",\n subscriptionId: watchRecord.subscriptionId\n } satisfies SyncoreBridgeRequest);\n }\n this.watchKeyBySubscriptionId.clear();\n this.watchRecordsByKey.clear();\n this.rejectAllPending(new Error(errorMessage));\n }\n\n private invoke<TArgs, TResult>(\n kind: \"query\" | \"mutation\" | \"action\",\n reference: FunctionReference<\n \"query\" | \"mutation\" | \"action\",\n TArgs,\n TResult\n >,\n args: JsonObject\n ): Promise<TResult> {\n this.ensureNotDisposed();\n const requestId = generateId();\n const promise = new Promise<TResult>((resolve, reject) => {\n this.pendingRequests.set(requestId, { resolve, reject });\n });\n\n this.endpoint.postMessage(\n createInvokeRequest(requestId, kind, reference, args)\n );\n\n return promise;\n }\n\n private rejectAllPending(error: Error): void {\n for (const pending of this.pendingRequests.values()) {\n pending.reject(error);\n }\n this.pendingRequests.clear();\n }\n\n private ensureNotDisposed(): void {\n if (this.disposed) {\n throw new Error(\"Syncore bridge client was disposed.\");\n }\n }\n}\n\nexport function createUnavailableSyncoreClient(\n status: SyncoreRuntimeStatus\n): SyncoreClient {\n const runtimeStatus = new RuntimeStatusController(status);\n const error =\n status.error ??\n new Error(\n status.reason\n ? `Syncore client is unavailable (${status.reason}).`\n : \"Syncore client is unavailable.\"\n );\n\n return {\n query: async () => Promise.reject(error),\n mutation: async () => Promise.reject(error),\n action: async () => Promise.reject(error),\n watchQuery: () => ({\n onUpdate: (callback) => {\n queueMicrotask(callback);\n return () => undefined;\n },\n localQueryResult: () => undefined,\n localQueryError: () => undefined\n }),\n watchRuntimeStatus: () => runtimeStatus.watch()\n };\n}\n\nexport function createDeferredSyncoreClient(options: {\n loadClient: () => Promise<SyncoreClient>;\n initialStatus?: SyncoreRuntimeStatus;\n failureReason?: SyncoreRuntimeStatus[\"reason\"];\n}): SyncoreClient {\n const runtimeStatus = new RuntimeStatusController(\n options.initialStatus ?? {\n kind: \"starting\",\n reason: \"booting\"\n }\n );\n const resolvedFailureReason = options.failureReason ?? \"runtime-unavailable\";\n let currentClient: SyncoreClient | undefined;\n let detachStatusListener: (() => void) | undefined;\n\n const clientPromise = Promise.resolve()\n .then(() => options.loadClient())\n .then((client) => {\n currentClient = client;\n const statusWatch = client.watchRuntimeStatus();\n const syncStatus = () => {\n const nextStatus = statusWatch.localQueryResult();\n if (nextStatus) {\n runtimeStatus.setStatus(nextStatus);\n }\n };\n syncStatus();\n detachStatusListener = statusWatch.onUpdate(syncStatus);\n return client;\n })\n .catch((error) => {\n const resolvedError =\n error instanceof Error ? error : new Error(String(error));\n runtimeStatus.setStatus({\n kind: \"error\",\n reason: resolvedFailureReason,\n error: resolvedError\n });\n throw resolvedError;\n });\n\n const waitForClient = () => clientPromise;\n\n return {\n query: async (reference, ...args) =>\n waitForClient().then((client) => client.query(reference, ...args)),\n mutation: async (reference, ...args) =>\n waitForClient().then((client) => client.mutation(reference, ...args)),\n action: async (reference, ...args) =>\n waitForClient().then((client) => client.action(reference, ...args)),\n watchQuery(reference, ...args) {\n let innerWatch: SyncoreWatch<unknown> | undefined;\n let detachInner: (() => void) | undefined;\n let result: unknown;\n let error: Error | undefined;\n const listeners = new Set<() => void>();\n let disposed = false;\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n void waitForClient()\n .then((client) => {\n if (disposed) {\n return;\n }\n innerWatch = client.watchQuery(reference, ...args);\n const sync = () => {\n result = innerWatch?.localQueryResult();\n error = innerWatch?.localQueryError();\n notify();\n };\n sync();\n detachInner = innerWatch.onUpdate(sync);\n })\n .catch((nextError) => {\n error = undefined;\n notify();\n });\n\n return {\n onUpdate(callback) {\n listeners.add(callback);\n queueMicrotask(callback);\n return () => {\n listeners.delete(callback);\n };\n },\n localQueryResult: () => result as typeof reference.__result | undefined,\n localQueryError: () => error,\n dispose() {\n if (disposed) {\n return;\n }\n disposed = true;\n detachInner?.();\n innerWatch?.dispose?.();\n listeners.clear();\n }\n };\n },\n watchRuntimeStatus: () => runtimeStatus.watch()\n };\n}\n\nexport interface AttachRuntimeBridgeOptions<\n TSchema extends SyncoreSchema<any>\n> {\n endpoint: SyncoreBridgeMessageEndpoint;\n createRuntime:\n | (() => Promise<SyncoreRuntime<TSchema>>)\n | (() => SyncoreRuntime<TSchema>);\n}\n\nexport interface AttachedRuntimeBridge {\n ready: Promise<void>;\n dispose(): Promise<void>;\n}\n\nexport function attachRuntimeBridge<\n TSchema extends SyncoreSchema<any>\n>(\n options: AttachRuntimeBridgeOptions<TSchema>\n): AttachedRuntimeBridge {\n const subscriptions = new Map<\n string,\n {\n watch: SyncoreWatch<unknown>;\n unsubscribe: () => void;\n }\n >();\n let latestStatus: SyncoreRuntimeStatus = {\n kind: \"starting\",\n reason: \"booting\"\n };\n let runtimeStatusWatch: SyncoreWatch<SyncoreRuntimeStatus> | undefined;\n let detachRuntimeStatus: (() => void) | undefined;\n\n const sendStatus = (status: SyncoreRuntimeStatus) => {\n latestStatus = status;\n options.endpoint.postMessage({\n type: \"runtime.status\",\n status\n } satisfies SyncoreBridgeResponse);\n };\n\n const runtimePromise = Promise.resolve(options.createRuntime()).then(\n async (runtime) => {\n await runtime.start();\n return runtime;\n }\n );\n\n const clientPromise = runtimePromise.then((runtime) => {\n const client = runtime.createClient();\n runtimeStatusWatch = client.watchRuntimeStatus();\n const forwardRuntimeStatus = () => {\n const status = runtimeStatusWatch?.localQueryResult();\n if (status) {\n sendStatus(status);\n }\n };\n forwardRuntimeStatus();\n detachRuntimeStatus = runtimeStatusWatch.onUpdate(forwardRuntimeStatus);\n return client;\n });\n\n const ready = clientPromise\n .then(() => {\n if (latestStatus.kind !== \"ready\") {\n sendStatus({\n kind: \"ready\",\n ...(latestStatus.capabilities\n ? { capabilities: latestStatus.capabilities }\n : {})\n });\n }\n options.endpoint.postMessage({\n type: \"runtime.ready\"\n } satisfies SyncoreBridgeResponse);\n })\n .catch((error) => {\n sendStatus({\n kind: \"error\",\n reason: \"runtime-unavailable\",\n ...(error instanceof Error ? { error } : {})\n });\n options.endpoint.postMessage({\n type: \"runtime.error\",\n error: error instanceof Error ? error.message : String(error)\n } satisfies SyncoreBridgeResponse);\n throw error;\n });\n\n const handleMessage = (event: MessageEvent<unknown>) => {\n void (async () => {\n const message = event.data as SyncoreBridgeRequest;\n if (!message || typeof message !== \"object\" || !(\"type\" in message)) {\n return;\n }\n\n if (message.type === \"runtime.status.request\") {\n sendStatus(latestStatus);\n return;\n }\n\n try {\n const client = await clientPromise;\n switch (message.type) {\n case \"invoke\": {\n const value =\n message.kind === \"query\"\n ? await client.query(message.reference, message.args)\n : message.kind === \"mutation\"\n ? await client.mutation(message.reference, message.args)\n : await client.action(message.reference, message.args);\n options.endpoint.postMessage({\n type: \"invoke.result\",\n requestId: message.requestId,\n success: true,\n value\n } satisfies SyncoreBridgeResponse);\n return;\n }\n case \"watch.subscribe\": {\n if (subscriptions.has(message.subscriptionId)) {\n return;\n }\n const watch = client.watchQuery(message.reference, message.args);\n const sendCurrentState = () => {\n const error = watch.localQueryError();\n if (error) {\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: false,\n error: error.message\n } satisfies SyncoreBridgeResponse);\n return;\n }\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: true,\n value: watch.localQueryResult()\n } satisfies SyncoreBridgeResponse);\n };\n const unsubscribe = watch.onUpdate(sendCurrentState);\n subscriptions.set(message.subscriptionId, { watch, unsubscribe });\n sendCurrentState();\n return;\n }\n case \"watch.unsubscribe\": {\n const subscription = subscriptions.get(message.subscriptionId);\n if (!subscription) {\n return;\n }\n subscription.unsubscribe();\n subscription.watch.dispose?.();\n subscriptions.delete(message.subscriptionId);\n }\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (message.type === \"invoke\") {\n options.endpoint.postMessage({\n type: \"invoke.result\",\n requestId: message.requestId,\n success: false,\n error: errorMessage\n } satisfies SyncoreBridgeResponse);\n }\n if (message.type === \"watch.subscribe\") {\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: false,\n error: errorMessage\n } satisfies SyncoreBridgeResponse);\n }\n }\n })();\n };\n\n options.endpoint.addEventListener(\"message\", handleMessage);\n sendStatus({\n kind: \"starting\",\n reason: \"booting\"\n });\n\n return {\n ready,\n async dispose() {\n sendStatus({\n kind: \"unavailable\",\n reason: \"disposed\"\n });\n options.endpoint.removeEventListener(\"message\", handleMessage);\n for (const subscription of subscriptions.values()) {\n subscription.unsubscribe();\n subscription.watch.dispose?.();\n }\n subscriptions.clear();\n detachRuntimeStatus?.();\n runtimeStatusWatch?.dispose?.();\n const runtime = await runtimePromise;\n await runtime.stop();\n }\n };\n}\n\nexport function createInvokeRequest(\n requestId: string,\n kind: \"query\" | \"mutation\" | \"action\",\n reference:\n | FunctionReference<\"query\", unknown, unknown>\n | FunctionReference<\"mutation\", unknown, unknown>\n | FunctionReference<\"action\", unknown, unknown>,\n args: JsonObject\n): SyncoreBridgeRequest {\n switch (kind) {\n case \"query\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"query\">,\n args\n };\n case \"mutation\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"mutation\">,\n args\n };\n case \"action\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"action\">,\n args\n };\n }\n}\n\nexport function createWatchKey(\n reference: FunctionReference<\"query\", unknown, unknown>,\n args: JsonObject\n): string {\n return `${reference.name}:${stableStringify(args)}`;\n}\n\nexport function normalizeOptionalArgs<TArgs>(\n args: [] | [TArgs] | readonly unknown[]\n): TArgs {\n return (args[0] ?? {}) as TArgs;\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortValue);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, sortValue(nested)])\n );\n }\n return value;\n}\n"],"mappings":"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"}
@@ -13,8 +13,48 @@ declare function isCompatibleVersionHandshake(handshake: Pick<VersionHandshake,
13
13
  type SyncoreDevtoolsEventBase = {
14
14
  runtimeId: string;
15
15
  timestamp: number;
16
+ sequence?: number;
16
17
  origin?: SyncoreDevtoolsEventOrigin;
17
18
  };
19
+ type DevtoolsPreview = {
20
+ kind: "value";
21
+ value: unknown;
22
+ truncated?: boolean;
23
+ note?: string;
24
+ } | {
25
+ kind: "error";
26
+ message: string;
27
+ truncated?: boolean;
28
+ };
29
+ interface DocumentChangePreview {
30
+ table: string;
31
+ id: string;
32
+ operation: "insert" | "patch" | "replace" | "delete";
33
+ fields?: string[];
34
+ beforePreview?: DevtoolsPreview;
35
+ afterPreview?: DevtoolsPreview;
36
+ }
37
+ interface InvalidationCause {
38
+ executionId?: string;
39
+ reason: string;
40
+ changedScopes: string[];
41
+ matchedScopes: string[];
42
+ }
43
+ interface ExecutionTrace {
44
+ executionId: string;
45
+ parentExecutionId?: string;
46
+ kind: "query" | "mutation" | "action" | "scheduler" | "dashboard";
47
+ functionName?: string;
48
+ argsPreview?: DevtoolsPreview;
49
+ resultPreview?: DevtoolsPreview;
50
+ error?: string;
51
+ readScopes?: string[];
52
+ writeScopes?: string[];
53
+ changedScopes?: string[];
54
+ changedDocumentsPreview?: DocumentChangePreview[];
55
+ invalidatedQueryIds?: string[];
56
+ schedulerJobId?: string;
57
+ }
18
58
  type SyncoreDevtoolsEvent = (SyncoreDevtoolsEventBase & {
19
59
  type: "runtime.connected";
20
60
  platform: string;
@@ -28,12 +68,21 @@ type SyncoreDevtoolsEvent = (SyncoreDevtoolsEventBase & {
28
68
  componentName?: string;
29
69
  dependencies: string[];
30
70
  durationMs: number;
71
+ executionId?: string;
72
+ parentExecutionId?: string;
73
+ argsPreview?: DevtoolsPreview;
74
+ resultPreview?: DevtoolsPreview;
75
+ readScopes?: string[];
31
76
  }) | (SyncoreDevtoolsEventBase & {
32
77
  type: "query.invalidated";
33
78
  queryId: string;
34
79
  componentPath?: string;
35
80
  componentName?: string;
36
81
  reason: string;
82
+ causedByExecutionId?: string;
83
+ changedScopes?: string[];
84
+ matchedScopes?: string[];
85
+ rerunExecutionId?: string;
37
86
  }) | (SyncoreDevtoolsEventBase & {
38
87
  type: "mutation.committed";
39
88
  mutationId: string;
@@ -42,6 +91,14 @@ type SyncoreDevtoolsEvent = (SyncoreDevtoolsEventBase & {
42
91
  componentName?: string;
43
92
  changedTables: string[];
44
93
  durationMs: number;
94
+ executionId?: string;
95
+ parentExecutionId?: string;
96
+ argsPreview?: DevtoolsPreview;
97
+ resultPreview?: DevtoolsPreview;
98
+ writeScopes?: string[];
99
+ changedScopes?: string[];
100
+ changedDocumentsPreview?: DocumentChangePreview[];
101
+ invalidatedQueryIds?: string[];
45
102
  }) | (SyncoreDevtoolsEventBase & {
46
103
  type: "action.completed";
47
104
  actionId: string;
@@ -50,9 +107,28 @@ type SyncoreDevtoolsEvent = (SyncoreDevtoolsEventBase & {
50
107
  componentName?: string;
51
108
  durationMs: number;
52
109
  error?: string;
110
+ executionId?: string;
111
+ parentExecutionId?: string;
112
+ argsPreview?: DevtoolsPreview;
113
+ resultPreview?: DevtoolsPreview;
114
+ writeScopes?: string[];
115
+ changedScopes?: string[];
116
+ changedDocumentsPreview?: DocumentChangePreview[];
117
+ invalidatedQueryIds?: string[];
53
118
  }) | (SyncoreDevtoolsEventBase & {
54
119
  type: "scheduler.tick";
55
120
  executedJobIds: string[];
121
+ executionId?: string;
122
+ jobExecutions?: Array<{
123
+ jobId: string;
124
+ executionId?: string;
125
+ functionName: string;
126
+ functionType: "mutation" | "action";
127
+ argsPreview?: DevtoolsPreview;
128
+ resultPreview?: DevtoolsPreview;
129
+ error?: string;
130
+ durationMs?: number;
131
+ }>;
56
132
  }) | (SyncoreDevtoolsEventBase & {
57
133
  type: "storage.updated";
58
134
  storageId: string;
@@ -66,6 +142,8 @@ type SyncoreDevtoolsEvent = (SyncoreDevtoolsEventBase & {
66
142
  interface SyncoreActiveQueryInfo {
67
143
  id: string;
68
144
  functionName: string;
145
+ args?: Record<string, unknown>;
146
+ consumers?: number;
69
147
  owner?: "root" | "component";
70
148
  componentPath?: string;
71
149
  componentName?: string;
@@ -79,13 +157,51 @@ interface SyncoreRuntimeSummary {
79
157
  origin?: string;
80
158
  sessionLabel?: string;
81
159
  targetKind?: "client" | "project";
160
+ runtimeRole?: "app" | "project-target";
82
161
  storageProtocol?: string;
83
162
  databaseLabel?: string;
163
+ dataSourceAlias?: string;
84
164
  storageIdentity?: string;
165
+ capabilities?: SyncoreDevtoolsCapabilities;
85
166
  connectedAt: number;
86
167
  activeQueryCount: number;
87
168
  recentEventCount: number;
88
169
  }
170
+ interface SyncoreDevtoolsCapabilities {
171
+ sql?: {
172
+ read: boolean;
173
+ write: boolean;
174
+ live: boolean;
175
+ reason?: string;
176
+ };
177
+ data?: {
178
+ browse: boolean;
179
+ mutate: boolean;
180
+ importExport: boolean;
181
+ };
182
+ storage?: {
183
+ browse: boolean;
184
+ download: boolean;
185
+ readRange?: boolean;
186
+ delete: boolean;
187
+ maxPreviewBytes?: number;
188
+ reason?: string;
189
+ };
190
+ scheduler?: {
191
+ read: boolean;
192
+ edit: boolean;
193
+ };
194
+ }
195
+ interface SyncoreDevtoolsExternalChangeEvent {
196
+ sourceId: string;
197
+ scope: "database" | "storage" | "all";
198
+ reason: "commit" | "storage-put" | "storage-delete" | "reconcile";
199
+ timestamp: number;
200
+ revision?: string;
201
+ changedScopes?: string[];
202
+ changedTables?: string[];
203
+ storageIds?: string[];
204
+ }
89
205
  declare function createBasePublicId(input: string): string;
90
206
  declare function createPublicId(key: string, keys: Iterable<string>): string;
91
207
  declare function createPublicRuntimeId(runtimeId: string, runtimeIds?: Iterable<string>): string;
@@ -102,9 +218,12 @@ type SyncoreDevtoolsMessage = {
102
218
  origin?: string;
103
219
  sessionLabel?: string;
104
220
  targetKind?: "client" | "project";
221
+ runtimeRole?: "app" | "project-target";
105
222
  storageProtocol?: string;
106
223
  databaseLabel?: string;
224
+ dataSourceAlias?: string;
107
225
  storageIdentity?: string;
226
+ capabilities?: SyncoreDevtoolsCapabilities;
108
227
  } | {
109
228
  type: "event";
110
229
  event: SyncoreDevtoolsEvent;
@@ -131,6 +250,11 @@ type SyncoreDevtoolsMessage = {
131
250
  subscriptionId: string;
132
251
  runtimeId: string;
133
252
  error: string;
253
+ } | {
254
+ type: "external.change";
255
+ runtimeId: string;
256
+ storageIdentity: string;
257
+ event: SyncoreDevtoolsExternalChangeEvent;
134
258
  };
135
259
  interface SyncoreDevtoolsCommand {
136
260
  type: "command";
@@ -170,21 +294,47 @@ type SyncoreDevtoolsCommandPayload = {
170
294
  kind: "data.delete";
171
295
  table: string;
172
296
  id: string;
297
+ } | {
298
+ kind: "data.export";
299
+ tables?: string[];
300
+ } | {
301
+ kind: "data.referenceOptions";
302
+ table: string;
303
+ search?: string;
304
+ limit?: number;
305
+ offset?: number;
173
306
  } | {
174
307
  kind: "sql.read";
175
308
  query: string;
176
309
  } | {
177
310
  kind: "sql.write";
178
311
  query: string;
312
+ } | {
313
+ kind: "storage.list";
314
+ limit?: number;
315
+ offset?: number;
316
+ search?: string;
317
+ } | {
318
+ kind: "storage.access.create";
319
+ id: string;
320
+ purpose: "preview" | "download";
321
+ } | {
322
+ kind: "storage.readRange";
323
+ id: string;
324
+ offset: number;
325
+ length: number;
326
+ } | {
327
+ kind: "storage.delete";
328
+ id: string;
179
329
  } | {
180
330
  kind: "scheduler.cancel";
181
331
  jobId: string;
182
332
  } | {
183
333
  kind: "scheduler.update";
184
334
  jobId: string;
185
- schedule: SchedulerRecurringSchedule;
335
+ schedule?: SchedulerRecurringSchedule;
186
336
  args: Record<string, unknown>;
187
- misfirePolicy: SchedulerMisfirePolicy;
337
+ misfirePolicy?: SchedulerMisfirePolicy;
188
338
  runAt?: number;
189
339
  };
190
340
  type SyncoreDevtoolsSubscriptionPayload = {
@@ -208,6 +358,11 @@ type SyncoreDevtoolsSubscriptionPayload = {
208
358
  kind: "scheduler.jobs";
209
359
  } | {
210
360
  kind: "functions.catalog";
361
+ } | {
362
+ kind: "storage.list";
363
+ limit?: number;
364
+ offset?: number;
365
+ search?: string;
211
366
  } | {
212
367
  kind: "sql.watch";
213
368
  query: string;
@@ -227,6 +382,22 @@ type SyncoreDevtoolsCommandResultPayload = {
227
382
  success: boolean;
228
383
  id?: string;
229
384
  error?: string;
385
+ } | {
386
+ kind: "data.export.result";
387
+ tables: Array<{
388
+ name: string;
389
+ rows: Record<string, unknown>[];
390
+ totalCount: number;
391
+ }>;
392
+ error?: string;
393
+ } | {
394
+ kind: "data.referenceOptions.result";
395
+ table: string;
396
+ rows: Record<string, unknown>[];
397
+ totalCount: number;
398
+ offset: number;
399
+ hasMore: boolean;
400
+ error?: string;
230
401
  } | {
231
402
  kind: "sql.read.result";
232
403
  columns: string[];
@@ -237,6 +408,35 @@ type SyncoreDevtoolsCommandResultPayload = {
237
408
  rowsAffected: number;
238
409
  error?: string;
239
410
  invalidationScopes: string[];
411
+ } | {
412
+ kind: "storage.list.result";
413
+ entries: StorageEntry[];
414
+ totalCount: number;
415
+ offset: number;
416
+ hasMore: boolean;
417
+ error?: string;
418
+ } | {
419
+ kind: "storage.access.create.result";
420
+ entry?: StorageEntry;
421
+ url?: string;
422
+ expiresAt?: number;
423
+ supportsRange?: boolean;
424
+ maxPreviewBytes?: number;
425
+ error?: string;
426
+ } | {
427
+ kind: "storage.readRange.result";
428
+ entry?: StorageEntry;
429
+ offset: number;
430
+ bytesRead: number;
431
+ done: boolean;
432
+ supportsRange: boolean;
433
+ base64?: string;
434
+ error?: string;
435
+ } | {
436
+ kind: "storage.delete.result";
437
+ success: boolean;
438
+ deleted: boolean;
439
+ error?: string;
240
440
  } | {
241
441
  kind: "scheduler.cancel.result";
242
442
  success: boolean;
@@ -276,6 +476,13 @@ type SyncoreDevtoolsSubscriptionResultPayload = {
276
476
  } | {
277
477
  kind: "functions.catalog.result";
278
478
  functions: FunctionDefinition[];
479
+ } | {
480
+ kind: "storage.list.result";
481
+ entries: StorageEntry[];
482
+ totalCount: number;
483
+ offset: number;
484
+ hasMore: boolean;
485
+ error?: string;
279
486
  } | {
280
487
  kind: "sql.watch.result";
281
488
  columns: string[];
@@ -285,7 +492,10 @@ type SyncoreDevtoolsSubscriptionResultPayload = {
285
492
  interface FunctionDefinition {
286
493
  name: string;
287
494
  type: "query" | "mutation" | "action";
288
- file: string;
495
+ file?: string;
496
+ modulePath?: string;
497
+ namespace?: string;
498
+ metadataAvailable?: boolean;
289
499
  owner?: "root" | "component";
290
500
  componentPath?: string;
291
501
  componentName?: string;
@@ -310,12 +520,21 @@ interface TableField {
310
520
  name: string;
311
521
  type: string;
312
522
  optional: boolean;
523
+ referenceTable?: string;
313
524
  }
314
525
  interface TableIndex {
315
526
  name: string;
316
527
  fields: string[];
317
528
  unique: boolean;
318
529
  }
530
+ interface StorageEntry {
531
+ id: string;
532
+ createdAt: number;
533
+ fileName?: string;
534
+ contentType?: string;
535
+ size: number;
536
+ path: string;
537
+ }
319
538
  interface SchedulerJob {
320
539
  id: string;
321
540
  functionName: string;
@@ -371,5 +590,5 @@ type SchedulerMisfirePolicy = {
371
590
  windowMs: number;
372
591
  };
373
592
  //#endregion
374
- export { DataFilter, FunctionDefinition, SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION, SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION, SYNCORE_DEVTOOLS_PROTOCOL_VERSION, SchedulerJob, SchedulerMisfirePolicy, SchedulerRecurringDailySchedule, SchedulerRecurringIntervalSchedule, SchedulerRecurringSchedule, SchedulerRecurringWeeklySchedule, SyncoreActiveQueryInfo, SyncoreDevtoolsClientMessage, SyncoreDevtoolsCommand, SyncoreDevtoolsCommandPayload, SyncoreDevtoolsCommandResultPayload, SyncoreDevtoolsEvent, SyncoreDevtoolsEventOrigin, SyncoreDevtoolsMessage, SyncoreDevtoolsSubscribe, SyncoreDevtoolsSubscriptionPayload, SyncoreDevtoolsSubscriptionResultPayload, SyncoreDevtoolsUnsubscribe, SyncoreRuntimeSummary, TableField, TableIndex, TableSchema, VersionHandshake, createBasePublicId, createPublicId, createPublicRuntimeId, createPublicTargetId, isCompatibleVersionHandshake };
593
+ export { DataFilter, DevtoolsPreview, DocumentChangePreview, ExecutionTrace, FunctionDefinition, InvalidationCause, SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION, SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION, SYNCORE_DEVTOOLS_PROTOCOL_VERSION, SchedulerJob, SchedulerMisfirePolicy, SchedulerRecurringDailySchedule, SchedulerRecurringIntervalSchedule, SchedulerRecurringSchedule, SchedulerRecurringWeeklySchedule, StorageEntry, SyncoreActiveQueryInfo, SyncoreDevtoolsCapabilities, SyncoreDevtoolsClientMessage, SyncoreDevtoolsCommand, SyncoreDevtoolsCommandPayload, SyncoreDevtoolsCommandResultPayload, SyncoreDevtoolsEvent, SyncoreDevtoolsEventOrigin, SyncoreDevtoolsExternalChangeEvent, SyncoreDevtoolsMessage, SyncoreDevtoolsSubscribe, SyncoreDevtoolsSubscriptionPayload, SyncoreDevtoolsSubscriptionResultPayload, SyncoreDevtoolsUnsubscribe, SyncoreRuntimeSummary, TableField, TableIndex, TableSchema, VersionHandshake, createBasePublicId, createPublicId, createPublicRuntimeId, createPublicTargetId, isCompatibleVersionHandshake };
375
594
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type SyncoreDevtoolsEventOrigin = \"runtime\" | \"dashboard\";\n\nexport const SYNCORE_DEVTOOLS_PROTOCOL_VERSION = 1;\nexport const SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION = 1;\nexport const SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION = 1;\n\nexport interface VersionHandshake {\n protocolVersion: number;\n minSupportedProtocolVersion: number;\n maxSupportedProtocolVersion: number;\n runtimeVersion?: string;\n}\n\nexport function isCompatibleVersionHandshake(\n handshake: Pick<\n VersionHandshake,\n \"protocolVersion\" | \"minSupportedProtocolVersion\" | \"maxSupportedProtocolVersion\"\n >\n): boolean {\n return (\n handshake.maxSupportedProtocolVersion >=\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION &&\n handshake.minSupportedProtocolVersion <=\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION &&\n handshake.protocolVersion >= handshake.minSupportedProtocolVersion &&\n handshake.protocolVersion <= handshake.maxSupportedProtocolVersion\n );\n}\n\ntype SyncoreDevtoolsEventBase = {\n runtimeId: string;\n timestamp: number;\n origin?: SyncoreDevtoolsEventOrigin;\n};\n\nexport type SyncoreDevtoolsEvent =\n | (SyncoreDevtoolsEventBase & {\n type: \"runtime.connected\";\n platform: string;\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"runtime.disconnected\";\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"query.executed\";\n queryId: string;\n functionName: string;\n componentPath?: string;\n componentName?: string;\n dependencies: string[];\n durationMs: number;\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"query.invalidated\";\n queryId: string;\n componentPath?: string;\n componentName?: string;\n reason: string;\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"mutation.committed\";\n mutationId: string;\n functionName: string;\n componentPath?: string;\n componentName?: string;\n changedTables: string[];\n durationMs: number;\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"action.completed\";\n actionId: string;\n functionName: string;\n componentPath?: string;\n componentName?: string;\n durationMs: number;\n error?: string;\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"scheduler.tick\";\n executedJobIds: string[];\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"storage.updated\";\n storageId: string;\n componentPath?: string;\n operation: \"put\" | \"delete\";\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"log\";\n level: \"info\" | \"warn\" | \"error\";\n message: string;\n });\n\nexport interface SyncoreActiveQueryInfo {\n id: string;\n functionName: string;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n dependencyKeys: string[];\n lastRunAt: number;\n}\n\nexport interface SyncoreRuntimeSummary {\n runtimeId: string;\n platform: string;\n appName?: string;\n origin?: string;\n sessionLabel?: string;\n targetKind?: \"client\" | \"project\";\n storageProtocol?: string;\n databaseLabel?: string;\n storageIdentity?: string;\n connectedAt: number;\n activeQueryCount: number;\n recentEventCount: number;\n}\n\nexport function createBasePublicId(input: string): string {\n return stablePublicId(input, 0);\n}\n\nexport function createPublicId(\n key: string,\n keys: Iterable<string>\n): string {\n return createPublicIdWithFormatter(key, keys, stablePublicId);\n}\n\nexport function createPublicRuntimeId(\n runtimeId: string,\n runtimeIds?: Iterable<string>\n): string {\n return runtimeIds\n ? createPublicIdWithFormatter(runtimeId, runtimeIds, stableRuntimePublicId)\n : stableRuntimePublicId(runtimeId, 0);\n}\n\nexport function createPublicTargetId(\n targetKey: string,\n targetKeys: Iterable<string>\n): string {\n return createPublicId(targetKey, targetKeys);\n}\n\nfunction createPublicIdWithFormatter(\n key: string,\n keys: Iterable<string>,\n formatPublicId: (input: string, salt: number) => string\n): string {\n const used = new Set<string>();\n for (const existingKey of [...keys].sort()) {\n let attempt = 0;\n while (true) {\n const candidate = formatPublicId(existingKey, attempt);\n if (existingKey === key && !used.has(candidate)) {\n return candidate;\n }\n if (!used.has(candidate)) {\n used.add(candidate);\n break;\n }\n attempt += 1;\n }\n }\n return formatPublicId(key, 0);\n}\n\nfunction stablePublicId(input: string, salt: number): string {\n const value = stableHash(input, salt) % 100000;\n return value.toString().padStart(5, \"0\");\n}\n\nfunction stableRuntimePublicId(input: string, salt: number): string {\n const value = stableHash(input, salt);\n const letter = String.fromCharCode(65 + (value % 26));\n const digits = Math.floor(value / 26) % 1000;\n return `${letter}${digits.toString().padStart(3, \"0\")}`;\n}\n\nfunction stableHash(input: string, salt: number): number {\n const hashInput = salt === 0 ? input : `${input}#${salt}`;\n let hash = 2166136261;\n for (let index = 0; index < hashInput.length; index += 1) {\n hash ^= hashInput.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\n/* ------------------------------------------------------------------ */\n/* Runtime → Dashboard messages */\n/* ------------------------------------------------------------------ */\n\nexport type SyncoreDevtoolsMessage =\n | {\n type: \"hello\";\n protocolVersion?: number;\n minSupportedProtocolVersion?: number;\n maxSupportedProtocolVersion?: number;\n runtimeVersion?: string;\n runtimeId: string;\n platform: string;\n appName?: string;\n origin?: string;\n sessionLabel?: string;\n targetKind?: \"client\" | \"project\";\n storageProtocol?: string;\n databaseLabel?: string;\n storageIdentity?: string;\n }\n | { type: \"event\"; event: SyncoreDevtoolsEvent }\n | {\n type: \"event.batch\";\n runtimeId: string;\n events: SyncoreDevtoolsEvent[];\n }\n | { type: \"ping\" }\n | { type: \"pong\" }\n | {\n type: \"command.result\";\n commandId: string;\n runtimeId: string;\n payload: SyncoreDevtoolsCommandResultPayload;\n }\n | {\n type: \"subscription.data\";\n subscriptionId: string;\n runtimeId: string;\n payload: SyncoreDevtoolsSubscriptionResultPayload;\n }\n | {\n type: \"subscription.error\";\n subscriptionId: string;\n runtimeId: string;\n error: string;\n };\n\n/* ------------------------------------------------------------------ */\n/* Dashboard → Runtime requests */\n/* ------------------------------------------------------------------ */\n\nexport interface SyncoreDevtoolsCommand {\n type: \"command\";\n commandId: string;\n targetRuntimeId: string;\n payload: SyncoreDevtoolsCommandPayload;\n}\n\nexport interface SyncoreDevtoolsSubscribe {\n type: \"subscribe\";\n subscriptionId: string;\n targetRuntimeId: string;\n payload: SyncoreDevtoolsSubscriptionPayload;\n}\n\nexport interface SyncoreDevtoolsUnsubscribe {\n type: \"unsubscribe\";\n subscriptionId: string;\n targetRuntimeId: string;\n}\n\nexport type SyncoreDevtoolsClientMessage =\n | { type: \"ping\" }\n | SyncoreDevtoolsCommand\n | SyncoreDevtoolsSubscribe\n | SyncoreDevtoolsUnsubscribe;\n\nexport type SyncoreDevtoolsCommandPayload =\n /* Functions */\n | {\n kind: \"fn.run\";\n functionName: string;\n functionType: \"query\" | \"mutation\" | \"action\";\n args: Record<string, unknown>;\n }\n | { kind: \"data.insert\"; table: string; document: Record<string, unknown> }\n | {\n kind: \"data.patch\";\n table: string;\n id: string;\n fields: Record<string, unknown>;\n }\n | { kind: \"data.delete\"; table: string; id: string }\n /* SQL */\n | { kind: \"sql.read\"; query: string }\n | { kind: \"sql.write\"; query: string }\n /* Scheduler */\n | { kind: \"scheduler.cancel\"; jobId: string }\n | {\n kind: \"scheduler.update\";\n jobId: string;\n schedule: SchedulerRecurringSchedule;\n args: Record<string, unknown>;\n misfirePolicy: SchedulerMisfirePolicy;\n runAt?: number;\n };\n\nexport type SyncoreDevtoolsSubscriptionPayload =\n | { kind: \"runtime.summary\" }\n | { kind: \"runtime.activeQueries\" }\n | { kind: \"schema.tables\" }\n | {\n kind: \"fn.watch\";\n functionName: string;\n functionType: \"query\";\n args: Record<string, unknown>;\n }\n | {\n kind: \"data.table\";\n table: string;\n filters?: DataFilter[];\n limit?: number;\n cursor?: string;\n }\n | { kind: \"scheduler.jobs\" }\n | { kind: \"functions.catalog\" }\n | { kind: \"sql.watch\"; query: string };\n\nexport interface DataFilter {\n field: string;\n operator:\n | \"eq\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"contains\"\n | \"startsWith\";\n value: unknown;\n}\n\n/* ------------------------------------------------------------------ */\n/* Response payloads */\n/* ------------------------------------------------------------------ */\n\nexport type SyncoreDevtoolsCommandResultPayload =\n | {\n kind: \"fn.run.result\";\n result?: unknown;\n error?: string;\n durationMs: number;\n }\n | {\n kind: \"data.mutate.result\";\n success: boolean;\n id?: string;\n error?: string;\n }\n | {\n kind: \"sql.read.result\";\n columns: string[];\n rows: unknown[][];\n error?: string;\n }\n | {\n kind: \"sql.write.result\";\n rowsAffected: number;\n error?: string;\n invalidationScopes: string[];\n }\n | {\n kind: \"scheduler.cancel.result\";\n success: boolean;\n cancelled: boolean;\n error?: string;\n }\n | {\n kind: \"scheduler.update.result\";\n success: boolean;\n updated: boolean;\n error?: string;\n job?: SchedulerJob;\n }\n | { kind: \"error\"; message: string };\n\nexport type SyncoreDevtoolsSubscriptionResultPayload =\n | { kind: \"runtime.summary.result\"; summary: SyncoreRuntimeSummary }\n | {\n kind: \"runtime.activeQueries.result\";\n activeQueries: SyncoreActiveQueryInfo[];\n }\n | {\n kind: \"fn.watch.result\";\n result?: unknown;\n error?: string;\n }\n | { kind: \"schema.tables.result\"; tables: TableSchema[] }\n | {\n kind: \"data.table.result\";\n rows: Record<string, unknown>[];\n totalCount: number;\n cursor?: string;\n }\n | { kind: \"scheduler.jobs.result\"; jobs: SchedulerJob[] }\n | { kind: \"functions.catalog.result\"; functions: FunctionDefinition[] }\n | {\n kind: \"sql.watch.result\";\n columns: string[];\n rows: unknown[][];\n observedTables: string[];\n };\n\n/* ------------------------------------------------------------------ */\n/* Shared data shapes */\n/* ------------------------------------------------------------------ */\n\nexport interface FunctionDefinition {\n name: string;\n type: \"query\" | \"mutation\" | \"action\";\n file: string;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n visibility?: \"public\" | \"internal\";\n localName?: string;\n /** Argument validator schema (JSON Schema-like), if available */\n args?: Record<string, unknown>;\n /** Return validator schema, if available */\n returns?: Record<string, unknown>;\n}\n\nexport interface TableSchema {\n name: string;\n displayName?: string;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n fields: TableField[];\n indexes: TableIndex[];\n documentCount: number;\n}\n\nexport interface TableField {\n name: string;\n type: string;\n optional: boolean;\n}\n\nexport interface TableIndex {\n name: string;\n fields: string[];\n unique: boolean;\n}\n\nexport interface SchedulerJob {\n id: string;\n functionName: string;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n args: Record<string, unknown>;\n scheduledAt: number;\n runAt: number;\n status: \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\";\n completedAt?: number;\n result?: unknown;\n error?: string;\n durationMs?: number;\n recurringName?: string;\n schedule?: SchedulerRecurringSchedule;\n scheduleLabel?: string;\n misfirePolicy?: SchedulerMisfirePolicy;\n timezone?: string;\n lastRunAt?: number;\n updatedAt?: number;\n /** Compatibility label for older UI code. */\n cronSchedule?: string;\n}\n\nexport interface SchedulerRecurringIntervalSchedule {\n type: \"interval\";\n seconds?: number;\n minutes?: number;\n hours?: number;\n}\n\nexport interface SchedulerRecurringDailySchedule {\n type: \"daily\";\n hour: number;\n minute: number;\n timezone?: string;\n}\n\nexport interface SchedulerRecurringWeeklySchedule {\n type: \"weekly\";\n dayOfWeek:\n | \"sunday\"\n | \"monday\"\n | \"tuesday\"\n | \"wednesday\"\n | \"thursday\"\n | \"friday\"\n | \"saturday\";\n hour: number;\n minute: number;\n timezone?: string;\n}\n\nexport type SchedulerRecurringSchedule =\n | SchedulerRecurringIntervalSchedule\n | SchedulerRecurringDailySchedule\n | SchedulerRecurringWeeklySchedule;\n\nexport type SchedulerMisfirePolicy =\n | { type: \"catch_up\" }\n | { type: \"skip\" }\n | { type: \"run_once_if_missed\" }\n | { type: \"windowed\"; windowMs: number };\n"],"mappings":";AAEA,MAAa,oCAAoC;AACjD,MAAa,kDAAkD;AAC/D,MAAa,kDAAkD;AAS/D,SAAgB,6BACd,WAIS;AACT,QACE,UAAU,+BAAA,KAEV,UAAU,+BAAA,KAEV,UAAU,mBAAmB,UAAU,+BACvC,UAAU,mBAAmB,UAAU;;AA6F3C,SAAgB,mBAAmB,OAAuB;AACxD,QAAO,eAAe,OAAO,EAAE;;AAGjC,SAAgB,eACd,KACA,MACQ;AACR,QAAO,4BAA4B,KAAK,MAAM,eAAe;;AAG/D,SAAgB,sBACd,WACA,YACQ;AACR,QAAO,aACH,4BAA4B,WAAW,YAAY,sBAAsB,GACzE,sBAAsB,WAAW,EAAE;;AAGzC,SAAgB,qBACd,WACA,YACQ;AACR,QAAO,eAAe,WAAW,WAAW;;AAG9C,SAAS,4BACP,KACA,MACA,gBACQ;CACR,MAAM,uBAAO,IAAI,KAAa;AAC9B,MAAK,MAAM,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE;EAC1C,IAAI,UAAU;AACd,SAAO,MAAM;GACX,MAAM,YAAY,eAAe,aAAa,QAAQ;AACtD,OAAI,gBAAgB,OAAO,CAAC,KAAK,IAAI,UAAU,CAC7C,QAAO;AAET,OAAI,CAAC,KAAK,IAAI,UAAU,EAAE;AACxB,SAAK,IAAI,UAAU;AACnB;;AAEF,cAAW;;;AAGf,QAAO,eAAe,KAAK,EAAE;;AAG/B,SAAS,eAAe,OAAe,MAAsB;AAE3D,SADc,WAAW,OAAO,KAAK,GAAG,KAC3B,UAAU,CAAC,SAAS,GAAG,IAAI;;AAG1C,SAAS,sBAAsB,OAAe,MAAsB;CAClE,MAAM,QAAQ,WAAW,OAAO,KAAK;AAGrC,QAAO,GAFQ,OAAO,aAAa,KAAM,QAAQ,GAAI,IACtC,KAAK,MAAM,QAAQ,GAAG,GAAG,KACd,UAAU,CAAC,SAAS,GAAG,IAAI;;AAGvD,SAAS,WAAW,OAAe,MAAsB;CACvD,MAAM,YAAY,SAAS,IAAI,QAAQ,GAAG,MAAM,GAAG;CACnD,IAAI,OAAO;AACX,MAAK,IAAI,QAAQ,GAAG,QAAQ,UAAU,QAAQ,SAAS,GAAG;AACxD,UAAQ,UAAU,WAAW,MAAM;AACnC,SAAO,KAAK,KAAK,MAAM,SAAS;;AAElC,QAAO,SAAS"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type SyncoreDevtoolsEventOrigin = \"runtime\" | \"dashboard\";\n\nexport const SYNCORE_DEVTOOLS_PROTOCOL_VERSION = 1;\nexport const SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION = 1;\nexport const SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION = 1;\n\nexport interface VersionHandshake {\n protocolVersion: number;\n minSupportedProtocolVersion: number;\n maxSupportedProtocolVersion: number;\n runtimeVersion?: string;\n}\n\nexport function isCompatibleVersionHandshake(\n handshake: Pick<\n VersionHandshake,\n | \"protocolVersion\"\n | \"minSupportedProtocolVersion\"\n | \"maxSupportedProtocolVersion\"\n >\n): boolean {\n return (\n handshake.maxSupportedProtocolVersion >=\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION &&\n handshake.minSupportedProtocolVersion <=\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION &&\n handshake.protocolVersion >= handshake.minSupportedProtocolVersion &&\n handshake.protocolVersion <= handshake.maxSupportedProtocolVersion\n );\n}\n\ntype SyncoreDevtoolsEventBase = {\n runtimeId: string;\n timestamp: number;\n sequence?: number;\n origin?: SyncoreDevtoolsEventOrigin;\n};\n\nexport type DevtoolsPreview =\n | {\n kind: \"value\";\n value: unknown;\n truncated?: boolean;\n note?: string;\n }\n | {\n kind: \"error\";\n message: string;\n truncated?: boolean;\n };\n\nexport interface DocumentChangePreview {\n table: string;\n id: string;\n operation: \"insert\" | \"patch\" | \"replace\" | \"delete\";\n fields?: string[];\n beforePreview?: DevtoolsPreview;\n afterPreview?: DevtoolsPreview;\n}\n\nexport interface InvalidationCause {\n executionId?: string;\n reason: string;\n changedScopes: string[];\n matchedScopes: string[];\n}\n\nexport interface ExecutionTrace {\n executionId: string;\n parentExecutionId?: string;\n kind: \"query\" | \"mutation\" | \"action\" | \"scheduler\" | \"dashboard\";\n functionName?: string;\n argsPreview?: DevtoolsPreview;\n resultPreview?: DevtoolsPreview;\n error?: string;\n readScopes?: string[];\n writeScopes?: string[];\n changedScopes?: string[];\n changedDocumentsPreview?: DocumentChangePreview[];\n invalidatedQueryIds?: string[];\n schedulerJobId?: string;\n}\n\nexport type SyncoreDevtoolsEvent =\n | (SyncoreDevtoolsEventBase & {\n type: \"runtime.connected\";\n platform: string;\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"runtime.disconnected\";\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"query.executed\";\n queryId: string;\n functionName: string;\n componentPath?: string;\n componentName?: string;\n dependencies: string[];\n durationMs: number;\n executionId?: string;\n parentExecutionId?: string;\n argsPreview?: DevtoolsPreview;\n resultPreview?: DevtoolsPreview;\n readScopes?: string[];\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"query.invalidated\";\n queryId: string;\n componentPath?: string;\n componentName?: string;\n reason: string;\n causedByExecutionId?: string;\n changedScopes?: string[];\n matchedScopes?: string[];\n rerunExecutionId?: string;\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"mutation.committed\";\n mutationId: string;\n functionName: string;\n componentPath?: string;\n componentName?: string;\n changedTables: string[];\n durationMs: number;\n executionId?: string;\n parentExecutionId?: string;\n argsPreview?: DevtoolsPreview;\n resultPreview?: DevtoolsPreview;\n writeScopes?: string[];\n changedScopes?: string[];\n changedDocumentsPreview?: DocumentChangePreview[];\n invalidatedQueryIds?: string[];\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"action.completed\";\n actionId: string;\n functionName: string;\n componentPath?: string;\n componentName?: string;\n durationMs: number;\n error?: string;\n executionId?: string;\n parentExecutionId?: string;\n argsPreview?: DevtoolsPreview;\n resultPreview?: DevtoolsPreview;\n writeScopes?: string[];\n changedScopes?: string[];\n changedDocumentsPreview?: DocumentChangePreview[];\n invalidatedQueryIds?: string[];\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"scheduler.tick\";\n executedJobIds: string[];\n executionId?: string;\n jobExecutions?: Array<{\n jobId: string;\n executionId?: string;\n functionName: string;\n functionType: \"mutation\" | \"action\";\n argsPreview?: DevtoolsPreview;\n resultPreview?: DevtoolsPreview;\n error?: string;\n durationMs?: number;\n }>;\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"storage.updated\";\n storageId: string;\n componentPath?: string;\n operation: \"put\" | \"delete\";\n })\n | (SyncoreDevtoolsEventBase & {\n type: \"log\";\n level: \"info\" | \"warn\" | \"error\";\n message: string;\n });\n\nexport interface SyncoreActiveQueryInfo {\n id: string;\n functionName: string;\n args?: Record<string, unknown>;\n consumers?: number;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n dependencyKeys: string[];\n lastRunAt: number;\n}\n\nexport interface SyncoreRuntimeSummary {\n runtimeId: string;\n platform: string;\n appName?: string;\n origin?: string;\n sessionLabel?: string;\n targetKind?: \"client\" | \"project\";\n runtimeRole?: \"app\" | \"project-target\";\n storageProtocol?: string;\n databaseLabel?: string;\n dataSourceAlias?: string;\n storageIdentity?: string;\n capabilities?: SyncoreDevtoolsCapabilities;\n connectedAt: number;\n activeQueryCount: number;\n recentEventCount: number;\n}\n\nexport interface SyncoreDevtoolsCapabilities {\n sql?: {\n read: boolean;\n write: boolean;\n live: boolean;\n reason?: string;\n };\n data?: {\n browse: boolean;\n mutate: boolean;\n importExport: boolean;\n };\n storage?: {\n browse: boolean;\n download: boolean;\n readRange?: boolean;\n delete: boolean;\n maxPreviewBytes?: number;\n reason?: string;\n };\n scheduler?: {\n read: boolean;\n edit: boolean;\n };\n}\n\nexport interface SyncoreDevtoolsExternalChangeEvent {\n sourceId: string;\n scope: \"database\" | \"storage\" | \"all\";\n reason: \"commit\" | \"storage-put\" | \"storage-delete\" | \"reconcile\";\n timestamp: number;\n revision?: string;\n changedScopes?: string[];\n changedTables?: string[];\n storageIds?: string[];\n}\n\nexport function createBasePublicId(input: string): string {\n return stablePublicId(input, 0);\n}\n\nexport function createPublicId(key: string, keys: Iterable<string>): string {\n return createPublicIdWithFormatter(key, keys, stablePublicId);\n}\n\nexport function createPublicRuntimeId(\n runtimeId: string,\n runtimeIds?: Iterable<string>\n): string {\n return runtimeIds\n ? createPublicIdWithFormatter(runtimeId, runtimeIds, stableRuntimePublicId)\n : stableRuntimePublicId(runtimeId, 0);\n}\n\nexport function createPublicTargetId(\n targetKey: string,\n targetKeys: Iterable<string>\n): string {\n return createPublicId(targetKey, targetKeys);\n}\n\nfunction createPublicIdWithFormatter(\n key: string,\n keys: Iterable<string>,\n formatPublicId: (input: string, salt: number) => string\n): string {\n const used = new Set<string>();\n for (const existingKey of [...keys].sort()) {\n let attempt = 0;\n while (true) {\n const candidate = formatPublicId(existingKey, attempt);\n if (existingKey === key && !used.has(candidate)) {\n return candidate;\n }\n if (!used.has(candidate)) {\n used.add(candidate);\n break;\n }\n attempt += 1;\n }\n }\n return formatPublicId(key, 0);\n}\n\nfunction stablePublicId(input: string, salt: number): string {\n const value = stableHash(input, salt) % 100000;\n return value.toString().padStart(5, \"0\");\n}\n\nfunction stableRuntimePublicId(input: string, salt: number): string {\n const value = stableHash(input, salt);\n const letter = String.fromCharCode(65 + (value % 26));\n const digits = Math.floor(value / 26) % 1000;\n return `${letter}${digits.toString().padStart(3, \"0\")}`;\n}\n\nfunction stableHash(input: string, salt: number): number {\n const hashInput = salt === 0 ? input : `${input}#${salt}`;\n let hash = 2166136261;\n for (let index = 0; index < hashInput.length; index += 1) {\n hash ^= hashInput.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\n/* ------------------------------------------------------------------ */\n/* Runtime → Dashboard messages */\n/* ------------------------------------------------------------------ */\n\nexport type SyncoreDevtoolsMessage =\n | {\n type: \"hello\";\n protocolVersion?: number;\n minSupportedProtocolVersion?: number;\n maxSupportedProtocolVersion?: number;\n runtimeVersion?: string;\n runtimeId: string;\n platform: string;\n appName?: string;\n origin?: string;\n sessionLabel?: string;\n targetKind?: \"client\" | \"project\";\n runtimeRole?: \"app\" | \"project-target\";\n storageProtocol?: string;\n databaseLabel?: string;\n dataSourceAlias?: string;\n storageIdentity?: string;\n capabilities?: SyncoreDevtoolsCapabilities;\n }\n | { type: \"event\"; event: SyncoreDevtoolsEvent }\n | {\n type: \"event.batch\";\n runtimeId: string;\n events: SyncoreDevtoolsEvent[];\n }\n | { type: \"ping\" }\n | { type: \"pong\" }\n | {\n type: \"command.result\";\n commandId: string;\n runtimeId: string;\n payload: SyncoreDevtoolsCommandResultPayload;\n }\n | {\n type: \"subscription.data\";\n subscriptionId: string;\n runtimeId: string;\n payload: SyncoreDevtoolsSubscriptionResultPayload;\n }\n | {\n type: \"subscription.error\";\n subscriptionId: string;\n runtimeId: string;\n error: string;\n }\n | {\n type: \"external.change\";\n runtimeId: string;\n storageIdentity: string;\n event: SyncoreDevtoolsExternalChangeEvent;\n };\n\n/* ------------------------------------------------------------------ */\n/* Dashboard → Runtime requests */\n/* ------------------------------------------------------------------ */\n\nexport interface SyncoreDevtoolsCommand {\n type: \"command\";\n commandId: string;\n targetRuntimeId: string;\n payload: SyncoreDevtoolsCommandPayload;\n}\n\nexport interface SyncoreDevtoolsSubscribe {\n type: \"subscribe\";\n subscriptionId: string;\n targetRuntimeId: string;\n payload: SyncoreDevtoolsSubscriptionPayload;\n}\n\nexport interface SyncoreDevtoolsUnsubscribe {\n type: \"unsubscribe\";\n subscriptionId: string;\n targetRuntimeId: string;\n}\n\nexport type SyncoreDevtoolsClientMessage =\n | { type: \"ping\" }\n | SyncoreDevtoolsCommand\n | SyncoreDevtoolsSubscribe\n | SyncoreDevtoolsUnsubscribe;\n\nexport type SyncoreDevtoolsCommandPayload =\n /* Functions */\n | {\n kind: \"fn.run\";\n functionName: string;\n functionType: \"query\" | \"mutation\" | \"action\";\n args: Record<string, unknown>;\n }\n | { kind: \"data.insert\"; table: string; document: Record<string, unknown> }\n | {\n kind: \"data.patch\";\n table: string;\n id: string;\n fields: Record<string, unknown>;\n }\n | { kind: \"data.delete\"; table: string; id: string }\n | { kind: \"data.export\"; tables?: string[] }\n | {\n kind: \"data.referenceOptions\";\n table: string;\n search?: string;\n limit?: number;\n offset?: number;\n }\n /* SQL */\n | { kind: \"sql.read\"; query: string }\n | { kind: \"sql.write\"; query: string }\n /* Storage */\n | {\n kind: \"storage.list\";\n limit?: number;\n offset?: number;\n search?: string;\n }\n | {\n kind: \"storage.access.create\";\n id: string;\n purpose: \"preview\" | \"download\";\n }\n | {\n kind: \"storage.readRange\";\n id: string;\n offset: number;\n length: number;\n }\n | { kind: \"storage.delete\"; id: string }\n /* Scheduler */\n | { kind: \"scheduler.cancel\"; jobId: string }\n | {\n kind: \"scheduler.update\";\n jobId: string;\n schedule?: SchedulerRecurringSchedule;\n args: Record<string, unknown>;\n misfirePolicy?: SchedulerMisfirePolicy;\n runAt?: number;\n };\n\nexport type SyncoreDevtoolsSubscriptionPayload =\n | { kind: \"runtime.summary\" }\n | { kind: \"runtime.activeQueries\" }\n | { kind: \"schema.tables\" }\n | {\n kind: \"fn.watch\";\n functionName: string;\n functionType: \"query\";\n args: Record<string, unknown>;\n }\n | {\n kind: \"data.table\";\n table: string;\n filters?: DataFilter[];\n limit?: number;\n cursor?: string;\n }\n | { kind: \"scheduler.jobs\" }\n | { kind: \"functions.catalog\" }\n | {\n kind: \"storage.list\";\n limit?: number;\n offset?: number;\n search?: string;\n }\n | { kind: \"sql.watch\"; query: string };\n\nexport interface DataFilter {\n field: string;\n operator:\n | \"eq\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"contains\"\n | \"startsWith\";\n value: unknown;\n}\n\n/* ------------------------------------------------------------------ */\n/* Response payloads */\n/* ------------------------------------------------------------------ */\n\nexport type SyncoreDevtoolsCommandResultPayload =\n | {\n kind: \"fn.run.result\";\n result?: unknown;\n error?: string;\n durationMs: number;\n }\n | {\n kind: \"data.mutate.result\";\n success: boolean;\n id?: string;\n error?: string;\n }\n | {\n kind: \"data.export.result\";\n tables: Array<{\n name: string;\n rows: Record<string, unknown>[];\n totalCount: number;\n }>;\n error?: string;\n }\n | {\n kind: \"data.referenceOptions.result\";\n table: string;\n rows: Record<string, unknown>[];\n totalCount: number;\n offset: number;\n hasMore: boolean;\n error?: string;\n }\n | {\n kind: \"sql.read.result\";\n columns: string[];\n rows: unknown[][];\n error?: string;\n }\n | {\n kind: \"sql.write.result\";\n rowsAffected: number;\n error?: string;\n invalidationScopes: string[];\n }\n | {\n kind: \"storage.list.result\";\n entries: StorageEntry[];\n totalCount: number;\n offset: number;\n hasMore: boolean;\n error?: string;\n }\n | {\n kind: \"storage.access.create.result\";\n entry?: StorageEntry;\n url?: string;\n expiresAt?: number;\n supportsRange?: boolean;\n maxPreviewBytes?: number;\n error?: string;\n }\n | {\n kind: \"storage.readRange.result\";\n entry?: StorageEntry;\n offset: number;\n bytesRead: number;\n done: boolean;\n supportsRange: boolean;\n base64?: string;\n error?: string;\n }\n | {\n kind: \"storage.delete.result\";\n success: boolean;\n deleted: boolean;\n error?: string;\n }\n | {\n kind: \"scheduler.cancel.result\";\n success: boolean;\n cancelled: boolean;\n error?: string;\n }\n | {\n kind: \"scheduler.update.result\";\n success: boolean;\n updated: boolean;\n error?: string;\n job?: SchedulerJob;\n }\n | { kind: \"error\"; message: string };\n\nexport type SyncoreDevtoolsSubscriptionResultPayload =\n | { kind: \"runtime.summary.result\"; summary: SyncoreRuntimeSummary }\n | {\n kind: \"runtime.activeQueries.result\";\n activeQueries: SyncoreActiveQueryInfo[];\n }\n | {\n kind: \"fn.watch.result\";\n result?: unknown;\n error?: string;\n }\n | { kind: \"schema.tables.result\"; tables: TableSchema[] }\n | {\n kind: \"data.table.result\";\n rows: Record<string, unknown>[];\n totalCount: number;\n cursor?: string;\n }\n | { kind: \"scheduler.jobs.result\"; jobs: SchedulerJob[] }\n | { kind: \"functions.catalog.result\"; functions: FunctionDefinition[] }\n | {\n kind: \"storage.list.result\";\n entries: StorageEntry[];\n totalCount: number;\n offset: number;\n hasMore: boolean;\n error?: string;\n }\n | {\n kind: \"sql.watch.result\";\n columns: string[];\n rows: unknown[][];\n observedTables: string[];\n };\n\n/* ------------------------------------------------------------------ */\n/* Shared data shapes */\n/* ------------------------------------------------------------------ */\n\nexport interface FunctionDefinition {\n name: string;\n type: \"query\" | \"mutation\" | \"action\";\n file?: string;\n modulePath?: string;\n namespace?: string;\n metadataAvailable?: boolean;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n visibility?: \"public\" | \"internal\";\n localName?: string;\n /** Argument validator schema (JSON Schema-like), if available */\n args?: Record<string, unknown>;\n /** Return validator schema, if available */\n returns?: Record<string, unknown>;\n}\n\nexport interface TableSchema {\n name: string;\n displayName?: string;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n fields: TableField[];\n indexes: TableIndex[];\n documentCount: number;\n}\n\nexport interface TableField {\n name: string;\n type: string;\n optional: boolean;\n referenceTable?: string;\n}\n\nexport interface TableIndex {\n name: string;\n fields: string[];\n unique: boolean;\n}\n\nexport interface StorageEntry {\n id: string;\n createdAt: number;\n fileName?: string;\n contentType?: string;\n size: number;\n path: string;\n}\n\nexport interface SchedulerJob {\n id: string;\n functionName: string;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n args: Record<string, unknown>;\n scheduledAt: number;\n runAt: number;\n status: \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\";\n completedAt?: number;\n result?: unknown;\n error?: string;\n durationMs?: number;\n recurringName?: string;\n schedule?: SchedulerRecurringSchedule;\n scheduleLabel?: string;\n misfirePolicy?: SchedulerMisfirePolicy;\n timezone?: string;\n lastRunAt?: number;\n updatedAt?: number;\n /** Compatibility label for older UI code. */\n cronSchedule?: string;\n}\n\nexport interface SchedulerRecurringIntervalSchedule {\n type: \"interval\";\n seconds?: number;\n minutes?: number;\n hours?: number;\n}\n\nexport interface SchedulerRecurringDailySchedule {\n type: \"daily\";\n hour: number;\n minute: number;\n timezone?: string;\n}\n\nexport interface SchedulerRecurringWeeklySchedule {\n type: \"weekly\";\n dayOfWeek:\n | \"sunday\"\n | \"monday\"\n | \"tuesday\"\n | \"wednesday\"\n | \"thursday\"\n | \"friday\"\n | \"saturday\";\n hour: number;\n minute: number;\n timezone?: string;\n}\n\nexport type SchedulerRecurringSchedule =\n | SchedulerRecurringIntervalSchedule\n | SchedulerRecurringDailySchedule\n | SchedulerRecurringWeeklySchedule;\n\nexport type SchedulerMisfirePolicy =\n | { type: \"catch_up\" }\n | { type: \"skip\" }\n | { type: \"run_once_if_missed\" }\n | { type: \"windowed\"; windowMs: number };\n"],"mappings":";AAEA,MAAa,oCAAoC;AACjD,MAAa,kDAAkD;AAC/D,MAAa,kDAAkD;AAS/D,SAAgB,6BACd,WAMS;CACT,OACE,UAAU,+BAAA,KAEV,UAAU,+BAAA,KAEV,UAAU,mBAAmB,UAAU,+BACvC,UAAU,mBAAmB,UAAU;AAE3C;AAuNA,SAAgB,mBAAmB,OAAuB;CACxD,OAAO,eAAe,OAAO,CAAC;AAChC;AAEA,SAAgB,eAAe,KAAa,MAAgC;CAC1E,OAAO,4BAA4B,KAAK,MAAM,cAAc;AAC9D;AAEA,SAAgB,sBACd,WACA,YACQ;CACR,OAAO,aACH,4BAA4B,WAAW,YAAY,qBAAqB,IACxE,sBAAsB,WAAW,CAAC;AACxC;AAEA,SAAgB,qBACd,WACA,YACQ;CACR,OAAO,eAAe,WAAW,UAAU;AAC7C;AAEA,SAAS,4BACP,KACA,MACA,gBACQ;CACR,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,eAAe,CAAC,GAAG,IAAI,EAAE,KAAK,GAAG;EAC1C,IAAI,UAAU;EACd,OAAO,MAAM;GACX,MAAM,YAAY,eAAe,aAAa,OAAO;GACrD,IAAI,gBAAgB,OAAO,CAAC,KAAK,IAAI,SAAS,GAC5C,OAAO;GAET,IAAI,CAAC,KAAK,IAAI,SAAS,GAAG;IACxB,KAAK,IAAI,SAAS;IAClB;GACF;GACA,WAAW;EACb;CACF;CACA,OAAO,eAAe,KAAK,CAAC;AAC9B;AAEA,SAAS,eAAe,OAAe,MAAsB;CAE3D,QADc,WAAW,OAAO,IAAI,IAAI,KAC3B,SAAS,EAAE,SAAS,GAAG,GAAG;AACzC;AAEA,SAAS,sBAAsB,OAAe,MAAsB;CAClE,MAAM,QAAQ,WAAW,OAAO,IAAI;CAGpC,OAAO,GAFQ,OAAO,aAAa,KAAM,QAAQ,EAElC,KADA,KAAK,MAAM,QAAQ,EAAE,IAAI,KACd,SAAS,EAAE,SAAS,GAAG,GAAG;AACtD;AAEA,SAAS,WAAW,OAAe,MAAsB;CACvD,MAAM,YAAY,SAAS,IAAI,QAAQ,GAAG,MAAM,GAAG;CACnD,IAAI,OAAO;CACX,KAAK,IAAI,QAAQ,GAAG,QAAQ,UAAU,QAAQ,SAAS,GAAG;EACxD,QAAQ,UAAU,WAAW,KAAK;EAClC,OAAO,KAAK,KAAK,MAAM,QAAQ;CACjC;CACA,OAAO,SAAS;AAClB"}