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
package/README.md ADDED
@@ -0,0 +1,223 @@
1
+ # bitchat-node
2
+
3
+ Node.js/TypeScript implementation of the Bitchat BLE mesh networking protocol.
4
+
5
+ > āš ļø **Alpha Software** — This is experimental software under active development. APIs may change without notice. Use at your own risk.
6
+
7
+ ## Overview
8
+
9
+ 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
+
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
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install bitchat-node
20
+ ```
21
+
22
+ ### System Requirements
23
+
24
+ - Node.js 18+
25
+ - macOS, Linux, or Windows with BLE support
26
+ - For BLE functionality: `@abandonware/noble` and `@abandonware/bleno` native dependencies
27
+
28
+ On macOS, no additional drivers needed. On Linux, you may need to install BlueZ:
29
+
30
+ ```bash
31
+ sudo apt-get install bluetooth bluez libbluetooth-dev libudev-dev
32
+ ```
33
+
34
+ ## Quick Start
35
+
36
+ ```typescript
37
+ import { BitchatClient } from 'bitchat-node';
38
+
39
+ const client = new BitchatClient({
40
+ nickname: 'my-node',
41
+ });
42
+
43
+ // Handle incoming messages
44
+ client.on('message', (message) => {
45
+ console.log(`[${message.nickname}]: ${message.text}`);
46
+ });
47
+
48
+ // Handle peer discovery
49
+ client.on('peer:connected', (peer) => {
50
+ console.log(`Peer connected: ${peer.nickname} (${peer.peerID})`);
51
+ });
52
+
53
+ // Start the client
54
+ await client.start();
55
+
56
+ // Send a public message
57
+ await client.sendPublicMessage('Hello, mesh!');
58
+
59
+ // Send a direct message to a specific peer
60
+ await client.sendDirectMessage(peerID, 'Private hello');
61
+
62
+ // Stop when done
63
+ await client.stop();
64
+ ```
65
+
66
+ ## API Reference
67
+
68
+ ### BitchatClient
69
+
70
+ The main client class for interacting with the Bitchat mesh.
71
+
72
+ #### Constructor
73
+
74
+ ```typescript
75
+ new BitchatClient(config: BitchatClientConfig)
76
+ ```
77
+
78
+ | Option | Type | Description |
79
+ |--------|------|-------------|
80
+ | `nickname` | `string` | Display name for this peer (required) |
81
+ | `staticKeyPair` | `NoiseKeyPair` | X25519 key pair for Noise encryption (optional, generated if not provided) |
82
+ | `signingKeyPair` | `SigningKeyPair` | Ed25519 key pair for packet signing (optional, generated if not provided) |
83
+ | `testnet` | `boolean` | Use testnet service UUID (default: false) |
84
+
85
+ #### Properties
86
+
87
+ | Property | Type | Description |
88
+ |----------|------|-------------|
89
+ | `peerID` | `PeerID` | This peer's unique identifier (derived from public key) |
90
+ | `nickname` | `string` | This peer's display name |
91
+ | `fingerprint` | `string` | Human-readable identity fingerprint |
92
+
93
+ #### Methods
94
+
95
+ | Method | Returns | Description |
96
+ |--------|---------|-------------|
97
+ | `start()` | `Promise<void>` | Start BLE transport and begin peer discovery |
98
+ | `stop()` | `Promise<void>` | Stop the client and disconnect from all peers |
99
+ | `sendPublicMessage(text)` | `Promise<void>` | Send a public message to all peers |
100
+ | `sendDirectMessage(peerID, text)` | `Promise<void>` | Send an encrypted message to a specific peer |
101
+ | `getPeers()` | `PeerInfo[]` | Get list of known peers |
102
+ | `getConfig()` | `BitchatClientConfig` | Get the client configuration |
103
+
104
+ #### Events
105
+
106
+ | Event | Payload | Description |
107
+ |-------|---------|-------------|
108
+ | `ready` | — | Client is ready to send/receive |
109
+ | `message` | `ChatMessage` | Received a chat message |
110
+ | `peer:connected` | `PeerInfo` | A new peer connected |
111
+ | `peer:disconnected` | `PeerID` | A peer disconnected |
112
+ | `peer:updated` | `PeerInfo` | Peer info was updated |
113
+ | `error` | `Error, string` | An error occurred |
114
+
115
+ ## Architecture
116
+
117
+ ```
118
+ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
119
+ │ BitchatClient │
120
+ │ High-level API for sending/receiving messages │
121
+ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
122
+ │
123
+ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
124
+ │ SessionManager │
125
+ │ Key storage, Noise handshakes, encryption/decryption │
126
+ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
127
+ │
128
+ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
129
+ │ MeshRouter │
130
+ │ TTL-based flooding, deduplication, routing decisions │
131
+ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
132
+ │
133
+ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”“ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”
134
+ │ BLETransport │
135
+ │ Central + Peripheral roles, characteristic discovery │
136
+ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜
137
+ ```
138
+
139
+ ## Protocol Details
140
+
141
+ ### Packet Format
142
+
143
+ Binary wire format with header + payload:
144
+
145
+ ```
146
+ Header (14-16 bytes):
147
+ +--------+------+-----+-----------+-------+------------------+
148
+ |Version | Type | TTL | Timestamp | Flags | PayloadLength |
149
+ |1 byte |1 byte|1byte| 8 bytes | 1 byte| 2 or 4 bytes |
150
+ +--------+------+-----+-----------+-------+------------------+
151
+
152
+ Variable sections:
153
+ +----------+-------------+---------+------------+
154
+ | SenderID | RecipientID | Payload | Signature |
155
+ | 8 bytes | 8 bytes* | Variable| 64 bytes* |
156
+ +----------+-------------+---------+------------+
157
+ ```
158
+
159
+ ### Encryption
160
+
161
+ Direct messages use the Noise XX pattern (`Noise_XX_25519_ChaChaPoly_SHA256`):
162
+ 1. Three-way handshake establishes shared secret
163
+ 2. Messages encrypted with ChaCha20-Poly1305
164
+ 3. Perfect forward secrecy via session keys
165
+
166
+ ### Identity
167
+
168
+ Each peer has:
169
+ - **PeerID**: First 8 bytes of SHA-256(NoisePublicKey)
170
+ - **Signing Key**: Ed25519 for packet authentication
171
+ - **Noise Key**: X25519 for key agreement
172
+
173
+ ## CLI Tool
174
+
175
+ A simple CLI is included for testing:
176
+
177
+ ```bash
178
+ # Start with default settings
179
+ npx bitchat --nickname=MyNode
180
+
181
+ # With custom port for web UI
182
+ npx bitchat --nickname=MyNode --port=3939
183
+
184
+ # Use testnet (different BLE service UUID)
185
+ npx bitchat --nickname=MyNode --testnet
186
+ ```
187
+
188
+ The CLI starts a web UI at `http://localhost:3939` for monitoring.
189
+
190
+ ## Development
191
+
192
+ ```bash
193
+ # Install dependencies
194
+ npm install
195
+
196
+ # Build TypeScript
197
+ npm run build
198
+
199
+ # Run tests
200
+ npm test
201
+
202
+ # Run tests with coverage
203
+ npm run test:coverage
204
+
205
+ # Lint and format
206
+ npm run check:fix
207
+ ```
208
+
209
+ ## Security Considerations
210
+
211
+ - **BLE Range**: Messages only propagate within BLE range (~10-100m depending on hardware)
212
+ - **No Central Server**: All communication is peer-to-peer; no data leaves local mesh
213
+ - **Forward Secrecy**: Direct message sessions use ephemeral keys
214
+ - **Traffic Analysis**: Padding applied to resist packet size analysis
215
+
216
+ ## License
217
+
218
+ [Unlicense](https://unlicense.org/) — Public Domain
219
+
220
+ ## Related
221
+
222
+ - [Bitchat iOS](https://github.com/user/bitchat-ios) — Original iOS implementation
223
+ - [Noise Protocol](https://noiseprotocol.org/) — Cryptographic framework used for DMs
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Bitchat Node CLI
4
+ * Run a Bitchat mesh node with web UI
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=bitchat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitchat.d.ts","sourceRoot":"","sources":["../../src/bin/bitchat.ts"],"names":[],"mappings":";AACA;;;GAGG"}
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Bitchat Node CLI
4
+ * Run a Bitchat mesh node with web UI
5
+ */
6
+ import { BitchatClient } from '../client.js';
7
+ import { startUIServer } from '../ui/server.js';
8
+ const args = process.argv.slice(2);
9
+ const nickname = args.find((a) => a.startsWith('--nickname='))?.split('=')[1] ??
10
+ args.find((a) => a.startsWith('-n='))?.split('=')[1] ??
11
+ process.env.BITCHAT_NICKNAME ??
12
+ `node-${Math.random().toString(36).slice(2, 6)}`;
13
+ const port = parseInt(args.find((a) => a.startsWith('--port='))?.split('=')[1] ??
14
+ args.find((a) => a.startsWith('-p='))?.split('=')[1] ??
15
+ process.env.BITCHAT_PORT ??
16
+ '3939', 10);
17
+ const testnet = args.includes('--testnet');
18
+ console.log('Starting Bitchat Node...');
19
+ console.log(` Nickname: ${nickname}`);
20
+ console.log(` Port: ${port}`);
21
+ console.log(` Network: ${testnet ? 'testnet' : 'mainnet'}`);
22
+ console.log();
23
+ const client = new BitchatClient({
24
+ nickname,
25
+ testnet,
26
+ });
27
+ // Event logging
28
+ client.on('ready', () => {
29
+ console.log(`āœ“ Ready`);
30
+ console.log(` Peer ID: ${client.peerID.toHex()}`);
31
+ console.log(` Fingerprint: ${client.fingerprint}`);
32
+ console.log();
33
+ });
34
+ client.on('peer:connected', (peer) => {
35
+ console.log(`+ Peer: ${peer.nickname} (${peer.peerID.toHex().slice(0, 8)}...)`);
36
+ });
37
+ client.on('peer:disconnected', (peerID) => {
38
+ console.log(`- Peer: ${peerID.toHex().slice(0, 8)}...`);
39
+ });
40
+ client.on('message', (msg) => {
41
+ const prefix = msg.isPrivate ? '[DM]' : '[PUB]';
42
+ console.log(`${prefix} ${msg.senderNickname}: ${msg.content}`);
43
+ });
44
+ client.on('error', (err, ctx) => {
45
+ console.error(`! Error (${ctx}): ${err.message}`);
46
+ });
47
+ // Start
48
+ async function main() {
49
+ try {
50
+ await client.start();
51
+ const ui = startUIServer(client, { port });
52
+ console.log(`\n🌐 Web UI: http://localhost:${port}\n`);
53
+ // Graceful shutdown
54
+ const shutdown = async () => {
55
+ console.log('\nShutting down...');
56
+ ui.stop();
57
+ await client.stop();
58
+ process.exit(0);
59
+ };
60
+ process.on('SIGINT', shutdown);
61
+ process.on('SIGTERM', shutdown);
62
+ }
63
+ catch (error) {
64
+ console.error('Failed to start:', error);
65
+ process.exit(1);
66
+ }
67
+ }
68
+ main();
69
+ //# sourceMappingURL=bitchat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitchat.js","sourceRoot":"","sources":["../../src/bin/bitchat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Bitchat Client
3
+ * High-level API for Bitchat mesh networking
4
+ */
5
+ import { EventEmitter } from 'node:events';
6
+ import type { NoiseKeyPair } from './crypto/noise.js';
7
+ import { type SigningKeyPair } from './crypto/signing.js';
8
+ import { type ChatMessage, type PeerID, type PeerInfo } from './protocol/types.js';
9
+ export interface BitchatClientConfig {
10
+ nickname: string;
11
+ staticKeyPair?: NoiseKeyPair;
12
+ signingKeyPair?: SigningKeyPair;
13
+ testnet?: boolean;
14
+ }
15
+ export interface BitchatClientEvents {
16
+ ready: () => void;
17
+ message: (message: ChatMessage) => void;
18
+ 'peer:connected': (peer: PeerInfo) => void;
19
+ 'peer:disconnected': (peerID: PeerID) => void;
20
+ 'peer:updated': (peer: PeerInfo) => void;
21
+ error: (error: Error, context: string) => void;
22
+ }
23
+ /**
24
+ * Bitchat mesh network client
25
+ */
26
+ export declare class BitchatClient extends EventEmitter {
27
+ private readonly config;
28
+ private readonly transport;
29
+ private readonly router;
30
+ private readonly sessions;
31
+ private running;
32
+ readonly nickname: string;
33
+ readonly peerID: PeerID;
34
+ readonly fingerprint: string;
35
+ /** Get the client configuration */
36
+ getConfig(): BitchatClientConfig;
37
+ constructor(config: BitchatClientConfig);
38
+ /**
39
+ * Start the client
40
+ */
41
+ start(): Promise<void>;
42
+ /**
43
+ * Stop the client
44
+ */
45
+ stop(): Promise<void>;
46
+ /**
47
+ * Send a public message to the mesh
48
+ */
49
+ sendPublicMessage(content: string): Promise<string>;
50
+ /**
51
+ * Send a private message to a specific peer
52
+ */
53
+ sendPrivateMessage(content: string, toPeerID: PeerID): Promise<string>;
54
+ /**
55
+ * Get list of connected peers
56
+ */
57
+ getConnectedPeers(): PeerInfo[];
58
+ /**
59
+ * Get peer info
60
+ */
61
+ getPeerInfo(peerID: PeerID): PeerInfo | undefined;
62
+ private setupEventHandlers;
63
+ private handleIncomingData;
64
+ private handlePacket;
65
+ private handleAnnounce;
66
+ private handlePublicMessage;
67
+ private handleLeave;
68
+ private handleHandshake;
69
+ private handleEncrypted;
70
+ private handlePrivateMessage;
71
+ private sendAnnounce;
72
+ private sendLeave;
73
+ private sendHandshakePacket;
74
+ private buildPrivateMessagePayload;
75
+ private sendEncryptedMessage;
76
+ }
77
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +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"}