@waku/sds 0.0.4-10590da.0 → 0.0.4-383e0b2.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 +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} +13 -15
- package/dist/{sds.js → message_channel/message_channel.js} +125 -26
- 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} +162 -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,9 @@
|
|
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 { DefaultBloomFilter } from "
|
5
|
-
|
6
|
-
|
7
|
-
MessageChannelEvent["MessageDelivered"] = "messageDelivered";
|
8
|
-
})(MessageChannelEvent || (MessageChannelEvent = {}));
|
4
|
+
import { DefaultBloomFilter } from "../bloom_filter/bloom.js";
|
5
|
+
import { Command } from "./command_queue.js";
|
6
|
+
import { MessageChannelEvent } from "./events.js";
|
9
7
|
export const DEFAULT_BLOOM_FILTER_OPTIONS = {
|
10
8
|
capacity: 10000,
|
11
9
|
errorRate: 0.001
|
@@ -25,7 +23,18 @@ export class MessageChannel extends TypedEventEmitter {
|
|
25
23
|
timeReceived;
|
26
24
|
receivedMessageTimeoutEnabled;
|
27
25
|
receivedMessageTimeout;
|
28
|
-
|
26
|
+
tasks = [];
|
27
|
+
handlers = {
|
28
|
+
[Command.Send]: async (params) => {
|
29
|
+
await this._sendMessage(params.payload, params.callback);
|
30
|
+
},
|
31
|
+
[Command.Receive]: async (params) => {
|
32
|
+
this._receiveMessage(params.message);
|
33
|
+
},
|
34
|
+
[Command.SendEphemeral]: async (params) => {
|
35
|
+
await this._sendEphemeralMessage(params.payload, params.callback);
|
36
|
+
}
|
37
|
+
};
|
29
38
|
constructor(channelId, options = {}) {
|
30
39
|
super();
|
31
40
|
this.channelId = channelId;
|
@@ -43,7 +52,22 @@ export class MessageChannel extends TypedEventEmitter {
|
|
43
52
|
options.receivedMessageTimeoutEnabled ?? false;
|
44
53
|
this.receivedMessageTimeout =
|
45
54
|
options.receivedMessageTimeout ?? DEFAULT_RECEIVED_MESSAGE_TIMEOUT;
|
46
|
-
|
55
|
+
}
|
56
|
+
// Periodically called by the library consumer to process async operations
|
57
|
+
// in a sequential manner.
|
58
|
+
async processTasks() {
|
59
|
+
while (this.tasks.length > 0) {
|
60
|
+
const item = this.tasks.shift();
|
61
|
+
if (!item) {
|
62
|
+
continue;
|
63
|
+
}
|
64
|
+
// Use a generic helper function to ensure type safety
|
65
|
+
await this.executeTask(item);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
async executeTask(item) {
|
69
|
+
const handler = this.handlers[item.command];
|
70
|
+
await handler(item.params);
|
47
71
|
}
|
48
72
|
static getMessageId(payload) {
|
49
73
|
return bytesToHex(sha256(payload));
|
@@ -65,6 +89,15 @@ export class MessageChannel extends TypedEventEmitter {
|
|
65
89
|
* @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
|
66
90
|
*/
|
67
91
|
async sendMessage(payload, callback) {
|
92
|
+
this.tasks.push({
|
93
|
+
command: Command.Send,
|
94
|
+
params: {
|
95
|
+
payload,
|
96
|
+
callback
|
97
|
+
}
|
98
|
+
});
|
99
|
+
}
|
100
|
+
async _sendMessage(payload, callback) {
|
68
101
|
this.lamportTimestamp++;
|
69
102
|
const messageId = MessageChannel.getMessageId(payload);
|
70
103
|
const message = {
|
@@ -89,6 +122,10 @@ export class MessageChannel extends TypedEventEmitter {
|
|
89
122
|
retrievalHint
|
90
123
|
}
|
91
124
|
});
|
125
|
+
this.timeReceived.set(messageId, Date.now());
|
126
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageSent, {
|
127
|
+
detail: message
|
128
|
+
});
|
92
129
|
}
|
93
130
|
}
|
94
131
|
}
|
@@ -105,7 +142,16 @@ export class MessageChannel extends TypedEventEmitter {
|
|
105
142
|
* @param payload - The payload to send.
|
106
143
|
* @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
|
107
144
|
*/
|
108
|
-
sendEphemeralMessage(payload, callback) {
|
145
|
+
async sendEphemeralMessage(payload, callback) {
|
146
|
+
this.tasks.push({
|
147
|
+
command: Command.SendEphemeral,
|
148
|
+
params: {
|
149
|
+
payload,
|
150
|
+
callback
|
151
|
+
}
|
152
|
+
});
|
153
|
+
}
|
154
|
+
async _sendEphemeralMessage(payload, callback) {
|
109
155
|
const message = {
|
110
156
|
messageId: MessageChannel.getMessageId(payload),
|
111
157
|
channelId: this.channelId,
|
@@ -115,7 +161,7 @@ export class MessageChannel extends TypedEventEmitter {
|
|
115
161
|
bloomFilter: undefined
|
116
162
|
};
|
117
163
|
if (callback) {
|
118
|
-
callback(message);
|
164
|
+
await callback(message);
|
119
165
|
}
|
120
166
|
}
|
121
167
|
/**
|
@@ -133,11 +179,35 @@ export class MessageChannel extends TypedEventEmitter {
|
|
133
179
|
* @param message - The received SDS message.
|
134
180
|
*/
|
135
181
|
receiveMessage(message) {
|
182
|
+
this.tasks.push({
|
183
|
+
command: Command.Receive,
|
184
|
+
params: {
|
185
|
+
message
|
186
|
+
}
|
187
|
+
});
|
188
|
+
}
|
189
|
+
_receiveMessage(message) {
|
190
|
+
if (message.content &&
|
191
|
+
message.content.length > 0 &&
|
192
|
+
this.timeReceived.has(message.messageId)) {
|
193
|
+
// Received a duplicate message
|
194
|
+
return;
|
195
|
+
}
|
136
196
|
if (!message.lamportTimestamp) {
|
137
197
|
// Messages with no timestamp are ephemeral messages and should be delivered immediately
|
138
198
|
this.deliverMessage(message);
|
139
199
|
return;
|
140
200
|
}
|
201
|
+
if (message.content?.length === 0) {
|
202
|
+
this.safeDispatchEvent(MessageChannelEvent.SyncReceived, {
|
203
|
+
detail: message
|
204
|
+
});
|
205
|
+
}
|
206
|
+
else {
|
207
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageReceived, {
|
208
|
+
detail: message
|
209
|
+
});
|
210
|
+
}
|
141
211
|
// review ack status
|
142
212
|
this.reviewAckStatus(message);
|
143
213
|
// add to bloom filter (skip for messages with empty content)
|
@@ -152,9 +222,17 @@ export class MessageChannel extends TypedEventEmitter {
|
|
152
222
|
}
|
153
223
|
else {
|
154
224
|
this.deliverMessage(message);
|
225
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageDelivered, {
|
226
|
+
detail: {
|
227
|
+
messageId: message.messageId,
|
228
|
+
sentOrReceived: "received"
|
229
|
+
}
|
230
|
+
});
|
155
231
|
}
|
156
232
|
}
|
157
233
|
// https://rfc.vac.dev/vac/raw/sds/#periodic-incoming-buffer-sweep
|
234
|
+
// Note that even though this function has side effects, it is not async
|
235
|
+
// and does not need to be called through the queue.
|
158
236
|
sweepIncomingBuffer() {
|
159
237
|
const { buffer, missing } = this.incomingBuffer.reduce(({ buffer, missing }, message) => {
|
160
238
|
// Check each message for missing dependencies
|
@@ -163,6 +241,12 @@ export class MessageChannel extends TypedEventEmitter {
|
|
163
241
|
// Any message with no missing dependencies is delivered
|
164
242
|
// and removed from the buffer (implicitly by not adding it to the new incoming buffer)
|
165
243
|
this.deliverMessage(message);
|
244
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageDelivered, {
|
245
|
+
detail: {
|
246
|
+
messageId: message.messageId,
|
247
|
+
sentOrReceived: "received"
|
248
|
+
}
|
249
|
+
});
|
166
250
|
return { buffer, missing };
|
167
251
|
}
|
168
252
|
// Optionally, if a message has not been received after a predetermined amount of time,
|
@@ -176,14 +260,20 @@ export class MessageChannel extends TypedEventEmitter {
|
|
176
260
|
}
|
177
261
|
// Any message with missing dependencies stays in the buffer
|
178
262
|
// and the missing message IDs are returned for processing.
|
263
|
+
missingDependencies.forEach((dependency) => {
|
264
|
+
missing.add(dependency);
|
265
|
+
});
|
179
266
|
return {
|
180
267
|
buffer: buffer.concat(message),
|
181
|
-
missing
|
268
|
+
missing
|
182
269
|
};
|
183
|
-
}, { buffer: new Array(), missing: new
|
270
|
+
}, { buffer: new Array(), missing: new Set() });
|
184
271
|
// Update the incoming buffer to only include messages with no missing dependencies
|
185
272
|
this.incomingBuffer = buffer;
|
186
|
-
|
273
|
+
this.safeDispatchEvent(MessageChannelEvent.MissedMessages, {
|
274
|
+
detail: Array.from(missing)
|
275
|
+
});
|
276
|
+
return Array.from(missing);
|
187
277
|
}
|
188
278
|
// https://rfc.vac.dev/vac/raw/sds/#periodic-outgoing-buffer-sweep
|
189
279
|
sweepOutgoingBuffer() {
|
@@ -214,7 +304,7 @@ export class MessageChannel extends TypedEventEmitter {
|
|
214
304
|
*
|
215
305
|
* @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
|
216
306
|
*/
|
217
|
-
sendSyncMessage(callback) {
|
307
|
+
async sendSyncMessage(callback) {
|
218
308
|
this.lamportTimestamp++;
|
219
309
|
const emptyMessage = new Uint8Array();
|
220
310
|
const message = {
|
@@ -228,13 +318,16 @@ export class MessageChannel extends TypedEventEmitter {
|
|
228
318
|
content: emptyMessage
|
229
319
|
};
|
230
320
|
if (callback) {
|
231
|
-
|
321
|
+
await callback(message);
|
322
|
+
this.safeDispatchEvent(MessageChannelEvent.SyncSent, {
|
323
|
+
detail: message
|
324
|
+
});
|
325
|
+
return true;
|
232
326
|
}
|
233
|
-
return
|
327
|
+
return false;
|
234
328
|
}
|
235
329
|
// See https://rfc.vac.dev/vac/raw/sds/#deliver-message
|
236
330
|
deliverMessage(message, retrievalHint) {
|
237
|
-
this.notifyDeliveredMessage(message.messageId);
|
238
331
|
const messageLamportTimestamp = message.lamportTimestamp ?? 0;
|
239
332
|
if (messageLamportTimestamp > this.lamportTimestamp) {
|
240
333
|
this.lamportTimestamp = messageLamportTimestamp;
|
@@ -271,7 +364,15 @@ export class MessageChannel extends TypedEventEmitter {
|
|
271
364
|
reviewAckStatus(receivedMessage) {
|
272
365
|
// the participant MUST mark all messages in the received causal_history as acknowledged.
|
273
366
|
receivedMessage.causalHistory.forEach(({ messageId }) => {
|
274
|
-
this.outgoingBuffer = this.outgoingBuffer.filter(({ messageId: outgoingMessageId }) =>
|
367
|
+
this.outgoingBuffer = this.outgoingBuffer.filter(({ messageId: outgoingMessageId }) => {
|
368
|
+
if (outgoingMessageId !== messageId) {
|
369
|
+
return true;
|
370
|
+
}
|
371
|
+
this.safeDispatchEvent(MessageChannelEvent.MessageAcknowledged, {
|
372
|
+
detail: messageId
|
373
|
+
});
|
374
|
+
return false;
|
375
|
+
});
|
275
376
|
this.acknowledgements.delete(messageId);
|
276
377
|
if (!this.filter.lookup(messageId)) {
|
277
378
|
this.filter.insert(messageId);
|
@@ -292,6 +393,12 @@ export class MessageChannel extends TypedEventEmitter {
|
|
292
393
|
const count = (this.acknowledgements.get(message.messageId) ?? 0) + 1;
|
293
394
|
if (count < this.acknowledgementCount) {
|
294
395
|
this.acknowledgements.set(message.messageId, count);
|
396
|
+
this.safeDispatchEvent(MessageChannelEvent.PartialAcknowledgement, {
|
397
|
+
detail: {
|
398
|
+
messageId: message.messageId,
|
399
|
+
count
|
400
|
+
}
|
401
|
+
});
|
295
402
|
return true;
|
296
403
|
}
|
297
404
|
this.acknowledgements.delete(message.messageId);
|
@@ -302,13 +409,5 @@ export class MessageChannel extends TypedEventEmitter {
|
|
302
409
|
getAcknowledgementCount() {
|
303
410
|
return 2;
|
304
411
|
}
|
305
|
-
notifyDeliveredMessage(messageId) {
|
306
|
-
if (this.deliveredMessageCallback) {
|
307
|
-
this.deliveredMessageCallback(messageId);
|
308
|
-
}
|
309
|
-
this.dispatchEvent(new CustomEvent(MessageChannelEvent.MessageDelivered, {
|
310
|
-
detail: messageId
|
311
|
-
}));
|
312
|
-
}
|
313
412
|
}
|
314
|
-
//# sourceMappingURL=
|
413
|
+
//# sourceMappingURL=message_channel.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"message_channel.js","sourceRoot":"","sources":["../../src/message_channel/message_channel.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-383e0b2.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/message-hash":"0.1.20-383e0b2.0","@waku/proto":"0.0.11-383e0b2.0","@waku/utils":"0.0.24-383e0b2.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
@@ -0,0 +1,34 @@
|
|
1
|
+
import { Message } from "./events.js";
|
2
|
+
|
3
|
+
export enum Command {
|
4
|
+
Send = "send",
|
5
|
+
Receive = "receive",
|
6
|
+
SendEphemeral = "sendEphemeral"
|
7
|
+
}
|
8
|
+
|
9
|
+
export interface ParamsByAction {
|
10
|
+
[Command.Send]: {
|
11
|
+
payload: Uint8Array;
|
12
|
+
callback?: (message: Message) => Promise<{
|
13
|
+
success: boolean;
|
14
|
+
retrievalHint?: Uint8Array;
|
15
|
+
}>;
|
16
|
+
};
|
17
|
+
[Command.Receive]: {
|
18
|
+
message: Message;
|
19
|
+
};
|
20
|
+
[Command.SendEphemeral]: {
|
21
|
+
payload: Uint8Array;
|
22
|
+
callback?: (message: Message) => Promise<boolean>;
|
23
|
+
};
|
24
|
+
}
|
25
|
+
|
26
|
+
export type Task<A extends Command = Command> = {
|
27
|
+
command: A;
|
28
|
+
params: ParamsByAction[A];
|
29
|
+
};
|
30
|
+
|
31
|
+
// Define a mapping for handlers based on action type
|
32
|
+
export type Handlers = {
|
33
|
+
[A in Command]: (params: ParamsByAction[A]) => Promise<void>;
|
34
|
+
};
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { proto_sds_message } from "@waku/proto";
|
2
|
+
|
3
|
+
export enum MessageChannelEvent {
|
4
|
+
MessageSent = "messageSent",
|
5
|
+
MessageDelivered = "messageDelivered",
|
6
|
+
MessageReceived = "messageReceived",
|
7
|
+
MessageAcknowledged = "messageAcknowledged",
|
8
|
+
PartialAcknowledgement = "partialAcknowledgement",
|
9
|
+
MissedMessages = "missedMessages",
|
10
|
+
SyncSent = "syncSent",
|
11
|
+
SyncReceived = "syncReceived"
|
12
|
+
}
|
13
|
+
|
14
|
+
export type Message = proto_sds_message.SdsMessage;
|
15
|
+
export type HistoryEntry = proto_sds_message.HistoryEntry;
|
16
|
+
export type ChannelId = string;
|
17
|
+
|
18
|
+
export function encodeMessage(message: Message): Uint8Array {
|
19
|
+
return proto_sds_message.SdsMessage.encode(message);
|
20
|
+
}
|
21
|
+
|
22
|
+
export function decodeMessage(data: Uint8Array): Message {
|
23
|
+
return proto_sds_message.SdsMessage.decode(data);
|
24
|
+
}
|
25
|
+
|
26
|
+
export type MessageChannelEvents = {
|
27
|
+
[MessageChannelEvent.MessageSent]: CustomEvent<Message>;
|
28
|
+
[MessageChannelEvent.MessageDelivered]: CustomEvent<{
|
29
|
+
messageId: string;
|
30
|
+
sentOrReceived: "sent" | "received";
|
31
|
+
}>;
|
32
|
+
[MessageChannelEvent.MessageReceived]: CustomEvent<Message>;
|
33
|
+
[MessageChannelEvent.MessageAcknowledged]: CustomEvent<string>;
|
34
|
+
[MessageChannelEvent.PartialAcknowledgement]: CustomEvent<{
|
35
|
+
messageId: string;
|
36
|
+
count: number;
|
37
|
+
}>;
|
38
|
+
[MessageChannelEvent.MissedMessages]: CustomEvent<HistoryEntry[]>;
|
39
|
+
[MessageChannelEvent.SyncSent]: CustomEvent<Message>;
|
40
|
+
[MessageChannelEvent.SyncReceived]: CustomEvent<Message>;
|
41
|
+
};
|