@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,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-env jest */
4
+ const PeerPayClient_js_1 = require("../PeerPayClient.js");
5
+ const sdk_1 = require("@bsv/sdk");
6
+ const globals_1 = require("@jest/globals");
7
+ const toArray = (msg, enc) => {
8
+ if (Array.isArray(msg))
9
+ return msg.slice();
10
+ if (msg === undefined)
11
+ return [];
12
+ if (typeof msg !== 'string') {
13
+ return Array.from(msg, (item) => item | 0);
14
+ }
15
+ switch (enc) {
16
+ case 'hex': {
17
+ const matches = msg.match(/.{1,2}/g);
18
+ return matches != null ? matches.map(byte => parseInt(byte, 16)) : [];
19
+ }
20
+ case 'base64':
21
+ return Array.from(Buffer.from(msg, 'base64'));
22
+ default:
23
+ return Array.from(Buffer.from(msg, 'utf8'));
24
+ }
25
+ };
26
+ // Mock dependencies
27
+ globals_1.jest.mock('@bsv/sdk', () => {
28
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
29
+ const actualSDK = globals_1.jest.requireActual('@bsv/sdk');
30
+ return {
31
+ ...actualSDK,
32
+ WalletClient: globals_1.jest.fn().mockImplementation(() => ({
33
+ getPublicKey: globals_1.jest.fn(),
34
+ createAction: globals_1.jest.fn(),
35
+ internalizeAction: globals_1.jest.fn(),
36
+ createHmac: globals_1.jest.fn().mockResolvedValue({
37
+ hmac: [1, 2, 3, 4, 5]
38
+ })
39
+ }))
40
+ };
41
+ });
42
+ describe('PeerPayClient Unit Tests', () => {
43
+ let peerPayClient;
44
+ let mockWalletClient;
45
+ beforeEach(() => {
46
+ globals_1.jest.clearAllMocks();
47
+ mockWalletClient = new sdk_1.WalletClient();
48
+ // Ensure a valid compressed public key (33 bytes, hex format)
49
+ mockWalletClient.getPublicKey.mockResolvedValue({
50
+ publicKey: sdk_1.PrivateKey.fromRandom().toPublicKey().toString()
51
+ });
52
+ mockWalletClient.createAction.mockResolvedValue({
53
+ tx: toArray('mockedTransaction', 'utf8')
54
+ });
55
+ peerPayClient = new PeerPayClient_js_1.PeerPayClient({
56
+ messageBoxHost: 'https://messagebox.babbage.systems',
57
+ walletClient: mockWalletClient
58
+ });
59
+ });
60
+ describe('createPaymentToken', () => {
61
+ it('should create a valid payment token', async () => {
62
+ mockWalletClient.getPublicKey.mockResolvedValue({
63
+ publicKey: sdk_1.PrivateKey.fromRandom().toPublicKey().toString()
64
+ });
65
+ mockWalletClient.createAction.mockResolvedValue({ tx: toArray('mockedTransaction', 'utf8') });
66
+ const payment = { recipient: sdk_1.PrivateKey.fromRandom().toPublicKey().toString(), amount: 5 };
67
+ const token = await peerPayClient.createPaymentToken(payment);
68
+ expect(token).toHaveProperty('amount', 5);
69
+ expect(mockWalletClient.getPublicKey).toHaveBeenCalledWith(expect.any(Object));
70
+ expect(mockWalletClient.createAction).toHaveBeenCalledWith(expect.any(Object));
71
+ });
72
+ it('should throw an error if recipient public key cannot be derived', async () => {
73
+ mockWalletClient.getPublicKey.mockResolvedValue({ publicKey: '' }); // Empty key
74
+ await expect(peerPayClient.createPaymentToken({ recipient: 'invalid', amount: 5 }))
75
+ .rejects.toThrow('Failed to derive recipient’s public key');
76
+ });
77
+ it('should throw an error if amount is <= 0', async () => {
78
+ mockWalletClient.getPublicKey
79
+ .mockResolvedValue({
80
+ publicKey: sdk_1.PrivateKey.fromRandom().toPublicKey().toString()
81
+ });
82
+ await expect(peerPayClient.createPaymentToken({
83
+ recipient: sdk_1.PrivateKey.fromRandom().toPublicKey().toString(),
84
+ amount: 0
85
+ }))
86
+ .rejects.toThrow('Invalid payment details: recipient and valid amount are required');
87
+ });
88
+ });
89
+ // Test: sendPayment
90
+ describe('sendPayment', () => {
91
+ it('should call sendMessage with valid payment', async () => {
92
+ const sendMessageSpy = globals_1.jest.spyOn(peerPayClient, 'sendMessage').mockResolvedValue({
93
+ status: 'success',
94
+ messageId: 'mockedMessageId'
95
+ });
96
+ const payment = { recipient: 'recipientKey', amount: 3 };
97
+ console.log('[TEST] Calling sendPayment...');
98
+ await peerPayClient.sendPayment(payment);
99
+ console.log('[TEST] sendPayment finished.');
100
+ expect(sendMessageSpy).toHaveBeenCalledWith({
101
+ recipient: 'recipientKey',
102
+ messageBox: 'payment_inbox',
103
+ body: expect.any(String)
104
+ });
105
+ }, 10000);
106
+ });
107
+ // Test: sendLivePayment
108
+ describe('sendLivePayment', () => {
109
+ it('should call createPaymentToken and sendLiveMessage with correct parameters', async () => {
110
+ globals_1.jest.spyOn(peerPayClient, 'createPaymentToken').mockResolvedValue({
111
+ customInstructions: {
112
+ derivationPrefix: 'prefix',
113
+ derivationSuffix: 'suffix'
114
+ },
115
+ transaction: Array.from(new Uint8Array([1, 2, 3, 4, 5])),
116
+ amount: 2
117
+ });
118
+ globals_1.jest.spyOn(peerPayClient, 'sendLiveMessage').mockResolvedValue({
119
+ status: 'success',
120
+ messageId: 'mockedMessageId'
121
+ });
122
+ const payment = { recipient: 'recipientKey', amount: 2 };
123
+ await peerPayClient.sendLivePayment(payment);
124
+ expect(peerPayClient.createPaymentToken).toHaveBeenCalledWith(payment);
125
+ expect(peerPayClient.sendLiveMessage).toHaveBeenCalledWith({
126
+ recipient: 'recipientKey',
127
+ messageBox: 'payment_inbox',
128
+ body: "{\"customInstructions\":{\"derivationPrefix\":\"prefix\",\"derivationSuffix\":\"suffix\"},\"transaction\":[1,2,3,4,5],\"amount\":2}"
129
+ });
130
+ });
131
+ });
132
+ // Test: acceptPayment
133
+ describe('acceptPayment', () => {
134
+ it('should call internalizeAction and acknowledgeMessage', async () => {
135
+ mockWalletClient.internalizeAction.mockResolvedValue({ accepted: true });
136
+ globals_1.jest.spyOn(peerPayClient, 'acknowledgeMessage').mockResolvedValue('acknowledged');
137
+ const payment = {
138
+ messageId: '123',
139
+ sender: 'senderKey',
140
+ token: {
141
+ customInstructions: { derivationPrefix: 'prefix', derivationSuffix: 'suffix' },
142
+ transaction: toArray('mockedTransaction', 'utf8'),
143
+ amount: 6
144
+ }
145
+ };
146
+ await peerPayClient.acceptPayment(payment);
147
+ expect(mockWalletClient.internalizeAction).toHaveBeenCalled();
148
+ expect(peerPayClient.acknowledgeMessage).toHaveBeenCalledWith({ messageIds: ['123'] });
149
+ });
150
+ });
151
+ // Test: rejectPayment
152
+ describe('rejectPayment', () => {
153
+ it('should refund payment minus fee', async () => {
154
+ globals_1.jest.spyOn(peerPayClient, 'acceptPayment').mockResolvedValue(undefined);
155
+ globals_1.jest.spyOn(peerPayClient, 'sendPayment').mockResolvedValue(undefined);
156
+ globals_1.jest.spyOn(peerPayClient, 'acknowledgeMessage').mockResolvedValue('acknowledged');
157
+ const payment = {
158
+ messageId: '123',
159
+ sender: 'senderKey',
160
+ token: {
161
+ customInstructions: { derivationPrefix: 'prefix', derivationSuffix: 'suffix' },
162
+ transaction: toArray('mockedTransaction', 'utf8'),
163
+ amount: 2000
164
+ }
165
+ };
166
+ await peerPayClient.rejectPayment(payment);
167
+ expect(peerPayClient.acceptPayment).toHaveBeenCalledWith(payment);
168
+ expect(peerPayClient.sendPayment).toHaveBeenCalledWith({
169
+ recipient: 'senderKey',
170
+ amount: 1000 // Deduct satoshi fee
171
+ });
172
+ expect(peerPayClient.acknowledgeMessage).toHaveBeenCalledWith({
173
+ messageIds: ['123']
174
+ });
175
+ });
176
+ });
177
+ // Test: listIncomingPayments
178
+ describe('listIncomingPayments', () => {
179
+ it('should return parsed payment messages', async () => {
180
+ globals_1.jest.spyOn(peerPayClient, 'listMessages').mockResolvedValue([
181
+ {
182
+ messageId: '1',
183
+ sender: 'sender1',
184
+ created_at: '2025-03-05T12:00:00Z',
185
+ updated_at: '2025-03-05T12:05:00Z',
186
+ body: JSON.stringify({
187
+ customInstructions: { derivationPrefix: 'prefix1', derivationSuffix: 'suffix1' },
188
+ transaction: toArray('mockedTransaction1', 'utf8'),
189
+ amount: 3
190
+ })
191
+ },
192
+ {
193
+ messageId: '2',
194
+ sender: 'sender2',
195
+ created_at: '2025-03-05T12:10:00Z',
196
+ updated_at: '2025-03-05T12:15:00Z',
197
+ body: JSON.stringify({
198
+ customInstructions: { derivationPrefix: 'prefix2', derivationSuffix: 'suffix2' },
199
+ transaction: toArray('mockedTransaction2', 'utf8'),
200
+ amount: 9
201
+ })
202
+ }
203
+ ]);
204
+ const payments = await peerPayClient.listIncomingPayments();
205
+ expect(payments).toHaveLength(2);
206
+ expect(payments[0]).toHaveProperty('sender', 'sender1');
207
+ expect(payments[0].token.amount).toBe(3);
208
+ expect(payments[1]).toHaveProperty('sender', 'sender2');
209
+ expect(payments[1].token.amount).toBe(9);
210
+ });
211
+ });
212
+ });
213
+ //# sourceMappingURL=PeerPayClientUnit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PeerPayClientUnit.test.js","sourceRoot":"","sources":["../../../../src/__tests/PeerPayClientUnit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-env jest */
4
+ const MessageBoxClient_js_1 = require("../../MessageBoxClient.js");
5
+ const sdk_1 = require("@bsv/sdk");
6
+ const crypto_1 = require("crypto");
7
+ const globals_1 = require("@jest/globals");
8
+ global.self = { crypto: crypto_1.webcrypto };
9
+ jest.setTimeout(20000);
10
+ const walletClient = new sdk_1.WalletClient('json-api', 'https://messagebox.babbage.systems');
11
+ const messageBoxClient = new MessageBoxClient_js_1.MessageBoxClient({
12
+ host: 'https://messagebox.babbage.systems',
13
+ walletClient,
14
+ enableLogging: true,
15
+ networkPreset: 'local'
16
+ });
17
+ let identityKey;
18
+ (0, globals_1.describe)('Encryption Integration Tests', () => {
19
+ const messageBox = 'testBox';
20
+ const plaintext = 'This is a secure test message.';
21
+ (0, globals_1.beforeAll)(async () => {
22
+ const result = await walletClient.getPublicKey({ identityKey: true });
23
+ identityKey = result.publicKey;
24
+ await messageBoxClient.initializeConnection();
25
+ });
26
+ (0, globals_1.test)('encrypts and decrypts a message to self successfully', async () => {
27
+ // Encrypt
28
+ const { ciphertext } = await walletClient.encrypt({
29
+ plaintext: Array.from(new TextEncoder().encode(plaintext)),
30
+ protocolID: [1, 'messagebox'],
31
+ keyID: '1',
32
+ counterparty: 'self'
33
+ });
34
+ (0, globals_1.expect)(Array.isArray(ciphertext)).toBe(true);
35
+ (0, globals_1.expect)(ciphertext.length).toBeGreaterThan(0);
36
+ // Decrypt
37
+ const { plaintext: decryptedBytes } = await walletClient.decrypt({
38
+ ciphertext,
39
+ protocolID: [1, 'messagebox'],
40
+ keyID: '1',
41
+ counterparty: 'self'
42
+ });
43
+ const decrypted = new TextDecoder().decode(Uint8Array.from(decryptedBytes));
44
+ (0, globals_1.expect)(decrypted).toBe(plaintext);
45
+ });
46
+ (0, globals_1.test)('sends and receives encrypted message using MessageBoxClient', async () => {
47
+ // Send message to self
48
+ const sendResult = await messageBoxClient.sendMessage({
49
+ recipient: identityKey,
50
+ messageBox,
51
+ body: plaintext
52
+ });
53
+ (0, globals_1.expect)(sendResult.status).toBe('success');
54
+ (0, globals_1.expect)(typeof sendResult.messageId).toBe('string');
55
+ // List and decrypt
56
+ const messages = await messageBoxClient.listMessages({ messageBox });
57
+ const last = messages.at(-1);
58
+ (0, globals_1.expect)(last).toBeDefined();
59
+ (0, globals_1.expect)(last === null || last === void 0 ? void 0 : last.body).toBe(plaintext);
60
+ });
61
+ (0, globals_1.test)('encrypted message is not stored or transmitted as plaintext', async () => {
62
+ var _a;
63
+ // Send encrypted message to self
64
+ const sendResult = await messageBoxClient.sendMessage({
65
+ recipient: identityKey,
66
+ messageBox,
67
+ body: plaintext
68
+ });
69
+ (0, globals_1.expect)(sendResult.status).toBe('success');
70
+ // Manually fetch raw HTTP response
71
+ const fetch = await messageBoxClient.authFetch.fetch('https://messagebox.babbage.systems/listMessages', {
72
+ method: 'POST',
73
+ headers: { 'Content-Type': 'application/json' },
74
+ body: JSON.stringify({ messageBox })
75
+ });
76
+ const raw = await fetch.json();
77
+ const rawBody = (_a = raw.messages.at(-1)) === null || _a === void 0 ? void 0 : _a.body;
78
+ (0, globals_1.expect)(typeof rawBody).toBe('string');
79
+ const parsed = JSON.parse(rawBody);
80
+ (0, globals_1.expect)(typeof parsed.encryptedMessage).toBe('string');
81
+ (0, globals_1.expect)(parsed.encryptedMessage.includes(plaintext)).toBe(false);
82
+ });
83
+ });
84
+ //# sourceMappingURL=integrationEncrypted.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrationEncrypted.test.js","sourceRoot":"","sources":["../../../../../src/__tests/integration/integrationEncrypted.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-env jest */
4
+ const MessageBoxClient_js_1 = require("../../MessageBoxClient.js");
5
+ const sdk_1 = require("@bsv/sdk");
6
+ const crypto_1 = require("crypto");
7
+ // Ensure Jest doesn't mock WalletClient
8
+ jest.unmock('@bsv/sdk');
9
+ global.self = { crypto: crypto_1.webcrypto };
10
+ jest.setTimeout(20000);
11
+ // Explicitly initialize WalletClient with Meta Net Client (MNC)
12
+ const walletClient = new sdk_1.WalletClient('json-api', 'localhost');
13
+ // Initialize MessageBoxClient for HTTP-Only Testing
14
+ const messageBoxClient = new MessageBoxClient_js_1.MessageBoxClient({
15
+ host: 'https://messagebox.babbage.systems',
16
+ walletClient
17
+ });
18
+ describe('MessageBoxClient HTTP Integration Tests (No WebSocket)', () => {
19
+ let recipientKey;
20
+ let testMessageId;
21
+ const messageBox = 'testBox';
22
+ const testMessage = 'Hello, this is an integration test.';
23
+ const testMessage2 = 'Another test message to avoid duplicates.';
24
+ beforeAll(async () => {
25
+ try {
26
+ console.log('[DEBUG] Retrieving public key...');
27
+ const publicKeyResponse = await walletClient.getPublicKey({ identityKey: true });
28
+ if ((publicKeyResponse === null || publicKeyResponse === void 0 ? void 0 : publicKeyResponse.publicKey) == null ||
29
+ typeof publicKeyResponse.publicKey !== 'string' ||
30
+ publicKeyResponse.publicKey.trim() === '') {
31
+ throw new Error('[ERROR] getPublicKey returned an invalid key!');
32
+ }
33
+ recipientKey = publicKeyResponse.publicKey.trim();
34
+ console.log('[DEBUG] Successfully assigned recipientKey:', recipientKey);
35
+ // Ensure identity key is set internally in MessageBoxClient
36
+ await messageBoxClient.initializeConnection();
37
+ }
38
+ catch (error) {
39
+ console.error('[ERROR] Failed to set up test:', error);
40
+ throw error;
41
+ }
42
+ });
43
+ afterAll(async () => {
44
+ try {
45
+ if (testMessageId !== undefined && testMessageId !== '') {
46
+ console.log('[DEBUG] Cleaning up test messages...');
47
+ }
48
+ }
49
+ catch (error) {
50
+ console.error('[ERROR] Failed to acknowledge test message:', error);
51
+ }
52
+ });
53
+ /** TEST 1: Send a Message with Correct Payment **/
54
+ test('should send a message successfully with correct payment', async () => {
55
+ const response = await messageBoxClient.sendMessage({
56
+ recipient: recipientKey,
57
+ messageBox,
58
+ body: testMessage,
59
+ skipEncryption: true // TEMPORARY to test if this fixes the 400
60
+ });
61
+ console.log('[DEBUG] SendMessage Response:', response);
62
+ expect(response).toHaveProperty('status', 'success');
63
+ expect(response).toHaveProperty('messageId', expect.any(String));
64
+ testMessageId = response.messageId; // Store for cleanup
65
+ }, 30000);
66
+ /** TEST 2: List Messages **/
67
+ test('should list messages from messageBox', async () => {
68
+ const messages = await messageBoxClient.listMessages({ messageBox });
69
+ expect(messages.length).toBeGreaterThan(0);
70
+ expect(messages.some(msg => msg.body === testMessage)).toBe(true);
71
+ }, 15000);
72
+ /** TEST 3: List Messages from an Empty MessageBox **/
73
+ test('should return an empty list if no messages exist', async () => {
74
+ const messages = await messageBoxClient.listMessages({ messageBox: 'emptyBox' });
75
+ expect(messages).toEqual([]);
76
+ }, 15000);
77
+ /** TEST 4: Acknowledge a Message **/
78
+ test('should acknowledge (delete) a message', async () => {
79
+ const ackResponse = await messageBoxClient.acknowledgeMessage({ messageIds: [testMessageId] });
80
+ expect(ackResponse).toBe('success');
81
+ }, 15000);
82
+ /** TEST 5: Acknowledge a Nonexistent Message **/
83
+ test('should fail to acknowledge a nonexistent message', async () => {
84
+ await expect(messageBoxClient.acknowledgeMessage({ messageIds: ['fakeMessageId'] })).rejects.toThrow('Message not found!');
85
+ }, 15000);
86
+ /** TEST 6: Send Message with Invalid Recipient **/
87
+ test('should fail if recipient is invalid', async () => {
88
+ await expect(messageBoxClient.sendMessage({
89
+ recipient: '', // Invalid recipient
90
+ messageBox,
91
+ body: testMessage
92
+ })).rejects.toThrow('You must provide a message recipient!');
93
+ }, 15000);
94
+ /** TEST 7: Send Message with Empty Body **/
95
+ test('should fail if message body is empty', async () => {
96
+ await expect(messageBoxClient.sendMessage({
97
+ recipient: recipientKey,
98
+ messageBox,
99
+ body: '' // Empty message
100
+ })).rejects.toThrow('Every message must have a body!');
101
+ }, 15000);
102
+ /** TEST 8: Send Message with Excessive Payment (Should still succeed) **/
103
+ test('should send a message even if payment is more than required', async () => {
104
+ const response = await messageBoxClient.sendMessage({
105
+ recipient: recipientKey,
106
+ messageBox,
107
+ body: testMessage2,
108
+ skipEncryption: true
109
+ });
110
+ console.log('[DEBUG] Overpayment SendMessage Response:', response);
111
+ expect(response.status).toBe('success');
112
+ }, 15000);
113
+ /** TEST: Send a message without encryption **/
114
+ test('should send a message without encryption when skipEncryption is true', async () => {
115
+ const plaintextMessage = 'Unencrypted test message';
116
+ const response = await messageBoxClient.sendMessage({
117
+ recipient: recipientKey,
118
+ messageBox,
119
+ body: plaintextMessage,
120
+ skipEncryption: true // Bypass encryption
121
+ });
122
+ expect(response).toHaveProperty('status', 'success');
123
+ expect(response).toHaveProperty('messageId', expect.any(String));
124
+ const messages = await messageBoxClient.listMessages({ messageBox });
125
+ expect(messages.some(msg => msg.body === plaintextMessage)).toBe(true);
126
+ }, 30000);
127
+ });
128
+ //# sourceMappingURL=integrationHTTP.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrationHTTP.test.js","sourceRoot":"","sources":["../../../../../src/__tests/integration/integrationHTTP.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-env jest */
4
+ const MessageBoxClient_js_1 = require("../../MessageBoxClient.js");
5
+ const sdk_1 = require("@bsv/sdk");
6
+ const crypto_1 = require("crypto");
7
+ global.self = { crypto: crypto_1.webcrypto };
8
+ jest.setTimeout(20000);
9
+ const MESSAGEBOX_HOST = 'http://localhost:5001';
10
+ const walletA = new sdk_1.WalletClient('json-api', 'localhost');
11
+ const walletB = new sdk_1.WalletClient('json-api', 'localhost');
12
+ const clientA = new MessageBoxClient_js_1.MessageBoxClient({
13
+ host: MESSAGEBOX_HOST,
14
+ walletClient: walletA,
15
+ networkPreset: 'local',
16
+ enableLogging: true
17
+ });
18
+ const clientB = new MessageBoxClient_js_1.MessageBoxClient({
19
+ host: MESSAGEBOX_HOST,
20
+ walletClient: walletB,
21
+ networkPreset: 'local',
22
+ enableLogging: true
23
+ });
24
+ let identityKeyA;
25
+ let identityKeyB;
26
+ beforeAll(async () => {
27
+ identityKeyA = (await walletA.getPublicKey({ identityKey: true })).publicKey;
28
+ identityKeyB = (await walletB.getPublicKey({ identityKey: true })).publicKey;
29
+ await clientA.initializeConnection();
30
+ await clientB.initializeConnection();
31
+ });
32
+ afterAll(async () => {
33
+ await clientA.disconnectWebSocket();
34
+ await clientB.disconnectWebSocket();
35
+ });
36
+ describe('Overlay Integration Tests', () => {
37
+ const selfBox = 'overlay_self_box';
38
+ const peerBox = 'forwarded_overlay_box';
39
+ test('clientA broadcasts overlay advertisement', async () => {
40
+ const result = await clientA.anointHost(MESSAGEBOX_HOST);
41
+ expect(result).toHaveProperty('txid');
42
+ await new Promise(resolve => setTimeout(resolve, 3000));
43
+ });
44
+ test('clientA resolves own host via overlay', async () => {
45
+ const resolved = await clientA.resolveHostForRecipient(identityKeyA);
46
+ console.log('[TEST] Resolved host:', resolved);
47
+ expect(resolved).toBe(MESSAGEBOX_HOST);
48
+ });
49
+ test('clientA sends message to self via overlay', async () => {
50
+ const response = await clientA.sendMessage({
51
+ recipient: identityKeyA,
52
+ messageBox: selfBox,
53
+ body: 'hello via overlay'
54
+ });
55
+ expect(response.status).toBe('success');
56
+ });
57
+ test('clientA lists self messages via overlay', async () => {
58
+ var _a;
59
+ const messages = await clientA.listMessages({ messageBox: selfBox });
60
+ expect(messages.length).toBeGreaterThan(0);
61
+ expect((_a = messages.at(-1)) === null || _a === void 0 ? void 0 : _a.body).toContain('hello via overlay');
62
+ });
63
+ test('clientA acknowledges self messages via overlay', async () => {
64
+ const messages = await clientA.listMessages({ messageBox: selfBox });
65
+ const ids = messages.map(m => m.messageId).filter(Boolean);
66
+ expect(ids.length).toBeGreaterThan(0);
67
+ const status = await clientA.acknowledgeMessage({ messageIds: ids });
68
+ expect(status).toBe('success');
69
+ });
70
+ test('clientB broadcasts overlay advertisement', async () => {
71
+ const result = await clientB.anointHost(MESSAGEBOX_HOST);
72
+ expect(result).toHaveProperty('txid');
73
+ await new Promise(resolve => setTimeout(resolve, 3000));
74
+ });
75
+ test('clientA sends message to clientB via overlay', async () => {
76
+ const response = await clientA.sendMessage({
77
+ recipient: identityKeyB,
78
+ messageBox: peerBox,
79
+ body: 'delivered to peer via overlay'
80
+ });
81
+ expect(response.status).toBe('success');
82
+ });
83
+ test('clientB receives overlay message from clientA', async () => {
84
+ const messages = await clientB.listMessages({ messageBox: peerBox });
85
+ expect(messages.some(m => m.body.includes('delivered to peer via overlay'))).toBe(true);
86
+ });
87
+ test('clientB acknowledges overlay message from clientA', async () => {
88
+ const messages = await clientB.listMessages({ messageBox: peerBox });
89
+ const ids = messages.map(m => m.messageId).filter(Boolean);
90
+ const result = await clientB.acknowledgeMessage({ messageIds: ids });
91
+ expect(result).toBe('success');
92
+ });
93
+ test('clientA verifies clientB host resolution', async () => {
94
+ const resolved = await clientA.resolveHostForRecipient(identityKeyB);
95
+ expect(resolved).toBe(MESSAGEBOX_HOST);
96
+ });
97
+ test('overlay advertisement is idempotent', async () => {
98
+ const result1 = await clientA.anointHost(MESSAGEBOX_HOST);
99
+ const result2 = await clientA.anointHost(MESSAGEBOX_HOST);
100
+ expect(result1.txid).not.toBe(result2.txid);
101
+ });
102
+ test('clientA sends and acknowledges multiple messages to clientB', async () => {
103
+ const contents = ['msg1', 'msg2', 'msg3'];
104
+ for (const msg of contents) {
105
+ const response = await clientA.sendMessage({
106
+ recipient: identityKeyB,
107
+ messageBox: peerBox,
108
+ body: msg
109
+ });
110
+ expect(response.status).toBe('success');
111
+ }
112
+ await new Promise(resolve => setTimeout(resolve, 1000));
113
+ const messages = await clientB.listMessages({ messageBox: peerBox });
114
+ const matched = contents.every(c => messages.some(m => m.body.includes(c)));
115
+ expect(matched).toBe(true);
116
+ const ids = messages.map(m => m.messageId).filter(Boolean);
117
+ const status = await clientB.acknowledgeMessage({ messageIds: ids });
118
+ expect(status).toBe('success');
119
+ });
120
+ test('clientA reinitializes with init() and correctly anoints host', async () => {
121
+ const tempClient = new MessageBoxClient_js_1.MessageBoxClient({
122
+ walletClient: walletA,
123
+ networkPreset: 'local',
124
+ enableLogging: true
125
+ // No host provided here!
126
+ });
127
+ // Call init manually
128
+ await tempClient.init(MESSAGEBOX_HOST);
129
+ // Verify client is initialized and host is correct
130
+ expect(tempClient.initialized).toBe(true);
131
+ expect(tempClient.host).toBe(MESSAGEBOX_HOST);
132
+ // Optionally, test that resolving our own identity also works
133
+ const resolvedHost = await tempClient.resolveHostForRecipient(identityKeyA);
134
+ expect(resolvedHost).toBe(MESSAGEBOX_HOST);
135
+ await tempClient.disconnectWebSocket();
136
+ });
137
+ });
138
+ //# sourceMappingURL=integrationOverlay.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrationOverlay.test.js","sourceRoot":"","sources":["../../../../../src/__tests/integration/integrationOverlay.test.ts"],"names":[],"mappings":"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"}