@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.
- package/dist/cjs/mod.js +20 -0
- package/dist/cjs/mod.js.map +1 -0
- package/dist/cjs/package.json +69 -0
- package/dist/cjs/src/MessageBoxClient.js +1171 -0
- package/dist/cjs/src/MessageBoxClient.js.map +1 -0
- package/dist/cjs/src/PeerPayClient.js +309 -0
- package/dist/cjs/src/PeerPayClient.js.map +1 -0
- package/dist/cjs/src/Utils/logger.js +27 -0
- package/dist/cjs/src/Utils/logger.js.map +1 -0
- package/dist/cjs/src/__tests/MessageBoxClient.test.js +614 -0
- package/dist/cjs/src/__tests/MessageBoxClient.test.js.map +1 -0
- package/dist/cjs/src/__tests/PeerPayClientUnit.test.js +213 -0
- package/dist/cjs/src/__tests/PeerPayClientUnit.test.js.map +1 -0
- package/dist/cjs/src/__tests/integration/integrationEncrypted.test.js +84 -0
- package/dist/cjs/src/__tests/integration/integrationEncrypted.test.js.map +1 -0
- package/dist/cjs/src/__tests/integration/integrationHTTP.test.js +128 -0
- package/dist/cjs/src/__tests/integration/integrationHTTP.test.js.map +1 -0
- package/dist/cjs/src/__tests/integration/integrationOverlay.test.js +138 -0
- package/dist/cjs/src/__tests/integration/integrationOverlay.test.js.map +1 -0
- package/dist/cjs/src/__tests/integration/integrationWS.test.js +123 -0
- package/dist/cjs/src/__tests/integration/integrationWS.test.js.map +1 -0
- package/dist/cjs/src/__tests/integration/testServer.js +65 -0
- package/dist/cjs/src/__tests/integration/testServer.js.map +1 -0
- package/dist/cjs/src/types.js +3 -0
- package/dist/cjs/src/types.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/esm/mod.js +4 -0
- package/dist/esm/mod.js.map +1 -0
- package/dist/esm/src/MessageBoxClient.js +1165 -0
- package/dist/esm/src/MessageBoxClient.js.map +1 -0
- package/dist/esm/src/PeerPayClient.js +307 -0
- package/dist/esm/src/PeerPayClient.js.map +1 -0
- package/dist/esm/src/Utils/logger.js +23 -0
- package/dist/esm/src/Utils/logger.js.map +1 -0
- package/dist/esm/src/__tests/MessageBoxClient.test.js +603 -0
- package/dist/esm/src/__tests/MessageBoxClient.test.js.map +1 -0
- package/dist/esm/src/__tests/PeerPayClientUnit.test.js +211 -0
- package/dist/esm/src/__tests/PeerPayClientUnit.test.js.map +1 -0
- package/dist/esm/src/__tests/integration/integrationEncrypted.test.js +81 -0
- package/dist/esm/src/__tests/integration/integrationEncrypted.test.js.map +1 -0
- package/dist/esm/src/__tests/integration/integrationHTTP.test.js +126 -0
- package/dist/esm/src/__tests/integration/integrationHTTP.test.js.map +1 -0
- package/dist/esm/src/__tests/integration/integrationOverlay.test.js +135 -0
- package/dist/esm/src/__tests/integration/integrationOverlay.test.js.map +1 -0
- package/dist/esm/src/__tests/integration/integrationWS.test.js +121 -0
- package/dist/esm/src/__tests/integration/integrationWS.test.js.map +1 -0
- package/dist/esm/src/__tests/integration/testServer.js +61 -0
- package/dist/esm/src/__tests/integration/testServer.js.map +1 -0
- package/dist/esm/src/types.js +2 -0
- package/dist/esm/src/types.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/types/mod.d.ts +4 -0
- package/dist/types/mod.d.ts.map +1 -0
- package/dist/types/src/MessageBoxClient.d.ts +441 -0
- package/dist/types/src/MessageBoxClient.d.ts.map +1 -0
- package/dist/types/src/PeerPayClient.d.ts +144 -0
- package/dist/types/src/PeerPayClient.d.ts.map +1 -0
- package/dist/types/src/Utils/logger.d.ts +9 -0
- package/dist/types/src/Utils/logger.d.ts.map +1 -0
- package/dist/types/src/__tests/MessageBoxClient.test.d.ts +2 -0
- package/dist/types/src/__tests/MessageBoxClient.test.d.ts.map +1 -0
- package/dist/types/src/__tests/PeerPayClientUnit.test.d.ts +2 -0
- package/dist/types/src/__tests/PeerPayClientUnit.test.d.ts.map +1 -0
- package/dist/types/src/__tests/integration/integrationEncrypted.test.d.ts +2 -0
- package/dist/types/src/__tests/integration/integrationEncrypted.test.d.ts.map +1 -0
- package/dist/types/src/__tests/integration/integrationHTTP.test.d.ts +2 -0
- package/dist/types/src/__tests/integration/integrationHTTP.test.d.ts.map +1 -0
- package/dist/types/src/__tests/integration/integrationOverlay.test.d.ts +2 -0
- package/dist/types/src/__tests/integration/integrationOverlay.test.d.ts.map +1 -0
- package/dist/types/src/__tests/integration/integrationWS.test.d.ts +2 -0
- package/dist/types/src/__tests/integration/integrationWS.test.d.ts.map +1 -0
- package/dist/types/src/__tests/integration/testServer.d.ts +9 -0
- package/dist/types/src/__tests/integration/testServer.d.ts.map +1 -0
- package/dist/types/src/types.d.ts +99 -0
- package/dist/types/src/types.d.ts.map +1 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -0
- package/dist/umd/bundle.js +1 -0
- 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":";;AAAA,qBAAqB;AACrB,mEAA4D;AAC5D,kCAAuC;AACvC,mCAAkC;AAClC,2CAAiE;AAEhE,MAAc,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,kBAAS,EAAE,CAAA;AAE5C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;AAEtB,MAAM,YAAY,GAAG,IAAI,kBAAY,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAA;AACvF,MAAM,gBAAgB,GAAG,IAAI,sCAAgB,CAAC;IAC5C,IAAI,EAAE,oCAAoC;IAC1C,YAAY;IACZ,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,OAAO;CACvB,CAAC,CAAA;AAEF,IAAI,WAAmB,CAAA;AAEvB,IAAA,kBAAQ,EAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,MAAM,UAAU,GAAG,SAAS,CAAA;IAC5B,MAAM,SAAS,GAAG,gCAAgC,CAAA;IAElD,IAAA,mBAAS,EAAC,KAAK,IAAI,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;QACrE,WAAW,GAAG,MAAM,CAAC,SAAS,CAAA;QAE9B,MAAM,gBAAgB,CAAC,oBAAoB,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,IAAA,cAAI,EAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACtE,UAAU;QACV,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;YAChD,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC1D,UAAU,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC;YAC7B,KAAK,EAAE,GAAG;YACV,YAAY,EAAE,MAAM;SACrB,CAAC,CAAA;QAEF,IAAA,gBAAM,EAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5C,IAAA,gBAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAE5C,UAAU;QACV,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;YAC/D,UAAU;YACV,UAAU,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC;YAC7B,KAAK,EAAE,GAAG;YACV,YAAY,EAAE,MAAM;SACrB,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAA;QAC3E,IAAA,gBAAM,EAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAA,cAAI,EAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC7E,uBAAuB;QACvB,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC;YACpD,SAAS,EAAE,WAAW;YACtB,UAAU;YACV,IAAI,EAAE,SAAS;SAChB,CAAC,CAAA;QAEF,IAAA,gBAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACzC,IAAA,gBAAM,EAAC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAElD,mBAAmB;QACnB,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC,CAAA;QACpE,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAE5B,IAAA,gBAAM,EAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;QAC1B,IAAA,gBAAM,EAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,IAAA,cAAI,EAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;;QAC7E,iCAAiC;QACjC,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,WAAW,CAAC;YACpD,SAAS,EAAE,WAAW;YACtB,UAAU;YACV,IAAI,EAAE,SAAS;SAChB,CAAC,CAAA;QAEF,IAAA,gBAAM,EAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAEzC,mCAAmC;QACnC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAClD,iDAAiD,EACjD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;SACrC,CACF,CAAA;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAA;QAC9B,MAAM,OAAO,GAAG,MAAA,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAA;QAEzC,IAAA,gBAAM,EAAC,OAAO,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAClC,IAAA,gBAAM,EAAC,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACrD,IAAA,gBAAM,EAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -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":";;AAAA,qBAAqB;AACrB,mEAA4D;AAC5D,kCAAuC;AACvC,mCAAkC;AAEjC,MAAc,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,kBAAS,EAAE,CAAA;AAE5C,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;AAEtB,MAAM,eAAe,GAAG,uBAAuB,CAAA;AAE/C,MAAM,OAAO,GAAG,IAAI,kBAAY,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;AACzD,MAAM,OAAO,GAAG,IAAI,kBAAY,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;AAEzD,MAAM,OAAO,GAAG,IAAI,sCAAgB,CAAC;IACnC,IAAI,EAAE,eAAe;IACrB,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;IACtB,aAAa,EAAE,IAAI;CACpB,CAAC,CAAA;AAEF,MAAM,OAAO,GAAG,IAAI,sCAAgB,CAAC;IACnC,IAAI,EAAE,eAAe;IACrB,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;IACtB,aAAa,EAAE,IAAI;CACpB,CAAC,CAAA;AAEF,IAAI,YAAoB,CAAA;AACxB,IAAI,YAAoB,CAAA;AAExB,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,YAAY,GAAG,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC5E,YAAY,GAAG,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC5E,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAA;IACpC,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAA;IACnC,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAA;AACrC,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,MAAM,OAAO,GAAG,kBAAkB,CAAA;IAClC,MAAM,OAAO,GAAG,uBAAuB,CAAA;IAEvC,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,QAAQ,GAAG,MAAO,OAAe,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAA;QAC7E,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAA;QAC9C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;YACzC,SAAS,EAAE,YAAY;YACvB,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;;QACzD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;QACpE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAC1C,MAAM,CAAC,MAAA,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;QACpE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;YACzC,SAAS,EAAE,YAAY;YACvB,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,+BAA+B;SACtC,CAAC,CAAA;QACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;QACpE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;QACpE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,QAAQ,GAAG,MAAO,OAAe,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAA;QAC7E,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;QACzD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;QACzD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACzC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;gBACzC,SAAS,EAAE,YAAY;gBACvB,UAAU,EAAE,OAAO;gBACnB,IAAI,EAAE,GAAG;aACV,CAAC,CAAA;YACF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACzC,CAAC;QAED,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;QACvD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;QACpE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE1B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,UAAU,GAAG,IAAI,sCAAgB,CAAC;YACtC,YAAY,EAAE,OAAO;YACrB,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,IAAI;YACnB,yBAAyB;SAC1B,CAAC,CAAA;QAEF,qBAAqB;QACrB,MAAM,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAEtC,mDAAmD;QACnD,MAAM,CAAE,UAAkB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,CAAE,UAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAEtD,8DAA8D;QAC9D,MAAM,YAAY,GAAG,MAAO,UAAkB,CAAC,uBAAuB,CAAC,YAAY,CAAC,CAAA;QACpF,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAE1C,MAAM,UAAU,CAAC,mBAAmB,EAAE,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|