@bsv/message-box-client
Version:
A client for P2P messaging and payments
81 lines • 3.39 kB
JavaScript
/* eslint-env jest */
import { MessageBoxClient } from '../../MessageBoxClient.js';
import { WalletClient } from '@bsv/sdk';
import { webcrypto } from 'crypto';
import { expect, test, describe, beforeAll } from '@jest/globals';
global.self = { crypto: webcrypto };
jest.setTimeout(20000);
const walletClient = new WalletClient('json-api', 'https://messagebox.babbage.systems');
const messageBoxClient = new MessageBoxClient({
host: 'https://messagebox.babbage.systems',
walletClient,
enableLogging: true,
networkPreset: 'local'
});
let identityKey;
describe('Encryption Integration Tests', () => {
const messageBox = 'testBox';
const plaintext = 'This is a secure test message.';
beforeAll(async () => {
const result = await walletClient.getPublicKey({ identityKey: true });
identityKey = result.publicKey;
await messageBoxClient.initializeConnection();
});
test('encrypts and decrypts a message to self successfully', async () => {
// Encrypt
const { ciphertext } = await walletClient.encrypt({
plaintext: Array.from(new TextEncoder().encode(plaintext)),
protocolID: [1, 'messagebox'],
keyID: '1',
counterparty: 'self'
});
expect(Array.isArray(ciphertext)).toBe(true);
expect(ciphertext.length).toBeGreaterThan(0);
// Decrypt
const { plaintext: decryptedBytes } = await walletClient.decrypt({
ciphertext,
protocolID: [1, 'messagebox'],
keyID: '1',
counterparty: 'self'
});
const decrypted = new TextDecoder().decode(Uint8Array.from(decryptedBytes));
expect(decrypted).toBe(plaintext);
});
test('sends and receives encrypted message using MessageBoxClient', async () => {
// Send message to self
const sendResult = await messageBoxClient.sendMessage({
recipient: identityKey,
messageBox,
body: plaintext
});
expect(sendResult.status).toBe('success');
expect(typeof sendResult.messageId).toBe('string');
// List and decrypt
const messages = await messageBoxClient.listMessages({ messageBox });
const last = messages.at(-1);
expect(last).toBeDefined();
expect(last?.body).toBe(plaintext);
});
test('encrypted message is not stored or transmitted as plaintext', async () => {
// Send encrypted message to self
const sendResult = await messageBoxClient.sendMessage({
recipient: identityKey,
messageBox,
body: plaintext
});
expect(sendResult.status).toBe('success');
// Manually fetch raw HTTP response
const fetch = await messageBoxClient.authFetch.fetch('https://messagebox.babbage.systems/listMessages', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ messageBox })
});
const raw = await fetch.json();
const rawBody = raw.messages.at(-1)?.body;
expect(typeof rawBody).toBe('string');
const parsed = JSON.parse(rawBody);
expect(typeof parsed.encryptedMessage).toBe('string');
expect(parsed.encryptedMessage.includes(plaintext)).toBe(false);
});
});
//# sourceMappingURL=integrationEncrypted.test.js.map