syncorejs 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +2 -1
  2. package/dist/_vendor/cli/app.d.mts.map +1 -1
  3. package/dist/_vendor/cli/app.mjs +323 -42
  4. package/dist/_vendor/cli/app.mjs.map +1 -1
  5. package/dist/_vendor/cli/context.mjs +27 -9
  6. package/dist/_vendor/cli/context.mjs.map +1 -1
  7. package/dist/_vendor/cli/doctor.mjs +513 -46
  8. package/dist/_vendor/cli/doctor.mjs.map +1 -1
  9. package/dist/_vendor/cli/messages.mjs +5 -4
  10. package/dist/_vendor/cli/messages.mjs.map +1 -1
  11. package/dist/_vendor/cli/project.mjs +110 -12
  12. package/dist/_vendor/cli/project.mjs.map +1 -1
  13. package/dist/_vendor/cli/render.mjs +57 -9
  14. package/dist/_vendor/cli/render.mjs.map +1 -1
  15. package/dist/_vendor/cli/targets.mjs +4 -3
  16. package/dist/_vendor/cli/targets.mjs.map +1 -1
  17. package/dist/_vendor/core/cli.d.mts +13 -3
  18. package/dist/_vendor/core/cli.d.mts.map +1 -1
  19. package/dist/_vendor/core/cli.mjs +242 -91
  20. package/dist/_vendor/core/cli.mjs.map +1 -1
  21. package/dist/_vendor/core/devtools-auth.mjs +60 -0
  22. package/dist/_vendor/core/devtools-auth.mjs.map +1 -0
  23. package/dist/_vendor/core/index.d.mts +5 -3
  24. package/dist/_vendor/core/index.mjs +22 -2
  25. package/dist/_vendor/core/index.mjs.map +1 -1
  26. package/dist/_vendor/core/runtime/components.d.mts +111 -0
  27. package/dist/_vendor/core/runtime/components.d.mts.map +1 -0
  28. package/dist/_vendor/core/runtime/components.mjs +186 -0
  29. package/dist/_vendor/core/runtime/components.mjs.map +1 -0
  30. package/dist/_vendor/core/runtime/devtools.d.mts +4 -4
  31. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
  32. package/dist/_vendor/core/runtime/devtools.mjs +52 -41
  33. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
  34. package/dist/_vendor/core/runtime/functions.d.mts +10 -10
  35. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
  36. package/dist/_vendor/core/runtime/functions.mjs +2 -2
  37. package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
  38. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +77 -0
  39. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -0
  40. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +617 -0
  41. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -0
  42. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +186 -0
  43. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -0
  44. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +220 -0
  45. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -0
  46. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +203 -0
  47. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -0
  48. package/dist/_vendor/core/runtime/internal/engines/shared.mjs +177 -0
  49. package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -0
  50. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +144 -0
  51. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -0
  52. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +220 -0
  53. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -0
  54. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs +32 -0
  55. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -0
  56. package/dist/_vendor/core/runtime/internal/systemMeta.mjs +61 -0
  57. package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -0
  58. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +37 -0
  59. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -0
  60. package/dist/_vendor/core/runtime/runtime.d.mts +159 -205
  61. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
  62. package/dist/_vendor/core/runtime/runtime.mjs +16 -1371
  63. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
  64. package/dist/_vendor/core/transport.d.mts +111 -0
  65. package/dist/_vendor/core/transport.d.mts.map +1 -0
  66. package/dist/_vendor/core/transport.mjs +419 -0
  67. package/dist/_vendor/core/transport.mjs.map +1 -0
  68. package/dist/_vendor/devtools-protocol/index.d.ts +39 -1
  69. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
  70. package/dist/_vendor/devtools-protocol/index.js +25 -9
  71. package/dist/_vendor/devtools-protocol/index.js.map +1 -1
  72. package/dist/_vendor/next/index.d.ts +1 -1
  73. package/dist/_vendor/next/index.d.ts.map +1 -1
  74. package/dist/_vendor/next/index.js +31 -13
  75. package/dist/_vendor/next/index.js.map +1 -1
  76. package/dist/_vendor/platform-expo/index.d.ts +12 -12
  77. package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
  78. package/dist/_vendor/platform-expo/index.js +4 -2
  79. package/dist/_vendor/platform-expo/index.js.map +1 -1
  80. package/dist/_vendor/platform-expo/react.d.ts.map +1 -1
  81. package/dist/_vendor/platform-expo/react.js +11 -10
  82. package/dist/_vendor/platform-expo/react.js.map +1 -1
  83. package/dist/_vendor/platform-node/index.d.mts +23 -19
  84. package/dist/_vendor/platform-node/index.d.mts.map +1 -1
  85. package/dist/_vendor/platform-node/index.mjs +13 -5
  86. package/dist/_vendor/platform-node/index.mjs.map +1 -1
  87. package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -1
  88. package/dist/_vendor/platform-node/ipc-react.mjs +15 -2
  89. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
  90. package/dist/_vendor/platform-node/ipc.d.mts +11 -35
  91. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
  92. package/dist/_vendor/platform-node/ipc.mjs +3 -273
  93. package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
  94. package/dist/_vendor/platform-web/external-change.d.ts +2 -1
  95. package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
  96. package/dist/_vendor/platform-web/external-change.js +2 -1
  97. package/dist/_vendor/platform-web/external-change.js.map +1 -1
  98. package/dist/_vendor/platform-web/index.d.ts +21 -21
  99. package/dist/_vendor/platform-web/index.d.ts.map +1 -1
  100. package/dist/_vendor/platform-web/index.js +44 -7
  101. package/dist/_vendor/platform-web/index.js.map +1 -1
  102. package/dist/_vendor/platform-web/react.d.ts.map +1 -1
  103. package/dist/_vendor/platform-web/react.js +29 -13
  104. package/dist/_vendor/platform-web/react.js.map +1 -1
  105. package/dist/_vendor/platform-web/worker.d.ts +11 -35
  106. package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
  107. package/dist/_vendor/platform-web/worker.js +3 -267
  108. package/dist/_vendor/platform-web/worker.js.map +1 -1
  109. package/dist/_vendor/react/index.d.ts +36 -20
  110. package/dist/_vendor/react/index.d.ts.map +1 -1
  111. package/dist/_vendor/react/index.js +279 -57
  112. package/dist/_vendor/react/index.js.map +1 -1
  113. package/dist/_vendor/schema/definition.d.ts +48 -63
  114. package/dist/_vendor/schema/definition.d.ts.map +1 -1
  115. package/dist/_vendor/schema/definition.js +22 -39
  116. package/dist/_vendor/schema/definition.js.map +1 -1
  117. package/dist/_vendor/schema/index.d.ts +4 -4
  118. package/dist/_vendor/schema/index.js +2 -2
  119. package/dist/_vendor/schema/planner.d.ts +19 -2
  120. package/dist/_vendor/schema/planner.d.ts.map +1 -1
  121. package/dist/_vendor/schema/planner.js +79 -3
  122. package/dist/_vendor/schema/planner.js.map +1 -1
  123. package/dist/_vendor/schema/validators.d.ts +141 -121
  124. package/dist/_vendor/schema/validators.d.ts.map +1 -1
  125. package/dist/_vendor/schema/validators.js +300 -42
  126. package/dist/_vendor/schema/validators.js.map +1 -1
  127. package/dist/_vendor/svelte/index.d.ts +47 -19
  128. package/dist/_vendor/svelte/index.d.ts.map +1 -1
  129. package/dist/_vendor/svelte/index.js +250 -20
  130. package/dist/_vendor/svelte/index.js.map +1 -1
  131. package/dist/components.d.ts +2 -0
  132. package/dist/components.js +2 -0
  133. package/dist/index.d.ts +3 -2
  134. package/dist/index.js +2 -1
  135. package/package.json +8 -3
@@ -0,0 +1,220 @@
1
+ import { generateId } from "../id.mjs";
2
+ import { inferDriverDatabasePath } from "./engines/shared.mjs";
3
+ import { DevtoolsEngine } from "./engines/devtoolsEngine.mjs";
4
+ import { TransactionCoordinator } from "./transactionCoordinator.mjs";
5
+ import { ExecutionEngine } from "./engines/executionEngine.mjs";
6
+ import { ReactivityEngine } from "./engines/reactivityEngine.mjs";
7
+ import { SchedulerEngine } from "./engines/schedulerEngine.mjs";
8
+ import { SchemaEngine } from "./engines/schemaEngine.mjs";
9
+ import { StorageEngine } from "./engines/storageEngine.mjs";
10
+ import { ensureSupportedSystemFormats } from "./systemMeta.mjs";
11
+ import { RuntimeStatusController } from "./runtimeStatus.mjs";
12
+ //#region src/runtime/internal/runtimeKernel.ts
13
+ var RuntimeKernel = class {
14
+ runtimeId = generateId();
15
+ platform;
16
+ externalChangeSourceId = generateId();
17
+ driverDatabasePath;
18
+ capabilities;
19
+ capabilityDescriptors;
20
+ devtoolsEngine;
21
+ schemaEngine;
22
+ storageEngine;
23
+ schedulerEngine;
24
+ reactivityEngine;
25
+ executionEngine;
26
+ transactionCoordinator;
27
+ runtimeStatus;
28
+ admin;
29
+ prepared = false;
30
+ started = false;
31
+ constructor(options, runtime) {
32
+ this.options = options;
33
+ this.platform = options.platform ?? "node";
34
+ this.capabilityDescriptors = Object.freeze([...options.capabilityDescriptors ?? []]);
35
+ this.capabilities = Object.freeze({ ...options.capabilities ?? {} });
36
+ this.driverDatabasePath = inferDriverDatabasePath(options.driver);
37
+ this.devtoolsEngine = new DevtoolsEngine({
38
+ runtimeId: this.runtimeId,
39
+ platform: this.platform,
40
+ ...options.devtools ? { sink: options.devtools } : {},
41
+ getActiveQueryInfos: () => this.reactivityEngine.getActiveQueryInfos(),
42
+ getSchemaTables: () => this.schemaEngine.getSchemaTablesForDevtools()
43
+ });
44
+ this.schemaEngine = new SchemaEngine({
45
+ schema: options.schema,
46
+ driver: options.driver,
47
+ runtimeId: this.runtimeId,
48
+ devtools: this.devtoolsEngine
49
+ });
50
+ this.storageEngine = new StorageEngine({
51
+ driver: options.driver,
52
+ storage: options.storage,
53
+ runtimeId: this.runtimeId,
54
+ devtools: this.devtoolsEngine
55
+ });
56
+ this.transactionCoordinator = new TransactionCoordinator(options.driver);
57
+ this.runtimeStatus = new RuntimeStatusController({
58
+ kind: "starting",
59
+ reason: "booting"
60
+ });
61
+ this.schedulerEngine = new SchedulerEngine({
62
+ driver: options.driver,
63
+ runtimeId: this.runtimeId,
64
+ devtools: this.devtoolsEngine,
65
+ recurringJobs: options.scheduler?.recurringJobs ?? [],
66
+ pollIntervalMs: options.scheduler?.pollIntervalMs ?? 1e3,
67
+ runMutation: (reference, args) => this.executionEngine.runMutation(reference, args),
68
+ runAction: (reference, args) => this.executionEngine.runAction(reference, args)
69
+ });
70
+ this.reactivityEngine = new ReactivityEngine({
71
+ runtimeId: this.runtimeId,
72
+ externalChangeSourceId: this.externalChangeSourceId,
73
+ ...options.externalChangeSignal ? { externalChangeSignal: options.externalChangeSignal } : {},
74
+ ...options.externalChangeApplier ? { externalChangeApplier: options.externalChangeApplier } : {},
75
+ devtools: this.devtoolsEngine,
76
+ runQuery: (reference, args) => this.executionEngine.runQuery(reference, args),
77
+ collectQueryDependencies: (functionName, args) => this.executionEngine.collectQueryDependencies(functionName, args)
78
+ });
79
+ this.executionEngine = new ExecutionEngine({
80
+ runtimeId: this.runtimeId,
81
+ functions: options.functions,
82
+ driver: options.driver,
83
+ capabilities: this.capabilities,
84
+ capabilityDescriptors: this.capabilityDescriptors,
85
+ schema: this.schemaEngine,
86
+ storage: this.storageEngine,
87
+ scheduler: this.schedulerEngine,
88
+ reactivity: this.reactivityEngine,
89
+ devtools: this.devtoolsEngine,
90
+ transactionCoordinator: this.transactionCoordinator,
91
+ runtimeStatus: this.runtimeStatus
92
+ });
93
+ this.admin = {
94
+ prepareForDirectAccess: () => this.prepareForDirectAccess(),
95
+ createClient: () => this.createClient(),
96
+ runQuery: (reference, args, meta) => this.executionEngine.runQuery(reference, args, meta),
97
+ runMutation: (reference, args, meta) => this.executionEngine.runMutation(reference, args, meta),
98
+ runAction: (reference, args, meta) => this.executionEngine.runAction(reference, args, meta),
99
+ runDevtoolsMutation: async (callback, meta) => {
100
+ await this.prepareForDirectAccess();
101
+ return this.executionEngine.runDevtoolsMutation(callback, meta);
102
+ },
103
+ getRuntimeSummary: () => this.devtoolsEngine.getRuntimeSummary(),
104
+ getActiveQueryInfos: () => this.reactivityEngine.getActiveQueryInfos(),
105
+ getRuntimeId: () => this.runtimeId,
106
+ getDriverDatabasePath: () => this.driverDatabasePath,
107
+ subscribeToDevtoolsEvents: (listener) => this.devtoolsEngine.subscribeEvents(listener),
108
+ subscribeToDevtoolsInvalidations: (listener) => this.devtoolsEngine.subscribeInvalidations(listener),
109
+ notifyDevtoolsScopes: (scopes) => this.devtoolsEngine.notifyScopes(scopes),
110
+ forceRefreshDevtools: async (reason, scopes, meta) => {
111
+ const resolvedScopes = new Set(scopes ?? []);
112
+ if (resolvedScopes.size > 0) await this.reactivityEngine.refreshQueriesForScopes(resolvedScopes, reason);
113
+ await this.devtoolsEngine.forceRefresh(reason, { refreshQueriesForScopes: (requestedScopes, refreshReason) => this.reactivityEngine.refreshQueriesForScopes(requestedScopes, refreshReason) }, meta, resolvedScopes);
114
+ },
115
+ cancelScheduledJob: async (id) => {
116
+ await this.prepareForDirectAccess();
117
+ return this.schedulerEngine.cancelScheduledJob(id);
118
+ },
119
+ updateScheduledJob: async (update) => {
120
+ await this.prepareForDirectAccess();
121
+ return this.schedulerEngine.updateScheduledJob(update);
122
+ }
123
+ };
124
+ options.devtools?.attachRuntime?.(runtime);
125
+ }
126
+ async start() {
127
+ if (this.started) return;
128
+ this.runtimeStatus.setStatus({
129
+ kind: "starting",
130
+ reason: "booting"
131
+ });
132
+ await this.prepareForDirectAccess();
133
+ try {
134
+ await this.runComponentHooks("onStart");
135
+ this.reactivityEngine.start();
136
+ this.schedulerEngine.startPolling();
137
+ this.started = true;
138
+ this.runtimeStatus.setStatus({ kind: "ready" });
139
+ this.devtoolsEngine.emit({
140
+ type: "runtime.connected",
141
+ runtimeId: this.runtimeId,
142
+ platform: this.platform,
143
+ timestamp: Date.now()
144
+ });
145
+ } catch (error) {
146
+ this.schedulerEngine.stopPolling();
147
+ this.reactivityEngine.stop();
148
+ await this.options.driver.close?.().catch(() => void 0);
149
+ this.started = false;
150
+ this.runtimeStatus.setStatus({
151
+ kind: "error",
152
+ reason: "runtime-unavailable",
153
+ ...error instanceof Error ? { error } : {}
154
+ });
155
+ throw error;
156
+ }
157
+ }
158
+ async prepareForDirectAccess() {
159
+ if (this.prepared) return;
160
+ await ensureSupportedSystemFormats(this.options.driver);
161
+ await this.schemaEngine.prepare();
162
+ await this.storageEngine.prepare();
163
+ await this.schedulerEngine.prepare();
164
+ await this.storageEngine.reconcile();
165
+ await this.schemaEngine.applySchema();
166
+ await this.schedulerEngine.syncRecurringJobs();
167
+ this.prepared = true;
168
+ }
169
+ async stop() {
170
+ this.schedulerEngine.stopPolling();
171
+ let stopError;
172
+ if (this.started) try {
173
+ await this.runComponentHooks("onStop");
174
+ } catch (error) {
175
+ stopError = error;
176
+ }
177
+ this.reactivityEngine.stop();
178
+ await this.options.driver.close?.();
179
+ if (this.started) this.devtoolsEngine.emit({
180
+ type: "runtime.disconnected",
181
+ runtimeId: this.runtimeId,
182
+ timestamp: Date.now()
183
+ });
184
+ this.started = false;
185
+ this.runtimeStatus.setStatus({
186
+ kind: "unavailable",
187
+ reason: "disposed"
188
+ });
189
+ if (stopError) throw stopError;
190
+ }
191
+ createClient() {
192
+ return this.executionEngine.createClient();
193
+ }
194
+ watchQuery(reference, args = {}) {
195
+ return this.executionEngine.watchQuery(reference, args);
196
+ }
197
+ async runComponentHooks(hook) {
198
+ for (const component of this.options.components ?? []) await this.runComponentHookTree(component, hook);
199
+ }
200
+ async runComponentHookTree(component, hook) {
201
+ const handler = component[hook];
202
+ if (handler) await handler({
203
+ runtimeId: this.runtimeId,
204
+ platform: this.platform,
205
+ componentPath: component.path,
206
+ componentName: component.name,
207
+ version: component.version,
208
+ config: component.config,
209
+ capabilities: component.grantedCapabilities,
210
+ emitDevtools: (event) => {
211
+ this.devtoolsEngine.emit(event);
212
+ }
213
+ });
214
+ for (const child of component.children) await this.runComponentHookTree(child, hook);
215
+ }
216
+ };
217
+ //#endregion
218
+ export { RuntimeKernel };
219
+
220
+ //# sourceMappingURL=runtimeKernel.mjs.map
@@ -0,0 +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":";;;;;;;;;;;;AAmCA,IAAa,gBAAb,MAEE;CACA,YAAqB,YAAY;CACjC;CACA,yBAAkC,YAAY;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,WAAmB;CACnB,UAAkB;CAElB,YACE,SACA,SACA;AAFiB,OAAA,UAAA;AAGjB,OAAK,WAAW,QAAQ,YAAY;AACpC,OAAK,wBAAwB,OAAO,OAAO,CACzC,GAAI,QAAQ,yBAAyB,EAAE,CACxC,CAAC;AACF,OAAK,eAAe,OAAO,OAAO,EAChC,GAAI,QAAQ,gBAAgB,EAAE,EAC/B,CAAC;AACF,OAAK,qBAAqB,wBACxB,QAAQ,OACT;AACD,OAAK,iBAAiB,IAAI,eAAe;GACvC,WAAW,KAAK;GAChB,UAAU,KAAK;GACf,GAAI,QAAQ,WAAW,EAAE,MAAM,QAAQ,UAAU,GAAG,EAAE;GACtD,2BAA2B,KAAK,iBAAiB,qBAAqB;GACtE,uBAAuB,KAAK,aAAa,4BAA4B;GACtE,CAAC;AACF,OAAK,eAAe,IAAI,aAAa;GACnC,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,WAAW,KAAK;GAChB,UAAU,KAAK;GAChB,CAAC;AACF,OAAK,gBAAgB,IAAI,cAAc;GACrC,QAAQ,QAAQ;GAChB,SAAS,QAAQ;GACjB,WAAW,KAAK;GAChB,UAAU,KAAK;GAChB,CAAC;AACF,OAAK,yBAAyB,IAAI,uBAAuB,QAAQ,OAAO;AACxE,OAAK,gBAAgB,IAAI,wBAAwB;GAC/C,MAAM;GACN,QAAQ;GACT,CAAC;AACF,OAAK,kBAAkB,IAAI,gBAAgB;GACzC,QAAQ,QAAQ;GAChB,WAAW,KAAK;GAChB,UAAU,KAAK;GACf,eAAe,QAAQ,WAAW,iBAAiB,EAAE;GACrD,gBAAgB,QAAQ,WAAW,kBAAkB;GACrD,cAAc,WAAW,SACvB,KAAK,gBAAgB,YAAY,WAAW,KAAK;GACnD,YAAY,WAAW,SAAS,KAAK,gBAAgB,UAAU,WAAW,KAAK;GAChF,CAAC;AACF,OAAK,mBAAmB,IAAI,iBAAiB;GAC3C,WAAW,KAAK;GAChB,wBAAwB,KAAK;GAC7B,GAAI,QAAQ,uBACR,EAAE,sBAAsB,QAAQ,sBAAsB,GACtD,EAAE;GACN,GAAI,QAAQ,wBACR,EAAE,uBAAuB,QAAQ,uBAAuB,GACxD,EAAE;GACN,UAAU,KAAK;GACf,WAAW,WAAW,SAAS,KAAK,gBAAgB,SAAS,WAAW,KAAK;GAC7E,2BAA2B,cAAc,SACvC,KAAK,gBAAgB,yBAAyB,cAAc,KAAK;GACpE,CAAC;AACF,OAAK,kBAAkB,IAAI,gBAAgB;GACzC,WAAW,KAAK;GAChB,WAAW,QAAQ;GACnB,QAAQ,QAAQ;GAChB,cAAc,KAAK;GACnB,uBAAuB,KAAK;GAC5B,QAAQ,KAAK;GACb,SAAS,KAAK;GACd,WAAW,KAAK;GAChB,YAAY,KAAK;GACjB,UAAU,KAAK;GACf,wBAAwB,KAAK;GAC7B,eAAe,KAAK;GACrB,CAAC;AACF,OAAK,QAAQ;GACX,8BAA8B,KAAK,wBAAwB;GAC3D,oBAAoB,KAAK,cAAc;GACvC,WAAW,WAAW,MAAM,SAC1B,KAAK,gBAAgB,SAAS,WAAW,MAAM,KAAK;GACtD,cAAc,WAAW,MAAM,SAC7B,KAAK,gBAAgB,YAAY,WAAW,MAAM,KAAK;GACzD,YAAY,WAAW,MAAM,SAC3B,KAAK,gBAAgB,UAAU,WAAW,MAAM,KAAK;GACvD,qBAAqB,OAAO,UAAU,SAAS;AAC7C,UAAM,KAAK,wBAAwB;AACnC,WAAO,KAAK,gBAAgB,oBAAoB,UAAU,KAAK;;GAEjE,yBAAyB,KAAK,eAAe,mBAAmB;GAChE,2BAA2B,KAAK,iBAAiB,qBAAqB;GACtE,oBAAoB,KAAK;GACzB,6BAA6B,KAAK;GAClC,4BAA4B,aAC1B,KAAK,eAAe,gBAAgB,SAAS;GAC/C,mCAAmC,aACjC,KAAK,eAAe,uBAAuB,SAAS;GACtD,uBAAuB,WAAW,KAAK,eAAe,aAAa,OAAO;GAC1E,sBAAsB,OAAO,QAAQ,QAAQ,SAAS;IACpD,MAAM,iBAAiB,IAAI,IAAI,UAAU,EAAE,CAAC;AAC5C,QAAI,eAAe,OAAO,EACxB,OAAM,KAAK,iBAAiB,wBAC1B,gBACA,OACD;AAEH,UAAM,KAAK,eAAe,aACxB,QACA,EACE,0BAA0B,iBAAiB,kBACzC,KAAK,iBAAiB,wBACpB,iBACA,cACD,EACJ,EACD,MACA,eACD;;GAEH,oBAAoB,OAAO,OAAO;AAChC,UAAM,KAAK,wBAAwB;AACnC,WAAO,KAAK,gBAAgB,mBAAmB,GAAG;;GAEpD,oBAAoB,OAAO,WAAsC;AAC/D,UAAM,KAAK,wBAAwB;AACnC,WAAO,KAAK,gBAAgB,mBAAmB,OAAO;;GAEzD;AACD,UAAQ,UAAU,gBAAgB,QAAQ;;CAG5C,MAAM,QAAuB;AAC3B,MAAI,KAAK,QACP;AAEF,OAAK,cAAc,UAAU;GAC3B,MAAM;GACN,QAAQ;GACT,CAAC;AACF,QAAM,KAAK,wBAAwB;AACnC,MAAI;AACF,SAAM,KAAK,kBAAkB,UAAU;AACvC,QAAK,iBAAiB,OAAO;AAC7B,QAAK,gBAAgB,cAAc;AACnC,QAAK,UAAU;AACf,QAAK,cAAc,UAAU,EAC3B,MAAM,SACP,CAAC;AACF,QAAK,eAAe,KAAK;IACvB,MAAM;IACN,WAAW,KAAK;IAChB,UAAU,KAAK;IACf,WAAW,KAAK,KAAK;IACtB,CAAC;WACK,OAAO;AACd,QAAK,gBAAgB,aAAa;AAClC,QAAK,iBAAiB,MAAM;AAC5B,SAAM,KAAK,QAAQ,OAAO,SAAS,CAAC,YAAY,KAAA,EAAU;AAC1D,QAAK,UAAU;AACf,QAAK,cAAc,UAAU;IAC3B,MAAM;IACN,QAAQ;IACR,GAAI,iBAAiB,QAAQ,EAAE,OAAO,GAAG,EAAE;IAC5C,CAAC;AACF,SAAM;;;CAIV,MAAM,yBAAwC;AAC5C,MAAI,KAAK,SACP;AAEF,QAAM,6BAA6B,KAAK,QAAQ,OAAO;AACvD,QAAM,KAAK,aAAa,SAAS;AACjC,QAAM,KAAK,cAAc,SAAS;AAClC,QAAM,KAAK,gBAAgB,SAAS;AACpC,QAAM,KAAK,cAAc,WAAW;AACpC,QAAM,KAAK,aAAa,aAAa;AACrC,QAAM,KAAK,gBAAgB,mBAAmB;AAC9C,OAAK,WAAW;;CAGlB,MAAM,OAAsB;AAC1B,OAAK,gBAAgB,aAAa;EAClC,IAAI;AACJ,MAAI,KAAK,QACP,KAAI;AACF,SAAM,KAAK,kBAAkB,SAAS;WAC/B,OAAO;AACd,eAAY;;AAGhB,OAAK,iBAAiB,MAAM;AAC5B,QAAM,KAAK,QAAQ,OAAO,SAAS;AACnC,MAAI,KAAK,QACP,MAAK,eAAe,KAAK;GACvB,MAAM;GACN,WAAW,KAAK;GAChB,WAAW,KAAK,KAAK;GACtB,CAAC;AAEJ,OAAK,UAAU;AACf,OAAK,cAAc,UAAU;GAC3B,MAAM;GACN,QAAQ;GACT,CAAC;AACF,MAAI,UACF,OAAM;;CAIV,eAA8B;AAC5B,SAAO,KAAK,gBAAgB,cAAc;;CAG5C,WACE,WACA,OAAgC,EAAE,EACX;AACvB,SAAO,KAAK,gBAAgB,WAAW,WAAW,KAAK;;CAGzD,MAAc,kBACZ,MACe;AACf,OAAK,MAAM,aAAa,KAAK,QAAQ,cAAc,EAAE,CACnD,OAAM,KAAK,qBAAqB,WAAW,KAAK;;CAIpD,MAAc,qBACZ,WACA,MACe;EACf,MAAM,UAAU,UAAU;AAC1B,MAAI,QACF,OAAM,QAAQ;GACZ,WAAW,KAAK;GAChB,UAAU,KAAK;GACf,eAAe,UAAU;GACzB,eAAe,UAAU;GACzB,SAAS,UAAU;GACnB,QAAQ,UAAU;GAClB,cAAc,UAAU;GACxB,eAAe,UAAgC;AAC7C,SAAK,eAAe,KAAK,MAAM;;GAElC,CAAC;AAEJ,OAAK,MAAM,SAAS,UAAU,SAC5B,OAAM,KAAK,qBAAqB,OAAO,KAAK"}
@@ -0,0 +1,32 @@
1
+ //#region src/runtime/internal/runtimeStatus.ts
2
+ var RuntimeStatusController = class {
3
+ status;
4
+ listeners = /* @__PURE__ */ new Set();
5
+ constructor(initialStatus) {
6
+ this.status = initialStatus;
7
+ }
8
+ getStatus() {
9
+ return this.status;
10
+ }
11
+ setStatus(nextStatus) {
12
+ this.status = nextStatus;
13
+ for (const listener of this.listeners) listener();
14
+ }
15
+ watch() {
16
+ return {
17
+ onUpdate: (callback) => {
18
+ this.listeners.add(callback);
19
+ queueMicrotask(callback);
20
+ return () => {
21
+ this.listeners.delete(callback);
22
+ };
23
+ },
24
+ localQueryResult: () => this.status,
25
+ localQueryError: () => void 0
26
+ };
27
+ }
28
+ };
29
+ //#endregion
30
+ export { RuntimeStatusController };
31
+
32
+ //# sourceMappingURL=runtimeStatus.mjs.map
@@ -0,0 +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"}
@@ -0,0 +1,61 @@
1
+ //#region src/runtime/internal/systemMeta.ts
2
+ const CURRENT_SYSTEM_FORMATS = {
3
+ schema_state_format_version: 1,
4
+ storage_format_version: 1,
5
+ scheduler_format_version: 1,
6
+ runtime_meta_version: 1
7
+ };
8
+ const META_TABLE_NAME = "_syncore_system_meta";
9
+ async function ensureSystemMetaTable(driver) {
10
+ await driver.exec(`
11
+ CREATE TABLE IF NOT EXISTS "${META_TABLE_NAME}" (
12
+ key TEXT PRIMARY KEY,
13
+ value TEXT NOT NULL,
14
+ updated_at INTEGER NOT NULL
15
+ );
16
+ `);
17
+ }
18
+ async function loadSystemFormats(driver) {
19
+ await ensureSystemMetaTable(driver);
20
+ const rows = await driver.all(`SELECT key, value FROM "${META_TABLE_NAME}"`);
21
+ const loaded = { ...CURRENT_SYSTEM_FORMATS };
22
+ for (const row of rows) {
23
+ if (!isSystemFormatKey(row.key)) continue;
24
+ const parsed = Number.parseInt(row.value, 10);
25
+ if (Number.isNaN(parsed)) throw new Error(`Invalid Syncore system format value for "${row.key}".`);
26
+ loaded[row.key] = parsed;
27
+ }
28
+ return loaded;
29
+ }
30
+ async function ensureSupportedSystemFormats(driver) {
31
+ const loaded = await loadSystemFormats(driver);
32
+ for (const key of systemFormatKeys()) if (loaded[key] > CURRENT_SYSTEM_FORMATS[key]) throw new Error(`Syncore system format "${key}" version ${loaded[key]} is newer than this runtime supports (${CURRENT_SYSTEM_FORMATS[key]}).`);
33
+ const now = Date.now();
34
+ for (const key of systemFormatKeys()) {
35
+ if (loaded[key] === CURRENT_SYSTEM_FORMATS[key]) {
36
+ await driver.run(`INSERT OR REPLACE INTO "${META_TABLE_NAME}" (key, value, updated_at) VALUES (?, ?, ?)`, [
37
+ key,
38
+ String(loaded[key]),
39
+ now
40
+ ]);
41
+ continue;
42
+ }
43
+ await driver.run(`INSERT OR REPLACE INTO "${META_TABLE_NAME}" (key, value, updated_at) VALUES (?, ?, ?)`, [
44
+ key,
45
+ String(CURRENT_SYSTEM_FORMATS[key]),
46
+ now
47
+ ]);
48
+ loaded[key] = CURRENT_SYSTEM_FORMATS[key];
49
+ }
50
+ return loaded;
51
+ }
52
+ function systemFormatKeys() {
53
+ return Object.keys(CURRENT_SYSTEM_FORMATS);
54
+ }
55
+ function isSystemFormatKey(value) {
56
+ return systemFormatKeys().includes(value);
57
+ }
58
+ //#endregion
59
+ export { ensureSupportedSystemFormats };
60
+
61
+ //# sourceMappingURL=systemMeta.mjs.map
@@ -0,0 +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"}
@@ -0,0 +1,37 @@
1
+ //#region src/runtime/internal/transactionCoordinator.ts
2
+ var TransactionCoordinator = class {
3
+ constructor(driver) {
4
+ this.driver = driver;
5
+ }
6
+ async runInTransaction(execute) {
7
+ const state = this.createState();
8
+ return {
9
+ result: await this.driver.withTransaction(async () => execute(state)),
10
+ changedTables: state.changedTables,
11
+ storageChanges: state.storageChanges,
12
+ scheduledJobs: [],
13
+ devtoolsEvents: [],
14
+ externalChangeRequests: []
15
+ };
16
+ }
17
+ createState() {
18
+ return {
19
+ changedTables: /* @__PURE__ */ new Set(),
20
+ storageChanges: []
21
+ };
22
+ }
23
+ };
24
+ function createEmptyExecutionResult(result, state) {
25
+ return {
26
+ result,
27
+ changedTables: state?.changedTables ?? /* @__PURE__ */ new Set(),
28
+ storageChanges: state?.storageChanges ?? [],
29
+ scheduledJobs: [],
30
+ devtoolsEvents: [],
31
+ externalChangeRequests: []
32
+ };
33
+ }
34
+ //#endregion
35
+ export { TransactionCoordinator, createEmptyExecutionResult };
36
+
37
+ //# sourceMappingURL=transactionCoordinator.mjs.map
@@ -0,0 +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"}