@digitalpaws/starr 0.0.1
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.rst +75 -0
- package/data/.nfs.811bbb0d.43c34.4 +0 -0
- package/data/.nfs.81ba4cd0.ffff87804.4 +0 -0
- package/data/.nfs.82d127f7.fffff5704.4 +0 -0
- package/data/.nfs.82d127fe.fffff5704.4 +0 -0
- package/data/.nfs.82d159a5.fffff5aa4.4 +0 -0
- package/data/.nfs.82d159aa.fffff5aa4.4 +0 -0
- package/data/.nfs.82d15a9c.fffff5bb4.4 +0 -0
- package/data/.nfs.82d15aa1.fffff5bb4.4 +0 -0
- package/data/.nfs.82d15c65.fffff5c24.4 +0 -0
- package/data/.nfs.82d1852c.fffff5e24.4 +0 -0
- package/data/.nfs.82d18536.fffff5e24.4 +0 -0
- package/data/.nfs.82d18dbe.fffff5e44.4 +0 -0
- package/data/.nfs.82d18dc6.fffff5e44.4 +0 -0
- package/data/.nfs.8309a3f5.fffff82f4.4 +0 -0
- package/data/.nfs.8309a3fe.fffff82f4.4 +0 -0
- package/data/.nfs.8314122e.fffffb044.4 +0 -0
- package/data/.nfs.83141236.fffffb044.4 +0 -0
- package/data/.nfs.833c4fe9.fffffbc34.4 +0 -0
- package/data/.nfs.833c4ff3.fffffbc34.4 +0 -0
- package/data/logs/starr.log +66244 -0
- package/data/starr.db +0 -0
- package/data/starr.db-shm +0 -0
- package/data/starr.db-wal +0 -0
- package/data/starr.jwt +1 -0
- package/data/starr.key +1 -0
- package/dist/auth/auth-service.d.ts +42 -0
- package/dist/auth/auth-service.d.ts.map +1 -0
- package/dist/auth/auth-service.js +226 -0
- package/dist/auth/auth-service.js.map +1 -0
- package/dist/auth/http-server.d.ts +16 -0
- package/dist/auth/http-server.d.ts.map +1 -0
- package/dist/auth/http-server.js +207 -0
- package/dist/auth/http-server.js.map +1 -0
- package/dist/auth/jwt-secret.d.ts +6 -0
- package/dist/auth/jwt-secret.d.ts.map +1 -0
- package/dist/auth/jwt-secret.js +51 -0
- package/dist/auth/jwt-secret.js.map +1 -0
- package/dist/auth/oidc/oidc-flow.d.ts +60 -0
- package/dist/auth/oidc/oidc-flow.d.ts.map +1 -0
- package/dist/auth/oidc/oidc-flow.js +201 -0
- package/dist/auth/oidc/oidc-flow.js.map +1 -0
- package/dist/auth/oidc/oidc-provider-service.d.ts +59 -0
- package/dist/auth/oidc/oidc-provider-service.d.ts.map +1 -0
- package/dist/auth/oidc/oidc-provider-service.js +124 -0
- package/dist/auth/oidc/oidc-provider-service.js.map +1 -0
- package/dist/auth/oidc/user-service.d.ts +67 -0
- package/dist/auth/oidc/user-service.d.ts.map +1 -0
- package/dist/auth/oidc/user-service.js +177 -0
- package/dist/auth/oidc/user-service.js.map +1 -0
- package/dist/auth/rate-limiter.d.ts +31 -0
- package/dist/auth/rate-limiter.d.ts.map +1 -0
- package/dist/auth/rate-limiter.js +70 -0
- package/dist/auth/rate-limiter.js.map +1 -0
- package/dist/config/config-service.d.ts +83 -0
- package/dist/config/config-service.d.ts.map +1 -0
- package/dist/config/config-service.js +309 -0
- package/dist/config/config-service.js.map +1 -0
- package/dist/config/validate.d.ts +12 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +140 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/content-types/registry.d.ts +75 -0
- package/dist/content-types/registry.d.ts.map +1 -0
- package/dist/content-types/registry.js +171 -0
- package/dist/content-types/registry.js.map +1 -0
- package/dist/datastore/db.d.ts +9 -0
- package/dist/datastore/db.d.ts.map +1 -0
- package/dist/datastore/db.js +27 -0
- package/dist/datastore/db.js.map +1 -0
- package/dist/datastore/encrypt.d.ts +9 -0
- package/dist/datastore/encrypt.d.ts.map +1 -0
- package/dist/datastore/encrypt.js +84 -0
- package/dist/datastore/encrypt.js.map +1 -0
- package/dist/datastore/migrations.d.ts +10 -0
- package/dist/datastore/migrations.d.ts.map +1 -0
- package/dist/datastore/migrations.js +340 -0
- package/dist/datastore/migrations.js.map +1 -0
- package/dist/datastore/storage.d.ts +4 -0
- package/dist/datastore/storage.d.ts.map +1 -0
- package/dist/datastore/storage.js +60 -0
- package/dist/datastore/storage.js.map +1 -0
- package/dist/events/event-bus.d.ts +15 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/event-bus.js +140 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/events/spine.d.ts +31 -0
- package/dist/events/spine.d.ts.map +1 -0
- package/dist/events/spine.js +68 -0
- package/dist/events/spine.js.map +1 -0
- package/dist/events/trace.d.ts +24 -0
- package/dist/events/trace.d.ts.map +1 -0
- package/dist/events/trace.js +33 -0
- package/dist/events/trace.js.map +1 -0
- package/dist/host.d.ts +65 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +94 -0
- package/dist/host.js.map +1 -0
- package/dist/library/importer.d.ts +29 -0
- package/dist/library/importer.d.ts.map +1 -0
- package/dist/library/importer.js +145 -0
- package/dist/library/importer.js.map +1 -0
- package/dist/library/library-cache.d.ts +46 -0
- package/dist/library/library-cache.d.ts.map +1 -0
- package/dist/library/library-cache.js +152 -0
- package/dist/library/library-cache.js.map +1 -0
- package/dist/library/library-config.d.ts +12 -0
- package/dist/library/library-config.d.ts.map +1 -0
- package/dist/library/library-config.js +10 -0
- package/dist/library/library-config.js.map +1 -0
- package/dist/library/library-scanner.d.ts +62 -0
- package/dist/library/library-scanner.d.ts.map +1 -0
- package/dist/library/library-scanner.js +336 -0
- package/dist/library/library-scanner.js.map +1 -0
- package/dist/library/library-service.d.ts +65 -0
- package/dist/library/library-service.d.ts.map +1 -0
- package/dist/library/library-service.js +197 -0
- package/dist/library/library-service.js.map +1 -0
- package/dist/library/metadata-matcher.d.ts +56 -0
- package/dist/library/metadata-matcher.d.ts.map +1 -0
- package/dist/library/metadata-matcher.js +207 -0
- package/dist/library/metadata-matcher.js.map +1 -0
- package/dist/library/naming.d.ts +8 -0
- package/dist/library/naming.d.ts.map +1 -0
- package/dist/library/naming.js +47 -0
- package/dist/library/naming.js.map +1 -0
- package/dist/library/scan-controller.d.ts +95 -0
- package/dist/library/scan-controller.d.ts.map +1 -0
- package/dist/library/scan-controller.js +379 -0
- package/dist/library/scan-controller.js.map +1 -0
- package/dist/library/source-resolver.d.ts +17 -0
- package/dist/library/source-resolver.d.ts.map +1 -0
- package/dist/library/source-resolver.js +75 -0
- package/dist/library/source-resolver.js.map +1 -0
- package/dist/logging/logger.d.ts +3 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +107 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/main.d.ts +36 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +229 -0
- package/dist/main.js.map +1 -0
- package/dist/plugins/context.d.ts +10 -0
- package/dist/plugins/context.d.ts.map +1 -0
- package/dist/plugins/context.js +110 -0
- package/dist/plugins/context.js.map +1 -0
- package/dist/plugins/discovery.d.ts +2 -0
- package/dist/plugins/discovery.d.ts.map +1 -0
- package/dist/plugins/discovery.js +32 -0
- package/dist/plugins/discovery.js.map +1 -0
- package/dist/plugins/loader.d.ts +9 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +245 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/state/request-intake.d.ts +26 -0
- package/dist/state/request-intake.d.ts.map +1 -0
- package/dist/state/request-intake.js +74 -0
- package/dist/state/request-intake.js.map +1 -0
- package/dist/state/state-store.d.ts +146 -0
- package/dist/state/state-store.d.ts.map +1 -0
- package/dist/state/state-store.js +465 -0
- package/dist/state/state-store.js.map +1 -0
- package/dist/state/trace-store.d.ts +12 -0
- package/dist/state/trace-store.d.ts.map +1 -0
- package/dist/state/trace-store.js +24 -0
- package/dist/state/trace-store.js.map +1 -0
- package/dist/types/plugin.d.ts +93 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +4 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/web/index.d.ts +10 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +153 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/routes/activity.d.ts +6 -0
- package/dist/web/routes/activity.d.ts.map +1 -0
- package/dist/web/routes/activity.js +31 -0
- package/dist/web/routes/activity.js.map +1 -0
- package/dist/web/routes/auth.d.ts +6 -0
- package/dist/web/routes/auth.d.ts.map +1 -0
- package/dist/web/routes/auth.js +142 -0
- package/dist/web/routes/auth.js.map +1 -0
- package/dist/web/routes/config.d.ts +7 -0
- package/dist/web/routes/config.d.ts.map +1 -0
- package/dist/web/routes/config.js +204 -0
- package/dist/web/routes/config.js.map +1 -0
- package/dist/web/routes/content-types.d.ts +6 -0
- package/dist/web/routes/content-types.d.ts.map +1 -0
- package/dist/web/routes/content-types.js +29 -0
- package/dist/web/routes/content-types.js.map +1 -0
- package/dist/web/routes/discovery.d.ts +6 -0
- package/dist/web/routes/discovery.d.ts.map +1 -0
- package/dist/web/routes/discovery.js +111 -0
- package/dist/web/routes/discovery.js.map +1 -0
- package/dist/web/routes/library-import.d.ts +6 -0
- package/dist/web/routes/library-import.d.ts.map +1 -0
- package/dist/web/routes/library-import.js +120 -0
- package/dist/web/routes/library-import.js.map +1 -0
- package/dist/web/routes/library-management.d.ts +6 -0
- package/dist/web/routes/library-management.d.ts.map +1 -0
- package/dist/web/routes/library-management.js +120 -0
- package/dist/web/routes/library-management.js.map +1 -0
- package/dist/web/routes/library.d.ts +6 -0
- package/dist/web/routes/library.d.ts.map +1 -0
- package/dist/web/routes/library.js +28 -0
- package/dist/web/routes/library.js.map +1 -0
- package/dist/web/routes/oidc.d.ts +9 -0
- package/dist/web/routes/oidc.d.ts.map +1 -0
- package/dist/web/routes/oidc.js +203 -0
- package/dist/web/routes/oidc.js.map +1 -0
- package/dist/web/routes/requests.d.ts +6 -0
- package/dist/web/routes/requests.d.ts.map +1 -0
- package/dist/web/routes/requests.js +183 -0
- package/dist/web/routes/requests.js.map +1 -0
- package/dist/web/routes/sse.d.ts +6 -0
- package/dist/web/routes/sse.d.ts.map +1 -0
- package/dist/web/routes/sse.js +54 -0
- package/dist/web/routes/sse.js.map +1 -0
- package/package.json +33 -0
- package/package.json.license +2 -0
- package/src/auth/auth-service.ts +333 -0
- package/src/auth/http-server.ts +249 -0
- package/src/auth/jwt-secret.ts +65 -0
- package/src/auth/oidc/oidc-flow.ts +266 -0
- package/src/auth/oidc/oidc-provider-service.ts +174 -0
- package/src/auth/oidc/user-service.ts +227 -0
- package/src/auth/rate-limiter.ts +85 -0
- package/src/config/config-service.ts +434 -0
- package/src/config/validate.ts +153 -0
- package/src/content-types/registry.ts +194 -0
- package/src/datastore/db.ts +38 -0
- package/src/datastore/encrypt.ts +107 -0
- package/src/datastore/migrations.ts +367 -0
- package/src/datastore/storage.ts +83 -0
- package/src/events/event-bus.ts +180 -0
- package/src/events/spine.ts +87 -0
- package/src/events/trace.ts +38 -0
- package/src/host.ts +130 -0
- package/src/library/importer.ts +174 -0
- package/src/library/library-cache.ts +212 -0
- package/src/library/library-config.ts +22 -0
- package/src/library/library-scanner.ts +404 -0
- package/src/library/library-service.ts +282 -0
- package/src/library/metadata-matcher.ts +285 -0
- package/src/library/naming.ts +59 -0
- package/src/library/scan-controller.ts +490 -0
- package/src/library/source-resolver.ts +92 -0
- package/src/logging/logger.ts +115 -0
- package/src/main.ts +364 -0
- package/src/plugins/context.ts +138 -0
- package/src/plugins/discovery.ts +29 -0
- package/src/plugins/loader.ts +309 -0
- package/src/state/request-intake.ts +101 -0
- package/src/state/state-store.ts +621 -0
- package/src/state/trace-store.ts +27 -0
- package/src/types/plugin.ts +110 -0
- package/src/web/index.ts +182 -0
- package/src/web/routes/activity.ts +41 -0
- package/src/web/routes/auth.ts +170 -0
- package/src/web/routes/config.ts +282 -0
- package/src/web/routes/content-types.ts +42 -0
- package/src/web/routes/discovery.ts +156 -0
- package/src/web/routes/library-import.ts +196 -0
- package/src/web/routes/library-management.ts +140 -0
- package/src/web/routes/library.ts +46 -0
- package/src/web/routes/oidc.ts +260 -0
- package/src/web/routes/requests.ts +250 -0
- package/src/web/routes/sse.ts +92 -0
- package/tests/auth.test.ts +510 -0
- package/tests/config-route.test.ts +345 -0
- package/tests/config.test.ts +612 -0
- package/tests/content-types.test.ts +376 -0
- package/tests/datastore.test.ts +345 -0
- package/tests/e2e.test.ts +430 -0
- package/tests/event-bus.test.ts +925 -0
- package/tests/host.test.ts +449 -0
- package/tests/library-cache.test.ts +171 -0
- package/tests/library-scanner.test.ts +177 -0
- package/tests/library.test.ts +210 -0
- package/tests/loader-context.test.ts +644 -0
- package/tests/logger-jsonl.test.ts +154 -0
- package/tests/metadata-matcher.test.ts +198 -0
- package/tests/oidc.test.ts +218 -0
- package/tests/scan-controller.test.ts +328 -0
- package/tests/source-resolver.test.ts +100 -0
- package/tests/starr-video-integration.test.ts +153 -0
- package/tests/state-store.test.ts +700 -0
- package/tests/trace-history.test.ts +356 -0
- package/tsconfig.json +8 -0
- package/tsconfig.json.license +2 -0
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
// SPDX-License-Identifier: 0BSD
|
|
2
|
+
// SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
|
|
3
|
+
import { env } from "node:process";
|
|
4
|
+
// ── Row mapping helper ─────────────────────────────────────
|
|
5
|
+
function rowToRequest(row) {
|
|
6
|
+
return {
|
|
7
|
+
requestId: row.request_id,
|
|
8
|
+
contentTypeId: row.content_type_id,
|
|
9
|
+
contentIdentity: row.content_identity,
|
|
10
|
+
item: JSON.parse(row.item),
|
|
11
|
+
ownerUserId: row.owner_user_id,
|
|
12
|
+
watchers: JSON.parse(row.watchers),
|
|
13
|
+
status: row.status,
|
|
14
|
+
statusDetail: row.status_detail || undefined,
|
|
15
|
+
chosenReleaseId: row.chosen_release_id || undefined,
|
|
16
|
+
attempts: row.attempts,
|
|
17
|
+
libraryId: row.library_id || undefined,
|
|
18
|
+
createdAt: row.created_at,
|
|
19
|
+
updatedAt: row.updated_at,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Maximum number of trace entries retained per traceId.
|
|
24
|
+
* Set via STARR_TRACE_HISTORY_LIMIT env var; defaults to 50.
|
|
25
|
+
* Values ≤ 0 disable trace capture entirely.
|
|
26
|
+
*/
|
|
27
|
+
const TRACE_HISTORY_LIMIT = (() => {
|
|
28
|
+
const raw = env.STARR_TRACE_HISTORY_LIMIT;
|
|
29
|
+
if (raw === undefined || raw === "")
|
|
30
|
+
return 50;
|
|
31
|
+
const n = Number(raw);
|
|
32
|
+
if (Number.isNaN(n)) {
|
|
33
|
+
// We don't have a logger at module scope — the state store
|
|
34
|
+
// constructor will log a warning if the env var is invalid.
|
|
35
|
+
return 50;
|
|
36
|
+
}
|
|
37
|
+
return Math.max(0, Math.floor(n));
|
|
38
|
+
})();
|
|
39
|
+
// ── StateStore class ───────────────────────────────────────
|
|
40
|
+
export class StateStore {
|
|
41
|
+
db;
|
|
42
|
+
bus;
|
|
43
|
+
logger;
|
|
44
|
+
// Prepared statements — created once in constructor
|
|
45
|
+
stmtGetByRequestId;
|
|
46
|
+
stmtFindByIdentity;
|
|
47
|
+
stmtInsert;
|
|
48
|
+
stmtUpdateStatus;
|
|
49
|
+
stmtIncrementAttempts;
|
|
50
|
+
stmtAddWatcher;
|
|
51
|
+
stmtListByUser;
|
|
52
|
+
stmtInsertTrace;
|
|
53
|
+
stmtGetIdsByTraceId;
|
|
54
|
+
stmtGetTraceByRequestId;
|
|
55
|
+
stmtResetAttempts;
|
|
56
|
+
stmtResetForRetry;
|
|
57
|
+
stmtDeleteRequest;
|
|
58
|
+
stmtDeleteTraceByRequestId;
|
|
59
|
+
constructor(db, bus, logger) {
|
|
60
|
+
this.db = db;
|
|
61
|
+
this.bus = bus;
|
|
62
|
+
this.logger = logger.child("state-store");
|
|
63
|
+
// Compile prepared statements once
|
|
64
|
+
this.stmtGetByRequestId = db.prepare("SELECT * FROM tracked_requests WHERE request_id = @requestId");
|
|
65
|
+
this.stmtFindByIdentity = db.prepare(`SELECT * FROM tracked_requests
|
|
66
|
+
WHERE content_identity = @identity AND status != 'failed'
|
|
67
|
+
ORDER BY created_at DESC
|
|
68
|
+
LIMIT 1`);
|
|
69
|
+
this.stmtInsert = db.prepare(`INSERT INTO tracked_requests
|
|
70
|
+
(request_id, content_type_id, content_identity, item,
|
|
71
|
+
owner_user_id, watchers, status, attempts, library_id, created_at, updated_at)
|
|
72
|
+
VALUES
|
|
73
|
+
(@requestId, @contentTypeId, @contentIdentity, @item,
|
|
74
|
+
@ownerUserId, '[]', 'requested', 0,
|
|
75
|
+
@libraryId,
|
|
76
|
+
datetime('now'), datetime('now'))`);
|
|
77
|
+
this.stmtUpdateStatus = db.prepare(`UPDATE tracked_requests
|
|
78
|
+
SET status = @status,
|
|
79
|
+
status_detail = @detail,
|
|
80
|
+
chosen_release_id = COALESCE(@chosenReleaseId, chosen_release_id),
|
|
81
|
+
updated_at = datetime('now')
|
|
82
|
+
WHERE request_id = @requestId`);
|
|
83
|
+
this.stmtIncrementAttempts = db.prepare(`UPDATE tracked_requests
|
|
84
|
+
SET attempts = attempts + 1, updated_at = datetime('now')
|
|
85
|
+
WHERE request_id = @requestId`);
|
|
86
|
+
this.stmtAddWatcher = db.prepare(`UPDATE tracked_requests
|
|
87
|
+
SET watchers = @watchers, updated_at = datetime('now')
|
|
88
|
+
WHERE request_id = @requestId`);
|
|
89
|
+
this.stmtListByUser = db.prepare(`SELECT * FROM tracked_requests
|
|
90
|
+
WHERE owner_user_id = @userId
|
|
91
|
+
OR watchers LIKE @pattern
|
|
92
|
+
ORDER BY created_at DESC`);
|
|
93
|
+
// Trace log — prepared statements
|
|
94
|
+
this.stmtInsertTrace = db.prepare(`INSERT INTO trace_log (trace_id, request_id, event_type, event_data, timestamp)
|
|
95
|
+
VALUES (@traceId, @requestId, @eventType, @eventData, @timestamp)`);
|
|
96
|
+
this.stmtGetIdsByTraceId = db.prepare(`SELECT id FROM trace_log
|
|
97
|
+
WHERE trace_id = @traceId
|
|
98
|
+
ORDER BY id ASC`);
|
|
99
|
+
this.stmtGetTraceByRequestId = db.prepare(`SELECT * FROM trace_log
|
|
100
|
+
WHERE request_id = @requestId
|
|
101
|
+
ORDER BY id ASC`);
|
|
102
|
+
this.stmtResetAttempts = db.prepare(`UPDATE tracked_requests
|
|
103
|
+
SET attempts = 0, updated_at = datetime('now')
|
|
104
|
+
WHERE request_id = @requestId`);
|
|
105
|
+
this.stmtResetForRetry = db.prepare(`UPDATE tracked_requests
|
|
106
|
+
SET status = 'requested',
|
|
107
|
+
status_detail = @detail,
|
|
108
|
+
chosen_release_id = NULL,
|
|
109
|
+
attempts = 0,
|
|
110
|
+
updated_at = datetime('now')
|
|
111
|
+
WHERE request_id = @requestId`);
|
|
112
|
+
this.stmtDeleteRequest = db.prepare(`DELETE FROM tracked_requests WHERE request_id = @requestId`);
|
|
113
|
+
this.stmtDeleteTraceByRequestId = db.prepare(`DELETE FROM trace_log WHERE request_id = @requestId`);
|
|
114
|
+
// Subscribe to acquisition spine events
|
|
115
|
+
this.subscribe();
|
|
116
|
+
}
|
|
117
|
+
// ── Public API ───────────────────────────────────────────
|
|
118
|
+
/** Retrieve a single tracked request by its domain id. */
|
|
119
|
+
getByRequestId(requestId) {
|
|
120
|
+
const row = this.stmtGetByRequestId.get({ requestId });
|
|
121
|
+
return row ? rowToRequest(row) : undefined;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Find a non-failed tracked request with the given content identity.
|
|
125
|
+
* Used by request intake for de-duplication (DU1).
|
|
126
|
+
* Returns the most recently created match, or undefined.
|
|
127
|
+
*/
|
|
128
|
+
findByContentIdentity(contentIdentity) {
|
|
129
|
+
const row = this.stmtFindByIdentity.get({ identity: contentIdentity });
|
|
130
|
+
return row ? rowToRequest(row) : undefined;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Insert a brand-new tracked request with status ``requested``.
|
|
134
|
+
* Called by request intake after de-dup check (DU3).
|
|
135
|
+
*/
|
|
136
|
+
insert(data) {
|
|
137
|
+
this.stmtInsert.run({
|
|
138
|
+
requestId: data.requestId,
|
|
139
|
+
contentTypeId: data.contentTypeId,
|
|
140
|
+
contentIdentity: data.contentIdentity,
|
|
141
|
+
item: JSON.stringify(data.item),
|
|
142
|
+
ownerUserId: data.ownerUserId,
|
|
143
|
+
libraryId: data.libraryId ?? null,
|
|
144
|
+
});
|
|
145
|
+
this.logger.debug("tracked request created", {
|
|
146
|
+
requestId: data.requestId,
|
|
147
|
+
contentIdentity: data.contentIdentity,
|
|
148
|
+
libraryId: data.libraryId,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Add a userId to the watchers array of an existing request.
|
|
153
|
+
* Called by request intake when re-attaching to an existing request (DU2).
|
|
154
|
+
* No-op if the user is already the owner or a watcher.
|
|
155
|
+
*/
|
|
156
|
+
addWatcher(requestId, userId) {
|
|
157
|
+
const req = this.getByRequestId(requestId);
|
|
158
|
+
if (!req) {
|
|
159
|
+
this.logger.warn("addWatcher: unknown requestId", { requestId });
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (req.ownerUserId === userId || req.watchers.includes(userId)) {
|
|
163
|
+
return; // already attached
|
|
164
|
+
}
|
|
165
|
+
const updated = [...req.watchers, userId];
|
|
166
|
+
this.stmtAddWatcher.run({
|
|
167
|
+
requestId,
|
|
168
|
+
watchers: JSON.stringify(updated),
|
|
169
|
+
});
|
|
170
|
+
this.logger.debug("watcher added", { requestId, userId });
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Return the ordered trace history for a tracked request.
|
|
174
|
+
*
|
|
175
|
+
* Returns an array of TraceEntry, oldest first. Returns an empty array
|
|
176
|
+
* if the requestId is unknown or has no captured events.
|
|
177
|
+
*
|
|
178
|
+
* This is the data surface for the admin "activity" view (DBG2).
|
|
179
|
+
* The UI (Task 022) renders the returned data; this task only provides
|
|
180
|
+
* the query.
|
|
181
|
+
*/
|
|
182
|
+
getTraceLog(requestId) {
|
|
183
|
+
const rows = this.stmtGetTraceByRequestId.all({ requestId });
|
|
184
|
+
return rows.map((row) => ({
|
|
185
|
+
id: row.id,
|
|
186
|
+
traceId: row.trace_id,
|
|
187
|
+
requestId: row.request_id,
|
|
188
|
+
eventType: row.event_type,
|
|
189
|
+
eventData: JSON.parse(row.event_data),
|
|
190
|
+
timestamp: row.timestamp,
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
// ── Retry ───────────────────────────────────────────────
|
|
194
|
+
/**
|
|
195
|
+
* Reset a tracked request to 'requested' for a manual retry.
|
|
196
|
+
*
|
|
197
|
+
* Clears chosenReleaseId, resets attempts to 0, sets status to
|
|
198
|
+
* 'requested' with a detail message. This is called from the
|
|
199
|
+
* retry endpoint before re-emitting content.requested.
|
|
200
|
+
*
|
|
201
|
+
* Uses a transaction for atomicity.
|
|
202
|
+
* Emits item.updated so the UI reflects the change immediately.
|
|
203
|
+
*/
|
|
204
|
+
resetAndRetry(requestId) {
|
|
205
|
+
const txn = this.db.transaction(() => {
|
|
206
|
+
// Reset status, clear chosenReleaseId, reset attempts in one statement
|
|
207
|
+
this.stmtResetForRetry.run({
|
|
208
|
+
requestId,
|
|
209
|
+
detail: "Retrying — restarted by user",
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
txn();
|
|
213
|
+
// Emit item.updated so the UI updates live
|
|
214
|
+
this.bus.emit("item.updated", {
|
|
215
|
+
requestId,
|
|
216
|
+
status: "requested",
|
|
217
|
+
detail: "Retrying — restarted by user",
|
|
218
|
+
});
|
|
219
|
+
this.logger.info("request reset for retry", { requestId });
|
|
220
|
+
}
|
|
221
|
+
// ── Delete ──────────────────────────────────────────────
|
|
222
|
+
/**
|
|
223
|
+
* Permanently delete a tracked request and its associated
|
|
224
|
+
* trace-log entries. This is unconditional (any status).
|
|
225
|
+
*
|
|
226
|
+
* Returns true if a row was deleted, false if the requestId
|
|
227
|
+
* did not exist.
|
|
228
|
+
*/
|
|
229
|
+
deleteRequest(requestId) {
|
|
230
|
+
const txn = this.db.transaction(() => {
|
|
231
|
+
// 1. Delete trace log entries for this request
|
|
232
|
+
this.stmtDeleteTraceByRequestId.run({ requestId });
|
|
233
|
+
// 2. Delete the request itself
|
|
234
|
+
const info = this.stmtDeleteRequest.run({ requestId });
|
|
235
|
+
return info.changes > 0;
|
|
236
|
+
});
|
|
237
|
+
const deleted = txn();
|
|
238
|
+
if (deleted) {
|
|
239
|
+
this.logger.info("request deleted", { requestId });
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
this.logger.warn("deleteRequest: requestId not found", { requestId });
|
|
243
|
+
}
|
|
244
|
+
// Note: we deliberately do NOT emit item.updated here.
|
|
245
|
+
// Deletion is handled on the UI side by removing the item from
|
|
246
|
+
// the local store and/or navigating away.
|
|
247
|
+
return deleted;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Return ALL tracked requests (admin only).
|
|
251
|
+
*/
|
|
252
|
+
getLibraryPath(requestId) {
|
|
253
|
+
const row = this.db
|
|
254
|
+
.prepare("SELECT library_path FROM library_paths WHERE request_id = ?")
|
|
255
|
+
.get(requestId);
|
|
256
|
+
return row?.library_path;
|
|
257
|
+
}
|
|
258
|
+
getAllRequests() {
|
|
259
|
+
const rows = this.db
|
|
260
|
+
.prepare("SELECT * FROM tracked_requests ORDER BY created_at DESC")
|
|
261
|
+
.all();
|
|
262
|
+
return rows.map((row) => rowToRequest(row));
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* List tracked requests visible to a given user (owner or watcher).
|
|
266
|
+
* Used by the UI to show the request list (UI-ST2).
|
|
267
|
+
*/
|
|
268
|
+
listByUser(userId) {
|
|
269
|
+
// The LIKE pattern searches for the userId inside the JSON watchers array.
|
|
270
|
+
// e.g. '%"admin"%' matches ["admin"] or ["alice","admin"].
|
|
271
|
+
const rows = this.stmtListByUser.all({
|
|
272
|
+
userId,
|
|
273
|
+
pattern: `%"${userId}"%`,
|
|
274
|
+
});
|
|
275
|
+
return rows.map(rowToRequest);
|
|
276
|
+
}
|
|
277
|
+
// ── Trace capture ────────────────────────────────────────
|
|
278
|
+
/**
|
|
279
|
+
* Capture a spine event into the trace log. Stores the full event data
|
|
280
|
+
* (envelope fields + payload) as JSON, then prunes if the per-traceId
|
|
281
|
+
* count exceeds TRACE_HISTORY_LIMIT.
|
|
282
|
+
*
|
|
283
|
+
* This is a no-op if TRACE_HISTORY_LIMIT is 0 (trace capture disabled).
|
|
284
|
+
*/
|
|
285
|
+
captureTraceEvent(event, requestId) {
|
|
286
|
+
if (TRACE_HISTORY_LIMIT === 0)
|
|
287
|
+
return;
|
|
288
|
+
const eventData = {
|
|
289
|
+
eventId: event.id,
|
|
290
|
+
traceId: event.traceId,
|
|
291
|
+
correlationId: event.correlationId,
|
|
292
|
+
source: event.source,
|
|
293
|
+
schemaVersion: event.schemaVersion,
|
|
294
|
+
timestamp: event.timestamp,
|
|
295
|
+
payload: event.payload,
|
|
296
|
+
};
|
|
297
|
+
// 1. Insert the new entry
|
|
298
|
+
this.stmtInsertTrace.run({
|
|
299
|
+
traceId: event.traceId,
|
|
300
|
+
requestId,
|
|
301
|
+
eventType: event.type,
|
|
302
|
+
eventData: JSON.stringify(eventData),
|
|
303
|
+
timestamp: event.timestamp,
|
|
304
|
+
});
|
|
305
|
+
// 2. Fetch all entry ids for this traceId, oldest first
|
|
306
|
+
const rows = this.stmtGetIdsByTraceId.all({
|
|
307
|
+
traceId: event.traceId,
|
|
308
|
+
});
|
|
309
|
+
// 3. Prune if over the limit — delete the oldest excess entries
|
|
310
|
+
if (rows.length > TRACE_HISTORY_LIMIT) {
|
|
311
|
+
const excess = rows.length - TRACE_HISTORY_LIMIT;
|
|
312
|
+
const deleteIds = rows.slice(0, excess).map((r) => r.id);
|
|
313
|
+
// Use a one-off prepared statement for deletes
|
|
314
|
+
const deleteStmt = this.db.prepare("DELETE FROM trace_log WHERE id = ?");
|
|
315
|
+
for (const id of deleteIds) {
|
|
316
|
+
deleteStmt.run(id);
|
|
317
|
+
}
|
|
318
|
+
this.logger.debug("trace pruned", {
|
|
319
|
+
traceId: event.traceId,
|
|
320
|
+
deleted: excess,
|
|
321
|
+
remaining: TRACE_HISTORY_LIMIT,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
// ── Event subscription ───────────────────────────────────
|
|
326
|
+
subscribe() {
|
|
327
|
+
this.bus.on("release.found", this.onReleaseFound.bind(this));
|
|
328
|
+
this.bus.on("download.started", this.onDownloadStarted.bind(this));
|
|
329
|
+
this.bus.on("download.completed", this.onDownloadCompleted.bind(this));
|
|
330
|
+
this.bus.on("download.failed", this.onDownloadFailed.bind(this));
|
|
331
|
+
this.bus.on("request.failed", this.onRequestFailed.bind(this));
|
|
332
|
+
this.bus.on("import.started", this.onImportStarted.bind(this));
|
|
333
|
+
this.bus.on("import.completed", this.onImportCompleted.bind(this));
|
|
334
|
+
this.bus.on("import.failed", this.onImportFailed.bind(this));
|
|
335
|
+
}
|
|
336
|
+
onReleaseFound(event) {
|
|
337
|
+
const { requestId } = event.payload;
|
|
338
|
+
const req = this.getByRequestId(requestId);
|
|
339
|
+
if (!req) {
|
|
340
|
+
this.logger.warn("release.found for unknown requestId", { requestId });
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
this.captureTraceEvent(event, requestId);
|
|
344
|
+
// Transition: requested → searching (first candidate arrived)
|
|
345
|
+
if (req.status === "requested") {
|
|
346
|
+
this.updateStatus(requestId, "searching");
|
|
347
|
+
}
|
|
348
|
+
// If already searching (or beyond), just more candidates — no status change.
|
|
349
|
+
}
|
|
350
|
+
onDownloadStarted(event) {
|
|
351
|
+
const payload = event.payload;
|
|
352
|
+
const req = this.getByRequestId(payload.requestId);
|
|
353
|
+
if (!req) {
|
|
354
|
+
this.logger.warn("download.started for unknown requestId", {
|
|
355
|
+
requestId: payload.requestId,
|
|
356
|
+
});
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
this.captureTraceEvent(event, payload.requestId);
|
|
360
|
+
// Increment the display-only attempts counter (SM4)
|
|
361
|
+
this.incrementAttempts(payload.requestId);
|
|
362
|
+
// Transition: searching → downloading (defensive: also from 'requested')
|
|
363
|
+
if (req.status === "searching" || req.status === "requested") {
|
|
364
|
+
const releaseId = payload.release?.id ?? payload.release?.title ?? undefined;
|
|
365
|
+
this.updateStatus(payload.requestId, "downloading", undefined, releaseId);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
onDownloadCompleted(event) {
|
|
369
|
+
const { requestId } = event.payload;
|
|
370
|
+
const req = this.getByRequestId(requestId);
|
|
371
|
+
if (!req) {
|
|
372
|
+
this.logger.warn("download.completed for unknown requestId", { requestId });
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
this.captureTraceEvent(event, requestId);
|
|
376
|
+
// Terminal success — only if not already terminal
|
|
377
|
+
if (req.status !== "failed" && req.status !== "downloaded" && req.status !== "imported") {
|
|
378
|
+
this.updateStatus(requestId, "downloaded");
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
onDownloadFailed(event) {
|
|
382
|
+
const { requestId } = event.payload;
|
|
383
|
+
const req = this.getByRequestId(requestId);
|
|
384
|
+
if (!req) {
|
|
385
|
+
this.logger.warn("download.failed for unknown requestId", { requestId });
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
this.captureTraceEvent(event, requestId);
|
|
389
|
+
// Transient failure: go back to searching, NEVER to failed (SM1)
|
|
390
|
+
if (req.status === "downloading") {
|
|
391
|
+
this.updateStatus(requestId, "searching", `retrying (attempt ${req.attempts})`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
onImportStarted(event) {
|
|
395
|
+
const { requestId } = event.payload;
|
|
396
|
+
const req = this.getByRequestId(requestId);
|
|
397
|
+
if (!req)
|
|
398
|
+
return;
|
|
399
|
+
if (req.status === "downloaded") {
|
|
400
|
+
this.updateStatus(requestId, "importing");
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
onImportCompleted(event) {
|
|
404
|
+
const { requestId } = event.payload;
|
|
405
|
+
const req = this.getByRequestId(requestId);
|
|
406
|
+
if (!req)
|
|
407
|
+
return;
|
|
408
|
+
if (req.status === "importing") {
|
|
409
|
+
this.updateStatus(requestId, "imported");
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
onImportFailed(event) {
|
|
413
|
+
const payload = event.payload;
|
|
414
|
+
const req = this.getByRequestId(payload.requestId);
|
|
415
|
+
if (!req)
|
|
416
|
+
return;
|
|
417
|
+
if (req.status === "importing") {
|
|
418
|
+
this.updateStatus(payload.requestId, "downloaded", `Import failed: ${payload.error ?? "unknown error"}`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
onRequestFailed(event) {
|
|
422
|
+
const payload = event.payload;
|
|
423
|
+
const req = this.getByRequestId(payload.requestId);
|
|
424
|
+
if (!req) {
|
|
425
|
+
this.logger.warn("request.failed for unknown requestId", {
|
|
426
|
+
requestId: payload.requestId,
|
|
427
|
+
});
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
this.captureTraceEvent(event, payload.requestId);
|
|
431
|
+
// Terminal failure — the ONLY path to 'failed' (SM2, SP1a)
|
|
432
|
+
if (req.status !== "failed" && req.status !== "downloaded" && req.status !== "imported") {
|
|
433
|
+
this.updateStatus(payload.requestId, "failed", payload.reason);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
// ── Internal helpers ──────────────────────────────────────
|
|
437
|
+
/**
|
|
438
|
+
* Update status, optional detail, and optional chosenReleaseId.
|
|
439
|
+
* Emits item.updated on every call (the caller guards transitions,
|
|
440
|
+
* so duplicate emissions are not a concern).
|
|
441
|
+
*/
|
|
442
|
+
updateStatus(requestId, status, detail, chosenReleaseId) {
|
|
443
|
+
this.stmtUpdateStatus.run({
|
|
444
|
+
requestId,
|
|
445
|
+
status,
|
|
446
|
+
detail: detail ?? null,
|
|
447
|
+
chosenReleaseId: chosenReleaseId ?? null,
|
|
448
|
+
});
|
|
449
|
+
// Emit item.updated — the single event the UI relies on (SP2, UI-ST1)
|
|
450
|
+
const payload = {
|
|
451
|
+
requestId,
|
|
452
|
+
status,
|
|
453
|
+
};
|
|
454
|
+
if (detail !== undefined) {
|
|
455
|
+
payload.detail = detail;
|
|
456
|
+
}
|
|
457
|
+
this.bus.emit("item.updated", payload);
|
|
458
|
+
this.logger.debug("status updated", { requestId, status, detail });
|
|
459
|
+
}
|
|
460
|
+
/** Increment the attempts counter by 1. Called on download.started (SM4). */
|
|
461
|
+
incrementAttempts(requestId) {
|
|
462
|
+
this.stmtIncrementAttempts.run({ requestId });
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
//# sourceMappingURL=state-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/state/state-store.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,4DAA4D;AAK5D,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAqDnC,8DAA8D;AAE9D,SAAS,YAAY,CAAC,GAA4B;IAChD,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,aAAa,EAAE,GAAG,CAAC,eAAyB;QAC5C,eAAe,EAAE,GAAG,CAAC,gBAA0B;QAC/C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAc,CAAoB;QACvD,WAAW,EAAE,GAAG,CAAC,aAAuB;QACxC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAkB,CAAa;QACxD,MAAM,EAAE,GAAG,CAAC,MAAuB;QACnC,YAAY,EAAG,GAAG,CAAC,aAAwB,IAAI,SAAS;QACxD,eAAe,EAAG,GAAG,CAAC,iBAA4B,IAAI,SAAS;QAC/D,QAAQ,EAAE,GAAG,CAAC,QAAkB;QAChC,SAAS,EAAG,GAAG,CAAC,UAAqB,IAAI,SAAS;QAClD,SAAS,EAAE,GAAG,CAAC,UAAoB;QACnC,SAAS,EAAE,GAAG,CAAC,UAAoB;KACpC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE;IAChC,MAAM,GAAG,GAAG,GAAG,CAAC,yBAAyB,CAAC;IAC1C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,2DAA2D;QAC3D,4DAA4D;QAC5D,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC,CAAC,EAAE,CAAC;AAEL,8DAA8D;AAE9D,MAAM,OAAO,UAAU;IACb,EAAE,CAAoB;IACtB,GAAG,CAAW;IACd,MAAM,CAAS;IAEvB,oDAAoD;IAC5C,kBAAkB,CAAqB;IACvC,kBAAkB,CAAqB;IACvC,UAAU,CAAqB;IAC/B,gBAAgB,CAAqB;IACrC,qBAAqB,CAAqB;IAC1C,cAAc,CAAqB;IACnC,cAAc,CAAqB;IACnC,eAAe,CAAqB;IACpC,mBAAmB,CAAqB;IACxC,uBAAuB,CAAqB;IAC5C,iBAAiB,CAAqB;IACtC,iBAAiB,CAAqB;IACtC,iBAAiB,CAAqB;IACtC,0BAA0B,CAAqB;IAEvD,YACE,EAAqB,EACrB,GAAa,EACb,MAAc;QAEd,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAE1C,mCAAmC;QACnC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,OAAO,CAClC,8DAA8D,CAC/D,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,OAAO,CAClC;;;eAGS,CACV,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,OAAO,CAC1B;;;;;;;4CAOsC,CACvC,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAChC;;;;;qCAK+B,CAChC,CAAC;QACF,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,OAAO,CACrC;;qCAE+B,CAChC,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,OAAO,CAC9B;;qCAE+B,CAChC,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,OAAO,CAC9B;;;gCAG0B,CAC3B,CAAC;QAEF,kCAAkC;QAClC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,OAAO,CAC/B;yEACmE,CACpE,CAAC;QACF,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC,OAAO,CACnC;;uBAEiB,CAClB,CAAC;QACF,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC,OAAO,CACvC;;uBAEiB,CAClB,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,OAAO,CACjC;;qCAE+B,CAChC,CAAC;QAEF,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,OAAO,CACjC;;;;;;qCAM+B,CAChC,CAAC;QAEF,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,OAAO,CACjC,4DAA4D,CAC7D,CAAC;QACF,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC,OAAO,CAC1C,qDAAqD,CACtD,CAAC;QAEF,wCAAwC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,4DAA4D;IAE5D,0DAA0D;IAC1D,cAAc,CAAC,SAAiB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAExC,CAAC;QACd,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACH,qBAAqB,CAAC,eAAuB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,CAExD,CAAC;QACd,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,IAAwB;QAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,SAAiB,EAAE,MAAc;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,WAAW,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChE,OAAO,CAAC,mBAAmB;QAC7B,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YACtB,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,SAAiB;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAE1D,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,OAAO,EAAE,GAAG,CAAC,QAAkB;YAC/B,SAAS,EAAE,GAAG,CAAC,UAAoB;YACnC,SAAS,EAAE,GAAG,CAAC,UAAoB;YACnC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAoB,CAA4B;YAC1E,SAAS,EAAE,GAAG,CAAC,SAAmB;SACnC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,2DAA2D;IAE3D;;;;;;;;;OASG;IACH,aAAa,CAAC,SAAiB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,uEAAuE;YACvE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;gBACzB,SAAS;gBACT,MAAM,EAAE,8BAA8B;aACvC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;QAEN,2CAA2C;QAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE;YAC5B,SAAS;YACT,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,8BAA8B;SACvC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,2DAA2D;IAE3D;;;;;;OAMG;IACH,aAAa,CAAC,SAAiB;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,+CAA+C;YAC/C,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YAEnD,+BAA+B;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;QAEtB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,uDAAuD;QACvD,+DAA+D;QAC/D,0CAA0C;QAE1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,SAAiB;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,6DAA6D,CAAC;aACtE,GAAG,CAAC,SAAS,CAAyC,CAAC;QAC1D,OAAO,GAAG,EAAE,YAAY,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,yDAAyD,CAAC;aAClE,GAAG,EAAW,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,MAAc;QACvB,2EAA2E;QAC3E,2DAA2D;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YACnC,MAAM;YACN,OAAO,EAAE,KAAK,MAAM,IAAI;SACzB,CAAmC,CAAC;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAChC,CAAC;IAED,4DAA4D;IAE5D;;;;;;OAMG;IACK,iBAAiB,CAAC,KAAiB,EAAE,SAAiB;QAC5D,IAAI,mBAAmB,KAAK,CAAC;YAAE,OAAO;QAEtC,MAAM,SAAS,GAAG;YAChB,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;QAEF,0BAA0B;QAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;YACvB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS;YACT,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;YACpC,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QAEH,wDAAwD;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;YACxC,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAA0B,CAAC;QAE5B,gEAAgE;QAChE,IAAI,IAAI,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,mBAAmB,CAAC;YACjD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAEzD,+CAA+C;YAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;YACzE,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;gBAC3B,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE;gBAChC,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,mBAAmB;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4DAA4D;IAEpD,SAAS;QACf,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,cAAc,CAAC,KAAiB;QACtC,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,OAAgC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,8DAA8D;QAC9D,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5C,CAAC;QACD,6EAA6E;IAC/E,CAAC;IAEO,iBAAiB,CAAC,KAAiB;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,OAGrB,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;gBACzD,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAEjD,oDAAoD;QACpD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE1C,yEAAyE;QACzE,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,SAAS,CAAC;YAC7E,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,KAAiB;QAC3C,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,OAAgC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,kDAAkD;QAClD,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACxF,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,KAAiB;QACxC,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,OAAgC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,iEAAiE;QACjE,IAAI,GAAG,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,YAAY,CACf,SAAS,EACT,WAAW,EACX,qBAAqB,GAAG,CAAC,QAAQ,GAAG,CACrC,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,KAAiB;QACvC,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,OAAgC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAiB;QACzC,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,OAAgC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAiB;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgD,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,EAC/C,kBAAkB,OAAO,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,KAAiB;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiD,CAAC;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBACvD,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,2DAA2D;QAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACxF,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,6DAA6D;IAE7D;;;;OAIG;IACK,YAAY,CAClB,SAAiB,EACjB,MAAqB,EACrB,MAAe,EACf,eAAwB;QAExB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;YACxB,SAAS;YACT,MAAM;YACN,MAAM,EAAE,MAAM,IAAI,IAAI;YACtB,eAAe,EAAE,eAAe,IAAI,IAAI;SACzC,CAAC,CAAC;QAEH,sEAAsE;QACtE,MAAM,OAAO,GAA2D;YACtE,SAAS;YACT,MAAM;SACP,CAAC;QACF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAEvC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,6EAA6E;IACrE,iBAAiB,CAAC,SAAiB;QACzC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TraceEntry, StateStore } from "./state-store.js";
|
|
2
|
+
/**
|
|
3
|
+
* Initialize the trace-store wrapper with a reference to the StateStore.
|
|
4
|
+
* Called from main.ts after the web server and state store are created.
|
|
5
|
+
*/
|
|
6
|
+
export declare function initTraceStore(store: StateStore): void;
|
|
7
|
+
/**
|
|
8
|
+
* Retrieve trace events for a given requestId.
|
|
9
|
+
* Returns an empty array if the state store isn't available or no events exist.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getTraceEvents(requestId: string): TraceEntry[];
|
|
12
|
+
//# sourceMappingURL=trace-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-store.d.ts","sourceRoot":"","sources":["../../src/state/trace-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQ/D;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAEtD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAG9D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// SPDX-License-Identifier: 0BSD
|
|
2
|
+
// SPDX-FileCopyrightText: 2025 Digi <digitalpaws@proton.me>
|
|
3
|
+
/**
|
|
4
|
+
* Module-level reference to the state store, set by the host bootstrap.
|
|
5
|
+
* This avoids circular imports between route modules and the host.
|
|
6
|
+
*/
|
|
7
|
+
let stateStore = null;
|
|
8
|
+
/**
|
|
9
|
+
* Initialize the trace-store wrapper with a reference to the StateStore.
|
|
10
|
+
* Called from main.ts after the web server and state store are created.
|
|
11
|
+
*/
|
|
12
|
+
export function initTraceStore(store) {
|
|
13
|
+
stateStore = store;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Retrieve trace events for a given requestId.
|
|
17
|
+
* Returns an empty array if the state store isn't available or no events exist.
|
|
18
|
+
*/
|
|
19
|
+
export function getTraceEvents(requestId) {
|
|
20
|
+
if (!stateStore)
|
|
21
|
+
return [];
|
|
22
|
+
return stateStore.getTraceLog(requestId);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=trace-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-store.js","sourceRoot":"","sources":["../../src/state/trace-store.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,4DAA4D;AAI5D;;;GAGG;AACH,IAAI,UAAU,GAAsB,IAAI,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,UAAU,GAAG,KAAK,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAC3B,OAAO,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { ContentTypeDescriptor } from "@digitalpaws/starr-types-core";
|
|
2
|
+
export interface PluginMeta {
|
|
3
|
+
id: string;
|
|
4
|
+
version: string;
|
|
5
|
+
starrApiVersion: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ConnectionTestResult {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
message?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PluginLifecycle {
|
|
12
|
+
start?(): void | Promise<void>;
|
|
13
|
+
stop?(): void | Promise<void>;
|
|
14
|
+
testConnection?(values: Record<string, unknown>): ConnectionTestResult | Promise<ConnectionTestResult>;
|
|
15
|
+
}
|
|
16
|
+
export interface Logger {
|
|
17
|
+
debug(message: string, meta?: Record<string, unknown>): void;
|
|
18
|
+
info(message: string, meta?: Record<string, unknown>): void;
|
|
19
|
+
warn(message: string, meta?: Record<string, unknown>): void;
|
|
20
|
+
error(message: string, meta?: Record<string, unknown>): void;
|
|
21
|
+
child(tag: string): Logger;
|
|
22
|
+
}
|
|
23
|
+
export interface StarrEvent<P = unknown> {
|
|
24
|
+
readonly type: string;
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly traceId: string;
|
|
27
|
+
readonly correlationId?: string;
|
|
28
|
+
readonly source: string;
|
|
29
|
+
readonly timestamp: string;
|
|
30
|
+
readonly schemaVersion: number;
|
|
31
|
+
readonly payload: P;
|
|
32
|
+
/** Convenience: emit a correlated reply. */
|
|
33
|
+
reply<R>(type: string, payload: R): void;
|
|
34
|
+
}
|
|
35
|
+
export interface EmitOpts {
|
|
36
|
+
correlationId?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface RequestOpts {
|
|
39
|
+
responseType: string;
|
|
40
|
+
windowMs: number;
|
|
41
|
+
max?: number;
|
|
42
|
+
}
|
|
43
|
+
export type Unsubscribe = () => void;
|
|
44
|
+
export type EventHandler<P = unknown> = (event: StarrEvent<P>) => void | Promise<void>;
|
|
45
|
+
export interface EventBus {
|
|
46
|
+
emit<P>(type: string, payload: P, opts?: EmitOpts): void;
|
|
47
|
+
on<P>(type: string, handler: EventHandler<P>): Unsubscribe;
|
|
48
|
+
request<Res>(type: string, payload: unknown, opts: RequestOpts): Promise<StarrEvent<Res>[]>;
|
|
49
|
+
}
|
|
50
|
+
export interface PluginStorage {
|
|
51
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
52
|
+
set<T>(key: string, value: T): Promise<void>;
|
|
53
|
+
delete(key: string): Promise<void>;
|
|
54
|
+
/** List all keys (optionally filtered by prefix), sorted lexically. */
|
|
55
|
+
list<T>(prefix?: string): Promise<Array<{
|
|
56
|
+
key: string;
|
|
57
|
+
value: T;
|
|
58
|
+
}>>;
|
|
59
|
+
/** Delete all keys for this plugin's namespace. Used during rollback. */
|
|
60
|
+
deleteAll(): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
export interface ContentTypeRegistry {
|
|
63
|
+
/**
|
|
64
|
+
* Register a content-type descriptor. Throws on:
|
|
65
|
+
* - Malformed descriptor (empty identity, list without itemType,
|
|
66
|
+
* enum without options)
|
|
67
|
+
* - Duplicate id already registered by another plugin
|
|
68
|
+
*/
|
|
69
|
+
register(descriptor: ContentTypeDescriptor): void;
|
|
70
|
+
}
|
|
71
|
+
export interface ConfigField {
|
|
72
|
+
type: string;
|
|
73
|
+
label: string;
|
|
74
|
+
required?: boolean;
|
|
75
|
+
default?: unknown;
|
|
76
|
+
options?: string[];
|
|
77
|
+
description?: string;
|
|
78
|
+
group?: string;
|
|
79
|
+
}
|
|
80
|
+
export type ConfigSchema<T> = {
|
|
81
|
+
[K in keyof T]: ConfigField;
|
|
82
|
+
};
|
|
83
|
+
export interface PluginContext {
|
|
84
|
+
readonly apiVersion: string;
|
|
85
|
+
define(meta: PluginMeta): void;
|
|
86
|
+
config<T>(schema: ConfigSchema<T>): Readonly<T>;
|
|
87
|
+
events: EventBus;
|
|
88
|
+
storage: PluginStorage;
|
|
89
|
+
contentTypes: ContentTypeRegistry;
|
|
90
|
+
logger: Logger;
|
|
91
|
+
}
|
|
92
|
+
export type RegisterFn = (ctx: PluginContext) => void | PluginLifecycle | Promise<void | PluginLifecycle>;
|
|
93
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,4DAA4D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Fastify from "fastify";
|
|
2
|
+
import type { Logger } from "../types/plugin.js";
|
|
3
|
+
import type { AuthService } from "../auth/auth-service.js";
|
|
4
|
+
import type { OidcProviderService } from "../auth/oidc/oidc-provider-service.js";
|
|
5
|
+
import type { OidcFlow } from "../auth/oidc/oidc-flow.js";
|
|
6
|
+
import type { UserService } from "../auth/oidc/user-service.js";
|
|
7
|
+
export declare function initAuthService(auth: AuthService): void;
|
|
8
|
+
export declare function initOidcServices(oidcProviders: OidcProviderService, flow: OidcFlow, users: UserService): void;
|
|
9
|
+
export declare function createWebServer(logger: Logger): Promise<Fastify.FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, Fastify.FastifyBaseLogger, Fastify.FastifyTypeProviderDefault>>;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,SAAS,CAAC;AAM9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAQhE,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAEvD;AAOD,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,mBAAmB,EAClC,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,WAAW,GACjB,IAAI,CAIN;AAID,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,sSA2InD"}
|