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,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitchat Protocol Types
|
|
3
|
+
* From: bitchat/Protocols/BitchatProtocol.swift
|
|
4
|
+
* bitchat/Models/BitchatPacket.swift
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Message types from BitchatProtocol.swift
|
|
8
|
+
* Reduced from 24 types to 8 essential ones.
|
|
9
|
+
*/
|
|
10
|
+
export declare enum MessageType {
|
|
11
|
+
ANNOUNCE = 1,// "I'm here" with nickname
|
|
12
|
+
MESSAGE = 2,// Public chat message
|
|
13
|
+
LEAVE = 3,// "I'm leaving"
|
|
14
|
+
REQUEST_SYNC = 33,// GCS filter-based sync request
|
|
15
|
+
NOISE_HANDSHAKE = 16,// Handshake (init or response)
|
|
16
|
+
NOISE_ENCRYPTED = 17,// All encrypted payloads
|
|
17
|
+
FRAGMENT = 32,// Fragment for large messages
|
|
18
|
+
FILE_TRANSFER = 34
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Noise payload types (first byte of decrypted payload)
|
|
22
|
+
*/
|
|
23
|
+
export declare enum NoisePayloadType {
|
|
24
|
+
PRIVATE_MESSAGE = 1,
|
|
25
|
+
READ_RECEIPT = 2,
|
|
26
|
+
DELIVERED = 3,
|
|
27
|
+
VERIFY_CHALLENGE = 16,
|
|
28
|
+
VERIFY_RESPONSE = 17
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Binary protocol flags
|
|
32
|
+
*/
|
|
33
|
+
export declare const PacketFlags: {
|
|
34
|
+
readonly HAS_RECIPIENT: 1;
|
|
35
|
+
readonly HAS_SIGNATURE: 2;
|
|
36
|
+
readonly IS_COMPRESSED: 4;
|
|
37
|
+
readonly HAS_ROUTE: 8;
|
|
38
|
+
readonly IS_RSR: 16;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Peer identifier (8 bytes, displayed as 16-char hex)
|
|
42
|
+
*/
|
|
43
|
+
export declare class PeerID {
|
|
44
|
+
private readonly bytes;
|
|
45
|
+
constructor(bytes: Uint8Array | string);
|
|
46
|
+
static fromPublicKey(publicKey: Uint8Array): PeerID;
|
|
47
|
+
toBytes(): Uint8Array;
|
|
48
|
+
toHex(): string;
|
|
49
|
+
toString(): string;
|
|
50
|
+
equals(other: PeerID): boolean;
|
|
51
|
+
get isEmpty(): boolean;
|
|
52
|
+
static readonly BROADCAST: PeerID;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Core packet structure
|
|
56
|
+
* From: bitchat/Models/BitchatPacket.swift
|
|
57
|
+
*/
|
|
58
|
+
export interface BitchatPacket {
|
|
59
|
+
version: number;
|
|
60
|
+
type: MessageType;
|
|
61
|
+
ttl: number;
|
|
62
|
+
timestamp: bigint;
|
|
63
|
+
senderID: PeerID;
|
|
64
|
+
recipientID?: PeerID;
|
|
65
|
+
payload: Uint8Array;
|
|
66
|
+
signature?: Uint8Array;
|
|
67
|
+
route?: PeerID[];
|
|
68
|
+
isRSR: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Delivery status for messages
|
|
72
|
+
*/
|
|
73
|
+
export type DeliveryStatus = {
|
|
74
|
+
type: 'sending';
|
|
75
|
+
} | {
|
|
76
|
+
type: 'sent';
|
|
77
|
+
} | {
|
|
78
|
+
type: 'delivered';
|
|
79
|
+
to: PeerID;
|
|
80
|
+
at: Date;
|
|
81
|
+
} | {
|
|
82
|
+
type: 'read';
|
|
83
|
+
by: PeerID;
|
|
84
|
+
at: Date;
|
|
85
|
+
} | {
|
|
86
|
+
type: 'failed';
|
|
87
|
+
reason: string;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Handshake state for lazy Noise sessions
|
|
91
|
+
*/
|
|
92
|
+
export declare enum HandshakeState {
|
|
93
|
+
NONE = "none",
|
|
94
|
+
QUEUED = "queued",
|
|
95
|
+
HANDSHAKING = "handshaking",
|
|
96
|
+
ESTABLISHED = "established",
|
|
97
|
+
FAILED = "failed"
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Connected peer information
|
|
101
|
+
*/
|
|
102
|
+
export interface PeerInfo {
|
|
103
|
+
peerID: PeerID;
|
|
104
|
+
nickname: string;
|
|
105
|
+
isConnected: boolean;
|
|
106
|
+
noisePublicKey?: Uint8Array;
|
|
107
|
+
signingPublicKey?: Uint8Array;
|
|
108
|
+
isVerified: boolean;
|
|
109
|
+
lastSeen: Date;
|
|
110
|
+
handshakeState: HandshakeState;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Chat message (application layer)
|
|
114
|
+
*/
|
|
115
|
+
export interface ChatMessage {
|
|
116
|
+
id: string;
|
|
117
|
+
sender: PeerID;
|
|
118
|
+
senderNickname: string;
|
|
119
|
+
content: string;
|
|
120
|
+
timestamp: Date;
|
|
121
|
+
isPrivate: boolean;
|
|
122
|
+
recipientNickname?: string;
|
|
123
|
+
originalSender?: PeerID;
|
|
124
|
+
deliveryStatus: DeliveryStatus;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Read receipt
|
|
128
|
+
*/
|
|
129
|
+
export interface ReadReceipt {
|
|
130
|
+
originalMessageID: string;
|
|
131
|
+
readBy: PeerID;
|
|
132
|
+
readAt: Date;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bitchat Protocol Types
|
|
3
|
+
* From: bitchat/Protocols/BitchatProtocol.swift
|
|
4
|
+
* bitchat/Models/BitchatPacket.swift
|
|
5
|
+
*/
|
|
6
|
+
import { hash as sha256 } from '@stablelib/sha256';
|
|
7
|
+
import { SENDER_ID_SIZE } from './constants.js';
|
|
8
|
+
/**
|
|
9
|
+
* Message types from BitchatProtocol.swift
|
|
10
|
+
* Reduced from 24 types to 8 essential ones.
|
|
11
|
+
*/
|
|
12
|
+
export var MessageType;
|
|
13
|
+
(function (MessageType) {
|
|
14
|
+
// Public messages (unencrypted)
|
|
15
|
+
MessageType[MessageType["ANNOUNCE"] = 1] = "ANNOUNCE";
|
|
16
|
+
MessageType[MessageType["MESSAGE"] = 2] = "MESSAGE";
|
|
17
|
+
MessageType[MessageType["LEAVE"] = 3] = "LEAVE";
|
|
18
|
+
MessageType[MessageType["REQUEST_SYNC"] = 33] = "REQUEST_SYNC";
|
|
19
|
+
// Noise encryption
|
|
20
|
+
MessageType[MessageType["NOISE_HANDSHAKE"] = 16] = "NOISE_HANDSHAKE";
|
|
21
|
+
MessageType[MessageType["NOISE_ENCRYPTED"] = 17] = "NOISE_ENCRYPTED";
|
|
22
|
+
// Fragmentation
|
|
23
|
+
MessageType[MessageType["FRAGMENT"] = 32] = "FRAGMENT";
|
|
24
|
+
MessageType[MessageType["FILE_TRANSFER"] = 34] = "FILE_TRANSFER";
|
|
25
|
+
})(MessageType || (MessageType = {}));
|
|
26
|
+
/**
|
|
27
|
+
* Noise payload types (first byte of decrypted payload)
|
|
28
|
+
*/
|
|
29
|
+
export var NoisePayloadType;
|
|
30
|
+
(function (NoisePayloadType) {
|
|
31
|
+
NoisePayloadType[NoisePayloadType["PRIVATE_MESSAGE"] = 1] = "PRIVATE_MESSAGE";
|
|
32
|
+
NoisePayloadType[NoisePayloadType["READ_RECEIPT"] = 2] = "READ_RECEIPT";
|
|
33
|
+
NoisePayloadType[NoisePayloadType["DELIVERED"] = 3] = "DELIVERED";
|
|
34
|
+
NoisePayloadType[NoisePayloadType["VERIFY_CHALLENGE"] = 16] = "VERIFY_CHALLENGE";
|
|
35
|
+
NoisePayloadType[NoisePayloadType["VERIFY_RESPONSE"] = 17] = "VERIFY_RESPONSE";
|
|
36
|
+
})(NoisePayloadType || (NoisePayloadType = {}));
|
|
37
|
+
/**
|
|
38
|
+
* Binary protocol flags
|
|
39
|
+
*/
|
|
40
|
+
export const PacketFlags = {
|
|
41
|
+
HAS_RECIPIENT: 0x01,
|
|
42
|
+
HAS_SIGNATURE: 0x02,
|
|
43
|
+
IS_COMPRESSED: 0x04,
|
|
44
|
+
HAS_ROUTE: 0x08, // v2+ only
|
|
45
|
+
IS_RSR: 0x10, // Request-Sync-Response
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Peer identifier (8 bytes, displayed as 16-char hex)
|
|
49
|
+
*/
|
|
50
|
+
export class PeerID {
|
|
51
|
+
bytes;
|
|
52
|
+
constructor(bytes) {
|
|
53
|
+
if (typeof bytes === 'string') {
|
|
54
|
+
// Parse hex string
|
|
55
|
+
const hex = bytes.replace(/^0x/, '').toLowerCase();
|
|
56
|
+
const padded = hex.padStart(16, '0').slice(0, 16);
|
|
57
|
+
this.bytes = new Uint8Array(SENDER_ID_SIZE);
|
|
58
|
+
for (let i = 0; i < SENDER_ID_SIZE; i++) {
|
|
59
|
+
this.bytes[i] = parseInt(padded.slice(i * 2, i * 2 + 2), 16);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.bytes = new Uint8Array(SENDER_ID_SIZE);
|
|
64
|
+
this.bytes.set(bytes.subarray(0, SENDER_ID_SIZE));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
static fromPublicKey(publicKey) {
|
|
68
|
+
// SHA256 of public key, first 8 bytes
|
|
69
|
+
const hash = sha256(publicKey);
|
|
70
|
+
return new PeerID(hash.subarray(0, SENDER_ID_SIZE));
|
|
71
|
+
}
|
|
72
|
+
toBytes() {
|
|
73
|
+
return new Uint8Array(this.bytes);
|
|
74
|
+
}
|
|
75
|
+
toHex() {
|
|
76
|
+
return Array.from(this.bytes)
|
|
77
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
78
|
+
.join('');
|
|
79
|
+
}
|
|
80
|
+
toString() {
|
|
81
|
+
return this.toHex();
|
|
82
|
+
}
|
|
83
|
+
equals(other) {
|
|
84
|
+
if (this.bytes.length !== other.bytes.length)
|
|
85
|
+
return false;
|
|
86
|
+
for (let i = 0; i < this.bytes.length; i++) {
|
|
87
|
+
if (this.bytes[i] !== other.bytes[i])
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
get isEmpty() {
|
|
93
|
+
return this.bytes.every((b) => b === 0);
|
|
94
|
+
}
|
|
95
|
+
static BROADCAST = new PeerID(new Uint8Array(SENDER_ID_SIZE).fill(0xff));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Handshake state for lazy Noise sessions
|
|
99
|
+
*/
|
|
100
|
+
export var HandshakeState;
|
|
101
|
+
(function (HandshakeState) {
|
|
102
|
+
HandshakeState["NONE"] = "none";
|
|
103
|
+
HandshakeState["QUEUED"] = "queued";
|
|
104
|
+
HandshakeState["HANDSHAKING"] = "handshaking";
|
|
105
|
+
HandshakeState["ESTABLISHED"] = "established";
|
|
106
|
+
HandshakeState["FAILED"] = "failed";
|
|
107
|
+
})(HandshakeState || (HandshakeState = {}));
|
|
108
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,GAGf,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager
|
|
3
|
+
* Manages Noise sessions with peers, handling handshakes and encryption
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'node:events';
|
|
6
|
+
import { type NoiseKeyPair, NoiseSession } from '../crypto/noise.js';
|
|
7
|
+
import { type SigningKeyPair } from '../crypto/signing.js';
|
|
8
|
+
import { HandshakeState, PeerID, type PeerInfo } from '../protocol/types.js';
|
|
9
|
+
export interface SessionManagerConfig {
|
|
10
|
+
autoHandshake: boolean;
|
|
11
|
+
handshakeTimeoutMs: number;
|
|
12
|
+
}
|
|
13
|
+
export interface SessionManagerEvents {
|
|
14
|
+
'session:established': (peerID: PeerID, session: NoiseSession) => void;
|
|
15
|
+
'session:failed': (peerID: PeerID, error: Error) => void;
|
|
16
|
+
'session:closed': (peerID: PeerID) => void;
|
|
17
|
+
'handshake:message': (peerID: PeerID, message: Uint8Array) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Manages Noise sessions with peers
|
|
21
|
+
*/
|
|
22
|
+
export declare class SessionManager extends EventEmitter {
|
|
23
|
+
private readonly config;
|
|
24
|
+
readonly staticKeyPair: NoiseKeyPair;
|
|
25
|
+
readonly signingKeyPair: SigningKeyPair;
|
|
26
|
+
readonly myPeerID: PeerID;
|
|
27
|
+
readonly fingerprint: string;
|
|
28
|
+
private pendingHandshakes;
|
|
29
|
+
private sessions;
|
|
30
|
+
private peers;
|
|
31
|
+
private pendingMessages;
|
|
32
|
+
constructor(config?: Partial<SessionManagerConfig>, existingKeys?: {
|
|
33
|
+
static?: NoiseKeyPair;
|
|
34
|
+
signing?: SigningKeyPair;
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* Check if we have an established session with a peer
|
|
38
|
+
*/
|
|
39
|
+
hasSession(peerID: PeerID): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Check if we're in the middle of a handshake
|
|
42
|
+
*/
|
|
43
|
+
hasHandshakeInProgress(peerID: PeerID): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Get handshake state for a peer
|
|
46
|
+
*/
|
|
47
|
+
getHandshakeState(peerID: PeerID): HandshakeState;
|
|
48
|
+
/**
|
|
49
|
+
* Get established session
|
|
50
|
+
*/
|
|
51
|
+
getSession(peerID: PeerID): NoiseSession | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Initiate a handshake with a peer
|
|
54
|
+
*/
|
|
55
|
+
initiateHandshake(peerID: PeerID): Uint8Array;
|
|
56
|
+
/**
|
|
57
|
+
* Handle incoming handshake message
|
|
58
|
+
*/
|
|
59
|
+
handleHandshakeMessage(peerID: PeerID, message: Uint8Array): Uint8Array | null;
|
|
60
|
+
/**
|
|
61
|
+
* Complete a successful handshake
|
|
62
|
+
*/
|
|
63
|
+
private completeHandshake;
|
|
64
|
+
/**
|
|
65
|
+
* Handle handshake timeout
|
|
66
|
+
*/
|
|
67
|
+
private handleHandshakeTimeout;
|
|
68
|
+
/**
|
|
69
|
+
* Handle handshake failure
|
|
70
|
+
*/
|
|
71
|
+
private handleHandshakeFailure;
|
|
72
|
+
/**
|
|
73
|
+
* Encrypt data for a peer
|
|
74
|
+
*/
|
|
75
|
+
encrypt(peerID: PeerID, plaintext: Uint8Array): Uint8Array;
|
|
76
|
+
/**
|
|
77
|
+
* Decrypt data from a peer
|
|
78
|
+
*/
|
|
79
|
+
decrypt(peerID: PeerID, ciphertext: Uint8Array): Uint8Array;
|
|
80
|
+
/**
|
|
81
|
+
* Queue a message for after handshake completion
|
|
82
|
+
*/
|
|
83
|
+
queueMessage(peerID: PeerID, data: Uint8Array): void;
|
|
84
|
+
/**
|
|
85
|
+
* Flush pending messages for a peer
|
|
86
|
+
*/
|
|
87
|
+
private flushPendingMessages;
|
|
88
|
+
/**
|
|
89
|
+
* Close session with a peer
|
|
90
|
+
*/
|
|
91
|
+
closeSession(peerID: PeerID): void;
|
|
92
|
+
/**
|
|
93
|
+
* Update peer info
|
|
94
|
+
*/
|
|
95
|
+
updatePeerInfo(peerID: PeerID, updates: Partial<PeerInfo>): void;
|
|
96
|
+
/**
|
|
97
|
+
* Get peer info
|
|
98
|
+
*/
|
|
99
|
+
getPeerInfo(peerID: PeerID): PeerInfo | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* Get all known peers
|
|
102
|
+
*/
|
|
103
|
+
getAllPeers(): PeerInfo[];
|
|
104
|
+
/**
|
|
105
|
+
* Get all peers with established sessions
|
|
106
|
+
*/
|
|
107
|
+
getConnectedPeers(): PeerInfo[];
|
|
108
|
+
/**
|
|
109
|
+
* Clean up
|
|
110
|
+
*/
|
|
111
|
+
destroy(): void;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
|