@rookdaemon/agora 0.2.8 → 0.3.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/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 -30
- package/dist/index.js +1135 -29
- package/dist/index.js.map +1 -1
- package/package.json +4 -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/jwt-auth.d.ts +0 -40
- package/dist/relay/jwt-auth.d.ts.map +0 -1
- package/dist/relay/jwt-auth.js +0 -109
- package/dist/relay/jwt-auth.js.map +0 -1
- package/dist/relay/message-buffer.d.ts +0 -41
- package/dist/relay/message-buffer.d.ts.map +0 -1
- package/dist/relay/message-buffer.js +0 -53
- package/dist/relay/message-buffer.js.map +0 -1
- package/dist/relay/rest-api.d.ts +0 -68
- package/dist/relay/rest-api.d.ts.map +0 -1
- package/dist/relay/rest-api.js +0 -225
- package/dist/relay/rest-api.js.map +0 -1
- package/dist/relay/run-relay.d.ts +0 -33
- package/dist/relay/run-relay.d.ts.map +0 -1
- package/dist/relay/run-relay.js +0 -57
- package/dist/relay/run-relay.js.map +0 -1
- package/dist/relay/server.d.ts +0 -91
- package/dist/relay/server.d.ts.map +0 -1
- package/dist/relay/server.js +0 -385
- package/dist/relay/server.js.map +0 -1
- package/dist/relay/store.d.ts +0 -19
- package/dist/relay/store.d.ts.map +0 -1
- package/dist/relay/store.js +0 -55
- package/dist/relay/store.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/relay/rest-api.d.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* rest-api.ts — Express router implementing the Agora relay REST API.
|
|
3
|
-
*
|
|
4
|
-
* Endpoints:
|
|
5
|
-
* POST /v1/register — Register agent, obtain JWT session token
|
|
6
|
-
* POST /v1/send — Send message to a peer (requires auth)
|
|
7
|
-
* GET /v1/peers — List online peers (requires auth)
|
|
8
|
-
* GET /v1/messages — Poll for new inbound messages (requires auth)
|
|
9
|
-
* DELETE /v1/disconnect — Invalidate token and disconnect (requires auth)
|
|
10
|
-
*/
|
|
11
|
-
import { Router } from 'express';
|
|
12
|
-
import { MessageBuffer } from './message-buffer.js';
|
|
13
|
-
/**
|
|
14
|
-
* A session for a REST-connected agent.
|
|
15
|
-
* privateKey is held only in memory and never logged or persisted.
|
|
16
|
-
*/
|
|
17
|
-
export interface RestSession {
|
|
18
|
-
publicKey: string;
|
|
19
|
-
privateKey: string;
|
|
20
|
-
name?: string;
|
|
21
|
-
metadata?: {
|
|
22
|
-
version?: string;
|
|
23
|
-
capabilities?: string[];
|
|
24
|
-
};
|
|
25
|
-
registeredAt: number;
|
|
26
|
-
expiresAt: number;
|
|
27
|
-
token: string;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Minimal interface for the relay server that the REST API depends on.
|
|
31
|
-
*/
|
|
32
|
-
export interface RelayInterface {
|
|
33
|
-
getAgents(): Map<string, {
|
|
34
|
-
publicKey: string;
|
|
35
|
-
name?: string;
|
|
36
|
-
lastSeen: number;
|
|
37
|
-
metadata?: {
|
|
38
|
-
version?: string;
|
|
39
|
-
capabilities?: string[];
|
|
40
|
-
};
|
|
41
|
-
socket: unknown;
|
|
42
|
-
}>;
|
|
43
|
-
on(event: 'message-relayed', handler: (from: string, to: string, envelope: unknown) => void): void;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Envelope creation function interface (matches createEnvelope from message/envelope).
|
|
47
|
-
*/
|
|
48
|
-
export type CreateEnvelopeFn = (type: string, sender: string, privateKey: string, payload: unknown, timestamp?: number, inReplyTo?: string) => {
|
|
49
|
-
id: string;
|
|
50
|
-
type: string;
|
|
51
|
-
sender: string;
|
|
52
|
-
timestamp: number;
|
|
53
|
-
payload: unknown;
|
|
54
|
-
signature: string;
|
|
55
|
-
inReplyTo?: string;
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* Envelope verification function interface.
|
|
59
|
-
*/
|
|
60
|
-
export type VerifyEnvelopeFn = (envelope: unknown) => {
|
|
61
|
-
valid: boolean;
|
|
62
|
-
reason?: string;
|
|
63
|
-
};
|
|
64
|
-
/**
|
|
65
|
-
* Create the REST API router.
|
|
66
|
-
*/
|
|
67
|
-
export declare function createRestRouter(relay: RelayInterface, buffer: MessageBuffer, sessions: Map<string, RestSession>, createEnv: CreateEnvelopeFn, verifyEnv: VerifyEnvelopeFn): Router;
|
|
68
|
-
//# sourceMappingURL=rest-api.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-api.d.ts","sourceRoot":"","sources":["../../src/relay/rest-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AASjC,OAAO,EAAE,aAAa,EAAwB,MAAM,qBAAqB,CAAC;AAU1E;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAeD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,IAAI,GAAG,CACd,MAAM,EACN;QACE,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QACzD,MAAM,EAAE,OAAO,CAAC;KACjB,CACF,CAAC;IACF,EAAE,CACA,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,GAC7D,IAAI,CAAC;CACT;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,KACf;IACH,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClC,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,gBAAgB,GAC1B,MAAM,CA4QR"}
|
package/dist/relay/rest-api.js
DELETED
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* rest-api.ts — Express router implementing the Agora relay REST API.
|
|
3
|
-
*
|
|
4
|
-
* Endpoints:
|
|
5
|
-
* POST /v1/register — Register agent, obtain JWT session token
|
|
6
|
-
* POST /v1/send — Send message to a peer (requires auth)
|
|
7
|
-
* GET /v1/peers — List online peers (requires auth)
|
|
8
|
-
* GET /v1/messages — Poll for new inbound messages (requires auth)
|
|
9
|
-
* DELETE /v1/disconnect — Invalidate token and disconnect (requires auth)
|
|
10
|
-
*/
|
|
11
|
-
import { Router } from 'express';
|
|
12
|
-
import { rateLimit } from 'express-rate-limit';
|
|
13
|
-
import { createToken, revokeToken, requireAuth, } from './jwt-auth.js';
|
|
14
|
-
const apiRateLimit = rateLimit({
|
|
15
|
-
windowMs: 60_000,
|
|
16
|
-
limit: 60,
|
|
17
|
-
standardHeaders: 'draft-7',
|
|
18
|
-
legacyHeaders: false,
|
|
19
|
-
message: { error: 'Too many requests — try again later' },
|
|
20
|
-
});
|
|
21
|
-
function pruneExpiredSessions(sessions, buffer) {
|
|
22
|
-
const now = Date.now();
|
|
23
|
-
for (const [publicKey, session] of sessions) {
|
|
24
|
-
if (session.expiresAt <= now) {
|
|
25
|
-
sessions.delete(publicKey);
|
|
26
|
-
buffer.delete(publicKey);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Create the REST API router.
|
|
32
|
-
*/
|
|
33
|
-
export function createRestRouter(relay, buffer, sessions, createEnv, verifyEnv) {
|
|
34
|
-
const router = Router();
|
|
35
|
-
router.use(apiRateLimit);
|
|
36
|
-
relay.on('message-relayed', (from, to, envelope) => {
|
|
37
|
-
if (!sessions.has(to))
|
|
38
|
-
return;
|
|
39
|
-
const agentMap = relay.getAgents();
|
|
40
|
-
const senderAgent = agentMap.get(from);
|
|
41
|
-
const env = envelope;
|
|
42
|
-
const msg = {
|
|
43
|
-
id: env.id,
|
|
44
|
-
from,
|
|
45
|
-
fromName: senderAgent?.name,
|
|
46
|
-
type: env.type,
|
|
47
|
-
payload: env.payload,
|
|
48
|
-
timestamp: env.timestamp,
|
|
49
|
-
inReplyTo: env.inReplyTo,
|
|
50
|
-
};
|
|
51
|
-
buffer.add(to, msg);
|
|
52
|
-
});
|
|
53
|
-
router.post('/v1/register', async (req, res) => {
|
|
54
|
-
const { publicKey, privateKey, name, metadata } = req.body;
|
|
55
|
-
if (!publicKey || typeof publicKey !== 'string') {
|
|
56
|
-
res.status(400).json({ error: 'publicKey is required' });
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
if (!privateKey || typeof privateKey !== 'string') {
|
|
60
|
-
res.status(400).json({ error: 'privateKey is required' });
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const testEnvelope = createEnv('announce', publicKey, privateKey, { challenge: 'register' }, Date.now());
|
|
64
|
-
const verification = verifyEnv(testEnvelope);
|
|
65
|
-
if (!verification.valid) {
|
|
66
|
-
res
|
|
67
|
-
.status(400)
|
|
68
|
-
.json({ error: 'Key pair verification failed: ' + verification.reason });
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const { token, expiresAt } = createToken({ publicKey, name });
|
|
72
|
-
pruneExpiredSessions(sessions, buffer);
|
|
73
|
-
const session = {
|
|
74
|
-
publicKey,
|
|
75
|
-
privateKey,
|
|
76
|
-
name,
|
|
77
|
-
metadata,
|
|
78
|
-
registeredAt: Date.now(),
|
|
79
|
-
expiresAt,
|
|
80
|
-
token,
|
|
81
|
-
};
|
|
82
|
-
sessions.set(publicKey, session);
|
|
83
|
-
const wsAgents = relay.getAgents();
|
|
84
|
-
const peers = [];
|
|
85
|
-
for (const agent of wsAgents.values()) {
|
|
86
|
-
if (agent.publicKey !== publicKey) {
|
|
87
|
-
peers.push({
|
|
88
|
-
publicKey: agent.publicKey,
|
|
89
|
-
name: agent.name,
|
|
90
|
-
lastSeen: agent.lastSeen,
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
for (const s of sessions.values()) {
|
|
95
|
-
if (s.publicKey !== publicKey && !wsAgents.has(s.publicKey)) {
|
|
96
|
-
peers.push({
|
|
97
|
-
publicKey: s.publicKey,
|
|
98
|
-
name: s.name,
|
|
99
|
-
lastSeen: s.registeredAt,
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
res.json({ token, expiresAt, peers });
|
|
104
|
-
});
|
|
105
|
-
router.post('/v1/send', requireAuth, async (req, res) => {
|
|
106
|
-
const { to, type, payload, inReplyTo } = req.body;
|
|
107
|
-
if (!to || typeof to !== 'string') {
|
|
108
|
-
res.status(400).json({ error: 'to is required' });
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
if (!type || typeof type !== 'string') {
|
|
112
|
-
res.status(400).json({ error: 'type is required' });
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
if (payload === undefined) {
|
|
116
|
-
res.status(400).json({ error: 'payload is required' });
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
const senderPublicKey = req.agent.publicKey;
|
|
120
|
-
const session = sessions.get(senderPublicKey);
|
|
121
|
-
if (!session) {
|
|
122
|
-
res.status(401).json({ error: 'Session not found — please re-register' });
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
const envelope = createEnv(type, senderPublicKey, session.privateKey, payload, Date.now(), inReplyTo);
|
|
126
|
-
const wsAgents = relay.getAgents();
|
|
127
|
-
const wsRecipient = wsAgents.get(to);
|
|
128
|
-
if (wsRecipient && wsRecipient.socket) {
|
|
129
|
-
const ws = wsRecipient.socket;
|
|
130
|
-
const OPEN = 1;
|
|
131
|
-
if (ws.readyState !== OPEN) {
|
|
132
|
-
res.status(503).json({ error: 'Recipient connection is not open' });
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
try {
|
|
136
|
-
const relayMsg = JSON.stringify({
|
|
137
|
-
type: 'message',
|
|
138
|
-
from: senderPublicKey,
|
|
139
|
-
name: session.name,
|
|
140
|
-
envelope,
|
|
141
|
-
});
|
|
142
|
-
ws.send(relayMsg);
|
|
143
|
-
res.json({ ok: true, envelopeId: envelope.id });
|
|
144
|
-
return;
|
|
145
|
-
}
|
|
146
|
-
catch (err) {
|
|
147
|
-
res.status(500).json({
|
|
148
|
-
error: 'Failed to deliver message: ' +
|
|
149
|
-
(err instanceof Error ? err.message : String(err)),
|
|
150
|
-
});
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
const restRecipient = sessions.get(to);
|
|
155
|
-
if (restRecipient) {
|
|
156
|
-
const senderAgent = wsAgents.get(senderPublicKey);
|
|
157
|
-
const msg = {
|
|
158
|
-
id: envelope.id,
|
|
159
|
-
from: senderPublicKey,
|
|
160
|
-
fromName: session.name ?? senderAgent?.name,
|
|
161
|
-
type: envelope.type,
|
|
162
|
-
payload: envelope.payload,
|
|
163
|
-
timestamp: envelope.timestamp,
|
|
164
|
-
inReplyTo: envelope.inReplyTo,
|
|
165
|
-
};
|
|
166
|
-
buffer.add(to, msg);
|
|
167
|
-
res.json({ ok: true, envelopeId: envelope.id });
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
res.status(404).json({ error: 'Recipient not connected' });
|
|
171
|
-
});
|
|
172
|
-
router.get('/v1/peers', requireAuth, (req, res) => {
|
|
173
|
-
const callerPublicKey = req.agent.publicKey;
|
|
174
|
-
const wsAgents = relay.getAgents();
|
|
175
|
-
const peerList = [];
|
|
176
|
-
for (const agent of wsAgents.values()) {
|
|
177
|
-
if (agent.publicKey !== callerPublicKey) {
|
|
178
|
-
peerList.push({
|
|
179
|
-
publicKey: agent.publicKey,
|
|
180
|
-
name: agent.name,
|
|
181
|
-
lastSeen: agent.lastSeen,
|
|
182
|
-
metadata: agent.metadata,
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
for (const s of sessions.values()) {
|
|
187
|
-
if (s.publicKey !== callerPublicKey && !wsAgents.has(s.publicKey)) {
|
|
188
|
-
peerList.push({
|
|
189
|
-
publicKey: s.publicKey,
|
|
190
|
-
name: s.name,
|
|
191
|
-
lastSeen: s.registeredAt,
|
|
192
|
-
metadata: s.metadata,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
res.json({ peers: peerList });
|
|
197
|
-
});
|
|
198
|
-
router.get('/v1/messages', requireAuth, (req, res) => {
|
|
199
|
-
const publicKey = req.agent.publicKey;
|
|
200
|
-
const sinceRaw = req.query.since;
|
|
201
|
-
const limitRaw = req.query.limit;
|
|
202
|
-
const since = sinceRaw ? parseInt(sinceRaw, 10) : undefined;
|
|
203
|
-
const limit = Math.min(limitRaw ? parseInt(limitRaw, 10) : 50, 100);
|
|
204
|
-
let messages = buffer.get(publicKey, since);
|
|
205
|
-
const hasMore = messages.length > limit;
|
|
206
|
-
if (hasMore) {
|
|
207
|
-
messages = messages.slice(0, limit);
|
|
208
|
-
}
|
|
209
|
-
if (since === undefined) {
|
|
210
|
-
buffer.clear(publicKey);
|
|
211
|
-
}
|
|
212
|
-
res.json({ messages, hasMore });
|
|
213
|
-
});
|
|
214
|
-
router.delete('/v1/disconnect', requireAuth, (req, res) => {
|
|
215
|
-
const publicKey = req.agent.publicKey;
|
|
216
|
-
const authHeader = req.headers.authorization;
|
|
217
|
-
const token = authHeader.slice(7);
|
|
218
|
-
revokeToken(token);
|
|
219
|
-
sessions.delete(publicKey);
|
|
220
|
-
buffer.delete(publicKey);
|
|
221
|
-
res.json({ ok: true });
|
|
222
|
-
});
|
|
223
|
-
return router;
|
|
224
|
-
}
|
|
225
|
-
//# sourceMappingURL=rest-api.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rest-api.js","sourceRoot":"","sources":["../../src/relay/rest-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* run-relay.ts — Start Agora relay: WebSocket server and optional REST API.
|
|
3
|
-
*
|
|
4
|
-
* When REST is enabled, starts:
|
|
5
|
-
* 1. WebSocket relay (RelayServer) on wsPort
|
|
6
|
-
* 2. REST API server (Express) on restPort (default wsPort + 1)
|
|
7
|
-
*
|
|
8
|
-
* Environment variables (when REST enabled):
|
|
9
|
-
* AGORA_RELAY_JWT_SECRET — Required for REST (JWT signing)
|
|
10
|
-
* AGORA_JWT_EXPIRY_SECONDS — JWT expiry in seconds (default: 3600)
|
|
11
|
-
* PORT — WebSocket port (default: 3001); REST uses PORT+1
|
|
12
|
-
*/
|
|
13
|
-
import http from 'node:http';
|
|
14
|
-
import { RelayServer, type RelayServerOptions } from './server.js';
|
|
15
|
-
export interface RunRelayOptions {
|
|
16
|
-
/** WebSocket port (default from PORT env or 3001) */
|
|
17
|
-
wsPort?: number;
|
|
18
|
-
/** REST API port (default: wsPort + 1). Ignored if enableRest is false. */
|
|
19
|
-
restPort?: number;
|
|
20
|
-
/** Enable REST API (requires AGORA_RELAY_JWT_SECRET). Default: true if AGORA_RELAY_JWT_SECRET is set. */
|
|
21
|
-
enableRest?: boolean;
|
|
22
|
-
/** Relay server options (identity, storagePeers, storageDir) */
|
|
23
|
-
relayOptions?: RelayServerOptions;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Start WebSocket relay and optionally REST API.
|
|
27
|
-
* Returns { relay, httpServer } where httpServer is set only when REST is enabled.
|
|
28
|
-
*/
|
|
29
|
-
export declare function runRelay(options?: RunRelayOptions): Promise<{
|
|
30
|
-
relay: RelayServer;
|
|
31
|
-
httpServer?: http.Server;
|
|
32
|
-
}>;
|
|
33
|
-
//# sourceMappingURL=run-relay.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-relay.d.ts","sourceRoot":"","sources":["../../src/relay/run-relay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA6BnE,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yGAAyG;IACzG,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gEAAgE;IAChE,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC;IACrE,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;CAC1B,CAAC,CAmDD"}
|
package/dist/relay/run-relay.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* run-relay.ts — Start Agora relay: WebSocket server and optional REST API.
|
|
3
|
-
*
|
|
4
|
-
* When REST is enabled, starts:
|
|
5
|
-
* 1. WebSocket relay (RelayServer) on wsPort
|
|
6
|
-
* 2. REST API server (Express) on restPort (default wsPort + 1)
|
|
7
|
-
*
|
|
8
|
-
* Environment variables (when REST enabled):
|
|
9
|
-
* AGORA_RELAY_JWT_SECRET — Required for REST (JWT signing)
|
|
10
|
-
* AGORA_JWT_EXPIRY_SECONDS — JWT expiry in seconds (default: 3600)
|
|
11
|
-
* PORT — WebSocket port (default: 3001); REST uses PORT+1
|
|
12
|
-
*/
|
|
13
|
-
import http from 'node:http';
|
|
14
|
-
import express from 'express';
|
|
15
|
-
import { RelayServer } from './server.js';
|
|
16
|
-
import { createEnvelope, verifyEnvelope, } from '../message/envelope.js';
|
|
17
|
-
import { createRestRouter } from './rest-api.js';
|
|
18
|
-
import { MessageBuffer } from './message-buffer.js';
|
|
19
|
-
/** Wrapper so REST API can pass string type; createEnvelope expects MessageType */
|
|
20
|
-
const createEnvelopeForRest = (type, sender, privateKey, payload, timestamp, inReplyTo) => createEnvelope(type, sender, privateKey, payload, timestamp ?? Date.now(), inReplyTo);
|
|
21
|
-
/**
|
|
22
|
-
* Start WebSocket relay and optionally REST API.
|
|
23
|
-
* Returns { relay, httpServer } where httpServer is set only when REST is enabled.
|
|
24
|
-
*/
|
|
25
|
-
export async function runRelay(options = {}) {
|
|
26
|
-
const wsPort = options.wsPort ?? parseInt(process.env.PORT ?? '3001', 10);
|
|
27
|
-
const enableRest = options.enableRest ??
|
|
28
|
-
(typeof process.env.AGORA_RELAY_JWT_SECRET === 'string' &&
|
|
29
|
-
process.env.AGORA_RELAY_JWT_SECRET.length > 0);
|
|
30
|
-
const relay = new RelayServer(options.relayOptions);
|
|
31
|
-
await relay.start(wsPort);
|
|
32
|
-
if (!enableRest) {
|
|
33
|
-
return { relay };
|
|
34
|
-
}
|
|
35
|
-
if (!process.env.AGORA_RELAY_JWT_SECRET) {
|
|
36
|
-
await relay.stop();
|
|
37
|
-
throw new Error('AGORA_RELAY_JWT_SECRET environment variable is required when REST API is enabled');
|
|
38
|
-
}
|
|
39
|
-
const restPort = options.restPort ?? wsPort + 1;
|
|
40
|
-
const messageBuffer = new MessageBuffer();
|
|
41
|
-
const restSessions = new Map();
|
|
42
|
-
const app = express();
|
|
43
|
-
app.use(express.json());
|
|
44
|
-
const verifyForRest = (envelope) => verifyEnvelope(envelope);
|
|
45
|
-
const router = createRestRouter(relay, messageBuffer, restSessions, createEnvelopeForRest, verifyForRest);
|
|
46
|
-
app.use(router);
|
|
47
|
-
app.use((_req, res) => {
|
|
48
|
-
res.status(404).json({ error: 'Not found' });
|
|
49
|
-
});
|
|
50
|
-
const httpServer = http.createServer(app);
|
|
51
|
-
await new Promise((resolve, reject) => {
|
|
52
|
-
httpServer.listen(restPort, () => resolve());
|
|
53
|
-
httpServer.on('error', reject);
|
|
54
|
-
});
|
|
55
|
-
return { relay, httpServer };
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=run-relay.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run-relay.js","sourceRoot":"","sources":["../../src/relay/run-relay.ts"],"names":[],"mappings":"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"}
|
package/dist/relay/server.d.ts
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'node:events';
|
|
2
|
-
import { WebSocket } from 'ws';
|
|
3
|
-
import { type Envelope } from '../message/envelope.js';
|
|
4
|
-
/**
|
|
5
|
-
* Represents a connected agent in the relay
|
|
6
|
-
*/
|
|
7
|
-
interface ConnectedAgent {
|
|
8
|
-
/** Agent's public key */
|
|
9
|
-
publicKey: string;
|
|
10
|
-
/** Optional agent name */
|
|
11
|
-
name?: string;
|
|
12
|
-
/** WebSocket connection */
|
|
13
|
-
socket: WebSocket;
|
|
14
|
-
/** Last seen timestamp (ms) */
|
|
15
|
-
lastSeen: number;
|
|
16
|
-
/** Optional metadata */
|
|
17
|
-
metadata?: {
|
|
18
|
-
version?: string;
|
|
19
|
-
capabilities?: string[];
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Events emitted by RelayServer
|
|
24
|
-
*/
|
|
25
|
-
export interface RelayServerEvents {
|
|
26
|
-
'agent-registered': (publicKey: string) => void;
|
|
27
|
-
'agent-disconnected': (publicKey: string) => void;
|
|
28
|
-
'message-relayed': (from: string, to: string, envelope: Envelope) => void;
|
|
29
|
-
'error': (error: Error) => void;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* WebSocket relay server for routing messages between agents.
|
|
33
|
-
*
|
|
34
|
-
* Agents connect to the relay and register with their public key.
|
|
35
|
-
* Messages are routed to recipients based on the 'to' field.
|
|
36
|
-
* All envelopes are verified before being forwarded.
|
|
37
|
-
*/
|
|
38
|
-
export interface RelayServerOptions {
|
|
39
|
-
/** Optional relay identity for peer_list_request handling */
|
|
40
|
-
identity?: {
|
|
41
|
-
publicKey: string;
|
|
42
|
-
privateKey: string;
|
|
43
|
-
};
|
|
44
|
-
/** Public keys that should have messages stored when offline */
|
|
45
|
-
storagePeers?: string[];
|
|
46
|
-
/** Directory for persisting messages for storage peers */
|
|
47
|
-
storageDir?: string;
|
|
48
|
-
}
|
|
49
|
-
export declare class RelayServer extends EventEmitter {
|
|
50
|
-
private wss;
|
|
51
|
-
private agents;
|
|
52
|
-
private identity?;
|
|
53
|
-
private storagePeers;
|
|
54
|
-
private store;
|
|
55
|
-
constructor(options?: {
|
|
56
|
-
publicKey: string;
|
|
57
|
-
privateKey: string;
|
|
58
|
-
} | RelayServerOptions);
|
|
59
|
-
/**
|
|
60
|
-
* Start the relay server
|
|
61
|
-
* @param port - Port to listen on
|
|
62
|
-
* @param host - Optional host (default: all interfaces)
|
|
63
|
-
*/
|
|
64
|
-
start(port: number, host?: string): Promise<void>;
|
|
65
|
-
/**
|
|
66
|
-
* Stop the relay server
|
|
67
|
-
*/
|
|
68
|
-
stop(): Promise<void>;
|
|
69
|
-
/**
|
|
70
|
-
* Get all connected agents
|
|
71
|
-
*/
|
|
72
|
-
getAgents(): Map<string, ConnectedAgent>;
|
|
73
|
-
/**
|
|
74
|
-
* Handle incoming connection
|
|
75
|
-
*/
|
|
76
|
-
private handleConnection;
|
|
77
|
-
/**
|
|
78
|
-
* Send an error message to a client
|
|
79
|
-
*/
|
|
80
|
-
private sendError;
|
|
81
|
-
/**
|
|
82
|
-
* Broadcast a peer event to all connected agents
|
|
83
|
-
*/
|
|
84
|
-
private broadcastPeerEvent;
|
|
85
|
-
/**
|
|
86
|
-
* Handle peer list request from an agent
|
|
87
|
-
*/
|
|
88
|
-
private handlePeerListRequest;
|
|
89
|
-
}
|
|
90
|
-
export {};
|
|
91
|
-
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/relay/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAkC,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAIvF;;GAEG;AACH,UAAU,cAAc;IACtB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC1E,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,QAAQ,CAAC,CAA4C;IAC7D,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,KAAK,CAA6B;gBAE9B,OAAO,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,kBAAkB;IAgBpF;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BjD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;OAEG;IACH,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;IAIxC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwOxB;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CA8D9B"}
|