meshsig 0.5.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.
@@ -0,0 +1,27 @@
1
+ import { Registry } from './registry.js';
2
+ import { PeerNetwork } from './peers.js';
3
+ export interface ServerConfig {
4
+ port: number;
5
+ host: string;
6
+ dbPath: string;
7
+ name: string;
8
+ peers: string[];
9
+ }
10
+ export declare class MeshServer {
11
+ registry: Registry;
12
+ peerNetwork: PeerNetwork;
13
+ private config;
14
+ private httpServer;
15
+ private wss;
16
+ private dashboards;
17
+ private dashboardHtml;
18
+ constructor(config?: Partial<ServerConfig>);
19
+ start(): Promise<void>;
20
+ stop(): Promise<void>;
21
+ private _handleHttp;
22
+ private _handleWs;
23
+ private _broadcast;
24
+ private _json;
25
+ private _readBody;
26
+ private _verifyPageHtml;
27
+ }
package/dist/server.js ADDED
@@ -0,0 +1,433 @@
1
+ // ============================================================================
2
+ // MeshSig Server — HTTP + WebSocket + Live Dashboard
3
+ // ============================================================================
4
+ import { createServer } from 'node:http';
5
+ import { WebSocketServer, WebSocket } from 'ws';
6
+ import { readFileSync } from 'node:fs';
7
+ import { resolve, dirname } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { Registry } from './registry.js';
10
+ import { PeerNetwork } from './peers.js';
11
+ import { sign, verify, verifyWithDid, createHandshakeRequest, verifyHandshakeRequest, createHandshakeResponse, } from './crypto.js';
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ export class MeshServer {
14
+ registry;
15
+ peerNetwork;
16
+ config;
17
+ httpServer;
18
+ wss;
19
+ dashboards = new Set();
20
+ dashboardHtml;
21
+ constructor(config = {}) {
22
+ this.config = {
23
+ port: config.port || parseInt(process.env.MESH_PORT || '4888'),
24
+ host: config.host || '0.0.0.0',
25
+ dbPath: config.dbPath || ':memory:',
26
+ name: config.name || 'meshsig',
27
+ peers: config.peers || [],
28
+ };
29
+ this.registry = new Registry(this.config.dbPath);
30
+ this.peerNetwork = new PeerNetwork(this.registry, this.config.name);
31
+ this.httpServer = createServer(this._handleHttp.bind(this));
32
+ this.wss = new WebSocketServer({ server: this.httpServer });
33
+ this.wss.on('connection', this._handleWs.bind(this));
34
+ // Broadcast registry events to all dashboards
35
+ this.registry.on('mesh-event', (event) => {
36
+ this._broadcast(event);
37
+ });
38
+ // Broadcast peer events to dashboards
39
+ this.peerNetwork.on('peer-event', (event) => {
40
+ this._broadcast({ type: event.type, timestamp: new Date().toISOString(), data: event.data });
41
+ });
42
+ // Load dashboard HTML
43
+ try {
44
+ this.dashboardHtml = readFileSync(resolve(__dirname, 'dashboard.html'), 'utf-8');
45
+ }
46
+ catch {
47
+ this.dashboardHtml = '<html><body><h1>MeshSig</h1><p>Dashboard file not found.</p></body></html>';
48
+ }
49
+ }
50
+ async start() {
51
+ await new Promise(r => this.httpServer.listen(this.config.port, this.config.host, r));
52
+ // Connect to configured peers
53
+ for (const peerUrl of this.config.peers) {
54
+ this.peerNetwork.connectTo(peerUrl);
55
+ }
56
+ }
57
+ async stop() {
58
+ this.peerNetwork.close();
59
+ this.wss.close();
60
+ await new Promise(r => this.httpServer.close(() => r()));
61
+ this.registry.close();
62
+ }
63
+ // -- HTTP ------------------------------------------------------------------
64
+ async _handleHttp(req, res) {
65
+ const url = new URL(req.url || '/', `http://${req.headers.host}`);
66
+ const path = url.pathname;
67
+ const method = req.method;
68
+ res.setHeader('Access-Control-Allow-Origin', '*');
69
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
70
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
71
+ if (method === 'OPTIONS') {
72
+ res.writeHead(204);
73
+ res.end();
74
+ return;
75
+ }
76
+ try {
77
+ let body = null;
78
+ if (method === 'POST')
79
+ body = await this._readBody(req);
80
+ // Dashboard
81
+ if (method === 'GET' && (path === '/' || path === '/dashboard')) {
82
+ res.writeHead(200, { 'Content-Type': 'text/html' });
83
+ res.end(this.dashboardHtml);
84
+ return;
85
+ }
86
+ // Health
87
+ if (method === 'GET' && path === '/health') {
88
+ return this._json(res, 200, { status: 'ok', name: this.config.name });
89
+ }
90
+ // Stats
91
+ if (method === 'GET' && path === '/stats') {
92
+ return this._json(res, 200, { ...this.registry.stats(), uptime: process.uptime() });
93
+ }
94
+ // Snapshot (full state)
95
+ if (method === 'GET' && path === '/snapshot') {
96
+ return this._json(res, 200, this.registry.snapshot());
97
+ }
98
+ // Register agent
99
+ if (method === 'POST' && path === '/agents/register') {
100
+ const result = await this.registry.registerAgent(body.name, body.capabilities || []);
101
+ return this._json(res, 201, result);
102
+ }
103
+ // List agents
104
+ if (method === 'GET' && path === '/agents') {
105
+ return this._json(res, 200, { agents: this.registry.listAgents(url.searchParams.get('status') || undefined) });
106
+ }
107
+ // Get agent
108
+ if (method === 'GET' && path.startsWith('/agents/did:')) {
109
+ const did = path.slice('/agents/'.length);
110
+ const agent = this.registry.getAgent(did);
111
+ if (!agent)
112
+ return this._json(res, 404, { error: 'Not found' });
113
+ return this._json(res, 200, { agent });
114
+ }
115
+ // Discover
116
+ if (method === 'POST' && path === '/discover') {
117
+ const agents = this.registry.discover(body);
118
+ this._broadcast({
119
+ type: 'discovery:query', timestamp: new Date().toISOString(),
120
+ data: { capability: body.capability, results: agents.length },
121
+ });
122
+ return this._json(res, 200, { agents, total: agents.length });
123
+ }
124
+ // Sign
125
+ if (method === 'POST' && path === '/messages/sign') {
126
+ const ts = new Date().toISOString();
127
+ const sig = await sign(`${body.message}|${ts}`, body.privateKey);
128
+ return this._json(res, 200, { protocol: 'meshsig-v1', did: body.did, message: body.message, signature: sig, timestamp: ts });
129
+ }
130
+ // Verify
131
+ if (method === 'POST' && path === '/messages/verify') {
132
+ const content = body.timestamp ? `${body.message}|${body.timestamp}` : body.message;
133
+ const valid = await verifyWithDid(content, body.signature, body.did);
134
+ return this._json(res, 200, { valid, did: body.did });
135
+ }
136
+ // Send message (sign + log + broadcast)
137
+ if (method === 'POST' && path === '/messages/send') {
138
+ const ts = new Date().toISOString();
139
+ const sig = await sign(`${body.message}|${ts}`, body.privateKey);
140
+ const valid = await verifyWithDid(`${body.message}|${ts}`, sig, body.fromDid);
141
+ this.registry.logMessage(body.fromDid, body.toDid, body.message, sig, valid);
142
+ return this._json(res, 200, { sent: true, verified: valid, signature: sig, timestamp: ts });
143
+ }
144
+ // Handshake
145
+ if (method === 'POST' && path === '/handshake') {
146
+ const agentA = this.registry.getAgent(body.fromDid);
147
+ const agentB = this.registry.getAgent(body.toDid);
148
+ if (!agentA || !agentB)
149
+ return this._json(res, 404, { error: 'Agent not found' });
150
+ const req2 = await createHandshakeRequest(body.fromDid, body.toDid, body.privateKeyA, body.permissions || ['send:request']);
151
+ await verifyHandshakeRequest(req2, agentA.publicKey);
152
+ this._broadcast({
153
+ type: 'handshake:verify', timestamp: new Date().toISOString(),
154
+ data: { fromDid: body.fromDid, toDid: body.toDid, fromName: agentA.displayName, toName: agentB.displayName },
155
+ });
156
+ const conn = this.registry.createConnection(body.fromDid, body.toDid);
157
+ const resp = await createHandshakeResponse(req2, body.toDid, body.privateKeyB, true, body.permissions || ['send:request'], conn.channelId);
158
+ return this._json(res, 200, { connection: conn, handshake: { request: req2, response: resp } });
159
+ }
160
+ // Connections
161
+ if (method === 'GET' && path === '/connections') {
162
+ const did = url.searchParams.get('did') || undefined;
163
+ return this._json(res, 200, { connections: this.registry.getConnections(did) });
164
+ }
165
+ // Messages
166
+ if (method === 'GET' && path === '/messages') {
167
+ const limit = parseInt(url.searchParams.get('limit') || '50');
168
+ return this._json(res, 200, { messages: this.registry.getMessages(limit) });
169
+ }
170
+ // Peers
171
+ if (method === 'GET' && path === '/peers') {
172
+ return this._json(res, 200, { peers: this.peerNetwork.listPeers() });
173
+ }
174
+ if (method === 'POST' && path === '/peers/connect') {
175
+ if (!body?.url)
176
+ return this._json(res, 400, { error: 'url required' });
177
+ const peer = this.peerNetwork.connectTo(body.url);
178
+ return this._json(res, 200, { message: 'Connecting...', peerId: peer.id });
179
+ }
180
+ // Network discover (local + remote)
181
+ if (method === 'POST' && path === '/discover/network') {
182
+ const local = this.registry.discover(body);
183
+ const remote = await this.peerNetwork.discoverRemote(body);
184
+ return this._json(res, 200, { local, remote, total: local.length + remote.length });
185
+ }
186
+ // Audit export — full compliance report
187
+ if (method === 'GET' && path === '/audit/export') {
188
+ const format = url.searchParams.get('format') || 'json';
189
+ const agents = this.registry.listAgents();
190
+ const connections = this.registry.getConnections();
191
+ const messages = this.registry.getMessages(1000);
192
+ const rstats = this.registry.stats();
193
+ const uptime = process.uptime();
194
+ const report = {
195
+ meshsig: {
196
+ version: '0.5.0',
197
+ exported: new Date().toISOString(),
198
+ server: this.config.name,
199
+ },
200
+ summary: {
201
+ totalAgents: agents.length,
202
+ localAgents: agents.filter(a => a.origin === 'local').length,
203
+ remoteAgents: agents.filter(a => a.origin === 'remote').length,
204
+ totalConnections: connections.length,
205
+ totalMessages: messages.length,
206
+ verifiedMessages: messages.filter((m) => m.verified).length,
207
+ failedVerifications: messages.filter((m) => !m.verified).length,
208
+ averageTrust: agents.length > 0
209
+ ? agents.reduce((sum, a) => sum + a.trustScore, 0) / agents.length
210
+ : 0,
211
+ uptime,
212
+ },
213
+ agents: agents.map(a => ({
214
+ did: a.did,
215
+ name: a.displayName,
216
+ publicKey: a.publicKey,
217
+ capabilities: a.capabilities,
218
+ trustScore: a.trustScore,
219
+ interactionsTotal: a.interactionsTotal,
220
+ interactionsSuccess: a.interactionsSuccess,
221
+ origin: a.origin,
222
+ originServer: a.originServer,
223
+ createdAt: a.createdAt,
224
+ })),
225
+ connections: connections.map((c) => ({
226
+ agentA: c.agentADid,
227
+ agentB: c.agentBDid,
228
+ trustScore: c.trustScore,
229
+ messagesExchanged: c.messagesExchanged,
230
+ createdAt: c.createdAt,
231
+ })),
232
+ messages: messages.map((m) => ({
233
+ id: m.id,
234
+ from: m.fromDid,
235
+ to: m.toDid,
236
+ content: m.content,
237
+ signature: m.signature,
238
+ verified: !!m.verified,
239
+ timestamp: m.createdAt,
240
+ })),
241
+ };
242
+ return this._json(res, 200, report);
243
+ }
244
+ // Public verify endpoint — anyone can verify a signature
245
+ if (method === 'POST' && path === '/verify') {
246
+ const { message, signature, publicKey, did } = body;
247
+ if (!message || !signature)
248
+ return this._json(res, 400, { error: 'message and signature required' });
249
+ if (!publicKey && !did)
250
+ return this._json(res, 400, { error: 'publicKey or did required' });
251
+ let valid;
252
+ if (did) {
253
+ valid = await verifyWithDid(message, signature, did);
254
+ }
255
+ else {
256
+ valid = await verify(message, signature, publicKey);
257
+ }
258
+ return this._json(res, 200, {
259
+ valid,
260
+ message: message.slice(0, 100),
261
+ signer: did || publicKey,
262
+ verifiedAt: new Date().toISOString(),
263
+ });
264
+ }
265
+ // Verify page — browser-based signature verifier
266
+ if (method === 'GET' && path === '/verify') {
267
+ res.writeHead(200, { 'Content-Type': 'text/html' });
268
+ res.end(this._verifyPageHtml());
269
+ return;
270
+ }
271
+ // API docs
272
+ this._json(res, 404, { error: 'Not found', endpoints: [
273
+ 'GET /', 'GET /health', 'GET /stats', 'GET /snapshot',
274
+ 'POST /agents/register', 'GET /agents', 'GET /agents/:did',
275
+ 'POST /discover', 'POST /discover/network',
276
+ 'POST /messages/send', 'POST /messages/verify',
277
+ 'POST /handshake', 'GET /connections', 'GET /messages',
278
+ 'GET /peers', 'POST /peers/connect',
279
+ 'GET /audit/export', 'GET /verify', 'POST /verify',
280
+ 'POST /messages/sign', 'POST /messages/verify', 'POST /messages/send',
281
+ 'POST /handshake', 'GET /connections', 'GET /messages',
282
+ 'GET /peers', 'POST /peers/connect',
283
+ 'WS ws://host:port',
284
+ ] });
285
+ }
286
+ catch (err) {
287
+ this._json(res, err.statusCode || 500, { error: err.message });
288
+ }
289
+ }
290
+ // -- WebSocket -------------------------------------------------------------
291
+ _handleWs(ws, req) {
292
+ const url = new URL(req.url || '/', `http://${req.headers.host}`);
293
+ const role = url.searchParams.get('role');
294
+ // Peer connection
295
+ if (role === 'peer') {
296
+ const fromName = url.searchParams.get('from') || 'unknown';
297
+ this.peerNetwork.handleIncoming(ws, fromName);
298
+ return;
299
+ }
300
+ // Dashboard connection
301
+ this.dashboards.add(ws);
302
+ // Send current state immediately
303
+ ws.send(JSON.stringify({
304
+ type: 'snapshot',
305
+ timestamp: new Date().toISOString(),
306
+ data: this.registry.snapshot(),
307
+ }));
308
+ ws.on('close', () => this.dashboards.delete(ws));
309
+ }
310
+ _broadcast(event) {
311
+ const json = JSON.stringify(event);
312
+ for (const ws of this.dashboards) {
313
+ if (ws.readyState === WebSocket.OPEN) {
314
+ try {
315
+ ws.send(json);
316
+ }
317
+ catch { }
318
+ }
319
+ }
320
+ }
321
+ // -- Helpers ---------------------------------------------------------------
322
+ _json(res, status, data) {
323
+ res.writeHead(status, { 'Content-Type': 'application/json' });
324
+ res.end(JSON.stringify(data, null, 2));
325
+ }
326
+ _readBody(req) {
327
+ return new Promise((resolve, reject) => {
328
+ const chunks = [];
329
+ req.on('data', c => chunks.push(c));
330
+ req.on('end', () => { try {
331
+ resolve(JSON.parse(Buffer.concat(chunks).toString()));
332
+ }
333
+ catch {
334
+ reject(new Error('Invalid JSON'));
335
+ } });
336
+ });
337
+ }
338
+ _verifyPageHtml() {
339
+ return `<!DOCTYPE html>
340
+ <html lang="en"><head>
341
+ <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
342
+ <title>MeshSig — Signature Verifier</title>
343
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Outfit:wght@300;400;500;600;700&display=swap" rel="stylesheet">
344
+ <style>
345
+ *{margin:0;padding:0;box-sizing:border-box}
346
+ body{background:#050a12;color:#c8d6e5;font-family:'Outfit',sans-serif;min-height:100vh;
347
+ display:flex;align-items:center;justify-content:center;padding:40px 20px}
348
+ body::after{content:'';position:fixed;top:0;left:0;right:0;bottom:0;
349
+ background:repeating-linear-gradient(0deg,rgba(0,0,0,0.02) 0px,rgba(0,0,0,0.02) 1px,transparent 1px,transparent 2px);
350
+ pointer-events:none;z-index:999}
351
+ .card{background:#0a1220;border:1px solid #0d2137;border-radius:16px;padding:48px;
352
+ max-width:600px;width:100%;position:relative;z-index:1}
353
+ h1{font:700 24px 'JetBrains Mono',monospace;color:#00d4ff;margin-bottom:8px;letter-spacing:0.04em}
354
+ .sub{font:300 14px 'Outfit',sans-serif;color:#3a7ca5;margin-bottom:32px}
355
+ label{font:500 11px 'JetBrains Mono',monospace;color:#3a7ca5;letter-spacing:0.1em;
356
+ display:block;margin-bottom:6px;margin-top:20px}
357
+ textarea,input{width:100%;background:#050a12;border:1px solid #1e3a5f;border-radius:8px;
358
+ padding:12px 16px;color:#c8d6e5;font:400 13px 'JetBrains Mono',monospace;
359
+ outline:none;transition:border-color 0.3s;resize:vertical}
360
+ textarea:focus,input:focus{border-color:#00d4ff}
361
+ textarea{min-height:80px}
362
+ button{width:100%;margin-top:28px;padding:14px;background:#00d4ff;color:#050a12;
363
+ font:600 14px 'JetBrains Mono',monospace;border:none;border-radius:8px;cursor:pointer;
364
+ transition:all 0.3s;letter-spacing:0.04em}
365
+ button:hover{box-shadow:0 0 30px rgba(0,212,255,0.3);transform:translateY(-1px)}
366
+ button:disabled{opacity:0.5;cursor:not-allowed;transform:none;box-shadow:none}
367
+ #result{margin-top:24px;padding:20px;border-radius:10px;display:none;text-align:center;
368
+ font:600 16px 'JetBrains Mono',monospace}
369
+ #result.valid{display:block;background:rgba(0,255,136,0.06);border:1px solid rgba(0,255,136,0.2);color:#00ff88}
370
+ #result.invalid{display:block;background:rgba(255,51,85,0.06);border:1px solid rgba(255,51,85,0.2);color:#ff3355}
371
+ #result .detail{font:400 11px 'JetBrains Mono',monospace;color:#3a7ca5;margin-top:8px}
372
+ .back{display:inline-block;margin-bottom:24px;font:400 12px 'JetBrains Mono',monospace;
373
+ color:#3a7ca5;text-decoration:none;transition:color 0.3s}
374
+ .back:hover{color:#00d4ff}
375
+ .or{text-align:center;color:#1e3a5f;font:11px 'JetBrains Mono',monospace;margin:4px 0}
376
+ </style>
377
+ </head><body>
378
+ <div class="card">
379
+ <a href="/" class="back">&larr; Dashboard</a>
380
+ <h1>VERIFY SIGNATURE</h1>
381
+ <p class="sub">Paste a message, its Ed25519 signature, and the signer's public key or DID to verify authenticity.</p>
382
+
383
+ <label>MESSAGE</label>
384
+ <textarea id="msg" placeholder="The original message that was signed"></textarea>
385
+
386
+ <label>SIGNATURE (Base64)</label>
387
+ <input id="sig" placeholder="HkyrXOPOXF7v422A4iOcg/qkg/Juy...">
388
+
389
+ <label>PUBLIC KEY (Base64)</label>
390
+ <input id="pk" placeholder="KGC0lHB6Cwhhg1kyEjrPk0EjUujIO+Wq...">
391
+ <div class="or">— or —</div>
392
+ <label>DID</label>
393
+ <input id="did" placeholder="did:msig:3icqQkmJWby4S5rpa...">
394
+
395
+ <button onclick="doVerify()">VERIFY SIGNATURE</button>
396
+
397
+ <div id="result">
398
+ <div id="result-text"></div>
399
+ <div class="detail" id="result-detail"></div>
400
+ </div>
401
+ </div>
402
+ <script>
403
+ async function doVerify(){
404
+ const msg=document.getElementById('msg').value.trim();
405
+ const sig=document.getElementById('sig').value.trim();
406
+ const pk=document.getElementById('pk').value.trim();
407
+ const did=document.getElementById('did').value.trim();
408
+ const r=document.getElementById('result');
409
+ const rt=document.getElementById('result-text');
410
+ const rd=document.getElementById('result-detail');
411
+
412
+ if(!msg||!sig||(!pk&&!did)){r.className='invalid';r.style.display='block';rt.textContent='Fill all fields';return}
413
+
414
+ const body={message:msg,signature:sig};
415
+ if(did)body.did=did; else body.publicKey=pk;
416
+
417
+ try{
418
+ const res=await fetch('/verify',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(body)});
419
+ const data=await res.json();
420
+ if(data.valid){
421
+ r.className='valid';rt.textContent='\\u2713 SIGNATURE VALID';
422
+ rd.textContent='Verified at '+data.verifiedAt+' \\u2014 Signer: '+(data.signer||'').slice(0,40)+'...';
423
+ } else {
424
+ r.className='invalid';rt.textContent='\\u2717 SIGNATURE INVALID';
425
+ rd.textContent='The signature does not match the message and key provided.';
426
+ }
427
+ }catch(e){r.className='invalid';rt.textContent='Error: '+e.message;rd.textContent=''}
428
+ }
429
+ </script>
430
+ </body></html>`;
431
+ }
432
+ }
433
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { MeshEvent } from './registry.js';
2
+ export declare class TerminalDisplay {
3
+ private agents;
4
+ private connectionCount;
5
+ private messageCount;
6
+ private eventLog;
7
+ private maxLogLines;
8
+ private refreshInterval;
9
+ private startTime;
10
+ start(): void;
11
+ stop(): void;
12
+ handleEvent(event: MeshEvent): void;
13
+ private addLog;
14
+ render(): void;
15
+ private buildGraph;
16
+ private calculatePositions;
17
+ }