syncorejs 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/_vendor/cli/app.d.mts.map +1 -1
  2. package/dist/_vendor/cli/app.mjs +8 -5
  3. package/dist/_vendor/cli/app.mjs.map +1 -1
  4. package/dist/_vendor/cli/context.mjs.map +1 -1
  5. package/dist/_vendor/cli/dev-session.mjs.map +1 -1
  6. package/dist/_vendor/cli/doctor.mjs.map +1 -1
  7. package/dist/_vendor/cli/errors.mjs.map +1 -1
  8. package/dist/_vendor/cli/help.mjs.map +1 -1
  9. package/dist/_vendor/cli/index.mjs +9 -2
  10. package/dist/_vendor/cli/index.mjs.map +1 -1
  11. package/dist/_vendor/cli/messages.mjs.map +1 -1
  12. package/dist/_vendor/cli/preflight.mjs.map +1 -1
  13. package/dist/_vendor/cli/project.mjs +20 -20
  14. package/dist/_vendor/cli/project.mjs.map +1 -1
  15. package/dist/_vendor/cli/render.mjs.map +1 -1
  16. package/dist/_vendor/cli/targets.mjs.map +1 -1
  17. package/dist/_vendor/core/cli.d.mts +8 -2
  18. package/dist/_vendor/core/cli.d.mts.map +1 -1
  19. package/dist/_vendor/core/cli.mjs +510 -71
  20. package/dist/_vendor/core/cli.mjs.map +1 -1
  21. package/dist/_vendor/core/devtools-auth.mjs.map +1 -1
  22. package/dist/_vendor/core/index.d.mts +3 -3
  23. package/dist/_vendor/core/runtime/components.d.mts.map +1 -1
  24. package/dist/_vendor/core/runtime/components.mjs.map +1 -1
  25. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
  26. package/dist/_vendor/core/runtime/devtools.mjs +261 -23
  27. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
  28. package/dist/_vendor/core/runtime/functions.d.mts +388 -6
  29. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
  30. package/dist/_vendor/core/runtime/functions.mjs +72 -1
  31. package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
  32. package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
  33. package/dist/_vendor/core/runtime/id.mjs.map +1 -1
  34. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +12 -6
  35. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -1
  36. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +123 -20
  37. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -1
  38. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +56 -8
  39. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -1
  40. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +49 -14
  41. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -1
  42. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +4 -7
  43. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -1
  44. package/dist/_vendor/core/runtime/internal/engines/shared.mjs +81 -2
  45. package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -1
  46. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +100 -13
  47. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -1
  48. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +42 -7
  49. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -1
  50. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -1
  51. package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -1
  52. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +4 -0
  53. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -1
  54. package/dist/_vendor/core/runtime/runtime.d.mts +1100 -12
  55. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
  56. package/dist/_vendor/core/runtime/runtime.mjs +63 -0
  57. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
  58. package/dist/_vendor/core/transport.d.mts +2 -0
  59. package/dist/_vendor/core/transport.d.mts.map +1 -1
  60. package/dist/_vendor/core/transport.mjs +61 -27
  61. package/dist/_vendor/core/transport.mjs.map +1 -1
  62. package/dist/_vendor/devtools-protocol/index.d.ts +223 -4
  63. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
  64. package/dist/_vendor/devtools-protocol/index.js.map +1 -1
  65. package/dist/_vendor/next/config.d.ts +3 -4
  66. package/dist/_vendor/next/config.d.ts.map +1 -1
  67. package/dist/_vendor/next/config.js +37 -19
  68. package/dist/_vendor/next/config.js.map +1 -1
  69. package/dist/_vendor/next/index.d.ts +109 -29
  70. package/dist/_vendor/next/index.d.ts.map +1 -1
  71. package/dist/_vendor/next/index.js +86 -18
  72. package/dist/_vendor/next/index.js.map +1 -1
  73. package/dist/_vendor/platform-expo/index.d.ts +146 -27
  74. package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
  75. package/dist/_vendor/platform-expo/index.js +81 -10
  76. package/dist/_vendor/platform-expo/index.js.map +1 -1
  77. package/dist/_vendor/platform-expo/react.js.map +1 -1
  78. package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
  79. package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
  80. package/dist/_vendor/platform-node/index.d.mts +174 -9
  81. package/dist/_vendor/platform-node/index.d.mts.map +1 -1
  82. package/dist/_vendor/platform-node/index.mjs +251 -95
  83. package/dist/_vendor/platform-node/index.mjs.map +1 -1
  84. package/dist/_vendor/platform-node/ipc-react.mjs +4 -0
  85. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
  86. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
  87. package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
  88. package/dist/_vendor/platform-web/external-change.d.ts +41 -0
  89. package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
  90. package/dist/_vendor/platform-web/external-change.js +30 -0
  91. package/dist/_vendor/platform-web/external-change.js.map +1 -1
  92. package/dist/_vendor/platform-web/index.d.ts +312 -37
  93. package/dist/_vendor/platform-web/index.d.ts.map +1 -1
  94. package/dist/_vendor/platform-web/index.js +247 -25
  95. package/dist/_vendor/platform-web/index.js.map +1 -1
  96. package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
  97. package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
  98. package/dist/_vendor/platform-web/indexeddb.js +10 -0
  99. package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
  100. package/dist/_vendor/platform-web/opfs.d.ts +16 -1
  101. package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
  102. package/dist/_vendor/platform-web/opfs.js +41 -3
  103. package/dist/_vendor/platform-web/opfs.js.map +1 -1
  104. package/dist/_vendor/platform-web/persistence.d.ts +85 -1
  105. package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
  106. package/dist/_vendor/platform-web/persistence.js +15 -0
  107. package/dist/_vendor/platform-web/persistence.js.map +1 -1
  108. package/dist/_vendor/platform-web/react.d.ts +1 -2
  109. package/dist/_vendor/platform-web/react.d.ts.map +1 -1
  110. package/dist/_vendor/platform-web/react.js +11 -5
  111. package/dist/_vendor/platform-web/react.js.map +1 -1
  112. package/dist/_vendor/platform-web/sqljs.js +10 -1
  113. package/dist/_vendor/platform-web/sqljs.js.map +1 -1
  114. package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
  115. package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
  116. package/dist/_vendor/platform-web/worker.d.ts +60 -9
  117. package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
  118. package/dist/_vendor/platform-web/worker.js +37 -4
  119. package/dist/_vendor/platform-web/worker.js.map +1 -1
  120. package/dist/_vendor/react/index.d.ts +197 -13
  121. package/dist/_vendor/react/index.d.ts.map +1 -1
  122. package/dist/_vendor/react/index.js +209 -17
  123. package/dist/_vendor/react/index.js.map +1 -1
  124. package/dist/_vendor/schema/definition.d.ts +129 -0
  125. package/dist/_vendor/schema/definition.d.ts.map +1 -1
  126. package/dist/_vendor/schema/definition.js +99 -0
  127. package/dist/_vendor/schema/definition.js.map +1 -1
  128. package/dist/_vendor/schema/planner.d.ts.map +1 -1
  129. package/dist/_vendor/schema/planner.js.map +1 -1
  130. package/dist/_vendor/schema/validators.d.ts +180 -4
  131. package/dist/_vendor/schema/validators.d.ts.map +1 -1
  132. package/dist/_vendor/schema/validators.js +35 -1
  133. package/dist/_vendor/schema/validators.js.map +1 -1
  134. package/dist/_vendor/svelte/index.d.ts +207 -7
  135. package/dist/_vendor/svelte/index.d.ts.map +1 -1
  136. package/dist/_vendor/svelte/index.js +201 -6
  137. package/dist/_vendor/svelte/index.js.map +1 -1
  138. package/dist/browser.d.ts.map +1 -1
  139. package/dist/cli.js +3 -1
  140. package/dist/cli.js.map +1 -1
  141. package/dist/index.d.ts +1 -1
  142. package/package.json +24 -21
@@ -11,11 +11,13 @@ import { ensureSupportedSystemFormats } from "./systemMeta.mjs";
11
11
  import { RuntimeStatusController } from "./runtimeStatus.mjs";
12
12
  //#region src/runtime/internal/runtimeKernel.ts
13
13
  var RuntimeKernel = class {
14
+ options;
14
15
  runtimeId = generateId();
15
16
  platform;
16
17
  externalChangeSourceId = generateId();
17
18
  driverDatabasePath;
18
19
  capabilities;
20
+ runtimeCapabilities;
19
21
  capabilityDescriptors;
20
22
  devtoolsEngine;
21
23
  schemaEngine;
@@ -33,6 +35,10 @@ var RuntimeKernel = class {
33
35
  this.platform = options.platform ?? "node";
34
36
  this.capabilityDescriptors = Object.freeze([...options.capabilityDescriptors ?? []]);
35
37
  this.capabilities = Object.freeze({ ...options.capabilities ?? {} });
38
+ this.runtimeCapabilities = Object.freeze(options.runtimeCapabilities ?? { storage: {
39
+ available: true,
40
+ ...options.storage.supportsRange ? { supportsRange: options.storage.supportsRange() !== false } : {}
41
+ } });
36
42
  this.driverDatabasePath = inferDriverDatabasePath(options.driver);
37
43
  this.devtoolsEngine = new DevtoolsEngine({
38
44
  runtimeId: this.runtimeId,
@@ -56,7 +62,8 @@ var RuntimeKernel = class {
56
62
  this.transactionCoordinator = new TransactionCoordinator(options.driver);
57
63
  this.runtimeStatus = new RuntimeStatusController({
58
64
  kind: "starting",
59
- reason: "booting"
65
+ reason: "booting",
66
+ capabilities: this.runtimeCapabilities
60
67
  });
61
68
  this.schedulerEngine = new SchedulerEngine({
62
69
  driver: options.driver,
@@ -64,8 +71,8 @@ var RuntimeKernel = class {
64
71
  devtools: this.devtoolsEngine,
65
72
  recurringJobs: options.scheduler?.recurringJobs ?? [],
66
73
  pollIntervalMs: options.scheduler?.pollIntervalMs ?? 1e3,
67
- runMutation: (reference, args) => this.executionEngine.runMutation(reference, args),
68
- runAction: (reference, args) => this.executionEngine.runAction(reference, args)
74
+ runMutation: (reference, args, meta) => this.executionEngine.runMutation(reference, args, meta),
75
+ runAction: (reference, args, meta) => this.executionEngine.runAction(reference, args, meta)
69
76
  });
70
77
  this.reactivityEngine = new ReactivityEngine({
71
78
  runtimeId: this.runtimeId,
@@ -73,7 +80,7 @@ var RuntimeKernel = class {
73
80
  ...options.externalChangeSignal ? { externalChangeSignal: options.externalChangeSignal } : {},
74
81
  ...options.externalChangeApplier ? { externalChangeApplier: options.externalChangeApplier } : {},
75
82
  devtools: this.devtoolsEngine,
76
- runQuery: (reference, args) => this.executionEngine.runQuery(reference, args),
83
+ runQuery: (reference, args, meta) => this.executionEngine.runQuery(reference, args, meta),
77
84
  collectQueryDependencies: (functionName, args) => this.executionEngine.collectQueryDependencies(functionName, args)
78
85
  });
79
86
  this.executionEngine = new ExecutionEngine({
@@ -112,6 +119,28 @@ var RuntimeKernel = class {
112
119
  if (resolvedScopes.size > 0) await this.reactivityEngine.refreshQueriesForScopes(resolvedScopes, reason);
113
120
  await this.devtoolsEngine.forceRefresh(reason, { refreshQueriesForScopes: (requestedScopes, refreshReason) => this.reactivityEngine.refreshQueriesForScopes(requestedScopes, refreshReason) }, meta, resolvedScopes);
114
121
  },
122
+ listStorageObjects: async (options) => {
123
+ await this.prepareForDirectAccess();
124
+ return this.storageEngine.listObjects(options);
125
+ },
126
+ getStorageObjectAccessInfo: async (id) => {
127
+ await this.prepareForDirectAccess();
128
+ return this.storageEngine.getObjectAccessInfo(id);
129
+ },
130
+ readStorageObjectRange: async (id, offset, length) => {
131
+ await this.prepareForDirectAccess();
132
+ return this.storageEngine.readObjectRange(id, offset, length);
133
+ },
134
+ deleteStorageObject: async (id, meta) => {
135
+ await this.prepareForDirectAccess();
136
+ const deleted = await this.storageEngine.deleteObject(id, meta);
137
+ if (deleted) this.devtoolsEngine.notifyScopes([
138
+ "runtime.summary",
139
+ "storage.objects",
140
+ `storage:${id}`
141
+ ]);
142
+ return deleted;
143
+ },
115
144
  cancelScheduledJob: async (id) => {
116
145
  await this.prepareForDirectAccess();
117
146
  return this.schedulerEngine.cancelScheduledJob(id);
@@ -127,7 +156,8 @@ var RuntimeKernel = class {
127
156
  if (this.started) return;
128
157
  this.runtimeStatus.setStatus({
129
158
  kind: "starting",
130
- reason: "booting"
159
+ reason: "booting",
160
+ capabilities: this.runtimeCapabilities
131
161
  });
132
162
  await this.prepareForDirectAccess();
133
163
  try {
@@ -135,7 +165,10 @@ var RuntimeKernel = class {
135
165
  this.reactivityEngine.start();
136
166
  this.schedulerEngine.startPolling();
137
167
  this.started = true;
138
- this.runtimeStatus.setStatus({ kind: "ready" });
168
+ this.runtimeStatus.setStatus({
169
+ kind: "ready",
170
+ capabilities: this.runtimeCapabilities
171
+ });
139
172
  this.devtoolsEngine.emit({
140
173
  type: "runtime.connected",
141
174
  runtimeId: this.runtimeId,
@@ -150,6 +183,7 @@ var RuntimeKernel = class {
150
183
  this.runtimeStatus.setStatus({
151
184
  kind: "error",
152
185
  reason: "runtime-unavailable",
186
+ capabilities: this.runtimeCapabilities,
153
187
  ...error instanceof Error ? { error } : {}
154
188
  });
155
189
  throw error;
@@ -184,7 +218,8 @@ var RuntimeKernel = class {
184
218
  this.started = false;
185
219
  this.runtimeStatus.setStatus({
186
220
  kind: "unavailable",
187
- reason: "disposed"
221
+ reason: "disposed",
222
+ capabilities: this.runtimeCapabilities
188
223
  });
189
224
  if (stopError) throw stopError;
190
225
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeKernel.mjs","names":[],"sources":["../../../src/runtime/internal/runtimeKernel.ts"],"sourcesContent":["import type {\n CapabilityDescriptor,\n DevtoolsLiveQueryScope,\n QueryCtx,\n SyncoreDataModel,\n SyncoreResolvedComponents,\n SyncoreCapabilities,\n SyncoreClient,\n SyncoreRuntime,\n SyncoreRuntimeAdmin,\n SyncoreRuntimeOptions,\n SyncoreWatch,\n UpdateScheduledJobOptions\n} from \"../runtime.js\";\nimport type { FunctionReference } from \"../functions.js\";\nimport type {\n SyncoreDevtoolsEvent,\n SyncoreDevtoolsEventOrigin\n} from \"@syncore/devtools-protocol\";\nimport { generateId } from \"../id.js\";\nimport { DevtoolsEngine } from \"./engines/devtoolsEngine.js\";\nimport { ExecutionEngine } from \"./engines/executionEngine.js\";\nimport { ReactivityEngine } from \"./engines/reactivityEngine.js\";\nimport { SchedulerEngine } from \"./engines/schedulerEngine.js\";\nimport { SchemaEngine } from \"./engines/schemaEngine.js\";\nimport { StorageEngine } from \"./engines/storageEngine.js\";\nimport { inferDriverDatabasePath } from \"./engines/shared.js\";\nimport { TransactionCoordinator } from \"./transactionCoordinator.js\";\nimport { ensureSupportedSystemFormats } from \"./systemMeta.js\";\nimport { RuntimeStatusController } from \"./runtimeStatus.js\";\n\ntype DevtoolsEventMeta = {\n origin?: SyncoreDevtoolsEventOrigin;\n};\n\nexport class RuntimeKernel<\n TSchema extends SyncoreDataModel\n> {\n readonly runtimeId = generateId();\n readonly platform: string;\n readonly externalChangeSourceId = generateId();\n readonly driverDatabasePath: string | undefined;\n readonly capabilities: Readonly<SyncoreCapabilities>;\n readonly capabilityDescriptors: ReadonlyArray<CapabilityDescriptor>;\n readonly devtoolsEngine: DevtoolsEngine;\n readonly schemaEngine: SchemaEngine<TSchema>;\n readonly storageEngine: StorageEngine;\n readonly schedulerEngine: SchedulerEngine;\n readonly reactivityEngine: ReactivityEngine;\n readonly executionEngine: ExecutionEngine<TSchema>;\n readonly transactionCoordinator: TransactionCoordinator;\n readonly runtimeStatus: RuntimeStatusController;\n readonly admin: SyncoreRuntimeAdmin<TSchema>;\n private prepared = false;\n private started = false;\n\n constructor(\n private readonly options: SyncoreRuntimeOptions<TSchema>,\n runtime: SyncoreRuntime<TSchema>\n ) {\n this.platform = options.platform ?? \"node\";\n this.capabilityDescriptors = Object.freeze([\n ...(options.capabilityDescriptors ?? [])\n ]);\n this.capabilities = Object.freeze({\n ...(options.capabilities ?? {})\n });\n this.driverDatabasePath = inferDriverDatabasePath(\n options.driver as { filename?: string; databasePath?: string }\n );\n this.devtoolsEngine = new DevtoolsEngine({\n runtimeId: this.runtimeId,\n platform: this.platform,\n ...(options.devtools ? { sink: options.devtools } : {}),\n getActiveQueryInfos: () => this.reactivityEngine.getActiveQueryInfos(),\n getSchemaTables: () => this.schemaEngine.getSchemaTablesForDevtools()\n });\n this.schemaEngine = new SchemaEngine({\n schema: options.schema,\n driver: options.driver,\n runtimeId: this.runtimeId,\n devtools: this.devtoolsEngine\n });\n this.storageEngine = new StorageEngine({\n driver: options.driver,\n storage: options.storage,\n runtimeId: this.runtimeId,\n devtools: this.devtoolsEngine\n });\n this.transactionCoordinator = new TransactionCoordinator(options.driver);\n this.runtimeStatus = new RuntimeStatusController({\n kind: \"starting\",\n reason: \"booting\"\n });\n this.schedulerEngine = new SchedulerEngine({\n driver: options.driver,\n runtimeId: this.runtimeId,\n devtools: this.devtoolsEngine,\n recurringJobs: options.scheduler?.recurringJobs ?? [],\n pollIntervalMs: options.scheduler?.pollIntervalMs ?? 1000,\n runMutation: (reference, args) =>\n this.executionEngine.runMutation(reference, args),\n runAction: (reference, args) => this.executionEngine.runAction(reference, args)\n });\n this.reactivityEngine = new ReactivityEngine({\n runtimeId: this.runtimeId,\n externalChangeSourceId: this.externalChangeSourceId,\n ...(options.externalChangeSignal\n ? { externalChangeSignal: options.externalChangeSignal }\n : {}),\n ...(options.externalChangeApplier\n ? { externalChangeApplier: options.externalChangeApplier }\n : {}),\n devtools: this.devtoolsEngine,\n runQuery: (reference, args) => this.executionEngine.runQuery(reference, args),\n collectQueryDependencies: (functionName, args) =>\n this.executionEngine.collectQueryDependencies(functionName, args)\n });\n this.executionEngine = new ExecutionEngine({\n runtimeId: this.runtimeId,\n functions: options.functions,\n driver: options.driver,\n capabilities: this.capabilities,\n capabilityDescriptors: this.capabilityDescriptors,\n schema: this.schemaEngine,\n storage: this.storageEngine,\n scheduler: this.schedulerEngine,\n reactivity: this.reactivityEngine,\n devtools: this.devtoolsEngine,\n transactionCoordinator: this.transactionCoordinator,\n runtimeStatus: this.runtimeStatus\n });\n this.admin = {\n prepareForDirectAccess: () => this.prepareForDirectAccess(),\n createClient: () => this.createClient(),\n runQuery: (reference, args, meta) =>\n this.executionEngine.runQuery(reference, args, meta),\n runMutation: (reference, args, meta) =>\n this.executionEngine.runMutation(reference, args, meta),\n runAction: (reference, args, meta) =>\n this.executionEngine.runAction(reference, args, meta),\n runDevtoolsMutation: async (callback, meta) => {\n await this.prepareForDirectAccess();\n return this.executionEngine.runDevtoolsMutation(callback, meta);\n },\n getRuntimeSummary: () => this.devtoolsEngine.getRuntimeSummary(),\n getActiveQueryInfos: () => this.reactivityEngine.getActiveQueryInfos(),\n getRuntimeId: () => this.runtimeId,\n getDriverDatabasePath: () => this.driverDatabasePath,\n subscribeToDevtoolsEvents: (listener) =>\n this.devtoolsEngine.subscribeEvents(listener),\n subscribeToDevtoolsInvalidations: (listener) =>\n this.devtoolsEngine.subscribeInvalidations(listener),\n notifyDevtoolsScopes: (scopes) => this.devtoolsEngine.notifyScopes(scopes),\n forceRefreshDevtools: async (reason, scopes, meta) => {\n const resolvedScopes = new Set(scopes ?? []);\n if (resolvedScopes.size > 0) {\n await this.reactivityEngine.refreshQueriesForScopes(\n resolvedScopes,\n reason\n );\n }\n await this.devtoolsEngine.forceRefresh(\n reason,\n {\n refreshQueriesForScopes: (requestedScopes, refreshReason) =>\n this.reactivityEngine.refreshQueriesForScopes(\n requestedScopes,\n refreshReason\n )\n },\n meta,\n resolvedScopes\n );\n },\n cancelScheduledJob: async (id) => {\n await this.prepareForDirectAccess();\n return this.schedulerEngine.cancelScheduledJob(id);\n },\n updateScheduledJob: async (update: UpdateScheduledJobOptions) => {\n await this.prepareForDirectAccess();\n return this.schedulerEngine.updateScheduledJob(update);\n }\n };\n options.devtools?.attachRuntime?.(runtime);\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n this.runtimeStatus.setStatus({\n kind: \"starting\",\n reason: \"booting\"\n });\n await this.prepareForDirectAccess();\n try {\n await this.runComponentHooks(\"onStart\");\n this.reactivityEngine.start();\n this.schedulerEngine.startPolling();\n this.started = true;\n this.runtimeStatus.setStatus({\n kind: \"ready\"\n });\n this.devtoolsEngine.emit({\n type: \"runtime.connected\",\n runtimeId: this.runtimeId,\n platform: this.platform,\n timestamp: Date.now()\n });\n } catch (error) {\n this.schedulerEngine.stopPolling();\n this.reactivityEngine.stop();\n await this.options.driver.close?.().catch(() => undefined);\n this.started = false;\n this.runtimeStatus.setStatus({\n kind: \"error\",\n reason: \"runtime-unavailable\",\n ...(error instanceof Error ? { error } : {})\n });\n throw error;\n }\n }\n\n async prepareForDirectAccess(): Promise<void> {\n if (this.prepared) {\n return;\n }\n await ensureSupportedSystemFormats(this.options.driver);\n await this.schemaEngine.prepare();\n await this.storageEngine.prepare();\n await this.schedulerEngine.prepare();\n await this.storageEngine.reconcile();\n await this.schemaEngine.applySchema();\n await this.schedulerEngine.syncRecurringJobs();\n this.prepared = true;\n }\n\n async stop(): Promise<void> {\n this.schedulerEngine.stopPolling();\n let stopError: unknown;\n if (this.started) {\n try {\n await this.runComponentHooks(\"onStop\");\n } catch (error) {\n stopError = error;\n }\n }\n this.reactivityEngine.stop();\n await this.options.driver.close?.();\n if (this.started) {\n this.devtoolsEngine.emit({\n type: \"runtime.disconnected\",\n runtimeId: this.runtimeId,\n timestamp: Date.now()\n });\n }\n this.started = false;\n this.runtimeStatus.setStatus({\n kind: \"unavailable\",\n reason: \"disposed\"\n });\n if (stopError) {\n throw stopError;\n }\n }\n\n createClient(): SyncoreClient {\n return this.executionEngine.createClient();\n }\n\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n args: Record<string, unknown> = {}\n ): SyncoreWatch<TResult> {\n return this.executionEngine.watchQuery(reference, args);\n }\n\n private async runComponentHooks(\n hook: \"onStart\" | \"onStop\"\n ): Promise<void> {\n for (const component of this.options.components ?? []) {\n await this.runComponentHookTree(component, hook);\n }\n }\n\n private async runComponentHookTree(\n component: SyncoreResolvedComponents[number],\n hook: \"onStart\" | \"onStop\"\n ): Promise<void> {\n const handler = component[hook];\n if (handler) {\n await handler({\n runtimeId: this.runtimeId,\n platform: this.platform,\n componentPath: component.path,\n componentName: component.name,\n version: component.version,\n config: component.config,\n capabilities: component.grantedCapabilities,\n emitDevtools: (event: SyncoreDevtoolsEvent) => {\n this.devtoolsEngine.emit(event);\n }\n });\n }\n for (const child of component.children) {\n await this.runComponentHookTree(child, hook);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"runtimeKernel.mjs","names":[],"sources":["../../../src/runtime/internal/runtimeKernel.ts"],"sourcesContent":["import type {\n CapabilityDescriptor,\n DevtoolsLiveQueryScope,\n QueryCtx,\n SyncoreDataModel,\n SyncoreResolvedComponents,\n SyncoreCapabilities,\n SyncoreClient,\n SyncoreRuntimeCapabilities,\n SyncoreRuntime,\n SyncoreRuntimeAdmin,\n SyncoreRuntimeOptions,\n SyncoreWatch,\n UpdateScheduledJobOptions\n} from \"../runtime.js\";\nimport type { FunctionReference } from \"../functions.js\";\nimport type {\n SyncoreDevtoolsEvent,\n SyncoreDevtoolsEventOrigin\n} from \"@syncore/devtools-protocol\";\nimport { generateId } from \"../id.js\";\nimport { DevtoolsEngine } from \"./engines/devtoolsEngine.js\";\nimport { ExecutionEngine } from \"./engines/executionEngine.js\";\nimport { ReactivityEngine } from \"./engines/reactivityEngine.js\";\nimport { SchedulerEngine } from \"./engines/schedulerEngine.js\";\nimport { SchemaEngine } from \"./engines/schemaEngine.js\";\nimport { StorageEngine } from \"./engines/storageEngine.js\";\nimport { inferDriverDatabasePath } from \"./engines/shared.js\";\nimport { TransactionCoordinator } from \"./transactionCoordinator.js\";\nimport { ensureSupportedSystemFormats } from \"./systemMeta.js\";\nimport { RuntimeStatusController } from \"./runtimeStatus.js\";\n\ntype DevtoolsEventMeta = {\n origin?: SyncoreDevtoolsEventOrigin;\n executionId?: string;\n parentExecutionId?: string;\n schedulerJobId?: string;\n schedulerRun?: boolean;\n};\n\nexport class RuntimeKernel<TSchema extends SyncoreDataModel> {\n readonly runtimeId = generateId();\n readonly platform: string;\n readonly externalChangeSourceId = generateId();\n readonly driverDatabasePath: string | undefined;\n readonly capabilities: Readonly<SyncoreCapabilities>;\n readonly runtimeCapabilities: Readonly<SyncoreRuntimeCapabilities>;\n readonly capabilityDescriptors: ReadonlyArray<CapabilityDescriptor>;\n readonly devtoolsEngine: DevtoolsEngine;\n readonly schemaEngine: SchemaEngine<TSchema>;\n readonly storageEngine: StorageEngine;\n readonly schedulerEngine: SchedulerEngine;\n readonly reactivityEngine: ReactivityEngine;\n readonly executionEngine: ExecutionEngine<TSchema>;\n readonly transactionCoordinator: TransactionCoordinator;\n readonly runtimeStatus: RuntimeStatusController;\n readonly admin: SyncoreRuntimeAdmin<TSchema>;\n private prepared = false;\n private started = false;\n\n constructor(\n private readonly options: SyncoreRuntimeOptions<TSchema>,\n runtime: SyncoreRuntime<TSchema>\n ) {\n this.platform = options.platform ?? \"node\";\n this.capabilityDescriptors = Object.freeze([\n ...(options.capabilityDescriptors ?? [])\n ]);\n this.capabilities = Object.freeze({\n ...(options.capabilities ?? {})\n });\n this.runtimeCapabilities = Object.freeze(\n options.runtimeCapabilities ?? {\n storage: {\n available: true,\n ...(options.storage.supportsRange\n ? { supportsRange: options.storage.supportsRange() !== false }\n : {})\n }\n }\n );\n this.driverDatabasePath = inferDriverDatabasePath(\n options.driver as { filename?: string; databasePath?: string }\n );\n this.devtoolsEngine = new DevtoolsEngine({\n runtimeId: this.runtimeId,\n platform: this.platform,\n ...(options.devtools ? { sink: options.devtools } : {}),\n getActiveQueryInfos: () => this.reactivityEngine.getActiveQueryInfos(),\n getSchemaTables: () => this.schemaEngine.getSchemaTablesForDevtools()\n });\n this.schemaEngine = new SchemaEngine({\n schema: options.schema,\n driver: options.driver,\n runtimeId: this.runtimeId,\n devtools: this.devtoolsEngine\n });\n this.storageEngine = new StorageEngine({\n driver: options.driver,\n storage: options.storage,\n runtimeId: this.runtimeId,\n devtools: this.devtoolsEngine\n });\n this.transactionCoordinator = new TransactionCoordinator(options.driver);\n this.runtimeStatus = new RuntimeStatusController({\n kind: \"starting\",\n reason: \"booting\",\n capabilities: this.runtimeCapabilities\n });\n this.schedulerEngine = new SchedulerEngine({\n driver: options.driver,\n runtimeId: this.runtimeId,\n devtools: this.devtoolsEngine,\n recurringJobs: options.scheduler?.recurringJobs ?? [],\n pollIntervalMs: options.scheduler?.pollIntervalMs ?? 1000,\n runMutation: (reference, args, meta) =>\n this.executionEngine.runMutation(reference, args, meta),\n runAction: (reference, args, meta) =>\n this.executionEngine.runAction(reference, args, meta)\n });\n this.reactivityEngine = new ReactivityEngine({\n runtimeId: this.runtimeId,\n externalChangeSourceId: this.externalChangeSourceId,\n ...(options.externalChangeSignal\n ? { externalChangeSignal: options.externalChangeSignal }\n : {}),\n ...(options.externalChangeApplier\n ? { externalChangeApplier: options.externalChangeApplier }\n : {}),\n devtools: this.devtoolsEngine,\n runQuery: (reference, args, meta) =>\n this.executionEngine.runQuery(reference, args, meta),\n collectQueryDependencies: (functionName, args) =>\n this.executionEngine.collectQueryDependencies(functionName, args)\n });\n this.executionEngine = new ExecutionEngine({\n runtimeId: this.runtimeId,\n functions: options.functions,\n driver: options.driver,\n capabilities: this.capabilities,\n capabilityDescriptors: this.capabilityDescriptors,\n schema: this.schemaEngine,\n storage: this.storageEngine,\n scheduler: this.schedulerEngine,\n reactivity: this.reactivityEngine,\n devtools: this.devtoolsEngine,\n transactionCoordinator: this.transactionCoordinator,\n runtimeStatus: this.runtimeStatus\n });\n this.admin = {\n prepareForDirectAccess: () => this.prepareForDirectAccess(),\n createClient: () => this.createClient(),\n runQuery: (reference, args, meta) =>\n this.executionEngine.runQuery(reference, args, meta),\n runMutation: (reference, args, meta) =>\n this.executionEngine.runMutation(reference, args, meta),\n runAction: (reference, args, meta) =>\n this.executionEngine.runAction(reference, args, meta),\n runDevtoolsMutation: async (callback, meta) => {\n await this.prepareForDirectAccess();\n return this.executionEngine.runDevtoolsMutation(callback, meta);\n },\n getRuntimeSummary: () => this.devtoolsEngine.getRuntimeSummary(),\n getActiveQueryInfos: () => this.reactivityEngine.getActiveQueryInfos(),\n getRuntimeId: () => this.runtimeId,\n getDriverDatabasePath: () => this.driverDatabasePath,\n subscribeToDevtoolsEvents: (listener) =>\n this.devtoolsEngine.subscribeEvents(listener),\n subscribeToDevtoolsInvalidations: (listener) =>\n this.devtoolsEngine.subscribeInvalidations(listener),\n notifyDevtoolsScopes: (scopes) =>\n this.devtoolsEngine.notifyScopes(scopes),\n forceRefreshDevtools: async (reason, scopes, meta) => {\n const resolvedScopes = new Set(scopes ?? []);\n if (resolvedScopes.size > 0) {\n await this.reactivityEngine.refreshQueriesForScopes(\n resolvedScopes,\n reason\n );\n }\n await this.devtoolsEngine.forceRefresh(\n reason,\n {\n refreshQueriesForScopes: (requestedScopes, refreshReason) =>\n this.reactivityEngine.refreshQueriesForScopes(\n requestedScopes,\n refreshReason\n )\n },\n meta,\n resolvedScopes\n );\n },\n listStorageObjects: async (options) => {\n await this.prepareForDirectAccess();\n return this.storageEngine.listObjects(options);\n },\n getStorageObjectAccessInfo: async (id) => {\n await this.prepareForDirectAccess();\n return this.storageEngine.getObjectAccessInfo(id);\n },\n readStorageObjectRange: async (id, offset, length) => {\n await this.prepareForDirectAccess();\n return this.storageEngine.readObjectRange(id, offset, length);\n },\n deleteStorageObject: async (id, meta) => {\n await this.prepareForDirectAccess();\n const deleted = await this.storageEngine.deleteObject(id, meta);\n if (deleted) {\n this.devtoolsEngine.notifyScopes([\n \"runtime.summary\",\n \"storage.objects\",\n `storage:${id}`\n ]);\n }\n return deleted;\n },\n cancelScheduledJob: async (id) => {\n await this.prepareForDirectAccess();\n return this.schedulerEngine.cancelScheduledJob(id);\n },\n updateScheduledJob: async (update: UpdateScheduledJobOptions) => {\n await this.prepareForDirectAccess();\n return this.schedulerEngine.updateScheduledJob(update);\n }\n };\n options.devtools?.attachRuntime?.(runtime);\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n this.runtimeStatus.setStatus({\n kind: \"starting\",\n reason: \"booting\",\n capabilities: this.runtimeCapabilities\n });\n await this.prepareForDirectAccess();\n try {\n await this.runComponentHooks(\"onStart\");\n this.reactivityEngine.start();\n this.schedulerEngine.startPolling();\n this.started = true;\n this.runtimeStatus.setStatus({\n kind: \"ready\",\n capabilities: this.runtimeCapabilities\n });\n this.devtoolsEngine.emit({\n type: \"runtime.connected\",\n runtimeId: this.runtimeId,\n platform: this.platform,\n timestamp: Date.now()\n });\n } catch (error) {\n this.schedulerEngine.stopPolling();\n this.reactivityEngine.stop();\n await this.options.driver.close?.().catch(() => undefined);\n this.started = false;\n this.runtimeStatus.setStatus({\n kind: \"error\",\n reason: \"runtime-unavailable\",\n capabilities: this.runtimeCapabilities,\n ...(error instanceof Error ? { error } : {})\n });\n throw error;\n }\n }\n\n async prepareForDirectAccess(): Promise<void> {\n if (this.prepared) {\n return;\n }\n await ensureSupportedSystemFormats(this.options.driver);\n await this.schemaEngine.prepare();\n await this.storageEngine.prepare();\n await this.schedulerEngine.prepare();\n await this.storageEngine.reconcile();\n await this.schemaEngine.applySchema();\n await this.schedulerEngine.syncRecurringJobs();\n this.prepared = true;\n }\n\n async stop(): Promise<void> {\n this.schedulerEngine.stopPolling();\n let stopError: unknown;\n if (this.started) {\n try {\n await this.runComponentHooks(\"onStop\");\n } catch (error) {\n stopError = error;\n }\n }\n this.reactivityEngine.stop();\n await this.options.driver.close?.();\n if (this.started) {\n this.devtoolsEngine.emit({\n type: \"runtime.disconnected\",\n runtimeId: this.runtimeId,\n timestamp: Date.now()\n });\n }\n this.started = false;\n this.runtimeStatus.setStatus({\n kind: \"unavailable\",\n reason: \"disposed\",\n capabilities: this.runtimeCapabilities\n });\n if (stopError) {\n throw stopError;\n }\n }\n\n createClient(): SyncoreClient {\n return this.executionEngine.createClient();\n }\n\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n args: Record<string, unknown> = {}\n ): SyncoreWatch<TResult> {\n return this.executionEngine.watchQuery(reference, args);\n }\n\n private async runComponentHooks(hook: \"onStart\" | \"onStop\"): Promise<void> {\n for (const component of this.options.components ?? []) {\n await this.runComponentHookTree(component, hook);\n }\n }\n\n private async runComponentHookTree(\n component: SyncoreResolvedComponents[number],\n hook: \"onStart\" | \"onStop\"\n ): Promise<void> {\n const handler = component[hook];\n if (handler) {\n await handler({\n runtimeId: this.runtimeId,\n platform: this.platform,\n componentPath: component.path,\n componentName: component.name,\n version: component.version,\n config: component.config,\n capabilities: component.grantedCapabilities,\n emitDevtools: (event: SyncoreDevtoolsEvent) => {\n this.devtoolsEngine.emit(event);\n }\n });\n }\n for (const child of component.children) {\n await this.runComponentHookTree(child, hook);\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeStatus.mjs","names":[],"sources":["../../../src/runtime/internal/runtimeStatus.ts"],"sourcesContent":["import type {\n SyncoreRuntimeStatus,\n SyncoreWatch\n} from \"../runtime.js\";\n\nexport class RuntimeStatusController {\n private status: SyncoreRuntimeStatus;\n private readonly listeners = new Set<() => void>();\n\n constructor(initialStatus: SyncoreRuntimeStatus) {\n this.status = initialStatus;\n }\n\n getStatus(): SyncoreRuntimeStatus {\n return this.status;\n }\n\n setStatus(nextStatus: SyncoreRuntimeStatus): void {\n this.status = nextStatus;\n for (const listener of this.listeners) {\n listener();\n }\n }\n\n watch(): SyncoreWatch<SyncoreRuntimeStatus> {\n return {\n onUpdate: (callback) => {\n this.listeners.add(callback);\n queueMicrotask(callback);\n return () => {\n this.listeners.delete(callback);\n };\n },\n localQueryResult: () => this.status,\n localQueryError: () => undefined\n };\n }\n}\n"],"mappings":";AAKA,IAAa,0BAAb,MAAqC;CACnC;CACA,4BAA6B,IAAI,KAAiB;CAElD,YAAY,eAAqC;AAC/C,OAAK,SAAS;;CAGhB,YAAkC;AAChC,SAAO,KAAK;;CAGd,UAAU,YAAwC;AAChD,OAAK,SAAS;AACd,OAAK,MAAM,YAAY,KAAK,UAC1B,WAAU;;CAId,QAA4C;AAC1C,SAAO;GACL,WAAW,aAAa;AACtB,SAAK,UAAU,IAAI,SAAS;AAC5B,mBAAe,SAAS;AACxB,iBAAa;AACX,UAAK,UAAU,OAAO,SAAS;;;GAGnC,wBAAwB,KAAK;GAC7B,uBAAuB,KAAA;GACxB"}
1
+ {"version":3,"file":"runtimeStatus.mjs","names":[],"sources":["../../../src/runtime/internal/runtimeStatus.ts"],"sourcesContent":["import type {\n SyncoreRuntimeStatus,\n SyncoreWatch\n} from \"../runtime.js\";\n\nexport class RuntimeStatusController {\n private status: SyncoreRuntimeStatus;\n private readonly listeners = new Set<() => void>();\n\n constructor(initialStatus: SyncoreRuntimeStatus) {\n this.status = initialStatus;\n }\n\n getStatus(): SyncoreRuntimeStatus {\n return this.status;\n }\n\n setStatus(nextStatus: SyncoreRuntimeStatus): void {\n this.status = nextStatus;\n for (const listener of this.listeners) {\n listener();\n }\n }\n\n watch(): SyncoreWatch<SyncoreRuntimeStatus> {\n return {\n onUpdate: (callback) => {\n this.listeners.add(callback);\n queueMicrotask(callback);\n return () => {\n this.listeners.delete(callback);\n };\n },\n localQueryResult: () => this.status,\n localQueryError: () => undefined\n };\n }\n}\n"],"mappings":";AAKA,IAAa,0BAAb,MAAqC;CACnC;CACA,4BAA6B,IAAI,IAAgB;CAEjD,YAAY,eAAqC;EAC/C,KAAK,SAAS;CAChB;CAEA,YAAkC;EAChC,OAAO,KAAK;CACd;CAEA,UAAU,YAAwC;EAChD,KAAK,SAAS;EACd,KAAK,MAAM,YAAY,KAAK,WAC1B,SAAS;CAEb;CAEA,QAA4C;EAC1C,OAAO;GACL,WAAW,aAAa;IACtB,KAAK,UAAU,IAAI,QAAQ;IAC3B,eAAe,QAAQ;IACvB,aAAa;KACX,KAAK,UAAU,OAAO,QAAQ;IAChC;GACF;GACA,wBAAwB,KAAK;GAC7B,uBAAuB,KAAA;EACzB;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"systemMeta.mjs","names":[],"sources":["../../../src/runtime/internal/systemMeta.ts"],"sourcesContent":["import type { SyncoreSqlDriver } from \"../runtime.js\";\n\nexport interface SystemFormatRegistry {\n schema_state_format_version: number;\n storage_format_version: number;\n scheduler_format_version: number;\n runtime_meta_version: number;\n}\n\nexport const CURRENT_SYSTEM_FORMATS: SystemFormatRegistry = {\n schema_state_format_version: 1,\n storage_format_version: 1,\n scheduler_format_version: 1,\n runtime_meta_version: 1\n};\n\nconst META_TABLE_NAME = \"_syncore_system_meta\";\n\nexport async function ensureSystemMetaTable(\n driver: SyncoreSqlDriver\n): Promise<void> {\n await driver.exec(`\n CREATE TABLE IF NOT EXISTS \"${META_TABLE_NAME}\" (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n );\n `);\n}\n\nexport async function loadSystemFormats(\n driver: SyncoreSqlDriver\n): Promise<SystemFormatRegistry> {\n await ensureSystemMetaTable(driver);\n const rows = await driver.all<{ key: string; value: string }>(\n `SELECT key, value FROM \"${META_TABLE_NAME}\"`\n );\n const loaded = { ...CURRENT_SYSTEM_FORMATS };\n\n for (const row of rows) {\n if (!isSystemFormatKey(row.key)) {\n continue;\n }\n const parsed = Number.parseInt(row.value, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid Syncore system format value for \"${row.key}\".`);\n }\n loaded[row.key] = parsed;\n }\n\n return loaded;\n}\n\nexport async function ensureSupportedSystemFormats(\n driver: SyncoreSqlDriver\n): Promise<SystemFormatRegistry> {\n const loaded = await loadSystemFormats(driver);\n\n for (const key of systemFormatKeys()) {\n if (loaded[key] > CURRENT_SYSTEM_FORMATS[key]) {\n throw new Error(\n `Syncore system format \"${key}\" version ${loaded[key]} is newer than this runtime supports (${CURRENT_SYSTEM_FORMATS[key]}).`\n );\n }\n }\n\n const now = Date.now();\n for (const key of systemFormatKeys()) {\n if (loaded[key] === CURRENT_SYSTEM_FORMATS[key]) {\n await driver.run(\n `INSERT OR REPLACE INTO \"${META_TABLE_NAME}\" (key, value, updated_at) VALUES (?, ?, ?)`,\n [key, String(loaded[key]), now]\n );\n continue;\n }\n await driver.run(\n `INSERT OR REPLACE INTO \"${META_TABLE_NAME}\" (key, value, updated_at) VALUES (?, ?, ?)`,\n [key, String(CURRENT_SYSTEM_FORMATS[key]), now]\n );\n loaded[key] = CURRENT_SYSTEM_FORMATS[key];\n }\n\n return loaded;\n}\n\nfunction systemFormatKeys(): Array<keyof SystemFormatRegistry> {\n return Object.keys(CURRENT_SYSTEM_FORMATS) as Array<keyof SystemFormatRegistry>;\n}\n\nfunction isSystemFormatKey(value: string): value is keyof SystemFormatRegistry {\n return systemFormatKeys().includes(value as keyof SystemFormatRegistry);\n}\n"],"mappings":";AASA,MAAa,yBAA+C;CAC1D,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAC1B,sBAAsB;CACvB;AAED,MAAM,kBAAkB;AAExB,eAAsB,sBACpB,QACe;AACf,OAAM,OAAO,KAAK;kCACc,gBAAgB;;;;;IAK9C;;AAGJ,eAAsB,kBACpB,QAC+B;AAC/B,OAAM,sBAAsB,OAAO;CACnC,MAAM,OAAO,MAAM,OAAO,IACxB,2BAA2B,gBAAgB,GAC5C;CACD,MAAM,SAAS,EAAE,GAAG,wBAAwB;AAE5C,MAAK,MAAM,OAAO,MAAM;AACtB,MAAI,CAAC,kBAAkB,IAAI,IAAI,CAC7B;EAEF,MAAM,SAAS,OAAO,SAAS,IAAI,OAAO,GAAG;AAC7C,MAAI,OAAO,MAAM,OAAO,CACtB,OAAM,IAAI,MAAM,4CAA4C,IAAI,IAAI,IAAI;AAE1E,SAAO,IAAI,OAAO;;AAGpB,QAAO;;AAGT,eAAsB,6BACpB,QAC+B;CAC/B,MAAM,SAAS,MAAM,kBAAkB,OAAO;AAE9C,MAAK,MAAM,OAAO,kBAAkB,CAClC,KAAI,OAAO,OAAO,uBAAuB,KACvC,OAAM,IAAI,MACR,0BAA0B,IAAI,YAAY,OAAO,KAAK,wCAAwC,uBAAuB,KAAK,IAC3H;CAIL,MAAM,MAAM,KAAK,KAAK;AACtB,MAAK,MAAM,OAAO,kBAAkB,EAAE;AACpC,MAAI,OAAO,SAAS,uBAAuB,MAAM;AAC/C,SAAM,OAAO,IACX,2BAA2B,gBAAgB,8CAC3C;IAAC;IAAK,OAAO,OAAO,KAAK;IAAE;IAAI,CAChC;AACD;;AAEF,QAAM,OAAO,IACX,2BAA2B,gBAAgB,8CAC3C;GAAC;GAAK,OAAO,uBAAuB,KAAK;GAAE;GAAI,CAChD;AACD,SAAO,OAAO,uBAAuB;;AAGvC,QAAO;;AAGT,SAAS,mBAAsD;AAC7D,QAAO,OAAO,KAAK,uBAAuB;;AAG5C,SAAS,kBAAkB,OAAoD;AAC7E,QAAO,kBAAkB,CAAC,SAAS,MAAoC"}
1
+ {"version":3,"file":"systemMeta.mjs","names":[],"sources":["../../../src/runtime/internal/systemMeta.ts"],"sourcesContent":["import type { SyncoreSqlDriver } from \"../runtime.js\";\n\nexport interface SystemFormatRegistry {\n schema_state_format_version: number;\n storage_format_version: number;\n scheduler_format_version: number;\n runtime_meta_version: number;\n}\n\nexport const CURRENT_SYSTEM_FORMATS: SystemFormatRegistry = {\n schema_state_format_version: 1,\n storage_format_version: 1,\n scheduler_format_version: 1,\n runtime_meta_version: 1\n};\n\nconst META_TABLE_NAME = \"_syncore_system_meta\";\n\nexport async function ensureSystemMetaTable(\n driver: SyncoreSqlDriver\n): Promise<void> {\n await driver.exec(`\n CREATE TABLE IF NOT EXISTS \"${META_TABLE_NAME}\" (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n );\n `);\n}\n\nexport async function loadSystemFormats(\n driver: SyncoreSqlDriver\n): Promise<SystemFormatRegistry> {\n await ensureSystemMetaTable(driver);\n const rows = await driver.all<{ key: string; value: string }>(\n `SELECT key, value FROM \"${META_TABLE_NAME}\"`\n );\n const loaded = { ...CURRENT_SYSTEM_FORMATS };\n\n for (const row of rows) {\n if (!isSystemFormatKey(row.key)) {\n continue;\n }\n const parsed = Number.parseInt(row.value, 10);\n if (Number.isNaN(parsed)) {\n throw new Error(`Invalid Syncore system format value for \"${row.key}\".`);\n }\n loaded[row.key] = parsed;\n }\n\n return loaded;\n}\n\nexport async function ensureSupportedSystemFormats(\n driver: SyncoreSqlDriver\n): Promise<SystemFormatRegistry> {\n const loaded = await loadSystemFormats(driver);\n\n for (const key of systemFormatKeys()) {\n if (loaded[key] > CURRENT_SYSTEM_FORMATS[key]) {\n throw new Error(\n `Syncore system format \"${key}\" version ${loaded[key]} is newer than this runtime supports (${CURRENT_SYSTEM_FORMATS[key]}).`\n );\n }\n }\n\n const now = Date.now();\n for (const key of systemFormatKeys()) {\n if (loaded[key] === CURRENT_SYSTEM_FORMATS[key]) {\n await driver.run(\n `INSERT OR REPLACE INTO \"${META_TABLE_NAME}\" (key, value, updated_at) VALUES (?, ?, ?)`,\n [key, String(loaded[key]), now]\n );\n continue;\n }\n await driver.run(\n `INSERT OR REPLACE INTO \"${META_TABLE_NAME}\" (key, value, updated_at) VALUES (?, ?, ?)`,\n [key, String(CURRENT_SYSTEM_FORMATS[key]), now]\n );\n loaded[key] = CURRENT_SYSTEM_FORMATS[key];\n }\n\n return loaded;\n}\n\nfunction systemFormatKeys(): Array<keyof SystemFormatRegistry> {\n return Object.keys(CURRENT_SYSTEM_FORMATS) as Array<keyof SystemFormatRegistry>;\n}\n\nfunction isSystemFormatKey(value: string): value is keyof SystemFormatRegistry {\n return systemFormatKeys().includes(value as keyof SystemFormatRegistry);\n}\n"],"mappings":";AASA,MAAa,yBAA+C;CAC1D,6BAA6B;CAC7B,wBAAwB;CACxB,0BAA0B;CAC1B,sBAAsB;AACxB;AAEA,MAAM,kBAAkB;AAExB,eAAsB,sBACpB,QACe;CACf,MAAM,OAAO,KAAK;kCACc,gBAAgB;;;;;GAK/C;AACH;AAEA,eAAsB,kBACpB,QAC+B;CAC/B,MAAM,sBAAsB,MAAM;CAClC,MAAM,OAAO,MAAM,OAAO,IACxB,2BAA2B,gBAAgB,EAC7C;CACA,MAAM,SAAS,EAAE,GAAG,uBAAuB;CAE3C,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,CAAC,kBAAkB,IAAI,GAAG,GAC5B;EAEF,MAAM,SAAS,OAAO,SAAS,IAAI,OAAO,EAAE;EAC5C,IAAI,OAAO,MAAM,MAAM,GACrB,MAAM,IAAI,MAAM,4CAA4C,IAAI,IAAI,GAAG;EAEzE,OAAO,IAAI,OAAO;CACpB;CAEA,OAAO;AACT;AAEA,eAAsB,6BACpB,QAC+B;CAC/B,MAAM,SAAS,MAAM,kBAAkB,MAAM;CAE7C,KAAK,MAAM,OAAO,iBAAiB,GACjC,IAAI,OAAO,OAAO,uBAAuB,MACvC,MAAM,IAAI,MACR,0BAA0B,IAAI,YAAY,OAAO,KAAK,wCAAwC,uBAAuB,KAAK,GAC5H;CAIJ,MAAM,MAAM,KAAK,IAAI;CACrB,KAAK,MAAM,OAAO,iBAAiB,GAAG;EACpC,IAAI,OAAO,SAAS,uBAAuB,MAAM;GAC/C,MAAM,OAAO,IACX,2BAA2B,gBAAgB,8CAC3C;IAAC;IAAK,OAAO,OAAO,IAAI;IAAG;GAAG,CAChC;GACA;EACF;EACA,MAAM,OAAO,IACX,2BAA2B,gBAAgB,8CAC3C;GAAC;GAAK,OAAO,uBAAuB,IAAI;GAAG;EAAG,CAChD;EACA,OAAO,OAAO,uBAAuB;CACvC;CAEA,OAAO;AACT;AAEA,SAAS,mBAAsD;CAC7D,OAAO,OAAO,KAAK,sBAAsB;AAC3C;AAEA,SAAS,kBAAkB,OAAoD;CAC7E,OAAO,iBAAiB,EAAE,SAAS,KAAmC;AACxE"}
@@ -1,5 +1,6 @@
1
1
  //#region src/runtime/internal/transactionCoordinator.ts
2
2
  var TransactionCoordinator = class {
3
+ driver;
3
4
  constructor(driver) {
4
5
  this.driver = driver;
5
6
  }
@@ -8,6 +9,7 @@ var TransactionCoordinator = class {
8
9
  return {
9
10
  result: await this.driver.withTransaction(async () => execute(state)),
10
11
  changedTables: state.changedTables,
12
+ documentChanges: state.documentChanges,
11
13
  storageChanges: state.storageChanges,
12
14
  scheduledJobs: [],
13
15
  devtoolsEvents: [],
@@ -17,6 +19,7 @@ var TransactionCoordinator = class {
17
19
  createState() {
18
20
  return {
19
21
  changedTables: /* @__PURE__ */ new Set(),
22
+ documentChanges: [],
20
23
  storageChanges: []
21
24
  };
22
25
  }
@@ -25,6 +28,7 @@ function createEmptyExecutionResult(result, state) {
25
28
  return {
26
29
  result,
27
30
  changedTables: state?.changedTables ?? /* @__PURE__ */ new Set(),
31
+ documentChanges: state?.documentChanges ?? [],
28
32
  storageChanges: state?.storageChanges ?? [],
29
33
  scheduledJobs: [],
30
34
  devtoolsEvents: [],
@@ -1 +1 @@
1
- {"version":3,"file":"transactionCoordinator.mjs","names":[],"sources":["../../../src/runtime/internal/transactionCoordinator.ts"],"sourcesContent":["import type {\n ExecutionResult,\n JsonObject,\n SyncoreSqlDriver\n} from \"../runtime.js\";\nimport type { SyncoreExternalChangeReason } from \"../runtime.js\";\n\nexport interface TransactionState {\n changedTables: Set<string>;\n storageChanges: Array<{\n storageId: string;\n reason: Extract<SyncoreExternalChangeReason, \"storage-put\" | \"storage-delete\">;\n }>;\n}\n\nexport class TransactionCoordinator {\n constructor(private readonly driver: SyncoreSqlDriver) {}\n\n async runInTransaction<TResult>(\n execute: (state: TransactionState) => Promise<TResult>\n ): Promise<ExecutionResult<TResult>> {\n const state = this.createState();\n const result = await this.driver.withTransaction(async () => execute(state));\n return {\n result,\n changedTables: state.changedTables,\n storageChanges: state.storageChanges,\n scheduledJobs: [],\n devtoolsEvents: [],\n externalChangeRequests: []\n };\n }\n\n createState(): TransactionState {\n return {\n changedTables: new Set<string>(),\n storageChanges: []\n };\n }\n}\n\nexport function createEmptyExecutionResult<TResult>(\n result: TResult,\n state?: Partial<TransactionState>\n): ExecutionResult<TResult> {\n return {\n result,\n changedTables: state?.changedTables ?? new Set<string>(),\n storageChanges: state?.storageChanges ?? [],\n scheduledJobs: [],\n devtoolsEvents: [],\n externalChangeRequests: []\n };\n}\n"],"mappings":";AAeA,IAAa,yBAAb,MAAoC;CAClC,YAAY,QAA2C;AAA1B,OAAA,SAAA;;CAE7B,MAAM,iBACJ,SACmC;EACnC,MAAM,QAAQ,KAAK,aAAa;AAEhC,SAAO;GACL,QAFa,MAAM,KAAK,OAAO,gBAAgB,YAAY,QAAQ,MAAM,CAAC;GAG1E,eAAe,MAAM;GACrB,gBAAgB,MAAM;GACtB,eAAe,EAAE;GACjB,gBAAgB,EAAE;GAClB,wBAAwB,EAAE;GAC3B;;CAGH,cAAgC;AAC9B,SAAO;GACL,+BAAe,IAAI,KAAa;GAChC,gBAAgB,EAAE;GACnB;;;AAIL,SAAgB,2BACd,QACA,OAC0B;AAC1B,QAAO;EACL;EACA,eAAe,OAAO,iCAAiB,IAAI,KAAa;EACxD,gBAAgB,OAAO,kBAAkB,EAAE;EAC3C,eAAe,EAAE;EACjB,gBAAgB,EAAE;EAClB,wBAAwB,EAAE;EAC3B"}
1
+ {"version":3,"file":"transactionCoordinator.mjs","names":[],"sources":["../../../src/runtime/internal/transactionCoordinator.ts"],"sourcesContent":["import type { DocumentChangePreview } from \"@syncore/devtools-protocol\";\nimport type {\n ExecutionResult,\n JsonObject,\n SyncoreSqlDriver\n} from \"../runtime.js\";\nimport type { SyncoreExternalChangeReason } from \"../runtime.js\";\n\nexport interface TransactionState {\n changedTables: Set<string>;\n documentChanges: DocumentChangePreview[];\n storageChanges: Array<{\n storageId: string;\n reason: Extract<SyncoreExternalChangeReason, \"storage-put\" | \"storage-delete\">;\n }>;\n}\n\nexport class TransactionCoordinator {\n constructor(private readonly driver: SyncoreSqlDriver) {}\n\n async runInTransaction<TResult>(\n execute: (state: TransactionState) => Promise<TResult>\n ): Promise<ExecutionResult<TResult>> {\n const state = this.createState();\n const result = await this.driver.withTransaction(async () => execute(state));\n return {\n result,\n changedTables: state.changedTables,\n documentChanges: state.documentChanges,\n storageChanges: state.storageChanges,\n scheduledJobs: [],\n devtoolsEvents: [],\n externalChangeRequests: []\n };\n }\n\n createState(): TransactionState {\n return {\n changedTables: new Set<string>(),\n documentChanges: [],\n storageChanges: []\n };\n }\n}\n\nexport function createEmptyExecutionResult<TResult>(\n result: TResult,\n state?: Partial<TransactionState>\n): ExecutionResult<TResult> {\n return {\n result,\n changedTables: state?.changedTables ?? new Set<string>(),\n documentChanges: state?.documentChanges ?? [],\n storageChanges: state?.storageChanges ?? [],\n scheduledJobs: [],\n devtoolsEvents: [],\n externalChangeRequests: []\n };\n}\n"],"mappings":";AAiBA,IAAa,yBAAb,MAAoC;CACL;CAA7B,YAAY,QAA2C;EAA1B,KAAA,SAAA;CAA2B;CAExD,MAAM,iBACJ,SACmC;EACnC,MAAM,QAAQ,KAAK,YAAY;EAE/B,OAAO;GACL,QAAA,MAFmB,KAAK,OAAO,gBAAgB,YAAY,QAAQ,KAAK,CAAC;GAGzE,eAAe,MAAM;GACrB,iBAAiB,MAAM;GACvB,gBAAgB,MAAM;GACtB,eAAe,CAAC;GAChB,gBAAgB,CAAC;GACjB,wBAAwB,CAAC;EAC3B;CACF;CAEA,cAAgC;EAC9B,OAAO;GACL,+BAAe,IAAI,IAAY;GAC/B,iBAAiB,CAAC;GAClB,gBAAgB,CAAC;EACnB;CACF;AACF;AAEA,SAAgB,2BACd,QACA,OAC0B;CAC1B,OAAO;EACL;EACA,eAAe,OAAO,iCAAiB,IAAI,IAAY;EACvD,iBAAiB,OAAO,mBAAmB,CAAC;EAC5C,gBAAgB,OAAO,kBAAkB,CAAC;EAC1C,eAAe,CAAC;EAChB,gBAAgB,CAAC;EACjB,wBAAwB,CAAC;CAC3B;AACF"}