@bsv/sdk 1.1.32 → 1.2.0

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 (229) hide show
  1. package/dist/cjs/mod.js +4 -0
  2. package/dist/cjs/mod.js.map +1 -1
  3. package/dist/cjs/package.json +4 -3
  4. package/dist/cjs/src/auth/Certificate.js +163 -0
  5. package/dist/cjs/src/auth/Certificate.js.map +1 -0
  6. package/dist/cjs/src/auth/index.js +9 -0
  7. package/dist/cjs/src/auth/index.js.map +1 -0
  8. package/dist/cjs/src/compat/BSM.js +17 -7
  9. package/dist/cjs/src/compat/BSM.js.map +1 -1
  10. package/dist/cjs/src/compat/ECIES.js +17 -7
  11. package/dist/cjs/src/compat/ECIES.js.map +1 -1
  12. package/dist/cjs/src/compat/HD.js +17 -7
  13. package/dist/cjs/src/compat/HD.js.map +1 -1
  14. package/dist/cjs/src/compat/Mnemonic.js +17 -7
  15. package/dist/cjs/src/compat/Mnemonic.js.map +1 -1
  16. package/dist/cjs/src/compat/index.js +17 -7
  17. package/dist/cjs/src/compat/index.js.map +1 -1
  18. package/dist/cjs/src/messages/index.js +17 -7
  19. package/dist/cjs/src/messages/index.js.map +1 -1
  20. package/dist/cjs/src/overlay-tools/LookupResolver.js +170 -0
  21. package/dist/cjs/src/overlay-tools/LookupResolver.js.map +1 -0
  22. package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js +69 -0
  23. package/dist/cjs/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -0
  24. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js +336 -0
  25. package/dist/cjs/src/overlay-tools/SHIPBroadcaster.js.map +1 -0
  26. package/dist/cjs/src/overlay-tools/index.js +29 -0
  27. package/dist/cjs/src/overlay-tools/index.js.map +1 -0
  28. package/dist/cjs/src/primitives/PrivateKey.js +17 -7
  29. package/dist/cjs/src/primitives/PrivateKey.js.map +1 -1
  30. package/dist/cjs/src/primitives/TransactionSignature.js +17 -7
  31. package/dist/cjs/src/primitives/TransactionSignature.js.map +1 -1
  32. package/dist/cjs/src/primitives/index.js +17 -7
  33. package/dist/cjs/src/primitives/index.js.map +1 -1
  34. package/dist/cjs/src/script/Spend.js +17 -7
  35. package/dist/cjs/src/script/Spend.js.map +1 -1
  36. package/dist/cjs/src/script/templates/PushDrop.js +218 -0
  37. package/dist/cjs/src/script/templates/PushDrop.js.map +1 -0
  38. package/dist/cjs/src/script/templates/index.js +3 -1
  39. package/dist/cjs/src/script/templates/index.js.map +1 -1
  40. package/dist/cjs/src/transaction/Beef.js +35 -6
  41. package/dist/cjs/src/transaction/Beef.js.map +1 -1
  42. package/dist/cjs/src/transaction/Transaction.js +13 -4
  43. package/dist/cjs/src/transaction/Transaction.js.map +1 -1
  44. package/dist/cjs/src/transaction/http/DefaultHttpClient.js +1 -1
  45. package/dist/cjs/src/transaction/http/DefaultHttpClient.js.map +1 -1
  46. package/dist/cjs/src/wallet/CachedKeyDeriver.js +177 -0
  47. package/dist/cjs/src/wallet/CachedKeyDeriver.js.map +1 -0
  48. package/dist/cjs/src/wallet/KeyDeriver.js +174 -0
  49. package/dist/cjs/src/wallet/KeyDeriver.js.map +1 -0
  50. package/dist/cjs/src/wallet/ProtoWallet.js +245 -0
  51. package/dist/cjs/src/wallet/ProtoWallet.js.map +1 -0
  52. package/dist/cjs/src/wallet/Wallet.interfaces.js +3 -0
  53. package/dist/cjs/src/wallet/Wallet.interfaces.js.map +1 -0
  54. package/dist/cjs/src/wallet/WalletClient.js +181 -0
  55. package/dist/cjs/src/wallet/WalletClient.js.map +1 -0
  56. package/dist/cjs/src/wallet/WalletError.js +28 -0
  57. package/dist/cjs/src/wallet/WalletError.js.map +1 -0
  58. package/dist/cjs/src/wallet/index.js +34 -0
  59. package/dist/cjs/src/wallet/index.js.map +1 -0
  60. package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js +45 -0
  61. package/dist/cjs/src/wallet/substrates/HTTPWalletWire.js.map +1 -0
  62. package/dist/cjs/src/wallet/substrates/WalletWire.js +3 -0
  63. package/dist/cjs/src/wallet/substrates/WalletWire.js.map +1 -0
  64. package/dist/cjs/src/wallet/substrates/WalletWireCalls.js +36 -0
  65. package/dist/cjs/src/wallet/substrates/WalletWireCalls.js.map +1 -0
  66. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +1821 -0
  67. package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -0
  68. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +1305 -0
  69. package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -0
  70. package/dist/cjs/src/wallet/substrates/XDM.js +130 -0
  71. package/dist/cjs/src/wallet/substrates/XDM.js.map +1 -0
  72. package/dist/cjs/src/wallet/substrates/index.js +33 -0
  73. package/dist/cjs/src/wallet/substrates/index.js.map +1 -0
  74. package/dist/cjs/src/wallet/substrates/window.CWI.js +102 -0
  75. package/dist/cjs/src/wallet/substrates/window.CWI.js.map +1 -0
  76. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  77. package/dist/esm/mod.js +4 -0
  78. package/dist/esm/mod.js.map +1 -1
  79. package/dist/esm/src/auth/Certificate.js +185 -0
  80. package/dist/esm/src/auth/Certificate.js.map +1 -0
  81. package/dist/esm/src/auth/index.js +2 -0
  82. package/dist/esm/src/auth/index.js.map +1 -0
  83. package/dist/esm/src/overlay-tools/LookupResolver.js +167 -0
  84. package/dist/esm/src/overlay-tools/LookupResolver.js.map +1 -0
  85. package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js +64 -0
  86. package/dist/esm/src/overlay-tools/OverlayAdminTokenTemplate.js.map +1 -0
  87. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js +335 -0
  88. package/dist/esm/src/overlay-tools/SHIPBroadcaster.js.map +1 -0
  89. package/dist/esm/src/overlay-tools/index.js +6 -0
  90. package/dist/esm/src/overlay-tools/index.js.map +1 -0
  91. package/dist/esm/src/script/templates/PushDrop.js +215 -0
  92. package/dist/esm/src/script/templates/PushDrop.js.map +1 -0
  93. package/dist/esm/src/script/templates/index.js +1 -0
  94. package/dist/esm/src/script/templates/index.js.map +1 -1
  95. package/dist/esm/src/transaction/Beef.js +35 -6
  96. package/dist/esm/src/transaction/Beef.js.map +1 -1
  97. package/dist/esm/src/transaction/Transaction.js +13 -4
  98. package/dist/esm/src/transaction/Transaction.js.map +1 -1
  99. package/dist/esm/src/transaction/http/DefaultHttpClient.js +1 -1
  100. package/dist/esm/src/transaction/http/DefaultHttpClient.js.map +1 -1
  101. package/dist/esm/src/wallet/CachedKeyDeriver.js +174 -0
  102. package/dist/esm/src/wallet/CachedKeyDeriver.js.map +1 -0
  103. package/dist/esm/src/wallet/KeyDeriver.js +172 -0
  104. package/dist/esm/src/wallet/KeyDeriver.js.map +1 -0
  105. package/dist/esm/src/wallet/ProtoWallet.js +207 -0
  106. package/dist/esm/src/wallet/ProtoWallet.js.map +1 -0
  107. package/dist/esm/src/wallet/Wallet.interfaces.js +2 -0
  108. package/dist/esm/src/wallet/Wallet.interfaces.js.map +1 -0
  109. package/dist/esm/src/wallet/WalletClient.js +177 -0
  110. package/dist/esm/src/wallet/WalletClient.js.map +1 -0
  111. package/dist/esm/src/wallet/WalletError.js +25 -0
  112. package/dist/esm/src/wallet/WalletError.js.map +1 -0
  113. package/dist/esm/src/wallet/index.js +9 -0
  114. package/dist/esm/src/wallet/index.js.map +1 -0
  115. package/dist/esm/src/wallet/substrates/HTTPWalletWire.js +42 -0
  116. package/dist/esm/src/wallet/substrates/HTTPWalletWire.js.map +1 -0
  117. package/dist/esm/src/wallet/substrates/WalletWire.js +2 -0
  118. package/dist/esm/src/wallet/substrates/WalletWire.js.map +1 -0
  119. package/dist/esm/src/wallet/substrates/WalletWireCalls.js +34 -0
  120. package/dist/esm/src/wallet/substrates/WalletWireCalls.js.map +1 -0
  121. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +1816 -0
  122. package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -0
  123. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +1300 -0
  124. package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -0
  125. package/dist/esm/src/wallet/substrates/XDM.js +128 -0
  126. package/dist/esm/src/wallet/substrates/XDM.js.map +1 -0
  127. package/dist/esm/src/wallet/substrates/index.js +8 -0
  128. package/dist/esm/src/wallet/substrates/index.js.map +1 -0
  129. package/dist/esm/src/wallet/substrates/window.CWI.js +100 -0
  130. package/dist/esm/src/wallet/substrates/window.CWI.js.map +1 -0
  131. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  132. package/dist/types/mod.d.ts +4 -0
  133. package/dist/types/mod.d.ts.map +1 -1
  134. package/dist/types/src/auth/Certificate.d.ts +76 -0
  135. package/dist/types/src/auth/Certificate.d.ts.map +1 -0
  136. package/dist/types/src/auth/index.d.ts +2 -0
  137. package/dist/types/src/auth/index.d.ts.map +1 -0
  138. package/dist/types/src/overlay-tools/LookupResolver.d.ts +71 -0
  139. package/dist/types/src/overlay-tools/LookupResolver.d.ts.map +1 -0
  140. package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts +44 -0
  141. package/dist/types/src/overlay-tools/OverlayAdminTokenTemplate.d.ts.map +1 -0
  142. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts +90 -0
  143. package/dist/types/src/overlay-tools/SHIPBroadcaster.d.ts.map +1 -0
  144. package/dist/types/src/overlay-tools/index.d.ts +6 -0
  145. package/dist/types/src/overlay-tools/index.d.ts.map +1 -0
  146. package/dist/types/src/script/templates/PushDrop.d.ts +53 -0
  147. package/dist/types/src/script/templates/PushDrop.d.ts.map +1 -0
  148. package/dist/types/src/script/templates/index.d.ts +1 -0
  149. package/dist/types/src/script/templates/index.d.ts.map +1 -1
  150. package/dist/types/src/transaction/Beef.d.ts +16 -1
  151. package/dist/types/src/transaction/Beef.d.ts.map +1 -1
  152. package/dist/types/src/transaction/Transaction.d.ts.map +1 -1
  153. package/dist/types/src/wallet/CachedKeyDeriver.d.ts +92 -0
  154. package/dist/types/src/wallet/CachedKeyDeriver.d.ts.map +1 -0
  155. package/dist/types/src/wallet/KeyDeriver.d.ts +72 -0
  156. package/dist/types/src/wallet/KeyDeriver.d.ts.map +1 -0
  157. package/dist/types/src/wallet/ProtoWallet.d.ts +415 -0
  158. package/dist/types/src/wallet/ProtoWallet.d.ts.map +1 -0
  159. package/dist/types/src/wallet/Wallet.interfaces.d.ts +996 -0
  160. package/dist/types/src/wallet/Wallet.interfaces.d.ts.map +1 -0
  161. package/dist/types/src/wallet/WalletClient.d.ts +182 -0
  162. package/dist/types/src/wallet/WalletClient.d.ts.map +1 -0
  163. package/dist/types/src/wallet/WalletError.d.ts +14 -0
  164. package/dist/types/src/wallet/WalletError.d.ts.map +1 -0
  165. package/dist/types/src/wallet/index.d.ts +9 -0
  166. package/dist/types/src/wallet/index.d.ts.map +1 -0
  167. package/dist/types/src/wallet/substrates/HTTPWalletWire.d.ts +9 -0
  168. package/dist/types/src/wallet/substrates/HTTPWalletWire.d.ts.map +1 -0
  169. package/dist/types/src/wallet/substrates/WalletWire.d.ts +7 -0
  170. package/dist/types/src/wallet/substrates/WalletWire.d.ts.map +1 -0
  171. package/dist/types/src/wallet/substrates/WalletWireCalls.d.ts +33 -0
  172. package/dist/types/src/wallet/substrates/WalletWireCalls.d.ts.map +1 -0
  173. package/dist/types/src/wallet/substrates/WalletWireProcessor.d.ts +18 -0
  174. package/dist/types/src/wallet/substrates/WalletWireProcessor.d.ts.map +1 -0
  175. package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts +196 -0
  176. package/dist/types/src/wallet/substrates/WalletWireTransceiver.d.ts.map +1 -0
  177. package/dist/types/src/wallet/substrates/XDM.d.ts +412 -0
  178. package/dist/types/src/wallet/substrates/XDM.d.ts.map +1 -0
  179. package/dist/types/src/wallet/substrates/index.d.ts +8 -0
  180. package/dist/types/src/wallet/substrates/index.d.ts.map +1 -0
  181. package/dist/types/src/wallet/substrates/window.CWI.d.ts +410 -0
  182. package/dist/types/src/wallet/substrates/window.CWI.d.ts.map +1 -0
  183. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  184. package/dist/umd/bundle.js +1 -1
  185. package/docs/overlay-tools.md +551 -0
  186. package/docs/script.md +135 -0
  187. package/docs/totp.md +119 -0
  188. package/docs/transaction.md +25 -0
  189. package/docs/wallet-substrates.md +10 -0
  190. package/docs/wallet.md +4182 -0
  191. package/mod.ts +5 -1
  192. package/package.json +44 -3
  193. package/src/auth/Certificate.ts +233 -0
  194. package/src/auth/__tests/Certificate.test.ts +282 -0
  195. package/src/auth/index.ts +1 -0
  196. package/src/overlay-tools/LookupResolver.ts +228 -0
  197. package/src/overlay-tools/OverlayAdminTokenTemplate.ts +79 -0
  198. package/src/overlay-tools/SHIPBroadcaster.ts +405 -0
  199. package/src/overlay-tools/__tests/LookupResolver.test.ts +1403 -0
  200. package/src/overlay-tools/__tests/OverlayAdminTokenTemplate.test.ts +69 -0
  201. package/src/overlay-tools/__tests/SHIPBroadcaster.test.ts +904 -0
  202. package/src/overlay-tools/index.ts +5 -0
  203. package/src/script/templates/PushDrop.ts +246 -0
  204. package/src/script/templates/__tests/PushDrop.test.ts +158 -0
  205. package/src/script/templates/index.ts +1 -0
  206. package/src/transaction/Beef.ts +36 -6
  207. package/src/transaction/Transaction.ts +13 -4
  208. package/src/transaction/__tests/Beef.test.ts +20 -6
  209. package/src/transaction/http/DefaultHttpClient.ts +1 -1
  210. package/src/wallet/CachedKeyDeriver.ts +193 -0
  211. package/src/wallet/KeyDeriver.ts +178 -0
  212. package/src/wallet/ProtoWallet.ts +732 -0
  213. package/src/wallet/Wallet.interfaces.ts +1170 -0
  214. package/src/wallet/WalletClient.ts +201 -0
  215. package/src/wallet/WalletError.ts +27 -0
  216. package/src/wallet/__tests/CachedKeyDeriver.test.ts +322 -0
  217. package/src/wallet/__tests/KeyDeriver.test.ts +118 -0
  218. package/src/wallet/__tests/ProtoWallet.test.ts +543 -0
  219. package/src/wallet/index.ts +8 -0
  220. package/src/wallet/substrates/HTTPWalletWire.ts +47 -0
  221. package/src/wallet/substrates/WalletWire.ts +6 -0
  222. package/src/wallet/substrates/WalletWireCalls.ts +34 -0
  223. package/src/wallet/substrates/WalletWireProcessor.ts +2046 -0
  224. package/src/wallet/substrates/WalletWireTransceiver.ts +1454 -0
  225. package/src/wallet/substrates/XDM.ts +157 -0
  226. package/src/wallet/substrates/__tests/WalletWire.integration.test.ts +2194 -0
  227. package/src/wallet/substrates/__tests/XDM.test.ts +659 -0
  228. package/src/wallet/substrates/index.ts +7 -0
  229. package/src/wallet/substrates/window.CWI.ts +133 -0
@@ -0,0 +1,659 @@
1
+ /**
2
+ * @jest-environment jsdom
3
+ */
4
+
5
+ import XDMSubstrate from '../../../../dist/cjs/src/wallet/substrates/XDM.js'
6
+ import { WalletError } from '../../../../dist/cjs/src/wallet/WalletError.js'
7
+ import { Utils } from '../../../../dist/cjs/src/primitives/index.js'
8
+
9
+ describe('XDMSubstrate', () => {
10
+ let xdmSubstrate;
11
+ let originalWindow;
12
+ let eventHandlers = {};
13
+
14
+ beforeEach(() => {
15
+ // Save the original window object
16
+ originalWindow = global.window;
17
+
18
+ // Reset event handlers
19
+ eventHandlers = {};
20
+
21
+ // Mock window object
22
+ global.window = {
23
+ postMessage: jest.fn(),
24
+ parent: {
25
+ postMessage: jest.fn(),
26
+ } as unknown as Window,
27
+ addEventListener: jest.fn((event, handler) => {
28
+ eventHandlers[event] = handler;
29
+ }),
30
+ } as unknown as Window & typeof globalThis;
31
+
32
+ jest.spyOn(window.parent, 'postMessage')
33
+ });
34
+
35
+ afterEach(() => {
36
+ // Restore the original window object
37
+ global.window = originalWindow;
38
+ jest.restoreAllMocks();
39
+ });
40
+
41
+ describe('constructor', () => {
42
+ it('should throw if window is not an object', () => {
43
+ delete (global as any).window
44
+ expect(() => {
45
+ const _ = new XDMSubstrate();
46
+ }).toThrow('The XDM substrate requires a global window object.');
47
+ });
48
+
49
+ it('should throw if window.postMessage is not an object', () => {
50
+ delete (global as any).window.postMessage
51
+ expect(() => {
52
+ const _ = new XDMSubstrate();
53
+ }).toThrow('The window object does not seem to support postMessage calls.');
54
+ });
55
+
56
+ it('should construct successfully if window and window.postMessage are defined', () => {
57
+ expect(() => {
58
+ xdmSubstrate = new XDMSubstrate();
59
+ }).not.toThrow();
60
+ });
61
+ });
62
+
63
+ describe('invoke', () => {
64
+ beforeEach(() => {
65
+ xdmSubstrate = new XDMSubstrate();
66
+ });
67
+
68
+ it('should send a message to window.parent.postMessage with correct parameters', async () => {
69
+ const call = 'testCall';
70
+ const args = { foo: 'bar' };
71
+ const mockId = 'mockedId';
72
+
73
+ jest.spyOn(Utils, 'toBase64').mockReturnValue(mockId);
74
+
75
+ xdmSubstrate.invoke(call, args);
76
+ expect(window.parent.postMessage).toHaveBeenCalledWith(
77
+ {
78
+ type: 'CWI',
79
+ isInvocation: true,
80
+ id: mockId,
81
+ call,
82
+ args,
83
+ },
84
+ '*'
85
+ )
86
+ })
87
+
88
+ it('should resolve when receiving a valid message', async () => {
89
+ const call = 'testCall';
90
+ const args = { foo: 'bar' };
91
+ const result = { data: 'some data' };
92
+ const mockId = 'mockedId';
93
+
94
+ jest.spyOn(Utils, 'toBase64').mockReturnValue(mockId)
95
+
96
+ const invokePromise = xdmSubstrate.invoke(call, args);
97
+
98
+ // Simulate receiving the message
99
+ const event = {
100
+ data: {
101
+ type: 'CWI',
102
+ isInvocation: false,
103
+ id: mockId,
104
+ status: 'success',
105
+ result,
106
+ },
107
+ isTrusted: true,
108
+ };
109
+
110
+ eventHandlers['message'](event);
111
+
112
+ const res = await invokePromise;
113
+
114
+ expect(res).toEqual(result);
115
+ });
116
+
117
+ it('should reject when receiving an error message', async () => {
118
+ const call = 'testCall';
119
+ const args = { foo: 'bar' };
120
+ const errorDescription = 'An error occurred';
121
+ const errorCode = 123;
122
+ const mockId = 'mockedId';
123
+
124
+ jest.spyOn(Utils, 'toBase64').mockReturnValue(mockId);
125
+
126
+ const invokePromise = xdmSubstrate.invoke(call, args);
127
+
128
+ // Simulate receiving the message
129
+ const event = {
130
+ data: {
131
+ type: 'CWI',
132
+ isInvocation: false,
133
+ id: mockId,
134
+ status: 'error',
135
+ description: errorDescription,
136
+ code: errorCode,
137
+ },
138
+ isTrusted: true,
139
+ };
140
+
141
+ eventHandlers['message'](event);
142
+
143
+ await expect(invokePromise).rejects.toThrow(WalletError);
144
+ await expect(invokePromise).rejects.toThrow(errorDescription);
145
+ try {
146
+ await invokePromise;
147
+ } catch (err) {
148
+ expect(err.code).toBe(errorCode);
149
+ }
150
+ });
151
+
152
+ it('should ignore messages with incorrect type', async () => {
153
+ const call = 'testCall';
154
+ const args = { foo: 'bar' };
155
+ const result = { data: 'some data' };
156
+ const mockId = 'mockedId';
157
+
158
+ jest.spyOn(Utils, 'toBase64').mockReturnValue(mockId);
159
+
160
+
161
+ const invokePromise = xdmSubstrate.invoke(call, args);
162
+
163
+ // Simulate receiving an unrelated message
164
+ const event = {
165
+ data: {
166
+ type: 'WrongType',
167
+ isInvocation: false,
168
+ id: mockId,
169
+ status: 'success',
170
+ result,
171
+ },
172
+ isTrusted: true,
173
+ };
174
+
175
+ eventHandlers['message'](event);
176
+
177
+ // The promise should still be pending
178
+ let isResolved = false;
179
+ invokePromise.then(() => {
180
+ isResolved = true;
181
+ });
182
+
183
+ // Wait a bit to ensure no unintended resolution
184
+ await new Promise((resolve) => setTimeout(resolve, 1));
185
+ expect(isResolved).toBe(false);
186
+ });
187
+
188
+ it('should ignore messages with incorrect id', async () => {
189
+ const call = 'testCall';
190
+ const args = { foo: 'bar' };
191
+ const result = { data: 'some data' };
192
+ const mockId = 'mockedId';
193
+
194
+ jest.spyOn(Utils, 'toBase64').mockReturnValue(mockId);
195
+
196
+
197
+ const invokePromise = xdmSubstrate.invoke(call, args);
198
+
199
+ // Simulate receiving a message with wrong id
200
+ const event = {
201
+ data: {
202
+ type: 'CWI',
203
+ isInvocation: false,
204
+ id: 'wrongId',
205
+ status: 'success',
206
+ result,
207
+ },
208
+ isTrusted: true,
209
+ };
210
+
211
+ eventHandlers['message'](event);
212
+
213
+ // The promise should still be pending
214
+ let isResolved = false;
215
+ invokePromise.then(() => {
216
+ isResolved = true;
217
+ });
218
+
219
+ // Wait a bit to ensure no unintended resolution
220
+ await new Promise((resolve) => setTimeout(resolve, 1));
221
+ expect(isResolved).toBe(false);
222
+ });
223
+
224
+ it('should ignore messages where e.isTrusted is false', async () => {
225
+ const call = 'testCall';
226
+ const args = { foo: 'bar' };
227
+ const result = { data: 'some data' };
228
+ const mockId = 'mockedId';
229
+
230
+ jest.spyOn(Utils, 'toBase64').mockReturnValue(mockId);
231
+
232
+
233
+ const invokePromise = xdmSubstrate.invoke(call, args);
234
+
235
+ // Simulate receiving a message with isTrusted false
236
+ const event = {
237
+ data: {
238
+ type: 'CWI',
239
+ isInvocation: false,
240
+ id: mockId,
241
+ status: 'success',
242
+ result,
243
+ },
244
+ isTrusted: false,
245
+ };
246
+
247
+ eventHandlers['message'](event);
248
+
249
+ // The promise should still be pending
250
+ let isResolved = false;
251
+ invokePromise.then(() => {
252
+ isResolved = true;
253
+ });
254
+
255
+ // Wait a bit to ensure no unintended resolution
256
+ await new Promise((resolve) => setTimeout(resolve, 1));
257
+ expect(isResolved).toBe(false);
258
+ });
259
+
260
+ it('should ignore messages where e.data.isInvocation is true', async () => {
261
+ const call = 'testCall';
262
+ const args = { foo: 'bar' };
263
+ const result = { data: 'some data' };
264
+ const mockId = 'mockedId';
265
+
266
+ jest.spyOn(Utils, 'toBase64').mockReturnValue(mockId);
267
+
268
+
269
+ const invokePromise = xdmSubstrate.invoke(call, args);
270
+
271
+ // Simulate receiving a message with isInvocation true
272
+ const event = {
273
+ data: {
274
+ type: 'CWI',
275
+ isInvocation: true,
276
+ id: mockId,
277
+ status: 'success',
278
+ result,
279
+ },
280
+ isTrusted: true,
281
+ };
282
+
283
+ eventHandlers['message'](event);
284
+
285
+ // The promise should still be pending
286
+ let isResolved = false;
287
+ invokePromise.then(() => {
288
+ isResolved = true;
289
+ });
290
+
291
+ // Wait a bit to ensure no unintended resolution
292
+ await new Promise((resolve) => setTimeout(resolve, 1));
293
+ expect(isResolved).toBe(false);
294
+ });
295
+ });
296
+
297
+ // Helper function to test methods
298
+ const testMethod = (methodName, args, result) => {
299
+ describe(methodName, () => {
300
+ beforeEach(() => {
301
+ xdmSubstrate = new XDMSubstrate();
302
+ });
303
+
304
+ it(`should call invoke with correct arguments and return the result`, async () => {
305
+ const call = methodName;
306
+ const mockId = 'mockedId';
307
+
308
+ jest.spyOn(Utils, 'toBase64').mockReturnValue(mockId);
309
+
310
+
311
+ const invokePromise = xdmSubstrate[methodName](args);
312
+
313
+ expect(window.parent.postMessage).toHaveBeenCalledWith(
314
+ {
315
+ type: 'CWI',
316
+ isInvocation: true,
317
+ id: mockId,
318
+ call,
319
+ args,
320
+ },
321
+ '*',
322
+ );
323
+
324
+ const event = {
325
+ data: {
326
+ type: 'CWI',
327
+ isInvocation: false,
328
+ id: mockId,
329
+ status: 'success',
330
+ result,
331
+ },
332
+ isTrusted: true,
333
+ };
334
+
335
+ eventHandlers['message'](event);
336
+
337
+ const res = await invokePromise;
338
+ expect(res).toEqual(result);
339
+ });
340
+
341
+ it('should throw error when invoke rejects', async () => {
342
+ const call = methodName;
343
+ const errorDescription = 'An error occurred';
344
+ const errorCode = 123;
345
+ const mockId = 'mockedId';
346
+
347
+ jest.spyOn(Utils, 'toBase64').mockReturnValue(mockId);
348
+
349
+
350
+ const invokePromise = xdmSubstrate[methodName](args);
351
+
352
+ expect(window.parent.postMessage).toHaveBeenCalledWith(
353
+ {
354
+ type: 'CWI',
355
+ isInvocation: true,
356
+ id: mockId,
357
+ call,
358
+ args,
359
+ },
360
+ '*',
361
+ );
362
+
363
+ // Simulate receiving an error message
364
+ const event = {
365
+ data: {
366
+ type: 'CWI',
367
+ isInvocation: false,
368
+ id: mockId,
369
+ status: 'error',
370
+ description: errorDescription,
371
+ code: errorCode,
372
+ },
373
+ isTrusted: true,
374
+ };
375
+
376
+ eventHandlers['message'](event);
377
+
378
+ await expect(invokePromise).rejects.toThrow(WalletError);
379
+ await expect(invokePromise).rejects.toThrow(errorDescription);
380
+ await invokePromise.catch((err) => {
381
+ expect(err.code).toBe(errorCode);
382
+ });
383
+ });
384
+ });
385
+ };
386
+
387
+ // List of methods to test
388
+ const methodsToTest = [
389
+ {
390
+ methodName: 'createAction',
391
+ args: {
392
+ description: 'Test description',
393
+ inputs: [],
394
+ outputs: [],
395
+ },
396
+ result: { txid: 'abc123' },
397
+ },
398
+ {
399
+ methodName: 'signAction',
400
+ args: {
401
+ spends: {},
402
+ reference: 'someReference',
403
+ },
404
+ result: { txid: 'abc123' },
405
+ },
406
+ {
407
+ methodName: 'abortAction',
408
+ args: {
409
+ reference: 'someReference',
410
+ },
411
+ result: { aborted: true },
412
+ },
413
+ {
414
+ methodName: 'listActions',
415
+ args: {
416
+ labels: [],
417
+ },
418
+ result: { totalActions: 0, actions: [] },
419
+ },
420
+ {
421
+ methodName: 'internalizeAction',
422
+ args: {
423
+ tx: 'someTx',
424
+ outputs: [],
425
+ description: 'Test description',
426
+ },
427
+ result: { accepted: true },
428
+ },
429
+ {
430
+ methodName: 'listOutputs',
431
+ args: {
432
+ basket: 'someBasket',
433
+ },
434
+ result: { totalOutputs: 0, outputs: [] },
435
+ },
436
+ {
437
+ methodName: 'relinquishOutput',
438
+ args: {
439
+ basket: 'someBasket',
440
+ output: 'someOutput',
441
+ },
442
+ result: { relinquished: true },
443
+ },
444
+ {
445
+ methodName: 'getPublicKey',
446
+ args: {
447
+ identityKey: true,
448
+ },
449
+ result: { publicKey: 'somePubKey' },
450
+ },
451
+ {
452
+ methodName: 'revealCounterpartyKeyLinkage',
453
+ args: {
454
+ counterparty: 'someCounterparty',
455
+ verifier: 'someVerifier',
456
+ },
457
+ result: {
458
+ prover: 'someProver',
459
+ verifier: 'someVerifier',
460
+ counterparty: 'someCounterparty',
461
+ revelationTime: 'someTime',
462
+ encryptedLinkage: [],
463
+ encryptedLinkageProof: [],
464
+ },
465
+ },
466
+ {
467
+ methodName: 'revealSpecificKeyLinkage',
468
+ args: {
469
+ counterparty: 'someCounterparty',
470
+ verifier: 'someVerifier',
471
+ protocolID: [0, 'someProtocol'],
472
+ keyID: 'someKeyID',
473
+ },
474
+ result: {
475
+ prover: 'someProver',
476
+ verifier: 'someVerifier',
477
+ counterparty: 'someCounterparty',
478
+ protocolID: [0, 'someProtocol'],
479
+ keyID: 'someKeyID',
480
+ encryptedLinkage: [],
481
+ encryptedLinkageProof: [],
482
+ proofType: [],
483
+ },
484
+ },
485
+ {
486
+ methodName: 'encrypt',
487
+ args: {
488
+ plaintext: [],
489
+ protocolID: [0, 'someProtocol'],
490
+ keyID: 'someKeyID',
491
+ },
492
+ result: { ciphertext: [] },
493
+ },
494
+ {
495
+ methodName: 'decrypt',
496
+ args: {
497
+ ciphertext: [],
498
+ protocolID: [0, 'someProtocol'],
499
+ keyID: 'someKeyID',
500
+ },
501
+ result: { plaintext: [] },
502
+ },
503
+ {
504
+ methodName: 'createHmac',
505
+ args: {
506
+ data: [],
507
+ protocolID: [0, 'someProtocol'],
508
+ keyID: 'someKeyID',
509
+ },
510
+ result: { hmac: [] },
511
+ },
512
+ {
513
+ methodName: 'verifyHmac',
514
+ args: {
515
+ data: [],
516
+ hmac: [],
517
+ protocolID: [0, 'someProtocol'],
518
+ keyID: 'someKeyID',
519
+ },
520
+ result: { valid: true },
521
+ },
522
+ {
523
+ methodName: 'createSignature',
524
+ args: {
525
+ data: [],
526
+ protocolID: [0, 'someProtocol'],
527
+ keyID: 'someKeyID',
528
+ },
529
+ result: { signature: [] },
530
+ },
531
+ {
532
+ methodName: 'verifySignature',
533
+ args: {
534
+ data: [],
535
+ signature: [],
536
+ protocolID: [0, 'someProtocol'],
537
+ keyID: 'someKeyID',
538
+ },
539
+ result: { valid: true },
540
+ },
541
+ {
542
+ methodName: 'acquireCertificate',
543
+ args: {
544
+ type: 'someType',
545
+ subject: 'someSubject',
546
+ serialNumber: 'someSerialNumber',
547
+ revocationOutpoint: 'someOutpoint',
548
+ signature: 'someSignature',
549
+ fields: {},
550
+ certifier: 'someCertifier',
551
+ keyringRevealer: 'certifier',
552
+ keyringForSubject: {},
553
+ acquisitionProtocol: 'direct',
554
+ },
555
+ result: {
556
+ type: 'someType',
557
+ subject: 'someSubject',
558
+ serialNumber: 'someSerialNumber',
559
+ certifier: 'someCertifier',
560
+ revocationOutpoint: 'someOutpoint',
561
+ signature: 'someSignature',
562
+ fields: {},
563
+ },
564
+ },
565
+ {
566
+ methodName: 'listCertificates',
567
+ args: {
568
+ certifiers: [],
569
+ types: [],
570
+ },
571
+ result: {
572
+ totalCertificates: 0,
573
+ certificates: [],
574
+ },
575
+ },
576
+ {
577
+ methodName: 'proveCertificate',
578
+ args: {
579
+ certificate: {
580
+ type: 'someType',
581
+ subject: 'someSubject',
582
+ serialNumber: 'someSerialNumber',
583
+ certifier: 'someCertifier',
584
+ revocationOutpoint: 'someOutpoint',
585
+ signature: 'someSignature',
586
+ fields: {},
587
+ },
588
+ fieldsToReveal: [],
589
+ verifier: 'someVerifier',
590
+ },
591
+ result: {
592
+ keyringForVerifier: {},
593
+ },
594
+ },
595
+ {
596
+ methodName: 'relinquishCertificate',
597
+ args: {
598
+ type: 'someType',
599
+ serialNumber: 'someSerialNumber',
600
+ certifier: 'someCertifier',
601
+ },
602
+ result: { relinquished: true },
603
+ },
604
+ {
605
+ methodName: 'discoverByIdentityKey',
606
+ args: {
607
+ identityKey: 'someIdentityKey',
608
+ },
609
+ result: {
610
+ totalCertificates: 0,
611
+ certificates: [],
612
+ },
613
+ },
614
+ {
615
+ methodName: 'discoverByAttributes',
616
+ args: {
617
+ attributes: {},
618
+ },
619
+ result: {
620
+ totalCertificates: 0,
621
+ certificates: [],
622
+ },
623
+ },
624
+ {
625
+ methodName: 'isAuthenticated',
626
+ args: {},
627
+ result: { authenticated: true },
628
+ },
629
+ {
630
+ methodName: 'waitForAuthentication',
631
+ args: {},
632
+ result: { authenticated: true },
633
+ },
634
+ {
635
+ methodName: 'getHeight',
636
+ args: {},
637
+ result: { height: 1000 },
638
+ },
639
+ {
640
+ methodName: 'getHeaderForHeight',
641
+ args: { height: 1000 },
642
+ result: { header: 'someHeader' },
643
+ },
644
+ {
645
+ methodName: 'getNetwork',
646
+ args: {},
647
+ result: { network: 'mainnet' },
648
+ },
649
+ {
650
+ methodName: 'getVersion',
651
+ args: {},
652
+ result: { version: '1.0.0' },
653
+ },
654
+ ];
655
+
656
+ methodsToTest.forEach(({ methodName, args, result }) => {
657
+ testMethod(methodName, args, result);
658
+ });
659
+ });
@@ -0,0 +1,7 @@
1
+ export { default as WindowCWISubstrate } from './window.CWI.js'
2
+ export { default as XDM } from './XDM.js'
3
+ export * from './WalletWire.js'
4
+ export * from './WalletWireCalls.js'
5
+ export { default as WalletWireTransceiver } from './WalletWireTransceiver.js'
6
+ export { default as WalletWireProcessor } from './WalletWireProcessor.js'
7
+ export { default as HTTPWalletWire } from './HTTPWalletWire.js'