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