@opendatalabs/personal-server-ts-lite 0.0.1-canary.01ca694
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/dist/bridge.d.ts +23 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +53 -0
- package/dist/bridge.js.map +1 -0
- package/dist/browser-runtime.d.ts +31 -0
- package/dist/browser-runtime.d.ts.map +1 -0
- package/dist/browser-runtime.js +109 -0
- package/dist/browser-runtime.js.map +1 -0
- package/dist/browser-tls-rustls/browser_tls_rustls.d.ts +49 -0
- package/dist/browser-tls-rustls/browser_tls_rustls.js +401 -0
- package/dist/browser-tls-rustls/browser_tls_rustls_bg.wasm +0 -0
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +376 -0
- package/dist/client.js.map +1 -0
- package/dist/diagnostics.d.ts +166 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +265 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-store.d.ts +35 -0
- package/dist/mcp-store.d.ts.map +1 -0
- package/dist/mcp-store.js +177 -0
- package/dist/mcp-store.js.map +1 -0
- package/dist/owner-binding.d.ts +7 -0
- package/dist/owner-binding.d.ts.map +1 -0
- package/dist/owner-binding.js +18 -0
- package/dist/owner-binding.js.map +1 -0
- package/dist/relay-tls.d.ts +19 -0
- package/dist/relay-tls.d.ts.map +1 -0
- package/dist/relay-tls.js +226 -0
- package/dist/relay-tls.js.map +1 -0
- package/dist/relay.d.ts +70 -0
- package/dist/relay.d.ts.map +1 -0
- package/dist/relay.js +368 -0
- package/dist/relay.js.map +1 -0
- package/dist/runtime.d.ts +95 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +991 -0
- package/dist/runtime.js.map +1 -0
- package/dist/state.d.ts +62 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +296 -0
- package/dist/state.js.map +1 -0
- package/dist/storage-utils.d.ts +8 -0
- package/dist/storage-utils.d.ts.map +1 -0
- package/dist/storage-utils.js +67 -0
- package/dist/storage-utils.js.map +1 -0
- package/dist/storage.d.ts +57 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +575 -0
- package/dist/storage.js.map +1 -0
- package/dist/sync.d.ts +28 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +158 -0
- package/dist/sync.js.map +1 -0
- package/package.json +40 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { accessLogsListPath, createOwnerSignedPersonalServerRequest, createPersonalServerInfoFromHealth, createPersonalServerRegistrationRequest, dataListPath, dataReadPath, dataVersionsPath, grantRevokePath, parsePersonalServerJsonResponse, requestPath, submitPersonalServerRegistration, } from "@opendatalabs/personal-server-ts-core/client";
|
|
2
|
+
import { createGatewayClient, } from "@opendatalabs/vana-sdk/browser";
|
|
3
|
+
import { createIndexedDbPsLiteRuntime, } from "./browser-runtime.js";
|
|
4
|
+
import { psLiteRelayPublicUrl, startPsLiteRelayClient, } from "./relay.js";
|
|
5
|
+
import { createIndexedDbPsLiteStateStore, loadPsLiteRelayState, savePsLiteRelayState, } from "./state.js";
|
|
6
|
+
const DEFAULT_LITE_ORIGIN = "https://ps-lite.local";
|
|
7
|
+
export async function startPersonalServer(options) {
|
|
8
|
+
const localOrigin = options.localOrigin ?? DEFAULT_LITE_ORIGIN;
|
|
9
|
+
const relayOptions = options.relay || undefined;
|
|
10
|
+
const relayStateStore = relayOptions
|
|
11
|
+
? (options.relayStateStore ??
|
|
12
|
+
(options.runtime
|
|
13
|
+
? undefined
|
|
14
|
+
: createIndexedDbPsLiteStateStore({
|
|
15
|
+
dbName: options.dbName ?? "personal-server-lite",
|
|
16
|
+
storeName: options.stateStoreName ?? "state",
|
|
17
|
+
})))
|
|
18
|
+
: undefined;
|
|
19
|
+
const savedRelayState = relayStateStore
|
|
20
|
+
? await loadPsLiteRelayState(relayStateStore).catch(() => null)
|
|
21
|
+
: null;
|
|
22
|
+
const resolvedRelayOptions = relayOptions
|
|
23
|
+
? {
|
|
24
|
+
...relayOptions,
|
|
25
|
+
sessionId: relayOptions.sessionId ??
|
|
26
|
+
savedRelaySessionId(savedRelayState, relayOptions) ??
|
|
27
|
+
randomSessionId(),
|
|
28
|
+
}
|
|
29
|
+
: undefined;
|
|
30
|
+
const initialPublicUrl = resolvedRelayOptions
|
|
31
|
+
? psLiteRelayPublicUrl(resolvedRelayOptions.sessionId, resolvedRelayOptions.publicSuffix)
|
|
32
|
+
: null;
|
|
33
|
+
const runtimeOrigin = initialPublicUrl ?? localOrigin;
|
|
34
|
+
const runtimeBundle = options.runtime
|
|
35
|
+
? null
|
|
36
|
+
: await createIndexedDbPsLiteRuntime({
|
|
37
|
+
...options,
|
|
38
|
+
ownerSignature: requiredOwnerSignature(options.ownerSignature),
|
|
39
|
+
active: options.active ?? true,
|
|
40
|
+
runtimeOrigin,
|
|
41
|
+
configDefaults: configDefaultsWithOrigin(options.configDefaults, runtimeOrigin),
|
|
42
|
+
});
|
|
43
|
+
const runtime = options.runtime ?? runtimeBundle.runtime;
|
|
44
|
+
if (options.active ?? true) {
|
|
45
|
+
runtime.activate();
|
|
46
|
+
}
|
|
47
|
+
let status = "ready";
|
|
48
|
+
let relayStatus = "closed";
|
|
49
|
+
let relayClient;
|
|
50
|
+
let publicUrl = null;
|
|
51
|
+
let lastInfo = null;
|
|
52
|
+
let lastPreparedRegistration = null;
|
|
53
|
+
const gateway = options.gateway;
|
|
54
|
+
const setStatus = (nextStatus) => {
|
|
55
|
+
status = nextStatus;
|
|
56
|
+
options.onStatus?.(nextStatus);
|
|
57
|
+
};
|
|
58
|
+
if (resolvedRelayOptions) {
|
|
59
|
+
relayStatus = "connecting";
|
|
60
|
+
publicUrl = initialPublicUrl;
|
|
61
|
+
relayClient = startPsLiteRelayClient({
|
|
62
|
+
...resolvedRelayOptions,
|
|
63
|
+
runtime,
|
|
64
|
+
origin: runtimeOrigin,
|
|
65
|
+
onStatus(nextRelayStatus) {
|
|
66
|
+
relayStatus = nextRelayStatus;
|
|
67
|
+
if (nextRelayStatus === "error")
|
|
68
|
+
setStatus("error");
|
|
69
|
+
resolvedRelayOptions.onStatus?.(nextRelayStatus);
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
async function info() {
|
|
74
|
+
if (status === "stopped" && lastInfo) {
|
|
75
|
+
return { ...lastInfo, status: "stopped" };
|
|
76
|
+
}
|
|
77
|
+
const response = await runtime.fetch(new Request(`${localOrigin}/health`));
|
|
78
|
+
const body = await response.json();
|
|
79
|
+
lastInfo = createPersonalServerInfoFromHealth({
|
|
80
|
+
kind: "lite",
|
|
81
|
+
status,
|
|
82
|
+
health: {
|
|
83
|
+
...body,
|
|
84
|
+
relay: { status: relayStatus, publicUrl },
|
|
85
|
+
},
|
|
86
|
+
localUrl: localOrigin,
|
|
87
|
+
publicUrl,
|
|
88
|
+
});
|
|
89
|
+
return lastInfo;
|
|
90
|
+
}
|
|
91
|
+
async function prepareRegistration(prepareOptions = {}) {
|
|
92
|
+
const current = await info();
|
|
93
|
+
const serverUrl = prepareOptions.serverUrl ?? current.urls.registration;
|
|
94
|
+
if (!current.ownerAddress || !current.server || !serverUrl) {
|
|
95
|
+
throw new Error("Personal Server identity and URL are required");
|
|
96
|
+
}
|
|
97
|
+
if (!current.gatewayConfig) {
|
|
98
|
+
throw new Error("Personal Server gateway config is required");
|
|
99
|
+
}
|
|
100
|
+
const request = createPersonalServerRegistrationRequest({
|
|
101
|
+
gatewayConfig: current.gatewayConfig,
|
|
102
|
+
ownerAddress: current.ownerAddress,
|
|
103
|
+
serverAddress: current.server.address,
|
|
104
|
+
publicKey: current.server.publicKey,
|
|
105
|
+
serverUrl,
|
|
106
|
+
});
|
|
107
|
+
lastPreparedRegistration = request;
|
|
108
|
+
return request;
|
|
109
|
+
}
|
|
110
|
+
async function submitRegistration(submitOptions) {
|
|
111
|
+
const request = submitOptions.request ??
|
|
112
|
+
(submitOptions.serverUrl
|
|
113
|
+
? await prepareRegistration({ serverUrl: submitOptions.serverUrl })
|
|
114
|
+
: (lastPreparedRegistration ?? (await prepareRegistration())));
|
|
115
|
+
const gatewayClient = gateway ?? createGatewayClient(requiredGatewayUrl(await info()));
|
|
116
|
+
return submitPersonalServerRegistration({
|
|
117
|
+
gateway: gatewayClient,
|
|
118
|
+
request,
|
|
119
|
+
signature: submitOptions.signature,
|
|
120
|
+
}).then(async (result) => {
|
|
121
|
+
await rememberRegisteredRelay(request.candidate.serverUrl);
|
|
122
|
+
return result;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async function callFetch(input, init) {
|
|
126
|
+
const origin = (await info()).urls.apiOrigin ?? localOrigin;
|
|
127
|
+
return runtime.fetch(toRuntimeRequest(input, origin, init));
|
|
128
|
+
}
|
|
129
|
+
async function postData(scope, body, postOptions) {
|
|
130
|
+
const current = await info();
|
|
131
|
+
const origin = requiredApiOrigin(current);
|
|
132
|
+
const path = `/v1/data/${encodeURIComponent(scope)}`;
|
|
133
|
+
const request = await createOwnerRequest({
|
|
134
|
+
origin,
|
|
135
|
+
path,
|
|
136
|
+
method: "POST",
|
|
137
|
+
body,
|
|
138
|
+
authOptions: postOptions,
|
|
139
|
+
headers: {
|
|
140
|
+
"Content-Type": "application/json",
|
|
141
|
+
...postOptions.headers,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "data write");
|
|
145
|
+
}
|
|
146
|
+
async function listData(listOptions = {}) {
|
|
147
|
+
const current = await info();
|
|
148
|
+
const request = await createOwnerRequest({
|
|
149
|
+
origin: requiredApiOrigin(current),
|
|
150
|
+
path: dataListPath(listOptions),
|
|
151
|
+
method: "GET",
|
|
152
|
+
authOptions: listOptions,
|
|
153
|
+
headers: listOptions.headers,
|
|
154
|
+
});
|
|
155
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "data list");
|
|
156
|
+
}
|
|
157
|
+
async function listAccessLogs(accessLogOptions = {}) {
|
|
158
|
+
const current = await info();
|
|
159
|
+
const request = await createOwnerRequest({
|
|
160
|
+
origin: requiredApiOrigin(current),
|
|
161
|
+
path: accessLogsListPath(accessLogOptions),
|
|
162
|
+
method: "GET",
|
|
163
|
+
authOptions: accessLogOptions,
|
|
164
|
+
headers: accessLogOptions.headers,
|
|
165
|
+
});
|
|
166
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "access logs list");
|
|
167
|
+
}
|
|
168
|
+
async function listVersions(scope, versionOptions = {}) {
|
|
169
|
+
const current = await info();
|
|
170
|
+
const request = await createOwnerRequest({
|
|
171
|
+
origin: requiredApiOrigin(current),
|
|
172
|
+
path: dataVersionsPath(scope, versionOptions),
|
|
173
|
+
method: "GET",
|
|
174
|
+
authOptions: versionOptions,
|
|
175
|
+
headers: versionOptions.headers,
|
|
176
|
+
});
|
|
177
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "data versions list");
|
|
178
|
+
}
|
|
179
|
+
async function readData(scope, readOptions = {}) {
|
|
180
|
+
const current = await info();
|
|
181
|
+
const request = await createOwnerRequest({
|
|
182
|
+
origin: requiredApiOrigin(current),
|
|
183
|
+
path: dataReadPath(scope, readOptions),
|
|
184
|
+
method: "GET",
|
|
185
|
+
authOptions: readOptions,
|
|
186
|
+
headers: readOptions.headers,
|
|
187
|
+
});
|
|
188
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "data read");
|
|
189
|
+
}
|
|
190
|
+
async function syncStatus(syncOptions = {}) {
|
|
191
|
+
const current = await info();
|
|
192
|
+
const request = await createOwnerRequest({
|
|
193
|
+
origin: requiredApiOrigin(current),
|
|
194
|
+
path: "/v1/sync/status",
|
|
195
|
+
method: "GET",
|
|
196
|
+
authOptions: syncOptions,
|
|
197
|
+
headers: syncOptions.headers,
|
|
198
|
+
});
|
|
199
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "sync status");
|
|
200
|
+
}
|
|
201
|
+
async function createGrant(grantOptions) {
|
|
202
|
+
const current = await info();
|
|
203
|
+
const request = await createOwnerRequest({
|
|
204
|
+
origin: requiredApiOrigin(current),
|
|
205
|
+
path: "/v1/grants",
|
|
206
|
+
method: "POST",
|
|
207
|
+
body: {
|
|
208
|
+
granteeAddress: grantOptions.granteeAddress,
|
|
209
|
+
scopes: grantOptions.scopes,
|
|
210
|
+
...(grantOptions.expiresAt === undefined
|
|
211
|
+
? {}
|
|
212
|
+
: { expiresAt: grantOptions.expiresAt }),
|
|
213
|
+
...(grantOptions.nonce === undefined
|
|
214
|
+
? {}
|
|
215
|
+
: { nonce: grantOptions.nonce }),
|
|
216
|
+
},
|
|
217
|
+
authOptions: grantOptions,
|
|
218
|
+
headers: {
|
|
219
|
+
"Content-Type": "application/json",
|
|
220
|
+
...grantOptions.headers,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "grant create");
|
|
224
|
+
}
|
|
225
|
+
async function listGrants(grantOptions = {}) {
|
|
226
|
+
const current = await info();
|
|
227
|
+
const request = await createOwnerRequest({
|
|
228
|
+
origin: requiredApiOrigin(current),
|
|
229
|
+
path: "/v1/grants",
|
|
230
|
+
method: "GET",
|
|
231
|
+
authOptions: grantOptions,
|
|
232
|
+
headers: grantOptions.headers,
|
|
233
|
+
});
|
|
234
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "grant list");
|
|
235
|
+
}
|
|
236
|
+
async function revokeGrant(grantId, grantOptions = {}) {
|
|
237
|
+
const current = await info();
|
|
238
|
+
const request = await createOwnerRequest({
|
|
239
|
+
origin: requiredApiOrigin(current),
|
|
240
|
+
path: grantRevokePath(grantId),
|
|
241
|
+
method: "DELETE",
|
|
242
|
+
authOptions: grantOptions,
|
|
243
|
+
headers: grantOptions.headers,
|
|
244
|
+
});
|
|
245
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "grant revoke");
|
|
246
|
+
}
|
|
247
|
+
async function syncNow(syncOptions = {}) {
|
|
248
|
+
const current = await info();
|
|
249
|
+
const request = await createOwnerRequest({
|
|
250
|
+
origin: requiredApiOrigin(current),
|
|
251
|
+
path: "/v1/sync/trigger",
|
|
252
|
+
method: "POST",
|
|
253
|
+
authOptions: syncOptions,
|
|
254
|
+
headers: syncOptions.headers,
|
|
255
|
+
});
|
|
256
|
+
return parsePersonalServerJsonResponse(await callFetch(request), "sync trigger");
|
|
257
|
+
}
|
|
258
|
+
async function rememberRegisteredRelay(serverUrl) {
|
|
259
|
+
if (!resolvedRelayOptions || !relayStateStore)
|
|
260
|
+
return;
|
|
261
|
+
await savePsLiteRelayState(relayStateStore, {
|
|
262
|
+
sessionId: resolvedRelayOptions.sessionId,
|
|
263
|
+
controlUrl: resolvedRelayOptions.controlUrl,
|
|
264
|
+
publicSuffix: resolvedRelayOptions.publicSuffix,
|
|
265
|
+
publicUrl: serverUrl,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
async function createOwnerRequest(params) {
|
|
269
|
+
const encoded = params.body === undefined
|
|
270
|
+
? undefined
|
|
271
|
+
: new TextEncoder().encode(JSON.stringify(params.body));
|
|
272
|
+
const auth = authFromOptions(params.authOptions);
|
|
273
|
+
if (auth) {
|
|
274
|
+
return createOwnerSignedPersonalServerRequest({
|
|
275
|
+
origin: params.origin,
|
|
276
|
+
path: params.path,
|
|
277
|
+
method: params.method,
|
|
278
|
+
body: encoded,
|
|
279
|
+
auth,
|
|
280
|
+
headers: params.headers,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
return new Request(`${params.origin}${params.path}`, {
|
|
284
|
+
method: params.method,
|
|
285
|
+
body: encoded,
|
|
286
|
+
headers: params.headers,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
async function stop() {
|
|
290
|
+
if (status === "stopped")
|
|
291
|
+
return;
|
|
292
|
+
relayClient?.close("personal-server-stop");
|
|
293
|
+
relayClient = undefined;
|
|
294
|
+
runtime.deactivate();
|
|
295
|
+
await runtimeBundle?.syncManager?.stop?.();
|
|
296
|
+
setStatus("stopped");
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
kind: "lite",
|
|
300
|
+
ready: (_options) => info(),
|
|
301
|
+
info,
|
|
302
|
+
prepareRegistration,
|
|
303
|
+
submitRegistration,
|
|
304
|
+
fetch: callFetch,
|
|
305
|
+
postData,
|
|
306
|
+
listData,
|
|
307
|
+
listAccessLogs,
|
|
308
|
+
listVersions,
|
|
309
|
+
readData,
|
|
310
|
+
createGrant,
|
|
311
|
+
listGrants,
|
|
312
|
+
revokeGrant,
|
|
313
|
+
syncStatus,
|
|
314
|
+
syncNow,
|
|
315
|
+
stop,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function savedRelaySessionId(state, options) {
|
|
319
|
+
if (!state?.sessionId)
|
|
320
|
+
return null;
|
|
321
|
+
if (options.controlUrl && state.controlUrl !== options.controlUrl)
|
|
322
|
+
return null;
|
|
323
|
+
if (options.publicSuffix && state.publicSuffix !== options.publicSuffix) {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
return state.sessionId;
|
|
327
|
+
}
|
|
328
|
+
function randomSessionId() {
|
|
329
|
+
const bytes = crypto.getRandomValues(new Uint8Array(12));
|
|
330
|
+
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
331
|
+
}
|
|
332
|
+
function authFromOptions(options) {
|
|
333
|
+
if ("auth" in options && options.auth)
|
|
334
|
+
return options.auth;
|
|
335
|
+
if ("signMessage" in options)
|
|
336
|
+
return { signMessage: options.signMessage };
|
|
337
|
+
if ("bearerToken" in options)
|
|
338
|
+
return { bearerToken: options.bearerToken };
|
|
339
|
+
return undefined;
|
|
340
|
+
}
|
|
341
|
+
function requiredOwnerSignature(ownerSignature) {
|
|
342
|
+
if (!ownerSignature) {
|
|
343
|
+
throw new Error("ownerSignature is required to start PS Lite");
|
|
344
|
+
}
|
|
345
|
+
return ownerSignature;
|
|
346
|
+
}
|
|
347
|
+
function configDefaultsWithOrigin(defaults, origin) {
|
|
348
|
+
return {
|
|
349
|
+
...defaults,
|
|
350
|
+
server: {
|
|
351
|
+
...defaults?.server,
|
|
352
|
+
origin,
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
function requiredGatewayUrl(info) {
|
|
357
|
+
if (!info.gatewayUrl) {
|
|
358
|
+
throw new Error("Personal Server gateway URL is required");
|
|
359
|
+
}
|
|
360
|
+
return info.gatewayUrl;
|
|
361
|
+
}
|
|
362
|
+
function requiredApiOrigin(info) {
|
|
363
|
+
if (!info.urls.apiOrigin) {
|
|
364
|
+
throw new Error("Personal Server API origin is required");
|
|
365
|
+
}
|
|
366
|
+
return info.urls.apiOrigin;
|
|
367
|
+
}
|
|
368
|
+
function toRuntimeRequest(input, origin, init) {
|
|
369
|
+
const url = `${origin}${requestPath(input)}`;
|
|
370
|
+
if (input instanceof Request) {
|
|
371
|
+
const base = new Request(url, input);
|
|
372
|
+
return init ? new Request(base, init) : base;
|
|
373
|
+
}
|
|
374
|
+
return new Request(url, init);
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PS Lite one-shot diagnostics — v1
|
|
3
|
+
*
|
|
4
|
+
* Produces a bounded, plain-JSON diagnostic snapshot that the web MCP approval
|
|
5
|
+
* page can copy verbatim when it is stuck waiting for scopes. No payload bodies
|
|
6
|
+
* or secrets are ever included.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const recorder = new DiagnosticsRecorder();
|
|
10
|
+
* recorder.push({ phase: "indexing", detail: "scope=drive" });
|
|
11
|
+
* // … pass recorder into createPsLiteRuntime({ diagnostics: recorder, … })
|
|
12
|
+
* // GET /v1/diagnostics returns recorder.snapshot(syncStatus, storage)
|
|
13
|
+
*/
|
|
14
|
+
import type { SyncStatus } from "@opendatalabs/personal-server-ts-core/sync";
|
|
15
|
+
import type { DataStoragePort } from "@opendatalabs/personal-server-ts-core/ports";
|
|
16
|
+
export declare const DIAGNOSTICS_VERSION = 1;
|
|
17
|
+
/** Phases that the PS / PS Lite can be in during its lifecycle. */
|
|
18
|
+
export type DiagnosticsPhase = "booting" | "registering" | "routing" | "syncing" | "downloading" | "decrypting" | "indexing" | "buildingManifest" | "repairingManifest" | "generatingScopes" | "storageFailing" | "networkFailing" | "ready" | "unknown";
|
|
19
|
+
/** Per-scope readiness states visible to the approval page. */
|
|
20
|
+
export type ScopeReadinessStatus = "ready" | "indexing" | "waitingForPayload" | "manifestMissing" | "downloadFailed" | "decryptFailed" | "indexFailed" | "unknown";
|
|
21
|
+
export interface DiagnosticsEvent {
|
|
22
|
+
/** ISO 8601 timestamp */
|
|
23
|
+
at: string;
|
|
24
|
+
phase: DiagnosticsPhase;
|
|
25
|
+
/** Free-form detail — no payload bodies or secrets */
|
|
26
|
+
detail?: string;
|
|
27
|
+
/** Associated scope identifier, if known */
|
|
28
|
+
scope?: string;
|
|
29
|
+
/** Associated file id, if known */
|
|
30
|
+
fileId?: string;
|
|
31
|
+
/** Whether this event represents an error condition */
|
|
32
|
+
error?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface ScopeDiagnostics {
|
|
35
|
+
scope: string;
|
|
36
|
+
status: ScopeReadinessStatus;
|
|
37
|
+
/** ISO 8601 */
|
|
38
|
+
lastActivityAt?: string;
|
|
39
|
+
lastError?: string;
|
|
40
|
+
lastFileId?: string;
|
|
41
|
+
/** Bytes of the last payload, if known */
|
|
42
|
+
sizeBytes?: number;
|
|
43
|
+
/** How many times a repair loop has fired for this scope */
|
|
44
|
+
repairCount?: number;
|
|
45
|
+
}
|
|
46
|
+
export interface ActiveOperation {
|
|
47
|
+
phase: DiagnosticsPhase;
|
|
48
|
+
startedAt: string;
|
|
49
|
+
elapsedMs: number;
|
|
50
|
+
scope?: string;
|
|
51
|
+
fileId?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface LastNetworkOperation {
|
|
54
|
+
/** e.g. "download", "upload", "gatewayGetServer" */
|
|
55
|
+
operationClass: string;
|
|
56
|
+
status: "ok" | "error";
|
|
57
|
+
elapsedMs: number;
|
|
58
|
+
/** HTTP status code or error class, no body */
|
|
59
|
+
statusOrError?: string | number;
|
|
60
|
+
at: string;
|
|
61
|
+
}
|
|
62
|
+
export interface StorageHealthSummary {
|
|
63
|
+
indexedDbAvailable: boolean;
|
|
64
|
+
persistenceBackend?: string;
|
|
65
|
+
opfsAvailable?: boolean;
|
|
66
|
+
entryCount?: number;
|
|
67
|
+
unsyncedCount?: number;
|
|
68
|
+
scopeCount?: number;
|
|
69
|
+
}
|
|
70
|
+
export interface PsLiteDiagnosticsSnapshot {
|
|
71
|
+
diagnosticVersion: 1;
|
|
72
|
+
capturedAt: string;
|
|
73
|
+
/** Current runtime active state */
|
|
74
|
+
runtimeActive: boolean | "unknown";
|
|
75
|
+
/** Current or last readiness phase */
|
|
76
|
+
currentPhase: DiagnosticsPhase;
|
|
77
|
+
/** Active operation with elapsed time, if any */
|
|
78
|
+
activeOperation: ActiveOperation | null;
|
|
79
|
+
/** Recent event ring, newest-last, bounded to MAX_EVENTS */
|
|
80
|
+
recentEvents: DiagnosticsEvent[];
|
|
81
|
+
/** Per-scope readiness where known */
|
|
82
|
+
scopes: ScopeDiagnostics[];
|
|
83
|
+
/** Sync manager status, if available */
|
|
84
|
+
sync: SyncDiagnostics | null;
|
|
85
|
+
/** Storage health, if available */
|
|
86
|
+
storage: StorageHealthSummary | null;
|
|
87
|
+
/** Most recent network/storage operation, no body */
|
|
88
|
+
lastNetworkOperation: LastNetworkOperation | null;
|
|
89
|
+
/** Repair loop counts keyed by scope */
|
|
90
|
+
repairCounts: Record<string, number>;
|
|
91
|
+
/** Whether diagnostics collection itself timed out */
|
|
92
|
+
partial: boolean;
|
|
93
|
+
}
|
|
94
|
+
export interface SyncDiagnostics {
|
|
95
|
+
enabled: boolean;
|
|
96
|
+
running: boolean;
|
|
97
|
+
syncing: boolean;
|
|
98
|
+
blocked: {
|
|
99
|
+
reason: string;
|
|
100
|
+
message: string;
|
|
101
|
+
} | null;
|
|
102
|
+
lastSync: string | null;
|
|
103
|
+
lastProcessedTimestamp: string | null;
|
|
104
|
+
pendingFiles: number;
|
|
105
|
+
recentErrors: Array<{
|
|
106
|
+
fileId: string | null;
|
|
107
|
+
scope: string | null;
|
|
108
|
+
message: string;
|
|
109
|
+
timestamp: string;
|
|
110
|
+
}>;
|
|
111
|
+
}
|
|
112
|
+
/** Options passed when recording an event. */
|
|
113
|
+
export interface RecordEventOptions {
|
|
114
|
+
phase: DiagnosticsPhase;
|
|
115
|
+
detail?: string;
|
|
116
|
+
scope?: string;
|
|
117
|
+
fileId?: string;
|
|
118
|
+
error?: boolean;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Lightweight thread-safe (single-threaded JS) recorder.
|
|
122
|
+
*
|
|
123
|
+
* Instantiate once per PS Lite runtime; pass it into createPsLiteRuntime and
|
|
124
|
+
* call recorder.push() from sync, storage, and indexing code paths.
|
|
125
|
+
*/
|
|
126
|
+
export declare class DiagnosticsRecorder {
|
|
127
|
+
private readonly events;
|
|
128
|
+
private currentPhase;
|
|
129
|
+
private activeOp;
|
|
130
|
+
private lastNetwork;
|
|
131
|
+
private readonly scopeMap;
|
|
132
|
+
private readonly repairCounts;
|
|
133
|
+
push(options: RecordEventOptions): void;
|
|
134
|
+
/** Call when an async operation starts (e.g. a download or index run). */
|
|
135
|
+
beginOperation(phase: DiagnosticsPhase, scope?: string, fileId?: string): void;
|
|
136
|
+
/** Call when the async operation completes or fails. */
|
|
137
|
+
endOperation(): void;
|
|
138
|
+
/** Record a network or storage operation result without payload. */
|
|
139
|
+
recordNetworkOp(operationClass: string, status: "ok" | "error", elapsedMs: number, statusOrError?: string | number): void;
|
|
140
|
+
/** Increment the repair loop counter for a scope. */
|
|
141
|
+
recordRepair(scope: string): void;
|
|
142
|
+
/** Update per-scope readiness explicitly. */
|
|
143
|
+
setScopeStatus(scope: string, status: ScopeReadinessStatus, extra?: Partial<Omit<ScopeDiagnostics, "scope" | "status">>): void;
|
|
144
|
+
/**
|
|
145
|
+
* Mark a scope as ready after a successful index pass, unless an earlier
|
|
146
|
+
* phase found that the bounded read sidecar is missing or corrupt.
|
|
147
|
+
*/
|
|
148
|
+
setScopeReadyAfterIndex(scope: string): void;
|
|
149
|
+
/** Mark a successful block-manifest write and clear any stale manifest error. */
|
|
150
|
+
setScopeManifestBuilt(scope: string): void;
|
|
151
|
+
/**
|
|
152
|
+
* Assemble a snapshot. Optionally accepts sync status and storage port to
|
|
153
|
+
* enrich the result. Runs with a hard timeout so it can never block.
|
|
154
|
+
*/
|
|
155
|
+
snapshot(options?: {
|
|
156
|
+
runtimeActive?: boolean;
|
|
157
|
+
syncStatus?: SyncStatus | null;
|
|
158
|
+
storage?: DataStoragePort | null;
|
|
159
|
+
}): PsLiteDiagnosticsSnapshot;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Collect a diagnostic snapshot with a hard timeout so it can never block the
|
|
163
|
+
* approval page. Returns a partial snapshot if the timeout fires.
|
|
164
|
+
*/
|
|
165
|
+
export declare function collectDiagnosticsWithTimeout(recorder: DiagnosticsRecorder, options?: Parameters<DiagnosticsRecorder["snapshot"]>[0], timeoutMs?: number): Promise<PsLiteDiagnosticsSnapshot>;
|
|
166
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|