@cryptforge/key-exchange 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/index.mjs ADDED
@@ -0,0 +1,572 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __commonJS = (cb, mod) => function __require() {
8
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
19
+ // If the importer is in node compatibility mode or this is not an ESM
20
+ // file that has been converted to a CommonJS file using a Babel-
21
+ // compatible transform (i.e. "__esModule" has not been set), then set
22
+ // "default" to the CommonJS "module.exports" for node compatibility.
23
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
24
+ mod
25
+ ));
26
+
27
+ // ../../node_modules/eventemitter3/index.js
28
+ var require_eventemitter3 = __commonJS({
29
+ "../../node_modules/eventemitter3/index.js"(exports, module) {
30
+ "use strict";
31
+ var has = Object.prototype.hasOwnProperty;
32
+ var prefix = "~";
33
+ function Events() {
34
+ }
35
+ if (Object.create) {
36
+ Events.prototype = /* @__PURE__ */ Object.create(null);
37
+ if (!new Events().__proto__) prefix = false;
38
+ }
39
+ function EE(fn, context, once) {
40
+ this.fn = fn;
41
+ this.context = context;
42
+ this.once = once || false;
43
+ }
44
+ function addListener(emitter, event, fn, context, once) {
45
+ if (typeof fn !== "function") {
46
+ throw new TypeError("The listener must be a function");
47
+ }
48
+ var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
49
+ if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
50
+ else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
51
+ else emitter._events[evt] = [emitter._events[evt], listener];
52
+ return emitter;
53
+ }
54
+ function clearEvent(emitter, evt) {
55
+ if (--emitter._eventsCount === 0) emitter._events = new Events();
56
+ else delete emitter._events[evt];
57
+ }
58
+ function EventEmitter2() {
59
+ this._events = new Events();
60
+ this._eventsCount = 0;
61
+ }
62
+ EventEmitter2.prototype.eventNames = function eventNames() {
63
+ var names = [], events, name;
64
+ if (this._eventsCount === 0) return names;
65
+ for (name in events = this._events) {
66
+ if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
67
+ }
68
+ if (Object.getOwnPropertySymbols) {
69
+ return names.concat(Object.getOwnPropertySymbols(events));
70
+ }
71
+ return names;
72
+ };
73
+ EventEmitter2.prototype.listeners = function listeners(event) {
74
+ var evt = prefix ? prefix + event : event, handlers = this._events[evt];
75
+ if (!handlers) return [];
76
+ if (handlers.fn) return [handlers.fn];
77
+ for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
78
+ ee[i] = handlers[i].fn;
79
+ }
80
+ return ee;
81
+ };
82
+ EventEmitter2.prototype.listenerCount = function listenerCount(event) {
83
+ var evt = prefix ? prefix + event : event, listeners = this._events[evt];
84
+ if (!listeners) return 0;
85
+ if (listeners.fn) return 1;
86
+ return listeners.length;
87
+ };
88
+ EventEmitter2.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
89
+ var evt = prefix ? prefix + event : event;
90
+ if (!this._events[evt]) return false;
91
+ var listeners = this._events[evt], len = arguments.length, args, i;
92
+ if (listeners.fn) {
93
+ if (listeners.once) this.removeListener(event, listeners.fn, void 0, true);
94
+ switch (len) {
95
+ case 1:
96
+ return listeners.fn.call(listeners.context), true;
97
+ case 2:
98
+ return listeners.fn.call(listeners.context, a1), true;
99
+ case 3:
100
+ return listeners.fn.call(listeners.context, a1, a2), true;
101
+ case 4:
102
+ return listeners.fn.call(listeners.context, a1, a2, a3), true;
103
+ case 5:
104
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
105
+ case 6:
106
+ return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
107
+ }
108
+ for (i = 1, args = new Array(len - 1); i < len; i++) {
109
+ args[i - 1] = arguments[i];
110
+ }
111
+ listeners.fn.apply(listeners.context, args);
112
+ } else {
113
+ var length = listeners.length, j;
114
+ for (i = 0; i < length; i++) {
115
+ if (listeners[i].once) this.removeListener(event, listeners[i].fn, void 0, true);
116
+ switch (len) {
117
+ case 1:
118
+ listeners[i].fn.call(listeners[i].context);
119
+ break;
120
+ case 2:
121
+ listeners[i].fn.call(listeners[i].context, a1);
122
+ break;
123
+ case 3:
124
+ listeners[i].fn.call(listeners[i].context, a1, a2);
125
+ break;
126
+ case 4:
127
+ listeners[i].fn.call(listeners[i].context, a1, a2, a3);
128
+ break;
129
+ default:
130
+ if (!args) for (j = 1, args = new Array(len - 1); j < len; j++) {
131
+ args[j - 1] = arguments[j];
132
+ }
133
+ listeners[i].fn.apply(listeners[i].context, args);
134
+ }
135
+ }
136
+ }
137
+ return true;
138
+ };
139
+ EventEmitter2.prototype.on = function on(event, fn, context) {
140
+ return addListener(this, event, fn, context, false);
141
+ };
142
+ EventEmitter2.prototype.once = function once(event, fn, context) {
143
+ return addListener(this, event, fn, context, true);
144
+ };
145
+ EventEmitter2.prototype.removeListener = function removeListener(event, fn, context, once) {
146
+ var evt = prefix ? prefix + event : event;
147
+ if (!this._events[evt]) return this;
148
+ if (!fn) {
149
+ clearEvent(this, evt);
150
+ return this;
151
+ }
152
+ var listeners = this._events[evt];
153
+ if (listeners.fn) {
154
+ if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
155
+ clearEvent(this, evt);
156
+ }
157
+ } else {
158
+ for (var i = 0, events = [], length = listeners.length; i < length; i++) {
159
+ if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
160
+ events.push(listeners[i]);
161
+ }
162
+ }
163
+ if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
164
+ else clearEvent(this, evt);
165
+ }
166
+ return this;
167
+ };
168
+ EventEmitter2.prototype.removeAllListeners = function removeAllListeners(event) {
169
+ var evt;
170
+ if (event) {
171
+ evt = prefix ? prefix + event : event;
172
+ if (this._events[evt]) clearEvent(this, evt);
173
+ } else {
174
+ this._events = new Events();
175
+ this._eventsCount = 0;
176
+ }
177
+ return this;
178
+ };
179
+ EventEmitter2.prototype.off = EventEmitter2.prototype.removeListener;
180
+ EventEmitter2.prototype.addListener = EventEmitter2.prototype.on;
181
+ EventEmitter2.prefixed = prefix;
182
+ EventEmitter2.EventEmitter = EventEmitter2;
183
+ if ("undefined" !== typeof module) {
184
+ module.exports = EventEmitter2;
185
+ }
186
+ }
187
+ });
188
+
189
+ // src/types/messages.ts
190
+ var MESSAGES = {
191
+ enableBroadcast: "admin:broadcast:enable",
192
+ connect: "client:topic:connect",
193
+ onClientConnection: "admin:topic:connected",
194
+ requestKeystore: "client:keystore:request",
195
+ onKeystoreRequestInvalidPIN: "admin:pin:invalid",
196
+ onKeystoreRequestValidPIN: "admin:pin:valid",
197
+ onKeystoreRequest: "admin:request:received",
198
+ approveRequest: "admin:request:approve",
199
+ onClientApproval: "client:request:approved",
200
+ denyRequest: "admin:request:deny",
201
+ onClientDenial: "client:request:denied",
202
+ onCompletion: "server:link:complete",
203
+ disableBroadcast: "admin:broadcast:disable",
204
+ onBroadcastDisable: "client:broadcast:disabled",
205
+ getDeviceInfo: "client:request:deviceInfo",
206
+ getHostname: "client:request:hostname",
207
+ // Presence/Network messages
208
+ connectPresence: "network:connect",
209
+ broadcastClientState: "network:broadcast",
210
+ onClientStateRequest: "network:request",
211
+ onClientStateUpdate: "network:update"
212
+ };
213
+
214
+ // ../../node_modules/eventemitter3/index.mjs
215
+ var import_index = __toESM(require_eventemitter3(), 1);
216
+ var eventemitter3_default = import_index.default;
217
+
218
+ // src/client/keyTransportClient.ts
219
+ var KeyTransportClient = class {
220
+ emitter;
221
+ ws = null;
222
+ serverUrl;
223
+ pendingRequests = /* @__PURE__ */ new Map();
224
+ requestTimeout = 3e4;
225
+ // 30 seconds default timeout
226
+ requestCounter = 0;
227
+ connectionPromise = null;
228
+ connectionResolver = null;
229
+ peers = /* @__PURE__ */ new Map();
230
+ constructor(serverUrl = "ws://localhost:3001") {
231
+ this.emitter = new eventemitter3_default();
232
+ this.serverUrl = serverUrl;
233
+ this.connectionPromise = this.connectWebSocket();
234
+ }
235
+ connectWebSocket() {
236
+ console.log(`\u{1F50C} Connecting to ${this.serverUrl}...`);
237
+ return new Promise((resolve, reject) => {
238
+ this.ws = new WebSocket(this.serverUrl);
239
+ this.connectionResolver = resolve;
240
+ const connectionTimeout = setTimeout(() => {
241
+ reject(new Error("Connection timeout"));
242
+ this.ws?.close();
243
+ }, 1e4);
244
+ this.ws.onopen = () => {
245
+ clearTimeout(connectionTimeout);
246
+ console.log("\u2705 Connected to CryptForge server");
247
+ resolve();
248
+ this.connectionResolver = null;
249
+ };
250
+ this.ws.onerror = (error) => {
251
+ clearTimeout(connectionTimeout);
252
+ console.error("\u274C WebSocket error:", error);
253
+ reject(new Error("WebSocket connection failed"));
254
+ this.rejectAllPendingRequests(new Error("WebSocket connection error"));
255
+ };
256
+ this.ws.onmessage = (event) => {
257
+ const message = JSON.parse(event.data);
258
+ if (message.requestId && this.pendingRequests.has(message.requestId)) {
259
+ this.handleRequestResponse(message);
260
+ } else {
261
+ this.receiveMessage(message.type, message.data);
262
+ }
263
+ };
264
+ this.ws.onclose = () => {
265
+ console.log("\u{1F44B} Disconnected from server");
266
+ this.rejectAllPendingRequests(new Error("WebSocket connection closed"));
267
+ };
268
+ });
269
+ }
270
+ generateRequestId = () => {
271
+ return `${Date.now()}-${++this.requestCounter}`;
272
+ };
273
+ handleRequestResponse = (message) => {
274
+ const requestId = message.requestId;
275
+ const pending = this.pendingRequests.get(requestId);
276
+ if (!pending) return;
277
+ clearTimeout(pending.timeout);
278
+ this.pendingRequests.delete(requestId);
279
+ if (message.error) {
280
+ console.error(`\u274C Request ${requestId} failed:`, message.error);
281
+ pending.reject(new Error(message.error.message || "Request failed"));
282
+ } else {
283
+ console.log(`\u2705 Request ${requestId} succeeded:`, message.data);
284
+ pending.resolve(message.data);
285
+ }
286
+ };
287
+ rejectAllPendingRequests = (error) => {
288
+ this.pendingRequests.forEach((pending) => {
289
+ clearTimeout(pending.timeout);
290
+ pending.reject(error);
291
+ });
292
+ this.pendingRequests.clear();
293
+ };
294
+ /**
295
+ * Send a request and wait for response
296
+ */
297
+ sendRequest = async (type, data, timeoutMs) => {
298
+ if (this.connectionPromise) {
299
+ await this.connectionPromise;
300
+ }
301
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
302
+ throw new Error("WebSocket not connected");
303
+ }
304
+ const requestId = this.generateRequestId();
305
+ const timeout = timeoutMs || this.requestTimeout;
306
+ return new Promise((resolve, reject) => {
307
+ const timeoutHandle = setTimeout(() => {
308
+ this.pendingRequests.delete(requestId);
309
+ reject(new Error(`Request ${type} timed out after ${timeout}ms`));
310
+ }, timeout);
311
+ this.pendingRequests.set(requestId, {
312
+ resolve,
313
+ reject,
314
+ timeout: timeoutHandle
315
+ });
316
+ const message = { type, requestId, data };
317
+ this.ws.send(JSON.stringify(message));
318
+ console.log(`\u{1F4E4} Sent request to server:`, message);
319
+ });
320
+ };
321
+ receiveMessage = (type, data) => {
322
+ try {
323
+ console.log(`\u{1F4E8} Received from server: ${type}, data:`, data);
324
+ this.emitter.emit(type, data);
325
+ } catch (error) {
326
+ console.error("\u274C Error parsing message:", error);
327
+ }
328
+ };
329
+ enableBroadcast = async () => {
330
+ console.log("WebTransport.sync.enableBroadcast");
331
+ try {
332
+ const result = await this.sendRequest(
333
+ MESSAGES.enableBroadcast
334
+ );
335
+ console.log("WebTransport.sync.enableBroadcast result:", result);
336
+ return result.broadcastId;
337
+ } catch (error) {
338
+ console.error("Failed to enable broadcast:", error);
339
+ throw error;
340
+ }
341
+ };
342
+ connect = async (topic, name, app) => {
343
+ console.log("WebTransport.sync.connect");
344
+ try {
345
+ await this.sendRequest(MESSAGES.connect, { topic, name, app });
346
+ } catch (error) {
347
+ console.error("Failed to connect:", error);
348
+ throw error;
349
+ }
350
+ };
351
+ requestKeystore = async (pin) => {
352
+ console.log("WebTransport.sync.requestKeystore");
353
+ try {
354
+ await this.sendRequest(MESSAGES.requestKeystore, { pin });
355
+ } catch (error) {
356
+ console.error("Failed to request keystore:", error);
357
+ throw error;
358
+ }
359
+ };
360
+ approveRequest = async (data) => {
361
+ console.log("WebTransport.sync.approveRequest");
362
+ try {
363
+ await this.sendRequest(MESSAGES.approveRequest, {
364
+ identity: data.identity,
365
+ appId: data.appId
366
+ });
367
+ } catch (error) {
368
+ console.error("Failed to approve request:", error);
369
+ throw error;
370
+ }
371
+ };
372
+ denyRequest = async () => {
373
+ console.log("WebTransport.sync.denyRequest");
374
+ try {
375
+ await this.sendRequest(MESSAGES.denyRequest);
376
+ } catch (error) {
377
+ console.error("Failed to deny request:", error);
378
+ throw error;
379
+ }
380
+ };
381
+ disableBroadcast = async () => {
382
+ console.log("WebTransport.sync.disableBroadcast");
383
+ try {
384
+ await this.sendRequest(MESSAGES.disableBroadcast);
385
+ } catch (error) {
386
+ console.error("Failed to disable broadcast:", error);
387
+ throw error;
388
+ }
389
+ };
390
+ // Event listeners remain the same
391
+ onClientConnection = async (callback) => {
392
+ console.log(
393
+ "\u{1F442} WebTransport.sync.onClientConnection - registering listener"
394
+ );
395
+ this.emitter.on(MESSAGES.onClientConnection, callback);
396
+ return () => {
397
+ this.emitter.off(MESSAGES.onClientConnection, callback);
398
+ console.log(`\u{1F507} Unsubscribed from ${MESSAGES.onClientConnection}`);
399
+ };
400
+ };
401
+ onKeystoreRequestInvalidPIN = async (callback) => {
402
+ console.log(
403
+ "\u{1F442} WebTransport.sync.onKeystoreRequestInvalidPIN - registering listener"
404
+ );
405
+ this.emitter.on(MESSAGES.onKeystoreRequestInvalidPIN, callback);
406
+ return () => {
407
+ this.emitter.off(MESSAGES.onKeystoreRequestInvalidPIN, callback);
408
+ console.log(
409
+ `\u{1F507} Unsubscribed from ${MESSAGES.onKeystoreRequestInvalidPIN}`
410
+ );
411
+ };
412
+ };
413
+ onKeystoreRequestValidPIN = async (callback) => {
414
+ console.log(
415
+ "\u{1F442} WebTransport.sync.onKeystoreRequestValidPIN - registering listener"
416
+ );
417
+ this.emitter.on(MESSAGES.onKeystoreRequestValidPIN, callback);
418
+ return () => {
419
+ this.emitter.off(MESSAGES.onKeystoreRequestValidPIN, callback);
420
+ console.log(`\u{1F507} Unsubscribed from ${MESSAGES.onKeystoreRequestValidPIN}`);
421
+ };
422
+ };
423
+ onKeystoreRequest = async (callback) => {
424
+ console.log(
425
+ "\u{1F442} WebTransport.sync.onKeystoreRequest - registering listener"
426
+ );
427
+ this.emitter.on(MESSAGES.onKeystoreRequest, callback);
428
+ return () => {
429
+ this.emitter.off(MESSAGES.onKeystoreRequest, callback);
430
+ console.log(`\u{1F507} Unsubscribed from ${MESSAGES.onKeystoreRequest}`);
431
+ };
432
+ };
433
+ onClientApproval = async (callback) => {
434
+ console.log("\u{1F442} WebTransport.sync.onClientApproval - registering listener");
435
+ this.emitter.on(MESSAGES.onClientApproval, callback);
436
+ return () => {
437
+ this.emitter.off(MESSAGES.onClientApproval, callback);
438
+ console.log(`\u{1F507} Unsubscribed from ${MESSAGES.onClientApproval}`);
439
+ };
440
+ };
441
+ onClientDenial = async (callback) => {
442
+ console.log("\u{1F442} WebTransport.sync.onClientDenial - registering listener");
443
+ this.emitter.on(MESSAGES.onClientDenial, callback);
444
+ return () => {
445
+ this.emitter.off(MESSAGES.onClientDenial, callback);
446
+ console.log(`\u{1F507} Unsubscribed from ${MESSAGES.onClientDenial}`);
447
+ };
448
+ };
449
+ onCompletion = async (callback) => {
450
+ console.log("\u{1F442} WebTransport.sync.onCompletion - registering listener");
451
+ this.emitter.on(MESSAGES.onCompletion, callback);
452
+ return () => {
453
+ this.emitter.off(MESSAGES.onCompletion, callback);
454
+ console.log(`\u{1F507} Unsubscribed from ${MESSAGES.onCompletion}`);
455
+ };
456
+ };
457
+ onBroadcastDisable = async (callback) => {
458
+ console.log(
459
+ "\u{1F442} WebTransport.sync.onBroadcastDisable - registering listener"
460
+ );
461
+ this.emitter.on(MESSAGES.onBroadcastDisable, callback);
462
+ return () => {
463
+ this.emitter.off(MESSAGES.onBroadcastDisable, callback);
464
+ console.log(`\u{1F507} Unsubscribed from ${MESSAGES.onBroadcastDisable}`);
465
+ };
466
+ };
467
+ getDeviceInfo = async () => {
468
+ console.log("KeyTransportClient.getDeviceInfo");
469
+ try {
470
+ const info = await this.sendRequest(MESSAGES.getDeviceInfo);
471
+ return info;
472
+ } catch (error) {
473
+ console.error("Failed to get device info:", error);
474
+ throw error;
475
+ }
476
+ };
477
+ getHostname = async () => {
478
+ console.log("KeyTransportClient.getHostname");
479
+ try {
480
+ const result = await this.sendRequest(
481
+ MESSAGES.getHostname
482
+ );
483
+ return result.hostname;
484
+ } catch (error) {
485
+ console.error("Failed to get hostname:", error);
486
+ throw error;
487
+ }
488
+ };
489
+ connectPresence = async (topic) => {
490
+ console.log("KeyTransportClient.connectPresence");
491
+ try {
492
+ await this.sendRequest(MESSAGES.connectPresence, { topic });
493
+ } catch (error) {
494
+ console.error("Failed to connect presence:", error);
495
+ throw error;
496
+ }
497
+ };
498
+ broadcastClientState = async (id, state) => {
499
+ console.log("KeyTransportClient.broadcastClientState");
500
+ this.peers.set(id, state);
501
+ try {
502
+ await this.sendRequest(MESSAGES.broadcastClientState, { id, state });
503
+ } catch (error) {
504
+ console.error("Failed to broadcast client state:", error);
505
+ throw error;
506
+ }
507
+ };
508
+ onClientStateRequest = async (callback) => {
509
+ console.log(
510
+ "\u{1F442} KeyTransportClient.onClientStateRequest - registering listener"
511
+ );
512
+ this.emitter.on(MESSAGES.onClientStateRequest, callback);
513
+ return () => {
514
+ this.emitter.off(MESSAGES.onClientStateRequest, callback);
515
+ console.log(`\u{1F507} Unsubscribed from ${MESSAGES.onClientStateRequest}`);
516
+ };
517
+ };
518
+ onClientStateUpdate = async (callback) => {
519
+ console.log(
520
+ "\u{1F442} KeyTransportClient.onClientStateUpdate - registering listener"
521
+ );
522
+ const wrappedCallback = (response) => {
523
+ this.peers.set(response.id, response.state);
524
+ callback(response);
525
+ };
526
+ this.emitter.on(MESSAGES.onClientStateUpdate, wrappedCallback);
527
+ return () => {
528
+ this.emitter.off(MESSAGES.onClientStateUpdate, wrappedCallback);
529
+ console.log(`\u{1F507} Unsubscribed from ${MESSAGES.onClientStateUpdate}`);
530
+ };
531
+ };
532
+ getPeerState = (id) => {
533
+ return this.peers.get(id);
534
+ };
535
+ getAllPeers = () => {
536
+ return this.peers;
537
+ };
538
+ /**
539
+ * Reconnect to the WebSocket server
540
+ */
541
+ reconnect = () => {
542
+ console.log("\u{1F504} Attempting to reconnect...");
543
+ if (this.ws) {
544
+ this.ws.close();
545
+ this.ws = null;
546
+ }
547
+ if (this.connectionResolver) {
548
+ this.connectionResolver = null;
549
+ }
550
+ this.connectionPromise = null;
551
+ this.connectionPromise = this.connectWebSocket();
552
+ };
553
+ /**
554
+ * Close the WebSocket connection
555
+ */
556
+ disconnect = () => {
557
+ console.log("\u{1F50C} Disconnecting...");
558
+ if (this.ws) {
559
+ this.ws.close();
560
+ this.ws = null;
561
+ }
562
+ };
563
+ /**
564
+ * Check if WebSocket is connected
565
+ */
566
+ isConnected = () => {
567
+ return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
568
+ };
569
+ };
570
+ export {
571
+ KeyTransportClient
572
+ };
@@ -0,0 +1,46 @@
1
+ import { StoredIdentity } from '@cryptforge/core';
2
+ import WebSocket from 'ws';
3
+
4
+ type OnSetupEventCallback = (options: {
5
+ route: string;
6
+ data: Record<string, any>;
7
+ }) => void;
8
+
9
+ declare function useKeyExchangeServer(onEvent: OnSetupEventCallback): {
10
+ getKey: () => string;
11
+ getPIN: () => string;
12
+ beginBroadcast: () => Promise<void>;
13
+ endBroadcast: () => Promise<void>;
14
+ approveRequest: (identity: StoredIdentity, appId: number) => Promise<void>;
15
+ completeSetupSuccess: () => Promise<void>;
16
+ rejectRequest: () => Promise<void>;
17
+ broadcastDisabled: () => Promise<void>;
18
+ };
19
+
20
+ interface WebSocketServerConfig {
21
+ port?: number;
22
+ onConnection?: (ws: WebSocket) => void;
23
+ onDisconnection?: (ws: WebSocket) => void;
24
+ logger?: {
25
+ log: (...args: any[]) => void;
26
+ error: (...args: any[]) => void;
27
+ };
28
+ }
29
+ declare class KeyTransportServer {
30
+ private wss;
31
+ private activeConnections;
32
+ private core;
33
+ private port;
34
+ private logger;
35
+ constructor(config: WebSocketServerConfig);
36
+ private handleEvent;
37
+ private sendResponse;
38
+ private broadcastEvent;
39
+ private setupServerHandlers;
40
+ private handleMessage;
41
+ close: (callback?: (err?: Error) => void) => void;
42
+ getActiveConnections: () => Set<WebSocket>;
43
+ getPort: () => number;
44
+ }
45
+
46
+ export { KeyTransportServer, useKeyExchangeServer };
@@ -0,0 +1,46 @@
1
+ import { StoredIdentity } from '@cryptforge/core';
2
+ import WebSocket from 'ws';
3
+
4
+ type OnSetupEventCallback = (options: {
5
+ route: string;
6
+ data: Record<string, any>;
7
+ }) => void;
8
+
9
+ declare function useKeyExchangeServer(onEvent: OnSetupEventCallback): {
10
+ getKey: () => string;
11
+ getPIN: () => string;
12
+ beginBroadcast: () => Promise<void>;
13
+ endBroadcast: () => Promise<void>;
14
+ approveRequest: (identity: StoredIdentity, appId: number) => Promise<void>;
15
+ completeSetupSuccess: () => Promise<void>;
16
+ rejectRequest: () => Promise<void>;
17
+ broadcastDisabled: () => Promise<void>;
18
+ };
19
+
20
+ interface WebSocketServerConfig {
21
+ port?: number;
22
+ onConnection?: (ws: WebSocket) => void;
23
+ onDisconnection?: (ws: WebSocket) => void;
24
+ logger?: {
25
+ log: (...args: any[]) => void;
26
+ error: (...args: any[]) => void;
27
+ };
28
+ }
29
+ declare class KeyTransportServer {
30
+ private wss;
31
+ private activeConnections;
32
+ private core;
33
+ private port;
34
+ private logger;
35
+ constructor(config: WebSocketServerConfig);
36
+ private handleEvent;
37
+ private sendResponse;
38
+ private broadcastEvent;
39
+ private setupServerHandlers;
40
+ private handleMessage;
41
+ close: (callback?: (err?: Error) => void) => void;
42
+ getActiveConnections: () => Set<WebSocket>;
43
+ getPort: () => number;
44
+ }
45
+
46
+ export { KeyTransportServer, useKeyExchangeServer };