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
@@ -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,5 @@
1
+ /**
2
+ * Session module exports
3
+ */
4
+ export { SessionManager, type SessionManagerConfig, type SessionManagerEvents, } from './manager.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ /**
2
+ * Session module exports
3
+ */
4
+ export { SessionManager, } from './manager.js';
5
+ //# sourceMappingURL=index.js.map
@@ -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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"}