@bsv/message-box-client 2.0.2 → 2.0.4
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 +1 -0
- package/dist/cjs/mod.js.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/src/MessageBoxClient.js +119 -30
- package/dist/cjs/src/MessageBoxClient.js.map +1 -1
- package/dist/cjs/src/RemittanceAdapter.js +137 -0
- package/dist/cjs/src/RemittanceAdapter.js.map +1 -0
- package/dist/cjs/src/__tests/RemittanceAdapter.test.js +133 -0
- package/dist/cjs/src/__tests/RemittanceAdapter.test.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/mod.js +1 -0
- package/dist/esm/mod.js.map +1 -1
- package/dist/esm/src/MessageBoxClient.js +119 -30
- package/dist/esm/src/MessageBoxClient.js.map +1 -1
- package/dist/esm/src/RemittanceAdapter.js +133 -0
- package/dist/esm/src/RemittanceAdapter.js.map +1 -0
- package/dist/esm/src/__tests/RemittanceAdapter.test.js +131 -0
- package/dist/esm/src/__tests/RemittanceAdapter.test.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/mod.d.ts +1 -0
- package/dist/types/mod.d.ts.map +1 -1
- package/dist/types/src/MessageBoxClient.d.ts +2 -0
- package/dist/types/src/MessageBoxClient.d.ts.map +1 -1
- package/dist/types/src/RemittanceAdapter.d.ts +103 -0
- package/dist/types/src/RemittanceAdapter.d.ts.map +1 -0
- package/dist/types/src/__tests/RemittanceAdapter.test.d.ts +2 -0
- package/dist/types/src/__tests/RemittanceAdapter.test.d.ts.map +1 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +1 -1
- package/mod.ts +1 -0
- package/package.json +1 -1
- package/src/MessageBoxClient.ts +148 -52
- package/src/RemittanceAdapter.ts +164 -0
- package/src/__tests/RemittanceAdapter.test.ts +153 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RemittanceAdapter - Adapts MessageBoxClient to the CommsLayer interface
|
|
4
|
+
*
|
|
5
|
+
* This adapter bridges MessageBoxClient with the ts-sdk RemittanceManager by implementing
|
|
6
|
+
* the CommsLayer interface. It handles the protocol differences between the two systems,
|
|
7
|
+
* particularly around message body format (MessageBoxClient returns parsed objects,
|
|
8
|
+
* RemittanceManager expects JSON strings).
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { RemittanceAdapter } from '@bsv/message-box-client'
|
|
13
|
+
* import { RemittanceManager } from '@bsv/sdk'
|
|
14
|
+
* import { MessageBoxClient } from '@bsv/message-box-client'
|
|
15
|
+
* import { WalletClient } from '@bsv/sdk'
|
|
16
|
+
*
|
|
17
|
+
* const wallet = new WalletClient()
|
|
18
|
+
* const messageBox = new MessageBoxClient({ walletClient: wallet })
|
|
19
|
+
* const commsLayer = new RemittanceAdapter(messageBox)
|
|
20
|
+
*
|
|
21
|
+
* const manager = new RemittanceManager(
|
|
22
|
+
* {
|
|
23
|
+
* messageBox: 'remittance_inbox',
|
|
24
|
+
* remittanceModules: [new Brc29RemittanceModule()]
|
|
25
|
+
* },
|
|
26
|
+
* wallet,
|
|
27
|
+
* commsLayer
|
|
28
|
+
* )
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.RemittanceAdapter = void 0;
|
|
33
|
+
/**
|
|
34
|
+
* Adapter that implements the CommsLayer interface for MessageBoxClient
|
|
35
|
+
*
|
|
36
|
+
* This class wraps MessageBoxClient to provide compatibility with the RemittanceManager
|
|
37
|
+
* communications interface. It handles format conversions, particularly ensuring message
|
|
38
|
+
* bodies are properly stringified for the RemittanceManager protocol.
|
|
39
|
+
*/
|
|
40
|
+
class RemittanceAdapter {
|
|
41
|
+
/**
|
|
42
|
+
* Creates a new RemittanceAdapter
|
|
43
|
+
* @param messageBox - The MessageBoxClient instance to adapt
|
|
44
|
+
*/
|
|
45
|
+
constructor(messageBox) {
|
|
46
|
+
this.messageBox = messageBox;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Sends a message over the store-and-forward channel
|
|
50
|
+
* @param args - Message parameters (recipient, messageBox, body)
|
|
51
|
+
* @param hostOverride - Optional host override
|
|
52
|
+
* @returns The transport message ID
|
|
53
|
+
*/
|
|
54
|
+
async sendMessage(args, hostOverride) {
|
|
55
|
+
const result = await this.messageBox.sendMessage({
|
|
56
|
+
recipient: args.recipient,
|
|
57
|
+
messageBox: args.messageBox,
|
|
58
|
+
body: args.body
|
|
59
|
+
}, hostOverride);
|
|
60
|
+
return result.messageId;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Sends a message over the live channel.
|
|
64
|
+
* MessageBoxClient handles transport fallback internally (WebSocket -> HTTP).
|
|
65
|
+
* @param args - Message parameters (recipient, messageBox, body)
|
|
66
|
+
* @param hostOverride - Optional host override
|
|
67
|
+
* @returns The transport message ID
|
|
68
|
+
*/
|
|
69
|
+
async sendLiveMessage(args, hostOverride) {
|
|
70
|
+
const result = await this.messageBox.sendLiveMessage({
|
|
71
|
+
recipient: args.recipient,
|
|
72
|
+
messageBox: args.messageBox,
|
|
73
|
+
body: args.body
|
|
74
|
+
}, hostOverride);
|
|
75
|
+
return result.messageId;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Lists pending messages for a message box
|
|
79
|
+
*
|
|
80
|
+
* Note: MessageBoxClient returns message bodies as parsed objects, but RemittanceManager
|
|
81
|
+
* expects them as JSON strings. This method handles the conversion.
|
|
82
|
+
*
|
|
83
|
+
* @param args - List parameters (messageBox, optional host)
|
|
84
|
+
* @returns Array of peer messages with stringified bodies
|
|
85
|
+
*/
|
|
86
|
+
async listMessages(args) {
|
|
87
|
+
const defaultRecipient = await this.messageBox.getIdentityKey();
|
|
88
|
+
const messages = await this.messageBox.listMessages({
|
|
89
|
+
messageBox: args.messageBox,
|
|
90
|
+
host: args.host
|
|
91
|
+
});
|
|
92
|
+
return messages.map(msg => this.toRemittancePeerMessage(msg, args.messageBox, defaultRecipient));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Acknowledges messages (deletes them from the server inbox)
|
|
96
|
+
* @param args - Array of message IDs to acknowledge
|
|
97
|
+
*/
|
|
98
|
+
async acknowledgeMessage(args) {
|
|
99
|
+
// MessageBoxClient's acknowledgeMessage expects the same format
|
|
100
|
+
await this.messageBox.acknowledgeMessage({ messageIds: args.messageIds });
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Starts a live listener and normalizes inbound messages to the remittance PeerMessage shape.
|
|
104
|
+
*/
|
|
105
|
+
async listenForLiveMessages(args) {
|
|
106
|
+
const defaultRecipient = await this.messageBox.getIdentityKey();
|
|
107
|
+
await this.messageBox.listenForLiveMessages({
|
|
108
|
+
messageBox: args.messageBox,
|
|
109
|
+
overrideHost: args.overrideHost,
|
|
110
|
+
onMessage: (msg) => {
|
|
111
|
+
args.onMessage(this.toRemittancePeerMessage(msg, args.messageBox, defaultRecipient));
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
toRemittancePeerMessage(msg, fallbackMessageBox, fallbackRecipient) {
|
|
116
|
+
var _a, _b;
|
|
117
|
+
return {
|
|
118
|
+
messageId: msg.messageId,
|
|
119
|
+
sender: msg.sender,
|
|
120
|
+
recipient: ((_a = msg.recipient) !== null && _a !== void 0 ? _a : fallbackRecipient),
|
|
121
|
+
messageBox: (_b = msg.messageBox) !== null && _b !== void 0 ? _b : fallbackMessageBox,
|
|
122
|
+
body: this.toBodyString(msg.body)
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
toBodyString(body) {
|
|
126
|
+
if (typeof body === 'string')
|
|
127
|
+
return body;
|
|
128
|
+
try {
|
|
129
|
+
return JSON.stringify(body);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return String(body);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.RemittanceAdapter = RemittanceAdapter;
|
|
137
|
+
//# sourceMappingURL=RemittanceAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemittanceAdapter.js","sourceRoot":"","sources":["../../../src/RemittanceAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-env jest */
|
|
4
|
+
const globals_1 = require("@jest/globals");
|
|
5
|
+
const RemittanceAdapter_js_1 = require("../RemittanceAdapter.js");
|
|
6
|
+
describe('RemittanceAdapter', () => {
|
|
7
|
+
const myIdentityKey = '02b463b8ef7f03c47fba2679c7334d13e4939b8ca30dbb6bbd22e34ea3e9b1b0e4';
|
|
8
|
+
const senderKey = '03f5d7a10f8ac22f0785a54d7d30fd009a77da27812f4e2f4ac9327dfcb5f65f86';
|
|
9
|
+
it('delegates sendMessage and returns the transport messageId', async () => {
|
|
10
|
+
const messageBox = {
|
|
11
|
+
sendMessage: globals_1.jest.fn().mockResolvedValue({
|
|
12
|
+
status: 'success',
|
|
13
|
+
messageId: 'http-mid'
|
|
14
|
+
})
|
|
15
|
+
};
|
|
16
|
+
const adapter = new RemittanceAdapter_js_1.RemittanceAdapter(messageBox);
|
|
17
|
+
const result = await adapter.sendMessage({
|
|
18
|
+
recipient: senderKey,
|
|
19
|
+
messageBox: 'remittance_inbox',
|
|
20
|
+
body: '{"v":1}'
|
|
21
|
+
}, 'https://override-host');
|
|
22
|
+
expect(result).toBe('http-mid');
|
|
23
|
+
expect(messageBox.sendMessage).toHaveBeenCalledWith({
|
|
24
|
+
recipient: senderKey,
|
|
25
|
+
messageBox: 'remittance_inbox',
|
|
26
|
+
body: '{"v":1}'
|
|
27
|
+
}, 'https://override-host');
|
|
28
|
+
});
|
|
29
|
+
it('delegates sendLiveMessage (live path) and returns the transport messageId', async () => {
|
|
30
|
+
const messageBox = {
|
|
31
|
+
sendLiveMessage: globals_1.jest.fn().mockResolvedValue({
|
|
32
|
+
status: 'success',
|
|
33
|
+
messageId: 'ws-mid'
|
|
34
|
+
})
|
|
35
|
+
};
|
|
36
|
+
const adapter = new RemittanceAdapter_js_1.RemittanceAdapter(messageBox);
|
|
37
|
+
const result = await adapter.sendLiveMessage({
|
|
38
|
+
recipient: senderKey,
|
|
39
|
+
messageBox: 'remittance_inbox',
|
|
40
|
+
body: '{"v":1}'
|
|
41
|
+
}, 'https://override-host');
|
|
42
|
+
expect(result).toBe('ws-mid');
|
|
43
|
+
expect(messageBox.sendLiveMessage).toHaveBeenCalledWith({
|
|
44
|
+
recipient: senderKey,
|
|
45
|
+
messageBox: 'remittance_inbox',
|
|
46
|
+
body: '{"v":1}'
|
|
47
|
+
}, 'https://override-host');
|
|
48
|
+
});
|
|
49
|
+
it('normalizes listMessages shape for remittance and forwards host', async () => {
|
|
50
|
+
const messageBox = {
|
|
51
|
+
getIdentityKey: globals_1.jest.fn().mockResolvedValue(myIdentityKey),
|
|
52
|
+
listMessages: globals_1.jest.fn().mockResolvedValue([
|
|
53
|
+
{
|
|
54
|
+
messageId: 'm1',
|
|
55
|
+
sender: senderKey,
|
|
56
|
+
created_at: '2026-01-01T00:00:00Z',
|
|
57
|
+
updated_at: '2026-01-01T00:00:00Z',
|
|
58
|
+
body: { kind: 'invoice', amount: 1 }
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
messageId: 'm2',
|
|
62
|
+
sender: senderKey,
|
|
63
|
+
recipient: '020202020202020202020202020202020202020202020202020202020202020202',
|
|
64
|
+
messageBox: 'custom_box',
|
|
65
|
+
created_at: '2026-01-01T00:00:00Z',
|
|
66
|
+
updated_at: '2026-01-01T00:00:00Z',
|
|
67
|
+
body: '{"kind":"receipt"}'
|
|
68
|
+
}
|
|
69
|
+
])
|
|
70
|
+
};
|
|
71
|
+
const adapter = new RemittanceAdapter_js_1.RemittanceAdapter(messageBox);
|
|
72
|
+
const result = await adapter.listMessages({
|
|
73
|
+
messageBox: 'remittance_inbox',
|
|
74
|
+
host: 'https://remote-host'
|
|
75
|
+
});
|
|
76
|
+
expect(messageBox.listMessages).toHaveBeenCalledWith({
|
|
77
|
+
messageBox: 'remittance_inbox',
|
|
78
|
+
host: 'https://remote-host'
|
|
79
|
+
});
|
|
80
|
+
expect(result).toEqual([
|
|
81
|
+
{
|
|
82
|
+
messageId: 'm1',
|
|
83
|
+
sender: senderKey,
|
|
84
|
+
recipient: myIdentityKey,
|
|
85
|
+
messageBox: 'remittance_inbox',
|
|
86
|
+
body: '{"kind":"invoice","amount":1}'
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
messageId: 'm2',
|
|
90
|
+
sender: senderKey,
|
|
91
|
+
recipient: '020202020202020202020202020202020202020202020202020202020202020202',
|
|
92
|
+
messageBox: 'custom_box',
|
|
93
|
+
body: '{"kind":"receipt"}'
|
|
94
|
+
}
|
|
95
|
+
]);
|
|
96
|
+
});
|
|
97
|
+
it('forwards live listener setup and normalizes inbound message shape', async () => {
|
|
98
|
+
const onPaymentMessage = globals_1.jest.fn();
|
|
99
|
+
let forwardedListener;
|
|
100
|
+
const messageBox = {
|
|
101
|
+
getIdentityKey: globals_1.jest.fn().mockResolvedValue(myIdentityKey),
|
|
102
|
+
listenForLiveMessages: globals_1.jest.fn().mockImplementation(async ({ onMessage }) => {
|
|
103
|
+
forwardedListener = onMessage;
|
|
104
|
+
})
|
|
105
|
+
};
|
|
106
|
+
const adapter = new RemittanceAdapter_js_1.RemittanceAdapter(messageBox);
|
|
107
|
+
await adapter.listenForLiveMessages({
|
|
108
|
+
messageBox: 'remittance_inbox',
|
|
109
|
+
overrideHost: 'https://ws-host',
|
|
110
|
+
onMessage: onPaymentMessage
|
|
111
|
+
});
|
|
112
|
+
expect(messageBox.listenForLiveMessages).toHaveBeenCalledWith({
|
|
113
|
+
messageBox: 'remittance_inbox',
|
|
114
|
+
overrideHost: 'https://ws-host',
|
|
115
|
+
onMessage: expect.any(Function)
|
|
116
|
+
});
|
|
117
|
+
forwardedListener === null || forwardedListener === void 0 ? void 0 : forwardedListener({
|
|
118
|
+
messageId: 'live-1',
|
|
119
|
+
sender: senderKey,
|
|
120
|
+
created_at: '2026-01-01T00:00:00Z',
|
|
121
|
+
updated_at: '2026-01-01T00:00:00Z',
|
|
122
|
+
body: { kind: 'settlement' }
|
|
123
|
+
});
|
|
124
|
+
expect(onPaymentMessage).toHaveBeenCalledWith({
|
|
125
|
+
messageId: 'live-1',
|
|
126
|
+
sender: senderKey,
|
|
127
|
+
recipient: myIdentityKey,
|
|
128
|
+
messageBox: 'remittance_inbox',
|
|
129
|
+
body: '{"kind":"settlement"}'
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=RemittanceAdapter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemittanceAdapter.test.js","sourceRoot":"","sources":["../../../../src/__tests/RemittanceAdapter.test.ts"],"names":[],"mappings":"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"}
|