@simplito/privmx-webendpoint 2.5.2 → 2.6.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.
Files changed (73) hide show
  1. package/Types.d.ts +97 -1
  2. package/Types.js +102 -15
  3. package/api/ConnectionNative.d.ts +18 -2
  4. package/api/ConnectionNative.js +26 -7
  5. package/api/EventApiNative.d.ts +4 -3
  6. package/api/EventApiNative.js +7 -4
  7. package/api/InboxApiNative.d.ts +4 -5
  8. package/api/InboxApiNative.js +6 -9
  9. package/api/KvdbApiNative.d.ts +5 -5
  10. package/api/KvdbApiNative.js +8 -8
  11. package/api/StoreApiNative.d.ts +6 -7
  12. package/api/StoreApiNative.js +6 -9
  13. package/api/ThreadApiNative.d.ts +4 -5
  14. package/api/ThreadApiNative.js +6 -9
  15. package/assets/driver-web-context.js +1 -1
  16. package/assets/e2ee-worker.js +1 -0
  17. package/assets/endpoint-wasm-module.js +2 -19
  18. package/assets/endpoint-wasm-module.wasm +0 -0
  19. package/assets/privmx-endpoint-web.js +2 -0
  20. package/bundle/privmx-endpoint-web.js +1 -1
  21. package/extra/PrivmxClient.d.ts +9 -2
  22. package/extra/PrivmxClient.js +15 -1
  23. package/extra/__mocks__/constants.d.ts +63 -0
  24. package/extra/__mocks__/constants.js +51 -0
  25. package/extra/__mocks__/mockContainerSubscriber.d.ts +8 -0
  26. package/extra/__mocks__/mockContainerSubscriber.js +26 -0
  27. package/extra/{__tests__/__mocks__ → __mocks__}/mockEventQueue.d.ts +1 -3
  28. package/extra/{__tests__/__mocks__ → __mocks__}/mockEventQueue.js +6 -8
  29. package/extra/{__tests__/__mocks__ → __mocks__}/utils.d.ts +1 -1
  30. package/extra/{__tests__/__mocks__ → __mocks__}/utils.js +4 -5
  31. package/extra/__tests__/eventsManager.test.js +38 -27
  32. package/extra/__tests__/inboxEventManager.js +79 -0
  33. package/extra/__tests__/storeEventManager.test.js +48 -28
  34. package/extra/__tests__/threadEventManager.test.js +49 -29
  35. package/extra/events.d.ts +4 -217
  36. package/extra/events.js +25 -213
  37. package/extra/files.d.ts +2 -2
  38. package/extra/files.js +2 -2
  39. package/extra/inbox.js +1 -2
  40. package/extra/index.d.ts +3 -3
  41. package/extra/index.js +9 -10
  42. package/extra/managers.d.ts +98 -0
  43. package/extra/managers.js +157 -0
  44. package/extra/subscriptions.d.ts +165 -0
  45. package/extra/subscriptions.js +51 -0
  46. package/extra/utils.js +4 -5
  47. package/index.d.ts +2 -2
  48. package/index.js +2 -1
  49. package/package.json +12 -13
  50. package/service/Connection.d.ts +21 -2
  51. package/service/Connection.js +27 -2
  52. package/service/CryptoApi.d.ts +1 -1
  53. package/service/CryptoApi.js +1 -1
  54. package/service/EventApi.d.ts +14 -9
  55. package/service/EventApi.js +35 -10
  56. package/service/InboxApi.d.ts +14 -13
  57. package/service/InboxApi.js +42 -17
  58. package/service/KvdbApi.d.ts +19 -11
  59. package/service/KvdbApi.js +51 -17
  60. package/service/StoreApi.d.ts +18 -15
  61. package/service/StoreApi.js +48 -20
  62. package/service/ThreadApi.d.ts +14 -13
  63. package/service/ThreadApi.js +44 -19
  64. package/service/index.d.ts +2 -1
  65. package/service/index.js +3 -1
  66. package/extra/__tests__/__mocks__/constants.d.ts +0 -36
  67. package/extra/__tests__/__mocks__/constants.js +0 -42
  68. package/extra/__tests__/__mocks__/mockContainerSubscriber.d.ts +0 -12
  69. package/extra/__tests__/__mocks__/mockContainerSubscriber.js +0 -25
  70. package/extra/__tests__/__mocks__/mockEventAPIs.d.ts +0 -30
  71. package/extra/__tests__/__mocks__/mockEventAPIs.js +0 -70
  72. package/extra/__tests__/inboxEventManager.test.js +0 -56
  73. /package/extra/__tests__/{inboxEventManager.test.d.ts → inboxEventManager.d.ts} +0 -0
package/extra/events.js CHANGED
@@ -1,219 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EventManager = exports.ConnectionEventsManager = exports.InboxEventsManager = exports.StoreEventsManager = exports.ThreadEventsManager = exports.BaseEventManager = void 0;
4
- class BaseEventManager {
5
- _listeners; // event tag - "event@channel"
6
- get listeners() {
7
- return this._listeners;
8
- }
9
- channels;
10
- constructor() {
11
- this._listeners = new Map();
12
- this.channels = new Set();
13
- }
14
- /**
15
- * Checks whether the user is subscribed to given channel
16
- * @param channel Channel
17
- * @returns {boolean} `boolean`
18
- */
19
- isSubscribedToChannel(channel) {
20
- return this.channels.has(channel);
21
- }
22
- hasEventsOnChannel(channel) {
23
- return (Array.from(this._listeners.keys()).findIndex((listenerTag) => listenerTag.split('@')[1] === channel) !== -1);
24
- }
25
- /**
26
- * Removes an event listeners from given `channel` and `eventType`
27
- * @param {Channel} channel channel
28
- * @param {string} eventType type of the event
29
- * @param {function} callback callback function
30
- */
31
- removeEventListener = (channel, eventType, callback) => {
32
- const eventTag = `${eventType}@${channel}`;
33
- if (this._listeners.has(eventTag)) {
34
- const channelCallbacks = this._listeners.get(eventTag);
35
- const newCallback = channelCallbacks.filter((cb) => cb !== callback);
36
- if (newCallback.length === 0) {
37
- this._listeners.delete(eventTag);
38
- }
39
- else {
40
- this._listeners.set(eventTag, newCallback);
41
- }
42
- if (!this.hasEventsOnChannel(channel)) {
43
- this.channels.delete(channel);
44
- }
45
- }
46
- };
47
- /**
48
- * Removes all listeners from given channel
49
- * @param {Channel} channel channel
50
- * @returns {void}
51
- */
52
- removeChannelEvents = (channel) => {
53
- const listenersToRemove = Array.from(this._listeners.keys()).filter((listenerTag) => listenerTag.split('@')[1] === channel);
54
- listenersToRemove.forEach((listenerTag) => {
55
- this._listeners.delete(listenerTag);
56
- });
57
- };
58
- dispatchEvent(event) {
59
- if (event.type == 'libConnected' ||
60
- event.type == 'libDisconnected' ||
61
- event.type == 'libPlatformDisconnected') {
62
- event.channel = `connection/${event.connectionId}`;
63
- }
64
- const eventTag = `${event.type}@${event.channel}`;
65
- if (this._listeners.has(eventTag)) {
66
- const callbacks = this._listeners.get(eventTag);
67
- if (callbacks) {
68
- callbacks.forEach((callback) => callback(event));
69
- }
70
- }
71
- }
72
- /**
73
- * Add an event listeners on given channel and eventType
74
- * @param {Channel} channel channel
75
- * @param {string} eventType type of the event
76
- * @param {function} callback callback function
77
- * @returns {function} function to remove the event listeners
78
- */
79
- addEventListener = (channel, eventType, callback) => {
80
- const eventTag = `${eventType}@${channel}`;
81
- if (this._listeners.has(eventTag)) {
82
- this._listeners.get(eventTag).push(callback);
83
- }
84
- else {
85
- this._listeners.set(eventTag, [callback]);
86
- }
87
- this.channels.add(channel);
88
- return () => {
89
- this.removeEventListener(channel, eventType, callback);
90
- };
91
- };
92
- addContainerListener = async (channel, eventType, callback) => {
93
- if (!this.isSubscribedToChannel(channel)) {
94
- await this.subscribeForModuleEvents();
95
- }
96
- const removeListener = this.addEventListener(channel, eventType, callback);
97
- return async () => {
98
- removeListener();
99
- if (!this.hasEventsOnChannel(channel)) {
100
- await this.unsubscribeFromModuleEvents();
101
- }
102
- };
103
- };
104
- addContainerElementListener = async (containerId, channel, eventType, callback) => {
105
- if (!this.isSubscribedToChannel(channel)) {
106
- await this.subscribeForModuleElementsEvents(containerId);
107
- }
108
- const removeListener = this.addEventListener(channel, eventType, callback);
109
- return async () => {
110
- removeListener();
111
- if (!this.hasEventsOnChannel(channel)) {
112
- await this.unsubscribeFromModuleElementsEvents(containerId);
113
- }
114
- };
115
- };
116
- }
117
- exports.BaseEventManager = BaseEventManager;
118
- class ThreadEventsManager extends BaseEventManager {
119
- threadApi;
120
- constructor(threadApi) {
121
- super();
122
- this.threadApi = threadApi;
123
- }
124
- subscribeForModuleEvents() {
125
- return this.threadApi.subscribeForThreadEvents();
126
- }
127
- subscribeForModuleElementsEvents(id) {
128
- return this.threadApi.subscribeForMessageEvents(id);
129
- }
130
- unsubscribeFromModuleEvents() {
131
- return this.threadApi.unsubscribeFromThreadEvents();
132
- }
133
- unsubscribeFromModuleElementsEvents(id) {
134
- return this.threadApi.unsubscribeFromMessageEvents(id);
135
- }
136
- async onThreadEvent(handler) {
137
- const channel = 'thread';
138
- return this.addContainerListener(channel, handler.event, handler.callback);
139
- }
140
- async onMessageEvent(threadId, handler) {
141
- const channel = `thread/${threadId}/messages`;
142
- return this.addContainerElementListener(threadId, channel, handler.event, handler.callback);
143
- }
144
- }
145
- exports.ThreadEventsManager = ThreadEventsManager;
146
- class StoreEventsManager extends BaseEventManager {
147
- storeApi;
148
- constructor(storeApi) {
149
- super();
150
- this.storeApi = storeApi;
151
- }
152
- subscribeForModuleEvents() { return this.storeApi.subscribeForStoreEvents(); }
153
- subscribeForModuleElementsEvents(id) { return this.storeApi.subscribeForFileEvents(id); }
154
- unsubscribeFromModuleEvents() { return this.storeApi.unsubscribeFromStoreEvents(); }
155
- unsubscribeFromModuleElementsEvents(id) { return this.storeApi.unsubscribeFromFileEvents(id); }
156
- async onStoreEvent(handler) {
157
- const channel = 'store';
158
- return this.addContainerListener(channel, handler.event, handler.callback);
159
- }
160
- async onFileEvent(storeId, handler) {
161
- const channel = `store/${storeId}/files`;
162
- return this.addContainerElementListener(storeId, channel, handler.event, handler.callback);
163
- }
164
- }
165
- exports.StoreEventsManager = StoreEventsManager;
166
- class InboxEventsManager extends BaseEventManager {
167
- inboxApi;
168
- constructor(inboxApi) {
169
- super();
170
- this.inboxApi = inboxApi;
171
- }
172
- subscribeForModuleEvents() { return this.inboxApi.subscribeForInboxEvents(); }
173
- subscribeForModuleElementsEvents(id) { return this.inboxApi.subscribeForEntryEvents(id); }
174
- unsubscribeFromModuleEvents() { return this.inboxApi.unsubscribeFromInboxEvents(); }
175
- unsubscribeFromModuleElementsEvents(id) { return this.inboxApi.unsubscribeFromEntryEvents(id); }
176
- async onInboxEvent(handler) {
177
- const channel = 'inbox';
178
- return this.addContainerListener(channel, handler.event, handler.callback);
179
- }
180
- async onEntryEvent(inboxId, handler) {
181
- const channel = `inbox/${inboxId}/entries`;
182
- return this.addContainerElementListener(inboxId, channel, handler.event, handler.callback);
3
+ exports.EventManager = void 0;
4
+ const subscriptions_1 = require("./subscriptions");
5
+ const managers_1 = require("./managers");
6
+ function normalizeConnectionEvent(e) {
7
+ switch (e.type) {
8
+ case 'libDisconnected':
9
+ return { ...e, subscriptions: [`${e.connectionId}/${managers_1.ConnectionChannels[subscriptions_1.ConnectionEventType.LIB_DISCONNECTED]}`] };
10
+ case 'libPlatformDisconnected':
11
+ return { ...e, subscriptions: [`${e.connectionId}/${managers_1.ConnectionChannels[subscriptions_1.ConnectionEventType.LIB_PLATFORM_DISCONNECTED]}`] };
12
+ case 'libConnected':
13
+ return { ...e, subscriptions: [`${e.connectionId}/${managers_1.ConnectionChannels[subscriptions_1.ConnectionEventType.LIB_CONNECTED]}`] };
14
+ default:
15
+ return e;
183
16
  }
184
17
  }
185
- exports.InboxEventsManager = InboxEventsManager;
186
- class ConnectionEventsManager extends BaseEventManager {
187
- connectionId;
188
- //Connection events don't have subscribe functions
189
- subscribeForModuleEvents() {
190
- return new Promise((resolve) => resolve());
191
- }
192
- subscribeForModuleElementsEvents() {
193
- return new Promise((resolve) => resolve());
194
- }
195
- unsubscribeFromModuleEvents() {
196
- return new Promise((resolve) => resolve());
197
- }
198
- unsubscribeFromModuleElementsEvents() {
199
- return new Promise((resolve) => resolve());
200
- }
201
- constructor(connectionId) {
202
- super();
203
- this.connectionId = connectionId;
204
- }
205
- async onConnectionEvent(handler) {
206
- const channel = `connection/${this.connectionId}`;
207
- const removeListener = this.addContainerListener(channel, handler.event, handler.callback);
208
- return removeListener;
209
- }
210
- }
211
- exports.ConnectionEventsManager = ConnectionEventsManager;
212
18
  class EventManager {
213
19
  _isEventLoopRunning = false;
214
20
  dispatchers = [];
215
21
  eventsQueue = null;
216
- constructor() { }
22
+ constructor() {
23
+ }
217
24
  listenForEvents() {
218
25
  if (this.eventsQueue) {
219
26
  this.eventsQueue.waitEvent().then((event) => {
@@ -241,28 +48,33 @@ class EventManager {
241
48
  this.dispatchers = [];
242
49
  };
243
50
  onEvent(event) {
244
- this.dispatchers.forEach((cb) => cb(event));
51
+ this.dispatchers.forEach((cb) => cb(normalizeConnectionEvent(event)));
245
52
  }
246
53
  registerDispatcher(manager) {
247
54
  this.dispatchers.push((e) => manager.dispatchEvent(e));
248
55
  }
249
56
  getThreadEventManager(threadApi) {
250
- const manager = new ThreadEventsManager(threadApi);
57
+ const manager = new managers_1.ThreadEventsManager(threadApi);
251
58
  this.registerDispatcher(manager);
252
59
  return manager;
253
60
  }
254
61
  getStoreEventManager(storeApi) {
255
- const manager = new StoreEventsManager(storeApi);
62
+ const manager = new managers_1.StoreEventsManager(storeApi);
63
+ this.registerDispatcher(manager);
64
+ return manager;
65
+ }
66
+ getKvdbEventManager(kvdbApi) {
67
+ const manager = new managers_1.KvdbEventsManager(kvdbApi);
256
68
  this.registerDispatcher(manager);
257
69
  return manager;
258
70
  }
259
71
  getInboxEventManager(inboxApi) {
260
- const manager = new InboxEventsManager(inboxApi);
72
+ const manager = new managers_1.InboxEventsManager(inboxApi);
261
73
  this.registerDispatcher(manager);
262
74
  return manager;
263
75
  }
264
76
  getConnectionEventManager(connectionId) {
265
- const manager = new ConnectionEventsManager(connectionId);
77
+ const manager = new managers_1.ConnectionEventsManager(connectionId);
266
78
  this.registerDispatcher(manager);
267
79
  return manager;
268
80
  }
package/extra/files.d.ts CHANGED
@@ -22,9 +22,9 @@ export declare class StreamReader {
22
22
  *
23
23
  * @returns {Promise<boolean>} A promise that resolves to true if there are more chunks to read, or false if the end of the file is reached.
24
24
  */
25
- [Symbol.asyncIterator](): AsyncGenerator<readonly [Uint8Array, number], void, unknown>;
25
+ [Symbol.asyncIterator](): AsyncGenerator<readonly [Uint8Array<ArrayBufferLike>, number], void, unknown>;
26
26
  readNextChunk(): Promise<Uint8Array>;
27
- getFileContent(): Promise<Uint8Array>;
27
+ getFileContent(): Promise<Uint8Array<ArrayBuffer>>;
28
28
  /**
29
29
  * Aborts the reading process and closes the file handle.
30
30
  *
package/extra/files.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.downloadFile = exports.FileUploader = exports.StreamReader = exports.FILE_DEFAULT_CHUNK_SIZE = void 0;
3
+ exports.FileUploader = exports.StreamReader = exports.FILE_DEFAULT_CHUNK_SIZE = void 0;
4
+ exports.downloadFile = downloadFile;
4
5
  exports.FILE_DEFAULT_CHUNK_SIZE = 1_048_576;
5
6
  class StreamReader {
6
7
  _handle;
@@ -213,4 +214,3 @@ async function downloadFile(api, fileId, targetFileName) {
213
214
  reader.readAsDataURL(new Blob([fileBuffer]));
214
215
  }
215
216
  }
216
- exports.downloadFile = downloadFile;
package/extra/inbox.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sendEntry = void 0;
3
+ exports.sendEntry = sendEntry;
4
4
  const files_1 = require("./files");
5
5
  /**
6
6
  * Sends an entry to the specified inbox.
@@ -32,4 +32,3 @@ async function sendEntry(inboxApi, inboxId, payload) {
32
32
  await Promise.all(uploaders.map((uploader) => uploader.uploadFileContent()));
33
33
  await inboxApi.sendEntry(inboxEntryHandle);
34
34
  }
35
- exports.sendEntry = sendEntry;
package/extra/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import * as Files from './files';
2
- import * as Events from './events';
3
- import { EventManager, ThreadEventsManager, StoreEventsManager, InboxEventsManager, BaseEventManager, ConnectionEventsManager, Channel, EventPayload, GenericEvent } from './events';
4
2
  import * as Utils from './utils';
5
3
  import * as Generics from './generics';
6
4
  import * as Inboxes from './inbox';
7
5
  import { FileUploader, StreamReader, downloadFile } from './files';
8
6
  import { PrivmxClient } from './PrivmxClient';
9
7
  import { PublicConnection } from './PublicConnection';
10
- export { Files, Inboxes, Events, Utils, Generics, FileUploader, downloadFile, EventManager, ThreadEventsManager, StoreEventsManager, InboxEventsManager, BaseEventManager, StreamReader, PrivmxClient, PublicConnection, Channel, ConnectionEventsManager, EventPayload, GenericEvent, };
8
+ export { EventManager } from "./events";
9
+ export { createInboxSubscription, createThreadSubscription, createConnectionSubscription, createKvdbSubscription, createStoreSubscription, EventCallback, Subscription } from "./subscriptions";
10
+ export { Files, Inboxes, Utils, Generics, FileUploader, downloadFile, StreamReader, PrivmxClient, PublicConnection, };
package/extra/index.js CHANGED
@@ -1,17 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ConnectionEventsManager = exports.PublicConnection = exports.PrivmxClient = exports.StreamReader = exports.BaseEventManager = exports.InboxEventsManager = exports.StoreEventsManager = exports.ThreadEventsManager = exports.EventManager = exports.downloadFile = exports.FileUploader = exports.Generics = exports.Utils = exports.Events = exports.Inboxes = exports.Files = void 0;
3
+ exports.PublicConnection = exports.PrivmxClient = exports.StreamReader = exports.downloadFile = exports.FileUploader = exports.Generics = exports.Utils = exports.Inboxes = exports.Files = exports.createStoreSubscription = exports.createKvdbSubscription = exports.createConnectionSubscription = exports.createThreadSubscription = exports.createInboxSubscription = exports.EventManager = void 0;
4
4
  const Files = require("./files");
5
5
  exports.Files = Files;
6
- const Events = require("./events");
7
- exports.Events = Events;
8
- const events_1 = require("./events");
9
- Object.defineProperty(exports, "EventManager", { enumerable: true, get: function () { return events_1.EventManager; } });
10
- Object.defineProperty(exports, "ThreadEventsManager", { enumerable: true, get: function () { return events_1.ThreadEventsManager; } });
11
- Object.defineProperty(exports, "StoreEventsManager", { enumerable: true, get: function () { return events_1.StoreEventsManager; } });
12
- Object.defineProperty(exports, "InboxEventsManager", { enumerable: true, get: function () { return events_1.InboxEventsManager; } });
13
- Object.defineProperty(exports, "BaseEventManager", { enumerable: true, get: function () { return events_1.BaseEventManager; } });
14
- Object.defineProperty(exports, "ConnectionEventsManager", { enumerable: true, get: function () { return events_1.ConnectionEventsManager; } });
15
6
  const Utils = require("./utils");
16
7
  exports.Utils = Utils;
17
8
  const Generics = require("./generics");
@@ -26,3 +17,11 @@ const PrivmxClient_1 = require("./PrivmxClient");
26
17
  Object.defineProperty(exports, "PrivmxClient", { enumerable: true, get: function () { return PrivmxClient_1.PrivmxClient; } });
27
18
  const PublicConnection_1 = require("./PublicConnection");
28
19
  Object.defineProperty(exports, "PublicConnection", { enumerable: true, get: function () { return PublicConnection_1.PublicConnection; } });
20
+ var events_1 = require("./events");
21
+ Object.defineProperty(exports, "EventManager", { enumerable: true, get: function () { return events_1.EventManager; } });
22
+ var subscriptions_1 = require("./subscriptions");
23
+ Object.defineProperty(exports, "createInboxSubscription", { enumerable: true, get: function () { return subscriptions_1.createInboxSubscription; } });
24
+ Object.defineProperty(exports, "createThreadSubscription", { enumerable: true, get: function () { return subscriptions_1.createThreadSubscription; } });
25
+ Object.defineProperty(exports, "createConnectionSubscription", { enumerable: true, get: function () { return subscriptions_1.createConnectionSubscription; } });
26
+ Object.defineProperty(exports, "createKvdbSubscription", { enumerable: true, get: function () { return subscriptions_1.createKvdbSubscription; } });
27
+ Object.defineProperty(exports, "createStoreSubscription", { enumerable: true, get: function () { return subscriptions_1.createStoreSubscription; } });
@@ -0,0 +1,98 @@
1
+ import { Types } from "..";
2
+ import { ConnectionEventType, EventCallback, SubscriberForInboxEvents, SubscriberForKvdbEvents, SubscriberForStoreEvents, SubscriberForThreadsEvents, Subscription } from "./subscriptions";
3
+ /**
4
+ *
5
+ * General usage
6
+ *
7
+ * const fn1 = () =>{}
8
+ * const fn2 = () =>{}
9
+ *
10
+ * const fn3 = () =>{}
11
+ *
12
+ *
13
+ * const subscriptionA = createSubscription({
14
+ * type: Types.ThreadEventType.THREAD_CREATE,
15
+ * selector: Types.ThreadEventSelectorType.THREAD_CONTAINER,
16
+ * selectorId: "s0dvos0div0smidvmsd"
17
+ * callbacks: [fn1,fn2]
18
+ * })
19
+ *
20
+ * const subscriptionB = createThreadSubscribtion({
21
+ * type: Types.ThreadEventType.MESSAGE_CREATED,
22
+ * selector: Types.ThreadEventSelectorType.CONTEXT_CONTAINER,
23
+ * selectorId: "s0dvos0div0smidvmsd"
24
+ * callbacks: [fn3]
25
+ * })
26
+ *
27
+ * await manager.subscribeFor([subscriptionA, subscriptionB])
28
+ *
29
+ *
30
+ * await manager.unsubscribeFrom(subscriptionB)
31
+ *
32
+ * --- or ---
33
+ *
34
+ * await manager.removeCallback(subscriptionA.callbacks[0])
35
+ */
36
+ export type Channel = "inbox" | `inbox/${string}/entries` | "store" | `store/${string}/files` | "thread" | `thread/${string}/messages` | `connection/${string}`;
37
+ export interface GenericEvent<K> extends Types.Event {
38
+ /**
39
+ * Data associated with the event.
40
+ */
41
+ data: K;
42
+ }
43
+ export declare abstract class BaseEventDispatcherManager {
44
+ private _listenersSymbols;
45
+ private _listeners;
46
+ get listeners(): Map<string, EventCallback[]>;
47
+ protected abstract apiSubscribeFor(strings: string[]): Promise<string[]>;
48
+ protected abstract apiUnsubscribeFrom(strings: string[]): Promise<void>;
49
+ dispatchEvent(event: Types.Event): void;
50
+ unregisterCallback(symbol: Symbol): void;
51
+ protected prepareSubscription(channelList: string[], subscriptions: {
52
+ callbacks: EventCallback[];
53
+ }[]): Promise<string[]>;
54
+ unsubscribeFrom(subscriptionsId: string[]): Promise<void>;
55
+ }
56
+ export declare class ThreadEventsManager extends BaseEventDispatcherManager {
57
+ private threadApi;
58
+ constructor(threadApi: SubscriberForThreadsEvents);
59
+ protected apiSubscribeFor(channels: string[]): Promise<string[]>;
60
+ protected apiUnsubscribeFrom(subscriptionId: string[]): Promise<void>;
61
+ subscribeFor(subscriptions: Subscription<Types.ThreadEventType, Types.ThreadEventSelectorType>[]): Promise<string[]>;
62
+ }
63
+ export declare class StoreEventsManager extends BaseEventDispatcherManager {
64
+ private storeApi;
65
+ constructor(storeApi: SubscriberForStoreEvents);
66
+ protected apiSubscribeFor(channels: string[]): Promise<string[]>;
67
+ protected apiUnsubscribeFrom(subscriptionId: string[]): Promise<void>;
68
+ subscribeFor(subscriptions: Subscription<Types.StoreEventType, Types.StoreEventSelectorType>[]): Promise<string[]>;
69
+ }
70
+ export declare class InboxEventsManager extends BaseEventDispatcherManager {
71
+ private inboxApi;
72
+ constructor(inboxApi: SubscriberForInboxEvents);
73
+ protected apiSubscribeFor(channels: string[]): Promise<string[]>;
74
+ protected apiUnsubscribeFrom(subscriptionId: string[]): Promise<void>;
75
+ subscribeFor(subscriptions: Subscription<Types.InboxEventType, Types.InboxEventSelectorType>[]): Promise<string[]>;
76
+ }
77
+ export declare class KvdbEventsManager extends BaseEventDispatcherManager {
78
+ private kvdbApi;
79
+ constructor(kvdbApi: SubscriberForKvdbEvents);
80
+ protected apiSubscribeFor(channels: string[]): Promise<string[]>;
81
+ protected apiUnsubscribeFrom(subscriptionId: string[]): Promise<void>;
82
+ subscribeFor(subscriptions: Subscription<Types.KvdbEventType, Types.KvdbEventSelectorType>[]): Promise<string[]>;
83
+ }
84
+ export declare const ConnectionChannels: {
85
+ 2: string;
86
+ 0: string;
87
+ 1: string;
88
+ };
89
+ export declare class ConnectionEventsManager extends BaseEventDispatcherManager {
90
+ private connectionId;
91
+ constructor(connectionId: string);
92
+ protected apiSubscribeFor(channels: string[]): Promise<string[]>;
93
+ protected apiUnsubscribeFrom(): Promise<void>;
94
+ subscribeFor(subscriptions: {
95
+ type: ConnectionEventType;
96
+ callbacks: EventCallback[];
97
+ }[]): Promise<string[]>;
98
+ }
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConnectionEventsManager = exports.ConnectionChannels = exports.KvdbEventsManager = exports.InboxEventsManager = exports.StoreEventsManager = exports.ThreadEventsManager = exports.BaseEventDispatcherManager = void 0;
4
+ const subscriptions_1 = require("./subscriptions");
5
+ class BaseEventDispatcherManager {
6
+ _listenersSymbols = new Map();
7
+ _listeners = new Map();
8
+ get listeners() {
9
+ return this._listeners;
10
+ }
11
+ dispatchEvent(event) {
12
+ const callbacks = event.subscriptions.flatMap((s) => this._listeners.get(s));
13
+ for (const listener of callbacks) {
14
+ listener.callback(event);
15
+ }
16
+ }
17
+ unregisterCallback(symbol) {
18
+ this._listenersSymbols.delete(symbol);
19
+ for (const keys of this._listeners.keys()) {
20
+ const listeners = this._listeners.get(keys);
21
+ if (listeners) {
22
+ this._listeners.set(keys, listeners.filter((x) => x.symbol !== symbol));
23
+ if (this._listeners.get(keys).length === 0) {
24
+ this._listeners.delete(keys);
25
+ }
26
+ }
27
+ }
28
+ }
29
+ async prepareSubscription(channelList, subscriptions) {
30
+ const subscriptionIds = await this.apiSubscribeFor(channelList);
31
+ subscriptionIds.forEach((id, i) => {
32
+ const subscription = subscriptions[i];
33
+ this._listeners.set(id, subscription.callbacks);
34
+ for (const cb of subscription.callbacks) {
35
+ this._listenersSymbols.set(cb.symbol, id);
36
+ }
37
+ return subscription;
38
+ });
39
+ return subscriptionIds;
40
+ }
41
+ async unsubscribeFrom(subscriptionsId) {
42
+ for (const subscriptionId of subscriptionsId) {
43
+ for (const [key, callbackSubscription,] of this._listenersSymbols.entries()) {
44
+ if (callbackSubscription === subscriptionId) {
45
+ this.unregisterCallback(key);
46
+ }
47
+ }
48
+ }
49
+ return this.apiUnsubscribeFrom(subscriptionsId);
50
+ }
51
+ }
52
+ exports.BaseEventDispatcherManager = BaseEventDispatcherManager;
53
+ class ThreadEventsManager extends BaseEventDispatcherManager {
54
+ threadApi;
55
+ constructor(threadApi) {
56
+ super();
57
+ this.threadApi = threadApi;
58
+ }
59
+ apiSubscribeFor(channels) {
60
+ return this.threadApi.subscribeFor(channels);
61
+ }
62
+ apiUnsubscribeFrom(subscriptionId) {
63
+ return this.threadApi.unsubscribeFrom(subscriptionId);
64
+ }
65
+ async subscribeFor(subscriptions) {
66
+ const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
67
+ return this.threadApi.buildSubscriptionQuery(s.type, s.selector, s.id);
68
+ }));
69
+ return this.prepareSubscription(subscriptionChannels, subscriptions);
70
+ }
71
+ }
72
+ exports.ThreadEventsManager = ThreadEventsManager;
73
+ class StoreEventsManager extends BaseEventDispatcherManager {
74
+ storeApi;
75
+ constructor(storeApi) {
76
+ super();
77
+ this.storeApi = storeApi;
78
+ }
79
+ apiSubscribeFor(channels) {
80
+ return this.storeApi.subscribeFor(channels);
81
+ }
82
+ apiUnsubscribeFrom(subscriptionId) {
83
+ return this.storeApi.unsubscribeFrom(subscriptionId);
84
+ }
85
+ async subscribeFor(subscriptions) {
86
+ const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
87
+ return this.storeApi.buildSubscriptionQuery(s.type, s.selector, s.id);
88
+ }));
89
+ return this.prepareSubscription(subscriptionChannels, subscriptions);
90
+ }
91
+ }
92
+ exports.StoreEventsManager = StoreEventsManager;
93
+ class InboxEventsManager extends BaseEventDispatcherManager {
94
+ inboxApi;
95
+ constructor(inboxApi) {
96
+ super();
97
+ this.inboxApi = inboxApi;
98
+ }
99
+ apiSubscribeFor(channels) {
100
+ return this.inboxApi.subscribeFor(channels);
101
+ }
102
+ apiUnsubscribeFrom(subscriptionId) {
103
+ return this.inboxApi.unsubscribeFrom(subscriptionId);
104
+ }
105
+ async subscribeFor(subscriptions) {
106
+ const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
107
+ return this.inboxApi.buildSubscriptionQuery(s.type, s.selector, s.id);
108
+ }));
109
+ return this.prepareSubscription(subscriptionChannels, subscriptions);
110
+ }
111
+ }
112
+ exports.InboxEventsManager = InboxEventsManager;
113
+ class KvdbEventsManager extends BaseEventDispatcherManager {
114
+ kvdbApi;
115
+ constructor(kvdbApi) {
116
+ super();
117
+ this.kvdbApi = kvdbApi;
118
+ }
119
+ apiSubscribeFor(channels) {
120
+ return this.kvdbApi.subscribeFor(channels);
121
+ }
122
+ apiUnsubscribeFrom(subscriptionId) {
123
+ return this.kvdbApi.unsubscribeFrom(subscriptionId);
124
+ }
125
+ async subscribeFor(subscriptions) {
126
+ const subscriptionChannels = await Promise.all(subscriptions.map((s) => {
127
+ return this.kvdbApi.buildSubscriptionQuery(s.type, s.selector, s.id);
128
+ }));
129
+ return this.prepareSubscription(subscriptionChannels, subscriptions);
130
+ }
131
+ }
132
+ exports.KvdbEventsManager = KvdbEventsManager;
133
+ exports.ConnectionChannels = {
134
+ [subscriptions_1.ConnectionEventType.LIB_CONNECTED]: "channel/lib_connected",
135
+ [subscriptions_1.ConnectionEventType.LIB_DISCONNECTED]: "channel/lib_disconnected",
136
+ [subscriptions_1.ConnectionEventType.LIB_PLATFORM_DISCONNECTED]: "channel/lib_platform_disconnected",
137
+ };
138
+ class ConnectionEventsManager extends BaseEventDispatcherManager {
139
+ connectionId;
140
+ constructor(connectionId) {
141
+ super();
142
+ this.connectionId = connectionId;
143
+ }
144
+ apiSubscribeFor(channels) {
145
+ return Promise.resolve(channels);
146
+ }
147
+ apiUnsubscribeFrom() {
148
+ return Promise.resolve();
149
+ }
150
+ async subscribeFor(subscriptions) {
151
+ const subscriptionChannels = subscriptions.map((x) => {
152
+ return `${this.connectionId}/${subscriptions_1.ConnectionEventType[x.type]}`;
153
+ });
154
+ return this.prepareSubscription(subscriptionChannels, subscriptions);
155
+ }
156
+ }
157
+ exports.ConnectionEventsManager = ConnectionEventsManager;