syncorejs 0.2.2 → 0.2.3

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 (140) 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 +238 -64
  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/runtime/components.d.mts.map +1 -1
  23. package/dist/_vendor/core/runtime/components.mjs.map +1 -1
  24. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
  25. package/dist/_vendor/core/runtime/devtools.mjs +130 -23
  26. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
  27. package/dist/_vendor/core/runtime/functions.d.mts +388 -6
  28. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
  29. package/dist/_vendor/core/runtime/functions.mjs +72 -1
  30. package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
  31. package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
  32. package/dist/_vendor/core/runtime/id.mjs.map +1 -1
  33. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +11 -5
  34. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -1
  35. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +123 -20
  36. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -1
  37. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +56 -8
  38. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -1
  39. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +49 -14
  40. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -1
  41. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +4 -7
  42. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -1
  43. package/dist/_vendor/core/runtime/internal/engines/shared.mjs +76 -1
  44. package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -1
  45. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +1 -0
  46. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -1
  47. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +4 -3
  48. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -1
  49. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -1
  50. package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -1
  51. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +4 -0
  52. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -1
  53. package/dist/_vendor/core/runtime/runtime.d.mts +1040 -9
  54. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
  55. package/dist/_vendor/core/runtime/runtime.mjs +63 -0
  56. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
  57. package/dist/_vendor/core/transport.d.mts +2 -0
  58. package/dist/_vendor/core/transport.d.mts.map +1 -1
  59. package/dist/_vendor/core/transport.mjs +33 -24
  60. package/dist/_vendor/core/transport.mjs.map +1 -1
  61. package/dist/_vendor/devtools-protocol/index.d.ts +149 -4
  62. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
  63. package/dist/_vendor/devtools-protocol/index.js.map +1 -1
  64. package/dist/_vendor/next/config.d.ts +3 -4
  65. package/dist/_vendor/next/config.d.ts.map +1 -1
  66. package/dist/_vendor/next/config.js +37 -19
  67. package/dist/_vendor/next/config.js.map +1 -1
  68. package/dist/_vendor/next/index.d.ts +109 -29
  69. package/dist/_vendor/next/index.d.ts.map +1 -1
  70. package/dist/_vendor/next/index.js +77 -17
  71. package/dist/_vendor/next/index.js.map +1 -1
  72. package/dist/_vendor/platform-expo/index.d.ts +146 -27
  73. package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
  74. package/dist/_vendor/platform-expo/index.js +76 -10
  75. package/dist/_vendor/platform-expo/index.js.map +1 -1
  76. package/dist/_vendor/platform-expo/react.js.map +1 -1
  77. package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
  78. package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
  79. package/dist/_vendor/platform-node/index.d.mts +173 -9
  80. package/dist/_vendor/platform-node/index.d.mts.map +1 -1
  81. package/dist/_vendor/platform-node/index.mjs +225 -94
  82. package/dist/_vendor/platform-node/index.mjs.map +1 -1
  83. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
  84. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
  85. package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
  86. package/dist/_vendor/platform-web/external-change.d.ts +41 -0
  87. package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
  88. package/dist/_vendor/platform-web/external-change.js +30 -0
  89. package/dist/_vendor/platform-web/external-change.js.map +1 -1
  90. package/dist/_vendor/platform-web/index.d.ts +307 -35
  91. package/dist/_vendor/platform-web/index.d.ts.map +1 -1
  92. package/dist/_vendor/platform-web/index.js +189 -23
  93. package/dist/_vendor/platform-web/index.js.map +1 -1
  94. package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
  95. package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
  96. package/dist/_vendor/platform-web/indexeddb.js +10 -0
  97. package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
  98. package/dist/_vendor/platform-web/opfs.d.ts +13 -0
  99. package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
  100. package/dist/_vendor/platform-web/opfs.js +12 -0
  101. package/dist/_vendor/platform-web/opfs.js.map +1 -1
  102. package/dist/_vendor/platform-web/persistence.d.ts +54 -0
  103. package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
  104. package/dist/_vendor/platform-web/persistence.js +15 -0
  105. package/dist/_vendor/platform-web/persistence.js.map +1 -1
  106. package/dist/_vendor/platform-web/react.d.ts +1 -2
  107. package/dist/_vendor/platform-web/react.d.ts.map +1 -1
  108. package/dist/_vendor/platform-web/react.js +2 -4
  109. package/dist/_vendor/platform-web/react.js.map +1 -1
  110. package/dist/_vendor/platform-web/sqljs.js +10 -1
  111. package/dist/_vendor/platform-web/sqljs.js.map +1 -1
  112. package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
  113. package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
  114. package/dist/_vendor/platform-web/worker.d.ts +60 -9
  115. package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
  116. package/dist/_vendor/platform-web/worker.js +37 -4
  117. package/dist/_vendor/platform-web/worker.js.map +1 -1
  118. package/dist/_vendor/react/index.d.ts +196 -13
  119. package/dist/_vendor/react/index.d.ts.map +1 -1
  120. package/dist/_vendor/react/index.js +208 -17
  121. package/dist/_vendor/react/index.js.map +1 -1
  122. package/dist/_vendor/schema/definition.d.ts +129 -0
  123. package/dist/_vendor/schema/definition.d.ts.map +1 -1
  124. package/dist/_vendor/schema/definition.js +99 -0
  125. package/dist/_vendor/schema/definition.js.map +1 -1
  126. package/dist/_vendor/schema/planner.d.ts.map +1 -1
  127. package/dist/_vendor/schema/planner.js.map +1 -1
  128. package/dist/_vendor/schema/validators.d.ts +180 -4
  129. package/dist/_vendor/schema/validators.d.ts.map +1 -1
  130. package/dist/_vendor/schema/validators.js +35 -1
  131. package/dist/_vendor/schema/validators.js.map +1 -1
  132. package/dist/_vendor/svelte/index.d.ts +205 -7
  133. package/dist/_vendor/svelte/index.d.ts.map +1 -1
  134. package/dist/_vendor/svelte/index.js +199 -6
  135. package/dist/_vendor/svelte/index.js.map +1 -1
  136. package/dist/browser.d.ts.map +1 -1
  137. package/dist/cli.js +3 -1
  138. package/dist/cli.js.map +1 -1
  139. package/dist/index.d.ts +1 -1
  140. 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 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 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\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) => runtime.createClient());\n\n const ready = clientPromise\n .then(() => {\n sendStatus({\n kind: \"ready\"\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 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,43 @@ 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
+ scheduler?: {
183
+ read: boolean;
184
+ edit: boolean;
185
+ };
186
+ }
187
+ interface SyncoreDevtoolsExternalChangeEvent {
188
+ sourceId: string;
189
+ scope: "database" | "storage" | "all";
190
+ reason: "commit" | "storage-put" | "storage-delete" | "reconcile";
191
+ timestamp: number;
192
+ revision?: string;
193
+ changedScopes?: string[];
194
+ changedTables?: string[];
195
+ storageIds?: string[];
196
+ }
89
197
  declare function createBasePublicId(input: string): string;
90
198
  declare function createPublicId(key: string, keys: Iterable<string>): string;
91
199
  declare function createPublicRuntimeId(runtimeId: string, runtimeIds?: Iterable<string>): string;
@@ -102,9 +210,12 @@ type SyncoreDevtoolsMessage = {
102
210
  origin?: string;
103
211
  sessionLabel?: string;
104
212
  targetKind?: "client" | "project";
213
+ runtimeRole?: "app" | "project-target";
105
214
  storageProtocol?: string;
106
215
  databaseLabel?: string;
216
+ dataSourceAlias?: string;
107
217
  storageIdentity?: string;
218
+ capabilities?: SyncoreDevtoolsCapabilities;
108
219
  } | {
109
220
  type: "event";
110
221
  event: SyncoreDevtoolsEvent;
@@ -131,6 +242,11 @@ type SyncoreDevtoolsMessage = {
131
242
  subscriptionId: string;
132
243
  runtimeId: string;
133
244
  error: string;
245
+ } | {
246
+ type: "external.change";
247
+ runtimeId: string;
248
+ storageIdentity: string;
249
+ event: SyncoreDevtoolsExternalChangeEvent;
134
250
  };
135
251
  interface SyncoreDevtoolsCommand {
136
252
  type: "command";
@@ -170,6 +286,15 @@ type SyncoreDevtoolsCommandPayload = {
170
286
  kind: "data.delete";
171
287
  table: string;
172
288
  id: string;
289
+ } | {
290
+ kind: "data.export";
291
+ tables?: string[];
292
+ } | {
293
+ kind: "data.referenceOptions";
294
+ table: string;
295
+ search?: string;
296
+ limit?: number;
297
+ offset?: number;
173
298
  } | {
174
299
  kind: "sql.read";
175
300
  query: string;
@@ -182,9 +307,9 @@ type SyncoreDevtoolsCommandPayload = {
182
307
  } | {
183
308
  kind: "scheduler.update";
184
309
  jobId: string;
185
- schedule: SchedulerRecurringSchedule;
310
+ schedule?: SchedulerRecurringSchedule;
186
311
  args: Record<string, unknown>;
187
- misfirePolicy: SchedulerMisfirePolicy;
312
+ misfirePolicy?: SchedulerMisfirePolicy;
188
313
  runAt?: number;
189
314
  };
190
315
  type SyncoreDevtoolsSubscriptionPayload = {
@@ -227,6 +352,22 @@ type SyncoreDevtoolsCommandResultPayload = {
227
352
  success: boolean;
228
353
  id?: string;
229
354
  error?: string;
355
+ } | {
356
+ kind: "data.export.result";
357
+ tables: Array<{
358
+ name: string;
359
+ rows: Record<string, unknown>[];
360
+ totalCount: number;
361
+ }>;
362
+ error?: string;
363
+ } | {
364
+ kind: "data.referenceOptions.result";
365
+ table: string;
366
+ rows: Record<string, unknown>[];
367
+ totalCount: number;
368
+ offset: number;
369
+ hasMore: boolean;
370
+ error?: string;
230
371
  } | {
231
372
  kind: "sql.read.result";
232
373
  columns: string[];
@@ -285,7 +426,10 @@ type SyncoreDevtoolsSubscriptionResultPayload = {
285
426
  interface FunctionDefinition {
286
427
  name: string;
287
428
  type: "query" | "mutation" | "action";
288
- file: string;
429
+ file?: string;
430
+ modulePath?: string;
431
+ namespace?: string;
432
+ metadataAvailable?: boolean;
289
433
  owner?: "root" | "component";
290
434
  componentPath?: string;
291
435
  componentName?: string;
@@ -310,6 +454,7 @@ interface TableField {
310
454
  name: string;
311
455
  type: string;
312
456
  optional: boolean;
457
+ referenceTable?: string;
313
458
  }
314
459
  interface TableIndex {
315
460
  name: string;
@@ -371,5 +516,5 @@ type SchedulerMisfirePolicy = {
371
516
  windowMs: number;
372
517
  };
373
518
  //#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 };
519
+ 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, 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
520
  //# 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\" | \"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 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 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(\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 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 /* 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: \"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: \"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 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 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;CACT,OACE,UAAU,+BAAA,KAEV,UAAU,+BAAA,KAEV,UAAU,mBAAmB,UAAU,+BACvC,UAAU,mBAAmB,UAAU;AAE3C;AA+MA,SAAgB,mBAAmB,OAAuB;CACxD,OAAO,eAAe,OAAO,CAAC;AAChC;AAEA,SAAgB,eACd,KACA,MACQ;CACR,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"}
@@ -1,10 +1,9 @@
1
1
  //#region src/config.d.ts
2
2
  /**
3
- * Wrap a Next config with the settings Syncore needs for SQL.js and worker assets.
3
+ * Wrap a Next config with the settings Syncore needs for worker assets.
4
4
  *
5
- * This enables async WebAssembly support and, for non-exported apps, adds a
6
- * long-lived cache header for `sql-wasm.wasm`. It also configures webpack to
7
- * bundle the syncore worker as a separate entry point.
5
+ * This enables async WebAssembly support and configures webpack to bundle the
6
+ * syncore worker as a separate entry point.
8
7
  */
9
8
  declare function withSyncoreNext<TConfig extends Record<string, unknown>>(config: TConfig): TConfig;
10
9
  declare function getSyncoreWorkerUrl(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","names":[],"sources":["../src/config.ts"],"mappings":";;AAaA;;;;;;iBAAgB,eAAA,iBAAgC,MAAA,kBAAA,CAC9C,MAAA,EAAQ,OAAA,GACP,OAAA;AAAA,iBA0Fa,mBAAA,CAAA;;;;iBAOA,0BAAA,CACd,YAAA,YAAoC,GAAA"}
1
+ {"version":3,"file":"config.d.ts","names":[],"sources":["../src/config.ts"],"mappings":";;AAYA;;;;;iBAAgB,eAAA,iBAAgC,MAAA,kBAAA,CAC9C,MAAA,EAAQ,OAAA,GACP,OAAA;AAAA,iBAqGa,mBAAA,CAAA;;;;iBAOA,0BAAA,CACd,YAAA,YAAoC,GAAA"}
@@ -4,33 +4,56 @@ function joinAppWorkerPath(dir) {
4
4
  return `${dir.replace(/[\\/]$/, "")}/app/syncore.worker`;
5
5
  }
6
6
  /**
7
- * Wrap a Next config with the settings Syncore needs for SQL.js and worker assets.
7
+ * Wrap a Next config with the settings Syncore needs for worker assets.
8
8
  *
9
- * This enables async WebAssembly support and, for non-exported apps, adds a
10
- * long-lived cache header for `sql-wasm.wasm`. It also configures webpack to
11
- * bundle the syncore worker as a separate entry point.
9
+ * This enables async WebAssembly support and configures webpack to bundle the
10
+ * syncore worker as a separate entry point.
12
11
  */
13
12
  function withSyncoreNext(config) {
14
13
  const baseConfig = config;
15
14
  const isStaticExport = baseConfig.output === "export";
16
- const headers = baseConfig.headers ?? [];
17
15
  const userWebpack = typeof baseConfig.webpack === "function" ? baseConfig.webpack : void 0;
18
- const userHeaders = typeof baseConfig.headers === "function" ? baseConfig.headers : void 0;
19
- const syncoreHeaders = {
20
- source: "/sql-wasm.wasm",
21
- headers: [{
22
- key: "Cache-Control",
23
- value: "public, max-age=31536000, immutable"
24
- }]
25
- };
26
- const nextConfig = {
16
+ const userTranspilePackages = Array.isArray(baseConfig.transpilePackages) ? baseConfig.transpilePackages : [];
17
+ const internalScope = `${String.fromCharCode(64)}syncore/`;
18
+ const syncoreTranspilePackages = [
19
+ "syncorejs",
20
+ `${internalScope}core`,
21
+ `${internalScope}schema`,
22
+ `${internalScope}react`,
23
+ `${internalScope}platform-web`,
24
+ `${internalScope}next`
25
+ ];
26
+ return {
27
27
  ...config,
28
+ transpilePackages: Array.from(new Set([...userTranspilePackages, ...syncoreTranspilePackages])),
28
29
  webpack(currentConfig, context) {
29
30
  const nextConfig = { ...currentConfig };
30
31
  nextConfig.experiments = {
31
32
  ...nextConfig.experiments ?? {},
32
33
  asyncWebAssembly: true
33
34
  };
35
+ const resolve = nextConfig.resolve ?? {};
36
+ nextConfig.resolve = {
37
+ ...resolve,
38
+ extensionAlias: {
39
+ ...resolve.extensionAlias ?? {},
40
+ ".js": [
41
+ ".ts",
42
+ ".tsx",
43
+ ".js"
44
+ ],
45
+ ".mjs": [".mts", ".mjs"]
46
+ }
47
+ };
48
+ const moduleConfig = nextConfig.module ?? {};
49
+ const rules = Array.isArray(moduleConfig.rules) ? moduleConfig.rules : [];
50
+ nextConfig.module = {
51
+ ...moduleConfig,
52
+ rules: [{
53
+ test: /\.wasm$/,
54
+ type: "asset/resource"
55
+ }, ...rules]
56
+ };
34
57
  const ctx = context;
35
58
  if (isStaticExport && ctx && !ctx.dev && !ctx.isServer && ctx.nextRuntime !== "edge") {
36
59
  const entry = nextConfig.entry ?? (async () => ({}));
@@ -49,11 +72,6 @@ function withSyncoreNext(config) {
49
72
  return nextConfig;
50
73
  }
51
74
  };
52
- if (!isStaticExport || userHeaders) nextConfig.headers = async () => {
53
- const resolvedHeaders = userHeaders ? await userHeaders() : headers;
54
- return isStaticExport ? resolvedHeaders : [...resolvedHeaders, syncoreHeaders];
55
- };
56
- return nextConfig;
57
75
  }
58
76
  function getSyncoreWorkerUrl() {
59
77
  return `/_next/static/chunks/${WORKER_NAME}.js`;