bitchat-node 0.1.1 → 0.1.2

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 (45) hide show
  1. package/README.md +94 -23
  2. package/dist/client.d.ts +1 -0
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +143 -28
  5. package/dist/client.js.map +1 -1
  6. package/dist/debug.d.ts +39 -0
  7. package/dist/debug.d.ts.map +1 -0
  8. package/dist/debug.js +89 -0
  9. package/dist/debug.js.map +1 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/mesh/router.d.ts.map +1 -1
  15. package/dist/mesh/router.js +9 -1
  16. package/dist/mesh/router.js.map +1 -1
  17. package/dist/protocol/binary.d.ts +1 -1
  18. package/dist/protocol/binary.d.ts.map +1 -1
  19. package/dist/protocol/binary.js +2 -2
  20. package/dist/protocol/binary.js.map +1 -1
  21. package/dist/session/manager.d.ts.map +1 -1
  22. package/dist/session/manager.js +18 -1
  23. package/dist/session/manager.js.map +1 -1
  24. package/dist/transport/ble.d.ts +15 -0
  25. package/dist/transport/ble.d.ts.map +1 -1
  26. package/dist/transport/ble.js +63 -16
  27. package/dist/transport/ble.js.map +1 -1
  28. package/dist/ui/html.d.ts +5 -0
  29. package/dist/ui/html.d.ts.map +1 -0
  30. package/dist/ui/html.js +506 -0
  31. package/dist/ui/html.js.map +1 -0
  32. package/dist/ui/server.d.ts +5 -1
  33. package/dist/ui/server.d.ts.map +1 -1
  34. package/dist/ui/server.js +61 -255
  35. package/dist/ui/server.js.map +1 -1
  36. package/package.json +2 -1
  37. package/src/client.ts +159 -34
  38. package/src/debug.ts +119 -0
  39. package/src/index.ts +11 -0
  40. package/src/mesh/router.ts +11 -1
  41. package/src/protocol/binary.ts +2 -2
  42. package/src/session/manager.ts +19 -1
  43. package/src/transport/ble.ts +70 -16
  44. package/src/ui/html.ts +506 -0
  45. package/src/ui/server.ts +78 -258
package/README.md CHANGED
@@ -1,17 +1,32 @@
1
1
  # bitchat-node
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/bitchat-node.svg)](https://www.npmjs.com/package/bitchat-node)
4
+ [![license](https://img.shields.io/npm/l/bitchat-node.svg)](https://unlicense.org/)
5
+
3
6
  Node.js/TypeScript implementation of the Bitchat BLE mesh networking protocol.
4
7
 
5
- > ⚠️ **Alpha Software** — This is experimental software under active development. APIs may change without notice. Use at your own risk.
8
+ > 🚀 **Production Ready** — Core functionality complete and tested. Ready for public use and contributions.
6
9
 
7
10
  ## Overview
8
11
 
9
12
  Bitchat is a peer-to-peer mesh network that operates over Bluetooth Low Energy (BLE). This library enables Node.js applications to participate as full peers in the Bitchat mesh, supporting:
10
13
 
11
- - **Public messages** — Broadcast to all peers in range
12
- - **Direct messages** — Encrypted point-to-point communication via Noise protocol
13
- - **Peer discovery** — Automatic discovery and connection to nearby peers
14
- - **Multi-hop routing** — Messages relay through intermediate peers
14
+ **Public messages** — Broadcast to all peers in range (WORKING)
15
+ **Direct messages** — Encrypted point-to-point communication via Noise protocol (WORKING)
16
+ **Peer discovery** — Automatic discovery and connection to nearby peers (WORKING)
17
+ **Multi-hop routing** — Messages relay through intermediate peers (WORKING)
18
+ ✅ **Web UI** — Built-in web interface for monitoring and messaging (WORKING)
19
+ ✅ **CLI Tool** — Command-line interface for easy deployment (WORKING)
20
+
21
+ ## 🎯 What Works Right Now
22
+
23
+ - **Full BLE mesh networking** between Mac/Linux nodes and iOS Bitchat app
24
+ - **Automatic peer discovery** and connection management
25
+ - **Encrypted direct messaging** using Noise protocol (perfect forward secrecy)
26
+ - **Web-based chat interface** with real-time updates
27
+ - **Persistent identity** management with key storage
28
+ - **Message routing** through multi-hop mesh topology
29
+ - **TypeScript implementation** with full type safety
15
30
 
16
31
  ## Installation
17
32
 
@@ -33,6 +48,20 @@ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
33
48
 
34
49
  ## Quick Start
35
50
 
51
+ ### Option 1: CLI Tool (Easiest)
52
+
53
+ ```bash
54
+ # Install globally
55
+ npm install -g bitchat-node
56
+
57
+ # Run with web UI
58
+ bitchat --nickname=YourName --port=3939
59
+
60
+ # Open browser to http://localhost:3939
61
+ ```
62
+
63
+ ### Option 2: Library Usage
64
+
36
65
  ```typescript
37
66
  import { BitchatClient } from 'bitchat-node';
38
67
 
@@ -63,6 +92,16 @@ await client.sendDirectMessage(peerID, 'Private hello');
63
92
  await client.stop();
64
93
  ```
65
94
 
95
+ ## 🌟 Demo: iOS + Node.js Mesh
96
+
97
+ 1. Install [Bitchat iOS app](https://github.com/wkyleg/bitchat-ios) on iPhone
98
+ 2. Run `bitchat --nickname=MyNode` on Mac/Linux
99
+ 3. Both devices appear in each other's peer lists automatically
100
+ 4. Send messages bidirectionally through BLE mesh
101
+ 5. Add more devices to create multi-hop network
102
+
103
+ **Range:** ~10-100 meters depending on hardware and environment.
104
+
66
105
  ## API Reference
67
106
 
68
107
  ### BitchatClient
@@ -112,7 +151,7 @@ new BitchatClient(config: BitchatClientConfig)
112
151
  | `peer:updated` | `PeerInfo` | Peer info was updated |
113
152
  | `error` | `Error, string` | An error occurred |
114
153
 
115
- ## Architecture
154
+ ## 🏗️ Architecture
116
155
 
117
156
  ```
118
157
  ┌─────────────────────────────────────────────────────────────┐
@@ -136,7 +175,7 @@ new BitchatClient(config: BitchatClientConfig)
136
175
  └─────────────────────────────────────────────────────────────┘
137
176
  ```
138
177
 
139
- ## Protocol Details
178
+ ## 🔐 Protocol Details
140
179
 
141
180
  ### Packet Format
142
181
 
@@ -170,24 +209,37 @@ Each peer has:
170
209
  - **Signing Key**: Ed25519 for packet authentication
171
210
  - **Noise Key**: X25519 for key agreement
172
211
 
173
- ## CLI Tool
212
+ ## 🎮 Web UI Features
174
213
 
175
- A simple CLI is included for testing:
214
+ The built-in web interface (`http://localhost:3939`) provides:
176
215
 
177
- ```bash
178
- # Start with default settings
179
- npx bitchat --nickname=MyNode
216
+ - **Live peer discovery** with connection status
217
+ - **Public chat** with all mesh participants
218
+ - **Private messaging** with end-to-end encryption
219
+ - **Debug panel** showing raw packet flows
220
+ - **Identity management** with persistent keys
221
+ - **Network topology** visualization
180
222
 
181
- # With custom port for web UI
182
- npx bitchat --nickname=MyNode --port=3939
223
+ ## 🗺️ Roadmap
183
224
 
184
- # Use testnet (different BLE service UUID)
185
- npx bitchat --nickname=MyNode --testnet
186
- ```
225
+ ### Phase 1: UI Improvements
226
+ - [ ] Enhanced debug panel with packet inspector
227
+ - [ ] Conversation threading and history
228
+ - [ ] Mobile-responsive design improvements
187
229
 
188
- The CLI starts a web UI at `http://localhost:3939` for monitoring.
230
+ ### Phase 2: Nostr Integration 🌐
231
+ - [ ] Fallback messaging over Nostr relays
232
+ - [ ] Location-based chat via geohash
233
+ - [ ] Hybrid BLE + internet topology
189
234
 
190
- ## Development
235
+ ### Phase 3: Media Support 📷
236
+ - [ ] Image transfer with chunking protocol
237
+ - [ ] Voice notes with compression
238
+ - [ ] File transfer up to 1MB
239
+
240
+ See [ROADMAP.md](./ROADMAP.md) for complete development plan.
241
+
242
+ ## 🧪 Development
191
243
 
192
244
  ```bash
193
245
  # Install dependencies
@@ -202,22 +254,41 @@ npm test
202
254
  # Run tests with coverage
203
255
  npm run test:coverage
204
256
 
257
+ # Start development mode
258
+ npm run dev
259
+
205
260
  # Lint and format
206
261
  npm run check:fix
207
262
  ```
208
263
 
209
- ## Security Considerations
264
+ ## 🔒 Security Considerations
210
265
 
211
266
  - **BLE Range**: Messages only propagate within BLE range (~10-100m depending on hardware)
212
267
  - **No Central Server**: All communication is peer-to-peer; no data leaves local mesh
213
268
  - **Forward Secrecy**: Direct message sessions use ephemeral keys
214
269
  - **Traffic Analysis**: Padding applied to resist packet size analysis
270
+ - **Identity Persistence**: Keys stored locally in `~/.bitchat-node/identity.json`
271
+
272
+ ## 🤝 Contributing
273
+
274
+ This project is ready for contributions! Areas where help is needed:
275
+
276
+ - **Windows BLE support** testing and debugging
277
+ - **Protocol compatibility** with other Bitchat implementations
278
+ - **Performance optimization** for large meshes
279
+ - **UI/UX improvements** for web interface
280
+ - **Documentation** and example applications
215
281
 
216
282
  ## License
217
283
 
218
284
  [Unlicense](https://unlicense.org/) — Public Domain
219
285
 
220
- ## Related
286
+ ## Related Projects
287
+
288
+ - [OpenClaw Bitchat Plugin](https://github.com/wkyleg/openclaw-bitchat) — Integrate with OpenClaw AI assistant
289
+ - [Bitchat iOS](https://github.com/wkyleg/bitchat-ios) — Original iOS implementation
290
+ - [Noise Protocol](https://noiseprotocol.org/) — Cryptographic framework for secure communication
291
+
292
+ ---
221
293
 
222
- - [Bitchat iOS](https://github.com/user/bitchat-ios) Original iOS implementation
223
- - [Noise Protocol](https://noiseprotocol.org/) — Cryptographic framework used for DMs
294
+ **🚀 Ready to deploy? Just run `bitchat --nickname=YourName` and start meshing!**
package/dist/client.d.ts CHANGED
@@ -67,6 +67,7 @@ export declare class BitchatClient extends EventEmitter {
67
67
  private handleLeave;
68
68
  private handleHandshake;
69
69
  private handleEncrypted;
70
+ private parseTLVPrivateMessage;
70
71
  private handlePrivateMessage;
71
72
  private sendAnnounce;
72
73
  private sendLeave;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,KAAK,cAAc,EAAgB,MAAM,qBAAqB,CAAC;AAKxE,OAAO,EAEL,KAAK,WAAW,EAGhB,KAAK,MAAM,EACX,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC3C,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,cAAc,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACzC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,OAAO,CAAS;IAGxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,mCAAmC;IACnC,SAAS,IAAI,mBAAmB;gBAIpB,MAAM,EAAE,mBAAmB;IA8BvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B;;OAEG;IACG,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgCzD;;OAEG;IACG,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwB5E;;OAEG;IACH,iBAAiB,IAAI,QAAQ,EAAE;IAI/B;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAMjD,OAAO,CAAC,kBAAkB;YAmDZ,kBAAkB;IAOhC,OAAO,CAAC,YAAY;IA4BpB,OAAO,CAAC,cAAc;IAgDtB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,WAAW;YAUL,eAAe;IAS7B,OAAO,CAAC,eAAe;IAgCvB,OAAO,CAAC,oBAAoB;YAiBd,YAAY;YA6BZ,SAAS;YAcT,mBAAmB;IAejC,OAAO,CAAC,0BAA0B;YAQpB,oBAAoB;CAqBnC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,KAAK,cAAc,EAAgB,MAAM,qBAAqB,CAAC;AAKxE,OAAO,EAEL,KAAK,WAAW,EAGhB,KAAK,MAAM,EACX,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAI7B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC3C,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,cAAc,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;IACzC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,OAAO,CAAS;IAGxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,mCAAmC;IACnC,SAAS,IAAI,mBAAmB;gBAIpB,MAAM,EAAE,mBAAmB;IA8BvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B;;OAEG;IACG,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgCzD;;OAEG;IACG,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8C5E;;OAEG;IACH,iBAAiB,IAAI,QAAQ,EAAE;IAI/B;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAMjD,OAAO,CAAC,kBAAkB;YA6DZ,kBAAkB;IAOhC,OAAO,CAAC,YAAY;IAiCpB,OAAO,CAAC,cAAc;IAqDtB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,WAAW;YAUL,eAAe;IAe7B,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,sBAAsB;IA6B9B,OAAO,CAAC,oBAAoB;YAoBd,YAAY;YAoCZ,SAAS;YAcT,mBAAmB;IAejC,OAAO,CAAC,0BAA0B;YAuCpB,oBAAoB;CAqBnC"}
package/dist/client.js CHANGED
@@ -60,8 +60,9 @@ export class BitchatClient extends EventEmitter {
60
60
  await this.transport.start();
61
61
  this.running = true;
62
62
  this.emit('ready');
63
- // Send initial announce
63
+ // Send initial announce and then periodic announces (like iOS does)
64
64
  setTimeout(() => this.sendAnnounce(), 1000);
65
+ setInterval(() => this.sendAnnounce(), 5000); // Every 5 seconds like iOS
65
66
  }
66
67
  catch (error) {
67
68
  this.emit('error', error, 'start');
@@ -124,21 +125,42 @@ export class BitchatClient extends EventEmitter {
124
125
  */
125
126
  async sendPrivateMessage(content, toPeerID) {
126
127
  const messageID = crypto.randomUUID();
128
+ const peerHex = toPeerID.toHex().slice(0, 8);
129
+ console.log(`[PM] Sending to ${peerHex}: "${content.slice(0, 30)}..."`);
127
130
  // Check if we have a session
128
131
  if (!this.sessions.hasSession(toPeerID)) {
129
- // Need to establish session first
130
- if (!this.sessions.hasHandshakeInProgress(toPeerID)) {
131
- // Initiate handshake
132
- const handshakeMsg = this.sessions.initiateHandshake(toPeerID);
133
- await this.sendHandshakePacket(toPeerID, handshakeMsg);
132
+ console.log(`[PM] No session with ${peerHex}`);
133
+ // Tie-breaker: only initiate if our peerID < target peerID
134
+ // This prevents both sides from initiating simultaneously
135
+ const weInitiate = this.peerID.toHex() < toPeerID.toHex();
136
+ console.log(`[PM] We initiate: ${weInitiate} (us: ${this.peerID.toHex().slice(0, 8)} vs them: ${peerHex})`);
137
+ if (weInitiate) {
138
+ // Need to establish session first
139
+ if (!this.sessions.hasHandshakeInProgress(toPeerID)) {
140
+ console.log(`[PM] Initiating handshake with ${peerHex}`);
141
+ // Initiate handshake
142
+ const handshakeMsg = this.sessions.initiateHandshake(toPeerID);
143
+ console.log(`[PM] Handshake message: ${handshakeMsg.length} bytes`);
144
+ await this.sendHandshakePacket(toPeerID, handshakeMsg);
145
+ console.log(`[PM] Handshake packet sent`);
146
+ }
147
+ else {
148
+ console.log(`[PM] Handshake already in progress with ${peerHex}`);
149
+ }
150
+ }
151
+ else {
152
+ console.log(`[PM] Waiting for ${peerHex} to initiate handshake (they have lower ID)`);
134
153
  }
135
154
  // Queue message for after handshake
136
155
  const payload = this.buildPrivateMessagePayload(content, messageID);
137
156
  this.sessions.queueMessage(toPeerID, payload);
157
+ console.log(`[PM] Message queued for after handshake`);
138
158
  return messageID;
139
159
  }
160
+ console.log(`[PM] Session exists, encrypting and sending`);
140
161
  // Encrypt and send
141
162
  await this.sendEncryptedMessage(toPeerID, content, messageID);
163
+ console.log(`[PM] Encrypted message sent`);
142
164
  return messageID;
143
165
  }
144
166
  /**
@@ -177,12 +199,20 @@ export class BitchatClient extends EventEmitter {
177
199
  });
178
200
  // Session events
179
201
  this.sessions.on('session:established', (peerID, _session) => {
202
+ const peerHex = peerID.toHex().slice(0, 8);
203
+ console.log(`[Session] ✓ Established with ${peerHex}`);
180
204
  const peer = this.sessions.getPeerInfo(peerID);
181
205
  if (peer) {
182
206
  this.emit('peer:updated', peer);
183
207
  }
184
208
  });
209
+ this.sessions.on('session:failed', (peerID, error) => {
210
+ const peerHex = peerID.toHex().slice(0, 8);
211
+ console.log(`[Session] ✗ Failed with ${peerHex}:`, error.message);
212
+ });
185
213
  this.sessions.on('handshake:message', async (peerID, encrypted) => {
214
+ const peerHex = peerID.toHex().slice(0, 8);
215
+ console.log(`[Session] Flushing queued message to ${peerHex}: ${encrypted.length} bytes`);
186
216
  // Send queued encrypted message
187
217
  const packet = {
188
218
  version: 1,
@@ -195,6 +225,7 @@ export class BitchatClient extends EventEmitter {
195
225
  isRSR: false,
196
226
  };
197
227
  await this.router.sendToPeer(packet, peerID);
228
+ console.log(`[Session] Queued message sent`);
198
229
  });
199
230
  }
200
231
  async handleIncomingData(data, link) {
@@ -204,6 +235,10 @@ export class BitchatClient extends EventEmitter {
204
235
  await this.router.handlePacket(packet, link);
205
236
  }
206
237
  handlePacket(packet, fromLink) {
238
+ // Ignore our own packets (echoed back through mesh)
239
+ if (packet.senderID.equals(this.peerID)) {
240
+ return;
241
+ }
207
242
  switch (packet.type) {
208
243
  case MessageType.ANNOUNCE:
209
244
  this.handleAnnounce(packet, fromLink);
@@ -233,11 +268,13 @@ export class BitchatClient extends EventEmitter {
233
268
  // Verify signature if present
234
269
  if (packet.signature && announcement?.signingPublicKey) {
235
270
  const dataToSign = encodeForSigning(packet);
271
+ console.log('[Announce] Verifying', nickname, '- dataToSign first 60:', Buffer.from(dataToSign.slice(0, 60)).toString('hex'));
236
272
  const isValid = verify(dataToSign, packet.signature, announcement.signingPublicKey);
237
273
  if (!isValid) {
238
274
  console.warn('[Announce] Invalid signature from', nickname, peerID.toHex().slice(0, 8));
239
275
  return; // Reject invalid announces
240
276
  }
277
+ console.log('[Announce] Valid signature from', nickname);
241
278
  }
242
279
  // Check if this is a NEW peer or an existing one
243
280
  const existingPeer = this.sessions.getPeerInfo(peerID);
@@ -253,8 +290,12 @@ export class BitchatClient extends EventEmitter {
253
290
  });
254
291
  // Associate peer ID with link
255
292
  if (fromLink) {
293
+ console.log(`[Announce] Setting peer ${peerID.toHex().slice(0, 8)} on link ${fromLink.id.slice(0, 8)}`);
256
294
  fromLink.setPeerID(peerID);
257
295
  }
296
+ else {
297
+ console.log(`[Announce] No fromLink for peer ${peerID.toHex().slice(0, 8)} - cannot associate!`);
298
+ }
258
299
  const peer = this.sessions.getPeerInfo(peerID);
259
300
  if (peer) {
260
301
  // Only emit 'peer:connected' for NEW peers, not repeat announces
@@ -290,42 +331,85 @@ export class BitchatClient extends EventEmitter {
290
331
  }
291
332
  async handleHandshake(packet) {
292
333
  const peerID = packet.senderID;
334
+ const peerHex = peerID.toHex().slice(0, 8);
335
+ console.log(`[Handshake] Received from ${peerHex}: ${packet.payload.length} bytes`);
293
336
  const response = this.sessions.handleHandshakeMessage(peerID, packet.payload);
294
337
  if (response) {
338
+ console.log(`[Handshake] Sending response to ${peerHex}: ${response.length} bytes`);
295
339
  await this.sendHandshakePacket(peerID, response);
296
340
  }
341
+ else {
342
+ console.log(`[Handshake] No response needed (complete or error)`);
343
+ }
297
344
  }
298
345
  handleEncrypted(packet) {
299
346
  const peerID = packet.senderID;
300
347
  try {
301
348
  const decrypted = this.sessions.decrypt(peerID, packet.payload);
302
- // First byte is payload type
349
+ console.log(`[Encrypted] Decrypted ${decrypted.length} bytes from ${peerID.toHex().slice(0, 8)}`);
350
+ console.log(`[Encrypted] First 20 bytes: ${Buffer.from(decrypted.slice(0, 20)).toString('hex')}`);
351
+ // Check payload type byte
303
352
  const payloadType = decrypted[0];
304
- const payloadData = decrypted.subarray(1);
305
- switch (payloadType) {
306
- case NoisePayloadType.PRIVATE_MESSAGE:
307
- this.handlePrivateMessage(peerID, payloadData, packet.timestamp);
308
- break;
309
- case NoisePayloadType.READ_RECEIPT:
310
- // TODO: Handle read receipt
311
- break;
312
- case NoisePayloadType.DELIVERED:
313
- // TODO: Handle delivery confirmation
314
- break;
315
- default:
316
- // Unknown payload type
317
- break;
353
+ if (payloadType === NoisePayloadType.PRIVATE_MESSAGE) {
354
+ // TLV format: [0x01] [messageID TLV: 0x00, len, data] [content TLV: 0x01, len, data]
355
+ const tlvData = decrypted.subarray(1);
356
+ const parsed = this.parseTLVPrivateMessage(tlvData);
357
+ if (parsed) {
358
+ console.log(`[Encrypted] Parsed TLV: msgID="${parsed.messageID.slice(0, 20)}...", content="${parsed.content.slice(0, 30)}..."`);
359
+ this.handlePrivateMessage(peerID, new TextEncoder().encode(parsed.content), packet.timestamp, parsed.messageID);
360
+ }
361
+ else {
362
+ console.log(`[Encrypted] Failed to parse TLV, treating as raw`);
363
+ this.handlePrivateMessage(peerID, tlvData, packet.timestamp);
364
+ }
365
+ }
366
+ else if (payloadType === NoisePayloadType.READ_RECEIPT) {
367
+ console.log(`[Encrypted] Read receipt from ${peerID.toHex().slice(0, 8)}`);
368
+ // TODO: Handle read receipt
369
+ }
370
+ else if (payloadType === NoisePayloadType.DELIVERED) {
371
+ console.log(`[Encrypted] Delivery confirmation from ${peerID.toHex().slice(0, 8)}`);
372
+ // TODO: Handle delivery confirmation
373
+ }
374
+ else {
375
+ console.log(`[Encrypted] Unknown payload type: 0x${payloadType.toString(16)}`);
318
376
  }
319
377
  }
320
378
  catch (error) {
321
379
  this.emit('error', error, 'decrypt');
322
380
  }
323
381
  }
324
- handlePrivateMessage(senderID, payload, timestamp) {
382
+ parseTLVPrivateMessage(data) {
383
+ let offset = 0;
384
+ let messageID;
385
+ let content;
386
+ while (offset + 2 <= data.length) {
387
+ const tlvType = data[offset++];
388
+ const tlvLen = data[offset++];
389
+ if (offset + tlvLen > data.length)
390
+ break;
391
+ const tlvValue = data.subarray(offset, offset + tlvLen);
392
+ offset += tlvLen;
393
+ if (tlvType === 0x00) {
394
+ // messageID
395
+ messageID = new TextDecoder().decode(tlvValue);
396
+ }
397
+ else if (tlvType === 0x01) {
398
+ // content
399
+ content = new TextDecoder().decode(tlvValue);
400
+ }
401
+ }
402
+ if (messageID && content) {
403
+ return { messageID, content };
404
+ }
405
+ return null;
406
+ }
407
+ handlePrivateMessage(senderID, payload, timestamp, messageID) {
325
408
  const content = new TextDecoder().decode(payload);
409
+ const id = messageID ?? `${senderID.toHex()}-${timestamp}-private`;
326
410
  const peer = this.sessions.getPeerInfo(senderID);
327
411
  const message = {
328
- id: `${senderID.toHex()}-${timestamp}-private`,
412
+ id,
329
413
  sender: senderID,
330
414
  senderNickname: peer?.nickname ?? 'anon',
331
415
  content,
@@ -333,6 +417,7 @@ export class BitchatClient extends EventEmitter {
333
417
  isPrivate: true,
334
418
  deliveryStatus: { type: 'delivered', to: this.peerID, at: new Date() },
335
419
  };
420
+ console.log(`[PM] Received from ${peer?.nickname ?? 'anon'}: "${content.slice(0, 30)}..."`);
336
421
  this.emit('message', message);
337
422
  }
338
423
  async sendAnnounce() {
@@ -356,6 +441,12 @@ export class BitchatClient extends EventEmitter {
356
441
  const dataToSign = encodeForSigning(packet);
357
442
  const signature = sign(dataToSign, this.sessions.signingKeyPair.secretKey);
358
443
  packet.signature = signature;
444
+ // Debug: verify our own signature
445
+ const selfVerify = verify(dataToSign, signature, this.sessions.signingKeyPair.publicKey);
446
+ console.log('[Announce] Self-verify:', selfVerify ? 'PASS' : 'FAIL');
447
+ console.log('[Announce] DataToSign length:', dataToSign.length);
448
+ console.log('[Announce] DataToSign first 60:', Buffer.from(dataToSign.slice(0, 60)).toString('hex'));
449
+ console.log('[Announce] Signature:', Buffer.from(signature).toString('hex').slice(0, 40) + '...');
359
450
  await this.router.sendPacket(packet);
360
451
  const encoded = encode(packet);
361
452
  await this.transport.broadcast(encoded);
@@ -385,11 +476,35 @@ export class BitchatClient extends EventEmitter {
385
476
  };
386
477
  await this.router.sendToPeer(packet, toPeerID);
387
478
  }
388
- buildPrivateMessagePayload(content, _messageID) {
389
- const contentBytes = new TextEncoder().encode(content);
390
- const payload = new Uint8Array(1 + contentBytes.length);
391
- payload[0] = NoisePayloadType.PRIVATE_MESSAGE;
392
- payload.set(contentBytes, 1);
479
+ buildPrivateMessagePayload(content, messageID) {
480
+ // iOS TLV format:
481
+ // [0x01] - NoisePayloadType.privateMessage
482
+ // [0x00][len][messageID UTF8] - TLV for messageID
483
+ // [0x01][len][content UTF8] - TLV for content
484
+ const encoder = new TextEncoder();
485
+ const messageIDBytes = encoder.encode(messageID);
486
+ const contentBytes = encoder.encode(content);
487
+ // Validate lengths (must fit in 1 byte)
488
+ if (messageIDBytes.length > 255 || contentBytes.length > 255) {
489
+ throw new Error('Message ID or content too long for TLV encoding');
490
+ }
491
+ // Build TLV payload: 1 + (1+1+msgIDLen) + (1+1+contentLen)
492
+ const payload = new Uint8Array(1 + 2 + messageIDBytes.length + 2 + contentBytes.length);
493
+ let offset = 0;
494
+ // NoisePayloadType.privateMessage = 0x01
495
+ payload[offset++] = 0x01;
496
+ // TLV for messageID: type=0x00, length, data
497
+ payload[offset++] = 0x00;
498
+ payload[offset++] = messageIDBytes.length;
499
+ payload.set(messageIDBytes, offset);
500
+ offset += messageIDBytes.length;
501
+ // TLV for content: type=0x01, length, data
502
+ payload[offset++] = 0x01;
503
+ payload[offset++] = contentBytes.length;
504
+ payload.set(contentBytes, offset);
505
+ console.log(`[PM] Building TLV payload: msgID="${messageID.slice(0, 20)}...", content="${content.slice(0, 20)}..."`);
506
+ console.log(`[PM] Total payload: ${payload.length} bytes`);
507
+ console.log(`[PM] First 50 bytes: ${Buffer.from(payload.slice(0, 50)).toString('hex')}`);
393
508
  return payload;
394
509
  }
395
510
  async sendEncryptedMessage(toPeerID, content, messageID) {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAuB,IAAI,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAa,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAGL,WAAW,EACX,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAgB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAkBhE;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC5B,MAAM,CAAsB;IAC5B,SAAS,CAAe;IACxB,MAAM,CAAa;IACnB,QAAQ,CAAiB;IAClC,OAAO,GAAG,KAAK,CAAC;IAExB,eAAe;IACN,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,WAAW,CAAS;IAE7B,mCAAmC;IACnC,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,YAAY,MAA2B;QACrC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEhC,+DAA+D;QAC/D,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAChC,EAAE,EACF;YACE,MAAM,EAAE,MAAM,CAAC,aAAa;YAC5B,OAAO,EAAE,MAAM,CAAC,cAAc;SAC/B,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAE7C,oBAAoB;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErC,uBAAuB;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC;YAChC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;SACjC,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,IAAI,CAAC;YACH,kBAAkB;YAClB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAE7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEnB,oEAAoE;YACpE,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC;YAC5C,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,2BAA2B;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAc,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YAEvB,iBAAiB;YACjB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAE5B,WAAW;YACX,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAExB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAc,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,OAAe;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAErC,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,WAAW,CAAC,OAAO;YACzB,GAAG,EAAE,WAAW;YAChB,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;YAC1C,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,kBAAkB;QAClB,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAE7B,wEAAwE;QACxE,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1E,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAE3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,QAAgB;QACxD,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAExE,6BAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;YAE/C,2DAA2D;YAC3D,0DAA0D;YAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,aAAa,OAAO,GAAG,CAAC,CAAC;YAE3G,IAAI,UAAU,EAAE,CAAC;gBACf,kCAAkC;gBAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpD,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;oBACzD,qBAAqB;oBACrB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBAC/D,OAAO,CAAC,GAAG,CAAC,2BAA2B,YAAY,CAAC,MAAM,QAAQ,CAAC,CAAC;oBACpE,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;oBACvD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,2CAA2C,OAAO,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,6CAA6C,CAAC,CAAC;YACxF,CAAC;YAED,oCAAoC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YAEvD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,mBAAmB;QACnB,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,0BAA0B;IAElB,kBAAkB;QACxB,mBAAmB;QACnB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC9B,4CAA4C;QAC9C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,IAAa,EAAE,EAAE;YACpD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,MAAc,EAAE,EAAE;YACxD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAgB,EAAE,IAAa,EAAE,EAAE;YAC5D,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,OAAe,EAAE,EAAE;YAC3D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,OAAO,EAAE,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAqB,EAAE,QAAqB,EAAE,EAAE;YACxE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAA0B,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,qBAAqB,EAAE,CAAC,MAAc,EAAE,QAAsB,EAAE,EAAE;YACjF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,MAAc,EAAE,KAAY,EAAE,EAAE;YAClE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,EAAE,MAAc,EAAE,SAAqB,EAAE,EAAE;YACpF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,wCAAwC,OAAO,KAAK,SAAS,CAAC,MAAM,QAAQ,CAAC,CAAC;YAC1F,gCAAgC;YAChC,MAAM,MAAM,GAAkB;gBAC5B,OAAO,EAAE,CAAC;gBACV,IAAI,EAAE,WAAW,CAAC,eAAe;gBACjC,GAAG,EAAE,WAAW;gBAChB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,QAAQ,EAAE,IAAI,CAAC,MAAM;gBACrB,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,SAAS;gBAClB,KAAK,EAAE,KAAK;aACb,CAAC;YACF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,IAAgB,EAAE,IAAa;QAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEO,YAAY,CAAC,MAAqB,EAAE,QAAwB;QAClE,oDAAoD;QACpD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,WAAW,CAAC,QAAQ;gBACvB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACtC,MAAM;YAER,KAAK,WAAW,CAAC,OAAO;gBACtB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM;YAER,KAAK,WAAW,CAAC,KAAK;gBACpB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACzB,MAAM;YAER,KAAK,WAAW,CAAC,eAAe;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM;YAER,KAAK,WAAW,CAAC,eAAe;gBAC9B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM;YAER;gBACE,2CAA2C;gBAC3C,MAAM;QACV,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,MAAqB,EAAE,QAAwB;QACpE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;QAE/B,kCAAkC;QAClC,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,YAAY,EAAE,QAAQ,IAAI,MAAM,CAAC;QAElD,8BAA8B;QAC9B,IAAI,MAAM,CAAC,SAAS,IAAI,YAAY,EAAE,gBAAgB,EAAE,CAAC;YACvD,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9H,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;YACpF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxF,OAAO,CAAC,2BAA2B;YACrC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,QAAQ,CAAC,CAAC;QAC3D,CAAC;QAED,iDAAiD;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;QAE7D,mBAAmB;QACnB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE;YACnC,QAAQ;YACR,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,IAAI,IAAI,EAAE;YACpB,0BAA0B;YAC1B,cAAc,EAAE,YAAY,EAAE,cAAc;YAC5C,gBAAgB,EAAE,YAAY,EAAE,gBAAgB;SACjD,CAAC,CAAC;QAEH,8BAA8B;QAC9B,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,YAAY,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,IAAI,EAAE,CAAC;YACT,iEAAiE;YACjE,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,+DAA+D;gBAC/D,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,MAAqB;QAC/C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAExD,MAAM,OAAO,GAAgB;YAC3B,EAAE,EAAE,mBAAmB,CAAC,MAAM,CAAC;YAC/B,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,EAAE,QAAQ,IAAI,MAAM;YACxC,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,SAAS,EAAE,KAAK;YAChB,cAAc,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE;SACvE,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAEO,WAAW,CAAC,MAAqB;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;QAE/B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE;YACnC,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,MAAqB;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEpF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAE9E,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,KAAK,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC;YACpF,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,MAAqB;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAEhE,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,CAAC,MAAM,eAAe,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAClG,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAElG,0BAA0B;YAC1B,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAEjC,IAAI,WAAW,KAAK,gBAAgB,CAAC,eAAe,EAAE,CAAC;gBACrD,qFAAqF;gBACrF,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;gBAEpD,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,kCAAkC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;oBAChI,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBAClH,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;oBAChE,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;iBAAM,IAAI,WAAW,KAAK,gBAAgB,CAAC,YAAY,EAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3E,4BAA4B;YAC9B,CAAC;iBAAM,IAAI,WAAW,KAAK,gBAAgB,CAAC,SAAS,EAAE,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,0CAA0C,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpF,qCAAqC;YACvC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,uCAAuC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAc,EAAE,SAAS,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,IAAgB;QAC7C,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,SAA6B,CAAC;QAClC,IAAI,OAA2B,CAAC;QAEhC,OAAO,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAE9B,IAAI,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM;gBAAE,MAAM;YAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;YACxD,MAAM,IAAI,MAAM,CAAC;YAEjB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,YAAY;gBACZ,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjD,CAAC;iBAAM,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC5B,UAAU;gBACV,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,oBAAoB,CAAC,QAAgB,EAAE,OAAmB,EAAE,SAAiB,EAAE,SAAkB;QACvG,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,SAAS,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,SAAS,UAAU,CAAC;QAEnE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAgB;YAC3B,EAAE;YACF,MAAM,EAAE,QAAQ;YAChB,cAAc,EAAE,IAAI,EAAE,QAAQ,IAAI,MAAM;YACxC,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACtC,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE;SACvE,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,QAAQ,IAAI,MAAM,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAC5F,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,sCAAsC;QACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS;YACrD,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS;YACxD,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC3E,CAAC,CAAC;QAEH,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,WAAW,CAAC,QAAQ;YAC1B,GAAG,EAAE,WAAW;YAChB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,OAAO;YACP,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,2BAA2B;QAC3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAE7B,kCAAkC;QAClC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrG,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;QAElG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,WAAW,CAAC,KAAK;YACvB,GAAG,EAAE,WAAW;YAChB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,OAAO,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC;YAC1B,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,QAAgB,EAAE,OAAmB;QACrE,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,GAAG,EAAE,WAAW;YAChB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAEO,0BAA0B,CAAC,OAAe,EAAE,SAAiB;QACnE,kBAAkB;QAClB,2CAA2C;QAC3C,kDAAkD;QAClD,8CAA8C;QAC9C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE7C,wCAAwC;QACxC,IAAI,cAAc,CAAC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QAED,2DAA2D;QAC3D,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACxF,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,yCAAyC;QACzC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;QAEzB,6CAA6C;QAC7C,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC;QAEhC,6CAA6C;QAC7C,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,qCAAqC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QACrH,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAEzF,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,QAAgB,EAChB,OAAe,EACf,SAAiB;QAEjB,MAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE3D,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,GAAG,EAAE,WAAW;YAChB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,QAAQ,EAAE,IAAI,CAAC,MAAM;YACrB,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,SAAS;YAClB,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Global debug logger for Bitchat
3
+ * Emits events that can be forwarded to UI/webhooks
4
+ */
5
+ import { EventEmitter } from 'node:events';
6
+ export interface DebugEvent {
7
+ category: 'ble-rx' | 'ble-tx' | 'session' | 'error' | 'packet' | 'pm';
8
+ tag?: string;
9
+ text?: string;
10
+ hex?: string;
11
+ decoded?: string;
12
+ time: number;
13
+ }
14
+ export interface SessionState {
15
+ peerID: string;
16
+ established: boolean;
17
+ initiator: boolean;
18
+ txNonce?: number;
19
+ rxNonce?: number;
20
+ error?: string;
21
+ }
22
+ declare class DebugLogger extends EventEmitter {
23
+ private enabled;
24
+ private logToConsole;
25
+ enable(): void;
26
+ disable(): void;
27
+ setConsoleLogging(enabled: boolean): void;
28
+ log(event: Omit<DebugEvent, 'time'>): void;
29
+ bleRx(data: Uint8Array, decoded?: string): void;
30
+ bleTx(data: Uint8Array, decoded?: string): void;
31
+ session(peerID: string, text: string): void;
32
+ packet(direction: 'rx' | 'tx', type: string, info: string): void;
33
+ pm(direction: 'rx' | 'tx', peerID: string, text: string): void;
34
+ error(context: string, error: Error | string): void;
35
+ updateSession(state: SessionState): void;
36
+ }
37
+ export declare const debugLog: DebugLogger;
38
+ export {};
39
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;IACtE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,WAAY,SAAQ,YAAY;IACpC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,YAAY,CAAQ;IAE5B,MAAM,IAAI,IAAI;IAId,OAAO,IAAI,IAAI;IAIf,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIzC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,IAAI;IAqB1C,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS/C,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAS/C,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ3C,MAAM,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQhE,EAAE,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ9D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI;IAQnD,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;CAGzC;AAGD,eAAO,MAAM,QAAQ,aAAoB,CAAC"}