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.
- package/README.md +223 -0
- package/dist/bin/bitchat.d.ts +7 -0
- package/dist/bin/bitchat.d.ts.map +1 -0
- package/dist/bin/bitchat.js +69 -0
- package/dist/bin/bitchat.js.map +1 -0
- package/dist/client.d.ts +77 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +411 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +6 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/noise.d.ts +72 -0
- package/dist/crypto/noise.d.ts.map +1 -0
- package/dist/crypto/noise.js +470 -0
- package/dist/crypto/noise.js.map +1 -0
- package/dist/crypto/signing.d.ts +34 -0
- package/dist/crypto/signing.d.ts.map +1 -0
- package/dist/crypto/signing.js +56 -0
- package/dist/crypto/signing.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/mesh/deduplicator.d.ts +48 -0
- package/dist/mesh/deduplicator.d.ts.map +1 -0
- package/dist/mesh/deduplicator.js +107 -0
- package/dist/mesh/deduplicator.js.map +1 -0
- package/dist/mesh/index.d.ts +6 -0
- package/dist/mesh/index.d.ts.map +1 -0
- package/dist/mesh/index.js +6 -0
- package/dist/mesh/index.js.map +1 -0
- package/dist/mesh/router.d.ts +90 -0
- package/dist/mesh/router.d.ts.map +1 -0
- package/dist/mesh/router.js +204 -0
- package/dist/mesh/router.js.map +1 -0
- package/dist/protocol/binary.d.ts +37 -0
- package/dist/protocol/binary.d.ts.map +1 -0
- package/dist/protocol/binary.js +310 -0
- package/dist/protocol/binary.js.map +1 -0
- package/dist/protocol/constants.d.ts +30 -0
- package/dist/protocol/constants.d.ts.map +1 -0
- package/dist/protocol/constants.js +37 -0
- package/dist/protocol/constants.js.map +1 -0
- package/dist/protocol/index.d.ts +8 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +8 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/packets.d.ts +38 -0
- package/dist/protocol/packets.d.ts.map +1 -0
- package/dist/protocol/packets.js +177 -0
- package/dist/protocol/packets.js.map +1 -0
- package/dist/protocol/types.d.ts +134 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +108 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/session/index.d.ts +5 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +5 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +113 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +371 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/transport/ble.d.ts +92 -0
- package/dist/transport/ble.d.ts.map +1 -0
- package/dist/transport/ble.js +434 -0
- package/dist/transport/ble.js.map +1 -0
- package/dist/transport/index.d.ts +5 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +5 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +2 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/server.d.ts +16 -0
- package/dist/ui/server.d.ts.map +1 -0
- package/dist/ui/server.js +510 -0
- package/dist/ui/server.js.map +1 -0
- package/package.json +79 -0
- package/src/bin/bitchat.ts +87 -0
- package/src/client.ts +519 -0
- package/src/crypto/index.ts +22 -0
- package/src/crypto/noise.ts +574 -0
- package/src/crypto/signing.ts +66 -0
- package/src/index.ts +95 -0
- package/src/mesh/deduplicator.ts +129 -0
- package/src/mesh/index.ts +6 -0
- package/src/mesh/router.ts +258 -0
- package/src/protocol/binary.ts +345 -0
- package/src/protocol/constants.ts +43 -0
- package/src/protocol/index.ts +15 -0
- package/src/protocol/packets.ts +223 -0
- package/src/protocol/types.ts +182 -0
- package/src/session/index.ts +9 -0
- package/src/session/manager.ts +476 -0
- package/src/transport/ble.ts +553 -0
- package/src/transport/index.ts +10 -0
- package/src/ui/index.ts +1 -0
- package/src/ui/server.ts +569 -0
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager
|
|
3
|
+
* Manages Noise sessions with peers, handling handshakes and encryption
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'node:events';
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { generateKeyPair, HandshakeState as NoiseHandshake, NoiseSession, } from '../crypto/noise.js';
|
|
10
|
+
import { fingerprint, generateSigningKeyPair } from '../crypto/signing.js';
|
|
11
|
+
import { HandshakeState, PeerID } from '../protocol/types.js';
|
|
12
|
+
// Key persistence path
|
|
13
|
+
const KEY_DIR = join(homedir(), '.bitchat-node');
|
|
14
|
+
const KEY_FILE = join(KEY_DIR, 'identity.json');
|
|
15
|
+
function loadOrCreateKeys() {
|
|
16
|
+
try {
|
|
17
|
+
if (existsSync(KEY_FILE)) {
|
|
18
|
+
const data = JSON.parse(readFileSync(KEY_FILE, 'utf-8'));
|
|
19
|
+
console.log('[Keys] Loaded persistent identity from', KEY_FILE);
|
|
20
|
+
return {
|
|
21
|
+
static: {
|
|
22
|
+
publicKey: Buffer.from(data.noisePublicKey, 'hex'),
|
|
23
|
+
secretKey: Buffer.from(data.noiseSecretKey, 'hex'),
|
|
24
|
+
},
|
|
25
|
+
signing: {
|
|
26
|
+
publicKey: Buffer.from(data.signingPublicKey, 'hex'),
|
|
27
|
+
secretKey: Buffer.from(data.signingSecretKey, 'hex'),
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
console.log('[Keys] Failed to load keys, generating new ones:', e.message);
|
|
34
|
+
}
|
|
35
|
+
// Generate new keys
|
|
36
|
+
const staticKP = generateKeyPair();
|
|
37
|
+
const signingKP = generateSigningKeyPair();
|
|
38
|
+
// Persist them
|
|
39
|
+
try {
|
|
40
|
+
mkdirSync(KEY_DIR, { recursive: true });
|
|
41
|
+
const data = {
|
|
42
|
+
noisePublicKey: Buffer.from(staticKP.publicKey).toString('hex'),
|
|
43
|
+
noiseSecretKey: Buffer.from(staticKP.secretKey).toString('hex'),
|
|
44
|
+
signingPublicKey: Buffer.from(signingKP.publicKey).toString('hex'),
|
|
45
|
+
signingSecretKey: Buffer.from(signingKP.secretKey).toString('hex'),
|
|
46
|
+
};
|
|
47
|
+
writeFileSync(KEY_FILE, JSON.stringify(data, null, 2));
|
|
48
|
+
console.log('[Keys] Generated and saved new identity to', KEY_FILE);
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
console.log('[Keys] Warning: Failed to persist keys:', e.message);
|
|
52
|
+
}
|
|
53
|
+
return { static: staticKP, signing: signingKP };
|
|
54
|
+
}
|
|
55
|
+
const DEFAULT_CONFIG = {
|
|
56
|
+
autoHandshake: true,
|
|
57
|
+
handshakeTimeoutMs: 30000,
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Manages Noise sessions with peers
|
|
61
|
+
*/
|
|
62
|
+
export class SessionManager extends EventEmitter {
|
|
63
|
+
config;
|
|
64
|
+
// Our keys
|
|
65
|
+
staticKeyPair;
|
|
66
|
+
signingKeyPair;
|
|
67
|
+
myPeerID;
|
|
68
|
+
fingerprint;
|
|
69
|
+
// Session state
|
|
70
|
+
pendingHandshakes = new Map();
|
|
71
|
+
sessions = new Map();
|
|
72
|
+
// Peer info
|
|
73
|
+
peers = new Map();
|
|
74
|
+
// Messages queued for after handshake completion
|
|
75
|
+
pendingMessages = new Map();
|
|
76
|
+
constructor(config = {}, existingKeys) {
|
|
77
|
+
super();
|
|
78
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
79
|
+
// Initialize with provided keys, persisted keys, or generate new ones
|
|
80
|
+
if (existingKeys?.static && existingKeys?.signing) {
|
|
81
|
+
this.staticKeyPair = existingKeys.static;
|
|
82
|
+
this.signingKeyPair = existingKeys.signing;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const loaded = loadOrCreateKeys();
|
|
86
|
+
this.staticKeyPair = loaded.static;
|
|
87
|
+
this.signingKeyPair = loaded.signing;
|
|
88
|
+
}
|
|
89
|
+
// Derive peer ID from static public key
|
|
90
|
+
this.myPeerID = PeerID.fromPublicKey(this.staticKeyPair.publicKey);
|
|
91
|
+
this.fingerprint = fingerprint(this.staticKeyPair.publicKey);
|
|
92
|
+
console.log('[SessionManager] Identity:');
|
|
93
|
+
console.log(' PeerID:', this.myPeerID.toHex());
|
|
94
|
+
console.log(' Noise pubkey:', Buffer.from(this.staticKeyPair.publicKey).toString('hex'));
|
|
95
|
+
console.log(' Signing pubkey:', Buffer.from(this.signingKeyPair.publicKey).toString('hex'));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check if we have an established session with a peer
|
|
99
|
+
*/
|
|
100
|
+
hasSession(peerID) {
|
|
101
|
+
return this.sessions.has(peerID.toHex());
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if we're in the middle of a handshake
|
|
105
|
+
*/
|
|
106
|
+
hasHandshakeInProgress(peerID) {
|
|
107
|
+
return this.pendingHandshakes.has(peerID.toHex());
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get handshake state for a peer
|
|
111
|
+
*/
|
|
112
|
+
getHandshakeState(peerID) {
|
|
113
|
+
if (this.sessions.has(peerID.toHex())) {
|
|
114
|
+
return HandshakeState.ESTABLISHED;
|
|
115
|
+
}
|
|
116
|
+
if (this.pendingHandshakes.has(peerID.toHex())) {
|
|
117
|
+
return HandshakeState.HANDSHAKING;
|
|
118
|
+
}
|
|
119
|
+
return HandshakeState.NONE;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get established session
|
|
123
|
+
*/
|
|
124
|
+
getSession(peerID) {
|
|
125
|
+
return this.sessions.get(peerID.toHex())?.session;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Initiate a handshake with a peer
|
|
129
|
+
*/
|
|
130
|
+
initiateHandshake(peerID) {
|
|
131
|
+
const key = peerID.toHex();
|
|
132
|
+
// Check if already have session or handshake in progress
|
|
133
|
+
if (this.sessions.has(key)) {
|
|
134
|
+
throw new Error('Session already established');
|
|
135
|
+
}
|
|
136
|
+
if (this.pendingHandshakes.has(key)) {
|
|
137
|
+
throw new Error('Handshake already in progress');
|
|
138
|
+
}
|
|
139
|
+
// Create handshake state
|
|
140
|
+
const state = new NoiseHandshake('initiator', this.staticKeyPair);
|
|
141
|
+
// Write first message
|
|
142
|
+
const message = state.writeMessage();
|
|
143
|
+
// Store pending handshake
|
|
144
|
+
const pending = {
|
|
145
|
+
state,
|
|
146
|
+
role: 'initiator',
|
|
147
|
+
startedAt: Date.now(),
|
|
148
|
+
};
|
|
149
|
+
// Set timeout
|
|
150
|
+
pending.timeoutHandle = setTimeout(() => {
|
|
151
|
+
this.handleHandshakeTimeout(peerID);
|
|
152
|
+
}, this.config.handshakeTimeoutMs);
|
|
153
|
+
this.pendingHandshakes.set(key, pending);
|
|
154
|
+
return message;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Handle incoming handshake message
|
|
158
|
+
*/
|
|
159
|
+
handleHandshakeMessage(peerID, message) {
|
|
160
|
+
const key = peerID.toHex();
|
|
161
|
+
let pending = this.pendingHandshakes.get(key);
|
|
162
|
+
if (!pending) {
|
|
163
|
+
// No handshake in progress - we're the responder
|
|
164
|
+
const state = new NoiseHandshake('responder', this.staticKeyPair);
|
|
165
|
+
pending = {
|
|
166
|
+
state,
|
|
167
|
+
role: 'responder',
|
|
168
|
+
startedAt: Date.now(),
|
|
169
|
+
};
|
|
170
|
+
// Set timeout
|
|
171
|
+
pending.timeoutHandle = setTimeout(() => {
|
|
172
|
+
this.handleHandshakeTimeout(peerID);
|
|
173
|
+
}, this.config.handshakeTimeoutMs);
|
|
174
|
+
this.pendingHandshakes.set(key, pending);
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
// Process incoming message
|
|
178
|
+
pending.state.readMessage(message);
|
|
179
|
+
// Check if handshake is complete
|
|
180
|
+
if (pending.state.isComplete()) {
|
|
181
|
+
this.completeHandshake(peerID, pending);
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
// Write response
|
|
185
|
+
const response = pending.state.writeMessage();
|
|
186
|
+
// Check again after writing
|
|
187
|
+
if (pending.state.isComplete()) {
|
|
188
|
+
this.completeHandshake(peerID, pending);
|
|
189
|
+
}
|
|
190
|
+
return response;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
// Handshake failed
|
|
194
|
+
this.handleHandshakeFailure(peerID, error);
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Complete a successful handshake
|
|
200
|
+
*/
|
|
201
|
+
completeHandshake(peerID, pending) {
|
|
202
|
+
const key = peerID.toHex();
|
|
203
|
+
// Clear timeout
|
|
204
|
+
if (pending.timeoutHandle) {
|
|
205
|
+
clearTimeout(pending.timeoutHandle);
|
|
206
|
+
}
|
|
207
|
+
// Get remote public key
|
|
208
|
+
const remotePublicKey = pending.state.getRemoteStaticPublicKey();
|
|
209
|
+
if (!remotePublicKey) {
|
|
210
|
+
this.handleHandshakeFailure(peerID, new Error('No remote public key'));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
// Create session
|
|
214
|
+
const { send, receive, hash } = pending.state.split();
|
|
215
|
+
const session = new NoiseSession(send, receive, hash, remotePublicKey);
|
|
216
|
+
// Store session
|
|
217
|
+
this.sessions.set(key, {
|
|
218
|
+
session,
|
|
219
|
+
establishedAt: Date.now(),
|
|
220
|
+
remotePublicKey,
|
|
221
|
+
});
|
|
222
|
+
// Clean up pending
|
|
223
|
+
this.pendingHandshakes.delete(key);
|
|
224
|
+
// Update peer info
|
|
225
|
+
this.updatePeerInfo(peerID, { noisePublicKey: remotePublicKey });
|
|
226
|
+
// Emit event
|
|
227
|
+
this.emit('session:established', peerID, session);
|
|
228
|
+
// Send any queued messages
|
|
229
|
+
this.flushPendingMessages(peerID);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Handle handshake timeout
|
|
233
|
+
*/
|
|
234
|
+
handleHandshakeTimeout(peerID) {
|
|
235
|
+
this.handleHandshakeFailure(peerID, new Error('Handshake timeout'));
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Handle handshake failure
|
|
239
|
+
*/
|
|
240
|
+
handleHandshakeFailure(peerID, error) {
|
|
241
|
+
const key = peerID.toHex();
|
|
242
|
+
const pending = this.pendingHandshakes.get(key);
|
|
243
|
+
if (pending?.timeoutHandle) {
|
|
244
|
+
clearTimeout(pending.timeoutHandle);
|
|
245
|
+
}
|
|
246
|
+
this.pendingHandshakes.delete(key);
|
|
247
|
+
this.pendingMessages.delete(key);
|
|
248
|
+
this.emit('session:failed', peerID, error);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Encrypt data for a peer
|
|
252
|
+
*/
|
|
253
|
+
encrypt(peerID, plaintext) {
|
|
254
|
+
const session = this.sessions.get(peerID.toHex())?.session;
|
|
255
|
+
if (!session) {
|
|
256
|
+
throw new Error('No session with peer');
|
|
257
|
+
}
|
|
258
|
+
return session.encrypt(plaintext);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Decrypt data from a peer
|
|
262
|
+
*/
|
|
263
|
+
decrypt(peerID, ciphertext) {
|
|
264
|
+
const session = this.sessions.get(peerID.toHex())?.session;
|
|
265
|
+
if (!session) {
|
|
266
|
+
throw new Error('No session with peer');
|
|
267
|
+
}
|
|
268
|
+
return session.decrypt(ciphertext);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Queue a message for after handshake completion
|
|
272
|
+
*/
|
|
273
|
+
queueMessage(peerID, data) {
|
|
274
|
+
const key = peerID.toHex();
|
|
275
|
+
const queue = this.pendingMessages.get(key) ?? [];
|
|
276
|
+
queue.push({ data, timestamp: Date.now() });
|
|
277
|
+
this.pendingMessages.set(key, queue);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Flush pending messages for a peer
|
|
281
|
+
*/
|
|
282
|
+
flushPendingMessages(peerID) {
|
|
283
|
+
const key = peerID.toHex();
|
|
284
|
+
const queue = this.pendingMessages.get(key);
|
|
285
|
+
if (!queue || queue.length === 0)
|
|
286
|
+
return;
|
|
287
|
+
this.pendingMessages.delete(key);
|
|
288
|
+
for (const { data } of queue) {
|
|
289
|
+
try {
|
|
290
|
+
const encrypted = this.encrypt(peerID, data);
|
|
291
|
+
this.emit('handshake:message', peerID, encrypted);
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
console.error('Failed to encrypt queued message:', error);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Close session with a peer
|
|
300
|
+
*/
|
|
301
|
+
closeSession(peerID) {
|
|
302
|
+
const key = peerID.toHex();
|
|
303
|
+
const established = this.sessions.get(key);
|
|
304
|
+
if (established) {
|
|
305
|
+
established.session.clear();
|
|
306
|
+
this.sessions.delete(key);
|
|
307
|
+
}
|
|
308
|
+
const pending = this.pendingHandshakes.get(key);
|
|
309
|
+
if (pending?.timeoutHandle) {
|
|
310
|
+
clearTimeout(pending.timeoutHandle);
|
|
311
|
+
}
|
|
312
|
+
this.pendingHandshakes.delete(key);
|
|
313
|
+
this.pendingMessages.delete(key);
|
|
314
|
+
this.emit('session:closed', peerID);
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Update peer info
|
|
318
|
+
*/
|
|
319
|
+
updatePeerInfo(peerID, updates) {
|
|
320
|
+
const key = peerID.toHex();
|
|
321
|
+
const existing = this.peers.get(key) ?? {
|
|
322
|
+
peerID,
|
|
323
|
+
nickname: 'anon',
|
|
324
|
+
isConnected: false,
|
|
325
|
+
isVerified: false,
|
|
326
|
+
lastSeen: new Date(),
|
|
327
|
+
handshakeState: HandshakeState.NONE,
|
|
328
|
+
};
|
|
329
|
+
this.peers.set(key, { ...existing, ...updates });
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Get peer info
|
|
333
|
+
*/
|
|
334
|
+
getPeerInfo(peerID) {
|
|
335
|
+
return this.peers.get(peerID.toHex());
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Get all known peers
|
|
339
|
+
*/
|
|
340
|
+
getAllPeers() {
|
|
341
|
+
return Array.from(this.peers.values());
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Get all peers with established sessions
|
|
345
|
+
*/
|
|
346
|
+
getConnectedPeers() {
|
|
347
|
+
const connectedKeys = new Set(this.sessions.keys());
|
|
348
|
+
return Array.from(this.peers.values()).filter((p) => connectedKeys.has(p.peerID.toHex()));
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Clean up
|
|
352
|
+
*/
|
|
353
|
+
destroy() {
|
|
354
|
+
// Clear all sessions
|
|
355
|
+
for (const [, established] of this.sessions) {
|
|
356
|
+
established.session.clear();
|
|
357
|
+
}
|
|
358
|
+
this.sessions.clear();
|
|
359
|
+
// Clear pending handshakes
|
|
360
|
+
for (const [, pending] of this.pendingHandshakes) {
|
|
361
|
+
if (pending.timeoutHandle) {
|
|
362
|
+
clearTimeout(pending.timeoutHandle);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
this.pendingHandshakes.clear();
|
|
366
|
+
this.pendingMessages.clear();
|
|
367
|
+
this.peers.clear();
|
|
368
|
+
this.removeAllListeners();
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
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 type { Link } from '../mesh/router.js';
|
|
10
|
+
import type { PeerID } from '../protocol/types.js';
|
|
11
|
+
type Peripheral = import('@abandonware/noble').Peripheral;
|
|
12
|
+
type Characteristic = import('@abandonware/noble').Characteristic;
|
|
13
|
+
export interface BLETransportConfig {
|
|
14
|
+
serviceUUID: string;
|
|
15
|
+
characteristicUUID: string;
|
|
16
|
+
testnet: boolean;
|
|
17
|
+
enableCentral: boolean;
|
|
18
|
+
enablePeripheral: boolean;
|
|
19
|
+
scanDuplicates: boolean;
|
|
20
|
+
advertisingName?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface BLETransportEvents {
|
|
23
|
+
ready: () => void;
|
|
24
|
+
data: (data: Uint8Array, fromLink: BLELink) => void;
|
|
25
|
+
'link:connected': (link: BLELink) => void;
|
|
26
|
+
'link:disconnected': (linkId: string) => void;
|
|
27
|
+
error: (error: Error, context: string) => void;
|
|
28
|
+
state: (state: string) => void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* BLE link implementation
|
|
32
|
+
*/
|
|
33
|
+
export declare class BLELink implements Link {
|
|
34
|
+
readonly id: string;
|
|
35
|
+
private peripheral;
|
|
36
|
+
private characteristic;
|
|
37
|
+
private _peerID?;
|
|
38
|
+
private mtu;
|
|
39
|
+
constructor(peripheral: Peripheral, characteristic: Characteristic, mtu?: number);
|
|
40
|
+
get peerID(): PeerID | undefined;
|
|
41
|
+
setPeerID(peerID: PeerID): void;
|
|
42
|
+
send(data: Uint8Array): Promise<void>;
|
|
43
|
+
get isConnected(): boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* BLE Transport - handles Bluetooth mesh networking
|
|
47
|
+
*/
|
|
48
|
+
export declare class BLETransport extends EventEmitter {
|
|
49
|
+
private config;
|
|
50
|
+
private noble?;
|
|
51
|
+
private bleno?;
|
|
52
|
+
private running;
|
|
53
|
+
private peripherals;
|
|
54
|
+
private links;
|
|
55
|
+
private subscribedCentrals;
|
|
56
|
+
private notifyCallback?;
|
|
57
|
+
constructor(config?: Partial<BLETransportConfig>);
|
|
58
|
+
/**
|
|
59
|
+
* Start the BLE transport
|
|
60
|
+
*/
|
|
61
|
+
start(): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Stop the BLE transport
|
|
64
|
+
*/
|
|
65
|
+
stop(): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Get all active links
|
|
68
|
+
*/
|
|
69
|
+
getLinks(): BLELink[];
|
|
70
|
+
/**
|
|
71
|
+
* Get link by ID
|
|
72
|
+
*/
|
|
73
|
+
getLink(id: string): BLELink | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Broadcast data to all connected peers
|
|
76
|
+
*/
|
|
77
|
+
broadcast(data: Uint8Array): Promise<void>;
|
|
78
|
+
private initCentral;
|
|
79
|
+
private waitForPoweredOn;
|
|
80
|
+
private failedConnections;
|
|
81
|
+
private connectingPeripherals;
|
|
82
|
+
private onDiscover;
|
|
83
|
+
private onDisconnect;
|
|
84
|
+
private initPeripheral;
|
|
85
|
+
private waitForBlenoPoweredOn;
|
|
86
|
+
/**
|
|
87
|
+
* Clean up
|
|
88
|
+
*/
|
|
89
|
+
destroy(): void;
|
|
90
|
+
}
|
|
91
|
+
export {};
|
|
92
|
+
//# sourceMappingURL=ble.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ble.d.ts","sourceRoot":"","sources":["../../src/transport/ble.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAO9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAInD,KAAK,UAAU,GAAG,OAAO,oBAAoB,EAAE,UAAU,CAAC;AAC1D,KAAK,cAAc,GAAG,OAAO,oBAAoB,EAAE,cAAc,CAAC;AAKlE,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkBD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,OAAQ,YAAW,IAAI;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,GAAG,CAAS;gBAER,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,GAAE,MAAoB;IAO7F,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B3C,IAAI,WAAW,IAAI,OAAO,CAEzB;CACF;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,KAAK,CAA8B;IAG3C,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,cAAc,CAAC,CAAyB;gBAEpC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAgBpD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3B;;OAEG;IACH,QAAQ,IAAI,OAAO,EAAE;IAIrB;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIxC;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BlC,WAAW;YAoBX,gBAAgB;IA2B9B,OAAO,CAAC,iBAAiB,CAA2D;IAEpF,OAAO,CAAC,qBAAqB,CAAqB;YAEpC,UAAU;IAoIxB,OAAO,CAAC,YAAY;YAQN,cAAc;YAqEd,qBAAqB;IA0BnC;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|