@bsv/message-box-client 1.1.7 → 1.1.8

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 (78) hide show
  1. package/dist/cjs/mod.js +20 -0
  2. package/dist/cjs/mod.js.map +1 -0
  3. package/dist/cjs/package.json +69 -0
  4. package/dist/cjs/src/MessageBoxClient.js +1171 -0
  5. package/dist/cjs/src/MessageBoxClient.js.map +1 -0
  6. package/dist/cjs/src/PeerPayClient.js +309 -0
  7. package/dist/cjs/src/PeerPayClient.js.map +1 -0
  8. package/dist/cjs/src/Utils/logger.js +27 -0
  9. package/dist/cjs/src/Utils/logger.js.map +1 -0
  10. package/dist/cjs/src/__tests/MessageBoxClient.test.js +614 -0
  11. package/dist/cjs/src/__tests/MessageBoxClient.test.js.map +1 -0
  12. package/dist/cjs/src/__tests/PeerPayClientUnit.test.js +213 -0
  13. package/dist/cjs/src/__tests/PeerPayClientUnit.test.js.map +1 -0
  14. package/dist/cjs/src/__tests/integration/integrationEncrypted.test.js +84 -0
  15. package/dist/cjs/src/__tests/integration/integrationEncrypted.test.js.map +1 -0
  16. package/dist/cjs/src/__tests/integration/integrationHTTP.test.js +128 -0
  17. package/dist/cjs/src/__tests/integration/integrationHTTP.test.js.map +1 -0
  18. package/dist/cjs/src/__tests/integration/integrationOverlay.test.js +138 -0
  19. package/dist/cjs/src/__tests/integration/integrationOverlay.test.js.map +1 -0
  20. package/dist/cjs/src/__tests/integration/integrationWS.test.js +123 -0
  21. package/dist/cjs/src/__tests/integration/integrationWS.test.js.map +1 -0
  22. package/dist/cjs/src/__tests/integration/testServer.js +65 -0
  23. package/dist/cjs/src/__tests/integration/testServer.js.map +1 -0
  24. package/dist/cjs/src/types.js +3 -0
  25. package/dist/cjs/src/types.js.map +1 -0
  26. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  27. package/dist/esm/mod.js +4 -0
  28. package/dist/esm/mod.js.map +1 -0
  29. package/dist/esm/src/MessageBoxClient.js +1165 -0
  30. package/dist/esm/src/MessageBoxClient.js.map +1 -0
  31. package/dist/esm/src/PeerPayClient.js +307 -0
  32. package/dist/esm/src/PeerPayClient.js.map +1 -0
  33. package/dist/esm/src/Utils/logger.js +23 -0
  34. package/dist/esm/src/Utils/logger.js.map +1 -0
  35. package/dist/esm/src/__tests/MessageBoxClient.test.js +603 -0
  36. package/dist/esm/src/__tests/MessageBoxClient.test.js.map +1 -0
  37. package/dist/esm/src/__tests/PeerPayClientUnit.test.js +211 -0
  38. package/dist/esm/src/__tests/PeerPayClientUnit.test.js.map +1 -0
  39. package/dist/esm/src/__tests/integration/integrationEncrypted.test.js +81 -0
  40. package/dist/esm/src/__tests/integration/integrationEncrypted.test.js.map +1 -0
  41. package/dist/esm/src/__tests/integration/integrationHTTP.test.js +126 -0
  42. package/dist/esm/src/__tests/integration/integrationHTTP.test.js.map +1 -0
  43. package/dist/esm/src/__tests/integration/integrationOverlay.test.js +135 -0
  44. package/dist/esm/src/__tests/integration/integrationOverlay.test.js.map +1 -0
  45. package/dist/esm/src/__tests/integration/integrationWS.test.js +121 -0
  46. package/dist/esm/src/__tests/integration/integrationWS.test.js.map +1 -0
  47. package/dist/esm/src/__tests/integration/testServer.js +61 -0
  48. package/dist/esm/src/__tests/integration/testServer.js.map +1 -0
  49. package/dist/esm/src/types.js +2 -0
  50. package/dist/esm/src/types.js.map +1 -0
  51. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  52. package/dist/types/mod.d.ts +4 -0
  53. package/dist/types/mod.d.ts.map +1 -0
  54. package/dist/types/src/MessageBoxClient.d.ts +441 -0
  55. package/dist/types/src/MessageBoxClient.d.ts.map +1 -0
  56. package/dist/types/src/PeerPayClient.d.ts +144 -0
  57. package/dist/types/src/PeerPayClient.d.ts.map +1 -0
  58. package/dist/types/src/Utils/logger.d.ts +9 -0
  59. package/dist/types/src/Utils/logger.d.ts.map +1 -0
  60. package/dist/types/src/__tests/MessageBoxClient.test.d.ts +2 -0
  61. package/dist/types/src/__tests/MessageBoxClient.test.d.ts.map +1 -0
  62. package/dist/types/src/__tests/PeerPayClientUnit.test.d.ts +2 -0
  63. package/dist/types/src/__tests/PeerPayClientUnit.test.d.ts.map +1 -0
  64. package/dist/types/src/__tests/integration/integrationEncrypted.test.d.ts +2 -0
  65. package/dist/types/src/__tests/integration/integrationEncrypted.test.d.ts.map +1 -0
  66. package/dist/types/src/__tests/integration/integrationHTTP.test.d.ts +2 -0
  67. package/dist/types/src/__tests/integration/integrationHTTP.test.d.ts.map +1 -0
  68. package/dist/types/src/__tests/integration/integrationOverlay.test.d.ts +2 -0
  69. package/dist/types/src/__tests/integration/integrationOverlay.test.d.ts.map +1 -0
  70. package/dist/types/src/__tests/integration/integrationWS.test.d.ts +2 -0
  71. package/dist/types/src/__tests/integration/integrationWS.test.d.ts.map +1 -0
  72. package/dist/types/src/__tests/integration/testServer.d.ts +9 -0
  73. package/dist/types/src/__tests/integration/testServer.d.ts.map +1 -0
  74. package/dist/types/src/types.d.ts +99 -0
  75. package/dist/types/src/types.d.ts.map +1 -0
  76. package/dist/types/tsconfig.types.tsbuildinfo +1 -0
  77. package/dist/umd/bundle.js +1 -0
  78. package/package.json +5 -5
@@ -0,0 +1,603 @@
1
+ /* eslint-env jest */
2
+ import { MessageBoxClient } from '../MessageBoxClient.js';
3
+ import { WalletClient, AuthFetch, Transaction, LockingScript } from '@bsv/sdk';
4
+ // MOCK: WalletClient methods globally
5
+ jest.spyOn(WalletClient.prototype, 'createHmac').mockResolvedValue({
6
+ hmac: Array.from(new Uint8Array([1, 2, 3]))
7
+ });
8
+ jest.spyOn(WalletClient.prototype, 'getPublicKey').mockResolvedValue({
9
+ publicKey: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4'
10
+ });
11
+ jest.spyOn(WalletClient.prototype, 'encrypt').mockResolvedValue({
12
+ ciphertext: [9, 9, 9, 9]
13
+ });
14
+ jest.spyOn(WalletClient.prototype, 'decrypt').mockResolvedValue({
15
+ plaintext: [1, 2, 3, 4, 5]
16
+ });
17
+ jest.spyOn(WalletClient.prototype, 'createSignature').mockResolvedValue({
18
+ signature: [1, 2, 3, 4, 5] // <-- any dummy byte array
19
+ });
20
+ jest.spyOn(WalletClient.prototype, 'connectToSubstrate').mockImplementation(async function () {
21
+ this.substrate = {
22
+ createSignature: async (message) => {
23
+ return Array.from(new Uint8Array([1, 2, 3])); // Return mock signature
24
+ }
25
+ };
26
+ });
27
+ const minimalTx = new Transaction();
28
+ minimalTx.addOutput({
29
+ satoshis: 1,
30
+ lockingScript: new LockingScript([]) // ✅ must wrap in LockingScript class
31
+ });
32
+ const realAtomicBEEF = minimalTx.toAtomicBEEF();
33
+ jest.spyOn(WalletClient.prototype, 'createAction').mockResolvedValue({
34
+ txid: 'mocked-txid',
35
+ tx: realAtomicBEEF
36
+ });
37
+ // MOCK: AuthFetch responses
38
+ const defaultMockResponse = {
39
+ json: async () => ({ status: 'success', message: 'Mocked response' }),
40
+ headers: new Headers(),
41
+ ok: true,
42
+ status: 200
43
+ };
44
+ jest.spyOn(MessageBoxClient.prototype, 'anointHost').mockImplementation(async () => {
45
+ return { txid: 'mocked-anoint-txid' };
46
+ });
47
+ jest.spyOn(MessageBoxClient.prototype, 'queryAdvertisements')
48
+ .mockResolvedValue([]);
49
+ jest.spyOn(AuthFetch.prototype, 'fetch')
50
+ .mockResolvedValue(defaultMockResponse);
51
+ // MOCK: WebSocket behavior
52
+ const socketOnMap = {};
53
+ const mockSocket = {
54
+ on: jest.fn((event, callback) => {
55
+ socketOnMap[event] = callback;
56
+ }),
57
+ emit: jest.fn(),
58
+ disconnect: jest.fn(),
59
+ connected: true,
60
+ off: jest.fn()
61
+ };
62
+ jest.mock('@bsv/authsocket-client', () => ({
63
+ AuthSocketClient: jest.fn(() => mockSocket)
64
+ }));
65
+ // Optional: Global WebSocket override (not strictly needed with AuthSocketClient)
66
+ class MockWebSocket {
67
+ static CONNECTING = 0;
68
+ static OPEN = 1;
69
+ static CLOSING = 2;
70
+ static CLOSED = 3;
71
+ readyState = MockWebSocket.OPEN;
72
+ on = jest.fn();
73
+ send = jest.fn();
74
+ close = jest.fn();
75
+ }
76
+ global.WebSocket = MockWebSocket;
77
+ describe('MessageBoxClient', () => {
78
+ let mockWalletClient;
79
+ beforeEach(() => {
80
+ mockWalletClient = new WalletClient();
81
+ jest.clearAllMocks();
82
+ // (Optional, but if you want per-test control, you could move mocks here instead of globally.)
83
+ });
84
+ const VALID_LIST_AND_READ_RESULT = {
85
+ body: JSON.stringify({
86
+ status: 200,
87
+ messages: [
88
+ { sender: 'mockSender', messageId: 42, body: {} },
89
+ { sender: 'mockSender', messageId: 43, body: {} }
90
+ ]
91
+ })
92
+ };
93
+ const VALID_ACK_RESULT = {
94
+ body: JSON.stringify({
95
+ status: 200,
96
+ message: 'Messages marked as acknowledged!'
97
+ })
98
+ };
99
+ it('Creates an instance of the MessageBoxClient class', async () => {
100
+ const messageBoxClient = new MessageBoxClient({
101
+ walletClient: mockWalletClient,
102
+ host: 'https://messagebox.babbage.systems',
103
+ enableLogging: true
104
+ });
105
+ await messageBoxClient.init();
106
+ expect(messageBoxClient).toHaveProperty('host', 'https://messagebox.babbage.systems');
107
+ // Ensure the socket is initialized as undefined before connecting
108
+ expect(messageBoxClient.testSocket).toBeUndefined();
109
+ });
110
+ it('Initializes WebSocket connection', async () => {
111
+ await new Promise(resolve => setTimeout(resolve, 100));
112
+ const messageBoxClient = new MessageBoxClient({
113
+ walletClient: mockWalletClient,
114
+ host: 'https://messagebox.babbage.systems',
115
+ enableLogging: true
116
+ });
117
+ await messageBoxClient.init();
118
+ const connection = messageBoxClient.initializeConnection();
119
+ // Simulate server response
120
+ setTimeout(() => {
121
+ socketOnMap.authenticationSuccess?.({ status: 'ok' });
122
+ }, 100);
123
+ await expect(connection).resolves.toBeUndefined();
124
+ }, 10000);
125
+ it('Falls back to HTTP when WebSocket is not initialized', async () => {
126
+ const messageBoxClient = new MessageBoxClient({
127
+ walletClient: mockWalletClient,
128
+ host: 'https://messagebox.babbage.systems',
129
+ enableLogging: true
130
+ });
131
+ await messageBoxClient.init();
132
+ // Bypass the real connection logic
133
+ jest.spyOn(messageBoxClient, 'initializeConnection').mockImplementation(async () => { });
134
+ messageBoxClient.myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4';
135
+ messageBoxClient.socket = null;
136
+ // Expect it to fall back to HTTP and succeed
137
+ const result = await messageBoxClient.sendLiveMessage({
138
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
139
+ messageBox: 'test_inbox',
140
+ body: 'Test message'
141
+ });
142
+ expect(result).toEqual({
143
+ status: 'success',
144
+ message: 'Mocked response',
145
+ messageId: '010203'
146
+ });
147
+ });
148
+ it('Listens for live messages', async () => {
149
+ const messageBoxClient = new MessageBoxClient({
150
+ walletClient: mockWalletClient,
151
+ host: 'https://messagebox.babbage.systems',
152
+ enableLogging: true
153
+ });
154
+ await messageBoxClient.init();
155
+ const connection = messageBoxClient.initializeConnection();
156
+ setTimeout(() => {
157
+ socketOnMap.authenticationSuccess?.({ status: 'ok' });
158
+ }, 100);
159
+ await connection;
160
+ const mockOnMessage = jest.fn();
161
+ await messageBoxClient.listenForLiveMessages({
162
+ messageBox: 'test_inbox',
163
+ onMessage: mockOnMessage
164
+ });
165
+ expect(messageBoxClient.testSocket?.emit).toHaveBeenCalledWith('joinRoom', '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4-test_inbox');
166
+ }, 10000);
167
+ it('Sends a live message', async () => {
168
+ const messageBoxClient = new MessageBoxClient({
169
+ walletClient: mockWalletClient,
170
+ host: 'https://messagebox.babbage.systems',
171
+ enableLogging: true
172
+ });
173
+ await messageBoxClient.init();
174
+ const connection = messageBoxClient.initializeConnection();
175
+ // Simulate WebSocket auth success
176
+ setTimeout(() => {
177
+ socketOnMap.authenticationSuccess?.({ status: 'ok' });
178
+ }, 100);
179
+ await connection;
180
+ const emitSpy = jest.spyOn(messageBoxClient.testSocket, 'emit');
181
+ // Kick off sending a message (this sets up the ack listener)
182
+ const sendPromise = messageBoxClient.sendLiveMessage({
183
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
184
+ messageBox: 'test_inbox',
185
+ body: 'Test message'
186
+ });
187
+ // Simulate WebSocket acknowledgment
188
+ setTimeout(() => {
189
+ socketOnMap['sendMessageAck-02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4-test_inbox']?.({
190
+ status: 'success',
191
+ messageId: 'mocked123'
192
+ });
193
+ }, 100);
194
+ const result = await sendPromise;
195
+ // Check that WebSocket emit happened correctly
196
+ expect(emitSpy).toHaveBeenCalledWith('sendMessage', expect.objectContaining({
197
+ roomId: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4-test_inbox',
198
+ message: expect.objectContaining({
199
+ messageId: '010203',
200
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
201
+ body: expect.stringMatching(/encrypted/)
202
+ })
203
+ }));
204
+ // Check the resolved result
205
+ expect(result).toEqual({
206
+ status: 'success',
207
+ messageId: 'mocked123'
208
+ });
209
+ }, 15000);
210
+ it('Sends a message', async () => {
211
+ const messageBoxClient = new MessageBoxClient({
212
+ walletClient: mockWalletClient,
213
+ host: 'https://messagebox.babbage.systems',
214
+ enableLogging: true
215
+ });
216
+ await messageBoxClient.init();
217
+ messageBoxClient.myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4';
218
+ jest.spyOn(messageBoxClient.authFetch, 'fetch').mockResolvedValue({
219
+ json: async () => ({
220
+ status: 'success',
221
+ message: 'Your message has been sent!'
222
+ }),
223
+ headers: new Headers(),
224
+ ok: true,
225
+ status: 200
226
+ });
227
+ const result = await messageBoxClient.sendMessage({
228
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
229
+ messageBox: 'test_inbox',
230
+ body: { data: 'test' }
231
+ });
232
+ expect(result).toHaveProperty('message', 'Your message has been sent!');
233
+ });
234
+ it('Lists available messages', async () => {
235
+ const messageBoxClient = new MessageBoxClient({
236
+ walletClient: mockWalletClient,
237
+ host: 'https://messagebox.babbage.systems',
238
+ enableLogging: true
239
+ });
240
+ await messageBoxClient.init();
241
+ messageBoxClient.myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4';
242
+ jest.spyOn(messageBoxClient.authFetch, 'fetch').mockResolvedValue({
243
+ json: async () => JSON.parse(VALID_LIST_AND_READ_RESULT.body),
244
+ headers: new Headers(),
245
+ ok: true,
246
+ status: 200
247
+ });
248
+ const result = await messageBoxClient.listMessages({ messageBox: 'test_inbox' });
249
+ expect(result).toEqual(JSON.parse(VALID_LIST_AND_READ_RESULT.body).messages);
250
+ });
251
+ it('Acknowledges a message', async () => {
252
+ const messageBoxClient = new MessageBoxClient({
253
+ walletClient: mockWalletClient,
254
+ host: 'https://messagebox.babbage.systems',
255
+ enableLogging: true
256
+ });
257
+ await messageBoxClient.init();
258
+ messageBoxClient.myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4';
259
+ jest.spyOn(messageBoxClient.authFetch, 'fetch').mockResolvedValue({
260
+ json: async () => JSON.parse(VALID_ACK_RESULT.body),
261
+ headers: new Headers(),
262
+ ok: true,
263
+ status: 200
264
+ });
265
+ const result = await messageBoxClient.acknowledgeMessage({ messageIds: ['42'] });
266
+ expect(result).toEqual(200);
267
+ });
268
+ it('Throws an error when sendMessage() API fails', async () => {
269
+ const messageBoxClient = new MessageBoxClient({
270
+ walletClient: mockWalletClient,
271
+ host: 'https://messagebox.babbage.systems',
272
+ enableLogging: true
273
+ });
274
+ await messageBoxClient.init();
275
+ messageBoxClient.myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4';
276
+ jest.spyOn(messageBoxClient.authFetch, 'fetch')
277
+ .mockResolvedValue({
278
+ status: 500,
279
+ statusText: 'Internal Server Error',
280
+ ok: false,
281
+ json: async () => ({ status: 'error', description: 'Internal Server Error' }),
282
+ headers: new Headers()
283
+ });
284
+ await expect(messageBoxClient.sendMessage({
285
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
286
+ messageBox: 'test_inbox',
287
+ body: 'Test Message'
288
+ })).rejects.toThrow('Message sending failed: HTTP 500 - Internal Server Error');
289
+ });
290
+ it('throws when every host fails', async () => {
291
+ const client = new MessageBoxClient({ walletClient: mockWalletClient, host: 'https://primary', enableLogging: false });
292
+ await client.init();
293
+ // Pretend there are no advertised replicas
294
+ jest.spyOn(client, 'queryAdvertisements').mockResolvedValue([]);
295
+ // Primary host responds with 500
296
+ jest.spyOn(client.authFetch, 'fetch').mockResolvedValue({
297
+ ok: false,
298
+ status: 500,
299
+ statusText: 'Internal Server Error',
300
+ json: async () => ({ status: 'error', description: 'DB down' })
301
+ });
302
+ await expect(client.listMessages({ messageBox: 'inbox' }))
303
+ .rejects.toThrow('Failed to retrieve messages from any host');
304
+ });
305
+ it('returns [] when at least one host succeeds but has no messages', async () => {
306
+ const client = new MessageBoxClient({ walletClient: mockWalletClient, host: 'https://primary', enableLogging: false });
307
+ await client.init();
308
+ // One failing replica, one healthy replica
309
+ jest.spyOn(client, 'queryAdvertisements').mockResolvedValue([{
310
+ host: 'https://replica'
311
+ }]);
312
+ jest.spyOn(client.authFetch, 'fetch')
313
+ .mockImplementation(async (url) =>
314
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
315
+ url.startsWith('https://primary')
316
+ ? await Promise.resolve({
317
+ ok: false,
318
+ status: 500,
319
+ statusText: 'Internal Server Error',
320
+ json: async () => ({ status: 'error', description: 'DB down' })
321
+ })
322
+ : await Promise.resolve({
323
+ ok: true,
324
+ status: 200,
325
+ json: async () => ({ status: 'success', messages: [] })
326
+ }));
327
+ await expect(client.listMessages({ messageBox: 'inbox' })).resolves.toEqual([]);
328
+ });
329
+ it('Throws an error when acknowledgeMessage() API fails', async () => {
330
+ const messageBoxClient = new MessageBoxClient({
331
+ walletClient: mockWalletClient,
332
+ host: 'https://messagebox.babbage.systems',
333
+ enableLogging: true
334
+ });
335
+ await messageBoxClient.init();
336
+ messageBoxClient.myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4';
337
+ jest.spyOn(messageBoxClient.authFetch, 'fetch')
338
+ .mockResolvedValue({
339
+ status: 500,
340
+ json: async () => ({ status: 'error', description: 'Failed to acknowledge messages' })
341
+ });
342
+ await expect(messageBoxClient.acknowledgeMessage({ messageIds: ['42'] }))
343
+ .rejects.toThrow('Failed to acknowledge messages');
344
+ });
345
+ it('Throws an error when WebSocket is not initialized before listening for messages', async () => {
346
+ const messageBoxClient = new MessageBoxClient({
347
+ walletClient: mockWalletClient,
348
+ host: 'https://messagebox.babbage.systems',
349
+ enableLogging: true
350
+ });
351
+ await messageBoxClient.init();
352
+ messageBoxClient.myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4';
353
+ // Stub out joinRoom to throw like the real one might
354
+ jest.spyOn(messageBoxClient, 'joinRoom').mockRejectedValue(new Error('WebSocket connection not initialized'));
355
+ await expect(messageBoxClient.listenForLiveMessages({
356
+ onMessage: jest.fn(),
357
+ messageBox: 'test_inbox'
358
+ })).rejects.toThrow('WebSocket connection not initialized');
359
+ });
360
+ it('Emits joinRoom event and listens for incoming messages', async () => {
361
+ const messageBoxClient = new MessageBoxClient({
362
+ walletClient: mockWalletClient,
363
+ host: 'https://messagebox.babbage.systems',
364
+ enableLogging: true
365
+ });
366
+ await messageBoxClient.init();
367
+ // Mock identity key properly
368
+ jest.spyOn(mockWalletClient, 'getPublicKey').mockResolvedValue({ publicKey: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4' });
369
+ // Mock socket with `on` method capturing event handlers
370
+ const mockSocket = {
371
+ emit: jest.fn(),
372
+ on: jest.fn()
373
+ };
374
+ // Mock `initializeConnection` so it assigns `socket` & identity key
375
+ jest.spyOn(messageBoxClient, 'initializeConnection').mockImplementation(async () => {
376
+ Object.defineProperty(messageBoxClient, 'testIdentityKey', { get: () => '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4' });
377
+ Object.defineProperty(messageBoxClient, 'testSocket', { get: () => mockSocket });
378
+ messageBoxClient.socket = mockSocket; // Ensures internal socket is set
379
+ messageBoxClient.myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4'; // Ensures identity key is set
380
+ });
381
+ const onMessageMock = jest.fn();
382
+ await messageBoxClient.listenForLiveMessages({
383
+ onMessage: onMessageMock,
384
+ messageBox: 'test_inbox'
385
+ });
386
+ // Ensure `joinRoom` event was emitted with the correct identity key
387
+ expect(mockSocket.emit).toHaveBeenCalledWith('joinRoom', '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4-test_inbox');
388
+ // Simulate receiving a message
389
+ const receivedMessage = { text: 'Hello, world!' };
390
+ // Extract & invoke the callback function stored in `on`
391
+ const sendMessageCallback = mockSocket.on.mock.calls.find(([eventName]) => eventName === 'sendMessage-02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4-test_inbox')?.[1]; // Extract the callback function
392
+ if (typeof sendMessageCallback === 'function') {
393
+ sendMessageCallback(receivedMessage);
394
+ }
395
+ // Ensure `onMessage` was called with the received message
396
+ expect(onMessageMock).toHaveBeenCalledWith(receivedMessage);
397
+ });
398
+ it('Handles WebSocket connection and disconnection events', async () => {
399
+ const messageBoxClient = new MessageBoxClient({
400
+ walletClient: mockWalletClient,
401
+ host: 'https://messagebox.babbage.systems',
402
+ enableLogging: true
403
+ });
404
+ await messageBoxClient.init();
405
+ // Simulate identity key
406
+ jest.spyOn(mockWalletClient, 'getPublicKey').mockResolvedValue({ publicKey: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4' });
407
+ // Simulate connection + disconnection + auth success
408
+ setTimeout(() => {
409
+ socketOnMap.connect?.();
410
+ socketOnMap.disconnect?.();
411
+ socketOnMap.authenticationSuccess?.({ status: 'ok' });
412
+ }, 100);
413
+ await messageBoxClient.initializeConnection();
414
+ // Verify event listeners were registered
415
+ expect(mockSocket.on).toHaveBeenCalledWith('connect', expect.any(Function));
416
+ expect(mockSocket.on).toHaveBeenCalledWith('disconnect', expect.any(Function));
417
+ }, 10000);
418
+ it('throws an error when recipient is empty in sendLiveMessage', async () => {
419
+ const messageBoxClient = new MessageBoxClient({
420
+ walletClient: mockWalletClient,
421
+ host: 'https://messagebox.babbage.systems',
422
+ enableLogging: true
423
+ });
424
+ await messageBoxClient.init();
425
+ // Mock `initializeConnection` so it assigns `socket` & identity key
426
+ jest.spyOn(messageBoxClient, 'initializeConnection').mockImplementation(async () => {
427
+ Object.defineProperty(messageBoxClient, 'testIdentityKey', { get: () => '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4' });
428
+ Object.defineProperty(messageBoxClient, 'testSocket', { get: () => mockSocket });
429
+ messageBoxClient.socket = mockSocket; // Ensures internal socket is set
430
+ messageBoxClient.myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4'; // Ensures identity key is set
431
+ });
432
+ // Mock socket to ensure WebSocket validation does not fail
433
+ const mockSocket = {
434
+ emit: jest.fn()
435
+ };
436
+ jest.spyOn(messageBoxClient, 'testSocket', 'get').mockReturnValue(mockSocket);
437
+ await expect(messageBoxClient.sendLiveMessage({
438
+ recipient: ' ',
439
+ messageBox: 'test_inbox',
440
+ body: 'Test message'
441
+ })).rejects.toThrow('[MB CLIENT ERROR] Recipient identity key is required');
442
+ });
443
+ it('throws an error when recipient is missing in sendMessage', async () => {
444
+ const messageBoxClient = new MessageBoxClient({
445
+ walletClient: mockWalletClient,
446
+ host: 'https://messagebox.babbage.systems',
447
+ enableLogging: true
448
+ });
449
+ await messageBoxClient.init();
450
+ await expect(messageBoxClient.sendMessage({
451
+ recipient: '', // Empty recipient
452
+ messageBox: 'test_inbox',
453
+ body: 'Test message'
454
+ })).rejects.toThrow('You must provide a message recipient!');
455
+ await expect(messageBoxClient.sendMessage({
456
+ recipient: ' ', // Whitespace recipient
457
+ messageBox: 'test_inbox',
458
+ body: 'Test message'
459
+ })).rejects.toThrow('You must provide a message recipient!');
460
+ await expect(messageBoxClient.sendMessage({
461
+ recipient: null, // Null recipient
462
+ messageBox: 'test_inbox',
463
+ body: 'Test message'
464
+ })).rejects.toThrow('You must provide a message recipient!');
465
+ });
466
+ it('throws an error when messageBox is missing in sendMessage', async () => {
467
+ const messageBoxClient = new MessageBoxClient({
468
+ walletClient: mockWalletClient,
469
+ host: 'https://messagebox.babbage.systems',
470
+ enableLogging: true
471
+ });
472
+ await messageBoxClient.init();
473
+ await expect(messageBoxClient.sendMessage({
474
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
475
+ messageBox: '', // Empty messageBox
476
+ body: 'Test message'
477
+ })).rejects.toThrow('You must provide a messageBox to send this message into!');
478
+ await expect(messageBoxClient.sendMessage({
479
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
480
+ messageBox: ' ', // Whitespace messageBox
481
+ body: 'Test message'
482
+ })).rejects.toThrow('You must provide a messageBox to send this message into!');
483
+ await expect(messageBoxClient.sendMessage({
484
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
485
+ messageBox: null, // Null messageBox
486
+ body: 'Test message'
487
+ })).rejects.toThrow('You must provide a messageBox to send this message into!');
488
+ });
489
+ it('throws an error when message body is missing in sendMessage', async () => {
490
+ const messageBoxClient = new MessageBoxClient({
491
+ walletClient: mockWalletClient,
492
+ host: 'https://messagebox.babbage.systems',
493
+ enableLogging: true
494
+ });
495
+ await messageBoxClient.init();
496
+ await expect(messageBoxClient.sendMessage({
497
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
498
+ messageBox: 'test_inbox',
499
+ body: '' // Empty body
500
+ })).rejects.toThrow('Every message must have a body!');
501
+ await expect(messageBoxClient.sendMessage({
502
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
503
+ messageBox: 'test_inbox',
504
+ body: ' ' // Whitespace body
505
+ })).rejects.toThrow('Every message must have a body!');
506
+ await expect(messageBoxClient.sendMessage({
507
+ recipient: '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4',
508
+ messageBox: 'test_inbox',
509
+ body: null // Null body
510
+ })).rejects.toThrow('Every message must have a body!');
511
+ });
512
+ it('throws an error when messageBox is empty in listMessages', async () => {
513
+ const messageBoxClient = new MessageBoxClient({
514
+ walletClient: mockWalletClient,
515
+ host: 'https://messagebox.babbage.systems',
516
+ enableLogging: true
517
+ });
518
+ await messageBoxClient.init();
519
+ await expect(messageBoxClient.listMessages({
520
+ messageBox: '' // Empty messageBox
521
+ })).rejects.toThrow('MessageBox cannot be empty');
522
+ await expect(messageBoxClient.listMessages({
523
+ messageBox: ' ' // Whitespace messageBox
524
+ })).rejects.toThrow('MessageBox cannot be empty');
525
+ });
526
+ it('throws an error when messageIds is empty in acknowledgeMessage', async () => {
527
+ const messageBoxClient = new MessageBoxClient({
528
+ walletClient: mockWalletClient,
529
+ host: 'https://messagebox.babbage.systems',
530
+ enableLogging: true
531
+ });
532
+ await messageBoxClient.init();
533
+ await expect(messageBoxClient.acknowledgeMessage({
534
+ messageIds: [] // Empty array
535
+ })).rejects.toThrow('Message IDs array cannot be empty');
536
+ await expect(messageBoxClient.acknowledgeMessage({
537
+ messageIds: undefined // Undefined value
538
+ })).rejects.toThrow('Message IDs array cannot be empty');
539
+ await expect(messageBoxClient.acknowledgeMessage({
540
+ messageIds: null // Null value
541
+ })).rejects.toThrow('Message IDs array cannot be empty');
542
+ await expect(messageBoxClient.acknowledgeMessage({
543
+ messageIds: 'invalid' // Not an array
544
+ })).rejects.toThrow('Message IDs array cannot be empty');
545
+ });
546
+ it('Uses default host if none is provided', () => {
547
+ const client = new MessageBoxClient({ walletClient: mockWalletClient });
548
+ expect(client.initialized).toBe(false);
549
+ expect(client.host).toBe('https://messagebox.babbage.systems');
550
+ });
551
+ it('Calls init() to set up a default host when missing', async () => {
552
+ const client = new MessageBoxClient({ walletClient: mockWalletClient });
553
+ expect(client.initialized).toBe(false);
554
+ await client.init();
555
+ expect(client.initialized).toBe(true);
556
+ expect(typeof client.host).toBe('string');
557
+ expect(client.host.length).toBeGreaterThan(0);
558
+ });
559
+ it('init() overrides host if passed with override=true', async () => {
560
+ const client = new MessageBoxClient({
561
+ walletClient: mockWalletClient,
562
+ host: 'https://original-host.example'
563
+ });
564
+ expect(client.initialized).toBe(false);
565
+ expect(client.host).toBe('https://original-host.example');
566
+ await client.init('https://new-host.example');
567
+ expect(client.initialized).toBe(true);
568
+ expect(client.host).toBe('https://new-host.example');
569
+ });
570
+ it('does not anoint when advert already exists', async () => {
571
+ jest.spyOn(MessageBoxClient.prototype, 'queryAdvertisements').mockResolvedValue([{
572
+ host: 'https://messagebox.babbage.systems'
573
+ }]);
574
+ const spy = jest.spyOn(MessageBoxClient.prototype, 'anointHost');
575
+ await new MessageBoxClient({ walletClient: mockWalletClient }).init();
576
+ expect(spy).not.toHaveBeenCalled();
577
+ });
578
+ it('resolveHostForRecipient returns the first advertised host', async () => {
579
+ const client = new MessageBoxClient({
580
+ walletClient: mockWalletClient,
581
+ host: 'https://default.box'
582
+ });
583
+ await client.init();
584
+ MessageBoxClient.prototype.queryAdvertisements
585
+ .mockResolvedValueOnce([
586
+ { host: 'https://peer.box' }, { host: 'https://second.box' }
587
+ ]);
588
+ const result = await client.resolveHostForRecipient('02aa…deadbeef');
589
+ expect(result).toBe('https://peer.box');
590
+ });
591
+ it('resolveHostForRecipient falls back to this.host when no adverts exist', async () => {
592
+ const client = new MessageBoxClient({
593
+ walletClient: mockWalletClient,
594
+ host: 'https://default.box'
595
+ });
596
+ await client.init();
597
+ MessageBoxClient.prototype.queryAdvertisements
598
+ .mockResolvedValueOnce([]);
599
+ const result = await client.resolveHostForRecipient('03bb…cafef00d');
600
+ expect(result).toBe('https://default.box');
601
+ });
602
+ });
603
+ //# sourceMappingURL=MessageBoxClient.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBoxClient.test.js","sourceRoot":"","sources":["../../../../src/__tests/MessageBoxClient.test.ts"],"names":[],"mappings":"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"}