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
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 @@
|
|
|
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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"}
|
package/dist/client.d.ts
ADDED
|
@@ -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"}
|