@waku/sds 0.0.6-ced989a.0 → 0.0.6-e1212cc.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 +22879 -5883
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/message_channel/command_queue.d.ts +1 -1
- package/dist/message_channel/events.d.ts +3 -85
- package/dist/message_channel/events.js +1 -137
- package/dist/message_channel/events.js.map +1 -1
- package/dist/message_channel/index.d.ts +1 -0
- package/dist/message_channel/index.js +1 -0
- package/dist/message_channel/index.js.map +1 -1
- package/dist/message_channel/mem_local_history.d.ts +7 -7
- package/dist/message_channel/mem_local_history.js +18 -32
- package/dist/message_channel/mem_local_history.js.map +1 -1
- package/dist/message_channel/message.d.ts +83 -0
- package/dist/message_channel/message.js +139 -0
- package/dist/message_channel/message.js.map +1 -0
- package/dist/message_channel/message_channel.d.ts +4 -3
- package/dist/message_channel/message_channel.js +7 -7
- package/dist/message_channel/message_channel.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -1
- package/src/message_channel/command_queue.ts +1 -1
- package/src/message_channel/events.ts +3 -175
- package/src/message_channel/index.ts +13 -0
- package/src/message_channel/mem_local_history.ts +37 -43
- package/src/message_channel/message.ts +175 -0
- package/src/message_channel/message_channel.ts +13 -15
- package/dist/message_channel/sorted_array_base.d.ts +0 -50
- package/dist/message_channel/sorted_array_base.js +0 -199
- package/dist/message_channel/sorted_array_base.js.map +0 -1
- package/src/message_channel/sorted_array_base.ts +0 -306
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { proto_sds_message } from "@waku/proto";
|
|
2
1
|
export var MessageChannelEvent;
|
|
3
2
|
(function (MessageChannelEvent) {
|
|
4
3
|
MessageChannelEvent["OutMessageSent"] = "sds:out:message-sent";
|
|
@@ -9,142 +8,7 @@ export var MessageChannelEvent;
|
|
|
9
8
|
MessageChannelEvent["InMessageMissing"] = "sds:in:message-missing";
|
|
10
9
|
MessageChannelEvent["OutSyncSent"] = "sds:out:sync-sent";
|
|
11
10
|
MessageChannelEvent["InSyncReceived"] = "sds:in:sync-received";
|
|
12
|
-
MessageChannelEvent["
|
|
11
|
+
MessageChannelEvent["InMessageLost"] = "sds:in:message-irretrievably-lost";
|
|
13
12
|
MessageChannelEvent["ErrorTask"] = "sds:error-task";
|
|
14
13
|
})(MessageChannelEvent || (MessageChannelEvent = {}));
|
|
15
|
-
export class Message {
|
|
16
|
-
messageId;
|
|
17
|
-
channelId;
|
|
18
|
-
senderId;
|
|
19
|
-
causalHistory;
|
|
20
|
-
lamportTimestamp;
|
|
21
|
-
bloomFilter;
|
|
22
|
-
content;
|
|
23
|
-
retrievalHint;
|
|
24
|
-
constructor(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content,
|
|
25
|
-
/**
|
|
26
|
-
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
27
|
-
*/
|
|
28
|
-
retrievalHint) {
|
|
29
|
-
this.messageId = messageId;
|
|
30
|
-
this.channelId = channelId;
|
|
31
|
-
this.senderId = senderId;
|
|
32
|
-
this.causalHistory = causalHistory;
|
|
33
|
-
this.lamportTimestamp = lamportTimestamp;
|
|
34
|
-
this.bloomFilter = bloomFilter;
|
|
35
|
-
this.content = content;
|
|
36
|
-
this.retrievalHint = retrievalHint;
|
|
37
|
-
}
|
|
38
|
-
encode() {
|
|
39
|
-
return proto_sds_message.SdsMessage.encode(this);
|
|
40
|
-
}
|
|
41
|
-
static decode(data) {
|
|
42
|
-
const { messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content } = proto_sds_message.SdsMessage.decode(data);
|
|
43
|
-
return new Message(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
export class SyncMessage extends Message {
|
|
47
|
-
messageId;
|
|
48
|
-
channelId;
|
|
49
|
-
senderId;
|
|
50
|
-
causalHistory;
|
|
51
|
-
lamportTimestamp;
|
|
52
|
-
bloomFilter;
|
|
53
|
-
content;
|
|
54
|
-
retrievalHint;
|
|
55
|
-
constructor(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content,
|
|
56
|
-
/**
|
|
57
|
-
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
58
|
-
*/
|
|
59
|
-
retrievalHint) {
|
|
60
|
-
super(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content, retrievalHint);
|
|
61
|
-
this.messageId = messageId;
|
|
62
|
-
this.channelId = channelId;
|
|
63
|
-
this.senderId = senderId;
|
|
64
|
-
this.causalHistory = causalHistory;
|
|
65
|
-
this.lamportTimestamp = lamportTimestamp;
|
|
66
|
-
this.bloomFilter = bloomFilter;
|
|
67
|
-
this.content = content;
|
|
68
|
-
this.retrievalHint = retrievalHint;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
export function isSyncMessage(message) {
|
|
72
|
-
return Boolean("lamportTimestamp" in message &&
|
|
73
|
-
typeof message.lamportTimestamp === "number" &&
|
|
74
|
-
(message.content === undefined || message.content.length === 0));
|
|
75
|
-
}
|
|
76
|
-
export class EphemeralMessage extends Message {
|
|
77
|
-
messageId;
|
|
78
|
-
channelId;
|
|
79
|
-
senderId;
|
|
80
|
-
causalHistory;
|
|
81
|
-
lamportTimestamp;
|
|
82
|
-
bloomFilter;
|
|
83
|
-
content;
|
|
84
|
-
retrievalHint;
|
|
85
|
-
constructor(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content,
|
|
86
|
-
/**
|
|
87
|
-
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
88
|
-
*/
|
|
89
|
-
retrievalHint) {
|
|
90
|
-
if (!content || !content.length) {
|
|
91
|
-
throw Error("Ephemeral Message must have content");
|
|
92
|
-
}
|
|
93
|
-
super(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content, retrievalHint);
|
|
94
|
-
this.messageId = messageId;
|
|
95
|
-
this.channelId = channelId;
|
|
96
|
-
this.senderId = senderId;
|
|
97
|
-
this.causalHistory = causalHistory;
|
|
98
|
-
this.lamportTimestamp = lamportTimestamp;
|
|
99
|
-
this.bloomFilter = bloomFilter;
|
|
100
|
-
this.content = content;
|
|
101
|
-
this.retrievalHint = retrievalHint;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
export function isEphemeralMessage(message) {
|
|
105
|
-
return Boolean(message.lamportTimestamp === undefined &&
|
|
106
|
-
"content" in message &&
|
|
107
|
-
message.content &&
|
|
108
|
-
message.content.length);
|
|
109
|
-
}
|
|
110
|
-
export class ContentMessage extends Message {
|
|
111
|
-
messageId;
|
|
112
|
-
channelId;
|
|
113
|
-
senderId;
|
|
114
|
-
causalHistory;
|
|
115
|
-
lamportTimestamp;
|
|
116
|
-
bloomFilter;
|
|
117
|
-
content;
|
|
118
|
-
retrievalHint;
|
|
119
|
-
constructor(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content,
|
|
120
|
-
/**
|
|
121
|
-
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
122
|
-
*/
|
|
123
|
-
retrievalHint) {
|
|
124
|
-
if (!content.length) {
|
|
125
|
-
throw Error("Content Message must have content");
|
|
126
|
-
}
|
|
127
|
-
super(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content, retrievalHint);
|
|
128
|
-
this.messageId = messageId;
|
|
129
|
-
this.channelId = channelId;
|
|
130
|
-
this.senderId = senderId;
|
|
131
|
-
this.causalHistory = causalHistory;
|
|
132
|
-
this.lamportTimestamp = lamportTimestamp;
|
|
133
|
-
this.bloomFilter = bloomFilter;
|
|
134
|
-
this.content = content;
|
|
135
|
-
this.retrievalHint = retrievalHint;
|
|
136
|
-
}
|
|
137
|
-
static compare(a, b) {
|
|
138
|
-
if (a.lamportTimestamp !== b.lamportTimestamp) {
|
|
139
|
-
return a.lamportTimestamp - b.lamportTimestamp;
|
|
140
|
-
}
|
|
141
|
-
return a.messageId.localeCompare(b.messageId);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
export function isContentMessage(message) {
|
|
145
|
-
return Boolean("lamportTimestamp" in message &&
|
|
146
|
-
typeof message.lamportTimestamp === "number" &&
|
|
147
|
-
message.content &&
|
|
148
|
-
message.content.length);
|
|
149
|
-
}
|
|
150
14
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/message_channel/events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/message_channel/events.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,mBAWX;AAXD,WAAY,mBAAmB;IAC7B,8DAAuC,CAAA;IACvC,sEAA+C,CAAA;IAC/C,oEAA6C,CAAA;IAC7C,8EAAuD,CAAA;IACvD,+FAAwE,CAAA;IACxE,kEAA2C,CAAA;IAC3C,wDAAiC,CAAA;IACjC,8DAAuC,CAAA;IACvC,0EAAmD,CAAA;IACnD,mDAA4B,CAAA;AAC9B,CAAC,EAXW,mBAAmB,KAAnB,mBAAmB,QAW9B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from "./command_queue.js";
|
|
2
2
|
export * from "./events.js";
|
|
3
3
|
export * from "./message_channel.js";
|
|
4
|
+
export { ChannelId, ContentMessage, EphemeralMessage, HistoryEntry, Message, MessageId, SenderId, SyncMessage, isContentMessage, isEphemeralMessage, isSyncMessage } from "./message.js";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from "./command_queue.js";
|
|
2
2
|
export * from "./events.js";
|
|
3
3
|
export * from "./message_channel.js";
|
|
4
|
+
export { ContentMessage, EphemeralMessage, Message, SyncMessage, isContentMessage, isEphemeralMessage, isSyncMessage } from "./message.js";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/message_channel/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/message_channel/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAEL,cAAc,EACd,gBAAgB,EAEhB,OAAO,EAGP,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACd,MAAM,cAAc,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { ContentMessage } from "./
|
|
2
|
-
import { SortedArrayBase } from "./sorted_array_base.js";
|
|
1
|
+
import { ContentMessage } from "./message.js";
|
|
3
2
|
/**
|
|
4
3
|
* In-Memory implementation of a local store of messages.
|
|
5
4
|
*
|
|
@@ -9,11 +8,12 @@ import { SortedArrayBase } from "./sorted_array_base.js";
|
|
|
9
8
|
*
|
|
10
9
|
* Only stores content message: `message.lamportTimestamp` and `message.content` are present.
|
|
11
10
|
*/
|
|
12
|
-
export declare class MemLocalHistory
|
|
13
|
-
|
|
11
|
+
export declare class MemLocalHistory {
|
|
12
|
+
private items;
|
|
13
|
+
get length(): number;
|
|
14
14
|
push(...items: ContentMessage[]): number;
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
some(predicate: (value: ContentMessage, index: number, array: ContentMessage[]) => unknown, thisArg?: any): boolean;
|
|
16
|
+
slice(start?: number, end?: number): ContentMessage[];
|
|
17
|
+
find(predicate: (value: ContentMessage, index: number, obj: ContentMessage[]) => unknown, thisArg?: any): ContentMessage | undefined;
|
|
17
18
|
private validateMessage;
|
|
18
|
-
private validateAndAddMessage;
|
|
19
19
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import _ from "lodash";
|
|
2
|
+
import { isContentMessage } from "./message.js";
|
|
3
3
|
/**
|
|
4
4
|
* In-Memory implementation of a local store of messages.
|
|
5
5
|
*
|
|
@@ -9,47 +9,33 @@ import { SortedArrayBase } from "./sorted_array_base.js";
|
|
|
9
9
|
*
|
|
10
10
|
* Only stores content message: `message.lamportTimestamp` and `message.content` are present.
|
|
11
11
|
*/
|
|
12
|
-
export class MemLocalHistory
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
export class MemLocalHistory {
|
|
13
|
+
items = [];
|
|
14
|
+
get length() {
|
|
15
|
+
return this.items.length;
|
|
15
16
|
}
|
|
16
17
|
push(...items) {
|
|
17
18
|
for (const item of items) {
|
|
18
|
-
this.
|
|
19
|
+
this.validateMessage(item);
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
+
// Add new items and ensure uniqueness by messageId using sortedUniqBy
|
|
22
|
+
// The valueOf() method on ContentMessage enables native < operator sorting
|
|
23
|
+
this.items = _.sortedUniqBy([...this.items, ...items], "messageId");
|
|
21
24
|
return this.items.length;
|
|
22
25
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.sort();
|
|
29
|
-
return result;
|
|
26
|
+
some(predicate, thisArg) {
|
|
27
|
+
return this.items.some(predicate, thisArg);
|
|
28
|
+
}
|
|
29
|
+
slice(start, end) {
|
|
30
|
+
return this.items.slice(start, end);
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
this.
|
|
33
|
-
this.items.fill(value, start, end);
|
|
34
|
-
this.sort();
|
|
35
|
-
return this.items;
|
|
32
|
+
find(predicate, thisArg) {
|
|
33
|
+
return this.items.find(predicate, thisArg);
|
|
36
34
|
}
|
|
37
35
|
validateMessage(message) {
|
|
38
|
-
if (!message
|
|
39
|
-
!message.content ||
|
|
40
|
-
!message.content.length ||
|
|
41
|
-
!message.messageId) {
|
|
36
|
+
if (!isContentMessage(message)) {
|
|
42
37
|
throw new Error("Message must have lamportTimestamp and content defined, sync and ephemeral messages cannot be stored");
|
|
43
38
|
}
|
|
44
39
|
}
|
|
45
|
-
validateAndAddMessage(newMessage) {
|
|
46
|
-
this.validateMessage(newMessage);
|
|
47
|
-
// Check if the entry is already present
|
|
48
|
-
const existingHistoryEntry = this.items.find(({ messageId }) => newMessage.messageId === messageId);
|
|
49
|
-
// If history entry is already present, no need to re-add
|
|
50
|
-
if (!existingHistoryEntry) {
|
|
51
|
-
this.items.push(newMessage);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
40
|
}
|
|
55
41
|
//# sourceMappingURL=mem_local_history.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mem_local_history.js","sourceRoot":"","sources":["../../src/message_channel/mem_local_history.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"mem_local_history.js","sourceRoot":"","sources":["../../src/message_channel/mem_local_history.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,OAAO,EAAkB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhE;;;;;;;;GAQG;AACH,MAAM,OAAO,eAAe;IAClB,KAAK,GAAqB,EAAE,CAAC;IAErC,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAEM,IAAI,CAAC,GAAG,KAAuB;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,sEAAsE;QACtE,2EAA2E;QAC3E,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;QAEpE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAEM,IAAI,CACT,SAIY,EACZ,OAAa;QAEb,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,KAAc,EAAE,GAAY;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAEM,IAAI,CACT,SAIY,EACZ,OAAa;QAEb,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,eAAe,CAAC,OAAuB;QAC7C,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,sGAAsG,CACvG,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { proto_sds_message } from "@waku/proto";
|
|
2
|
+
export type MessageId = string;
|
|
3
|
+
export type HistoryEntry = proto_sds_message.HistoryEntry;
|
|
4
|
+
export type ChannelId = string;
|
|
5
|
+
export type SenderId = string;
|
|
6
|
+
export declare class Message implements proto_sds_message.SdsMessage {
|
|
7
|
+
messageId: string;
|
|
8
|
+
channelId: string;
|
|
9
|
+
senderId: string;
|
|
10
|
+
causalHistory: proto_sds_message.HistoryEntry[];
|
|
11
|
+
lamportTimestamp?: number | undefined;
|
|
12
|
+
bloomFilter?: Uint8Array<ArrayBufferLike> | undefined;
|
|
13
|
+
content?: Uint8Array<ArrayBufferLike> | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
16
|
+
*/
|
|
17
|
+
retrievalHint?: Uint8Array | undefined;
|
|
18
|
+
constructor(messageId: string, channelId: string, senderId: string, causalHistory: proto_sds_message.HistoryEntry[], lamportTimestamp?: number | undefined, bloomFilter?: Uint8Array<ArrayBufferLike> | undefined, content?: Uint8Array<ArrayBufferLike> | undefined,
|
|
19
|
+
/**
|
|
20
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
21
|
+
*/
|
|
22
|
+
retrievalHint?: Uint8Array | undefined);
|
|
23
|
+
encode(): Uint8Array;
|
|
24
|
+
static decode(data: Uint8Array): Message;
|
|
25
|
+
}
|
|
26
|
+
export declare class SyncMessage extends Message {
|
|
27
|
+
messageId: string;
|
|
28
|
+
channelId: string;
|
|
29
|
+
senderId: string;
|
|
30
|
+
causalHistory: proto_sds_message.HistoryEntry[];
|
|
31
|
+
lamportTimestamp: number;
|
|
32
|
+
bloomFilter: Uint8Array<ArrayBufferLike> | undefined;
|
|
33
|
+
content: undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
36
|
+
*/
|
|
37
|
+
retrievalHint?: Uint8Array | undefined;
|
|
38
|
+
constructor(messageId: string, channelId: string, senderId: string, causalHistory: proto_sds_message.HistoryEntry[], lamportTimestamp: number, bloomFilter: Uint8Array<ArrayBufferLike> | undefined, content: undefined,
|
|
39
|
+
/**
|
|
40
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
41
|
+
*/
|
|
42
|
+
retrievalHint?: Uint8Array | undefined);
|
|
43
|
+
}
|
|
44
|
+
export declare function isSyncMessage(message: Message | ContentMessage | SyncMessage | EphemeralMessage): message is SyncMessage;
|
|
45
|
+
export declare class EphemeralMessage extends Message {
|
|
46
|
+
messageId: string;
|
|
47
|
+
channelId: string;
|
|
48
|
+
senderId: string;
|
|
49
|
+
causalHistory: proto_sds_message.HistoryEntry[];
|
|
50
|
+
lamportTimestamp: undefined;
|
|
51
|
+
bloomFilter: Uint8Array<ArrayBufferLike> | undefined;
|
|
52
|
+
content: Uint8Array<ArrayBufferLike>;
|
|
53
|
+
/**
|
|
54
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
55
|
+
*/
|
|
56
|
+
retrievalHint?: Uint8Array | undefined;
|
|
57
|
+
constructor(messageId: string, channelId: string, senderId: string, causalHistory: proto_sds_message.HistoryEntry[], lamportTimestamp: undefined, bloomFilter: Uint8Array<ArrayBufferLike> | undefined, content: Uint8Array<ArrayBufferLike>,
|
|
58
|
+
/**
|
|
59
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
60
|
+
*/
|
|
61
|
+
retrievalHint?: Uint8Array | undefined);
|
|
62
|
+
}
|
|
63
|
+
export declare function isEphemeralMessage(message: Message | ContentMessage | SyncMessage | EphemeralMessage): message is EphemeralMessage;
|
|
64
|
+
export declare class ContentMessage extends Message {
|
|
65
|
+
messageId: string;
|
|
66
|
+
channelId: string;
|
|
67
|
+
senderId: string;
|
|
68
|
+
causalHistory: proto_sds_message.HistoryEntry[];
|
|
69
|
+
lamportTimestamp: number;
|
|
70
|
+
bloomFilter: Uint8Array<ArrayBufferLike> | undefined;
|
|
71
|
+
content: Uint8Array<ArrayBufferLike>;
|
|
72
|
+
/**
|
|
73
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
74
|
+
*/
|
|
75
|
+
retrievalHint?: Uint8Array | undefined;
|
|
76
|
+
constructor(messageId: string, channelId: string, senderId: string, causalHistory: proto_sds_message.HistoryEntry[], lamportTimestamp: number, bloomFilter: Uint8Array<ArrayBufferLike> | undefined, content: Uint8Array<ArrayBufferLike>,
|
|
77
|
+
/**
|
|
78
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
79
|
+
*/
|
|
80
|
+
retrievalHint?: Uint8Array | undefined);
|
|
81
|
+
valueOf(): string;
|
|
82
|
+
}
|
|
83
|
+
export declare function isContentMessage(message: Message | ContentMessage): message is ContentMessage;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { proto_sds_message } from "@waku/proto";
|
|
2
|
+
export class Message {
|
|
3
|
+
messageId;
|
|
4
|
+
channelId;
|
|
5
|
+
senderId;
|
|
6
|
+
causalHistory;
|
|
7
|
+
lamportTimestamp;
|
|
8
|
+
bloomFilter;
|
|
9
|
+
content;
|
|
10
|
+
retrievalHint;
|
|
11
|
+
constructor(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content,
|
|
12
|
+
/**
|
|
13
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
14
|
+
*/
|
|
15
|
+
retrievalHint) {
|
|
16
|
+
this.messageId = messageId;
|
|
17
|
+
this.channelId = channelId;
|
|
18
|
+
this.senderId = senderId;
|
|
19
|
+
this.causalHistory = causalHistory;
|
|
20
|
+
this.lamportTimestamp = lamportTimestamp;
|
|
21
|
+
this.bloomFilter = bloomFilter;
|
|
22
|
+
this.content = content;
|
|
23
|
+
this.retrievalHint = retrievalHint;
|
|
24
|
+
}
|
|
25
|
+
encode() {
|
|
26
|
+
return proto_sds_message.SdsMessage.encode(this);
|
|
27
|
+
}
|
|
28
|
+
static decode(data) {
|
|
29
|
+
const { messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content } = proto_sds_message.SdsMessage.decode(data);
|
|
30
|
+
return new Message(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class SyncMessage extends Message {
|
|
34
|
+
messageId;
|
|
35
|
+
channelId;
|
|
36
|
+
senderId;
|
|
37
|
+
causalHistory;
|
|
38
|
+
lamportTimestamp;
|
|
39
|
+
bloomFilter;
|
|
40
|
+
content;
|
|
41
|
+
retrievalHint;
|
|
42
|
+
constructor(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content,
|
|
43
|
+
/**
|
|
44
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
45
|
+
*/
|
|
46
|
+
retrievalHint) {
|
|
47
|
+
super(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content, retrievalHint);
|
|
48
|
+
this.messageId = messageId;
|
|
49
|
+
this.channelId = channelId;
|
|
50
|
+
this.senderId = senderId;
|
|
51
|
+
this.causalHistory = causalHistory;
|
|
52
|
+
this.lamportTimestamp = lamportTimestamp;
|
|
53
|
+
this.bloomFilter = bloomFilter;
|
|
54
|
+
this.content = content;
|
|
55
|
+
this.retrievalHint = retrievalHint;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function isSyncMessage(message) {
|
|
59
|
+
return Boolean("lamportTimestamp" in message &&
|
|
60
|
+
typeof message.lamportTimestamp === "number" &&
|
|
61
|
+
(message.content === undefined || message.content.length === 0));
|
|
62
|
+
}
|
|
63
|
+
export class EphemeralMessage extends Message {
|
|
64
|
+
messageId;
|
|
65
|
+
channelId;
|
|
66
|
+
senderId;
|
|
67
|
+
causalHistory;
|
|
68
|
+
lamportTimestamp;
|
|
69
|
+
bloomFilter;
|
|
70
|
+
content;
|
|
71
|
+
retrievalHint;
|
|
72
|
+
constructor(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content,
|
|
73
|
+
/**
|
|
74
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
75
|
+
*/
|
|
76
|
+
retrievalHint) {
|
|
77
|
+
if (!content || !content.length) {
|
|
78
|
+
throw Error("Ephemeral Message must have content");
|
|
79
|
+
}
|
|
80
|
+
super(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content, retrievalHint);
|
|
81
|
+
this.messageId = messageId;
|
|
82
|
+
this.channelId = channelId;
|
|
83
|
+
this.senderId = senderId;
|
|
84
|
+
this.causalHistory = causalHistory;
|
|
85
|
+
this.lamportTimestamp = lamportTimestamp;
|
|
86
|
+
this.bloomFilter = bloomFilter;
|
|
87
|
+
this.content = content;
|
|
88
|
+
this.retrievalHint = retrievalHint;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function isEphemeralMessage(message) {
|
|
92
|
+
return Boolean(message.lamportTimestamp === undefined &&
|
|
93
|
+
"content" in message &&
|
|
94
|
+
message.content &&
|
|
95
|
+
message.content.length);
|
|
96
|
+
}
|
|
97
|
+
export class ContentMessage extends Message {
|
|
98
|
+
messageId;
|
|
99
|
+
channelId;
|
|
100
|
+
senderId;
|
|
101
|
+
causalHistory;
|
|
102
|
+
lamportTimestamp;
|
|
103
|
+
bloomFilter;
|
|
104
|
+
content;
|
|
105
|
+
retrievalHint;
|
|
106
|
+
constructor(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content,
|
|
107
|
+
/**
|
|
108
|
+
* Not encoded, set after it is sent, used to include in follow-up messages
|
|
109
|
+
*/
|
|
110
|
+
retrievalHint) {
|
|
111
|
+
if (!content.length) {
|
|
112
|
+
throw Error("Content Message must have content");
|
|
113
|
+
}
|
|
114
|
+
super(messageId, channelId, senderId, causalHistory, lamportTimestamp, bloomFilter, content, retrievalHint);
|
|
115
|
+
this.messageId = messageId;
|
|
116
|
+
this.channelId = channelId;
|
|
117
|
+
this.senderId = senderId;
|
|
118
|
+
this.causalHistory = causalHistory;
|
|
119
|
+
this.lamportTimestamp = lamportTimestamp;
|
|
120
|
+
this.bloomFilter = bloomFilter;
|
|
121
|
+
this.content = content;
|
|
122
|
+
this.retrievalHint = retrievalHint;
|
|
123
|
+
}
|
|
124
|
+
// `valueOf` is used by comparison operands such as `<`
|
|
125
|
+
valueOf() {
|
|
126
|
+
// Create a sortable string representation that matches the compare logic
|
|
127
|
+
// Pad lamportTimestamp to ensure proper lexicographic ordering
|
|
128
|
+
// Use 16 digits to handle up to Number.MAX_SAFE_INTEGER (9007199254740991)
|
|
129
|
+
const paddedTimestamp = this.lamportTimestamp.toString().padStart(16, "0");
|
|
130
|
+
return `${paddedTimestamp}_${this.messageId}`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function isContentMessage(message) {
|
|
134
|
+
return Boolean("lamportTimestamp" in message &&
|
|
135
|
+
typeof message.lamportTimestamp === "number" &&
|
|
136
|
+
message.content &&
|
|
137
|
+
message.content.length);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/message_channel/message.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { TypedEventEmitter } from "@libp2p/interface";
|
|
2
|
-
import {
|
|
2
|
+
import { MessageChannelEvents } from "./events.js";
|
|
3
|
+
import { ChannelId, ContentMessage, HistoryEntry, Message, MessageId, SenderId, SyncMessage } from "./message.js";
|
|
3
4
|
export declare const DEFAULT_BLOOM_FILTER_OPTIONS: {
|
|
4
5
|
capacity: number;
|
|
5
6
|
errorRate: number;
|
|
@@ -13,7 +14,7 @@ export interface MessageChannelOptions {
|
|
|
13
14
|
*
|
|
14
15
|
* @default undefined because it is coupled to processTask calls frequency
|
|
15
16
|
*/
|
|
16
|
-
|
|
17
|
+
timeoutForLostMessagesMs?: number;
|
|
17
18
|
/**
|
|
18
19
|
* How many possible acks does it take to consider it a definitive ack.
|
|
19
20
|
*/
|
|
@@ -32,7 +33,7 @@ export declare class MessageChannel extends TypedEventEmitter<MessageChannelEven
|
|
|
32
33
|
private timeReceived;
|
|
33
34
|
private readonly causalHistorySize;
|
|
34
35
|
private readonly possibleAcksThreshold;
|
|
35
|
-
private readonly
|
|
36
|
+
private readonly timeoutForLostMessagesMs?;
|
|
36
37
|
private tasks;
|
|
37
38
|
private handlers;
|
|
38
39
|
constructor(channelId: ChannelId, senderId: SenderId, options?: MessageChannelOptions, localHistory?: ILocalHistory);
|
|
@@ -4,8 +4,9 @@ import { bytesToHex } from "@noble/hashes/utils";
|
|
|
4
4
|
import { Logger } from "@waku/utils";
|
|
5
5
|
import { DefaultBloomFilter } from "../bloom_filter/bloom.js";
|
|
6
6
|
import { Command } from "./command_queue.js";
|
|
7
|
-
import {
|
|
7
|
+
import { MessageChannelEvent } from "./events.js";
|
|
8
8
|
import { MemLocalHistory } from "./mem_local_history.js";
|
|
9
|
+
import { ContentMessage, EphemeralMessage, isContentMessage, isEphemeralMessage, isSyncMessage, SyncMessage } from "./message.js";
|
|
9
10
|
export const DEFAULT_BLOOM_FILTER_OPTIONS = {
|
|
10
11
|
capacity: 10000,
|
|
11
12
|
errorRate: 0.001
|
|
@@ -25,7 +26,7 @@ export class MessageChannel extends TypedEventEmitter {
|
|
|
25
26
|
timeReceived;
|
|
26
27
|
causalHistorySize;
|
|
27
28
|
possibleAcksThreshold;
|
|
28
|
-
|
|
29
|
+
timeoutForLostMessagesMs;
|
|
29
30
|
tasks = [];
|
|
30
31
|
handlers = {
|
|
31
32
|
[Command.Send]: async (params) => {
|
|
@@ -54,8 +55,7 @@ export class MessageChannel extends TypedEventEmitter {
|
|
|
54
55
|
this.possibleAcksThreshold =
|
|
55
56
|
options.possibleAcksThreshold ?? DEFAULT_POSSIBLE_ACKS_THRESHOLD;
|
|
56
57
|
this.timeReceived = new Map();
|
|
57
|
-
this.
|
|
58
|
-
options.timeoutToMarkMessageIrretrievableMs;
|
|
58
|
+
this.timeoutForLostMessagesMs = options.timeoutForLostMessagesMs;
|
|
59
59
|
}
|
|
60
60
|
static getMessageId(payload) {
|
|
61
61
|
return bytesToHex(sha256(payload));
|
|
@@ -199,11 +199,11 @@ export class MessageChannel extends TypedEventEmitter {
|
|
|
199
199
|
log.info(this.senderId, message.messageId, "is missing dependencies", missingDependencies.map((ch) => ch.messageId));
|
|
200
200
|
// Optionally, if a message has not been received after a predetermined amount of time,
|
|
201
201
|
// its dependencies are marked as irretrievably lost (implicitly by removing it from the buffer without delivery)
|
|
202
|
-
if (this.
|
|
202
|
+
if (this.timeoutForLostMessagesMs) {
|
|
203
203
|
const timeReceived = this.timeReceived.get(message.messageId);
|
|
204
204
|
if (timeReceived &&
|
|
205
|
-
Date.now() - timeReceived > this.
|
|
206
|
-
this.safeSendEvent(MessageChannelEvent.
|
|
205
|
+
Date.now() - timeReceived > this.timeoutForLostMessagesMs) {
|
|
206
|
+
this.safeSendEvent(MessageChannelEvent.InMessageLost, {
|
|
207
207
|
detail: Array.from(missingDependencies)
|
|
208
208
|
});
|
|
209
209
|
return { buffer, missing };
|