@waku/sds 0.0.3-ff0222a.0 → 0.0.4-006cd41.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/CHANGELOG.md +19 -0
- package/bundle/index.js +5366 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/{bloom.js → bloom_filter/bloom.js} +2 -2
- package/dist/bloom_filter/bloom.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/message_channel/command_queue.d.ts +29 -0
- package/dist/message_channel/command_queue.js +7 -0
- package/dist/message_channel/command_queue.js.map +1 -0
- package/dist/message_channel/events.d.ts +32 -0
- package/dist/message_channel/events.js +19 -0
- package/dist/message_channel/events.js.map +1 -0
- package/dist/message_channel/index.d.ts +3 -0
- package/dist/message_channel/index.js +4 -0
- package/dist/message_channel/index.js.map +1 -0
- package/dist/{sds.d.ts → message_channel/message_channel.d.ts} +43 -11
- package/dist/{sds.js → message_channel/message_channel.js} +194 -33
- package/dist/message_channel/message_channel.js.map +1 -0
- package/package.json +1 -1
- package/src/{bloom.ts → bloom_filter/bloom.ts} +2 -2
- package/src/index.ts +3 -1
- package/src/message_channel/command_queue.ts +34 -0
- package/src/message_channel/events.ts +41 -0
- package/src/message_channel/index.ts +3 -0
- package/src/{sds.ts → message_channel/message_channel.ts} +252 -41
- package/dist/bloom.js.map +0 -1
- package/dist/sds.js.map +0 -1
- /package/dist/{bloom.d.ts → bloom_filter/bloom.d.ts} +0 -0
@@ -1,11 +1,17 @@
|
|
1
|
+
import { TypedEventEmitter } from "@libp2p/interface";
|
1
2
|
import { sha256 } from "@noble/hashes/sha256";
|
2
3
|
import { bytesToHex } from "@noble/hashes/utils";
|
3
|
-
import { proto_sds_message } from "@waku/proto";
|
4
4
|
|
5
|
-
import { DefaultBloomFilter } from "
|
5
|
+
import { DefaultBloomFilter } from "../bloom_filter/bloom.js";
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
import { Command, Handlers, ParamsByAction, Task } from "./command_queue.js";
|
8
|
+
import {
|
9
|
+
ChannelId,
|
10
|
+
HistoryEntry,
|
11
|
+
Message,
|
12
|
+
MessageChannelEvent,
|
13
|
+
MessageChannelEvents
|
14
|
+
} from "./events.js";
|
9
15
|
|
10
16
|
export const DEFAULT_BLOOM_FILTER_OPTIONS = {
|
11
17
|
capacity: 10000,
|
@@ -15,34 +21,84 @@ export const DEFAULT_BLOOM_FILTER_OPTIONS = {
|
|
15
21
|
const DEFAULT_CAUSAL_HISTORY_SIZE = 2;
|
16
22
|
const DEFAULT_RECEIVED_MESSAGE_TIMEOUT = 1000 * 60 * 5; // 5 minutes
|
17
23
|
|
18
|
-
|
24
|
+
interface MessageChannelOptions {
|
25
|
+
causalHistorySize?: number;
|
26
|
+
receivedMessageTimeoutEnabled?: boolean;
|
27
|
+
receivedMessageTimeout?: number;
|
28
|
+
}
|
29
|
+
|
30
|
+
export class MessageChannel extends TypedEventEmitter<MessageChannelEvents> {
|
19
31
|
private lamportTimestamp: number;
|
20
32
|
private filter: DefaultBloomFilter;
|
21
33
|
private outgoingBuffer: Message[];
|
22
34
|
private acknowledgements: Map<string, number>;
|
23
35
|
private incomingBuffer: Message[];
|
24
|
-
private
|
25
|
-
|
36
|
+
private localHistory: { timestamp: number; historyEntry: HistoryEntry }[];
|
37
|
+
public channelId: ChannelId;
|
26
38
|
private causalHistorySize: number;
|
27
39
|
private acknowledgementCount: number;
|
28
40
|
private timeReceived: Map<string, number>;
|
41
|
+
private receivedMessageTimeoutEnabled: boolean;
|
42
|
+
private receivedMessageTimeout: number;
|
43
|
+
|
44
|
+
private tasks: Task[] = [];
|
45
|
+
private handlers: Handlers = {
|
46
|
+
[Command.Send]: async (
|
47
|
+
params: ParamsByAction[Command.Send]
|
48
|
+
): Promise<void> => {
|
49
|
+
await this._sendMessage(params.payload, params.callback);
|
50
|
+
},
|
51
|
+
[Command.Receive]: async (
|
52
|
+
params: ParamsByAction[Command.Receive]
|
53
|
+
): Promise<void> => {
|
54
|
+
this._receiveMessage(params.message);
|
55
|
+
},
|
56
|
+
[Command.SendEphemeral]: async (
|
57
|
+
params: ParamsByAction[Command.SendEphemeral]
|
58
|
+
): Promise<void> => {
|
59
|
+
await this._sendEphemeralMessage(params.payload, params.callback);
|
60
|
+
}
|
61
|
+
};
|
29
62
|
|
30
63
|
public constructor(
|
31
64
|
channelId: ChannelId,
|
32
|
-
|
33
|
-
private receivedMessageTimeoutEnabled: boolean = false,
|
34
|
-
private receivedMessageTimeout: number = DEFAULT_RECEIVED_MESSAGE_TIMEOUT
|
65
|
+
options: MessageChannelOptions = {}
|
35
66
|
) {
|
67
|
+
super();
|
36
68
|
this.channelId = channelId;
|
37
69
|
this.lamportTimestamp = 0;
|
38
70
|
this.filter = new DefaultBloomFilter(DEFAULT_BLOOM_FILTER_OPTIONS);
|
39
71
|
this.outgoingBuffer = [];
|
40
72
|
this.acknowledgements = new Map();
|
41
73
|
this.incomingBuffer = [];
|
42
|
-
this.
|
43
|
-
this.causalHistorySize =
|
74
|
+
this.localHistory = [];
|
75
|
+
this.causalHistorySize =
|
76
|
+
options.causalHistorySize ?? DEFAULT_CAUSAL_HISTORY_SIZE;
|
44
77
|
this.acknowledgementCount = this.getAcknowledgementCount();
|
45
78
|
this.timeReceived = new Map();
|
79
|
+
this.receivedMessageTimeoutEnabled =
|
80
|
+
options.receivedMessageTimeoutEnabled ?? false;
|
81
|
+
this.receivedMessageTimeout =
|
82
|
+
options.receivedMessageTimeout ?? DEFAULT_RECEIVED_MESSAGE_TIMEOUT;
|
83
|
+
}
|
84
|
+
|
85
|
+
// Periodically called by the library consumer to process async operations
|
86
|
+
// in a sequential manner.
|
87
|
+
public async processTasks(): Promise<void> {
|
88
|
+
while (this.tasks.length > 0) {
|
89
|
+
const item = this.tasks.shift();
|
90
|
+
if (!item) {
|
91
|
+
continue;
|
92
|
+
}
|
93
|
+
|
94
|
+
// Use a generic helper function to ensure type safety
|
95
|
+
await this.executeTask(item);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
private async executeTask<A extends Command>(item: Task<A>): Promise<void> {
|
100
|
+
const handler = this.handlers[item.command];
|
101
|
+
await handler(item.params as ParamsByAction[A]);
|
46
102
|
}
|
47
103
|
|
48
104
|
public static getMessageId(payload: Uint8Array): string {
|
@@ -67,7 +123,26 @@ export class MessageChannel {
|
|
67
123
|
*/
|
68
124
|
public async sendMessage(
|
69
125
|
payload: Uint8Array,
|
70
|
-
callback?: (message: Message) => Promise<
|
126
|
+
callback?: (message: Message) => Promise<{
|
127
|
+
success: boolean;
|
128
|
+
retrievalHint?: Uint8Array;
|
129
|
+
}>
|
130
|
+
): Promise<void> {
|
131
|
+
this.tasks.push({
|
132
|
+
command: Command.Send,
|
133
|
+
params: {
|
134
|
+
payload,
|
135
|
+
callback
|
136
|
+
}
|
137
|
+
});
|
138
|
+
}
|
139
|
+
|
140
|
+
public async _sendMessage(
|
141
|
+
payload: Uint8Array,
|
142
|
+
callback?: (message: Message) => Promise<{
|
143
|
+
success: boolean;
|
144
|
+
retrievalHint?: Uint8Array;
|
145
|
+
}>
|
71
146
|
): Promise<void> {
|
72
147
|
this.lamportTimestamp++;
|
73
148
|
|
@@ -77,9 +152,9 @@ export class MessageChannel {
|
|
77
152
|
messageId,
|
78
153
|
channelId: this.channelId,
|
79
154
|
lamportTimestamp: this.lamportTimestamp,
|
80
|
-
causalHistory: this.
|
155
|
+
causalHistory: this.localHistory
|
81
156
|
.slice(-this.causalHistorySize)
|
82
|
-
.map(({
|
157
|
+
.map(({ historyEntry }) => historyEntry),
|
83
158
|
bloomFilter: this.filter.toBytes(),
|
84
159
|
content: payload
|
85
160
|
};
|
@@ -87,14 +162,68 @@ export class MessageChannel {
|
|
87
162
|
this.outgoingBuffer.push(message);
|
88
163
|
|
89
164
|
if (callback) {
|
90
|
-
const success = await callback(message);
|
165
|
+
const { success, retrievalHint } = await callback(message);
|
91
166
|
if (success) {
|
92
167
|
this.filter.insert(messageId);
|
93
|
-
this.
|
168
|
+
this.localHistory.push({
|
169
|
+
timestamp: this.lamportTimestamp,
|
170
|
+
historyEntry: {
|
171
|
+
messageId,
|
172
|
+
retrievalHint
|
173
|
+
}
|
174
|
+
});
|
175
|
+
this.timeReceived.set(messageId, Date.now());
|
176
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageSent, {
|
177
|
+
detail: message
|
178
|
+
});
|
94
179
|
}
|
95
180
|
}
|
96
181
|
}
|
97
182
|
|
183
|
+
/**
|
184
|
+
* Sends a short-lived message without synchronization or reliability requirements.
|
185
|
+
*
|
186
|
+
* Sends a message without a timestamp, causal history, or bloom filter.
|
187
|
+
* Ephemeral messages are not added to the outgoing buffer.
|
188
|
+
* Upon reception, ephemeral messages are delivered immediately without
|
189
|
+
* checking for causal dependencies or including in the local log.
|
190
|
+
*
|
191
|
+
* See https://rfc.vac.dev/vac/raw/sds/#ephemeral-messages
|
192
|
+
*
|
193
|
+
* @param payload - The payload to send.
|
194
|
+
* @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
|
195
|
+
*/
|
196
|
+
public async sendEphemeralMessage(
|
197
|
+
payload: Uint8Array,
|
198
|
+
callback?: (message: Message) => Promise<boolean>
|
199
|
+
): Promise<void> {
|
200
|
+
this.tasks.push({
|
201
|
+
command: Command.SendEphemeral,
|
202
|
+
params: {
|
203
|
+
payload,
|
204
|
+
callback
|
205
|
+
}
|
206
|
+
});
|
207
|
+
}
|
208
|
+
|
209
|
+
public async _sendEphemeralMessage(
|
210
|
+
payload: Uint8Array,
|
211
|
+
callback?: (message: Message) => Promise<boolean>
|
212
|
+
): Promise<void> {
|
213
|
+
const message: Message = {
|
214
|
+
messageId: MessageChannel.getMessageId(payload),
|
215
|
+
channelId: this.channelId,
|
216
|
+
content: payload,
|
217
|
+
lamportTimestamp: undefined,
|
218
|
+
causalHistory: [],
|
219
|
+
bloomFilter: undefined
|
220
|
+
};
|
221
|
+
|
222
|
+
if (callback) {
|
223
|
+
await callback(message);
|
224
|
+
}
|
225
|
+
}
|
226
|
+
|
98
227
|
/**
|
99
228
|
* Process a received SDS message for this channel.
|
100
229
|
*
|
@@ -109,7 +238,40 @@ export class MessageChannel {
|
|
109
238
|
*
|
110
239
|
* @param message - The received SDS message.
|
111
240
|
*/
|
241
|
+
|
112
242
|
public receiveMessage(message: Message): void {
|
243
|
+
this.tasks.push({
|
244
|
+
command: Command.Receive,
|
245
|
+
params: {
|
246
|
+
message
|
247
|
+
}
|
248
|
+
});
|
249
|
+
}
|
250
|
+
|
251
|
+
public _receiveMessage(message: Message): void {
|
252
|
+
if (
|
253
|
+
message.content &&
|
254
|
+
message.content.length > 0 &&
|
255
|
+
this.timeReceived.has(message.messageId)
|
256
|
+
) {
|
257
|
+
// Received a duplicate message
|
258
|
+
return;
|
259
|
+
}
|
260
|
+
|
261
|
+
if (!message.lamportTimestamp) {
|
262
|
+
// Messages with no timestamp are ephemeral messages and should be delivered immediately
|
263
|
+
this.deliverMessage(message);
|
264
|
+
return;
|
265
|
+
}
|
266
|
+
if (message.content?.length === 0) {
|
267
|
+
this.safeDispatchEvent(MessageChannelEvent.SyncReceived, {
|
268
|
+
detail: message
|
269
|
+
});
|
270
|
+
} else {
|
271
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageReceived, {
|
272
|
+
detail: message
|
273
|
+
});
|
274
|
+
}
|
113
275
|
// review ack status
|
114
276
|
this.reviewAckStatus(message);
|
115
277
|
// add to bloom filter (skip for messages with empty content)
|
@@ -117,9 +279,10 @@ export class MessageChannel {
|
|
117
279
|
this.filter.insert(message.messageId);
|
118
280
|
}
|
119
281
|
// verify causal history
|
120
|
-
const dependenciesMet = message.causalHistory.every((
|
121
|
-
this.
|
122
|
-
({
|
282
|
+
const dependenciesMet = message.causalHistory.every((historyEntry) =>
|
283
|
+
this.localHistory.some(
|
284
|
+
({ historyEntry: { messageId } }) =>
|
285
|
+
messageId === historyEntry.messageId
|
123
286
|
)
|
124
287
|
);
|
125
288
|
if (!dependenciesMet) {
|
@@ -127,27 +290,42 @@ export class MessageChannel {
|
|
127
290
|
this.timeReceived.set(message.messageId, Date.now());
|
128
291
|
} else {
|
129
292
|
this.deliverMessage(message);
|
293
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageDelivered, {
|
294
|
+
detail: {
|
295
|
+
messageId: message.messageId,
|
296
|
+
sentOrReceived: "received"
|
297
|
+
}
|
298
|
+
});
|
130
299
|
}
|
131
300
|
}
|
132
301
|
|
133
302
|
// https://rfc.vac.dev/vac/raw/sds/#periodic-incoming-buffer-sweep
|
134
|
-
|
303
|
+
// Note that even though this function has side effects, it is not async
|
304
|
+
// and does not need to be called through the queue.
|
305
|
+
public sweepIncomingBuffer(): HistoryEntry[] {
|
135
306
|
const { buffer, missing } = this.incomingBuffer.reduce<{
|
136
307
|
buffer: Message[];
|
137
|
-
missing:
|
308
|
+
missing: Set<HistoryEntry>;
|
138
309
|
}>(
|
139
310
|
({ buffer, missing }, message) => {
|
140
311
|
// Check each message for missing dependencies
|
141
312
|
const missingDependencies = message.causalHistory.filter(
|
142
|
-
(
|
143
|
-
!this.
|
144
|
-
({
|
313
|
+
(messageHistoryEntry) =>
|
314
|
+
!this.localHistory.some(
|
315
|
+
({ historyEntry: { messageId } }) =>
|
316
|
+
messageId === messageHistoryEntry.messageId
|
145
317
|
)
|
146
318
|
);
|
147
319
|
if (missingDependencies.length === 0) {
|
148
320
|
// Any message with no missing dependencies is delivered
|
149
321
|
// and removed from the buffer (implicitly by not adding it to the new incoming buffer)
|
150
322
|
this.deliverMessage(message);
|
323
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageDelivered, {
|
324
|
+
detail: {
|
325
|
+
messageId: message.messageId,
|
326
|
+
sentOrReceived: "received"
|
327
|
+
}
|
328
|
+
});
|
151
329
|
return { buffer, missing };
|
152
330
|
}
|
153
331
|
|
@@ -164,16 +342,24 @@ export class MessageChannel {
|
|
164
342
|
}
|
165
343
|
// Any message with missing dependencies stays in the buffer
|
166
344
|
// and the missing message IDs are returned for processing.
|
345
|
+
missingDependencies.forEach((dependency) => {
|
346
|
+
missing.add(dependency);
|
347
|
+
});
|
167
348
|
return {
|
168
349
|
buffer: buffer.concat(message),
|
169
|
-
missing
|
350
|
+
missing
|
170
351
|
};
|
171
352
|
},
|
172
|
-
{ buffer: new Array<Message>(), missing: new
|
353
|
+
{ buffer: new Array<Message>(), missing: new Set<HistoryEntry>() }
|
173
354
|
);
|
174
355
|
// Update the incoming buffer to only include messages with no missing dependencies
|
175
356
|
this.incomingBuffer = buffer;
|
176
|
-
|
357
|
+
|
358
|
+
this.safeDispatchEvent(MessageChannelEvent.MissedMessages, {
|
359
|
+
detail: Array.from(missing)
|
360
|
+
});
|
361
|
+
|
362
|
+
return Array.from(missing);
|
177
363
|
}
|
178
364
|
|
179
365
|
// https://rfc.vac.dev/vac/raw/sds/#periodic-outgoing-buffer-sweep
|
@@ -215,7 +401,7 @@ export class MessageChannel {
|
|
215
401
|
*
|
216
402
|
* @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
|
217
403
|
*/
|
218
|
-
public sendSyncMessage(
|
404
|
+
public async sendSyncMessage(
|
219
405
|
callback?: (message: Message) => Promise<boolean>
|
220
406
|
): Promise<boolean> {
|
221
407
|
this.lamportTimestamp++;
|
@@ -226,28 +412,36 @@ export class MessageChannel {
|
|
226
412
|
messageId: MessageChannel.getMessageId(emptyMessage),
|
227
413
|
channelId: this.channelId,
|
228
414
|
lamportTimestamp: this.lamportTimestamp,
|
229
|
-
causalHistory: this.
|
415
|
+
causalHistory: this.localHistory
|
230
416
|
.slice(-this.causalHistorySize)
|
231
|
-
.map(({
|
417
|
+
.map(({ historyEntry }) => historyEntry),
|
232
418
|
bloomFilter: this.filter.toBytes(),
|
233
419
|
content: emptyMessage
|
234
420
|
};
|
235
421
|
|
236
422
|
if (callback) {
|
237
|
-
|
423
|
+
await callback(message);
|
424
|
+
this.safeDispatchEvent(MessageChannelEvent.SyncSent, {
|
425
|
+
detail: message
|
426
|
+
});
|
427
|
+
return true;
|
238
428
|
}
|
239
|
-
return
|
429
|
+
return false;
|
240
430
|
}
|
241
431
|
|
242
432
|
// See https://rfc.vac.dev/vac/raw/sds/#deliver-message
|
243
|
-
private deliverMessage(message: Message): void {
|
433
|
+
private deliverMessage(message: Message, retrievalHint?: Uint8Array): void {
|
244
434
|
const messageLamportTimestamp = message.lamportTimestamp ?? 0;
|
245
435
|
if (messageLamportTimestamp > this.lamportTimestamp) {
|
246
436
|
this.lamportTimestamp = messageLamportTimestamp;
|
247
437
|
}
|
248
438
|
|
249
|
-
if (
|
439
|
+
if (
|
440
|
+
message.content?.length === 0 ||
|
441
|
+
message.lamportTimestamp === undefined
|
442
|
+
) {
|
250
443
|
// Messages with empty content are sync messages.
|
444
|
+
// Messages with no timestamp are ephemeral messages.
|
251
445
|
// They are not added to the local log or bloom filter.
|
252
446
|
return;
|
253
447
|
}
|
@@ -257,15 +451,18 @@ export class MessageChannel {
|
|
257
451
|
// If one or more message IDs with the same Lamport timestamp already exists,
|
258
452
|
// the participant MUST follow the Resolve Conflicts procedure.
|
259
453
|
// https://rfc.vac.dev/vac/raw/sds/#resolve-conflicts
|
260
|
-
this.
|
454
|
+
this.localHistory.push({
|
261
455
|
timestamp: messageLamportTimestamp,
|
262
|
-
|
456
|
+
historyEntry: {
|
457
|
+
messageId: message.messageId,
|
458
|
+
retrievalHint
|
459
|
+
}
|
263
460
|
});
|
264
|
-
this.
|
461
|
+
this.localHistory.sort((a, b) => {
|
265
462
|
if (a.timestamp !== b.timestamp) {
|
266
463
|
return a.timestamp - b.timestamp;
|
267
464
|
}
|
268
|
-
return a.messageId.localeCompare(b.messageId);
|
465
|
+
return a.historyEntry.messageId.localeCompare(b.historyEntry.messageId);
|
269
466
|
});
|
270
467
|
}
|
271
468
|
|
@@ -274,9 +471,17 @@ export class MessageChannel {
|
|
274
471
|
// See https://rfc.vac.dev/vac/raw/sds/#review-ack-status
|
275
472
|
private reviewAckStatus(receivedMessage: Message): void {
|
276
473
|
// the participant MUST mark all messages in the received causal_history as acknowledged.
|
277
|
-
receivedMessage.causalHistory.forEach((messageId) => {
|
474
|
+
receivedMessage.causalHistory.forEach(({ messageId }) => {
|
278
475
|
this.outgoingBuffer = this.outgoingBuffer.filter(
|
279
|
-
(
|
476
|
+
({ messageId: outgoingMessageId }) => {
|
477
|
+
if (outgoingMessageId !== messageId) {
|
478
|
+
return true;
|
479
|
+
}
|
480
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageAcknowledged, {
|
481
|
+
detail: messageId
|
482
|
+
});
|
483
|
+
return false;
|
484
|
+
}
|
280
485
|
);
|
281
486
|
this.acknowledgements.delete(messageId);
|
282
487
|
if (!this.filter.lookup(messageId)) {
|
@@ -301,6 +506,12 @@ export class MessageChannel {
|
|
301
506
|
const count = (this.acknowledgements.get(message.messageId) ?? 0) + 1;
|
302
507
|
if (count < this.acknowledgementCount) {
|
303
508
|
this.acknowledgements.set(message.messageId, count);
|
509
|
+
this.safeDispatchEvent(MessageChannelEvent.PartialAcknowledgement, {
|
510
|
+
detail: {
|
511
|
+
messageId: message.messageId,
|
512
|
+
count
|
513
|
+
}
|
514
|
+
});
|
304
515
|
return true;
|
305
516
|
}
|
306
517
|
this.acknowledgements.delete(message.messageId);
|
package/dist/bloom.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"bloom.js","sourceRoot":"","sources":["../src/bloom.ts"],"names":[],"mappings":"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"}
|
package/dist/sds.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"sds.js","sourceRoot":"","sources":["../src/sds.ts"],"names":[],"mappings":"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"}
|
File without changes
|