@rookdaemon/agora 0.2.7 → 0.2.9
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 +33 -0
- package/dist/chunk-JUOGKXFN.js +1645 -0
- package/dist/chunk-JUOGKXFN.js.map +1 -0
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +1163 -1137
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1613 -25
- package/dist/index.js +1135 -24
- package/dist/index.js.map +1 -1
- package/package.json +11 -2
- package/dist/cli.d.ts.map +0 -1
- package/dist/config.d.ts +0 -59
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -115
- package/dist/config.js.map +0 -1
- package/dist/discovery/bootstrap.d.ts +0 -32
- package/dist/discovery/bootstrap.d.ts.map +0 -1
- package/dist/discovery/bootstrap.js +0 -36
- package/dist/discovery/bootstrap.js.map +0 -1
- package/dist/discovery/peer-discovery.d.ts +0 -59
- package/dist/discovery/peer-discovery.d.ts.map +0 -1
- package/dist/discovery/peer-discovery.js +0 -108
- package/dist/discovery/peer-discovery.js.map +0 -1
- package/dist/identity/keypair.d.ts +0 -42
- package/dist/identity/keypair.d.ts.map +0 -1
- package/dist/identity/keypair.js +0 -83
- package/dist/identity/keypair.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/message/envelope.d.ts +0 -59
- package/dist/message/envelope.d.ts.map +0 -1
- package/dist/message/envelope.js +0 -83
- package/dist/message/envelope.js.map +0 -1
- package/dist/message/types/paper-discovery.d.ts +0 -28
- package/dist/message/types/paper-discovery.d.ts.map +0 -1
- package/dist/message/types/paper-discovery.js +0 -2
- package/dist/message/types/paper-discovery.js.map +0 -1
- package/dist/message/types/peer-discovery.d.ts +0 -78
- package/dist/message/types/peer-discovery.d.ts.map +0 -1
- package/dist/message/types/peer-discovery.js +0 -90
- package/dist/message/types/peer-discovery.js.map +0 -1
- package/dist/peer/client.d.ts +0 -50
- package/dist/peer/client.d.ts.map +0 -1
- package/dist/peer/client.js +0 -138
- package/dist/peer/client.js.map +0 -1
- package/dist/peer/manager.d.ts +0 -65
- package/dist/peer/manager.d.ts.map +0 -1
- package/dist/peer/manager.js +0 -153
- package/dist/peer/manager.js.map +0 -1
- package/dist/peer/server.d.ts +0 -65
- package/dist/peer/server.d.ts.map +0 -1
- package/dist/peer/server.js +0 -154
- package/dist/peer/server.js.map +0 -1
- package/dist/registry/capability.d.ts +0 -44
- package/dist/registry/capability.d.ts.map +0 -1
- package/dist/registry/capability.js +0 -94
- package/dist/registry/capability.js.map +0 -1
- package/dist/registry/discovery-service.d.ts +0 -64
- package/dist/registry/discovery-service.d.ts.map +0 -1
- package/dist/registry/discovery-service.js +0 -129
- package/dist/registry/discovery-service.js.map +0 -1
- package/dist/registry/messages.d.ts +0 -105
- package/dist/registry/messages.d.ts.map +0 -1
- package/dist/registry/messages.js +0 -2
- package/dist/registry/messages.js.map +0 -1
- package/dist/registry/peer-store.d.ts +0 -57
- package/dist/registry/peer-store.d.ts.map +0 -1
- package/dist/registry/peer-store.js +0 -92
- package/dist/registry/peer-store.js.map +0 -1
- package/dist/registry/peer.d.ts +0 -20
- package/dist/registry/peer.d.ts.map +0 -1
- package/dist/registry/peer.js +0 -2
- package/dist/registry/peer.js.map +0 -1
- package/dist/relay/client.d.ts +0 -112
- package/dist/relay/client.d.ts.map +0 -1
- package/dist/relay/client.js +0 -281
- package/dist/relay/client.js.map +0 -1
- package/dist/relay/server.d.ts +0 -76
- package/dist/relay/server.d.ts.map +0 -1
- package/dist/relay/server.js +0 -338
- package/dist/relay/server.js.map +0 -1
- package/dist/relay/types.d.ts +0 -35
- package/dist/relay/types.d.ts.map +0 -1
- package/dist/relay/types.js +0 -2
- package/dist/relay/types.js.map +0 -1
- package/dist/reputation/commit-reveal.d.ts +0 -45
- package/dist/reputation/commit-reveal.d.ts.map +0 -1
- package/dist/reputation/commit-reveal.js +0 -125
- package/dist/reputation/commit-reveal.js.map +0 -1
- package/dist/reputation/scoring.d.ts +0 -31
- package/dist/reputation/scoring.d.ts.map +0 -1
- package/dist/reputation/scoring.js +0 -105
- package/dist/reputation/scoring.js.map +0 -1
- package/dist/reputation/store.d.ts +0 -83
- package/dist/reputation/store.d.ts.map +0 -1
- package/dist/reputation/store.js +0 -202
- package/dist/reputation/store.js.map +0 -1
- package/dist/reputation/types.d.ts +0 -150
- package/dist/reputation/types.d.ts.map +0 -1
- package/dist/reputation/types.js +0 -113
- package/dist/reputation/types.js.map +0 -1
- package/dist/reputation/verification.d.ts +0 -28
- package/dist/reputation/verification.d.ts.map +0 -1
- package/dist/reputation/verification.js +0 -91
- package/dist/reputation/verification.js.map +0 -1
- package/dist/service.d.ts +0 -90
- package/dist/service.d.ts.map +0 -1
- package/dist/service.js +0 -176
- package/dist/service.js.map +0 -1
- package/dist/transport/http.d.ts +0 -41
- package/dist/transport/http.d.ts.map +0 -1
- package/dist/transport/http.js +0 -103
- package/dist/transport/http.js.map +0 -1
- package/dist/transport/peer-config.d.ts +0 -38
- package/dist/transport/peer-config.d.ts.map +0 -1
- package/dist/transport/peer-config.js +0 -41
- package/dist/transport/peer-config.js.map +0 -1
- package/dist/transport/relay.d.ts +0 -30
- package/dist/transport/relay.d.ts.map +0 -1
- package/dist/transport/relay.js +0 -85
- package/dist/transport/relay.js.map +0 -1
- package/dist/utils.d.ts +0 -40
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -59
- package/dist/utils.js.map +0 -1
package/dist/reputation/types.js
DELETED
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core data structures for the Agora reputation layer.
|
|
3
|
-
* Phase 1: Verification records, commit-reveal patterns, and trust scoring.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Validate a verification record structure
|
|
7
|
-
*/
|
|
8
|
-
export function validateVerificationRecord(record) {
|
|
9
|
-
const errors = [];
|
|
10
|
-
if (typeof record !== 'object' || record === null) {
|
|
11
|
-
return { valid: false, errors: ['Record must be an object'] };
|
|
12
|
-
}
|
|
13
|
-
const r = record;
|
|
14
|
-
if (typeof r.id !== 'string' || r.id.length === 0) {
|
|
15
|
-
errors.push('id must be a non-empty string');
|
|
16
|
-
}
|
|
17
|
-
if (typeof r.verifier !== 'string' || r.verifier.length === 0) {
|
|
18
|
-
errors.push('verifier must be a non-empty string');
|
|
19
|
-
}
|
|
20
|
-
if (typeof r.target !== 'string' || r.target.length === 0) {
|
|
21
|
-
errors.push('target must be a non-empty string');
|
|
22
|
-
}
|
|
23
|
-
if (typeof r.domain !== 'string' || r.domain.length === 0) {
|
|
24
|
-
errors.push('domain must be a non-empty string');
|
|
25
|
-
}
|
|
26
|
-
if (!['correct', 'incorrect', 'disputed'].includes(r.verdict)) {
|
|
27
|
-
errors.push('verdict must be one of: correct, incorrect, disputed');
|
|
28
|
-
}
|
|
29
|
-
if (typeof r.confidence !== 'number' || r.confidence < 0 || r.confidence > 1) {
|
|
30
|
-
errors.push('confidence must be a number between 0 and 1');
|
|
31
|
-
}
|
|
32
|
-
if (r.evidence !== undefined && typeof r.evidence !== 'string') {
|
|
33
|
-
errors.push('evidence must be a string if provided');
|
|
34
|
-
}
|
|
35
|
-
if (typeof r.timestamp !== 'number' || r.timestamp <= 0) {
|
|
36
|
-
errors.push('timestamp must be a positive number');
|
|
37
|
-
}
|
|
38
|
-
if (typeof r.signature !== 'string' || r.signature.length === 0) {
|
|
39
|
-
errors.push('signature must be a non-empty string');
|
|
40
|
-
}
|
|
41
|
-
return { valid: errors.length === 0, errors };
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Validate a commit record structure
|
|
45
|
-
*/
|
|
46
|
-
export function validateCommitRecord(record) {
|
|
47
|
-
const errors = [];
|
|
48
|
-
if (typeof record !== 'object' || record === null) {
|
|
49
|
-
return { valid: false, errors: ['Record must be an object'] };
|
|
50
|
-
}
|
|
51
|
-
const r = record;
|
|
52
|
-
if (typeof r.id !== 'string' || r.id.length === 0) {
|
|
53
|
-
errors.push('id must be a non-empty string');
|
|
54
|
-
}
|
|
55
|
-
if (typeof r.agent !== 'string' || r.agent.length === 0) {
|
|
56
|
-
errors.push('agent must be a non-empty string');
|
|
57
|
-
}
|
|
58
|
-
if (typeof r.domain !== 'string' || r.domain.length === 0) {
|
|
59
|
-
errors.push('domain must be a non-empty string');
|
|
60
|
-
}
|
|
61
|
-
if (typeof r.commitment !== 'string' || r.commitment.length !== 64) {
|
|
62
|
-
errors.push('commitment must be a 64-character hex string (SHA-256 hash)');
|
|
63
|
-
}
|
|
64
|
-
if (typeof r.timestamp !== 'number' || r.timestamp <= 0) {
|
|
65
|
-
errors.push('timestamp must be a positive number');
|
|
66
|
-
}
|
|
67
|
-
if (typeof r.expiry !== 'number' || r.expiry <= 0) {
|
|
68
|
-
errors.push('expiry must be a positive number');
|
|
69
|
-
}
|
|
70
|
-
if (typeof r.expiry === 'number' && typeof r.timestamp === 'number' && r.expiry <= r.timestamp) {
|
|
71
|
-
errors.push('expiry must be after timestamp');
|
|
72
|
-
}
|
|
73
|
-
if (typeof r.signature !== 'string' || r.signature.length === 0) {
|
|
74
|
-
errors.push('signature must be a non-empty string');
|
|
75
|
-
}
|
|
76
|
-
return { valid: errors.length === 0, errors };
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Validate a reveal record structure
|
|
80
|
-
*/
|
|
81
|
-
export function validateRevealRecord(record) {
|
|
82
|
-
const errors = [];
|
|
83
|
-
if (typeof record !== 'object' || record === null) {
|
|
84
|
-
return { valid: false, errors: ['Record must be an object'] };
|
|
85
|
-
}
|
|
86
|
-
const r = record;
|
|
87
|
-
if (typeof r.id !== 'string' || r.id.length === 0) {
|
|
88
|
-
errors.push('id must be a non-empty string');
|
|
89
|
-
}
|
|
90
|
-
if (typeof r.agent !== 'string' || r.agent.length === 0) {
|
|
91
|
-
errors.push('agent must be a non-empty string');
|
|
92
|
-
}
|
|
93
|
-
if (typeof r.commitmentId !== 'string' || r.commitmentId.length === 0) {
|
|
94
|
-
errors.push('commitmentId must be a non-empty string');
|
|
95
|
-
}
|
|
96
|
-
if (typeof r.prediction !== 'string' || r.prediction.length === 0) {
|
|
97
|
-
errors.push('prediction must be a non-empty string');
|
|
98
|
-
}
|
|
99
|
-
if (typeof r.outcome !== 'string' || r.outcome.length === 0) {
|
|
100
|
-
errors.push('outcome must be a non-empty string');
|
|
101
|
-
}
|
|
102
|
-
if (r.evidence !== undefined && typeof r.evidence !== 'string') {
|
|
103
|
-
errors.push('evidence must be a string if provided');
|
|
104
|
-
}
|
|
105
|
-
if (typeof r.timestamp !== 'number' || r.timestamp <= 0) {
|
|
106
|
-
errors.push('timestamp must be a positive number');
|
|
107
|
-
}
|
|
108
|
-
if (typeof r.signature !== 'string' || r.signature.length === 0) {
|
|
109
|
-
errors.push('signature must be a non-empty string');
|
|
110
|
-
}
|
|
111
|
-
return { valid: errors.length === 0, errors };
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reputation/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmLH;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAe;IACxD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,GAAG,MAAiC,CAAC;IAE5C,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAiB,CAAC,EAAE,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAe;IAClD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,GAAG,MAAiC,CAAC;IAE5C,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAC/F,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAe;IAClD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,GAAG,MAAiC,CAAC;IAE5C,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClE,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Verification record creation and validation.
|
|
3
|
-
* Core primitive for computational reputation.
|
|
4
|
-
*/
|
|
5
|
-
import type { VerificationRecord } from './types.js';
|
|
6
|
-
/**
|
|
7
|
-
* Create a signed verification record
|
|
8
|
-
* @param verifier - Public key of the verifying agent
|
|
9
|
-
* @param privateKey - Private key for signing
|
|
10
|
-
* @param target - ID of the message/output being verified
|
|
11
|
-
* @param domain - Capability domain
|
|
12
|
-
* @param verdict - Verification verdict
|
|
13
|
-
* @param confidence - Verifier's confidence (0-1)
|
|
14
|
-
* @param timestamp - Timestamp for the verification (ms)
|
|
15
|
-
* @param evidence - Optional link to verification evidence
|
|
16
|
-
* @returns Signed VerificationRecord
|
|
17
|
-
*/
|
|
18
|
-
export declare function createVerification(verifier: string, privateKey: string, target: string, domain: string, verdict: 'correct' | 'incorrect' | 'disputed', confidence: number, timestamp: number, evidence?: string): VerificationRecord;
|
|
19
|
-
/**
|
|
20
|
-
* Verify the cryptographic signature of a verification record
|
|
21
|
-
* @param record - The verification record to verify
|
|
22
|
-
* @returns Object with valid flag and optional reason for failure
|
|
23
|
-
*/
|
|
24
|
-
export declare function verifyVerificationSignature(record: VerificationRecord): {
|
|
25
|
-
valid: boolean;
|
|
26
|
-
reason?: string;
|
|
27
|
-
};
|
|
28
|
-
//# sourceMappingURL=verification.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/reputation/verification.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,EAC7C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,kBAAkB,CAwCpB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,kBAAkB,GACzB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAmCrC"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Verification record creation and validation.
|
|
3
|
-
* Core primitive for computational reputation.
|
|
4
|
-
*/
|
|
5
|
-
import { createEnvelope, verifyEnvelope } from '../message/envelope.js';
|
|
6
|
-
import { validateVerificationRecord } from './types.js';
|
|
7
|
-
/**
|
|
8
|
-
* Create a signed verification record
|
|
9
|
-
* @param verifier - Public key of the verifying agent
|
|
10
|
-
* @param privateKey - Private key for signing
|
|
11
|
-
* @param target - ID of the message/output being verified
|
|
12
|
-
* @param domain - Capability domain
|
|
13
|
-
* @param verdict - Verification verdict
|
|
14
|
-
* @param confidence - Verifier's confidence (0-1)
|
|
15
|
-
* @param timestamp - Timestamp for the verification (ms)
|
|
16
|
-
* @param evidence - Optional link to verification evidence
|
|
17
|
-
* @returns Signed VerificationRecord
|
|
18
|
-
*/
|
|
19
|
-
export function createVerification(verifier, privateKey, target, domain, verdict, confidence, timestamp, evidence) {
|
|
20
|
-
// Validate confidence range
|
|
21
|
-
if (confidence < 0 || confidence > 1) {
|
|
22
|
-
throw new Error('confidence must be between 0 and 1');
|
|
23
|
-
}
|
|
24
|
-
// Create the payload for signing
|
|
25
|
-
const payload = {
|
|
26
|
-
verifier,
|
|
27
|
-
target,
|
|
28
|
-
domain,
|
|
29
|
-
verdict,
|
|
30
|
-
confidence,
|
|
31
|
-
timestamp,
|
|
32
|
-
};
|
|
33
|
-
if (evidence !== undefined) {
|
|
34
|
-
payload.evidence = evidence;
|
|
35
|
-
}
|
|
36
|
-
// Create signed envelope with type 'verification'
|
|
37
|
-
const envelope = createEnvelope('verification', verifier, privateKey, payload, timestamp);
|
|
38
|
-
// Return verification record
|
|
39
|
-
const record = {
|
|
40
|
-
id: envelope.id,
|
|
41
|
-
verifier,
|
|
42
|
-
target,
|
|
43
|
-
domain,
|
|
44
|
-
verdict,
|
|
45
|
-
confidence,
|
|
46
|
-
timestamp,
|
|
47
|
-
signature: envelope.signature,
|
|
48
|
-
};
|
|
49
|
-
if (evidence !== undefined) {
|
|
50
|
-
record.evidence = evidence;
|
|
51
|
-
}
|
|
52
|
-
return record;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Verify the cryptographic signature of a verification record
|
|
56
|
-
* @param record - The verification record to verify
|
|
57
|
-
* @returns Object with valid flag and optional reason for failure
|
|
58
|
-
*/
|
|
59
|
-
export function verifyVerificationSignature(record) {
|
|
60
|
-
// First validate the structure
|
|
61
|
-
const structureValidation = validateVerificationRecord(record);
|
|
62
|
-
if (!structureValidation.valid) {
|
|
63
|
-
return {
|
|
64
|
-
valid: false,
|
|
65
|
-
reason: `Invalid structure: ${structureValidation.errors.join(', ')}`
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
// Reconstruct the envelope for signature verification
|
|
69
|
-
const payload = {
|
|
70
|
-
verifier: record.verifier,
|
|
71
|
-
target: record.target,
|
|
72
|
-
domain: record.domain,
|
|
73
|
-
verdict: record.verdict,
|
|
74
|
-
confidence: record.confidence,
|
|
75
|
-
timestamp: record.timestamp,
|
|
76
|
-
};
|
|
77
|
-
if (record.evidence !== undefined) {
|
|
78
|
-
payload.evidence = record.evidence;
|
|
79
|
-
}
|
|
80
|
-
const envelope = {
|
|
81
|
-
id: record.id,
|
|
82
|
-
type: 'verification',
|
|
83
|
-
sender: record.verifier,
|
|
84
|
-
timestamp: record.timestamp,
|
|
85
|
-
payload,
|
|
86
|
-
signature: record.signature,
|
|
87
|
-
};
|
|
88
|
-
// Verify the envelope signature
|
|
89
|
-
return verifyEnvelope(envelope);
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=verification.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/reputation/verification.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,UAAkB,EAClB,MAAc,EACd,MAAc,EACd,OAA6C,EAC7C,UAAkB,EAClB,SAAiB,EACjB,QAAiB;IAEjB,4BAA4B;IAC5B,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,iCAAiC;IACjC,MAAM,OAAO,GAA4B;QACvC,QAAQ;QACR,MAAM;QACN,MAAM;QACN,OAAO;QACP,UAAU;QACV,SAAS;KACV,CAAC;IAEF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAE1F,6BAA6B;IAC7B,MAAM,MAAM,GAAuB;QACjC,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,QAAQ;QACR,MAAM;QACN,MAAM;QACN,OAAO;QACP,UAAU;QACV,SAAS;QACT,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC;IAEF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,MAA0B;IAE1B,+BAA+B;IAC/B,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,sBAAsB,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACtE,CAAC;IACJ,CAAC;IAED,sDAAsD;IACtD,MAAM,OAAO,GAA4B;QACvC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,cAAuB;QAC7B,MAAM,EAAE,MAAM,CAAC,QAAQ;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO;QACP,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;IAEF,gCAAgC;IAChC,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
package/dist/service.d.ts
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import type { AgoraIdentity, RelayConfig } from './config.js';
|
|
2
|
-
import type { Envelope } from './message/envelope.js';
|
|
3
|
-
import type { MessageType } from './message/envelope.js';
|
|
4
|
-
import type { PeerConfig } from './transport/http.js';
|
|
5
|
-
/**
|
|
6
|
-
* Service config: identity, peers keyed by name, optional relay.
|
|
7
|
-
*/
|
|
8
|
-
export interface AgoraServiceConfig {
|
|
9
|
-
identity: AgoraIdentity;
|
|
10
|
-
peers: Map<string, PeerConfig>;
|
|
11
|
-
relay?: RelayConfig;
|
|
12
|
-
}
|
|
13
|
-
export interface SendMessageOptions {
|
|
14
|
-
peerName: string;
|
|
15
|
-
type: MessageType;
|
|
16
|
-
payload: unknown;
|
|
17
|
-
inReplyTo?: string;
|
|
18
|
-
}
|
|
19
|
-
export interface SendMessageResult {
|
|
20
|
-
ok: boolean;
|
|
21
|
-
status: number;
|
|
22
|
-
error?: string;
|
|
23
|
-
}
|
|
24
|
-
export interface DecodeInboundResult {
|
|
25
|
-
ok: boolean;
|
|
26
|
-
envelope?: Envelope;
|
|
27
|
-
reason?: string;
|
|
28
|
-
}
|
|
29
|
-
export type RelayMessageHandler = (envelope: Envelope) => void;
|
|
30
|
-
export type RelayMessageHandlerWithName = (envelope: Envelope, from: string, fromName?: string) => void;
|
|
31
|
-
export interface Logger {
|
|
32
|
-
debug(message: string): void;
|
|
33
|
-
}
|
|
34
|
-
export interface RelayClientLike {
|
|
35
|
-
connect(): Promise<void>;
|
|
36
|
-
disconnect(): void;
|
|
37
|
-
connected(): boolean;
|
|
38
|
-
send(to: string, envelope: Envelope): Promise<{
|
|
39
|
-
ok: boolean;
|
|
40
|
-
error?: string;
|
|
41
|
-
}>;
|
|
42
|
-
on(event: 'message', handler: (envelope: Envelope, from: string, fromName?: string) => void): void;
|
|
43
|
-
on(event: 'error', handler: (error: Error) => void): void;
|
|
44
|
-
}
|
|
45
|
-
export interface RelayClientFactory {
|
|
46
|
-
(opts: {
|
|
47
|
-
relayUrl: string;
|
|
48
|
-
publicKey: string;
|
|
49
|
-
privateKey: string;
|
|
50
|
-
name?: string;
|
|
51
|
-
pingInterval: number;
|
|
52
|
-
maxReconnectDelay: number;
|
|
53
|
-
}): RelayClientLike;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* High-level Agora service: send by peer name, decode inbound, relay lifecycle.
|
|
57
|
-
*/
|
|
58
|
-
export declare class AgoraService {
|
|
59
|
-
private config;
|
|
60
|
-
private relayClient;
|
|
61
|
-
private relayMessageHandler;
|
|
62
|
-
private relayMessageHandlerWithName;
|
|
63
|
-
private logger;
|
|
64
|
-
private relayClientFactory;
|
|
65
|
-
constructor(config: AgoraServiceConfig, logger?: Logger, relayClientFactory?: RelayClientFactory);
|
|
66
|
-
/**
|
|
67
|
-
* Send a signed message to a named peer.
|
|
68
|
-
* Tries HTTP webhook first; falls back to relay if HTTP is unavailable.
|
|
69
|
-
*/
|
|
70
|
-
sendMessage(options: SendMessageOptions): Promise<SendMessageResult>;
|
|
71
|
-
/**
|
|
72
|
-
* Decode and verify an inbound envelope from a webhook message.
|
|
73
|
-
*/
|
|
74
|
-
decodeInbound(message: string): Promise<DecodeInboundResult>;
|
|
75
|
-
getPeers(): string[];
|
|
76
|
-
getPeerConfig(name: string): PeerConfig | undefined;
|
|
77
|
-
/**
|
|
78
|
-
* Connect to the relay server.
|
|
79
|
-
*/
|
|
80
|
-
connectRelay(url: string): Promise<void>;
|
|
81
|
-
setRelayMessageHandler(handler: RelayMessageHandler): void;
|
|
82
|
-
setRelayMessageHandlerWithName(handler: RelayMessageHandlerWithName): void;
|
|
83
|
-
disconnectRelay(): Promise<void>;
|
|
84
|
-
isRelayConnected(): boolean;
|
|
85
|
-
/**
|
|
86
|
-
* Load Agora configuration and return service config (peers as Map).
|
|
87
|
-
*/
|
|
88
|
-
static loadConfig(path?: string): Promise<AgoraServiceConfig>;
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=service.d.ts.map
|
package/dist/service.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/dist/service.js
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { getDefaultConfigPath, loadAgoraConfigAsync } from './config.js';
|
|
2
|
-
import { RelayClient } from './relay/client.js';
|
|
3
|
-
import { decodeInboundEnvelope, sendToPeer } from './transport/http.js';
|
|
4
|
-
import { sendViaRelay } from './transport/relay.js';
|
|
5
|
-
import { shortKey } from './utils.js';
|
|
6
|
-
/**
|
|
7
|
-
* High-level Agora service: send by peer name, decode inbound, relay lifecycle.
|
|
8
|
-
*/
|
|
9
|
-
export class AgoraService {
|
|
10
|
-
config;
|
|
11
|
-
relayClient = null;
|
|
12
|
-
relayMessageHandler = null;
|
|
13
|
-
relayMessageHandlerWithName = null;
|
|
14
|
-
logger;
|
|
15
|
-
relayClientFactory;
|
|
16
|
-
constructor(config, logger, relayClientFactory) {
|
|
17
|
-
this.config = config;
|
|
18
|
-
this.logger = logger ?? null;
|
|
19
|
-
this.relayClientFactory = relayClientFactory ?? null;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Send a signed message to a named peer.
|
|
23
|
-
* Tries HTTP webhook first; falls back to relay if HTTP is unavailable.
|
|
24
|
-
*/
|
|
25
|
-
async sendMessage(options) {
|
|
26
|
-
const peer = this.config.peers.get(options.peerName);
|
|
27
|
-
if (!peer) {
|
|
28
|
-
return {
|
|
29
|
-
ok: false,
|
|
30
|
-
status: 0,
|
|
31
|
-
error: `Unknown peer: ${options.peerName}`,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
// Try HTTP first (only if peer has a webhook URL)
|
|
35
|
-
if (peer.url) {
|
|
36
|
-
const transportConfig = {
|
|
37
|
-
identity: {
|
|
38
|
-
publicKey: this.config.identity.publicKey,
|
|
39
|
-
privateKey: this.config.identity.privateKey,
|
|
40
|
-
},
|
|
41
|
-
peers: new Map([[peer.publicKey, peer]]),
|
|
42
|
-
};
|
|
43
|
-
const httpResult = await sendToPeer(transportConfig, peer.publicKey, options.type, options.payload, options.inReplyTo);
|
|
44
|
-
if (httpResult.ok) {
|
|
45
|
-
return httpResult;
|
|
46
|
-
}
|
|
47
|
-
this.logger?.debug(`HTTP send to ${options.peerName} failed: ${httpResult.error}`);
|
|
48
|
-
}
|
|
49
|
-
// Fall back to relay
|
|
50
|
-
if (this.relayClient?.connected() && this.config.relay) {
|
|
51
|
-
const relayResult = await sendViaRelay({
|
|
52
|
-
identity: this.config.identity,
|
|
53
|
-
relayUrl: this.config.relay.url,
|
|
54
|
-
relayClient: this.relayClient,
|
|
55
|
-
}, peer.publicKey, options.type, options.payload, options.inReplyTo);
|
|
56
|
-
return {
|
|
57
|
-
ok: relayResult.ok,
|
|
58
|
-
status: 0,
|
|
59
|
-
error: relayResult.error,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
// Both failed
|
|
63
|
-
return {
|
|
64
|
-
ok: false,
|
|
65
|
-
status: 0,
|
|
66
|
-
error: peer.url
|
|
67
|
-
? `HTTP send failed and relay not available for peer: ${options.peerName}`
|
|
68
|
-
: `No webhook URL and relay not available for peer: ${options.peerName}`,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Decode and verify an inbound envelope from a webhook message.
|
|
73
|
-
*/
|
|
74
|
-
async decodeInbound(message) {
|
|
75
|
-
const peersByPubKey = new Map();
|
|
76
|
-
for (const peer of this.config.peers.values()) {
|
|
77
|
-
peersByPubKey.set(peer.publicKey, peer);
|
|
78
|
-
}
|
|
79
|
-
const result = decodeInboundEnvelope(message, peersByPubKey);
|
|
80
|
-
if (result.ok) {
|
|
81
|
-
return { ok: true, envelope: result.envelope };
|
|
82
|
-
}
|
|
83
|
-
return { ok: false, reason: result.reason };
|
|
84
|
-
}
|
|
85
|
-
getPeers() {
|
|
86
|
-
return Array.from(this.config.peers.keys());
|
|
87
|
-
}
|
|
88
|
-
getPeerConfig(name) {
|
|
89
|
-
return this.config.peers.get(name);
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Connect to the relay server.
|
|
93
|
-
*/
|
|
94
|
-
async connectRelay(url) {
|
|
95
|
-
if (this.relayClient) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const maxReconnectDelay = this.config.relay?.reconnectMaxMs ?? 300000;
|
|
99
|
-
let name = this.config.identity.name ?? this.config.relay?.name;
|
|
100
|
-
// Never use the short key (id) as the relay display name; treat it as no name
|
|
101
|
-
if (name && name === shortKey(this.config.identity.publicKey)) {
|
|
102
|
-
name = undefined;
|
|
103
|
-
}
|
|
104
|
-
const opts = {
|
|
105
|
-
relayUrl: url,
|
|
106
|
-
publicKey: this.config.identity.publicKey,
|
|
107
|
-
privateKey: this.config.identity.privateKey,
|
|
108
|
-
name,
|
|
109
|
-
pingInterval: 30000,
|
|
110
|
-
maxReconnectDelay,
|
|
111
|
-
};
|
|
112
|
-
if (this.relayClientFactory) {
|
|
113
|
-
this.relayClient = this.relayClientFactory(opts);
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
this.relayClient = new RelayClient(opts);
|
|
117
|
-
}
|
|
118
|
-
this.relayClient.on('error', (error) => {
|
|
119
|
-
this.logger?.debug(`Agora relay error: ${error.message}`);
|
|
120
|
-
});
|
|
121
|
-
this.relayClient.on('message', (envelope, from, fromName) => {
|
|
122
|
-
if (this.relayMessageHandlerWithName) {
|
|
123
|
-
this.relayMessageHandlerWithName(envelope, from, fromName);
|
|
124
|
-
}
|
|
125
|
-
else if (this.relayMessageHandler) {
|
|
126
|
-
this.relayMessageHandler(envelope);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
try {
|
|
130
|
-
await this.relayClient.connect();
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
134
|
-
this.logger?.debug(`Agora relay connect failed (${url}): ${message}`);
|
|
135
|
-
this.relayClient = null;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
setRelayMessageHandler(handler) {
|
|
139
|
-
this.relayMessageHandler = handler;
|
|
140
|
-
this.relayMessageHandlerWithName = null;
|
|
141
|
-
}
|
|
142
|
-
setRelayMessageHandlerWithName(handler) {
|
|
143
|
-
this.relayMessageHandlerWithName = handler;
|
|
144
|
-
this.relayMessageHandler = null;
|
|
145
|
-
}
|
|
146
|
-
async disconnectRelay() {
|
|
147
|
-
if (this.relayClient) {
|
|
148
|
-
this.relayClient.disconnect();
|
|
149
|
-
this.relayClient = null;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
isRelayConnected() {
|
|
153
|
-
return this.relayClient?.connected() ?? false;
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Load Agora configuration and return service config (peers as Map).
|
|
157
|
-
*/
|
|
158
|
-
static async loadConfig(path) {
|
|
159
|
-
const configPath = path ?? getDefaultConfigPath();
|
|
160
|
-
const loaded = await loadAgoraConfigAsync(configPath);
|
|
161
|
-
const peers = new Map();
|
|
162
|
-
for (const [name, p] of Object.entries(loaded.peers)) {
|
|
163
|
-
peers.set(name, {
|
|
164
|
-
publicKey: p.publicKey,
|
|
165
|
-
url: p.url,
|
|
166
|
-
token: p.token,
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
return {
|
|
170
|
-
identity: loaded.identity,
|
|
171
|
-
peers,
|
|
172
|
-
relay: loaded.relay,
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
//# sourceMappingURL=service.js.map
|
package/dist/service.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
package/dist/transport/http.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { type Envelope, type MessageType } from '../message/envelope.js';
|
|
2
|
-
export interface PeerConfig {
|
|
3
|
-
/** Peer's webhook URL, e.g. http://localhost:18790/hooks (undefined for relay-only peers) */
|
|
4
|
-
url?: string;
|
|
5
|
-
/** Peer's webhook auth token (undefined for relay-only peers) */
|
|
6
|
-
token?: string;
|
|
7
|
-
/** Peer's public key (hex) for verifying responses */
|
|
8
|
-
publicKey: string;
|
|
9
|
-
}
|
|
10
|
-
export interface TransportConfig {
|
|
11
|
-
/** This agent's keypair */
|
|
12
|
-
identity: {
|
|
13
|
-
publicKey: string;
|
|
14
|
-
privateKey: string;
|
|
15
|
-
};
|
|
16
|
-
/** Known peers */
|
|
17
|
-
peers: Map<string, PeerConfig>;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Send a signed envelope to a peer via HTTP webhook.
|
|
21
|
-
* Creates the envelope, signs it, and POSTs to the peer's /hooks/agent endpoint.
|
|
22
|
-
* Returns the HTTP status code.
|
|
23
|
-
*/
|
|
24
|
-
export declare function sendToPeer(config: TransportConfig, peerPublicKey: string, type: MessageType, payload: unknown, inReplyTo?: string): Promise<{
|
|
25
|
-
ok: boolean;
|
|
26
|
-
status: number;
|
|
27
|
-
error?: string;
|
|
28
|
-
}>;
|
|
29
|
-
/**
|
|
30
|
-
* Decode and verify an inbound Agora envelope from a webhook message.
|
|
31
|
-
* Expects the message to start with [AGORA_ENVELOPE] followed by base64.
|
|
32
|
-
* Returns the verified envelope or an error.
|
|
33
|
-
*/
|
|
34
|
-
export declare function decodeInboundEnvelope(message: string, knownPeers: Map<string, PeerConfig>): {
|
|
35
|
-
ok: true;
|
|
36
|
-
envelope: Envelope;
|
|
37
|
-
} | {
|
|
38
|
-
ok: false;
|
|
39
|
-
reason: string;
|
|
40
|
-
};
|
|
41
|
-
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEzG,MAAM,WAAW,UAAU;IACzB,6FAA6F;IAC7F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,kBAAkB;IAClB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,eAAe,EACvB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyD1D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAiDlE"}
|