@brightchain/brightchain-api-lib 0.13.0 → 0.14.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/package.json +2 -2
- package/src/lib/availability/configValidation.d.ts.map +1 -1
- package/src/lib/availability/configValidation.js +20 -0
- package/src/lib/availability/configValidation.js.map +1 -1
- package/src/lib/availability/gossipService.d.ts +150 -7
- package/src/lib/availability/gossipService.d.ts.map +1 -1
- package/src/lib/availability/gossipService.js +297 -17
- package/src/lib/availability/gossipService.js.map +1 -1
- package/src/lib/interfaces/websocketMessages.d.ts +30 -1
- package/src/lib/interfaces/websocketMessages.d.ts.map +1 -1
- package/src/lib/services/index.d.ts +1 -0
- package/src/lib/services/index.d.ts.map +1 -1
- package/src/lib/services/index.js +1 -0
- package/src/lib/services/index.js.map +1 -1
- package/src/lib/services/messagePassingService.d.ts +95 -5
- package/src/lib/services/messagePassingService.d.ts.map +1 -1
- package/src/lib/services/messagePassingService.js +187 -28
- package/src/lib/services/messagePassingService.js.map +1 -1
- package/src/lib/services/webSocketMessageServer.d.ts +18 -23
- package/src/lib/services/webSocketMessageServer.d.ts.map +1 -1
- package/src/lib/services/webSocketMessageServer.js +30 -46
- package/src/lib/services/webSocketMessageServer.js.map +1 -1
- package/src/lib/services/webSocketPeerProvider.d.ts +49 -0
- package/src/lib/services/webSocketPeerProvider.d.ts.map +1 -0
- package/src/lib/services/webSocketPeerProvider.js +133 -0
- package/src/lib/services/webSocketPeerProvider.js.map +1 -0
- package/src/lib/services/websocketHandler.d.ts +11 -8
- package/src/lib/services/websocketHandler.d.ts.map +1 -1
- package/src/lib/services/websocketHandler.js +33 -40
- package/src/lib/services/websocketHandler.js.map +1 -1
- package/src/lib/stores/diskMessageMetadataStore.d.ts +2 -2
- package/src/lib/stores/diskMessageMetadataStore.d.ts.map +1 -1
- package/src/lib/stores/diskMessageMetadataStore.js +1 -1
- package/src/lib/stores/diskMessageMetadataStore.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messagePassingService.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/messagePassingService.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"messagePassingService.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/messagePassingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,40 +4,155 @@ exports.MessagePassingService = void 0;
|
|
|
4
4
|
const brightchain_lib_1 = require("@brightchain/brightchain-lib");
|
|
5
5
|
const eventNotificationSystem_1 = require("./eventNotificationSystem");
|
|
6
6
|
/**
|
|
7
|
-
* High-level message passing service coordinating storage, routing, and events
|
|
7
|
+
* High-level message passing service coordinating storage, routing, and events.
|
|
8
|
+
*
|
|
9
|
+
* Uses IGossipService for message delivery instead of WebSocketMessageServer.
|
|
10
|
+
* Messages are announced via gossip protocol and delivery acknowledgments
|
|
11
|
+
* are received through gossip ack events.
|
|
12
|
+
*
|
|
13
|
+
* @see Requirements 7.1, 7.2, 7.3, 7.4, 7.5
|
|
8
14
|
*/
|
|
9
15
|
class MessagePassingService {
|
|
10
|
-
constructor(messageCBL, metadataStore, eventSystem,
|
|
16
|
+
constructor(messageCBL, metadataStore, eventSystem, gossipService) {
|
|
11
17
|
this.messageCBL = messageCBL;
|
|
12
18
|
this.metadataStore = metadataStore;
|
|
13
19
|
this.eventSystem = eventSystem;
|
|
14
|
-
this.
|
|
20
|
+
this.gossipService = gossipService;
|
|
15
21
|
this.setupHandlers();
|
|
16
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Wire up the EmailMessageService for email-specific operations.
|
|
25
|
+
*
|
|
26
|
+
* Call this after construction to enable email methods (sendEmail,
|
|
27
|
+
* getEmail, queryInbox, etc.). Without this, email methods will throw.
|
|
28
|
+
*/
|
|
29
|
+
configureEmail(emailMetadataStore, config) {
|
|
30
|
+
this.emailService = new brightchain_lib_1.EmailMessageService(this.messageCBL, emailMetadataStore, this.gossipService, config);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns the underlying EmailMessageService.
|
|
34
|
+
* @throws Error if email has not been configured via configureEmail()
|
|
35
|
+
*/
|
|
36
|
+
getEmailService() {
|
|
37
|
+
if (!this.emailService) {
|
|
38
|
+
throw new Error('Email not configured. Call configureEmail() before using email methods.');
|
|
39
|
+
}
|
|
40
|
+
return this.emailService;
|
|
41
|
+
}
|
|
42
|
+
// ─── Email Operations ─────────────────────────────────────────────
|
|
43
|
+
/**
|
|
44
|
+
* Send an email message via the BrightChain email protocol.
|
|
45
|
+
*
|
|
46
|
+
* @see Requirements 15.1, 15.4
|
|
47
|
+
*/
|
|
48
|
+
async sendEmail(email) {
|
|
49
|
+
return this.getEmailService().sendEmail(email);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Retrieve email metadata by message ID.
|
|
53
|
+
*/
|
|
54
|
+
async getEmail(messageId) {
|
|
55
|
+
return this.getEmailService().getEmail(messageId);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Retrieve full email content including MIME parts and attachments.
|
|
59
|
+
*/
|
|
60
|
+
async getEmailContent(messageId) {
|
|
61
|
+
return this.getEmailService().getEmailContent(messageId);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Delete an email by message ID.
|
|
65
|
+
*/
|
|
66
|
+
async deleteEmail(messageId) {
|
|
67
|
+
return this.getEmailService().deleteEmail(messageId);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Query a user's inbox with filtering, sorting, and pagination.
|
|
71
|
+
*
|
|
72
|
+
* @see Requirements 13.1, 13.2, 13.3, 13.6, 13.7
|
|
73
|
+
*/
|
|
74
|
+
async queryInbox(userId, query) {
|
|
75
|
+
return this.getEmailService().queryInbox(userId, query);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Mark an email as read for a specific user.
|
|
79
|
+
*/
|
|
80
|
+
async markEmailAsRead(messageId, userId) {
|
|
81
|
+
return this.getEmailService().markAsRead(messageId, userId);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get unread email count for a user.
|
|
85
|
+
*/
|
|
86
|
+
async getUnreadEmailCount(userId) {
|
|
87
|
+
return this.getEmailService().getUnreadCount(userId);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get all emails in a thread.
|
|
91
|
+
*/
|
|
92
|
+
async getEmailThread(messageId) {
|
|
93
|
+
return this.getEmailService().getThread(messageId);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create a reply to an existing email.
|
|
97
|
+
*
|
|
98
|
+
* @see Requirements 10.1, 10.2, 10.3
|
|
99
|
+
*/
|
|
100
|
+
async createEmailReply(originalId, replyContent) {
|
|
101
|
+
return this.getEmailService().createReply(originalId, replyContent);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Forward an email to new recipients.
|
|
105
|
+
*
|
|
106
|
+
* @see Requirements 17.1, 17.2, 17.3
|
|
107
|
+
*/
|
|
108
|
+
async forwardEmail(originalId, forwardTo) {
|
|
109
|
+
return this.getEmailService().forwardEmail(originalId, forwardTo);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get delivery status for all recipients of an email.
|
|
113
|
+
*/
|
|
114
|
+
async getEmailDeliveryStatus(messageId) {
|
|
115
|
+
return this.getEmailService().getDeliveryStatus(messageId);
|
|
116
|
+
}
|
|
17
117
|
/**
|
|
18
118
|
* Send a message
|
|
119
|
+
*
|
|
120
|
+
* Stores the message via MessageCBLService, emits MESSAGE_STORED event,
|
|
121
|
+
* then announces the message via gossip protocol for delivery.
|
|
122
|
+
*
|
|
123
|
+
* @see Requirements 7.1, 7.3, 7.5
|
|
19
124
|
*/
|
|
20
125
|
async sendMessage(content, senderId, options) {
|
|
21
126
|
const { messageId, magnetUrl } = await this.messageCBL.createMessage(new Uint8Array(content), senderId, options);
|
|
22
127
|
const metadata = await this.messageCBL.getMessageMetadata(messageId);
|
|
23
128
|
if (metadata) {
|
|
129
|
+
// Emit MESSAGE_STORED event after successful storage (Requirement 7.3)
|
|
24
130
|
this.eventSystem.emit(eventNotificationSystem_1.MessageEventType.MESSAGE_STORED, metadata);
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
131
|
+
// Build message delivery metadata for gossip announcement
|
|
132
|
+
const recipientIds = options.recipients && options.recipients.length > 0
|
|
133
|
+
? [...options.recipients]
|
|
134
|
+
: [];
|
|
135
|
+
const deliveryMetadata = {
|
|
136
|
+
messageId,
|
|
137
|
+
recipientIds,
|
|
138
|
+
priority: 'normal',
|
|
139
|
+
blockIds: metadata.cblBlockIds ?? [],
|
|
140
|
+
cblBlockId: metadata.blockId,
|
|
141
|
+
ackRequired: true,
|
|
142
|
+
};
|
|
143
|
+
// Announce message via gossip protocol (Requirement 7.1)
|
|
144
|
+
await this.gossipService.announceMessage(metadata.cblBlockIds ?? [], deliveryMetadata);
|
|
145
|
+
// Update delivery status for each recipient to Announced
|
|
146
|
+
for (const recipientId of recipientIds) {
|
|
147
|
+
await this.metadataStore.updateDeliveryStatus(messageId, recipientId, brightchain_lib_1.DeliveryStatus.Announced);
|
|
35
148
|
}
|
|
36
149
|
}
|
|
37
150
|
return { messageId, magnetUrl };
|
|
38
151
|
}
|
|
39
152
|
/**
|
|
40
153
|
* Get message content
|
|
154
|
+
*
|
|
155
|
+
* @see Requirements 7.5
|
|
41
156
|
*/
|
|
42
157
|
async getMessage(messageId) {
|
|
43
158
|
const content = await this.messageCBL.getMessageContent(messageId);
|
|
@@ -45,12 +160,16 @@ class MessagePassingService {
|
|
|
45
160
|
}
|
|
46
161
|
/**
|
|
47
162
|
* Query messages
|
|
163
|
+
*
|
|
164
|
+
* @see Requirements 7.5
|
|
48
165
|
*/
|
|
49
166
|
async queryMessages(query) {
|
|
50
167
|
return this.metadataStore.queryMessages(query);
|
|
51
168
|
}
|
|
52
169
|
/**
|
|
53
170
|
* Delete message
|
|
171
|
+
*
|
|
172
|
+
* @see Requirements 7.5
|
|
54
173
|
*/
|
|
55
174
|
async deleteMessage(messageId) {
|
|
56
175
|
const metadata = await this.messageCBL.getMessageMetadata(messageId);
|
|
@@ -60,25 +179,65 @@ class MessagePassingService {
|
|
|
60
179
|
}
|
|
61
180
|
}
|
|
62
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Set up handlers for gossip delivery events.
|
|
184
|
+
*
|
|
185
|
+
* Listens for:
|
|
186
|
+
* - Message delivery announcements (incoming messages)
|
|
187
|
+
* - Delivery acknowledgments (confirmation of sent messages)
|
|
188
|
+
*
|
|
189
|
+
* @see Requirements 7.4
|
|
190
|
+
*/
|
|
63
191
|
setupHandlers() {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if (
|
|
67
|
-
this.
|
|
68
|
-
|
|
192
|
+
// Handle incoming message delivery announcements
|
|
193
|
+
this.gossipService.onMessageDelivery(async (announcement) => {
|
|
194
|
+
if (announcement.messageDelivery) {
|
|
195
|
+
const metadata = await this.messageCBL.getMessageMetadata(announcement.messageDelivery.messageId);
|
|
196
|
+
if (metadata) {
|
|
197
|
+
this.eventSystem.emit(eventNotificationSystem_1.MessageEventType.MESSAGE_RECEIVED, metadata);
|
|
198
|
+
}
|
|
69
199
|
}
|
|
70
200
|
});
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
201
|
+
// Handle delivery acknowledgments (Requirement 7.4)
|
|
202
|
+
this.gossipService.onDeliveryAck(async (announcement) => {
|
|
203
|
+
if (announcement.deliveryAck) {
|
|
204
|
+
const { messageId, recipientId, status } = announcement.deliveryAck;
|
|
205
|
+
// Map ack status to DeliveryStatus
|
|
206
|
+
const deliveryStatus = status === 'delivered' || status === 'read'
|
|
207
|
+
? brightchain_lib_1.DeliveryStatus.Delivered
|
|
208
|
+
: brightchain_lib_1.DeliveryStatus.Failed;
|
|
209
|
+
// Record the acknowledgment and update delivery status.
|
|
210
|
+
// The message may be managed by the email subsystem (InMemoryEmailMetadataStore)
|
|
211
|
+
// rather than the generic MemoryMessageMetadataStore, so KeyNotFound is expected
|
|
212
|
+
// for email messages and should be silently ignored.
|
|
213
|
+
try {
|
|
214
|
+
await this.metadataStore.recordAcknowledgment(messageId, recipientId, new Date());
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
if (!(err instanceof brightchain_lib_1.StoreError) ||
|
|
218
|
+
err.type !== brightchain_lib_1.StoreErrorType.KeyNotFound) {
|
|
219
|
+
throw err;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
await this.metadataStore.updateDeliveryStatus(messageId, recipientId, deliveryStatus);
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
if (!(err instanceof brightchain_lib_1.StoreError) ||
|
|
227
|
+
err.type !== brightchain_lib_1.StoreErrorType.KeyNotFound) {
|
|
228
|
+
throw err;
|
|
229
|
+
}
|
|
79
230
|
}
|
|
80
|
-
|
|
81
|
-
|
|
231
|
+
// Check if all recipients have been delivered and emit appropriate events
|
|
232
|
+
const metadata = await this.messageCBL.getMessageMetadata(messageId);
|
|
233
|
+
if (metadata) {
|
|
234
|
+
const allDelivered = metadata.recipients?.every((r) => metadata.deliveryStatus?.get(r) === brightchain_lib_1.DeliveryStatus.Delivered);
|
|
235
|
+
if (allDelivered) {
|
|
236
|
+
this.eventSystem.emit(eventNotificationSystem_1.MessageEventType.MESSAGE_DELIVERED, metadata);
|
|
237
|
+
}
|
|
238
|
+
else if (deliveryStatus === brightchain_lib_1.DeliveryStatus.Failed) {
|
|
239
|
+
this.eventSystem.emit(eventNotificationSystem_1.MessageEventType.MESSAGE_FAILED, metadata);
|
|
240
|
+
}
|
|
82
241
|
}
|
|
83
242
|
}
|
|
84
243
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messagePassingService.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/messagePassingService.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"messagePassingService.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/messagePassingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +1,29 @@
|
|
|
1
|
+
import { BlockAnnouncement } from '@brightchain/brightchain-lib';
|
|
1
2
|
import { Server } from 'http';
|
|
3
|
+
import type { EncryptedBatchPayload } from '../availability/gossipService';
|
|
2
4
|
/**
|
|
3
|
-
*
|
|
5
|
+
* Handler for incoming gossip announcement batches.
|
|
6
|
+
* Called when a peer sends a batch of BlockAnnouncements over WebSocket.
|
|
4
7
|
*/
|
|
5
|
-
export type
|
|
6
|
-
export type AckHandler = (nodeId: string, messageId: string, status: string) => Promise<void>;
|
|
8
|
+
export type GossipBatchHandler = (fromNodeId: string, announcements: BlockAnnouncement[], encrypted?: EncryptedBatchPayload) => void;
|
|
7
9
|
/**
|
|
8
|
-
* Node.js WebSocket server for
|
|
9
|
-
* Manages WebSocket connections
|
|
10
|
+
* Node.js WebSocket server for gossip transport with ECIES authentication
|
|
11
|
+
* Manages WebSocket connections between nodes.
|
|
12
|
+
* Gossip announcement batches are received and dispatched to registered handlers.
|
|
10
13
|
*/
|
|
11
14
|
export declare class WebSocketMessageServer {
|
|
12
15
|
private wss;
|
|
13
16
|
private connections;
|
|
14
17
|
private authenticatedNodes;
|
|
15
18
|
private publicKeys;
|
|
16
|
-
private messageHandler?;
|
|
17
|
-
private ackHandler?;
|
|
18
19
|
private eciesService;
|
|
19
20
|
private requireAuth;
|
|
21
|
+
private gossipBatchHandlers;
|
|
20
22
|
constructor(server: Server, requireAuth?: boolean);
|
|
21
23
|
/**
|
|
22
24
|
* Register public key for a node
|
|
23
25
|
*/
|
|
24
26
|
registerNodeKey(nodeId: string, publicKey: Buffer): void;
|
|
25
|
-
/**
|
|
26
|
-
* Register message handler
|
|
27
|
-
*/
|
|
28
|
-
onMessage(handler: MessageHandler): void;
|
|
29
|
-
/**
|
|
30
|
-
* Register acknowledgment handler
|
|
31
|
-
*/
|
|
32
|
-
onAck(handler: AckHandler): void;
|
|
33
|
-
/**
|
|
34
|
-
* Send message to specific node
|
|
35
|
-
*/
|
|
36
|
-
sendToNode(nodeId: string, messageId: string): Promise<boolean>;
|
|
37
|
-
/**
|
|
38
|
-
* Broadcast message to all connected nodes
|
|
39
|
-
*/
|
|
40
|
-
broadcast(messageId: string): void;
|
|
41
27
|
/**
|
|
42
28
|
* Get connected node IDs
|
|
43
29
|
*/
|
|
@@ -46,6 +32,15 @@ export declare class WebSocketMessageServer {
|
|
|
46
32
|
* Close all connections and shutdown server
|
|
47
33
|
*/
|
|
48
34
|
close(callback?: () => void): void;
|
|
35
|
+
/**
|
|
36
|
+
* Register a handler for incoming gossip announcement batches.
|
|
37
|
+
* The handler is called when a peer sends a 'gossip_batch' message.
|
|
38
|
+
*/
|
|
39
|
+
onGossipBatch(handler: GossipBatchHandler): void;
|
|
40
|
+
/**
|
|
41
|
+
* Remove a gossip batch handler.
|
|
42
|
+
*/
|
|
43
|
+
offGossipBatch(handler: GossipBatchHandler): void;
|
|
49
44
|
private setupConnectionHandler;
|
|
50
45
|
private verifySignature;
|
|
51
46
|
private extractNodeId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webSocketMessageServer.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/webSocketMessageServer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webSocketMessageServer.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/webSocketMessageServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAE3E;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,iBAAiB,EAAE,EAClC,SAAS,CAAC,EAAE,qBAAqB,KAC9B,IAAI,CAAC;AAEV;;;;GAIG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,GAAG,CAAkB;IAC7B,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,mBAAmB,CAAsC;gBAErD,MAAM,EAAE,MAAM,EAAE,WAAW,UAAQ;IAkB/C;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIxD;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAI7B;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI;IAclC;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAIhD;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAIjD,OAAO,CAAC,sBAAsB;YAkFhB,eAAe;IAmB7B,OAAO,CAAC,aAAa;CAKtB"}
|
|
@@ -4,14 +4,16 @@ exports.WebSocketMessageServer = void 0;
|
|
|
4
4
|
const node_ecies_lib_1 = require("@digitaldefiance/node-ecies-lib");
|
|
5
5
|
const ws_1 = require("ws");
|
|
6
6
|
/**
|
|
7
|
-
* Node.js WebSocket server for
|
|
8
|
-
* Manages WebSocket connections
|
|
7
|
+
* Node.js WebSocket server for gossip transport with ECIES authentication
|
|
8
|
+
* Manages WebSocket connections between nodes.
|
|
9
|
+
* Gossip announcement batches are received and dispatched to registered handlers.
|
|
9
10
|
*/
|
|
10
11
|
class WebSocketMessageServer {
|
|
11
12
|
constructor(server, requireAuth = false) {
|
|
12
13
|
this.connections = new Map();
|
|
13
14
|
this.authenticatedNodes = new Map(); // ws -> nodeId
|
|
14
15
|
this.publicKeys = new Map(); // nodeId -> publicKey
|
|
16
|
+
this.gossipBatchHandlers = new Set();
|
|
15
17
|
this.wss = new ws_1.WebSocketServer({ server });
|
|
16
18
|
this.requireAuth = requireAuth;
|
|
17
19
|
// Create Node.js-compatible ECIES config with full algorithm name
|
|
@@ -32,45 +34,6 @@ class WebSocketMessageServer {
|
|
|
32
34
|
registerNodeKey(nodeId, publicKey) {
|
|
33
35
|
this.publicKeys.set(nodeId, publicKey);
|
|
34
36
|
}
|
|
35
|
-
/**
|
|
36
|
-
* Register message handler
|
|
37
|
-
*/
|
|
38
|
-
onMessage(handler) {
|
|
39
|
-
this.messageHandler = handler;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Register acknowledgment handler
|
|
43
|
-
*/
|
|
44
|
-
onAck(handler) {
|
|
45
|
-
this.ackHandler = handler;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Send message to specific node
|
|
49
|
-
*/
|
|
50
|
-
async sendToNode(nodeId, messageId) {
|
|
51
|
-
const ws = this.connections.get(nodeId);
|
|
52
|
-
if (!ws || ws.readyState !== ws_1.WebSocket.OPEN) {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
try {
|
|
56
|
-
ws.send(JSON.stringify({ type: 'message', messageId }));
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return false;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Broadcast message to all connected nodes
|
|
65
|
-
*/
|
|
66
|
-
broadcast(messageId) {
|
|
67
|
-
const message = JSON.stringify({ type: 'message', messageId });
|
|
68
|
-
for (const ws of this.connections.values()) {
|
|
69
|
-
if (ws.readyState === ws_1.WebSocket.OPEN) {
|
|
70
|
-
ws.send(message);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
37
|
/**
|
|
75
38
|
* Get connected node IDs
|
|
76
39
|
*/
|
|
@@ -86,6 +49,7 @@ class WebSocketMessageServer {
|
|
|
86
49
|
}
|
|
87
50
|
this.connections.clear();
|
|
88
51
|
this.authenticatedNodes.clear();
|
|
52
|
+
this.gossipBatchHandlers.clear();
|
|
89
53
|
if (callback) {
|
|
90
54
|
this.wss.close(callback);
|
|
91
55
|
}
|
|
@@ -93,6 +57,19 @@ class WebSocketMessageServer {
|
|
|
93
57
|
this.wss.close();
|
|
94
58
|
}
|
|
95
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Register a handler for incoming gossip announcement batches.
|
|
62
|
+
* The handler is called when a peer sends a 'gossip_batch' message.
|
|
63
|
+
*/
|
|
64
|
+
onGossipBatch(handler) {
|
|
65
|
+
this.gossipBatchHandlers.add(handler);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Remove a gossip batch handler.
|
|
69
|
+
*/
|
|
70
|
+
offGossipBatch(handler) {
|
|
71
|
+
this.gossipBatchHandlers.delete(handler);
|
|
72
|
+
}
|
|
96
73
|
setupConnectionHandler() {
|
|
97
74
|
this.wss.on('connection', (ws, req) => {
|
|
98
75
|
const nodeId = this.extractNodeId(req.url);
|
|
@@ -126,11 +103,18 @@ class WebSocketMessageServer {
|
|
|
126
103
|
ws.close();
|
|
127
104
|
return;
|
|
128
105
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
106
|
+
// Handle gossip announcement batches from peers
|
|
107
|
+
if (message.type === 'gossip_batch') {
|
|
108
|
+
const senderNodeId = this.authenticatedNodes.get(ws) ?? nodeId;
|
|
109
|
+
for (const handler of this.gossipBatchHandlers) {
|
|
110
|
+
try {
|
|
111
|
+
handler(senderNodeId, message.announcements ?? [], message.encrypted);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Ignore handler errors
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return;
|
|
134
118
|
}
|
|
135
119
|
}
|
|
136
120
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webSocketMessageServer.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/webSocketMessageServer.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"webSocketMessageServer.js","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/webSocketMessageServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket-based IPeerProvider implementation.
|
|
3
|
+
*
|
|
4
|
+
* Bridges the GossipService's IPeerProvider interface to real WebSocket
|
|
5
|
+
* connections between BrightChain nodes. Each peer is represented by an
|
|
6
|
+
* outbound WebSocket client connection to that peer's WebSocketMessageServer.
|
|
7
|
+
*
|
|
8
|
+
* Used for real cross-node gossip transport in both production and
|
|
9
|
+
* integration testing (multiple servers on different ports).
|
|
10
|
+
*/
|
|
11
|
+
import { BlockAnnouncement } from '@brightchain/brightchain-lib';
|
|
12
|
+
import { EncryptedBatchPayload, IPeerProvider } from '../availability/gossipService';
|
|
13
|
+
/**
|
|
14
|
+
* IPeerProvider implementation that sends gossip batches over WebSocket.
|
|
15
|
+
*
|
|
16
|
+
* For each peer, maintains an outbound WebSocket connection to that peer's
|
|
17
|
+
* WebSocketMessageServer. Announcement batches are serialized to JSON and
|
|
18
|
+
* sent as 'gossip_batch' messages.
|
|
19
|
+
*/
|
|
20
|
+
export declare class WebSocketPeerProvider implements IPeerProvider {
|
|
21
|
+
private readonly localNodeId;
|
|
22
|
+
private peers;
|
|
23
|
+
constructor(localNodeId: string);
|
|
24
|
+
getLocalNodeId(): string;
|
|
25
|
+
getConnectedPeerIds(): string[];
|
|
26
|
+
/**
|
|
27
|
+
* Connect to a peer's WebSocketMessageServer.
|
|
28
|
+
*
|
|
29
|
+
* @param peerId - The peer's node ID
|
|
30
|
+
* @param url - WebSocket URL, e.g. ws://localhost:3001/{localNodeId}
|
|
31
|
+
* @returns Promise that resolves when the connection is open
|
|
32
|
+
*/
|
|
33
|
+
connectToPeer(peerId: string, url: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Register a peer's ECIES public key for encrypted gossip.
|
|
36
|
+
*/
|
|
37
|
+
registerPeerPublicKey(peerId: string, publicKey: Buffer): void;
|
|
38
|
+
sendAnnouncementBatch(peerId: string, announcements: BlockAnnouncement[], encrypted?: EncryptedBatchPayload): Promise<void>;
|
|
39
|
+
getPeerPublicKey(peerId: string): Promise<Buffer | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Disconnect from all peers and close all WebSocket connections.
|
|
42
|
+
*/
|
|
43
|
+
disconnectAll(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Disconnect from a specific peer.
|
|
46
|
+
*/
|
|
47
|
+
disconnectPeer(peerId: string): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=webSocketPeerProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webSocketPeerProvider.d.ts","sourceRoot":"","sources":["../../../../../brightchain-api-lib/src/lib/services/webSocketPeerProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,qBAAqB,EACrB,aAAa,EACd,MAAM,+BAA+B,CAAC;AAcvC;;;;;;GAMG;AACH,qBAAa,qBAAsB,YAAW,aAAa;IAG7C,OAAO,CAAC,QAAQ,CAAC,WAAW;IAFxC,OAAO,CAAC,KAAK,CAAqC;gBAErB,WAAW,EAAE,MAAM;IAEhD,cAAc,IAAI,MAAM;IAIxB,mBAAmB,IAAI,MAAM,EAAE;IAU/B;;;;;;OAMG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB/D;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAOxD,qBAAqB,CACzB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,iBAAiB,EAAE,EAClC,SAAS,CAAC,EAAE,qBAAqB,GAChC,OAAO,CAAC,IAAI,CAAC;IA4BV,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAK9D;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAUrC"}
|