@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,38 +1,73 @@
1
+ import { TypedEventEmitter } from "@libp2p/interface";
1
2
  import { sha256 } from "@noble/hashes/sha256";
2
3
  import { bytesToHex } from "@noble/hashes/utils";
3
- import { DefaultBloomFilter } from "./bloom.js";
4
+ import { DefaultBloomFilter } from "../bloom_filter/bloom.js";
5
+ import { Command } from "./command_queue.js";
6
+ import { MessageChannelEvent } from "./events.js";
4
7
  export const DEFAULT_BLOOM_FILTER_OPTIONS = {
5
8
  capacity: 10000,
6
9
  errorRate: 0.001
7
10
  };
8
11
  const DEFAULT_CAUSAL_HISTORY_SIZE = 2;
9
12
  const DEFAULT_RECEIVED_MESSAGE_TIMEOUT = 1000 * 60 * 5; // 5 minutes
10
- export class MessageChannel {
11
- receivedMessageTimeoutEnabled;
12
- receivedMessageTimeout;
13
+ export class MessageChannel extends TypedEventEmitter {
13
14
  lamportTimestamp;
14
15
  filter;
15
16
  outgoingBuffer;
16
17
  acknowledgements;
17
18
  incomingBuffer;
18
- messageIdLog;
19
+ localHistory;
19
20
  channelId;
20
21
  causalHistorySize;
21
22
  acknowledgementCount;
22
23
  timeReceived;
23
- constructor(channelId, causalHistorySize = DEFAULT_CAUSAL_HISTORY_SIZE, receivedMessageTimeoutEnabled = false, receivedMessageTimeout = DEFAULT_RECEIVED_MESSAGE_TIMEOUT) {
24
- this.receivedMessageTimeoutEnabled = receivedMessageTimeoutEnabled;
25
- this.receivedMessageTimeout = receivedMessageTimeout;
24
+ receivedMessageTimeoutEnabled;
25
+ receivedMessageTimeout;
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
+ };
38
+ constructor(channelId, options = {}) {
39
+ super();
26
40
  this.channelId = channelId;
27
41
  this.lamportTimestamp = 0;
28
42
  this.filter = new DefaultBloomFilter(DEFAULT_BLOOM_FILTER_OPTIONS);
29
43
  this.outgoingBuffer = [];
30
44
  this.acknowledgements = new Map();
31
45
  this.incomingBuffer = [];
32
- this.messageIdLog = [];
33
- this.causalHistorySize = causalHistorySize;
46
+ this.localHistory = [];
47
+ this.causalHistorySize =
48
+ options.causalHistorySize ?? DEFAULT_CAUSAL_HISTORY_SIZE;
34
49
  this.acknowledgementCount = this.getAcknowledgementCount();
35
50
  this.timeReceived = new Map();
51
+ this.receivedMessageTimeoutEnabled =
52
+ options.receivedMessageTimeoutEnabled ?? false;
53
+ this.receivedMessageTimeout =
54
+ options.receivedMessageTimeout ?? DEFAULT_RECEIVED_MESSAGE_TIMEOUT;
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);
36
71
  }
37
72
  static getMessageId(payload) {
38
73
  return bytesToHex(sha256(payload));
@@ -54,27 +89,81 @@ export class MessageChannel {
54
89
  * @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
55
90
  */
56
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) {
57
101
  this.lamportTimestamp++;
58
102
  const messageId = MessageChannel.getMessageId(payload);
59
103
  const message = {
60
104
  messageId,
61
105
  channelId: this.channelId,
62
106
  lamportTimestamp: this.lamportTimestamp,
63
- causalHistory: this.messageIdLog
107
+ causalHistory: this.localHistory
64
108
  .slice(-this.causalHistorySize)
65
- .map(({ messageId }) => messageId),
109
+ .map(({ historyEntry }) => historyEntry),
66
110
  bloomFilter: this.filter.toBytes(),
67
111
  content: payload
68
112
  };
69
113
  this.outgoingBuffer.push(message);
70
114
  if (callback) {
71
- const success = await callback(message);
115
+ const { success, retrievalHint } = await callback(message);
72
116
  if (success) {
73
117
  this.filter.insert(messageId);
74
- this.messageIdLog.push({ timestamp: this.lamportTimestamp, messageId });
118
+ this.localHistory.push({
119
+ timestamp: this.lamportTimestamp,
120
+ historyEntry: {
121
+ messageId,
122
+ retrievalHint
123
+ }
124
+ });
125
+ this.timeReceived.set(messageId, Date.now());
126
+ this.safeDispatchEvent(MessageChannelEvent.MessageSent, {
127
+ detail: message
128
+ });
75
129
  }
76
130
  }
77
131
  }
132
+ /**
133
+ * Sends a short-lived message without synchronization or reliability requirements.
134
+ *
135
+ * Sends a message without a timestamp, causal history, or bloom filter.
136
+ * Ephemeral messages are not added to the outgoing buffer.
137
+ * Upon reception, ephemeral messages are delivered immediately without
138
+ * checking for causal dependencies or including in the local log.
139
+ *
140
+ * See https://rfc.vac.dev/vac/raw/sds/#ephemeral-messages
141
+ *
142
+ * @param payload - The payload to send.
143
+ * @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
144
+ */
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) {
155
+ const message = {
156
+ messageId: MessageChannel.getMessageId(payload),
157
+ channelId: this.channelId,
158
+ content: payload,
159
+ lamportTimestamp: undefined,
160
+ causalHistory: [],
161
+ bloomFilter: undefined
162
+ };
163
+ if (callback) {
164
+ await callback(message);
165
+ }
166
+ }
78
167
  /**
79
168
  * Process a received SDS message for this channel.
80
169
  *
@@ -90,6 +179,35 @@ export class MessageChannel {
90
179
  * @param message - The received SDS message.
91
180
  */
92
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
+ }
196
+ if (!message.lamportTimestamp) {
197
+ // Messages with no timestamp are ephemeral messages and should be delivered immediately
198
+ this.deliverMessage(message);
199
+ return;
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
+ }
93
211
  // review ack status
94
212
  this.reviewAckStatus(message);
95
213
  // add to bloom filter (skip for messages with empty content)
@@ -97,24 +215,38 @@ export class MessageChannel {
97
215
  this.filter.insert(message.messageId);
98
216
  }
99
217
  // verify causal history
100
- const dependenciesMet = message.causalHistory.every((messageId) => this.messageIdLog.some(({ messageId: logMessageId }) => logMessageId === messageId));
218
+ const dependenciesMet = message.causalHistory.every((historyEntry) => this.localHistory.some(({ historyEntry: { messageId } }) => messageId === historyEntry.messageId));
101
219
  if (!dependenciesMet) {
102
220
  this.incomingBuffer.push(message);
103
221
  this.timeReceived.set(message.messageId, Date.now());
104
222
  }
105
223
  else {
106
224
  this.deliverMessage(message);
225
+ this.safeDispatchEvent(MessageChannelEvent.MessageDelivered, {
226
+ detail: {
227
+ messageId: message.messageId,
228
+ sentOrReceived: "received"
229
+ }
230
+ });
107
231
  }
108
232
  }
109
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.
110
236
  sweepIncomingBuffer() {
111
237
  const { buffer, missing } = this.incomingBuffer.reduce(({ buffer, missing }, message) => {
112
238
  // Check each message for missing dependencies
113
- const missingDependencies = message.causalHistory.filter((messageId) => !this.messageIdLog.some(({ messageId: logMessageId }) => logMessageId === messageId));
239
+ const missingDependencies = message.causalHistory.filter((messageHistoryEntry) => !this.localHistory.some(({ historyEntry: { messageId } }) => messageId === messageHistoryEntry.messageId));
114
240
  if (missingDependencies.length === 0) {
115
241
  // Any message with no missing dependencies is delivered
116
242
  // and removed from the buffer (implicitly by not adding it to the new incoming buffer)
117
243
  this.deliverMessage(message);
244
+ this.safeDispatchEvent(MessageChannelEvent.MessageDelivered, {
245
+ detail: {
246
+ messageId: message.messageId,
247
+ sentOrReceived: "received"
248
+ }
249
+ });
118
250
  return { buffer, missing };
119
251
  }
120
252
  // Optionally, if a message has not been received after a predetermined amount of time,
@@ -128,14 +260,20 @@ export class MessageChannel {
128
260
  }
129
261
  // Any message with missing dependencies stays in the buffer
130
262
  // and the missing message IDs are returned for processing.
263
+ missingDependencies.forEach((dependency) => {
264
+ missing.add(dependency);
265
+ });
131
266
  return {
132
267
  buffer: buffer.concat(message),
133
- missing: missing.concat(missingDependencies)
268
+ missing
134
269
  };
135
- }, { buffer: new Array(), missing: new Array() });
270
+ }, { buffer: new Array(), missing: new Set() });
136
271
  // Update the incoming buffer to only include messages with no missing dependencies
137
272
  this.incomingBuffer = buffer;
138
- return missing;
273
+ this.safeDispatchEvent(MessageChannelEvent.MissedMessages, {
274
+ detail: Array.from(missing)
275
+ });
276
+ return Array.from(missing);
139
277
  }
140
278
  // https://rfc.vac.dev/vac/raw/sds/#periodic-outgoing-buffer-sweep
141
279
  sweepOutgoingBuffer() {
@@ -166,32 +304,38 @@ export class MessageChannel {
166
304
  *
167
305
  * @param callback - A callback function that returns a boolean indicating whether the message was sent successfully.
168
306
  */
169
- sendSyncMessage(callback) {
307
+ async sendSyncMessage(callback) {
170
308
  this.lamportTimestamp++;
171
309
  const emptyMessage = new Uint8Array();
172
310
  const message = {
173
311
  messageId: MessageChannel.getMessageId(emptyMessage),
174
312
  channelId: this.channelId,
175
313
  lamportTimestamp: this.lamportTimestamp,
176
- causalHistory: this.messageIdLog
314
+ causalHistory: this.localHistory
177
315
  .slice(-this.causalHistorySize)
178
- .map(({ messageId }) => messageId),
316
+ .map(({ historyEntry }) => historyEntry),
179
317
  bloomFilter: this.filter.toBytes(),
180
318
  content: emptyMessage
181
319
  };
182
320
  if (callback) {
183
- return callback(message);
321
+ await callback(message);
322
+ this.safeDispatchEvent(MessageChannelEvent.SyncSent, {
323
+ detail: message
324
+ });
325
+ return true;
184
326
  }
185
- return Promise.resolve(false);
327
+ return false;
186
328
  }
187
329
  // See https://rfc.vac.dev/vac/raw/sds/#deliver-message
188
- deliverMessage(message) {
330
+ deliverMessage(message, retrievalHint) {
189
331
  const messageLamportTimestamp = message.lamportTimestamp ?? 0;
190
332
  if (messageLamportTimestamp > this.lamportTimestamp) {
191
333
  this.lamportTimestamp = messageLamportTimestamp;
192
334
  }
193
- if (message.content?.length === 0) {
335
+ if (message.content?.length === 0 ||
336
+ message.lamportTimestamp === undefined) {
194
337
  // Messages with empty content are sync messages.
338
+ // Messages with no timestamp are ephemeral messages.
195
339
  // They are not added to the local log or bloom filter.
196
340
  return;
197
341
  }
@@ -200,15 +344,18 @@ export class MessageChannel {
200
344
  // If one or more message IDs with the same Lamport timestamp already exists,
201
345
  // the participant MUST follow the Resolve Conflicts procedure.
202
346
  // https://rfc.vac.dev/vac/raw/sds/#resolve-conflicts
203
- this.messageIdLog.push({
347
+ this.localHistory.push({
204
348
  timestamp: messageLamportTimestamp,
205
- messageId: message.messageId
349
+ historyEntry: {
350
+ messageId: message.messageId,
351
+ retrievalHint
352
+ }
206
353
  });
207
- this.messageIdLog.sort((a, b) => {
354
+ this.localHistory.sort((a, b) => {
208
355
  if (a.timestamp !== b.timestamp) {
209
356
  return a.timestamp - b.timestamp;
210
357
  }
211
- return a.messageId.localeCompare(b.messageId);
358
+ return a.historyEntry.messageId.localeCompare(b.historyEntry.messageId);
212
359
  });
213
360
  }
214
361
  // For each received message (including sync messages), inspect the causal history and bloom filter
@@ -216,8 +363,16 @@ export class MessageChannel {
216
363
  // See https://rfc.vac.dev/vac/raw/sds/#review-ack-status
217
364
  reviewAckStatus(receivedMessage) {
218
365
  // the participant MUST mark all messages in the received causal_history as acknowledged.
219
- receivedMessage.causalHistory.forEach((messageId) => {
220
- this.outgoingBuffer = this.outgoingBuffer.filter((msg) => msg.messageId !== messageId);
366
+ receivedMessage.causalHistory.forEach(({ messageId }) => {
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
+ });
221
376
  this.acknowledgements.delete(messageId);
222
377
  if (!this.filter.lookup(messageId)) {
223
378
  this.filter.insert(messageId);
@@ -238,6 +393,12 @@ export class MessageChannel {
238
393
  const count = (this.acknowledgements.get(message.messageId) ?? 0) + 1;
239
394
  if (count < this.acknowledgementCount) {
240
395
  this.acknowledgements.set(message.messageId, count);
396
+ this.safeDispatchEvent(MessageChannelEvent.PartialAcknowledgement, {
397
+ detail: {
398
+ messageId: message.messageId,
399
+ count
400
+ }
401
+ });
241
402
  return true;
242
403
  }
243
404
  this.acknowledgements.delete(message.messageId);
@@ -249,4 +410,4 @@ export class MessageChannel {
249
410
  return 2;
250
411
  }
251
412
  }
252
- //# sourceMappingURL=sds.js.map
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.3-ff0222a.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":{"@noble/hashes":"^1.7.1","@waku/message-hash":"0.1.19-ff0222a.0","@waku/proto":"0.0.10-ff0222a.0","@waku/utils":"0.0.23-ff0222a.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
+ {"name":"@waku/sds","version":"0.0.4-006cd41.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-006cd41.0","@waku/proto":"0.0.11-006cd41.0","@waku/utils":"0.0.24-006cd41.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 "./nim_hashn/nim_hashn.mjs";
2
- import { getMOverNBitsForK } from "./probabilities.js";
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,3 +1,5 @@
1
- import { BloomFilter } from "./bloom.js";
1
+ import { BloomFilter } from "./bloom_filter/bloom.js";
2
+
3
+ export * from "./message_channel/index.js";
2
4
 
3
5
  export { BloomFilter };
@@ -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
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./command_queue.js";
2
+ export * from "./events.js";
3
+ export * from "./message_channel.js";