bitchat-node 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.
Files changed (102) hide show
  1. package/README.md +223 -0
  2. package/dist/bin/bitchat.d.ts +7 -0
  3. package/dist/bin/bitchat.d.ts.map +1 -0
  4. package/dist/bin/bitchat.js +69 -0
  5. package/dist/bin/bitchat.js.map +1 -0
  6. package/dist/client.d.ts +77 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +411 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/crypto/index.d.ts +6 -0
  11. package/dist/crypto/index.d.ts.map +1 -0
  12. package/dist/crypto/index.js +6 -0
  13. package/dist/crypto/index.js.map +1 -0
  14. package/dist/crypto/noise.d.ts +72 -0
  15. package/dist/crypto/noise.d.ts.map +1 -0
  16. package/dist/crypto/noise.js +470 -0
  17. package/dist/crypto/noise.js.map +1 -0
  18. package/dist/crypto/signing.d.ts +34 -0
  19. package/dist/crypto/signing.d.ts.map +1 -0
  20. package/dist/crypto/signing.js +56 -0
  21. package/dist/crypto/signing.js.map +1 -0
  22. package/dist/index.d.ts +32 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +48 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mesh/deduplicator.d.ts +48 -0
  27. package/dist/mesh/deduplicator.d.ts.map +1 -0
  28. package/dist/mesh/deduplicator.js +107 -0
  29. package/dist/mesh/deduplicator.js.map +1 -0
  30. package/dist/mesh/index.d.ts +6 -0
  31. package/dist/mesh/index.d.ts.map +1 -0
  32. package/dist/mesh/index.js +6 -0
  33. package/dist/mesh/index.js.map +1 -0
  34. package/dist/mesh/router.d.ts +90 -0
  35. package/dist/mesh/router.d.ts.map +1 -0
  36. package/dist/mesh/router.js +204 -0
  37. package/dist/mesh/router.js.map +1 -0
  38. package/dist/protocol/binary.d.ts +37 -0
  39. package/dist/protocol/binary.d.ts.map +1 -0
  40. package/dist/protocol/binary.js +310 -0
  41. package/dist/protocol/binary.js.map +1 -0
  42. package/dist/protocol/constants.d.ts +30 -0
  43. package/dist/protocol/constants.d.ts.map +1 -0
  44. package/dist/protocol/constants.js +37 -0
  45. package/dist/protocol/constants.js.map +1 -0
  46. package/dist/protocol/index.d.ts +8 -0
  47. package/dist/protocol/index.d.ts.map +1 -0
  48. package/dist/protocol/index.js +8 -0
  49. package/dist/protocol/index.js.map +1 -0
  50. package/dist/protocol/packets.d.ts +38 -0
  51. package/dist/protocol/packets.d.ts.map +1 -0
  52. package/dist/protocol/packets.js +177 -0
  53. package/dist/protocol/packets.js.map +1 -0
  54. package/dist/protocol/types.d.ts +134 -0
  55. package/dist/protocol/types.d.ts.map +1 -0
  56. package/dist/protocol/types.js +108 -0
  57. package/dist/protocol/types.js.map +1 -0
  58. package/dist/session/index.d.ts +5 -0
  59. package/dist/session/index.d.ts.map +1 -0
  60. package/dist/session/index.js +5 -0
  61. package/dist/session/index.js.map +1 -0
  62. package/dist/session/manager.d.ts +113 -0
  63. package/dist/session/manager.d.ts.map +1 -0
  64. package/dist/session/manager.js +371 -0
  65. package/dist/session/manager.js.map +1 -0
  66. package/dist/transport/ble.d.ts +92 -0
  67. package/dist/transport/ble.d.ts.map +1 -0
  68. package/dist/transport/ble.js +434 -0
  69. package/dist/transport/ble.js.map +1 -0
  70. package/dist/transport/index.d.ts +5 -0
  71. package/dist/transport/index.d.ts.map +1 -0
  72. package/dist/transport/index.js +5 -0
  73. package/dist/transport/index.js.map +1 -0
  74. package/dist/ui/index.d.ts +2 -0
  75. package/dist/ui/index.d.ts.map +1 -0
  76. package/dist/ui/index.js +2 -0
  77. package/dist/ui/index.js.map +1 -0
  78. package/dist/ui/server.d.ts +16 -0
  79. package/dist/ui/server.d.ts.map +1 -0
  80. package/dist/ui/server.js +510 -0
  81. package/dist/ui/server.js.map +1 -0
  82. package/package.json +79 -0
  83. package/src/bin/bitchat.ts +87 -0
  84. package/src/client.ts +519 -0
  85. package/src/crypto/index.ts +22 -0
  86. package/src/crypto/noise.ts +574 -0
  87. package/src/crypto/signing.ts +66 -0
  88. package/src/index.ts +95 -0
  89. package/src/mesh/deduplicator.ts +129 -0
  90. package/src/mesh/index.ts +6 -0
  91. package/src/mesh/router.ts +258 -0
  92. package/src/protocol/binary.ts +345 -0
  93. package/src/protocol/constants.ts +43 -0
  94. package/src/protocol/index.ts +15 -0
  95. package/src/protocol/packets.ts +223 -0
  96. package/src/protocol/types.ts +182 -0
  97. package/src/session/index.ts +9 -0
  98. package/src/session/manager.ts +476 -0
  99. package/src/transport/ble.ts +553 -0
  100. package/src/transport/index.ts +10 -0
  101. package/src/ui/index.ts +1 -0
  102. package/src/ui/server.ts +569 -0
@@ -0,0 +1,434 @@
1
+ /**
2
+ * BLE Transport
3
+ * Handles Bluetooth Low Energy communication for Bitchat mesh
4
+ *
5
+ * Uses noble for central mode (scanning/connecting) and
6
+ * bleno for peripheral mode (advertising/accepting)
7
+ */
8
+ import { EventEmitter } from 'node:events';
9
+ import { BLE_MAX_MTU, CHARACTERISTIC_UUID, SERVICE_UUID, SERVICE_UUID_TESTNET, } from '../protocol/constants.js';
10
+ const DEFAULT_CONFIG = {
11
+ serviceUUID: SERVICE_UUID,
12
+ characteristicUUID: CHARACTERISTIC_UUID,
13
+ testnet: false,
14
+ enableCentral: true,
15
+ enablePeripheral: true,
16
+ scanDuplicates: true, // Enable to allow reconnection attempts
17
+ };
18
+ /**
19
+ * BLE link implementation
20
+ */
21
+ export class BLELink {
22
+ id;
23
+ peripheral;
24
+ characteristic;
25
+ _peerID;
26
+ mtu;
27
+ constructor(peripheral, characteristic, mtu = BLE_MAX_MTU) {
28
+ this.id = peripheral.uuid;
29
+ this.peripheral = peripheral;
30
+ this.characteristic = characteristic;
31
+ this.mtu = mtu;
32
+ }
33
+ get peerID() {
34
+ return this._peerID;
35
+ }
36
+ setPeerID(peerID) {
37
+ this._peerID = peerID;
38
+ }
39
+ async send(data) {
40
+ // Fragment if necessary
41
+ if (data.length > this.mtu) {
42
+ // TODO: Implement fragmentation
43
+ throw new Error('Message too large for MTU, fragmentation not yet implemented');
44
+ }
45
+ console.log('[BLE] Sending', data.length, 'bytes to', this.id);
46
+ console.log('[BLE] First 50 bytes:', Buffer.from(data.slice(0, 50)).toString('hex'));
47
+ console.log('[BLE] Last 20 bytes:', Buffer.from(data.slice(-20)).toString('hex'));
48
+ const buf = Buffer.from(data);
49
+ console.log('[BLE] Buffer check - is Buffer:', Buffer.isBuffer(buf), 'length:', buf.length);
50
+ // Try write WITHOUT response (withoutResponse = true)
51
+ // This uses a different BLE write type that might work better
52
+ return new Promise((resolve, reject) => {
53
+ this.characteristic.write(buf, true, (error) => {
54
+ if (error) {
55
+ console.error('[BLE] Send error:', error);
56
+ reject(error);
57
+ }
58
+ else {
59
+ console.log('[BLE] Send success (without response)');
60
+ resolve();
61
+ }
62
+ });
63
+ });
64
+ }
65
+ get isConnected() {
66
+ return this.peripheral.state === 'connected';
67
+ }
68
+ }
69
+ /**
70
+ * BLE Transport - handles Bluetooth mesh networking
71
+ */
72
+ export class BLETransport extends EventEmitter {
73
+ config;
74
+ noble;
75
+ bleno;
76
+ running = false;
77
+ // Connected peripherals (central mode)
78
+ peripherals = new Map();
79
+ links = new Map();
80
+ // Subscribed centrals (peripheral mode)
81
+ subscribedCentrals = new Set();
82
+ notifyCallback;
83
+ constructor(config = {}) {
84
+ super();
85
+ const baseConfig = { ...DEFAULT_CONFIG, ...config };
86
+ // Use testnet UUID if testnet is true and no explicit serviceUUID was provided
87
+ if (baseConfig.testnet && !config.serviceUUID) {
88
+ baseConfig.serviceUUID = SERVICE_UUID_TESTNET;
89
+ }
90
+ this.config = baseConfig;
91
+ console.log('[BLE] Config: testnet =', this.config.testnet, ', serviceUUID =', this.config.serviceUUID);
92
+ }
93
+ /**
94
+ * Start the BLE transport
95
+ */
96
+ async start() {
97
+ if (this.running)
98
+ return;
99
+ try {
100
+ // Initialize central mode (noble)
101
+ if (this.config.enableCentral) {
102
+ await this.initCentral();
103
+ }
104
+ // Initialize peripheral mode (bleno)
105
+ if (this.config.enablePeripheral) {
106
+ await this.initPeripheral();
107
+ }
108
+ this.running = true;
109
+ this.emit('ready');
110
+ }
111
+ catch (error) {
112
+ this.emit('error', error, 'start');
113
+ throw error;
114
+ }
115
+ }
116
+ /**
117
+ * Stop the BLE transport
118
+ */
119
+ async stop() {
120
+ if (!this.running)
121
+ return;
122
+ try {
123
+ // Stop scanning
124
+ if (this.noble) {
125
+ await this.noble.stopScanningAsync();
126
+ }
127
+ // Stop advertising
128
+ if (this.bleno) {
129
+ this.bleno.stopAdvertising();
130
+ }
131
+ // Disconnect all peripherals
132
+ for (const [, conn] of this.peripherals) {
133
+ try {
134
+ await conn.peripheral.disconnectAsync();
135
+ }
136
+ catch {
137
+ // Ignore disconnect errors
138
+ }
139
+ }
140
+ this.peripherals.clear();
141
+ this.links.clear();
142
+ this.subscribedCentrals.clear();
143
+ this.running = false;
144
+ }
145
+ catch (error) {
146
+ this.emit('error', error, 'stop');
147
+ throw error;
148
+ }
149
+ }
150
+ /**
151
+ * Get all active links
152
+ */
153
+ getLinks() {
154
+ return Array.from(this.links.values());
155
+ }
156
+ /**
157
+ * Get link by ID
158
+ */
159
+ getLink(id) {
160
+ return this.links.get(id);
161
+ }
162
+ /**
163
+ * Broadcast data to all connected peers
164
+ */
165
+ async broadcast(data) {
166
+ // Send via central mode (noble) links
167
+ const sendPromises = Array.from(this.links.values()).map(async (link) => {
168
+ try {
169
+ await link.send(data);
170
+ }
171
+ catch (error) {
172
+ this.emit('error', error, `broadcast to ${link.id}`);
173
+ }
174
+ });
175
+ // Send via peripheral mode (bleno) notifications
176
+ if (this.notifyCallback) {
177
+ try {
178
+ console.log('[BLE] Notifying subscribed centrals,', data.length, 'bytes');
179
+ this.notifyCallback(Buffer.from(data));
180
+ }
181
+ catch (error) {
182
+ console.error('[BLE] Notify error:', error);
183
+ this.emit('error', error, 'notify');
184
+ }
185
+ }
186
+ else {
187
+ console.log('[BLE] No notify callback (no centrals subscribed)');
188
+ }
189
+ await Promise.allSettled(sendPromises);
190
+ }
191
+ // --- Central Mode (Noble) ---
192
+ async initCentral() {
193
+ console.log('[BLE] Initializing central mode (noble)...');
194
+ const nobleModule = await import('@abandonware/noble');
195
+ this.noble = nobleModule.default;
196
+ console.log('[BLE] Noble imported, state:', this.noble.state);
197
+ // Wait for powered on
198
+ await this.waitForPoweredOn();
199
+ console.log('[BLE] Noble powered on');
200
+ // Set up event handlers
201
+ this.noble.on('discover', (peripheral) => this.onDiscover(peripheral));
202
+ this.noble.on('stateChange', (state) => this.emit('state', state));
203
+ // Start scanning
204
+ console.log('[BLE] Starting scan for service:', this.config.serviceUUID);
205
+ await this.noble.startScanningAsync([this.config.serviceUUID], this.config.scanDuplicates);
206
+ console.log('[BLE] Scanning started');
207
+ }
208
+ async waitForPoweredOn() {
209
+ if (!this.noble)
210
+ throw new Error('Noble not initialized');
211
+ const noble = this.noble;
212
+ if (noble.state === 'poweredOn')
213
+ return;
214
+ return new Promise((resolve, reject) => {
215
+ const timeout = setTimeout(() => {
216
+ reject(new Error('Bluetooth adapter timeout'));
217
+ }, 10000);
218
+ const handler = (state) => {
219
+ if (state === 'poweredOn') {
220
+ clearTimeout(timeout);
221
+ noble.removeListener('stateChange', handler);
222
+ resolve();
223
+ }
224
+ else if (state === 'poweredOff' || state === 'unauthorized') {
225
+ clearTimeout(timeout);
226
+ reject(new Error(`Bluetooth state: ${state}`));
227
+ }
228
+ };
229
+ noble.on('stateChange', handler);
230
+ });
231
+ }
232
+ // Track failed connection attempts for retry logic
233
+ failedConnections = new Map();
234
+ // Track peripherals currently being connected to (prevent duplicate attempts)
235
+ connectingPeripherals = new Set();
236
+ async onDiscover(peripheral) {
237
+ // Skip verbose logging for repeated discoveries
238
+ const isRepeatedDiscovery = this.failedConnections.has(peripheral.uuid) ||
239
+ this.peripherals.has(peripheral.uuid) ||
240
+ this.connectingPeripherals.has(peripheral.uuid);
241
+ if (!isRepeatedDiscovery) {
242
+ console.log('[BLE] Discovered peripheral:', peripheral.uuid, peripheral.advertisement?.localName);
243
+ }
244
+ // Skip if already connected
245
+ if (this.peripherals.has(peripheral.uuid))
246
+ return;
247
+ // Skip if currently connecting (prevents duplicate connect attempts)
248
+ if (this.connectingPeripherals.has(peripheral.uuid))
249
+ return;
250
+ // If we have a working peripheral connection (someone subscribed to us),
251
+ // don't spam central connection attempts - mesh protocol doesn't need bidirectional
252
+ if (this.notifyCallback && this.links.size === 0) {
253
+ // We have a working inbound connection, don't need outbound
254
+ return;
255
+ }
256
+ // Check if we've failed too recently
257
+ const failed = this.failedConnections.get(peripheral.uuid);
258
+ if (failed) {
259
+ const backoffMs = Math.min(60000, 2000 * 2 ** failed.count); // Longer backoff
260
+ const elapsed = Date.now() - failed.lastAttempt.getTime();
261
+ if (elapsed < backoffMs) {
262
+ // Don't log every skip - too noisy
263
+ return;
264
+ }
265
+ }
266
+ // Mark as connecting to prevent duplicate attempts
267
+ this.connectingPeripherals.add(peripheral.uuid);
268
+ try {
269
+ console.log('[BLE] Connecting to', peripheral.uuid);
270
+ await peripheral.connectAsync();
271
+ console.log('[BLE] Connected to', peripheral.uuid);
272
+ // Clear tracking state on success
273
+ this.connectingPeripherals.delete(peripheral.uuid);
274
+ this.failedConnections.delete(peripheral.uuid);
275
+ // Discover services and characteristics
276
+ console.log('[BLE] Discovering services for', peripheral.uuid);
277
+ const { characteristics } = await peripheral.discoverSomeServicesAndCharacteristicsAsync([this.config.serviceUUID], [this.config.characteristicUUID]);
278
+ console.log('[BLE] Found', characteristics.length, 'characteristics');
279
+ if (characteristics.length === 0) {
280
+ console.log('[BLE] No characteristics found, disconnecting');
281
+ await peripheral.disconnectAsync();
282
+ return;
283
+ }
284
+ const characteristic = characteristics[0];
285
+ // Get MTU
286
+ const mtu = peripheral.mtu ?? BLE_MAX_MTU;
287
+ console.log('[BLE] Peripheral MTU:', peripheral.mtu, '(using:', `${mtu})`);
288
+ // Store connection
289
+ const conn = {
290
+ peripheral,
291
+ characteristic,
292
+ mtu,
293
+ };
294
+ this.peripherals.set(peripheral.uuid, conn);
295
+ // Create link
296
+ const link = new BLELink(peripheral, characteristic, mtu);
297
+ this.links.set(peripheral.uuid, link);
298
+ // Subscribe to notifications
299
+ await characteristic.subscribeAsync();
300
+ characteristic.on('data', (data) => {
301
+ this.emit('data', new Uint8Array(data), link);
302
+ });
303
+ // Handle disconnect
304
+ peripheral.once('disconnect', () => {
305
+ this.onDisconnect(peripheral.uuid);
306
+ });
307
+ this.emit('link:connected', link);
308
+ }
309
+ catch (error) {
310
+ // Clear connecting state
311
+ this.connectingPeripherals.delete(peripheral.uuid);
312
+ const err = error;
313
+ // Track failure for retry backoff
314
+ const failed = this.failedConnections.get(peripheral.uuid) ?? {
315
+ count: 0,
316
+ lastAttempt: new Date(),
317
+ };
318
+ failed.count++;
319
+ failed.lastAttempt = new Date();
320
+ this.failedConnections.set(peripheral.uuid, failed);
321
+ // Only log first few failures, then go quiet
322
+ if (failed.count <= 3) {
323
+ console.error('[BLE] Connection failed:', err?.message ?? 'unknown error', `(attempt ${failed.count})`);
324
+ }
325
+ // Try to disconnect if still connected
326
+ try {
327
+ if (peripheral.state === 'connected' || peripheral.state === 'connecting') {
328
+ await peripheral.disconnectAsync();
329
+ }
330
+ }
331
+ catch { }
332
+ // Only emit error for first failure
333
+ if (failed.count === 1) {
334
+ this.emit('error', err ?? new Error('Unknown BLE discover error'), 'discover');
335
+ }
336
+ }
337
+ }
338
+ onDisconnect(peripheralUUID) {
339
+ this.peripherals.delete(peripheralUUID);
340
+ this.links.delete(peripheralUUID);
341
+ this.emit('link:disconnected', peripheralUUID);
342
+ }
343
+ // --- Peripheral Mode (Bleno) ---
344
+ async initPeripheral() {
345
+ try {
346
+ const blenoModule = await import('@abandonware/bleno');
347
+ this.bleno = blenoModule.default;
348
+ // Wait for powered on
349
+ await this.waitForBlenoPoweredOn();
350
+ // Create characteristic
351
+ const CharacteristicClass = this.bleno.Characteristic;
352
+ const characteristic = new CharacteristicClass({
353
+ uuid: this.config.characteristicUUID.replace(/-/g, ''),
354
+ properties: ['read', 'write', 'writeWithoutResponse', 'notify'],
355
+ onWriteRequest: (data, _offset, _withoutResponse, callback) => {
356
+ // Handle incoming data from central
357
+ this.emit('data', new Uint8Array(data), null);
358
+ callback(CharacteristicClass.RESULT_SUCCESS);
359
+ },
360
+ onSubscribe: (_maxValueSize, updateValueCallback) => {
361
+ // Central subscribed to notifications - store callback
362
+ this.notifyCallback = updateValueCallback;
363
+ console.log('Central subscribed to notifications');
364
+ },
365
+ onUnsubscribe: () => {
366
+ // Central unsubscribed
367
+ this.notifyCallback = undefined;
368
+ console.log('Central unsubscribed');
369
+ },
370
+ });
371
+ // Create service
372
+ const PrimaryServiceClass = this.bleno.PrimaryService;
373
+ const service = new PrimaryServiceClass({
374
+ uuid: this.config.serviceUUID.replace(/-/g, ''),
375
+ characteristics: [characteristic],
376
+ });
377
+ // Set services
378
+ this.bleno.setServices([service]);
379
+ // Listen for central connection events
380
+ const bleno = this.bleno;
381
+ bleno.on('accept', (clientAddress) => {
382
+ console.log('[BLE] Central accepted connection from:', clientAddress);
383
+ });
384
+ bleno.on('disconnect', (clientAddress) => {
385
+ console.log('[BLE] Central disconnected:', clientAddress);
386
+ });
387
+ bleno.on('servicesSet', (error) => {
388
+ console.log('[BLE] Services set, error:', error);
389
+ });
390
+ bleno.on('advertisingStart', (error) => {
391
+ console.log('[BLE] Advertising started, error:', error);
392
+ });
393
+ // Start advertising
394
+ const name = this.config.advertisingName ?? 'bitchat';
395
+ this.bleno.startAdvertising(name, [this.config.serviceUUID]);
396
+ }
397
+ catch (error) {
398
+ // Bleno might not be available on all platforms
399
+ console.warn('Bleno (peripheral mode) not available:', error);
400
+ }
401
+ }
402
+ async waitForBlenoPoweredOn() {
403
+ if (!this.bleno)
404
+ throw new Error('Bleno not initialized');
405
+ const bleno = this.bleno;
406
+ if (bleno.state === 'poweredOn')
407
+ return;
408
+ return new Promise((resolve, reject) => {
409
+ const timeout = setTimeout(() => {
410
+ reject(new Error('Bleno timeout'));
411
+ }, 10000);
412
+ const handler = (state) => {
413
+ if (state === 'poweredOn') {
414
+ clearTimeout(timeout);
415
+ bleno.removeListener('stateChange', handler);
416
+ resolve();
417
+ }
418
+ else if (state === 'poweredOff' || state === 'unauthorized') {
419
+ clearTimeout(timeout);
420
+ reject(new Error(`Bleno state: ${state}`));
421
+ }
422
+ };
423
+ bleno.on('stateChange', handler);
424
+ });
425
+ }
426
+ /**
427
+ * Clean up
428
+ */
429
+ destroy() {
430
+ this.stop().catch(() => { });
431
+ this.removeAllListeners();
432
+ }
433
+ }
434
+ //# sourceMappingURL=ble.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ble.js","sourceRoot":"","sources":["../../src/transport/ble.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Transport module exports
3
+ */
4
+ export { BLELink, BLETransport, type BLETransportConfig, type BLETransportEvents, } from './ble.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Transport module exports
3
+ */
4
+ export { BLELink, BLETransport, } from './ble.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,EACP,YAAY,GAGb,MAAM,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { startUIServer, type UIServerConfig } from './server.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { startUIServer } from './server.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Bitchat Web UI Server
3
+ * Simple HTTP + WebSocket server for testing
4
+ */
5
+ import type { BitchatClient } from '../client.js';
6
+ export interface UIServerConfig {
7
+ port: number;
8
+ webhookUrl?: string;
9
+ }
10
+ /**
11
+ * Start a web UI server for the Bitchat client
12
+ */
13
+ export declare function startUIServer(client: BitchatClient, config: UIServerConfig): {
14
+ stop: () => void;
15
+ };
16
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/ui/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAwPlD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAYD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,IAAI,CAAA;CAAE,CAuSjG"}