@vorionsys/proof-plane 0.1.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/dist/events/event-emitter.d.ts +140 -0
- package/dist/events/event-emitter.d.ts.map +1 -0
- package/dist/events/event-emitter.js +235 -0
- package/dist/events/event-emitter.js.map +1 -0
- package/dist/events/event-signatures.d.ts +154 -0
- package/dist/events/event-signatures.d.ts.map +1 -0
- package/dist/events/event-signatures.js +302 -0
- package/dist/events/event-signatures.js.map +1 -0
- package/dist/events/event-store.d.ts +159 -0
- package/dist/events/event-store.d.ts.map +1 -0
- package/dist/events/event-store.js +36 -0
- package/dist/events/event-store.js.map +1 -0
- package/dist/events/hash-chain.d.ts +63 -0
- package/dist/events/hash-chain.d.ts.map +1 -0
- package/dist/events/hash-chain.js +135 -0
- package/dist/events/hash-chain.js.map +1 -0
- package/dist/events/index.d.ts +9 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +9 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/memory-store.d.ts +82 -0
- package/dist/events/memory-store.d.ts.map +1 -0
- package/dist/events/memory-store.js +215 -0
- package/dist/events/memory-store.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/proof-plane/index.d.ts +6 -0
- package/dist/proof-plane/index.d.ts.map +1 -0
- package/dist/proof-plane/index.js +6 -0
- package/dist/proof-plane/index.js.map +1 -0
- package/dist/proof-plane/logger.d.ts +47 -0
- package/dist/proof-plane/logger.d.ts.map +1 -0
- package/dist/proof-plane/logger.js +48 -0
- package/dist/proof-plane/logger.js.map +1 -0
- package/dist/proof-plane/proof-plane.d.ts +263 -0
- package/dist/proof-plane/proof-plane.d.ts.map +1 -0
- package/dist/proof-plane/proof-plane.js +431 -0
- package/dist/proof-plane/proof-plane.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Signatures - Ed25519 Digital Signatures for Proof Events
|
|
3
|
+
*
|
|
4
|
+
* Provides cryptographic signing and verification for proof events,
|
|
5
|
+
* ensuring authenticity and non-repudiation in the audit trail.
|
|
6
|
+
*
|
|
7
|
+
* Uses Ed25519 (EdDSA) which provides:
|
|
8
|
+
* - 128-bit security level
|
|
9
|
+
* - Small signatures (64 bytes)
|
|
10
|
+
* - Fast signing and verification
|
|
11
|
+
* - Deterministic signatures (no random nonce needed)
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Recursively sort object keys for deterministic serialization
|
|
15
|
+
*/
|
|
16
|
+
function sortObjectKeys(obj) {
|
|
17
|
+
if (obj === null || typeof obj !== 'object') {
|
|
18
|
+
return obj;
|
|
19
|
+
}
|
|
20
|
+
if (Array.isArray(obj)) {
|
|
21
|
+
return obj.map(sortObjectKeys);
|
|
22
|
+
}
|
|
23
|
+
const sorted = {};
|
|
24
|
+
for (const key of Object.keys(obj).sort()) {
|
|
25
|
+
sorted[key] = sortObjectKeys(obj[key]);
|
|
26
|
+
}
|
|
27
|
+
return sorted;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create the signable representation of an event
|
|
31
|
+
*/
|
|
32
|
+
function getSignableData(event, signedBy) {
|
|
33
|
+
return {
|
|
34
|
+
eventId: event.eventId,
|
|
35
|
+
eventType: event.eventType,
|
|
36
|
+
correlationId: event.correlationId,
|
|
37
|
+
agentId: event.agentId,
|
|
38
|
+
payload: event.payload,
|
|
39
|
+
previousHash: event.previousHash,
|
|
40
|
+
occurredAt: event.occurredAt instanceof Date
|
|
41
|
+
? event.occurredAt.toISOString()
|
|
42
|
+
: event.occurredAt,
|
|
43
|
+
signedBy,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Serialize data for signing/verification
|
|
48
|
+
*/
|
|
49
|
+
function serializeForSigning(data) {
|
|
50
|
+
const sorted = sortObjectKeys(data);
|
|
51
|
+
return JSON.stringify(sorted);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Convert ArrayBuffer to base64 string
|
|
55
|
+
*/
|
|
56
|
+
function arrayBufferToBase64(buffer) {
|
|
57
|
+
const bytes = new Uint8Array(buffer);
|
|
58
|
+
let binary = '';
|
|
59
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
60
|
+
binary += String.fromCharCode(bytes[i]);
|
|
61
|
+
}
|
|
62
|
+
return btoa(binary);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Convert base64 string to Uint8Array
|
|
66
|
+
*/
|
|
67
|
+
function base64ToUint8Array(base64) {
|
|
68
|
+
const binary = atob(base64);
|
|
69
|
+
const bytes = new Uint8Array(binary.length);
|
|
70
|
+
for (let i = 0; i < binary.length; i++) {
|
|
71
|
+
bytes[i] = binary.charCodeAt(i);
|
|
72
|
+
}
|
|
73
|
+
return bytes;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate a new Ed25519 signing key pair
|
|
77
|
+
*/
|
|
78
|
+
export async function generateSigningKeyPair(owner) {
|
|
79
|
+
const keyPair = await crypto.subtle.generateKey({
|
|
80
|
+
name: 'Ed25519',
|
|
81
|
+
}, true, // extractable
|
|
82
|
+
['sign', 'verify']);
|
|
83
|
+
const publicKeyBuffer = await crypto.subtle.exportKey('raw', keyPair.publicKey);
|
|
84
|
+
const privateKeyBuffer = await crypto.subtle.exportKey('pkcs8', keyPair.privateKey);
|
|
85
|
+
const keyId = `ed25519-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
86
|
+
return {
|
|
87
|
+
publicKey: arrayBufferToBase64(publicKeyBuffer),
|
|
88
|
+
privateKey: arrayBufferToBase64(privateKeyBuffer),
|
|
89
|
+
keyId,
|
|
90
|
+
createdAt: new Date(),
|
|
91
|
+
owner,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Import a private key from base64 for signing
|
|
96
|
+
*/
|
|
97
|
+
async function importPrivateKey(privateKeyBase64) {
|
|
98
|
+
const keyData = base64ToUint8Array(privateKeyBase64);
|
|
99
|
+
return crypto.subtle.importKey('pkcs8', keyData, { name: 'Ed25519' }, false, ['sign']);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Import a public key from base64 for verification
|
|
103
|
+
*/
|
|
104
|
+
async function importPublicKey(publicKeyBase64) {
|
|
105
|
+
const keyData = base64ToUint8Array(publicKeyBase64);
|
|
106
|
+
return crypto.subtle.importKey('raw', keyData, { name: 'Ed25519' }, false, ['verify']);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Sign an event using Ed25519
|
|
110
|
+
*/
|
|
111
|
+
export async function signEvent(event, privateKeyBase64, signedBy) {
|
|
112
|
+
const signableData = getSignableData(event, signedBy);
|
|
113
|
+
const serialized = serializeForSigning(signableData);
|
|
114
|
+
const encoder = new TextEncoder();
|
|
115
|
+
const data = encoder.encode(serialized);
|
|
116
|
+
const privateKey = await importPrivateKey(privateKeyBase64);
|
|
117
|
+
const signatureBuffer = await crypto.subtle.sign({ name: 'Ed25519' }, privateKey, data);
|
|
118
|
+
return arrayBufferToBase64(signatureBuffer);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Verify an event signature using Ed25519
|
|
122
|
+
*/
|
|
123
|
+
export async function verifyEventSignature(event, publicKeyBase64) {
|
|
124
|
+
const verifiedAt = new Date();
|
|
125
|
+
if (!event.signature) {
|
|
126
|
+
return {
|
|
127
|
+
valid: false,
|
|
128
|
+
signer: event.signedBy,
|
|
129
|
+
error: 'Event has no signature',
|
|
130
|
+
verifiedAt,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (!event.signedBy) {
|
|
134
|
+
return {
|
|
135
|
+
valid: false,
|
|
136
|
+
error: 'Event has no signedBy field',
|
|
137
|
+
verifiedAt,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
const signableData = getSignableData(event, event.signedBy);
|
|
142
|
+
const serialized = serializeForSigning(signableData);
|
|
143
|
+
const encoder = new TextEncoder();
|
|
144
|
+
const data = encoder.encode(serialized);
|
|
145
|
+
const publicKey = await importPublicKey(publicKeyBase64);
|
|
146
|
+
const signatureBytes = base64ToUint8Array(event.signature);
|
|
147
|
+
const isValid = await crypto.subtle.verify({ name: 'Ed25519' }, publicKey, signatureBytes, data);
|
|
148
|
+
return {
|
|
149
|
+
valid: isValid,
|
|
150
|
+
signer: event.signedBy,
|
|
151
|
+
verifiedAt,
|
|
152
|
+
error: isValid ? undefined : 'Signature verification failed',
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
return {
|
|
157
|
+
valid: false,
|
|
158
|
+
signer: event.signedBy,
|
|
159
|
+
error: `Verification error: ${error instanceof Error ? error.message : String(error)}`,
|
|
160
|
+
verifiedAt,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Event Signing Service - Manages signing keys and operations
|
|
166
|
+
*/
|
|
167
|
+
export class EventSigningService {
|
|
168
|
+
serviceId;
|
|
169
|
+
privateKey;
|
|
170
|
+
keyId;
|
|
171
|
+
trustedKeys;
|
|
172
|
+
constructor(config) {
|
|
173
|
+
this.serviceId = config.serviceId;
|
|
174
|
+
this.privateKey = config.privateKey;
|
|
175
|
+
this.keyId = config.keyId;
|
|
176
|
+
this.trustedKeys = new Map();
|
|
177
|
+
// Add trusted keys
|
|
178
|
+
for (const key of config.trustedKeys ?? []) {
|
|
179
|
+
this.trustedKeys.set(key.owner, key);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Check if this service can sign events
|
|
184
|
+
*/
|
|
185
|
+
canSign() {
|
|
186
|
+
return this.privateKey !== undefined;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get the service ID (used in signedBy field)
|
|
190
|
+
*/
|
|
191
|
+
getServiceId() {
|
|
192
|
+
return this.serviceId;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get the key ID
|
|
196
|
+
*/
|
|
197
|
+
getKeyId() {
|
|
198
|
+
return this.keyId;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Sign an event
|
|
202
|
+
*/
|
|
203
|
+
async sign(event) {
|
|
204
|
+
if (!this.privateKey) {
|
|
205
|
+
throw new Error('Signing service has no private key configured');
|
|
206
|
+
}
|
|
207
|
+
return signEvent(event, this.privateKey, this.serviceId);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Verify an event signature
|
|
211
|
+
*/
|
|
212
|
+
async verify(event) {
|
|
213
|
+
if (!event.signedBy) {
|
|
214
|
+
return {
|
|
215
|
+
valid: false,
|
|
216
|
+
error: 'Event has no signedBy field',
|
|
217
|
+
verifiedAt: new Date(),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// Find the public key for the signer
|
|
221
|
+
const trustedKey = this.trustedKeys.get(event.signedBy);
|
|
222
|
+
if (!trustedKey) {
|
|
223
|
+
return {
|
|
224
|
+
valid: false,
|
|
225
|
+
signer: event.signedBy,
|
|
226
|
+
error: `No trusted key found for signer: ${event.signedBy}`,
|
|
227
|
+
verifiedAt: new Date(),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return verifyEventSignature(event, trustedKey.publicKey);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Add a trusted public key
|
|
234
|
+
*/
|
|
235
|
+
addTrustedKey(key) {
|
|
236
|
+
this.trustedKeys.set(key.owner, key);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Remove a trusted public key
|
|
240
|
+
*/
|
|
241
|
+
removeTrustedKey(owner) {
|
|
242
|
+
return this.trustedKeys.delete(owner);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get all trusted keys
|
|
246
|
+
*/
|
|
247
|
+
getTrustedKeys() {
|
|
248
|
+
return Array.from(this.trustedKeys.values());
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Check if a signer is trusted
|
|
252
|
+
*/
|
|
253
|
+
isTrusted(signer) {
|
|
254
|
+
return this.trustedKeys.has(signer);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Create an event signing service
|
|
259
|
+
*/
|
|
260
|
+
export function createSigningService(config) {
|
|
261
|
+
return new EventSigningService(config);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Verify signatures for a batch of events
|
|
265
|
+
*/
|
|
266
|
+
export async function verifyEventSignatures(events, signingService) {
|
|
267
|
+
const results = [];
|
|
268
|
+
let validCount = 0;
|
|
269
|
+
let invalidCount = 0;
|
|
270
|
+
let unsignedCount = 0;
|
|
271
|
+
for (const event of events) {
|
|
272
|
+
if (!event.signature) {
|
|
273
|
+
unsignedCount++;
|
|
274
|
+
results.push({
|
|
275
|
+
eventId: event.eventId,
|
|
276
|
+
result: {
|
|
277
|
+
valid: false,
|
|
278
|
+
error: 'Event is unsigned',
|
|
279
|
+
verifiedAt: new Date(),
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const result = await signingService.verify(event);
|
|
285
|
+
results.push({ eventId: event.eventId, result });
|
|
286
|
+
if (result.valid) {
|
|
287
|
+
validCount++;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
invalidCount++;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return {
|
|
294
|
+
totalEvents: events.length,
|
|
295
|
+
validCount,
|
|
296
|
+
invalidCount,
|
|
297
|
+
unsignedCount,
|
|
298
|
+
results,
|
|
299
|
+
success: invalidCount === 0 && (unsignedCount === 0 || events.length === 0),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=event-signatures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-signatures.js","sourceRoot":"","sources":["../../src/events/event-signatures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA6EH;;GAEG;AACH,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CACtB,KAAiE,EACjE,QAAgB;IAEhB,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU,YAAY,IAAI;YAC1C,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE;YAChC,CAAC,CAAC,KAAK,CAAC,UAAU;QACpB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAuB;IAClD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAmB;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,MAAc;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAa;IACxD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAC7C;QACE,IAAI,EAAE,SAAS;KAChB,EACD,IAAI,EAAE,cAAc;IACpB,CAAC,MAAM,EAAE,QAAQ,CAAC,CACwG,CAAC;IAE7H,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAChF,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpF,MAAM,KAAK,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAEhF,OAAO;QACL,SAAS,EAAE,mBAAmB,CAAC,eAAe,CAAC;QAC/C,UAAU,EAAE,mBAAmB,CAAC,gBAAgB,CAAC;QACjD,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE;QACrB,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,gBAAwB;IACtD,MAAM,OAAO,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAC5B,OAAO,EACP,OAAO,EACP,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,eAAuB;IACpD,MAAM,OAAO,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAC5B,KAAK,EACL,OAAO,EACP,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,KAAK,EACL,CAAC,QAAQ,CAAC,CACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAiE,EACjE,gBAAwB,EACxB,QAAgB;IAEhB,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAExC,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAC9C,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,UAAU,EACV,IAAI,CACL,CAAC;IAEF,OAAO,mBAAmB,CAAC,eAAe,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAiB,EACjB,eAAuB;IAEvB,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;IAE9B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,KAAK,CAAC,QAAQ;YACtB,KAAK,EAAE,wBAAwB;YAC/B,UAAU;SACX,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,6BAA6B;YACpC,UAAU;SACX,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAExC,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;QACzD,MAAM,cAAc,GAAG,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE3D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CACxC,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,SAAS,EACT,cAAc,EACd,IAAI,CACL,CAAC;QAEF,OAAO;YACL,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,KAAK,CAAC,QAAQ;YACtB,UAAU;YACV,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,+BAA+B;SAC7D,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,KAAK,CAAC,QAAQ;YACtB,KAAK,EAAE,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YACtF,UAAU;SACX,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,mBAAmB;IACb,SAAS,CAAS;IAClB,UAAU,CAAU;IACpB,KAAK,CAAU;IACf,WAAW,CAAyB;IAErD,YAAY,MAA4B;QACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAE7B,mBAAmB;QACnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CACR,KAAiE;QAEjE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAiB;QAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,6BAA6B;gBACpC,UAAU,EAAE,IAAI,IAAI,EAAE;aACvB,CAAC;QACJ,CAAC;QAED,qCAAqC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,KAAK,CAAC,QAAQ;gBACtB,KAAK,EAAE,oCAAoC,KAAK,CAAC,QAAQ,EAAE;gBAC3D,UAAU,EAAE,IAAI,IAAI,EAAE;aACvB,CAAC;QACJ,CAAC;QAED,OAAO,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,GAAc;QAC1B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAc;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAuBD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAoB,EACpB,cAAmC;IAEnC,MAAM,OAAO,GAAoE,EAAE,CAAC;IACpF,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,aAAa,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,MAAM,EAAE;oBACN,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,mBAAmB;oBAC1B,UAAU,EAAE,IAAI,IAAI,EAAE;iBACvB;aACF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,UAAU,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,UAAU;QACV,YAAY;QACZ,aAAa;QACb,OAAO;QACP,OAAO,EAAE,YAAY,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;KAC5E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Store - Abstract storage interface for proof events
|
|
3
|
+
*
|
|
4
|
+
* Implementations can use in-memory storage (for testing),
|
|
5
|
+
* or persistent stores (PostgreSQL, Supabase, etc.).
|
|
6
|
+
*/
|
|
7
|
+
import type { ProofEvent, ProofEventFilter, ProofEventSummary, ProofEventType, ShadowModeStatus } from '@vorion/contracts';
|
|
8
|
+
/**
|
|
9
|
+
* Query options for event retrieval
|
|
10
|
+
*/
|
|
11
|
+
export interface EventQueryOptions {
|
|
12
|
+
/** Maximum number of events to return */
|
|
13
|
+
limit?: number;
|
|
14
|
+
/** Number of events to skip */
|
|
15
|
+
offset?: number;
|
|
16
|
+
/** Sort order (default: ascending by occurredAt) */
|
|
17
|
+
order?: 'asc' | 'desc';
|
|
18
|
+
/** Include event payload in results */
|
|
19
|
+
includePayload?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Filter by shadow mode status
|
|
22
|
+
*
|
|
23
|
+
* If provided, only events matching these statuses are returned.
|
|
24
|
+
* Useful for querying unverified sandbox events:
|
|
25
|
+
* shadowModeOnly: ['shadow', 'testnet']
|
|
26
|
+
*/
|
|
27
|
+
shadowModeOnly?: ShadowModeStatus[];
|
|
28
|
+
/**
|
|
29
|
+
* Exclude shadow mode events (production only)
|
|
30
|
+
*
|
|
31
|
+
* If true, only production events (no shadowMode or shadowMode='production')
|
|
32
|
+
* are returned. Used when calculating official trust scores.
|
|
33
|
+
*
|
|
34
|
+
* @default false
|
|
35
|
+
*/
|
|
36
|
+
excludeShadow?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Result of an event query
|
|
40
|
+
*/
|
|
41
|
+
export interface EventQueryResult {
|
|
42
|
+
/** Retrieved events */
|
|
43
|
+
events: ProofEvent[];
|
|
44
|
+
/** Total count matching filter (before pagination) */
|
|
45
|
+
totalCount: number;
|
|
46
|
+
/** Whether there are more results */
|
|
47
|
+
hasMore: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Event statistics
|
|
51
|
+
*/
|
|
52
|
+
export interface EventStats {
|
|
53
|
+
/** Total number of events */
|
|
54
|
+
totalEvents: number;
|
|
55
|
+
/** Events by type */
|
|
56
|
+
byType: Record<string, number>;
|
|
57
|
+
/** Events by agent */
|
|
58
|
+
byAgent: Record<string, number>;
|
|
59
|
+
/** Oldest event timestamp */
|
|
60
|
+
oldestEvent?: Date;
|
|
61
|
+
/** Newest event timestamp */
|
|
62
|
+
newestEvent?: Date;
|
|
63
|
+
/**
|
|
64
|
+
* Events by shadow mode status
|
|
65
|
+
* Tracks how many events are pending HITL verification
|
|
66
|
+
*/
|
|
67
|
+
byShadowMode?: Record<ShadowModeStatus | 'production', number>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Abstract interface for proof event storage
|
|
71
|
+
*/
|
|
72
|
+
export interface ProofEventStore {
|
|
73
|
+
/**
|
|
74
|
+
* Append an event to the store
|
|
75
|
+
* Returns the stored event with recorded timestamp
|
|
76
|
+
*/
|
|
77
|
+
append(event: ProofEvent): Promise<ProofEvent>;
|
|
78
|
+
/**
|
|
79
|
+
* Get an event by its ID
|
|
80
|
+
*/
|
|
81
|
+
get(eventId: string): Promise<ProofEvent | null>;
|
|
82
|
+
/**
|
|
83
|
+
* Get the latest event in the chain
|
|
84
|
+
*/
|
|
85
|
+
getLatest(): Promise<ProofEvent | null>;
|
|
86
|
+
/**
|
|
87
|
+
* Get the latest hash (for chaining new events)
|
|
88
|
+
*/
|
|
89
|
+
getLatestHash(): Promise<string | null>;
|
|
90
|
+
/**
|
|
91
|
+
* Query events with filters
|
|
92
|
+
*/
|
|
93
|
+
query(filter?: ProofEventFilter, options?: EventQueryOptions): Promise<EventQueryResult>;
|
|
94
|
+
/**
|
|
95
|
+
* Get events by correlation ID (for tracing a request)
|
|
96
|
+
*/
|
|
97
|
+
getByCorrelationId(correlationId: string, options?: EventQueryOptions): Promise<ProofEvent[]>;
|
|
98
|
+
/**
|
|
99
|
+
* Get events by agent ID
|
|
100
|
+
*/
|
|
101
|
+
getByAgentId(agentId: string, options?: EventQueryOptions): Promise<ProofEvent[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Get events in a time range
|
|
104
|
+
*/
|
|
105
|
+
getByTimeRange(from: Date, to: Date, options?: EventQueryOptions): Promise<ProofEvent[]>;
|
|
106
|
+
/**
|
|
107
|
+
* Get events by type
|
|
108
|
+
*/
|
|
109
|
+
getByType(eventType: ProofEventType, options?: EventQueryOptions): Promise<ProofEvent[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Get event summaries (lightweight list without payloads)
|
|
112
|
+
*/
|
|
113
|
+
getSummaries(filter?: ProofEventFilter, options?: EventQueryOptions): Promise<ProofEventSummary[]>;
|
|
114
|
+
/**
|
|
115
|
+
* Get the chain of events from a starting point
|
|
116
|
+
* Returns events in order for chain verification
|
|
117
|
+
*/
|
|
118
|
+
getChain(fromEventId?: string, limit?: number): Promise<ProofEvent[]>;
|
|
119
|
+
/**
|
|
120
|
+
* Get event count
|
|
121
|
+
*/
|
|
122
|
+
count(filter?: ProofEventFilter): Promise<number>;
|
|
123
|
+
/**
|
|
124
|
+
* Get event statistics
|
|
125
|
+
*/
|
|
126
|
+
getStats(): Promise<EventStats>;
|
|
127
|
+
/**
|
|
128
|
+
* Check if an event exists
|
|
129
|
+
*/
|
|
130
|
+
exists(eventId: string): Promise<boolean>;
|
|
131
|
+
/**
|
|
132
|
+
* Clear all events (for testing only)
|
|
133
|
+
*/
|
|
134
|
+
clear(): Promise<void>;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Error thrown when event storage fails
|
|
138
|
+
*/
|
|
139
|
+
export declare class EventStoreError extends Error {
|
|
140
|
+
readonly code: EventStoreErrorCode;
|
|
141
|
+
readonly eventId?: string | undefined;
|
|
142
|
+
constructor(message: string, code: EventStoreErrorCode, eventId?: string | undefined);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Event store error codes
|
|
146
|
+
*/
|
|
147
|
+
export declare enum EventStoreErrorCode {
|
|
148
|
+
/** Event already exists (duplicate ID) */
|
|
149
|
+
DUPLICATE_EVENT = "DUPLICATE_EVENT",
|
|
150
|
+
/** Event not found */
|
|
151
|
+
NOT_FOUND = "NOT_FOUND",
|
|
152
|
+
/** Invalid event data */
|
|
153
|
+
INVALID_EVENT = "INVALID_EVENT",
|
|
154
|
+
/** Chain integrity error */
|
|
155
|
+
CHAIN_INTEGRITY = "CHAIN_INTEGRITY",
|
|
156
|
+
/** Storage error */
|
|
157
|
+
STORAGE_ERROR = "STORAGE_ERROR"
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=event-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../../src/events/event-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Store - Abstract storage interface for proof events
|
|
3
|
+
*
|
|
4
|
+
* Implementations can use in-memory storage (for testing),
|
|
5
|
+
* or persistent stores (PostgreSQL, Supabase, etc.).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown when event storage fails
|
|
9
|
+
*/
|
|
10
|
+
export class EventStoreError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
eventId;
|
|
13
|
+
constructor(message, code, eventId) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.eventId = eventId;
|
|
17
|
+
this.name = 'EventStoreError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Event store error codes
|
|
22
|
+
*/
|
|
23
|
+
export var EventStoreErrorCode;
|
|
24
|
+
(function (EventStoreErrorCode) {
|
|
25
|
+
/** Event already exists (duplicate ID) */
|
|
26
|
+
EventStoreErrorCode["DUPLICATE_EVENT"] = "DUPLICATE_EVENT";
|
|
27
|
+
/** Event not found */
|
|
28
|
+
EventStoreErrorCode["NOT_FOUND"] = "NOT_FOUND";
|
|
29
|
+
/** Invalid event data */
|
|
30
|
+
EventStoreErrorCode["INVALID_EVENT"] = "INVALID_EVENT";
|
|
31
|
+
/** Chain integrity error */
|
|
32
|
+
EventStoreErrorCode["CHAIN_INTEGRITY"] = "CHAIN_INTEGRITY";
|
|
33
|
+
/** Storage error */
|
|
34
|
+
EventStoreErrorCode["STORAGE_ERROR"] = "STORAGE_ERROR";
|
|
35
|
+
})(EventStoreErrorCode || (EventStoreErrorCode = {}));
|
|
36
|
+
//# sourceMappingURL=event-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-store.js","sourceRoot":"","sources":["../../src/events/event-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4JH;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAGtB;IACA;IAHlB,YACE,OAAe,EACC,IAAyB,EACzB,OAAgB;QAEhC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAqB;QACzB,YAAO,GAAP,OAAO,CAAS;QAGhC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,mBAWX;AAXD,WAAY,mBAAmB;IAC7B,0CAA0C;IAC1C,0DAAmC,CAAA;IACnC,sBAAsB;IACtB,8CAAuB,CAAA;IACvB,yBAAyB;IACzB,sDAA+B,CAAA;IAC/B,4BAA4B;IAC5B,0DAAmC,CAAA;IACnC,oBAAoB;IACpB,sDAA+B,CAAA;AACjC,CAAC,EAXW,mBAAmB,KAAnB,mBAAmB,QAW9B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash Chain Utilities - Cryptographic hash chain for tamper detection
|
|
3
|
+
*
|
|
4
|
+
* Each proof event contains a hash of its contents and a reference
|
|
5
|
+
* to the previous event's hash, forming an immutable chain.
|
|
6
|
+
*/
|
|
7
|
+
import type { ProofEvent } from '@vorion/contracts';
|
|
8
|
+
/**
|
|
9
|
+
* Create a SHA-256 hash of the given data
|
|
10
|
+
*/
|
|
11
|
+
export declare function sha256(data: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Compute the hash of an event's content
|
|
14
|
+
*/
|
|
15
|
+
export declare function computeEventHash(event: Omit<ProofEvent, 'eventHash' | 'recordedAt'>): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Verify that an event's hash is correct
|
|
18
|
+
*/
|
|
19
|
+
export declare function verifyEventHash(event: ProofEvent): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Verify that an event correctly chains to the previous event
|
|
22
|
+
*/
|
|
23
|
+
export declare function verifyChainLink(event: ProofEvent, previousEvent: ProofEvent | null): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Verify an entire chain of events
|
|
26
|
+
*/
|
|
27
|
+
export declare function verifyChain(events: ProofEvent[]): Promise<{
|
|
28
|
+
valid: boolean;
|
|
29
|
+
verifiedCount: number;
|
|
30
|
+
brokenAtIndex?: number;
|
|
31
|
+
brokenAtEventId?: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a genesis hash for the first event in a chain
|
|
36
|
+
*/
|
|
37
|
+
export declare function getGenesisHash(): null;
|
|
38
|
+
/**
|
|
39
|
+
* Result of chain verification with detailed info
|
|
40
|
+
*/
|
|
41
|
+
export interface ChainVerificationResult {
|
|
42
|
+
/** Is the chain valid? */
|
|
43
|
+
valid: boolean;
|
|
44
|
+
/** Number of events successfully verified */
|
|
45
|
+
verifiedCount: number;
|
|
46
|
+
/** Total events in chain */
|
|
47
|
+
totalEvents: number;
|
|
48
|
+
/** First event ID in chain */
|
|
49
|
+
firstEventId?: string;
|
|
50
|
+
/** Last event ID in chain */
|
|
51
|
+
lastEventId?: string;
|
|
52
|
+
/** Event ID where chain broke (if invalid) */
|
|
53
|
+
brokenAtEventId?: string;
|
|
54
|
+
/** Index where chain broke */
|
|
55
|
+
brokenAtIndex?: number;
|
|
56
|
+
/** Error description */
|
|
57
|
+
error?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Verify a chain and return detailed results
|
|
61
|
+
*/
|
|
62
|
+
export declare function verifyChainWithDetails(events: ProofEvent[]): Promise<ChainVerificationResult>;
|
|
63
|
+
//# sourceMappingURL=hash-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash-chain.d.ts","sourceRoot":"","sources":["../../src/events/hash-chain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAC;AAEvE;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM1D;AAsDD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,YAAY,CAAC,GAClD,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAGzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,GAAG,IAAI,GAAG,OAAO,CAM5F;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC/D,KAAK,EAAE,OAAO,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAoCD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,0BAA0B;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAanG"}
|