syncorejs 0.2.0 → 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.
- package/README.md +2 -1
- package/dist/_vendor/cli/app.d.mts.map +1 -1
- package/dist/_vendor/cli/app.mjs +323 -42
- package/dist/_vendor/cli/app.mjs.map +1 -1
- package/dist/_vendor/cli/context.mjs +27 -9
- package/dist/_vendor/cli/context.mjs.map +1 -1
- package/dist/_vendor/cli/doctor.mjs +513 -46
- package/dist/_vendor/cli/doctor.mjs.map +1 -1
- package/dist/_vendor/cli/messages.mjs +5 -4
- package/dist/_vendor/cli/messages.mjs.map +1 -1
- package/dist/_vendor/cli/project.mjs +110 -12
- package/dist/_vendor/cli/project.mjs.map +1 -1
- package/dist/_vendor/cli/render.mjs +57 -9
- package/dist/_vendor/cli/render.mjs.map +1 -1
- package/dist/_vendor/cli/targets.mjs +4 -3
- package/dist/_vendor/cli/targets.mjs.map +1 -1
- package/dist/_vendor/core/cli.d.mts +13 -3
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +242 -91
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/devtools-auth.mjs +60 -0
- package/dist/_vendor/core/devtools-auth.mjs.map +1 -0
- package/dist/_vendor/core/index.d.mts +5 -3
- package/dist/_vendor/core/index.mjs +22 -2
- package/dist/_vendor/core/index.mjs.map +1 -1
- package/dist/_vendor/core/runtime/components.d.mts +111 -0
- package/dist/_vendor/core/runtime/components.d.mts.map +1 -0
- package/dist/_vendor/core/runtime/components.mjs +186 -0
- package/dist/_vendor/core/runtime/components.mjs.map +1 -0
- package/dist/_vendor/core/runtime/devtools.d.mts +4 -4
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +52 -41
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.d.mts +10 -10
- package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/functions.mjs +2 -2
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +77 -0
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +617 -0
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +186 -0
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +220 -0
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +203 -0
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs +177 -0
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +144 -0
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +220 -0
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs +32 -0
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs +61 -0
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +37 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -0
- package/dist/_vendor/core/runtime/runtime.d.mts +159 -205
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs +16 -1371
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/core/transport.d.mts +111 -0
- package/dist/_vendor/core/transport.d.mts.map +1 -0
- package/dist/_vendor/core/transport.mjs +419 -0
- package/dist/_vendor/core/transport.mjs.map +1 -0
- package/dist/_vendor/devtools-protocol/index.d.ts +39 -1
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js +25 -9
- package/dist/_vendor/devtools-protocol/index.js.map +1 -1
- package/dist/_vendor/next/index.d.ts +1 -1
- package/dist/_vendor/next/index.d.ts.map +1 -1
- package/dist/_vendor/next/index.js +31 -13
- package/dist/_vendor/next/index.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +12 -12
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +4 -2
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-expo/react.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/react.js +11 -10
- package/dist/_vendor/platform-expo/react.js.map +1 -1
- package/dist/_vendor/platform-node/index.d.mts +23 -19
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +13 -5
- package/dist/_vendor/platform-node/index.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.mjs +15 -2
- package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc.d.mts +11 -35
- package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc.mjs +3 -273
- package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +2 -1
- package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
- package/dist/_vendor/platform-web/external-change.js +2 -1
- package/dist/_vendor/platform-web/external-change.js.map +1 -1
- package/dist/_vendor/platform-web/index.d.ts +21 -21
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +44 -7
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/react.d.ts.map +1 -1
- package/dist/_vendor/platform-web/react.js +29 -13
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/platform-web/worker.d.ts +11 -35
- package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
- package/dist/_vendor/platform-web/worker.js +3 -267
- package/dist/_vendor/platform-web/worker.js.map +1 -1
- package/dist/_vendor/react/index.d.ts +36 -20
- package/dist/_vendor/react/index.d.ts.map +1 -1
- package/dist/_vendor/react/index.js +279 -57
- package/dist/_vendor/react/index.js.map +1 -1
- package/dist/_vendor/schema/definition.d.ts +48 -63
- package/dist/_vendor/schema/definition.d.ts.map +1 -1
- package/dist/_vendor/schema/definition.js +22 -39
- package/dist/_vendor/schema/definition.js.map +1 -1
- package/dist/_vendor/schema/index.d.ts +4 -4
- package/dist/_vendor/schema/index.js +2 -2
- package/dist/_vendor/schema/planner.d.ts +19 -2
- package/dist/_vendor/schema/planner.d.ts.map +1 -1
- package/dist/_vendor/schema/planner.js +79 -3
- package/dist/_vendor/schema/planner.js.map +1 -1
- package/dist/_vendor/schema/validators.d.ts +141 -121
- package/dist/_vendor/schema/validators.d.ts.map +1 -1
- package/dist/_vendor/schema/validators.js +300 -42
- package/dist/_vendor/schema/validators.js.map +1 -1
- package/dist/_vendor/svelte/index.d.ts +47 -19
- package/dist/_vendor/svelte/index.d.ts.map +1 -1
- package/dist/_vendor/svelte/index.js +250 -20
- package/dist/_vendor/svelte/index.js.map +1 -1
- package/dist/components.d.ts +2 -0
- package/dist/components.js +2 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- 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":"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"}
|
|
@@ -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"}
|