@waku/sds 0.0.4-b0a2e39.0 → 0.0.4-b133417.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/bundle/index.js +1 -6716
- package/dist/.tsbuildinfo +1 -1
- package/dist/{bloom_filter/bloom.js → bloom.js} +2 -2
- package/dist/bloom.js.map +1 -0
- package/dist/index.d.ts +1 -3
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/sds.d.ts +108 -0
- package/dist/{message_channel/message_channel.js → sds.js} +111 -265
- package/dist/sds.js.map +1 -0
- package/package.json +1 -1
- package/src/{bloom_filter/bloom.ts → bloom.ts} +2 -2
- package/src/index.ts +1 -15
- package/src/{message_channel/message_channel.ts → sds.ts} +134 -311
- package/dist/bloom_filter/bloom.js.map +0 -1
- package/dist/message_channel/command_queue.d.ts +0 -29
- package/dist/message_channel/command_queue.js +0 -7
- package/dist/message_channel/command_queue.js.map +0 -1
- package/dist/message_channel/events.d.ts +0 -32
- package/dist/message_channel/events.js +0 -19
- package/dist/message_channel/events.js.map +0 -1
- package/dist/message_channel/index.d.ts +0 -3
- package/dist/message_channel/index.js +0 -4
- package/dist/message_channel/index.js.map +0 -1
- package/dist/message_channel/message_channel.d.ts +0 -142
- package/dist/message_channel/message_channel.js.map +0 -1
- package/src/message_channel/command_queue.ts +0 -33
- package/src/message_channel/events.ts +0 -41
- package/src/message_channel/index.ts +0 -3
- /package/dist/{bloom_filter/bloom.d.ts → bloom.d.ts} +0 -0
@@ -1,42 +1,31 @@
|
|
1
1
|
import { TypedEventEmitter } from "@libp2p/interface";
|
2
2
|
import { sha256 } from "@noble/hashes/sha256";
|
3
3
|
import { bytesToHex } from "@noble/hashes/utils";
|
4
|
-
import {
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
import { DefaultBloomFilter } from "./bloom.js";
|
5
|
+
export var MessageChannelEvent;
|
6
|
+
(function (MessageChannelEvent) {
|
7
|
+
MessageChannelEvent["MessageDelivered"] = "messageDelivered";
|
8
|
+
})(MessageChannelEvent || (MessageChannelEvent = {}));
|
8
9
|
export const DEFAULT_BLOOM_FILTER_OPTIONS = {
|
9
10
|
capacity: 10000,
|
10
11
|
errorRate: 0.001
|
11
12
|
};
|
12
13
|
const DEFAULT_CAUSAL_HISTORY_SIZE = 2;
|
13
14
|
const DEFAULT_RECEIVED_MESSAGE_TIMEOUT = 1000 * 60 * 5; // 5 minutes
|
14
|
-
const log = new Logger("sds:message-channel");
|
15
15
|
export class MessageChannel extends TypedEventEmitter {
|
16
|
-
channelId;
|
17
16
|
lamportTimestamp;
|
18
17
|
filter;
|
19
18
|
outgoingBuffer;
|
20
19
|
acknowledgements;
|
21
20
|
incomingBuffer;
|
22
21
|
localHistory;
|
22
|
+
channelId;
|
23
23
|
causalHistorySize;
|
24
24
|
acknowledgementCount;
|
25
25
|
timeReceived;
|
26
26
|
receivedMessageTimeoutEnabled;
|
27
27
|
receivedMessageTimeout;
|
28
|
-
|
29
|
-
handlers = {
|
30
|
-
[Command.Send]: async (params) => {
|
31
|
-
await this._sendMessage(params.payload, params.callback);
|
32
|
-
},
|
33
|
-
[Command.Receive]: async (params) => {
|
34
|
-
this._receiveMessage(params.message);
|
35
|
-
},
|
36
|
-
[Command.SendEphemeral]: async (params) => {
|
37
|
-
await this._sendEphemeralMessage(params.payload, params.callback);
|
38
|
-
}
|
39
|
-
};
|
28
|
+
deliveredMessageCallback;
|
40
29
|
constructor(channelId, options = {}) {
|
41
30
|
super();
|
42
31
|
this.channelId = channelId;
|
@@ -54,71 +43,54 @@ export class MessageChannel extends TypedEventEmitter {
|
|
54
43
|
options.receivedMessageTimeoutEnabled ?? false;
|
55
44
|
this.receivedMessageTimeout =
|
56
45
|
options.receivedMessageTimeout ?? DEFAULT_RECEIVED_MESSAGE_TIMEOUT;
|
46
|
+
this.deliveredMessageCallback = options.deliveredMessageCallback;
|
57
47
|
}
|
58
48
|
static getMessageId(payload) {
|
59
49
|
return bytesToHex(sha256(payload));
|
60
50
|
}
|
61
51
|
/**
|
62
|
-
*
|
63
|
-
*
|
64
|
-
* This method should be called periodically by the library consumer to execute
|
65
|
-
* queued send/receive operations in the correct sequence.
|
66
|
-
*
|
67
|
-
* @example
|
68
|
-
* ```typescript
|
69
|
-
* const channel = new MessageChannel("my-channel");
|
52
|
+
* Send a message to the SDS channel.
|
70
53
|
*
|
71
|
-
*
|
72
|
-
*
|
73
|
-
* channel.receiveMessage(incomingMessage);
|
74
|
-
*
|
75
|
-
* // Process all queued operations
|
76
|
-
* await channel.processTasks();
|
77
|
-
* ```
|
78
|
-
*
|
79
|
-
* @throws Will emit a 'taskError' event if any task fails, but continues processing remaining tasks
|
80
|
-
*/
|
81
|
-
async processTasks() {
|
82
|
-
while (this.tasks.length > 0) {
|
83
|
-
const item = this.tasks.shift();
|
84
|
-
if (!item) {
|
85
|
-
continue;
|
86
|
-
}
|
87
|
-
await this.executeTask(item);
|
88
|
-
}
|
89
|
-
}
|
90
|
-
/**
|
91
|
-
* Queues a message to be sent on this channel.
|
92
|
-
*
|
93
|
-
* The message will be processed sequentially when processTasks() is called.
|
94
|
-
* This ensures proper lamport timestamp ordering and causal history tracking.
|
95
|
-
*
|
96
|
-
* @param payload - The message content as a byte array
|
97
|
-
* @param callback - Optional callback function called after the message is processed
|
98
|
-
* @returns Promise that resolves when the message is queued (not sent)
|
54
|
+
* Increments the lamport timestamp, constructs a `Message` object
|
55
|
+
* with the given payload, and adds it to the outgoing buffer.
|
99
56
|
*
|
100
|
-
*
|
101
|
-
*
|
102
|
-
*
|
103
|
-
*
|
57
|
+
* If the callback is successful, the message is also added to
|
58
|
+
* the bloom filter and message history. In the context of
|
59
|
+
* Waku, this likely means the message was published via
|
60
|
+
* light push or relay.
|
104
61
|
*
|
105
|
-
*
|
106
|
-
* console.log("Message processed:", processedMessage.messageId);
|
107
|
-
* return { success: true };
|
108
|
-
* });
|
62
|
+
* See https://rfc.vac.dev/vac/raw/sds/#send-message
|
109
63
|
*
|
110
|
-
*
|
111
|
-
*
|
112
|
-
* ```
|
64
|
+
* @param payload - The payload to send.
|
65
|
+
* @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
|
113
66
|
*/
|
114
67
|
async sendMessage(payload, callback) {
|
115
|
-
this.
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
68
|
+
this.lamportTimestamp++;
|
69
|
+
const messageId = MessageChannel.getMessageId(payload);
|
70
|
+
const message = {
|
71
|
+
messageId,
|
72
|
+
channelId: this.channelId,
|
73
|
+
lamportTimestamp: this.lamportTimestamp,
|
74
|
+
causalHistory: this.localHistory
|
75
|
+
.slice(-this.causalHistorySize)
|
76
|
+
.map(({ historyEntry }) => historyEntry),
|
77
|
+
bloomFilter: this.filter.toBytes(),
|
78
|
+
content: payload
|
79
|
+
};
|
80
|
+
this.outgoingBuffer.push(message);
|
81
|
+
if (callback) {
|
82
|
+
const { success, retrievalHint } = await callback(message);
|
83
|
+
if (success) {
|
84
|
+
this.filter.insert(messageId);
|
85
|
+
this.localHistory.push({
|
86
|
+
timestamp: this.lamportTimestamp,
|
87
|
+
historyEntry: {
|
88
|
+
messageId,
|
89
|
+
retrievalHint
|
90
|
+
}
|
91
|
+
});
|
120
92
|
}
|
121
|
-
}
|
93
|
+
}
|
122
94
|
}
|
123
95
|
/**
|
124
96
|
* Sends a short-lived message without synchronization or reliability requirements.
|
@@ -133,58 +105,64 @@ export class MessageChannel extends TypedEventEmitter {
|
|
133
105
|
* @param payload - The payload to send.
|
134
106
|
* @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
|
135
107
|
*/
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
108
|
+
sendEphemeralMessage(payload, callback) {
|
109
|
+
const message = {
|
110
|
+
messageId: MessageChannel.getMessageId(payload),
|
111
|
+
channelId: this.channelId,
|
112
|
+
content: payload,
|
113
|
+
lamportTimestamp: undefined,
|
114
|
+
causalHistory: [],
|
115
|
+
bloomFilter: undefined
|
116
|
+
};
|
117
|
+
if (callback) {
|
118
|
+
callback(message);
|
119
|
+
}
|
144
120
|
}
|
145
121
|
/**
|
146
|
-
*
|
147
|
-
*
|
148
|
-
* The message will be processed when processTasks() is called, ensuring
|
149
|
-
* proper dependency resolution and causal ordering.
|
122
|
+
* Process a received SDS message for this channel.
|
150
123
|
*
|
151
|
-
*
|
124
|
+
* Review the acknowledgement status of messages in the outgoing buffer
|
125
|
+
* by inspecting the received message's bloom filter and causal history.
|
126
|
+
* Add the received message to the bloom filter.
|
127
|
+
* If the local history contains every message in the received message's
|
128
|
+
* causal history, deliver the message. Otherwise, add the message to the
|
129
|
+
* incoming buffer.
|
152
130
|
*
|
153
|
-
*
|
154
|
-
* ```typescript
|
155
|
-
* const channel = new MessageChannel("chat-room");
|
131
|
+
* See https://rfc.vac.dev/vac/raw/sds/#receive-message
|
156
132
|
*
|
157
|
-
*
|
158
|
-
* channel.receiveMessage(incomingMessage);
|
159
|
-
*
|
160
|
-
* // Process the received message
|
161
|
-
* await channel.processTasks();
|
162
|
-
* ```
|
133
|
+
* @param message - The received SDS message.
|
163
134
|
*/
|
164
135
|
receiveMessage(message) {
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
136
|
+
if (!message.lamportTimestamp) {
|
137
|
+
// Messages with no timestamp are ephemeral messages and should be delivered immediately
|
138
|
+
this.deliverMessage(message);
|
139
|
+
return;
|
140
|
+
}
|
141
|
+
// review ack status
|
142
|
+
this.reviewAckStatus(message);
|
143
|
+
// add to bloom filter (skip for messages with empty content)
|
144
|
+
if (message.content?.length && message.content.length > 0) {
|
145
|
+
this.filter.insert(message.messageId);
|
146
|
+
}
|
147
|
+
// verify causal history
|
148
|
+
const dependenciesMet = message.causalHistory.every((historyEntry) => this.localHistory.some(({ historyEntry: { messageId } }) => messageId === historyEntry.messageId));
|
149
|
+
if (!dependenciesMet) {
|
150
|
+
this.incomingBuffer.push(message);
|
151
|
+
this.timeReceived.set(message.messageId, Date.now());
|
152
|
+
}
|
153
|
+
else {
|
154
|
+
this.deliverMessage(message);
|
155
|
+
}
|
171
156
|
}
|
172
|
-
|
173
|
-
* Processes messages in the incoming buffer, delivering those with satisfied dependencies.
|
174
|
-
*
|
175
|
-
* @returns Array of history entries for messages still missing dependencies
|
176
|
-
*/
|
157
|
+
// https://rfc.vac.dev/vac/raw/sds/#periodic-incoming-buffer-sweep
|
177
158
|
sweepIncomingBuffer() {
|
178
159
|
const { buffer, missing } = this.incomingBuffer.reduce(({ buffer, missing }, message) => {
|
160
|
+
// Check each message for missing dependencies
|
179
161
|
const missingDependencies = message.causalHistory.filter((messageHistoryEntry) => !this.localHistory.some(({ historyEntry: { messageId } }) => messageId === messageHistoryEntry.messageId));
|
180
162
|
if (missingDependencies.length === 0) {
|
163
|
+
// Any message with no missing dependencies is delivered
|
164
|
+
// and removed from the buffer (implicitly by not adding it to the new incoming buffer)
|
181
165
|
this.deliverMessage(message);
|
182
|
-
this.safeSendEvent(MessageChannelEvent.MessageDelivered, {
|
183
|
-
detail: {
|
184
|
-
messageId: message.messageId,
|
185
|
-
sentOrReceived: "received"
|
186
|
-
}
|
187
|
-
});
|
188
166
|
return { buffer, missing };
|
189
167
|
}
|
190
168
|
// Optionally, if a message has not been received after a predetermined amount of time,
|
@@ -196,22 +174,20 @@ export class MessageChannel extends TypedEventEmitter {
|
|
196
174
|
return { buffer, missing };
|
197
175
|
}
|
198
176
|
}
|
199
|
-
|
200
|
-
|
201
|
-
});
|
177
|
+
// Any message with missing dependencies stays in the buffer
|
178
|
+
// and the missing message IDs are returned for processing.
|
202
179
|
return {
|
203
180
|
buffer: buffer.concat(message),
|
204
|
-
missing
|
181
|
+
missing: missing.concat(missingDependencies)
|
205
182
|
};
|
206
|
-
}, { buffer: new Array(), missing: new
|
183
|
+
}, { buffer: new Array(), missing: new Array() });
|
184
|
+
// Update the incoming buffer to only include messages with no missing dependencies
|
207
185
|
this.incomingBuffer = buffer;
|
208
|
-
|
209
|
-
detail: Array.from(missing)
|
210
|
-
});
|
211
|
-
return Array.from(missing);
|
186
|
+
return missing;
|
212
187
|
}
|
213
188
|
// https://rfc.vac.dev/vac/raw/sds/#periodic-outgoing-buffer-sweep
|
214
189
|
sweepOutgoingBuffer() {
|
190
|
+
// Partition all messages in the outgoing buffer into unacknowledged and possibly acknowledged messages
|
215
191
|
return this.outgoingBuffer.reduce(({ unacknowledged, possiblyAcknowledged }, message) => {
|
216
192
|
if (this.acknowledgements.has(message.messageId)) {
|
217
193
|
return {
|
@@ -238,7 +214,7 @@ export class MessageChannel extends TypedEventEmitter {
|
|
238
214
|
*
|
239
215
|
* @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
|
240
216
|
*/
|
241
|
-
|
217
|
+
sendSyncMessage(callback) {
|
242
218
|
this.lamportTimestamp++;
|
243
219
|
const emptyMessage = new Uint8Array();
|
244
220
|
const message = {
|
@@ -252,139 +228,13 @@ export class MessageChannel extends TypedEventEmitter {
|
|
252
228
|
content: emptyMessage
|
253
229
|
};
|
254
230
|
if (callback) {
|
255
|
-
|
256
|
-
await callback(message);
|
257
|
-
this.safeSendEvent(MessageChannelEvent.SyncSent, {
|
258
|
-
detail: message
|
259
|
-
});
|
260
|
-
return true;
|
261
|
-
}
|
262
|
-
catch (error) {
|
263
|
-
log.error("Callback execution failed in sendSyncMessage:", error);
|
264
|
-
throw error;
|
265
|
-
}
|
266
|
-
}
|
267
|
-
return false;
|
268
|
-
}
|
269
|
-
_receiveMessage(message) {
|
270
|
-
const isDuplicate = message.content &&
|
271
|
-
message.content.length > 0 &&
|
272
|
-
this.timeReceived.has(message.messageId);
|
273
|
-
if (isDuplicate) {
|
274
|
-
return;
|
275
|
-
}
|
276
|
-
if (!message.lamportTimestamp) {
|
277
|
-
this.deliverMessage(message);
|
278
|
-
return;
|
279
|
-
}
|
280
|
-
if (message.content?.length === 0) {
|
281
|
-
this.safeSendEvent(MessageChannelEvent.SyncReceived, {
|
282
|
-
detail: message
|
283
|
-
});
|
284
|
-
}
|
285
|
-
else {
|
286
|
-
this.safeSendEvent(MessageChannelEvent.MessageReceived, {
|
287
|
-
detail: message
|
288
|
-
});
|
289
|
-
}
|
290
|
-
this.reviewAckStatus(message);
|
291
|
-
if (message.content?.length && message.content.length > 0) {
|
292
|
-
this.filter.insert(message.messageId);
|
293
|
-
}
|
294
|
-
const dependenciesMet = message.causalHistory.every((historyEntry) => this.localHistory.some(({ historyEntry: { messageId } }) => messageId === historyEntry.messageId));
|
295
|
-
if (!dependenciesMet) {
|
296
|
-
this.incomingBuffer.push(message);
|
297
|
-
this.timeReceived.set(message.messageId, Date.now());
|
298
|
-
}
|
299
|
-
else {
|
300
|
-
this.deliverMessage(message);
|
301
|
-
this.safeSendEvent(MessageChannelEvent.MessageDelivered, {
|
302
|
-
detail: {
|
303
|
-
messageId: message.messageId,
|
304
|
-
sentOrReceived: "received"
|
305
|
-
}
|
306
|
-
});
|
307
|
-
}
|
308
|
-
}
|
309
|
-
async executeTask(item) {
|
310
|
-
try {
|
311
|
-
const handler = this.handlers[item.command];
|
312
|
-
await handler(item.params);
|
313
|
-
}
|
314
|
-
catch (error) {
|
315
|
-
log.error(`Task execution failed for command ${item.command}:`, error);
|
316
|
-
this.dispatchEvent(new CustomEvent("taskError", {
|
317
|
-
detail: { command: item.command, error, params: item.params }
|
318
|
-
}));
|
319
|
-
}
|
320
|
-
}
|
321
|
-
safeSendEvent(event, eventInit) {
|
322
|
-
try {
|
323
|
-
this.dispatchEvent(new CustomEvent(event, eventInit));
|
324
|
-
}
|
325
|
-
catch (error) {
|
326
|
-
log.error(`Failed to dispatch event ${event}:`, error);
|
327
|
-
}
|
328
|
-
}
|
329
|
-
async _sendMessage(payload, callback) {
|
330
|
-
this.lamportTimestamp++;
|
331
|
-
const messageId = MessageChannel.getMessageId(payload);
|
332
|
-
const message = {
|
333
|
-
messageId,
|
334
|
-
channelId: this.channelId,
|
335
|
-
lamportTimestamp: this.lamportTimestamp,
|
336
|
-
causalHistory: this.localHistory
|
337
|
-
.slice(-this.causalHistorySize)
|
338
|
-
.map(({ historyEntry }) => historyEntry),
|
339
|
-
bloomFilter: this.filter.toBytes(),
|
340
|
-
content: payload
|
341
|
-
};
|
342
|
-
this.outgoingBuffer.push(message);
|
343
|
-
if (callback) {
|
344
|
-
try {
|
345
|
-
const { success, retrievalHint } = await callback(message);
|
346
|
-
if (success) {
|
347
|
-
this.filter.insert(messageId);
|
348
|
-
this.localHistory.push({
|
349
|
-
timestamp: this.lamportTimestamp,
|
350
|
-
historyEntry: {
|
351
|
-
messageId,
|
352
|
-
retrievalHint
|
353
|
-
}
|
354
|
-
});
|
355
|
-
this.timeReceived.set(messageId, Date.now());
|
356
|
-
this.safeSendEvent(MessageChannelEvent.MessageSent, {
|
357
|
-
detail: message
|
358
|
-
});
|
359
|
-
}
|
360
|
-
}
|
361
|
-
catch (error) {
|
362
|
-
log.error("Callback execution failed in _sendMessage:", error);
|
363
|
-
throw error;
|
364
|
-
}
|
365
|
-
}
|
366
|
-
}
|
367
|
-
async _sendEphemeralMessage(payload, callback) {
|
368
|
-
const message = {
|
369
|
-
messageId: MessageChannel.getMessageId(payload),
|
370
|
-
channelId: this.channelId,
|
371
|
-
content: payload,
|
372
|
-
lamportTimestamp: undefined,
|
373
|
-
causalHistory: [],
|
374
|
-
bloomFilter: undefined
|
375
|
-
};
|
376
|
-
if (callback) {
|
377
|
-
try {
|
378
|
-
await callback(message);
|
379
|
-
}
|
380
|
-
catch (error) {
|
381
|
-
log.error("Callback execution failed in _sendEphemeralMessage:", error);
|
382
|
-
throw error;
|
383
|
-
}
|
231
|
+
return callback(message);
|
384
232
|
}
|
233
|
+
return Promise.resolve(false);
|
385
234
|
}
|
386
235
|
// See https://rfc.vac.dev/vac/raw/sds/#deliver-message
|
387
236
|
deliverMessage(message, retrievalHint) {
|
237
|
+
this.notifyDeliveredMessage(message.messageId);
|
388
238
|
const messageLamportTimestamp = message.lamportTimestamp ?? 0;
|
389
239
|
if (messageLamportTimestamp > this.lamportTimestamp) {
|
390
240
|
this.lamportTimestamp = messageLamportTimestamp;
|
@@ -419,21 +269,15 @@ export class MessageChannel extends TypedEventEmitter {
|
|
419
269
|
// to determine the acknowledgement status of messages in the outgoing buffer.
|
420
270
|
// See https://rfc.vac.dev/vac/raw/sds/#review-ack-status
|
421
271
|
reviewAckStatus(receivedMessage) {
|
272
|
+
// the participant MUST mark all messages in the received causal_history as acknowledged.
|
422
273
|
receivedMessage.causalHistory.forEach(({ messageId }) => {
|
423
|
-
this.outgoingBuffer = this.outgoingBuffer.filter(({ messageId: outgoingMessageId }) =>
|
424
|
-
if (outgoingMessageId !== messageId) {
|
425
|
-
return true;
|
426
|
-
}
|
427
|
-
this.safeSendEvent(MessageChannelEvent.MessageAcknowledged, {
|
428
|
-
detail: messageId
|
429
|
-
});
|
430
|
-
return false;
|
431
|
-
});
|
274
|
+
this.outgoingBuffer = this.outgoingBuffer.filter(({ messageId: outgoingMessageId }) => outgoingMessageId !== messageId);
|
432
275
|
this.acknowledgements.delete(messageId);
|
433
276
|
if (!this.filter.lookup(messageId)) {
|
434
277
|
this.filter.insert(messageId);
|
435
278
|
}
|
436
279
|
});
|
280
|
+
// the participant MUST mark all messages included in the bloom_filter as possibly acknowledged
|
437
281
|
if (!receivedMessage.bloomFilter) {
|
438
282
|
return;
|
439
283
|
}
|
@@ -448,12 +292,6 @@ export class MessageChannel extends TypedEventEmitter {
|
|
448
292
|
const count = (this.acknowledgements.get(message.messageId) ?? 0) + 1;
|
449
293
|
if (count < this.acknowledgementCount) {
|
450
294
|
this.acknowledgements.set(message.messageId, count);
|
451
|
-
this.safeSendEvent(MessageChannelEvent.PartialAcknowledgement, {
|
452
|
-
detail: {
|
453
|
-
messageId: message.messageId,
|
454
|
-
count
|
455
|
-
}
|
456
|
-
});
|
457
295
|
return true;
|
458
296
|
}
|
459
297
|
this.acknowledgements.delete(message.messageId);
|
@@ -464,5 +302,13 @@ export class MessageChannel extends TypedEventEmitter {
|
|
464
302
|
getAcknowledgementCount() {
|
465
303
|
return 2;
|
466
304
|
}
|
305
|
+
notifyDeliveredMessage(messageId) {
|
306
|
+
if (this.deliveredMessageCallback) {
|
307
|
+
this.deliveredMessageCallback(messageId);
|
308
|
+
}
|
309
|
+
this.dispatchEvent(new CustomEvent(MessageChannelEvent.MessageDelivered, {
|
310
|
+
detail: messageId
|
311
|
+
}));
|
312
|
+
}
|
467
313
|
}
|
468
|
-
//# sourceMappingURL=
|
314
|
+
//# sourceMappingURL=sds.js.map
|
package/dist/sds.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"sds.js","sourceRoot":"","sources":["../src/sds.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"name":"@waku/sds","version":"0.0.4-
|
1
|
+
{"name":"@waku/sds","version":"0.0.4-b133417.0","description":"Scalable Data Sync implementation for the browser. Based on https://github.com/vacp2p/rfc-index/blob/main/vac/raw/sds.md","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"typesVersions":{"*":{"*":["*","dist/*","dist/*/index"]}},"type":"module","author":"Waku Team","homepage":"https://github.com/waku-org/js-waku/tree/master/packages/scalable-data-sync#readme","repository":{"type":"git","url":"https://github.com/waku-org/js-waku.git"},"bugs":{"url":"https://github.com/waku-org/js-waku/issues"},"license":"MIT OR Apache-2.0","keywords":["waku","decentralized","secure","communication","web3","ethereum","dapps","privacy"],"scripts":{"build":"run-s build:**","build:esm":"tsc","build:bundle":"rollup --config rollup.config.js","fix":"run-s fix:*","fix:lint":"eslint src *.js --fix","check":"run-s check:*","check:lint":"eslint src *.js","check:spelling":"cspell \"{README.md,src/**/*.ts}\"","check:tsc":"tsc -p tsconfig.dev.json","prepublish":"npm run build","reset-hard":"git clean -dfx -e .idea && git reset --hard && npm i && npm run build","test":"NODE_ENV=test run-s test:*","test:node":"NODE_ENV=test TS_NODE_PROJECT=./tsconfig.dev.json mocha"},"engines":{"node":">=20"},"dependencies":{"@libp2p/interface":"2.7.0","@noble/hashes":"^1.7.1","@waku/proto":"0.0.11-b133417.0","@waku/utils":"0.0.24-b133417.0","chai":"^5.1.2"},"devDependencies":{"@rollup/plugin-commonjs":"^25.0.7","@rollup/plugin-json":"^6.0.0","@rollup/plugin-node-resolve":"^15.2.3","@waku/build-utils":"*","allure-commandline":"^2.27.0","allure-mocha":"^2.9.2","cspell":"^8.6.1","fast-check":"^3.19.0","mocha-multi-reporters":"^1.5.1","npm-run-all":"^4.1.5","rollup":"^4.12.0"},"files":["dist","bundle","src/**/*.ts","!**/*.spec.*","!**/*.json","CHANGELOG.md","LICENSE","README.md"]}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import { hashN } from "
|
2
|
-
import { getMOverNBitsForK } from "
|
1
|
+
import { hashN } from "./nim_hashn/nim_hashn.mjs";
|
2
|
+
import { getMOverNBitsForK } from "./probabilities.js";
|
3
3
|
|
4
4
|
export interface BloomFilterOptions {
|
5
5
|
// The expected maximum number of elements for which this BloomFilter is sized.
|
package/src/index.ts
CHANGED
@@ -1,17 +1,3 @@
|
|
1
|
-
import { BloomFilter } from "./
|
2
|
-
|
3
|
-
export {
|
4
|
-
MessageChannel,
|
5
|
-
MessageChannelEvent,
|
6
|
-
encodeMessage,
|
7
|
-
decodeMessage
|
8
|
-
} from "./message_channel/index.js";
|
9
|
-
|
10
|
-
export type {
|
11
|
-
Message,
|
12
|
-
HistoryEntry,
|
13
|
-
ChannelId,
|
14
|
-
MessageChannelEvents
|
15
|
-
} from "./message_channel/index.js";
|
1
|
+
import { BloomFilter } from "./bloom.js";
|
16
2
|
|
17
3
|
export { BloomFilter };
|