proofscan 0.1.0 → 0.2.0
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 +210 -60
- package/dist/cli.js +5 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/archive.d.ts +6 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +245 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/index.d.ts +2 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +2 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/monitor.d.ts +1 -1
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +33 -21
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +4 -0
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/sessions.d.ts +6 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +203 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/db/connection.d.ts +28 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +123 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/events-store.d.ts +56 -0
- package/dist/db/events-store.d.ts.map +1 -0
- package/dist/db/events-store.js +269 -0
- package/dist/db/events-store.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +6 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/proofs-store.d.ts +56 -0
- package/dist/db/proofs-store.d.ts.map +1 -0
- package/dist/db/proofs-store.js +116 -0
- package/dist/db/proofs-store.js.map +1 -0
- package/dist/db/schema.d.ts +8 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +76 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/types.d.ts +64 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +5 -0
- package/dist/db/types.js.map +1 -0
- package/dist/index.d.ts +14 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -6
- package/dist/index.js.map +1 -1
- package/dist/scanner/index.d.ts +3 -2
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/index.js +66 -51
- package/dist/scanner/index.js.map +1 -1
- package/dist/types/config.d.ts +7 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/events.d.ts +1 -17
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js +1 -0
- package/dist/types/events.js.map +1 -1
- package/package.json +5 -2
- package/dist/events/index.d.ts +0 -2
- package/dist/events/index.d.ts.map +0 -1
- package/dist/events/index.js +0 -2
- package/dist/events/index.js.map +0 -1
- package/dist/events/store.d.ts +0 -25
- package/dist/events/store.d.ts.map +0 -1
- package/dist/events/store.js +0 -91
- package/dist/events/store.js.map +0 -1
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Events database store - manages sessions, events, and rpc_calls
|
|
3
|
+
*/
|
|
4
|
+
import { randomUUID } from 'crypto';
|
|
5
|
+
import { getEventsDb } from './connection.js';
|
|
6
|
+
export class EventsStore {
|
|
7
|
+
configDir;
|
|
8
|
+
constructor(configDir) {
|
|
9
|
+
this.configDir = configDir;
|
|
10
|
+
}
|
|
11
|
+
get db() {
|
|
12
|
+
return getEventsDb(this.configDir);
|
|
13
|
+
}
|
|
14
|
+
// ==================== Sessions ====================
|
|
15
|
+
createSession(connectorId) {
|
|
16
|
+
const session = {
|
|
17
|
+
session_id: randomUUID(),
|
|
18
|
+
connector_id: connectorId,
|
|
19
|
+
started_at: new Date().toISOString(),
|
|
20
|
+
ended_at: null,
|
|
21
|
+
exit_reason: null,
|
|
22
|
+
protected: 0,
|
|
23
|
+
created_at: new Date().toISOString(),
|
|
24
|
+
};
|
|
25
|
+
const stmt = this.db.prepare(`
|
|
26
|
+
INSERT INTO sessions (session_id, connector_id, started_at, ended_at, exit_reason, protected, created_at)
|
|
27
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
28
|
+
`);
|
|
29
|
+
stmt.run(session.session_id, session.connector_id, session.started_at, session.ended_at, session.exit_reason, session.protected, session.created_at);
|
|
30
|
+
return session;
|
|
31
|
+
}
|
|
32
|
+
endSession(sessionId, exitReason) {
|
|
33
|
+
const stmt = this.db.prepare(`
|
|
34
|
+
UPDATE sessions SET ended_at = ?, exit_reason = ? WHERE session_id = ?
|
|
35
|
+
`);
|
|
36
|
+
stmt.run(new Date().toISOString(), exitReason, sessionId);
|
|
37
|
+
}
|
|
38
|
+
getSession(sessionId) {
|
|
39
|
+
const stmt = this.db.prepare(`SELECT * FROM sessions WHERE session_id = ?`);
|
|
40
|
+
return stmt.get(sessionId);
|
|
41
|
+
}
|
|
42
|
+
getSessionsByConnector(connectorId, limit) {
|
|
43
|
+
let sql = `
|
|
44
|
+
SELECT s.*,
|
|
45
|
+
(SELECT COUNT(*) FROM events WHERE session_id = s.session_id) as event_count,
|
|
46
|
+
(SELECT COUNT(*) FROM rpc_calls WHERE session_id = s.session_id) as rpc_count
|
|
47
|
+
FROM sessions s
|
|
48
|
+
WHERE s.connector_id = ?
|
|
49
|
+
ORDER BY s.started_at DESC
|
|
50
|
+
`;
|
|
51
|
+
if (limit) {
|
|
52
|
+
sql += ` LIMIT ${limit}`;
|
|
53
|
+
}
|
|
54
|
+
const stmt = this.db.prepare(sql);
|
|
55
|
+
return stmt.all(connectorId);
|
|
56
|
+
}
|
|
57
|
+
getAllSessions(limit) {
|
|
58
|
+
let sql = `
|
|
59
|
+
SELECT s.*,
|
|
60
|
+
(SELECT COUNT(*) FROM events WHERE session_id = s.session_id) as event_count,
|
|
61
|
+
(SELECT COUNT(*) FROM rpc_calls WHERE session_id = s.session_id) as rpc_count
|
|
62
|
+
FROM sessions s
|
|
63
|
+
ORDER BY s.started_at DESC
|
|
64
|
+
`;
|
|
65
|
+
if (limit) {
|
|
66
|
+
sql += ` LIMIT ${limit}`;
|
|
67
|
+
}
|
|
68
|
+
const stmt = this.db.prepare(sql);
|
|
69
|
+
return stmt.all();
|
|
70
|
+
}
|
|
71
|
+
protectSession(sessionId) {
|
|
72
|
+
const stmt = this.db.prepare(`UPDATE sessions SET protected = 1 WHERE session_id = ?`);
|
|
73
|
+
stmt.run(sessionId);
|
|
74
|
+
}
|
|
75
|
+
// ==================== Events ====================
|
|
76
|
+
saveEvent(sessionId, direction, kind, options = {}) {
|
|
77
|
+
const event = {
|
|
78
|
+
event_id: randomUUID(),
|
|
79
|
+
session_id: sessionId,
|
|
80
|
+
rpc_id: options.rpcId || null,
|
|
81
|
+
direction,
|
|
82
|
+
kind,
|
|
83
|
+
ts: new Date().toISOString(),
|
|
84
|
+
raw_json: options.rawJson || null,
|
|
85
|
+
};
|
|
86
|
+
const stmt = this.db.prepare(`
|
|
87
|
+
INSERT INTO events (event_id, session_id, rpc_id, direction, kind, ts, raw_json)
|
|
88
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
89
|
+
`);
|
|
90
|
+
stmt.run(event.event_id, event.session_id, event.rpc_id, event.direction, event.kind, event.ts, event.raw_json);
|
|
91
|
+
return event;
|
|
92
|
+
}
|
|
93
|
+
getEventsBySession(sessionId, limit) {
|
|
94
|
+
let sql = `SELECT * FROM events WHERE session_id = ? ORDER BY ts ASC`;
|
|
95
|
+
if (limit) {
|
|
96
|
+
sql += ` LIMIT ${limit}`;
|
|
97
|
+
}
|
|
98
|
+
const stmt = this.db.prepare(sql);
|
|
99
|
+
return stmt.all(sessionId);
|
|
100
|
+
}
|
|
101
|
+
getRecentEventsByConnector(connectorId, limit = 20) {
|
|
102
|
+
const stmt = this.db.prepare(`
|
|
103
|
+
SELECT e.* FROM events e
|
|
104
|
+
JOIN sessions s ON e.session_id = s.session_id
|
|
105
|
+
WHERE s.connector_id = ?
|
|
106
|
+
ORDER BY e.ts DESC
|
|
107
|
+
LIMIT ?
|
|
108
|
+
`);
|
|
109
|
+
const events = stmt.all(connectorId, limit);
|
|
110
|
+
return events.reverse(); // Return in chronological order
|
|
111
|
+
}
|
|
112
|
+
// ==================== RPC Calls ====================
|
|
113
|
+
saveRpcCall(sessionId, rpcId, method) {
|
|
114
|
+
const rpcCall = {
|
|
115
|
+
rpc_id: rpcId,
|
|
116
|
+
session_id: sessionId,
|
|
117
|
+
method,
|
|
118
|
+
request_ts: new Date().toISOString(),
|
|
119
|
+
response_ts: null,
|
|
120
|
+
success: null,
|
|
121
|
+
error_code: null,
|
|
122
|
+
};
|
|
123
|
+
const stmt = this.db.prepare(`
|
|
124
|
+
INSERT INTO rpc_calls (rpc_id, session_id, method, request_ts, response_ts, success, error_code)
|
|
125
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
126
|
+
`);
|
|
127
|
+
stmt.run(rpcCall.rpc_id, rpcCall.session_id, rpcCall.method, rpcCall.request_ts, rpcCall.response_ts, rpcCall.success, rpcCall.error_code);
|
|
128
|
+
return rpcCall;
|
|
129
|
+
}
|
|
130
|
+
completeRpcCall(sessionId, rpcId, success, errorCode) {
|
|
131
|
+
const stmt = this.db.prepare(`
|
|
132
|
+
UPDATE rpc_calls
|
|
133
|
+
SET response_ts = ?, success = ?, error_code = ?
|
|
134
|
+
WHERE session_id = ? AND rpc_id = ?
|
|
135
|
+
`);
|
|
136
|
+
stmt.run(new Date().toISOString(), success ? 1 : 0, errorCode || null, sessionId, rpcId);
|
|
137
|
+
}
|
|
138
|
+
getRpcCallsBySession(sessionId) {
|
|
139
|
+
const stmt = this.db.prepare(`
|
|
140
|
+
SELECT * FROM rpc_calls WHERE session_id = ? ORDER BY request_ts ASC
|
|
141
|
+
`);
|
|
142
|
+
return stmt.all(sessionId);
|
|
143
|
+
}
|
|
144
|
+
// ==================== Prune / Archive ====================
|
|
145
|
+
/**
|
|
146
|
+
* Get sessions that can be pruned (not protected)
|
|
147
|
+
*/
|
|
148
|
+
getPruneCandidates(options = {}) {
|
|
149
|
+
const { keepLast, before, connectorId } = options;
|
|
150
|
+
const candidates = [];
|
|
151
|
+
// Get all unprotected sessions
|
|
152
|
+
let sql = `
|
|
153
|
+
SELECT s.session_id, s.connector_id, s.started_at, s.protected,
|
|
154
|
+
(SELECT COUNT(*) FROM events WHERE session_id = s.session_id) as event_count
|
|
155
|
+
FROM sessions s
|
|
156
|
+
WHERE s.protected = 0
|
|
157
|
+
`;
|
|
158
|
+
const params = [];
|
|
159
|
+
if (connectorId) {
|
|
160
|
+
sql += ` AND s.connector_id = ?`;
|
|
161
|
+
params.push(connectorId);
|
|
162
|
+
}
|
|
163
|
+
if (before) {
|
|
164
|
+
sql += ` AND s.started_at < ?`;
|
|
165
|
+
params.push(before);
|
|
166
|
+
}
|
|
167
|
+
sql += ` ORDER BY s.started_at DESC`;
|
|
168
|
+
const stmt = this.db.prepare(sql);
|
|
169
|
+
const sessions = stmt.all(...params);
|
|
170
|
+
// Apply keepLast logic per connector
|
|
171
|
+
if (keepLast !== undefined) {
|
|
172
|
+
const byConnector = new Map();
|
|
173
|
+
for (const s of sessions) {
|
|
174
|
+
if (!byConnector.has(s.connector_id)) {
|
|
175
|
+
byConnector.set(s.connector_id, []);
|
|
176
|
+
}
|
|
177
|
+
byConnector.get(s.connector_id).push(s);
|
|
178
|
+
}
|
|
179
|
+
for (const [cid, connectorSessions] of byConnector) {
|
|
180
|
+
// Skip the first N (most recent) sessions
|
|
181
|
+
for (let i = keepLast; i < connectorSessions.length; i++) {
|
|
182
|
+
const s = connectorSessions[i];
|
|
183
|
+
candidates.push({
|
|
184
|
+
...s,
|
|
185
|
+
reason: `Exceeds keep_last_sessions (${keepLast})`,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// If no keepLast, all matched sessions are candidates
|
|
192
|
+
for (const s of sessions) {
|
|
193
|
+
candidates.push({
|
|
194
|
+
...s,
|
|
195
|
+
reason: before ? `Before ${before}` : 'Manual selection',
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return candidates;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Delete sessions and all related data
|
|
203
|
+
*/
|
|
204
|
+
deleteSessions(sessionIds) {
|
|
205
|
+
if (sessionIds.length === 0)
|
|
206
|
+
return 0;
|
|
207
|
+
const transaction = this.db.transaction((ids) => {
|
|
208
|
+
// With CASCADE, deleting sessions will delete events and rpc_calls
|
|
209
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
210
|
+
const stmt = this.db.prepare(`DELETE FROM sessions WHERE session_id IN (${placeholders}) AND protected = 0`);
|
|
211
|
+
const result = stmt.run(...ids);
|
|
212
|
+
return result.changes;
|
|
213
|
+
});
|
|
214
|
+
return transaction(sessionIds);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Clear raw_json from old events (keep metadata)
|
|
218
|
+
*/
|
|
219
|
+
clearRawJson(options) {
|
|
220
|
+
let sql = `UPDATE events SET raw_json = NULL WHERE raw_json IS NOT NULL`;
|
|
221
|
+
const params = [];
|
|
222
|
+
if (options.beforeDays !== undefined) {
|
|
223
|
+
const cutoff = new Date();
|
|
224
|
+
cutoff.setDate(cutoff.getDate() - options.beforeDays);
|
|
225
|
+
sql += ` AND ts < ?`;
|
|
226
|
+
params.push(cutoff.toISOString());
|
|
227
|
+
}
|
|
228
|
+
if (options.sessionIds && options.sessionIds.length > 0) {
|
|
229
|
+
const placeholders = options.sessionIds.map(() => '?').join(',');
|
|
230
|
+
sql += ` AND session_id IN (${placeholders})`;
|
|
231
|
+
params.push(...options.sessionIds);
|
|
232
|
+
}
|
|
233
|
+
// Exclude protected sessions
|
|
234
|
+
sql += ` AND session_id NOT IN (SELECT session_id FROM sessions WHERE protected = 1)`;
|
|
235
|
+
const stmt = this.db.prepare(sql);
|
|
236
|
+
const result = stmt.run(...params);
|
|
237
|
+
return result.changes;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get count of events with raw_json that can be cleared
|
|
241
|
+
*/
|
|
242
|
+
countClearableRawJson(beforeDays) {
|
|
243
|
+
const cutoff = new Date();
|
|
244
|
+
cutoff.setDate(cutoff.getDate() - beforeDays);
|
|
245
|
+
const stmt = this.db.prepare(`
|
|
246
|
+
SELECT COUNT(*) as count FROM events
|
|
247
|
+
WHERE raw_json IS NOT NULL
|
|
248
|
+
AND ts < ?
|
|
249
|
+
AND session_id NOT IN (SELECT session_id FROM sessions WHERE protected = 1)
|
|
250
|
+
`);
|
|
251
|
+
const result = stmt.get(cutoff.toISOString());
|
|
252
|
+
return result.count;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get total size of raw_json data
|
|
256
|
+
*/
|
|
257
|
+
getRawJsonSize() {
|
|
258
|
+
const stmt = this.db.prepare(`SELECT SUM(LENGTH(raw_json)) as size FROM events WHERE raw_json IS NOT NULL`);
|
|
259
|
+
const result = stmt.get();
|
|
260
|
+
return result.size || 0;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Vacuum database to reclaim space
|
|
264
|
+
*/
|
|
265
|
+
vacuum() {
|
|
266
|
+
this.db.exec('VACUUM');
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=events-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events-store.js","sourceRoot":"","sources":["../../src/db/events-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAY9C,MAAM,OAAO,WAAW;IACd,SAAS,CAAU;IAE3B,YAAY,SAAkB;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,IAAY,EAAE;QACZ,OAAO,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,qDAAqD;IAErD,aAAa,CAAC,WAAmB;QAC/B,MAAM,OAAO,GAAY;YACvB,UAAU,EAAE,UAAU,EAAE;YACxB,YAAY,EAAE,WAAW;YACzB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,UAAU,CACnB,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,SAAiB,EAAE,UAAsB;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;KAE5B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAmB,CAAC;IAC/C,CAAC;IAED,sBAAsB,CAAC,WAAmB,EAAE,KAAc;QACxD,IAAI,GAAG,GAAG;;;;;;;KAOT,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,IAAI,UAAU,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAuB,CAAC;IACrD,CAAC;IAED,cAAc,CAAC,KAAc;QAC3B,IAAI,GAAG,GAAG;;;;;;KAMT,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,IAAI,UAAU,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,GAAG,EAAwB,CAAC;IAC1C,CAAC;IAED,cAAc,CAAC,SAAiB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC;IAED,mDAAmD;IAEnD,SAAS,CACP,SAAiB,EACjB,SAAyB,EACzB,IAAe,EACf,UAGI,EAAE;QAEN,MAAM,KAAK,GAAU;YACnB,QAAQ,EAAE,UAAU,EAAE;YACtB,UAAU,EAAE,SAAS;YACrB,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;YAC7B,SAAS;YACT,IAAI;YACJ,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;SAClC,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,QAAQ,CACf,CAAC;QAEF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,kBAAkB,CAAC,SAAiB,EAAE,KAAc;QAClD,IAAI,GAAG,GAAG,2DAA2D,CAAC;QACtE,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,IAAI,UAAU,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAY,CAAC;IACxC,CAAC;IAED,0BAA0B,CAAC,WAAmB,EAAE,QAAgB,EAAE;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAY,CAAC;QACvD,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,gCAAgC;IAC3D,CAAC;IAED,sDAAsD;IAEtD,WAAW,CACT,SAAiB,EACjB,KAAa,EACb,MAAc;QAEd,MAAM,OAAO,GAAY;YACvB,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,SAAS;YACrB,MAAM;YACN,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;SACjB,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CACN,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,UAAU,CACnB,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,eAAe,CACb,SAAiB,EACjB,KAAa,EACb,OAAgB,EAChB,SAAkB;QAElB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;KAI5B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CACN,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EACxB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACf,SAAS,IAAI,IAAI,EACjB,SAAS,EACT,KAAK,CACN,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,SAAiB;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;KAE5B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAc,CAAC;IAC1C,CAAC;IAED,4DAA4D;IAE5D;;OAEG;IACH,kBAAkB,CAAC,UAIf,EAAE;QACJ,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAClD,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,+BAA+B;QAC/B,IAAI,GAAG,GAAG;;;;;KAKT,CAAC;QACF,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,IAAI,yBAAyB,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,IAAI,uBAAuB,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QAED,GAAG,IAAI,6BAA6B,CAAC;QAErC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAMjC,CAAC;QAEH,qCAAqC;QACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;YACvD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;oBACrC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBACtC,CAAC;gBACD,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;YAED,KAAK,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,WAAW,EAAE,CAAC;gBACnD,0CAA0C;gBAC1C,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzD,MAAM,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;oBAC/B,UAAU,CAAC,IAAI,CAAC;wBACd,GAAG,CAAC;wBACJ,MAAM,EAAE,+BAA+B,QAAQ,GAAG;qBACnD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,sDAAsD;YACtD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,CAAC;oBACJ,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,kBAAkB;iBACzD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,UAAoB;QACjC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEtC,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,GAAa,EAAE,EAAE;YACxD,mEAAmE;YACnE,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,YAAY,qBAAqB,CAAC,CAAC;YAC7G,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;YAChC,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAGZ;QACC,IAAI,GAAG,GAAG,8DAA8D,CAAC;QACzE,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YACtD,GAAG,IAAI,aAAa,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjE,GAAG,IAAI,uBAAuB,YAAY,GAAG,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAED,6BAA6B;QAC7B,GAAG,IAAI,8EAA8E,CAAC;QAEtF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,UAAkB;QACtC,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;QAE9C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAsB,CAAC;QACnE,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6EAA6E,CAAC,CAAC;QAC5G,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAA6B,CAAC;QACrD,OAAO,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proofs database store - manages immutable proof records
|
|
3
|
+
*/
|
|
4
|
+
import type { Proof } from './types.js';
|
|
5
|
+
export declare class ProofsStore {
|
|
6
|
+
private configDir?;
|
|
7
|
+
constructor(configDir?: string);
|
|
8
|
+
private get db();
|
|
9
|
+
/**
|
|
10
|
+
* Create a new proof record
|
|
11
|
+
*/
|
|
12
|
+
createProof(params: {
|
|
13
|
+
connectorId: string;
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
rpcId?: string;
|
|
16
|
+
method?: string;
|
|
17
|
+
payload: string | Buffer;
|
|
18
|
+
hashAlgo?: string;
|
|
19
|
+
inscriberType: string;
|
|
20
|
+
inscriberRef: string;
|
|
21
|
+
artifactUri?: string;
|
|
22
|
+
}): Proof;
|
|
23
|
+
/**
|
|
24
|
+
* Get proof by ID
|
|
25
|
+
*/
|
|
26
|
+
getProof(proofId: string): Proof | null;
|
|
27
|
+
/**
|
|
28
|
+
* Get proofs by connector
|
|
29
|
+
*/
|
|
30
|
+
getProofsByConnector(connectorId: string, limit?: number): Proof[];
|
|
31
|
+
/**
|
|
32
|
+
* Get proofs by session
|
|
33
|
+
*/
|
|
34
|
+
getProofsBySession(sessionId: string): Proof[];
|
|
35
|
+
/**
|
|
36
|
+
* Get all proofs
|
|
37
|
+
*/
|
|
38
|
+
getAllProofs(limit?: number): Proof[];
|
|
39
|
+
/**
|
|
40
|
+
* Check if a session has associated proofs
|
|
41
|
+
*/
|
|
42
|
+
hasProofsForSession(sessionId: string): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Get all session IDs that have proofs
|
|
45
|
+
*/
|
|
46
|
+
getProtectedSessionIds(): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Count total proofs
|
|
49
|
+
*/
|
|
50
|
+
countProofs(): number;
|
|
51
|
+
/**
|
|
52
|
+
* Update artifact URI (e.g., after IPFS upload)
|
|
53
|
+
*/
|
|
54
|
+
updateArtifactUri(proofId: string, artifactUri: string): void;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=proofs-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofs-store.d.ts","sourceRoot":"","sources":["../../src/db/proofs-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAC,CAAS;gBAEf,SAAS,CAAC,EAAE,MAAM;IAI9B,OAAO,KAAK,EAAE,GAEb;IAED;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;QACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,KAAK;IA6CT;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAKvC;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE;IASlE;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE;IAO9C;;OAEG;IACH,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE;IASrC;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAM/C;;OAEG;IACH,sBAAsB,IAAI,MAAM,EAAE;IAMlC;;OAEG;IACH,WAAW,IAAI,MAAM;IAMrB;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;CAI9D"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proofs database store - manages immutable proof records
|
|
3
|
+
*/
|
|
4
|
+
import { randomUUID } from 'crypto';
|
|
5
|
+
import { createHash } from 'crypto';
|
|
6
|
+
import { getProofsDb } from './connection.js';
|
|
7
|
+
export class ProofsStore {
|
|
8
|
+
configDir;
|
|
9
|
+
constructor(configDir) {
|
|
10
|
+
this.configDir = configDir;
|
|
11
|
+
}
|
|
12
|
+
get db() {
|
|
13
|
+
return getProofsDb(this.configDir);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a new proof record
|
|
17
|
+
*/
|
|
18
|
+
createProof(params) {
|
|
19
|
+
const hashAlgo = params.hashAlgo || 'sha256';
|
|
20
|
+
const payloadHash = createHash(hashAlgo)
|
|
21
|
+
.update(typeof params.payload === 'string' ? params.payload : params.payload)
|
|
22
|
+
.digest('hex');
|
|
23
|
+
const proof = {
|
|
24
|
+
proof_id: randomUUID(),
|
|
25
|
+
connector_id: params.connectorId,
|
|
26
|
+
session_id: params.sessionId || null,
|
|
27
|
+
rpc_id: params.rpcId || null,
|
|
28
|
+
method: params.method || null,
|
|
29
|
+
payload_hash: payloadHash,
|
|
30
|
+
hash_algo: hashAlgo,
|
|
31
|
+
inscriber_type: params.inscriberType,
|
|
32
|
+
inscriber_ref: params.inscriberRef,
|
|
33
|
+
artifact_uri: params.artifactUri || null,
|
|
34
|
+
created_at: new Date().toISOString(),
|
|
35
|
+
};
|
|
36
|
+
const stmt = this.db.prepare(`
|
|
37
|
+
INSERT INTO proofs (
|
|
38
|
+
proof_id, connector_id, session_id, rpc_id, method,
|
|
39
|
+
payload_hash, hash_algo, inscriber_type, inscriber_ref,
|
|
40
|
+
artifact_uri, created_at
|
|
41
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
42
|
+
`);
|
|
43
|
+
stmt.run(proof.proof_id, proof.connector_id, proof.session_id, proof.rpc_id, proof.method, proof.payload_hash, proof.hash_algo, proof.inscriber_type, proof.inscriber_ref, proof.artifact_uri, proof.created_at);
|
|
44
|
+
return proof;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get proof by ID
|
|
48
|
+
*/
|
|
49
|
+
getProof(proofId) {
|
|
50
|
+
const stmt = this.db.prepare(`SELECT * FROM proofs WHERE proof_id = ?`);
|
|
51
|
+
return stmt.get(proofId);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get proofs by connector
|
|
55
|
+
*/
|
|
56
|
+
getProofsByConnector(connectorId, limit) {
|
|
57
|
+
let sql = `SELECT * FROM proofs WHERE connector_id = ? ORDER BY created_at DESC`;
|
|
58
|
+
if (limit) {
|
|
59
|
+
sql += ` LIMIT ${limit}`;
|
|
60
|
+
}
|
|
61
|
+
const stmt = this.db.prepare(sql);
|
|
62
|
+
return stmt.all(connectorId);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get proofs by session
|
|
66
|
+
*/
|
|
67
|
+
getProofsBySession(sessionId) {
|
|
68
|
+
const stmt = this.db.prepare(`
|
|
69
|
+
SELECT * FROM proofs WHERE session_id = ? ORDER BY created_at ASC
|
|
70
|
+
`);
|
|
71
|
+
return stmt.all(sessionId);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get all proofs
|
|
75
|
+
*/
|
|
76
|
+
getAllProofs(limit) {
|
|
77
|
+
let sql = `SELECT * FROM proofs ORDER BY created_at DESC`;
|
|
78
|
+
if (limit) {
|
|
79
|
+
sql += ` LIMIT ${limit}`;
|
|
80
|
+
}
|
|
81
|
+
const stmt = this.db.prepare(sql);
|
|
82
|
+
return stmt.all();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if a session has associated proofs
|
|
86
|
+
*/
|
|
87
|
+
hasProofsForSession(sessionId) {
|
|
88
|
+
const stmt = this.db.prepare(`SELECT COUNT(*) as count FROM proofs WHERE session_id = ?`);
|
|
89
|
+
const result = stmt.get(sessionId);
|
|
90
|
+
return result.count > 0;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get all session IDs that have proofs
|
|
94
|
+
*/
|
|
95
|
+
getProtectedSessionIds() {
|
|
96
|
+
const stmt = this.db.prepare(`SELECT DISTINCT session_id FROM proofs WHERE session_id IS NOT NULL`);
|
|
97
|
+
const results = stmt.all();
|
|
98
|
+
return results.map(r => r.session_id);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Count total proofs
|
|
102
|
+
*/
|
|
103
|
+
countProofs() {
|
|
104
|
+
const stmt = this.db.prepare(`SELECT COUNT(*) as count FROM proofs`);
|
|
105
|
+
const result = stmt.get();
|
|
106
|
+
return result.count;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Update artifact URI (e.g., after IPFS upload)
|
|
110
|
+
*/
|
|
111
|
+
updateArtifactUri(proofId, artifactUri) {
|
|
112
|
+
const stmt = this.db.prepare(`UPDATE proofs SET artifact_uri = ? WHERE proof_id = ?`);
|
|
113
|
+
stmt.run(artifactUri, proofId);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=proofs-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proofs-store.js","sourceRoot":"","sources":["../../src/db/proofs-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database schema definitions and migrations
|
|
3
|
+
*/
|
|
4
|
+
export declare const EVENTS_DB_VERSION = 1;
|
|
5
|
+
export declare const PROOFS_DB_VERSION = 1;
|
|
6
|
+
export declare const EVENTS_DB_SCHEMA = "\n-- Sessions table\nCREATE TABLE IF NOT EXISTS sessions (\n session_id TEXT PRIMARY KEY,\n connector_id TEXT NOT NULL,\n started_at TEXT NOT NULL,\n ended_at TEXT,\n exit_reason TEXT CHECK(exit_reason IN ('normal', 'error', 'killed')),\n protected INTEGER DEFAULT 0,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_sessions_connector ON sessions(connector_id);\nCREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at);\nCREATE INDEX IF NOT EXISTS idx_sessions_protected ON sessions(protected);\n\n-- RPC calls table\nCREATE TABLE IF NOT EXISTS rpc_calls (\n rpc_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n method TEXT NOT NULL,\n request_ts TEXT NOT NULL,\n response_ts TEXT,\n success INTEGER,\n error_code INTEGER,\n PRIMARY KEY (rpc_id, session_id),\n FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_rpc_calls_session ON rpc_calls(session_id);\nCREATE INDEX IF NOT EXISTS idx_rpc_calls_method ON rpc_calls(method);\n\n-- Events table\nCREATE TABLE IF NOT EXISTS events (\n event_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n rpc_id TEXT,\n direction TEXT NOT NULL CHECK(direction IN ('client_to_server', 'server_to_client')),\n kind TEXT NOT NULL CHECK(kind IN ('request', 'response', 'notification', 'transport_event')),\n ts TEXT NOT NULL,\n raw_json TEXT,\n FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE\n);\n\nCREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);\nCREATE INDEX IF NOT EXISTS idx_events_ts ON events(ts);\nCREATE INDEX IF NOT EXISTS idx_events_rpc ON events(rpc_id);\n";
|
|
7
|
+
export declare const PROOFS_DB_SCHEMA = "\n-- Proofs table (immutable, never pruned)\nCREATE TABLE IF NOT EXISTS proofs (\n proof_id TEXT PRIMARY KEY,\n connector_id TEXT NOT NULL,\n session_id TEXT,\n rpc_id TEXT,\n method TEXT,\n payload_hash TEXT NOT NULL,\n hash_algo TEXT NOT NULL,\n inscriber_type TEXT NOT NULL,\n inscriber_ref TEXT NOT NULL,\n artifact_uri TEXT,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_proofs_connector ON proofs(connector_id);\nCREATE INDEX IF NOT EXISTS idx_proofs_session ON proofs(session_id);\nCREATE INDEX IF NOT EXISTS idx_proofs_created ON proofs(created_at);\n";
|
|
8
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAGnC,eAAO,MAAM,gBAAgB,woDA+C5B,CAAC;AAGF,eAAO,MAAM,gBAAgB,klBAmB5B,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database schema definitions and migrations
|
|
3
|
+
*/
|
|
4
|
+
export const EVENTS_DB_VERSION = 1;
|
|
5
|
+
export const PROOFS_DB_VERSION = 1;
|
|
6
|
+
// events.db schema
|
|
7
|
+
export const EVENTS_DB_SCHEMA = `
|
|
8
|
+
-- Sessions table
|
|
9
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
10
|
+
session_id TEXT PRIMARY KEY,
|
|
11
|
+
connector_id TEXT NOT NULL,
|
|
12
|
+
started_at TEXT NOT NULL,
|
|
13
|
+
ended_at TEXT,
|
|
14
|
+
exit_reason TEXT CHECK(exit_reason IN ('normal', 'error', 'killed')),
|
|
15
|
+
protected INTEGER DEFAULT 0,
|
|
16
|
+
created_at TEXT NOT NULL
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_connector ON sessions(connector_id);
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at);
|
|
21
|
+
CREATE INDEX IF NOT EXISTS idx_sessions_protected ON sessions(protected);
|
|
22
|
+
|
|
23
|
+
-- RPC calls table
|
|
24
|
+
CREATE TABLE IF NOT EXISTS rpc_calls (
|
|
25
|
+
rpc_id TEXT NOT NULL,
|
|
26
|
+
session_id TEXT NOT NULL,
|
|
27
|
+
method TEXT NOT NULL,
|
|
28
|
+
request_ts TEXT NOT NULL,
|
|
29
|
+
response_ts TEXT,
|
|
30
|
+
success INTEGER,
|
|
31
|
+
error_code INTEGER,
|
|
32
|
+
PRIMARY KEY (rpc_id, session_id),
|
|
33
|
+
FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_rpc_calls_session ON rpc_calls(session_id);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_rpc_calls_method ON rpc_calls(method);
|
|
38
|
+
|
|
39
|
+
-- Events table
|
|
40
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
41
|
+
event_id TEXT PRIMARY KEY,
|
|
42
|
+
session_id TEXT NOT NULL,
|
|
43
|
+
rpc_id TEXT,
|
|
44
|
+
direction TEXT NOT NULL CHECK(direction IN ('client_to_server', 'server_to_client')),
|
|
45
|
+
kind TEXT NOT NULL CHECK(kind IN ('request', 'response', 'notification', 'transport_event')),
|
|
46
|
+
ts TEXT NOT NULL,
|
|
47
|
+
raw_json TEXT,
|
|
48
|
+
FOREIGN KEY (session_id) REFERENCES sessions(session_id) ON DELETE CASCADE
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_events_ts ON events(ts);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_events_rpc ON events(rpc_id);
|
|
54
|
+
`;
|
|
55
|
+
// proofs.db schema
|
|
56
|
+
export const PROOFS_DB_SCHEMA = `
|
|
57
|
+
-- Proofs table (immutable, never pruned)
|
|
58
|
+
CREATE TABLE IF NOT EXISTS proofs (
|
|
59
|
+
proof_id TEXT PRIMARY KEY,
|
|
60
|
+
connector_id TEXT NOT NULL,
|
|
61
|
+
session_id TEXT,
|
|
62
|
+
rpc_id TEXT,
|
|
63
|
+
method TEXT,
|
|
64
|
+
payload_hash TEXT NOT NULL,
|
|
65
|
+
hash_algo TEXT NOT NULL,
|
|
66
|
+
inscriber_type TEXT NOT NULL,
|
|
67
|
+
inscriber_ref TEXT NOT NULL,
|
|
68
|
+
artifact_uri TEXT,
|
|
69
|
+
created_at TEXT NOT NULL
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_proofs_connector ON proofs(connector_id);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS idx_proofs_session ON proofs(session_id);
|
|
74
|
+
CREATE INDEX IF NOT EXISTS idx_proofs_created ON proofs(created_at);
|
|
75
|
+
`;
|
|
76
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,mBAAmB;AACnB,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+C/B,CAAC;AAEF,mBAAmB;AACnB,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;CAmB/B,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database types for Phase2
|
|
3
|
+
*/
|
|
4
|
+
export type ExitReason = 'normal' | 'error' | 'killed';
|
|
5
|
+
export type EventDirection = 'client_to_server' | 'server_to_client';
|
|
6
|
+
export type EventKind = 'request' | 'response' | 'notification' | 'transport_event';
|
|
7
|
+
export interface Session {
|
|
8
|
+
session_id: string;
|
|
9
|
+
connector_id: string;
|
|
10
|
+
started_at: string;
|
|
11
|
+
ended_at: string | null;
|
|
12
|
+
exit_reason: ExitReason | null;
|
|
13
|
+
protected: number;
|
|
14
|
+
created_at: string;
|
|
15
|
+
}
|
|
16
|
+
export interface RpcCall {
|
|
17
|
+
rpc_id: string;
|
|
18
|
+
session_id: string;
|
|
19
|
+
method: string;
|
|
20
|
+
request_ts: string;
|
|
21
|
+
response_ts: string | null;
|
|
22
|
+
success: number | null;
|
|
23
|
+
error_code: number | null;
|
|
24
|
+
}
|
|
25
|
+
export interface Event {
|
|
26
|
+
event_id: string;
|
|
27
|
+
session_id: string;
|
|
28
|
+
rpc_id: string | null;
|
|
29
|
+
direction: EventDirection;
|
|
30
|
+
kind: EventKind;
|
|
31
|
+
ts: string;
|
|
32
|
+
raw_json: string | null;
|
|
33
|
+
}
|
|
34
|
+
export interface Proof {
|
|
35
|
+
proof_id: string;
|
|
36
|
+
connector_id: string;
|
|
37
|
+
session_id: string | null;
|
|
38
|
+
rpc_id: string | null;
|
|
39
|
+
method: string | null;
|
|
40
|
+
payload_hash: string;
|
|
41
|
+
hash_algo: string;
|
|
42
|
+
inscriber_type: string;
|
|
43
|
+
inscriber_ref: string;
|
|
44
|
+
artifact_uri: string | null;
|
|
45
|
+
created_at: string;
|
|
46
|
+
}
|
|
47
|
+
export interface SessionWithStats extends Session {
|
|
48
|
+
event_count?: number;
|
|
49
|
+
rpc_count?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface PruneCandidate {
|
|
52
|
+
session_id: string;
|
|
53
|
+
connector_id: string;
|
|
54
|
+
started_at: string;
|
|
55
|
+
event_count: number;
|
|
56
|
+
protected: number;
|
|
57
|
+
reason: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ArchivePlan {
|
|
60
|
+
sessions_to_delete: PruneCandidate[];
|
|
61
|
+
raw_json_to_clear: number;
|
|
62
|
+
estimated_savings_mb: number;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAGvD,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AACrE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,iBAAiB,CAAC;AAGpF,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAGD,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,cAAc,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAGD,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,gBAAiB,SAAQ,OAAO;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,kBAAkB,EAAE,cAAc,EAAE,CAAC;IACrC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;CAC9B"}
|
package/dist/db/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|