@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.
@@ -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 "./bloom.js";
5
+ import { DefaultBloomFilter } from "../bloom_filter/bloom.js";
6
6
 
7
- export type Message = proto_sds_message.SdsMessage;
8
- export type ChannelId = string;
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
- export class MessageChannel {
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 messageIdLog: { timestamp: number; messageId: string }[];
25
- private channelId: ChannelId;
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
- causalHistorySize: number = DEFAULT_CAUSAL_HISTORY_SIZE,
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.messageIdLog = [];
43
- this.causalHistorySize = 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<boolean>
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.messageIdLog
155
+ causalHistory: this.localHistory
81
156
  .slice(-this.causalHistorySize)
82
- .map(({ messageId }) => messageId),
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.messageIdLog.push({ timestamp: this.lamportTimestamp, messageId });
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((messageId) =>
121
- this.messageIdLog.some(
122
- ({ messageId: logMessageId }) => logMessageId === messageId
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
- public sweepIncomingBuffer(): string[] {
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: string[];
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
- (messageId) =>
143
- !this.messageIdLog.some(
144
- ({ messageId: logMessageId }) => logMessageId === messageId
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: missing.concat(missingDependencies)
350
+ missing
170
351
  };
171
352
  },
172
- { buffer: new Array<Message>(), missing: new Array<string>() }
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
- return missing;
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.messageIdLog
415
+ causalHistory: this.localHistory
230
416
  .slice(-this.causalHistorySize)
231
- .map(({ messageId }) => messageId),
417
+ .map(({ historyEntry }) => historyEntry),
232
418
  bloomFilter: this.filter.toBytes(),
233
419
  content: emptyMessage
234
420
  };
235
421
 
236
422
  if (callback) {
237
- return callback(message);
423
+ await callback(message);
424
+ this.safeDispatchEvent(MessageChannelEvent.SyncSent, {
425
+ detail: message
426
+ });
427
+ return true;
238
428
  }
239
- return Promise.resolve(false);
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 (message.content?.length === 0) {
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.messageIdLog.push({
454
+ this.localHistory.push({
261
455
  timestamp: messageLamportTimestamp,
262
- messageId: message.messageId
456
+ historyEntry: {
457
+ messageId: message.messageId,
458
+ retrievalHint
459
+ }
263
460
  });
264
- this.messageIdLog.sort((a, b) => {
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
- (msg) => msg.messageId !== messageId
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