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.
- 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,419 @@
|
|
|
1
|
+
import { generateId } from "./runtime/id.mjs";
|
|
2
|
+
import { RuntimeStatusController } from "./runtime/internal/runtimeStatus.mjs";
|
|
3
|
+
//#region src/transport.ts
|
|
4
|
+
var SyncoreBridgeClient = class {
|
|
5
|
+
pendingRequests = /* @__PURE__ */ new Map();
|
|
6
|
+
watchRecordsByKey = /* @__PURE__ */ new Map();
|
|
7
|
+
watchKeyBySubscriptionId = /* @__PURE__ */ new Map();
|
|
8
|
+
runtimeStatus = new RuntimeStatusController({
|
|
9
|
+
kind: "starting",
|
|
10
|
+
reason: "booting"
|
|
11
|
+
});
|
|
12
|
+
disposed = false;
|
|
13
|
+
handleMessage = (event) => {
|
|
14
|
+
const message = event.data;
|
|
15
|
+
if (!message || typeof message !== "object" || !("type" in message)) return;
|
|
16
|
+
switch (message.type) {
|
|
17
|
+
case "runtime.ready":
|
|
18
|
+
this.runtimeStatus.setStatus({ kind: "ready" });
|
|
19
|
+
return;
|
|
20
|
+
case "runtime.error":
|
|
21
|
+
this.runtimeStatus.setStatus({
|
|
22
|
+
kind: "error",
|
|
23
|
+
reason: "runtime-unavailable",
|
|
24
|
+
error: new Error(message.error)
|
|
25
|
+
});
|
|
26
|
+
for (const watchRecord of this.watchRecordsByKey.values()) for (const listener of watchRecord.listeners) listener();
|
|
27
|
+
this.rejectAllPending(new Error(message.error));
|
|
28
|
+
return;
|
|
29
|
+
case "runtime.status":
|
|
30
|
+
this.runtimeStatus.setStatus(message.status);
|
|
31
|
+
for (const watchRecord of this.watchRecordsByKey.values()) for (const listener of watchRecord.listeners) listener();
|
|
32
|
+
if (message.status.error) this.rejectAllPending(message.status.error);
|
|
33
|
+
return;
|
|
34
|
+
case "invoke.result": {
|
|
35
|
+
const pending = this.pendingRequests.get(message.requestId);
|
|
36
|
+
if (!pending) return;
|
|
37
|
+
this.pendingRequests.delete(message.requestId);
|
|
38
|
+
if (message.success) pending.resolve(message.value);
|
|
39
|
+
else pending.reject(new Error(message.error));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
case "watch.update": {
|
|
43
|
+
const watchKey = this.watchKeyBySubscriptionId.get(message.subscriptionId);
|
|
44
|
+
if (!watchKey) return;
|
|
45
|
+
const watchRecord = this.watchRecordsByKey.get(watchKey);
|
|
46
|
+
if (!watchRecord) return;
|
|
47
|
+
if (message.success) {
|
|
48
|
+
watchRecord.result = message.value;
|
|
49
|
+
watchRecord.error = void 0;
|
|
50
|
+
} else watchRecord.error = new Error(message.error);
|
|
51
|
+
for (const listener of watchRecord.listeners) listener();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
constructor(endpoint) {
|
|
56
|
+
this.endpoint = endpoint;
|
|
57
|
+
this.endpoint.addEventListener("message", this.handleMessage);
|
|
58
|
+
}
|
|
59
|
+
query(reference, ...args) {
|
|
60
|
+
return this.invoke("query", reference, normalizeOptionalArgs(args));
|
|
61
|
+
}
|
|
62
|
+
mutation(reference, ...args) {
|
|
63
|
+
return this.invoke("mutation", reference, normalizeOptionalArgs(args));
|
|
64
|
+
}
|
|
65
|
+
action(reference, ...args) {
|
|
66
|
+
return this.invoke("action", reference, normalizeOptionalArgs(args));
|
|
67
|
+
}
|
|
68
|
+
watchQuery(reference, ...args) {
|
|
69
|
+
this.ensureNotDisposed();
|
|
70
|
+
const normalizedArgs = normalizeOptionalArgs(args);
|
|
71
|
+
const watchKey = createWatchKey(reference, normalizedArgs);
|
|
72
|
+
let watchRecord = this.watchRecordsByKey.get(watchKey);
|
|
73
|
+
if (!watchRecord) {
|
|
74
|
+
watchRecord = {
|
|
75
|
+
subscriptionId: generateId(),
|
|
76
|
+
listeners: /* @__PURE__ */ new Set(),
|
|
77
|
+
consumers: 0,
|
|
78
|
+
result: void 0,
|
|
79
|
+
error: void 0
|
|
80
|
+
};
|
|
81
|
+
this.watchRecordsByKey.set(watchKey, watchRecord);
|
|
82
|
+
this.watchKeyBySubscriptionId.set(watchRecord.subscriptionId, watchKey);
|
|
83
|
+
this.endpoint.postMessage({
|
|
84
|
+
type: "watch.subscribe",
|
|
85
|
+
subscriptionId: watchRecord.subscriptionId,
|
|
86
|
+
reference,
|
|
87
|
+
args: normalizedArgs
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
watchRecord.consumers += 1;
|
|
91
|
+
let disposed = false;
|
|
92
|
+
const ownedListeners = /* @__PURE__ */ new Set();
|
|
93
|
+
return {
|
|
94
|
+
onUpdate: (callback) => {
|
|
95
|
+
watchRecord.listeners.add(callback);
|
|
96
|
+
ownedListeners.add(callback);
|
|
97
|
+
queueMicrotask(callback);
|
|
98
|
+
return () => {
|
|
99
|
+
watchRecord.listeners.delete(callback);
|
|
100
|
+
ownedListeners.delete(callback);
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
localQueryResult: () => watchRecord.result,
|
|
104
|
+
localQueryError: () => watchRecord.error,
|
|
105
|
+
dispose: () => {
|
|
106
|
+
if (disposed) return;
|
|
107
|
+
disposed = true;
|
|
108
|
+
for (const callback of ownedListeners) watchRecord.listeners.delete(callback);
|
|
109
|
+
ownedListeners.clear();
|
|
110
|
+
watchRecord.consumers = Math.max(0, watchRecord.consumers - 1);
|
|
111
|
+
if (watchRecord.consumers > 0) return;
|
|
112
|
+
this.endpoint.postMessage({
|
|
113
|
+
type: "watch.unsubscribe",
|
|
114
|
+
subscriptionId: watchRecord.subscriptionId
|
|
115
|
+
});
|
|
116
|
+
this.watchKeyBySubscriptionId.delete(watchRecord.subscriptionId);
|
|
117
|
+
this.watchRecordsByKey.delete(watchKey);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
watchRuntimeStatus() {
|
|
122
|
+
return this.runtimeStatus.watch();
|
|
123
|
+
}
|
|
124
|
+
dispose(errorMessage = "Syncore bridge client was disposed.") {
|
|
125
|
+
if (this.disposed) return;
|
|
126
|
+
this.disposed = true;
|
|
127
|
+
this.runtimeStatus.setStatus({
|
|
128
|
+
kind: "unavailable",
|
|
129
|
+
reason: "disposed",
|
|
130
|
+
error: new Error(errorMessage)
|
|
131
|
+
});
|
|
132
|
+
this.endpoint.removeEventListener("message", this.handleMessage);
|
|
133
|
+
for (const watchRecord of this.watchRecordsByKey.values()) this.endpoint.postMessage({
|
|
134
|
+
type: "watch.unsubscribe",
|
|
135
|
+
subscriptionId: watchRecord.subscriptionId
|
|
136
|
+
});
|
|
137
|
+
this.watchKeyBySubscriptionId.clear();
|
|
138
|
+
this.watchRecordsByKey.clear();
|
|
139
|
+
this.rejectAllPending(new Error(errorMessage));
|
|
140
|
+
}
|
|
141
|
+
invoke(kind, reference, args) {
|
|
142
|
+
this.ensureNotDisposed();
|
|
143
|
+
const requestId = generateId();
|
|
144
|
+
const promise = new Promise((resolve, reject) => {
|
|
145
|
+
this.pendingRequests.set(requestId, {
|
|
146
|
+
resolve,
|
|
147
|
+
reject
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
this.endpoint.postMessage(createInvokeRequest(requestId, kind, reference, args));
|
|
151
|
+
return promise;
|
|
152
|
+
}
|
|
153
|
+
rejectAllPending(error) {
|
|
154
|
+
for (const pending of this.pendingRequests.values()) pending.reject(error);
|
|
155
|
+
this.pendingRequests.clear();
|
|
156
|
+
}
|
|
157
|
+
ensureNotDisposed() {
|
|
158
|
+
if (this.disposed) throw new Error("Syncore bridge client was disposed.");
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
function createUnavailableSyncoreClient(status) {
|
|
162
|
+
const runtimeStatus = new RuntimeStatusController(status);
|
|
163
|
+
const error = status.error ?? /* @__PURE__ */ new Error(status.reason ? `Syncore client is unavailable (${status.reason}).` : "Syncore client is unavailable.");
|
|
164
|
+
return {
|
|
165
|
+
query: async () => Promise.reject(error),
|
|
166
|
+
mutation: async () => Promise.reject(error),
|
|
167
|
+
action: async () => Promise.reject(error),
|
|
168
|
+
watchQuery: () => ({
|
|
169
|
+
onUpdate: (callback) => {
|
|
170
|
+
queueMicrotask(callback);
|
|
171
|
+
return () => void 0;
|
|
172
|
+
},
|
|
173
|
+
localQueryResult: () => void 0,
|
|
174
|
+
localQueryError: () => void 0
|
|
175
|
+
}),
|
|
176
|
+
watchRuntimeStatus: () => runtimeStatus.watch()
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function createDeferredSyncoreClient(options) {
|
|
180
|
+
const runtimeStatus = new RuntimeStatusController(options.initialStatus ?? {
|
|
181
|
+
kind: "starting",
|
|
182
|
+
reason: "booting"
|
|
183
|
+
});
|
|
184
|
+
const resolvedFailureReason = options.failureReason ?? "runtime-unavailable";
|
|
185
|
+
const clientPromise = Promise.resolve().then(() => options.loadClient()).then((client) => {
|
|
186
|
+
const statusWatch = client.watchRuntimeStatus();
|
|
187
|
+
const syncStatus = () => {
|
|
188
|
+
const nextStatus = statusWatch.localQueryResult();
|
|
189
|
+
if (nextStatus) runtimeStatus.setStatus(nextStatus);
|
|
190
|
+
};
|
|
191
|
+
syncStatus();
|
|
192
|
+
statusWatch.onUpdate(syncStatus);
|
|
193
|
+
return client;
|
|
194
|
+
}).catch((error) => {
|
|
195
|
+
const resolvedError = error instanceof Error ? error : new Error(String(error));
|
|
196
|
+
runtimeStatus.setStatus({
|
|
197
|
+
kind: "error",
|
|
198
|
+
reason: resolvedFailureReason,
|
|
199
|
+
error: resolvedError
|
|
200
|
+
});
|
|
201
|
+
throw resolvedError;
|
|
202
|
+
});
|
|
203
|
+
const waitForClient = () => clientPromise;
|
|
204
|
+
return {
|
|
205
|
+
query: async (reference, ...args) => waitForClient().then((client) => client.query(reference, ...args)),
|
|
206
|
+
mutation: async (reference, ...args) => waitForClient().then((client) => client.mutation(reference, ...args)),
|
|
207
|
+
action: async (reference, ...args) => waitForClient().then((client) => client.action(reference, ...args)),
|
|
208
|
+
watchQuery(reference, ...args) {
|
|
209
|
+
let innerWatch;
|
|
210
|
+
let detachInner;
|
|
211
|
+
let result;
|
|
212
|
+
let error;
|
|
213
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
214
|
+
let disposed = false;
|
|
215
|
+
const notify = () => {
|
|
216
|
+
for (const listener of listeners) listener();
|
|
217
|
+
};
|
|
218
|
+
waitForClient().then((client) => {
|
|
219
|
+
if (disposed) return;
|
|
220
|
+
innerWatch = client.watchQuery(reference, ...args);
|
|
221
|
+
const sync = () => {
|
|
222
|
+
result = innerWatch?.localQueryResult();
|
|
223
|
+
error = innerWatch?.localQueryError();
|
|
224
|
+
notify();
|
|
225
|
+
};
|
|
226
|
+
sync();
|
|
227
|
+
detachInner = innerWatch.onUpdate(sync);
|
|
228
|
+
}).catch((nextError) => {
|
|
229
|
+
error = void 0;
|
|
230
|
+
notify();
|
|
231
|
+
});
|
|
232
|
+
return {
|
|
233
|
+
onUpdate(callback) {
|
|
234
|
+
listeners.add(callback);
|
|
235
|
+
queueMicrotask(callback);
|
|
236
|
+
return () => {
|
|
237
|
+
listeners.delete(callback);
|
|
238
|
+
};
|
|
239
|
+
},
|
|
240
|
+
localQueryResult: () => result,
|
|
241
|
+
localQueryError: () => error,
|
|
242
|
+
dispose() {
|
|
243
|
+
if (disposed) return;
|
|
244
|
+
disposed = true;
|
|
245
|
+
detachInner?.();
|
|
246
|
+
innerWatch?.dispose?.();
|
|
247
|
+
listeners.clear();
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
},
|
|
251
|
+
watchRuntimeStatus: () => runtimeStatus.watch()
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function attachRuntimeBridge(options) {
|
|
255
|
+
const subscriptions = /* @__PURE__ */ new Map();
|
|
256
|
+
const runtimePromise = Promise.resolve(options.createRuntime()).then(async (runtime) => {
|
|
257
|
+
await runtime.start();
|
|
258
|
+
return runtime;
|
|
259
|
+
});
|
|
260
|
+
const clientPromise = runtimePromise.then((runtime) => runtime.createClient());
|
|
261
|
+
const ready = clientPromise.then(() => {
|
|
262
|
+
options.endpoint.postMessage({
|
|
263
|
+
type: "runtime.status",
|
|
264
|
+
status: { kind: "ready" }
|
|
265
|
+
});
|
|
266
|
+
options.endpoint.postMessage({ type: "runtime.ready" });
|
|
267
|
+
}).catch((error) => {
|
|
268
|
+
options.endpoint.postMessage({
|
|
269
|
+
type: "runtime.status",
|
|
270
|
+
status: {
|
|
271
|
+
kind: "error",
|
|
272
|
+
reason: "runtime-unavailable",
|
|
273
|
+
...error instanceof Error ? { error } : {}
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
options.endpoint.postMessage({
|
|
277
|
+
type: "runtime.error",
|
|
278
|
+
error: error instanceof Error ? error.message : String(error)
|
|
279
|
+
});
|
|
280
|
+
throw error;
|
|
281
|
+
});
|
|
282
|
+
const handleMessage = (event) => {
|
|
283
|
+
(async () => {
|
|
284
|
+
const message = event.data;
|
|
285
|
+
if (!message || typeof message !== "object" || !("type" in message)) return;
|
|
286
|
+
try {
|
|
287
|
+
const client = await clientPromise;
|
|
288
|
+
switch (message.type) {
|
|
289
|
+
case "invoke": {
|
|
290
|
+
const value = message.kind === "query" ? await client.query(message.reference, message.args) : message.kind === "mutation" ? await client.mutation(message.reference, message.args) : await client.action(message.reference, message.args);
|
|
291
|
+
options.endpoint.postMessage({
|
|
292
|
+
type: "invoke.result",
|
|
293
|
+
requestId: message.requestId,
|
|
294
|
+
success: true,
|
|
295
|
+
value
|
|
296
|
+
});
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
case "watch.subscribe": {
|
|
300
|
+
if (subscriptions.has(message.subscriptionId)) return;
|
|
301
|
+
const watch = client.watchQuery(message.reference, message.args);
|
|
302
|
+
const sendCurrentState = () => {
|
|
303
|
+
const error = watch.localQueryError();
|
|
304
|
+
if (error) {
|
|
305
|
+
options.endpoint.postMessage({
|
|
306
|
+
type: "watch.update",
|
|
307
|
+
subscriptionId: message.subscriptionId,
|
|
308
|
+
success: false,
|
|
309
|
+
error: error.message
|
|
310
|
+
});
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
options.endpoint.postMessage({
|
|
314
|
+
type: "watch.update",
|
|
315
|
+
subscriptionId: message.subscriptionId,
|
|
316
|
+
success: true,
|
|
317
|
+
value: watch.localQueryResult()
|
|
318
|
+
});
|
|
319
|
+
};
|
|
320
|
+
const unsubscribe = watch.onUpdate(sendCurrentState);
|
|
321
|
+
subscriptions.set(message.subscriptionId, {
|
|
322
|
+
watch,
|
|
323
|
+
unsubscribe
|
|
324
|
+
});
|
|
325
|
+
sendCurrentState();
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
case "watch.unsubscribe": {
|
|
329
|
+
const subscription = subscriptions.get(message.subscriptionId);
|
|
330
|
+
if (!subscription) return;
|
|
331
|
+
subscription.unsubscribe();
|
|
332
|
+
subscriptions.delete(message.subscriptionId);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
} catch (error) {
|
|
336
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
337
|
+
if (message.type === "invoke") options.endpoint.postMessage({
|
|
338
|
+
type: "invoke.result",
|
|
339
|
+
requestId: message.requestId,
|
|
340
|
+
success: false,
|
|
341
|
+
error: errorMessage
|
|
342
|
+
});
|
|
343
|
+
if (message.type === "watch.subscribe") options.endpoint.postMessage({
|
|
344
|
+
type: "watch.update",
|
|
345
|
+
subscriptionId: message.subscriptionId,
|
|
346
|
+
success: false,
|
|
347
|
+
error: errorMessage
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
})();
|
|
351
|
+
};
|
|
352
|
+
options.endpoint.addEventListener("message", handleMessage);
|
|
353
|
+
options.endpoint.postMessage({
|
|
354
|
+
type: "runtime.status",
|
|
355
|
+
status: {
|
|
356
|
+
kind: "starting",
|
|
357
|
+
reason: "booting"
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
return {
|
|
361
|
+
ready,
|
|
362
|
+
async dispose() {
|
|
363
|
+
options.endpoint.postMessage({
|
|
364
|
+
type: "runtime.status",
|
|
365
|
+
status: {
|
|
366
|
+
kind: "unavailable",
|
|
367
|
+
reason: "disposed"
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
options.endpoint.removeEventListener("message", handleMessage);
|
|
371
|
+
for (const subscription of subscriptions.values()) subscription.unsubscribe();
|
|
372
|
+
subscriptions.clear();
|
|
373
|
+
await (await runtimePromise).stop();
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
function createInvokeRequest(requestId, kind, reference, args) {
|
|
378
|
+
switch (kind) {
|
|
379
|
+
case "query": return {
|
|
380
|
+
type: "invoke",
|
|
381
|
+
requestId,
|
|
382
|
+
kind,
|
|
383
|
+
reference,
|
|
384
|
+
args
|
|
385
|
+
};
|
|
386
|
+
case "mutation": return {
|
|
387
|
+
type: "invoke",
|
|
388
|
+
requestId,
|
|
389
|
+
kind,
|
|
390
|
+
reference,
|
|
391
|
+
args
|
|
392
|
+
};
|
|
393
|
+
case "action": return {
|
|
394
|
+
type: "invoke",
|
|
395
|
+
requestId,
|
|
396
|
+
kind,
|
|
397
|
+
reference,
|
|
398
|
+
args
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
function createWatchKey(reference, args) {
|
|
403
|
+
return `${reference.name}:${stableStringify(args)}`;
|
|
404
|
+
}
|
|
405
|
+
function normalizeOptionalArgs(args) {
|
|
406
|
+
return args[0] ?? {};
|
|
407
|
+
}
|
|
408
|
+
function stableStringify(value) {
|
|
409
|
+
return JSON.stringify(sortValue(value));
|
|
410
|
+
}
|
|
411
|
+
function sortValue(value) {
|
|
412
|
+
if (Array.isArray(value)) return value.map(sortValue);
|
|
413
|
+
if (value && typeof value === "object") return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, nested]) => [key, sortValue(nested)]));
|
|
414
|
+
return value;
|
|
415
|
+
}
|
|
416
|
+
//#endregion
|
|
417
|
+
export { SyncoreBridgeClient, attachRuntimeBridge, createDeferredSyncoreClient, createInvokeRequest, createUnavailableSyncoreClient, createWatchKey, normalizeOptionalArgs, stableStringify };
|
|
418
|
+
|
|
419
|
+
//# sourceMappingURL=transport.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.mjs","names":[],"sources":["../src/transport.ts"],"sourcesContent":["import {\n type SyncoreClient,\n type SyncoreRuntime,\n type JsonObject,\n type SyncoreRuntimeStatus,\n type SyncoreWatch\n} from \"./runtime/runtime.js\";\nimport type { SyncoreSchema } from \"@syncore/schema\";\nimport { generateId } from \"./runtime/id.js\";\nimport type { FunctionReference } from \"./runtime/functions.js\";\nimport { RuntimeStatusController } from \"./runtime/internal/runtimeStatus.js\";\n\nexport interface SyncoreBridgeMessageEndpoint {\n postMessage(message: unknown): void;\n addEventListener(\n type: \"message\",\n listener: (event: MessageEvent<unknown>) => void\n ): void;\n removeEventListener(\n type: \"message\",\n listener: (event: MessageEvent<unknown>) => void\n ): void;\n}\n\nexport type SyncoreBridgeRequest =\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"query\";\n reference: FunctionReference<\"query\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"mutation\";\n reference: FunctionReference<\"mutation\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"invoke\";\n requestId: string;\n kind: \"action\";\n reference: FunctionReference<\"action\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"watch.subscribe\";\n subscriptionId: string;\n reference: FunctionReference<\"query\", unknown, unknown>;\n args: JsonObject;\n }\n | {\n type: \"watch.unsubscribe\";\n subscriptionId: string;\n };\n\nexport type SyncoreBridgeResponse =\n | { type: \"runtime.ready\" }\n | { type: \"runtime.error\"; error: string }\n | { type: \"runtime.status\"; status: SyncoreRuntimeStatus }\n | {\n type: \"invoke.result\";\n requestId: string;\n success: true;\n value: unknown;\n }\n | {\n type: \"invoke.result\";\n requestId: string;\n success: false;\n error: string;\n }\n | {\n type: \"watch.update\";\n subscriptionId: string;\n success: true;\n value: unknown;\n }\n | {\n type: \"watch.update\";\n subscriptionId: string;\n success: false;\n error: string;\n };\n\ntype PendingRequest = {\n resolve(value: unknown): void;\n reject(error: Error): void;\n};\n\ntype WatchRecord = {\n subscriptionId: string;\n listeners: Set<() => void>;\n consumers: number;\n result: unknown;\n error: Error | undefined;\n};\n\ntype OptionalArgsTuple<TArgs> =\n Record<never, never> extends TArgs ? [args?: TArgs] : [args: TArgs];\n\nexport type BridgeQueryWatch<TValue> = SyncoreWatch<TValue> & {\n dispose(): void;\n};\n\nexport class SyncoreBridgeClient implements SyncoreClient {\n private readonly pendingRequests = new Map<string, PendingRequest>();\n private readonly watchRecordsByKey = new Map<string, WatchRecord>();\n private readonly watchKeyBySubscriptionId = new Map<string, string>();\n private readonly runtimeStatus = new RuntimeStatusController({\n kind: \"starting\",\n reason: \"booting\"\n });\n private disposed = false;\n\n private readonly handleMessage = (event: MessageEvent<unknown>) => {\n const message = event.data as SyncoreBridgeResponse;\n if (!message || typeof message !== \"object\" || !(\"type\" in message)) {\n return;\n }\n\n switch (message.type) {\n case \"runtime.ready\":\n this.runtimeStatus.setStatus({\n kind: \"ready\"\n });\n return;\n case \"runtime.error\":\n this.runtimeStatus.setStatus({\n kind: \"error\",\n reason: \"runtime-unavailable\",\n error: new Error(message.error)\n });\n for (const watchRecord of this.watchRecordsByKey.values()) {\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n this.rejectAllPending(new Error(message.error));\n return;\n case \"runtime.status\":\n this.runtimeStatus.setStatus(message.status);\n for (const watchRecord of this.watchRecordsByKey.values()) {\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n if (message.status.error) {\n this.rejectAllPending(message.status.error);\n }\n return;\n case \"invoke.result\": {\n const pending = this.pendingRequests.get(message.requestId);\n if (!pending) {\n return;\n }\n this.pendingRequests.delete(message.requestId);\n if (message.success) {\n pending.resolve(message.value);\n } else {\n pending.reject(new Error(message.error));\n }\n return;\n }\n case \"watch.update\": {\n const watchKey = this.watchKeyBySubscriptionId.get(\n message.subscriptionId\n );\n if (!watchKey) {\n return;\n }\n const watchRecord = this.watchRecordsByKey.get(watchKey);\n if (!watchRecord) {\n return;\n }\n if (message.success) {\n watchRecord.result = message.value;\n watchRecord.error = undefined;\n } else {\n watchRecord.error = new Error(message.error);\n }\n for (const listener of watchRecord.listeners) {\n listener();\n }\n }\n }\n };\n\n constructor(private readonly endpoint: SyncoreBridgeMessageEndpoint) {\n this.endpoint.addEventListener(\"message\", this.handleMessage);\n }\n\n query<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\"query\", reference, normalizeOptionalArgs(args) as JsonObject);\n }\n\n mutation<TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\n \"mutation\",\n reference,\n normalizeOptionalArgs(args) as JsonObject\n );\n }\n\n action<TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult> {\n return this.invoke(\n \"action\",\n reference,\n normalizeOptionalArgs(args) as JsonObject\n );\n }\n\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): BridgeQueryWatch<TResult> {\n this.ensureNotDisposed();\n const normalizedArgs = normalizeOptionalArgs(args) as JsonObject;\n const watchKey = createWatchKey(reference, normalizedArgs);\n let watchRecord = this.watchRecordsByKey.get(watchKey);\n if (!watchRecord) {\n watchRecord = {\n subscriptionId: generateId(),\n listeners: new Set<() => void>(),\n consumers: 0,\n result: undefined,\n error: undefined\n };\n this.watchRecordsByKey.set(watchKey, watchRecord);\n this.watchKeyBySubscriptionId.set(watchRecord.subscriptionId, watchKey);\n this.endpoint.postMessage({\n type: \"watch.subscribe\",\n subscriptionId: watchRecord.subscriptionId,\n reference,\n args: normalizedArgs\n } satisfies SyncoreBridgeRequest);\n }\n\n watchRecord.consumers += 1;\n let disposed = false;\n const ownedListeners = new Set<() => void>();\n\n return {\n onUpdate: (callback: () => void) => {\n watchRecord.listeners.add(callback);\n ownedListeners.add(callback);\n queueMicrotask(callback);\n return () => {\n watchRecord.listeners.delete(callback);\n ownedListeners.delete(callback);\n };\n },\n localQueryResult: () => watchRecord.result as TResult | undefined,\n localQueryError: () => watchRecord.error,\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n for (const callback of ownedListeners) {\n watchRecord.listeners.delete(callback);\n }\n ownedListeners.clear();\n watchRecord.consumers = Math.max(0, watchRecord.consumers - 1);\n if (watchRecord.consumers > 0) {\n return;\n }\n this.endpoint.postMessage({\n type: \"watch.unsubscribe\",\n subscriptionId: watchRecord.subscriptionId\n } satisfies SyncoreBridgeRequest);\n this.watchKeyBySubscriptionId.delete(watchRecord.subscriptionId);\n this.watchRecordsByKey.delete(watchKey);\n }\n };\n }\n\n watchRuntimeStatus(): SyncoreWatch<SyncoreRuntimeStatus> {\n return this.runtimeStatus.watch();\n }\n\n dispose(errorMessage = \"Syncore bridge client was disposed.\"): void {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n this.runtimeStatus.setStatus({\n kind: \"unavailable\",\n reason: \"disposed\",\n error: new Error(errorMessage)\n });\n this.endpoint.removeEventListener(\"message\", this.handleMessage);\n for (const watchRecord of this.watchRecordsByKey.values()) {\n this.endpoint.postMessage({\n type: \"watch.unsubscribe\",\n subscriptionId: watchRecord.subscriptionId\n } satisfies SyncoreBridgeRequest);\n }\n this.watchKeyBySubscriptionId.clear();\n this.watchRecordsByKey.clear();\n this.rejectAllPending(new Error(errorMessage));\n }\n\n private invoke<TArgs, TResult>(\n kind: \"query\" | \"mutation\" | \"action\",\n reference: FunctionReference<\n \"query\" | \"mutation\" | \"action\",\n TArgs,\n TResult\n >,\n args: JsonObject\n ): Promise<TResult> {\n this.ensureNotDisposed();\n const requestId = generateId();\n const promise = new Promise<TResult>((resolve, reject) => {\n this.pendingRequests.set(requestId, { resolve, reject });\n });\n\n this.endpoint.postMessage(\n createInvokeRequest(requestId, kind, reference, args)\n );\n\n return promise;\n }\n\n private rejectAllPending(error: Error): void {\n for (const pending of this.pendingRequests.values()) {\n pending.reject(error);\n }\n this.pendingRequests.clear();\n }\n\n private ensureNotDisposed(): void {\n if (this.disposed) {\n throw new Error(\"Syncore bridge client was disposed.\");\n }\n }\n}\n\nexport function createUnavailableSyncoreClient(\n status: SyncoreRuntimeStatus\n): SyncoreClient {\n const runtimeStatus = new RuntimeStatusController(status);\n const error =\n status.error ??\n new Error(\n status.reason\n ? `Syncore client is unavailable (${status.reason}).`\n : \"Syncore client is unavailable.\"\n );\n\n return {\n query: async () => Promise.reject(error),\n mutation: async () => Promise.reject(error),\n action: async () => Promise.reject(error),\n watchQuery: () => ({\n onUpdate: (callback) => {\n queueMicrotask(callback);\n return () => undefined;\n },\n localQueryResult: () => undefined,\n localQueryError: () => undefined\n }),\n watchRuntimeStatus: () => runtimeStatus.watch()\n };\n}\n\nexport function createDeferredSyncoreClient(options: {\n loadClient: () => Promise<SyncoreClient>;\n initialStatus?: SyncoreRuntimeStatus;\n failureReason?: SyncoreRuntimeStatus[\"reason\"];\n}): SyncoreClient {\n const runtimeStatus = new RuntimeStatusController(\n options.initialStatus ?? {\n kind: \"starting\",\n reason: \"booting\"\n }\n );\n const resolvedFailureReason = options.failureReason ?? \"runtime-unavailable\";\n let currentClient: SyncoreClient | undefined;\n let detachStatusListener: (() => void) | undefined;\n\n const clientPromise = Promise.resolve()\n .then(() => options.loadClient())\n .then((client) => {\n currentClient = client;\n const statusWatch = client.watchRuntimeStatus();\n const syncStatus = () => {\n const nextStatus = statusWatch.localQueryResult();\n if (nextStatus) {\n runtimeStatus.setStatus(nextStatus);\n }\n };\n syncStatus();\n detachStatusListener = statusWatch.onUpdate(syncStatus);\n return client;\n })\n .catch((error) => {\n const resolvedError =\n error instanceof Error ? error : new Error(String(error));\n runtimeStatus.setStatus({\n kind: \"error\",\n reason: resolvedFailureReason,\n error: resolvedError\n });\n throw resolvedError;\n });\n\n const waitForClient = () => clientPromise;\n\n return {\n query: async (reference, ...args) =>\n waitForClient().then((client) => client.query(reference, ...args)),\n mutation: async (reference, ...args) =>\n waitForClient().then((client) => client.mutation(reference, ...args)),\n action: async (reference, ...args) =>\n waitForClient().then((client) => client.action(reference, ...args)),\n watchQuery(reference, ...args) {\n let innerWatch: SyncoreWatch<unknown> | undefined;\n let detachInner: (() => void) | undefined;\n let result: unknown;\n let error: Error | undefined;\n const listeners = new Set<() => void>();\n let disposed = false;\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n void waitForClient()\n .then((client) => {\n if (disposed) {\n return;\n }\n innerWatch = client.watchQuery(reference, ...args);\n const sync = () => {\n result = innerWatch?.localQueryResult();\n error = innerWatch?.localQueryError();\n notify();\n };\n sync();\n detachInner = innerWatch.onUpdate(sync);\n })\n .catch((nextError) => {\n error = undefined;\n notify();\n });\n\n return {\n onUpdate(callback) {\n listeners.add(callback);\n queueMicrotask(callback);\n return () => {\n listeners.delete(callback);\n };\n },\n localQueryResult: () => result as typeof reference.__result | undefined,\n localQueryError: () => error,\n dispose() {\n if (disposed) {\n return;\n }\n disposed = true;\n detachInner?.();\n innerWatch?.dispose?.();\n listeners.clear();\n }\n };\n },\n watchRuntimeStatus: () => runtimeStatus.watch()\n };\n}\n\nexport interface AttachRuntimeBridgeOptions<\n TSchema extends SyncoreSchema<any>\n> {\n endpoint: SyncoreBridgeMessageEndpoint;\n createRuntime:\n | (() => Promise<SyncoreRuntime<TSchema>>)\n | (() => SyncoreRuntime<TSchema>);\n}\n\nexport interface AttachedRuntimeBridge {\n ready: Promise<void>;\n dispose(): Promise<void>;\n}\n\nexport function attachRuntimeBridge<\n TSchema extends SyncoreSchema<any>\n>(\n options: AttachRuntimeBridgeOptions<TSchema>\n): AttachedRuntimeBridge {\n const subscriptions = new Map<\n string,\n {\n watch: SyncoreWatch<unknown>;\n unsubscribe: () => void;\n }\n >();\n\n const runtimePromise = Promise.resolve(options.createRuntime()).then(\n async (runtime) => {\n await runtime.start();\n return runtime;\n }\n );\n\n const clientPromise = runtimePromise.then((runtime) => runtime.createClient());\n\n const ready = clientPromise\n .then(() => {\n options.endpoint.postMessage({\n type: \"runtime.status\",\n status: {\n kind: \"ready\"\n }\n } satisfies SyncoreBridgeResponse);\n options.endpoint.postMessage({\n type: \"runtime.ready\"\n } satisfies SyncoreBridgeResponse);\n })\n .catch((error) => {\n options.endpoint.postMessage({\n type: \"runtime.status\",\n status: {\n kind: \"error\",\n reason: \"runtime-unavailable\",\n ...(error instanceof Error ? { error } : {})\n }\n } satisfies SyncoreBridgeResponse);\n options.endpoint.postMessage({\n type: \"runtime.error\",\n error: error instanceof Error ? error.message : String(error)\n } satisfies SyncoreBridgeResponse);\n throw error;\n });\n\n const handleMessage = (event: MessageEvent<unknown>) => {\n void (async () => {\n const message = event.data as SyncoreBridgeRequest;\n if (!message || typeof message !== \"object\" || !(\"type\" in message)) {\n return;\n }\n\n try {\n const client = await clientPromise;\n switch (message.type) {\n case \"invoke\": {\n const value =\n message.kind === \"query\"\n ? await client.query(message.reference, message.args)\n : message.kind === \"mutation\"\n ? await client.mutation(message.reference, message.args)\n : await client.action(message.reference, message.args);\n options.endpoint.postMessage({\n type: \"invoke.result\",\n requestId: message.requestId,\n success: true,\n value\n } satisfies SyncoreBridgeResponse);\n return;\n }\n case \"watch.subscribe\": {\n if (subscriptions.has(message.subscriptionId)) {\n return;\n }\n const watch = client.watchQuery(message.reference, message.args);\n const sendCurrentState = () => {\n const error = watch.localQueryError();\n if (error) {\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: false,\n error: error.message\n } satisfies SyncoreBridgeResponse);\n return;\n }\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: true,\n value: watch.localQueryResult()\n } satisfies SyncoreBridgeResponse);\n };\n const unsubscribe = watch.onUpdate(sendCurrentState);\n subscriptions.set(message.subscriptionId, { watch, unsubscribe });\n sendCurrentState();\n return;\n }\n case \"watch.unsubscribe\": {\n const subscription = subscriptions.get(message.subscriptionId);\n if (!subscription) {\n return;\n }\n subscription.unsubscribe();\n subscriptions.delete(message.subscriptionId);\n }\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (message.type === \"invoke\") {\n options.endpoint.postMessage({\n type: \"invoke.result\",\n requestId: message.requestId,\n success: false,\n error: errorMessage\n } satisfies SyncoreBridgeResponse);\n }\n if (message.type === \"watch.subscribe\") {\n options.endpoint.postMessage({\n type: \"watch.update\",\n subscriptionId: message.subscriptionId,\n success: false,\n error: errorMessage\n } satisfies SyncoreBridgeResponse);\n }\n }\n })();\n };\n\n options.endpoint.addEventListener(\"message\", handleMessage);\n options.endpoint.postMessage({\n type: \"runtime.status\",\n status: {\n kind: \"starting\",\n reason: \"booting\"\n }\n } satisfies SyncoreBridgeResponse);\n\n return {\n ready,\n async dispose() {\n options.endpoint.postMessage({\n type: \"runtime.status\",\n status: {\n kind: \"unavailable\",\n reason: \"disposed\"\n }\n } satisfies SyncoreBridgeResponse);\n options.endpoint.removeEventListener(\"message\", handleMessage);\n for (const subscription of subscriptions.values()) {\n subscription.unsubscribe();\n }\n subscriptions.clear();\n const runtime = await runtimePromise;\n await runtime.stop();\n }\n };\n}\n\nexport function createInvokeRequest(\n requestId: string,\n kind: \"query\" | \"mutation\" | \"action\",\n reference:\n | FunctionReference<\"query\", unknown, unknown>\n | FunctionReference<\"mutation\", unknown, unknown>\n | FunctionReference<\"action\", unknown, unknown>,\n args: JsonObject\n): SyncoreBridgeRequest {\n switch (kind) {\n case \"query\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"query\">,\n args\n };\n case \"mutation\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"mutation\">,\n args\n };\n case \"action\":\n return {\n type: \"invoke\",\n requestId,\n kind,\n reference: reference as FunctionReference<\"action\">,\n args\n };\n }\n}\n\nexport function createWatchKey(\n reference: FunctionReference<\"query\", unknown, unknown>,\n args: JsonObject\n): string {\n return `${reference.name}:${stableStringify(args)}`;\n}\n\nexport function normalizeOptionalArgs<TArgs>(\n args: [] | [TArgs] | readonly unknown[]\n): TArgs {\n return (args[0] ?? {}) as TArgs;\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortValue);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, sortValue(nested)])\n );\n }\n return value;\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
//#region src/index.d.ts
|
|
2
2
|
type SyncoreDevtoolsEventOrigin = "runtime" | "dashboard";
|
|
3
|
+
declare const SYNCORE_DEVTOOLS_PROTOCOL_VERSION = 1;
|
|
4
|
+
declare const SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION = 1;
|
|
5
|
+
declare const SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION = 1;
|
|
6
|
+
interface VersionHandshake {
|
|
7
|
+
protocolVersion: number;
|
|
8
|
+
minSupportedProtocolVersion: number;
|
|
9
|
+
maxSupportedProtocolVersion: number;
|
|
10
|
+
runtimeVersion?: string;
|
|
11
|
+
}
|
|
12
|
+
declare function isCompatibleVersionHandshake(handshake: Pick<VersionHandshake, "protocolVersion" | "minSupportedProtocolVersion" | "maxSupportedProtocolVersion">): boolean;
|
|
3
13
|
type SyncoreDevtoolsEventBase = {
|
|
4
14
|
runtimeId: string;
|
|
5
15
|
timestamp: number;
|
|
@@ -14,22 +24,30 @@ type SyncoreDevtoolsEvent = (SyncoreDevtoolsEventBase & {
|
|
|
14
24
|
type: "query.executed";
|
|
15
25
|
queryId: string;
|
|
16
26
|
functionName: string;
|
|
27
|
+
componentPath?: string;
|
|
28
|
+
componentName?: string;
|
|
17
29
|
dependencies: string[];
|
|
18
30
|
durationMs: number;
|
|
19
31
|
}) | (SyncoreDevtoolsEventBase & {
|
|
20
32
|
type: "query.invalidated";
|
|
21
33
|
queryId: string;
|
|
34
|
+
componentPath?: string;
|
|
35
|
+
componentName?: string;
|
|
22
36
|
reason: string;
|
|
23
37
|
}) | (SyncoreDevtoolsEventBase & {
|
|
24
38
|
type: "mutation.committed";
|
|
25
39
|
mutationId: string;
|
|
26
40
|
functionName: string;
|
|
41
|
+
componentPath?: string;
|
|
42
|
+
componentName?: string;
|
|
27
43
|
changedTables: string[];
|
|
28
44
|
durationMs: number;
|
|
29
45
|
}) | (SyncoreDevtoolsEventBase & {
|
|
30
46
|
type: "action.completed";
|
|
31
47
|
actionId: string;
|
|
32
48
|
functionName: string;
|
|
49
|
+
componentPath?: string;
|
|
50
|
+
componentName?: string;
|
|
33
51
|
durationMs: number;
|
|
34
52
|
error?: string;
|
|
35
53
|
}) | (SyncoreDevtoolsEventBase & {
|
|
@@ -38,6 +56,7 @@ type SyncoreDevtoolsEvent = (SyncoreDevtoolsEventBase & {
|
|
|
38
56
|
}) | (SyncoreDevtoolsEventBase & {
|
|
39
57
|
type: "storage.updated";
|
|
40
58
|
storageId: string;
|
|
59
|
+
componentPath?: string;
|
|
41
60
|
operation: "put" | "delete";
|
|
42
61
|
}) | (SyncoreDevtoolsEventBase & {
|
|
43
62
|
type: "log";
|
|
@@ -47,6 +66,9 @@ type SyncoreDevtoolsEvent = (SyncoreDevtoolsEventBase & {
|
|
|
47
66
|
interface SyncoreActiveQueryInfo {
|
|
48
67
|
id: string;
|
|
49
68
|
functionName: string;
|
|
69
|
+
owner?: "root" | "component";
|
|
70
|
+
componentPath?: string;
|
|
71
|
+
componentName?: string;
|
|
50
72
|
dependencyKeys: string[];
|
|
51
73
|
lastRunAt: number;
|
|
52
74
|
}
|
|
@@ -70,6 +92,10 @@ declare function createPublicRuntimeId(runtimeId: string, runtimeIds?: Iterable<
|
|
|
70
92
|
declare function createPublicTargetId(targetKey: string, targetKeys: Iterable<string>): string;
|
|
71
93
|
type SyncoreDevtoolsMessage = {
|
|
72
94
|
type: "hello";
|
|
95
|
+
protocolVersion?: number;
|
|
96
|
+
minSupportedProtocolVersion?: number;
|
|
97
|
+
maxSupportedProtocolVersion?: number;
|
|
98
|
+
runtimeVersion?: string;
|
|
73
99
|
runtimeId: string;
|
|
74
100
|
platform: string;
|
|
75
101
|
appName?: string;
|
|
@@ -260,6 +286,11 @@ interface FunctionDefinition {
|
|
|
260
286
|
name: string;
|
|
261
287
|
type: "query" | "mutation" | "action";
|
|
262
288
|
file: string;
|
|
289
|
+
owner?: "root" | "component";
|
|
290
|
+
componentPath?: string;
|
|
291
|
+
componentName?: string;
|
|
292
|
+
visibility?: "public" | "internal";
|
|
293
|
+
localName?: string;
|
|
263
294
|
/** Argument validator schema (JSON Schema-like), if available */
|
|
264
295
|
args?: Record<string, unknown>;
|
|
265
296
|
/** Return validator schema, if available */
|
|
@@ -267,6 +298,10 @@ interface FunctionDefinition {
|
|
|
267
298
|
}
|
|
268
299
|
interface TableSchema {
|
|
269
300
|
name: string;
|
|
301
|
+
displayName?: string;
|
|
302
|
+
owner?: "root" | "component";
|
|
303
|
+
componentPath?: string;
|
|
304
|
+
componentName?: string;
|
|
270
305
|
fields: TableField[];
|
|
271
306
|
indexes: TableIndex[];
|
|
272
307
|
documentCount: number;
|
|
@@ -284,6 +319,9 @@ interface TableIndex {
|
|
|
284
319
|
interface SchedulerJob {
|
|
285
320
|
id: string;
|
|
286
321
|
functionName: string;
|
|
322
|
+
owner?: "root" | "component";
|
|
323
|
+
componentPath?: string;
|
|
324
|
+
componentName?: string;
|
|
287
325
|
args: Record<string, unknown>;
|
|
288
326
|
scheduledAt: number;
|
|
289
327
|
runAt: number;
|
|
@@ -333,5 +371,5 @@ type SchedulerMisfirePolicy = {
|
|
|
333
371
|
windowMs: number;
|
|
334
372
|
};
|
|
335
373
|
//#endregion
|
|
336
|
-
export { DataFilter, FunctionDefinition, SchedulerJob, SchedulerMisfirePolicy, SchedulerRecurringDailySchedule, SchedulerRecurringIntervalSchedule, SchedulerRecurringSchedule, SchedulerRecurringWeeklySchedule, SyncoreActiveQueryInfo, SyncoreDevtoolsClientMessage, SyncoreDevtoolsCommand, SyncoreDevtoolsCommandPayload, SyncoreDevtoolsCommandResultPayload, SyncoreDevtoolsEvent, SyncoreDevtoolsEventOrigin, SyncoreDevtoolsMessage, SyncoreDevtoolsSubscribe, SyncoreDevtoolsSubscriptionPayload, SyncoreDevtoolsSubscriptionResultPayload, SyncoreDevtoolsUnsubscribe, SyncoreRuntimeSummary, TableField, TableIndex, TableSchema, createBasePublicId, createPublicId, createPublicRuntimeId, createPublicTargetId };
|
|
374
|
+
export { DataFilter, FunctionDefinition, SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION, SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION, SYNCORE_DEVTOOLS_PROTOCOL_VERSION, SchedulerJob, SchedulerMisfirePolicy, SchedulerRecurringDailySchedule, SchedulerRecurringIntervalSchedule, SchedulerRecurringSchedule, SchedulerRecurringWeeklySchedule, SyncoreActiveQueryInfo, SyncoreDevtoolsClientMessage, SyncoreDevtoolsCommand, SyncoreDevtoolsCommandPayload, SyncoreDevtoolsCommandResultPayload, SyncoreDevtoolsEvent, SyncoreDevtoolsEventOrigin, SyncoreDevtoolsMessage, SyncoreDevtoolsSubscribe, SyncoreDevtoolsSubscriptionPayload, SyncoreDevtoolsSubscriptionResultPayload, SyncoreDevtoolsUnsubscribe, SyncoreRuntimeSummary, TableField, TableIndex, TableSchema, VersionHandshake, createBasePublicId, createPublicId, createPublicRuntimeId, createPublicTargetId, isCompatibleVersionHandshake };
|
|
337
375
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";KAAY,0BAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":"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"}
|