@bitgo-beta/sdk-api 1.10.1-beta.165 → 1.10.1-beta.1651

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 (68) hide show
  1. package/dist/package.json +16 -25
  2. package/dist/src/api.d.ts +8 -5
  3. package/dist/src/api.d.ts.map +1 -1
  4. package/dist/src/api.js +128 -69
  5. package/dist/src/bitgoAPI.d.ts +67 -13
  6. package/dist/src/bitgoAPI.d.ts.map +1 -1
  7. package/dist/src/bitgoAPI.js +454 -180
  8. package/dist/src/encrypt.d.ts +4 -4
  9. package/dist/src/encrypt.d.ts.map +1 -1
  10. package/dist/src/encrypt.js +44 -7
  11. package/dist/src/index.js +6 -2
  12. package/dist/src/types.d.ts +58 -43
  13. package/dist/src/types.d.ts.map +1 -1
  14. package/dist/src/types.js +4 -2
  15. package/dist/src/util.d.ts +12 -0
  16. package/dist/src/util.d.ts.map +1 -1
  17. package/dist/src/util.js +57 -4
  18. package/dist/src/v1/blockchain.js +25 -12
  19. package/dist/src/v1/keychains.js +27 -22
  20. package/dist/src/v1/markets.js +10 -5
  21. package/dist/src/v1/pendingapproval.d.ts.map +1 -1
  22. package/dist/src/v1/pendingapproval.js +57 -18
  23. package/dist/src/v1/pendingapprovals.d.ts.map +1 -1
  24. package/dist/src/v1/pendingapprovals.js +41 -7
  25. package/dist/src/v1/signPsbt.d.ts +14 -0
  26. package/dist/src/v1/signPsbt.d.ts.map +1 -0
  27. package/dist/src/v1/signPsbt.js +69 -0
  28. package/dist/src/v1/transactionBuilder.js +214 -90
  29. package/dist/src/v1/travelRule.js +60 -23
  30. package/dist/src/v1/verifyAddress.d.ts +6 -0
  31. package/dist/src/v1/verifyAddress.d.ts.map +1 -0
  32. package/dist/src/v1/verifyAddress.js +50 -0
  33. package/dist/src/v1/wallet.d.ts.map +1 -1
  34. package/dist/src/v1/wallet.js +479 -224
  35. package/dist/src/v1/wallets.js +93 -37
  36. package/dist/test/unit/api.d.ts +2 -0
  37. package/dist/test/unit/api.d.ts.map +1 -0
  38. package/dist/test/unit/api.js +307 -0
  39. package/dist/test/unit/bitgoAPI.d.ts +2 -0
  40. package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
  41. package/dist/test/unit/bitgoAPI.js +540 -0
  42. package/dist/test/unit/encrypt.d.ts +2 -0
  43. package/dist/test/unit/encrypt.d.ts.map +1 -0
  44. package/dist/test/unit/encrypt.js +62 -0
  45. package/dist/test/unit/hmacStrategy.d.ts +2 -0
  46. package/dist/test/unit/hmacStrategy.d.ts.map +1 -0
  47. package/dist/test/unit/hmacStrategy.js +136 -0
  48. package/dist/test/unit/utils.d.ts +2 -0
  49. package/dist/test/unit/utils.d.ts.map +1 -0
  50. package/dist/test/unit/utils.js +65 -0
  51. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
  52. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
  53. package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
  54. package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
  55. package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
  56. package/dist/test/unit/v1/fixtures/index.js +24 -0
  57. package/dist/test/unit/v1/signPsbt.d.ts +2 -0
  58. package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
  59. package/dist/test/unit/v1/signPsbt.js +53 -0
  60. package/dist/test/unit/v1/wallet.d.ts +2 -0
  61. package/dist/test/unit/v1/wallet.d.ts.map +1 -0
  62. package/dist/test/unit/v1/wallet.js +1603 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/package.json +16 -25
  65. package/.eslintignore +0 -5
  66. package/CHANGELOG.md +0 -478
  67. package/dist/web/main.js +0 -2
  68. package/dist/web/main.js.LICENSE.txt +0 -110
@@ -0,0 +1,540 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ require("should");
40
+ const bitgoAPI_1 = require("../../src/bitgoAPI");
41
+ const proxy_agent_1 = require("proxy-agent");
42
+ const sinon = __importStar(require("sinon"));
43
+ const nock_1 = __importDefault(require("nock"));
44
+ describe('Constructor', function () {
45
+ describe('cookiesPropagationEnabled argument', function () {
46
+ it('cookiesPropagationEnabled is enabled explicitly', function () {
47
+ const bitgo = new bitgoAPI_1.BitGoAPI({
48
+ env: 'custom',
49
+ customRootURI: 'https://app.example.local',
50
+ cookiesPropagationEnabled: true,
51
+ });
52
+ bitgo.should.have.property('cookiesPropagationEnabled');
53
+ bitgo.cookiesPropagationEnabled.should.equal(true);
54
+ });
55
+ it('cookiesPropagationEnabled is disabled explicitly', function () {
56
+ const bitgo = new bitgoAPI_1.BitGoAPI({
57
+ env: 'custom',
58
+ customRootURI: 'https://app.example.local',
59
+ cookiesPropagationEnabled: false,
60
+ });
61
+ bitgo.should.have.property('cookiesPropagationEnabled');
62
+ bitgo.cookiesPropagationEnabled.should.equal(false);
63
+ });
64
+ it('cookiesPropagationEnabled is disabled by default', function () {
65
+ const bitgo = new bitgoAPI_1.BitGoAPI({
66
+ env: 'custom',
67
+ customRootURI: 'https://app.example.local',
68
+ });
69
+ bitgo.should.have.property('cookiesPropagationEnabled');
70
+ bitgo.cookiesPropagationEnabled.should.equal(false);
71
+ });
72
+ });
73
+ describe('requestIdPrefix argument', function () {
74
+ afterEach(function () {
75
+ nock_1.default.cleanAll();
76
+ });
77
+ it('should prepend requestIdPrefix to Request-ID header when set', async function () {
78
+ const bitgo = new bitgoAPI_1.BitGoAPI({
79
+ env: 'custom',
80
+ customRootURI: 'https://app.example.local',
81
+ requestIdPrefix: 'test-prefix-',
82
+ });
83
+ const scope = (0, nock_1.default)('https://app.example.local')
84
+ .get('/api/v1/ping')
85
+ .matchHeader('Request-ID', /^test-prefix-/)
86
+ .reply(200, { status: 'ok' });
87
+ await bitgo.ping({
88
+ reqId: {
89
+ toString: () => '12345',
90
+ inc: () => {
91
+ /* mock */
92
+ },
93
+ },
94
+ });
95
+ scope.isDone().should.be.true();
96
+ });
97
+ it('should not modify Request-ID header when requestIdPrefix is not set', async function () {
98
+ const bitgo = new bitgoAPI_1.BitGoAPI({
99
+ env: 'custom',
100
+ customRootURI: 'https://app.example.local',
101
+ });
102
+ const scope = (0, nock_1.default)('https://app.example.local')
103
+ .get('/api/v1/ping')
104
+ .matchHeader('Request-ID', /^12345$/)
105
+ .reply(200, { status: 'ok' });
106
+ await bitgo.ping({
107
+ reqId: {
108
+ toString: () => '12345',
109
+ inc: () => {
110
+ /* mock */
111
+ },
112
+ },
113
+ });
114
+ scope.isDone().should.be.true();
115
+ });
116
+ it('should correctly format Request-ID with prefix and numeric sequence', async function () {
117
+ const bitgo = new bitgoAPI_1.BitGoAPI({
118
+ env: 'custom',
119
+ customRootURI: 'https://app.example.local',
120
+ requestIdPrefix: 'myapp-v1-',
121
+ });
122
+ const scope = (0, nock_1.default)('https://app.example.local')
123
+ .get('/api/v1/ping')
124
+ .matchHeader('Request-ID', 'myapp-v1-trace-123')
125
+ .reply(200, { status: 'ok' });
126
+ await bitgo.ping({
127
+ reqId: {
128
+ toString: () => 'trace-123',
129
+ inc: () => {
130
+ /* mock */
131
+ },
132
+ },
133
+ });
134
+ scope.isDone().should.be.true();
135
+ });
136
+ it('should work with empty string prefix', async function () {
137
+ const bitgo = new bitgoAPI_1.BitGoAPI({
138
+ env: 'custom',
139
+ customRootURI: 'https://app.example.local',
140
+ requestIdPrefix: '',
141
+ });
142
+ const scope = (0, nock_1.default)('https://app.example.local')
143
+ .get('/api/v1/ping')
144
+ .matchHeader('Request-ID', 'abc-123')
145
+ .reply(200, { status: 'ok' });
146
+ await bitgo.ping({
147
+ reqId: {
148
+ toString: () => 'abc-123',
149
+ inc: () => {
150
+ /* mock */
151
+ },
152
+ },
153
+ });
154
+ scope.isDone().should.be.true();
155
+ });
156
+ });
157
+ describe('http proxy agent', function () {
158
+ it('http proxy agent shall be created when proxy(customProxyagent) is set', function () {
159
+ const customProxyAgent = new proxy_agent_1.ProxyAgent({
160
+ getProxyForUrl: () => 'http://localhost:3000',
161
+ });
162
+ const bitgo = new bitgoAPI_1.BitGoAPI({
163
+ env: 'custom',
164
+ customRootURI: 'https://app.example.local',
165
+ customProxyAgent,
166
+ });
167
+ bitgo.should.have.property('_customProxyAgent', customProxyAgent);
168
+ });
169
+ it('bitgo api is still initiated when proxy(customProxyAgent) is not set', function () {
170
+ const bitgo = new bitgoAPI_1.BitGoAPI({
171
+ env: 'custom',
172
+ customRootURI: 'https://app.example.local',
173
+ });
174
+ bitgo.should.have.property('_customProxyAgent', undefined);
175
+ });
176
+ });
177
+ describe('verifyAddress', function () {
178
+ it('should successfully verify a base58 address', function () {
179
+ const bitgo = new bitgoAPI_1.BitGoAPI({
180
+ env: 'test',
181
+ });
182
+ bitgo.verifyAddress({ address: '2N6paT2TU4N1XpaZjJiApWJXoeyrL3UWpkZ' }).should.be.true();
183
+ });
184
+ it('should successfully verify a bech32 address', function () {
185
+ const bitgo = new bitgoAPI_1.BitGoAPI({
186
+ env: 'test',
187
+ });
188
+ bitgo
189
+ .verifyAddress({ address: 'tb1qguzyk4w6kaqtpsczs5aj0w8r7598jq36egm8e98wqph3rwmex68seslgsg' })
190
+ .should.be.true();
191
+ });
192
+ });
193
+ describe('url', function () {
194
+ it('should return the correct URL for version 1', function () {
195
+ const bitgo = new bitgoAPI_1.BitGoAPI({
196
+ env: 'test',
197
+ customRootURI: 'https://test.bitgo.com',
198
+ });
199
+ const path = '/test-path';
200
+ const expectedUrl = 'https://test.bitgo.com/api/v1/test-path';
201
+ const result = bitgo.url(path, 1);
202
+ result.should.equal(expectedUrl);
203
+ });
204
+ it('should return the correct URL for version 2', function () {
205
+ const bitgo = new bitgoAPI_1.BitGoAPI({
206
+ env: 'test',
207
+ customRootURI: 'https://test.bitgo.com',
208
+ });
209
+ const path = '/test-path';
210
+ const expectedUrl = 'https://test.bitgo.com/api/v2/test-path';
211
+ const result = bitgo.url(path, 2);
212
+ result.should.equal(expectedUrl);
213
+ });
214
+ it('should return the correct URL for version 3', function () {
215
+ const bitgo = new bitgoAPI_1.BitGoAPI({
216
+ env: 'test',
217
+ customRootURI: 'https://test.bitgo.com',
218
+ });
219
+ const path = '/test-path';
220
+ const expectedUrl = 'https://test.bitgo.com/api/v3/test-path';
221
+ const result = bitgo.url(path, 3);
222
+ result.should.equal(expectedUrl);
223
+ });
224
+ it('should default to version 1 if no version is provided', function () {
225
+ const bitgo = new bitgoAPI_1.BitGoAPI({
226
+ env: 'test',
227
+ customRootURI: 'https://test.bitgo.com',
228
+ });
229
+ const path = '/test-path';
230
+ const expectedUrl = 'https://test.bitgo.com/api/v1/test-path';
231
+ const result = bitgo.url(path);
232
+ result.should.equal(expectedUrl);
233
+ });
234
+ });
235
+ describe('decryptKeys', function () {
236
+ let bitgo;
237
+ beforeEach(function () {
238
+ bitgo = new bitgoAPI_1.BitGoAPI({
239
+ env: 'test',
240
+ });
241
+ });
242
+ afterEach(function () {
243
+ sinon.restore();
244
+ });
245
+ it('should throw if no params are provided', function () {
246
+ try {
247
+ // @ts-expect-error - intentionally calling with no params for test
248
+ bitgo.decryptKeys();
249
+ throw new Error('Expected error but got none');
250
+ }
251
+ catch (e) {
252
+ e.message.should.containEql('Missing parameter');
253
+ }
254
+ });
255
+ it('should throw if walletIdEncryptedKeyPairs is missing', function () {
256
+ try {
257
+ // @ts-expect-error - intentionally missing required param
258
+ bitgo.decryptKeys({ password: 'password123' });
259
+ throw new Error('Expected error but got none');
260
+ }
261
+ catch (e) {
262
+ e.message.should.containEql('Missing parameter: walletIdEncryptedKeyPairs');
263
+ }
264
+ });
265
+ it('should throw if password is missing', function () {
266
+ try {
267
+ // @ts-expect-error - intentionally missing required param
268
+ bitgo.decryptKeys({ walletIdEncryptedKeyPairs: [] });
269
+ throw new Error('Expected error but got none');
270
+ }
271
+ catch (e) {
272
+ e.message.should.containEql('Missing parameter: password');
273
+ }
274
+ });
275
+ it('should throw if walletIdEncryptedKeyPairs is not an array', function () {
276
+ try {
277
+ // @ts-expect-error - intentionally providing wrong type
278
+ bitgo.decryptKeys({ walletIdEncryptedKeyPairs: 'not an array', password: 'password123' });
279
+ throw new Error('Expected error but got none');
280
+ }
281
+ catch (e) {
282
+ e.message.should.equal('walletIdEncryptedKeyPairs must be an array');
283
+ }
284
+ });
285
+ it('should return empty array for empty walletIdEncryptedKeyPairs', function () {
286
+ const result = bitgo.decryptKeys({ walletIdEncryptedKeyPairs: [], password: 'password123' });
287
+ result.should.be.an.Array();
288
+ result.should.be.empty();
289
+ });
290
+ it('should throw if any walletId is missing or not a string', function () {
291
+ try {
292
+ bitgo.decryptKeys({
293
+ walletIdEncryptedKeyPairs: [
294
+ // @ts-expect-error - intentionally missing walletId
295
+ {
296
+ encryptedPrv: 'encrypted-data',
297
+ },
298
+ ],
299
+ password: 'password123',
300
+ });
301
+ throw new Error('Expected error but got none');
302
+ }
303
+ catch (e) {
304
+ e.message.should.equal('each key pair must have a string walletId');
305
+ }
306
+ try {
307
+ bitgo.decryptKeys({
308
+ walletIdEncryptedKeyPairs: [
309
+ {
310
+ // @ts-expect-error - intentionally providing wrong type
311
+ walletId: 123,
312
+ encryptedPrv: 'encrypted-data',
313
+ },
314
+ ],
315
+ password: 'password123',
316
+ });
317
+ throw new Error('Expected error but got none');
318
+ }
319
+ catch (e) {
320
+ e.message.should.equal('each key pair must have a string walletId');
321
+ }
322
+ });
323
+ it('should throw if any encryptedPrv is missing or not a string', function () {
324
+ try {
325
+ bitgo.decryptKeys({
326
+ walletIdEncryptedKeyPairs: [
327
+ // @ts-expect-error - intentionally missing encryptedPrv
328
+ {
329
+ walletId: 'wallet-id-1',
330
+ },
331
+ ],
332
+ password: 'password123',
333
+ });
334
+ throw new Error('Expected error but got none');
335
+ }
336
+ catch (e) {
337
+ e.message.should.equal('each key pair must have a string encryptedPrv');
338
+ }
339
+ try {
340
+ bitgo.decryptKeys({
341
+ walletIdEncryptedKeyPairs: [
342
+ {
343
+ walletId: 'wallet-id-1',
344
+ // @ts-expect-error - intentionally providing wrong type
345
+ encryptedPrv: 123,
346
+ },
347
+ ],
348
+ password: 'password123',
349
+ });
350
+ throw new Error('Expected error but got none');
351
+ }
352
+ catch (e) {
353
+ e.message.should.equal('each key pair must have a string encryptedPrv');
354
+ }
355
+ });
356
+ it('should return walletIds of keys that failed to decrypt', function () {
357
+ // Create a stub for the decrypt method
358
+ const decryptStub = sinon.stub(bitgo, 'decrypt');
359
+ // Make it succeed for first wallet and fail for second wallet
360
+ decryptStub.onFirstCall().returns('decrypted-key-1');
361
+ decryptStub.onSecondCall().throws(new Error('decryption failed'));
362
+ const result = bitgo.decryptKeys({
363
+ walletIdEncryptedKeyPairs: [
364
+ { walletId: 'wallet-id-1', encryptedPrv: 'encrypted-data-1' },
365
+ { walletId: 'wallet-id-2', encryptedPrv: 'encrypted-data-2' },
366
+ ],
367
+ password: 'password123',
368
+ });
369
+ result.should.be.an.Array();
370
+ result.should.have.length(1);
371
+ result[0].should.equal('wallet-id-2');
372
+ });
373
+ it('should correctly process multiple wallet keys', function () {
374
+ // Create a spy on the decrypt method
375
+ const decryptStub = sinon.stub(bitgo, 'decrypt');
376
+ // Configure the stub to throw for specific wallets
377
+ decryptStub
378
+ .withArgs({ input: 'encrypted-data-2', password: 'password123' })
379
+ .throws(new Error('decryption failed'));
380
+ decryptStub
381
+ .withArgs({ input: 'encrypted-data-4', password: 'password123' })
382
+ .throws(new Error('decryption failed'));
383
+ decryptStub.returns('success'); // Default return for other calls
384
+ const result = bitgo.decryptKeys({
385
+ walletIdEncryptedKeyPairs: [
386
+ { walletId: 'wallet-id-1', encryptedPrv: 'encrypted-data-1' },
387
+ { walletId: 'wallet-id-2', encryptedPrv: 'encrypted-data-2' },
388
+ { walletId: 'wallet-id-3', encryptedPrv: 'encrypted-data-3' },
389
+ { walletId: 'wallet-id-4', encryptedPrv: 'encrypted-data-4' },
390
+ ],
391
+ password: 'password123',
392
+ });
393
+ // Should be called once for each wallet
394
+ decryptStub.callCount.should.equal(4);
395
+ // Should include only the failed wallet IDs
396
+ result.should.be.an.Array();
397
+ result.should.have.length(2);
398
+ result.should.containDeep(['wallet-id-2', 'wallet-id-4']);
399
+ });
400
+ });
401
+ describe('User-Agent header based on environment', function () {
402
+ afterEach(function () {
403
+ nock_1.default.cleanAll();
404
+ sinon.restore();
405
+ });
406
+ it('should set User-Agent header when running in Node.js (typeof window === undefined)', async function () {
407
+ const bitgo = new bitgoAPI_1.BitGoAPI({
408
+ env: 'custom',
409
+ customRootURI: 'https://app.example.local',
410
+ userAgent: 'TestAgent/1.0',
411
+ });
412
+ // Ensure we're in a Node.js environment by verifying window is undefined
413
+ (typeof window).should.equal('undefined');
414
+ const scope = (0, nock_1.default)('https://app.example.local')
415
+ .get('/api/v1/ping')
416
+ .matchHeader('User-Agent', 'TestAgent/1.0')
417
+ .reply(200, { status: 'ok' });
418
+ await bitgo.ping({
419
+ reqId: {
420
+ toString: () => 'test-123',
421
+ inc: () => {
422
+ /* mock */
423
+ },
424
+ },
425
+ });
426
+ scope.isDone().should.be.true();
427
+ });
428
+ it('should not set User-Agent header when running in browser (typeof window !== undefined)', async function () {
429
+ // Mock the window object to simulate browser environment
430
+ const windowStub = { location: 'mock' };
431
+ global.window = windowStub;
432
+ try {
433
+ const bitgo = new bitgoAPI_1.BitGoAPI({
434
+ env: 'custom',
435
+ customRootURI: 'https://app.example.local',
436
+ userAgent: 'TestAgent/1.0',
437
+ });
438
+ const scope = (0, nock_1.default)('https://app.example.local')
439
+ .get('/api/v1/ping')
440
+ .reply(function () {
441
+ // Verify User-Agent header is NOT set to our custom value
442
+ const userAgent = this.req.headers['user-agent'];
443
+ if (userAgent && userAgent.includes('TestAgent/1.0')) {
444
+ throw new Error('User-Agent should not be set in browser environment');
445
+ }
446
+ return [200, { status: 'ok' }];
447
+ });
448
+ await bitgo.ping({
449
+ reqId: {
450
+ toString: () => 'test-123',
451
+ inc: () => {
452
+ /* mock */
453
+ },
454
+ },
455
+ });
456
+ scope.isDone().should.be.true();
457
+ }
458
+ finally {
459
+ // Clean up the global window mock
460
+ delete global.window;
461
+ }
462
+ });
463
+ });
464
+ describe('constants parameter', function () {
465
+ it('should allow passing constants via options and expose via fetchConstants', async function () {
466
+ const bitgo = new bitgoAPI_1.BitGoAPI({
467
+ env: 'custom',
468
+ customRootURI: 'https://app.example.local',
469
+ clientConstants: { maxFeeRate: '123123123123123' },
470
+ });
471
+ const constants = await bitgo.fetchConstants();
472
+ constants.should.have.property('maxFeeRate', '123123123123123');
473
+ });
474
+ it('should refresh constants when cache has expired', async function () {
475
+ const bitgo = new bitgoAPI_1.BitGoAPI({
476
+ env: 'custom',
477
+ customRootURI: 'https://app.example.local',
478
+ });
479
+ // Set up cached constants with an expired cache
480
+ bitgoAPI_1.BitGoAPI._constants = bitgoAPI_1.BitGoAPI._constants || {};
481
+ bitgoAPI_1.BitGoAPI._constantsExpire = bitgoAPI_1.BitGoAPI._constantsExpire || {};
482
+ bitgoAPI_1.BitGoAPI._constants['custom'] = { maxFeeRate: 'old-value' };
483
+ bitgoAPI_1.BitGoAPI._constantsExpire['custom'] = new Date(Date.now() - 1000); // Expired 1 second ago
484
+ const scope = (0, nock_1.default)('https://app.example.local')
485
+ .get('/api/v1/client/constants')
486
+ .reply(200, {
487
+ constants: { maxFeeRate: 'new-value', newConstant: 'added' },
488
+ });
489
+ const constants = await bitgo.fetchConstants();
490
+ // Should return the new constants from the server
491
+ constants.should.have.property('maxFeeRate', 'new-value');
492
+ constants.should.have.property('newConstant', 'added');
493
+ scope.isDone().should.be.true();
494
+ nock_1.default.cleanAll();
495
+ });
496
+ it('should use cached constants when cache is still valid', async function () {
497
+ const bitgo = new bitgoAPI_1.BitGoAPI({
498
+ env: 'custom',
499
+ customRootURI: 'https://app.example.local',
500
+ });
501
+ // Set up cached constants with a future expiry
502
+ const cachedConstants = { maxFeeRate: 'cached-value', anotherSetting: 'cached-setting' };
503
+ bitgoAPI_1.BitGoAPI._constants = bitgoAPI_1.BitGoAPI._constants || {};
504
+ bitgoAPI_1.BitGoAPI._constantsExpire = bitgoAPI_1.BitGoAPI._constantsExpire || {};
505
+ bitgoAPI_1.BitGoAPI._constants['custom'] = cachedConstants;
506
+ bitgoAPI_1.BitGoAPI._constantsExpire['custom'] = new Date(Date.now() + 5 * 60 * 1000); // Valid for 5 more minutes
507
+ const scope = (0, nock_1.default)('https://app.example.local')
508
+ .get('/api/v1/client/constants')
509
+ .reply(200, { constants: { shouldNotBeUsed: true } });
510
+ const constants = await bitgo.fetchConstants();
511
+ // Should return the cached constants
512
+ constants.should.deepEqual(cachedConstants);
513
+ // Verify that no HTTP request was made (since cache was valid)
514
+ scope.isDone().should.be.false();
515
+ nock_1.default.cleanAll();
516
+ });
517
+ it('should use cached constants when no cache expiry is set', async function () {
518
+ const bitgo = new bitgoAPI_1.BitGoAPI({
519
+ env: 'custom',
520
+ customRootURI: 'https://app.example.local',
521
+ });
522
+ // Set up cached constants with no expiry
523
+ const cachedConstants = { maxFeeRate: 'no-expiry-value' };
524
+ bitgoAPI_1.BitGoAPI._constants = bitgoAPI_1.BitGoAPI._constants || {};
525
+ bitgoAPI_1.BitGoAPI._constantsExpire = bitgoAPI_1.BitGoAPI._constantsExpire || {};
526
+ bitgoAPI_1.BitGoAPI._constants['custom'] = cachedConstants;
527
+ bitgoAPI_1.BitGoAPI._constantsExpire['custom'] = undefined;
528
+ const scope = (0, nock_1.default)('https://app.example.local')
529
+ .get('/api/v1/client/constants')
530
+ .reply(200, { constants: { shouldNotBeUsed: true } });
531
+ const constants = await bitgo.fetchConstants();
532
+ // Should return the cached constants
533
+ constants.should.deepEqual(cachedConstants);
534
+ // Verify that no HTTP request was made (since no expiry means cache is always valid)
535
+ scope.isDone().should.be.false();
536
+ nock_1.default.cleanAll();
537
+ });
538
+ });
539
+ });
540
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvYml0Z29BUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsaURBQThDO0FBQzlDLDZDQUF5QztBQUN6Qyw2Q0FBK0I7QUFDL0IsZ0RBQXdCO0FBRXhCLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsUUFBUSxDQUFDLG9DQUFvQyxFQUFFO1FBQzdDLEVBQUUsQ0FBQyxpREFBaUQsRUFBRTtZQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFRLENBQUM7Z0JBQ3pCLEdBQUcsRUFBRSxRQUFRO2dCQUNiLGFBQWEsRUFBRSwyQkFBMkI7Z0JBQzFDLHlCQUF5QixFQUFFLElBQUk7YUFDaEMsQ0FBQyxDQUFDO1lBRUgsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDeEQsS0FBSyxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7WUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBUSxDQUFDO2dCQUN6QixHQUFHLEVBQUUsUUFBUTtnQkFDYixhQUFhLEVBQUUsMkJBQTJCO2dCQUMxQyx5QkFBeUIsRUFBRSxLQUFLO2FBQ2pDLENBQUMsQ0FBQztZQUVILEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3hELEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELE1B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QyxxQ0FBcUM7WUFDckMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFNUMscUZBQXFGO1lBQ3JGLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRWpDLGNBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJy4uLy4uL3NyYy9iaXRnb0FQSSc7XG5pbXBvcnQgeyBQcm94eUFnZW50IH0gZnJvbSAncHJveHktYWdlbnQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IG5vY2sgZnJvbSAnbm9jayc7XG5cbmRlc2NyaWJlKCdDb25zdHJ1Y3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgaXMgZW5hYmxlZCBleHBsaWNpdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcsXG4gICAgICAgIGNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgYml0Z28uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQnKTtcbiAgICAgIGJpdGdvLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgaXMgZGlzYWJsZWQgZXhwbGljaXRseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgICBjb29raWVzUHJvcGFnYXRpb25FbmFibGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBiaXRnby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCcpO1xuICAgICAgYml0Z28uY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZC5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgfSk7XG5cbiAgICAgIGJpdGdvLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb29raWVzUHJvcGFnYXRpb25FbmFibGVkJyk7XG4gICAgICBiaXRnby5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXF1ZXN0SWRQcmVmaXggYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJlcGVuZCByZXF1ZXN0SWRQcmVmaXggdG8gUmVxdWVzdC1JRCBoZWFkZXIgd2hlbiBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJyxcbiAgICAgICAgcmVxdWVzdElkUHJlZml4OiAndGVzdC1wcmVmaXgtJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzY29wZSA9IG5vY2soJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnKVxuICAgICAgICAuZ2V0KCcvYXBpL3YxL3BpbmcnKVxuICAgICAgICAubWF0Y2hIZWFkZXIoJ1JlcXVlc3QtSUQnLCAvXnRlc3QtcHJlZml4LS8pXG4gICAgICAgIC5yZXBseSgyMDAsIHsgc3RhdHVzOiAnb2snIH0pO1xuXG4gICAgICBhd2FpdCBiaXRnby5waW5nKHtcbiAgICAgICAgcmVxSWQ6IHtcbiAgICAgICAgICB0b1N0cmluZzogKCkgPT4gJzEyMzQ1JyxcbiAgICAgICAgICBpbmM6ICgpID0+IHtcbiAgICAgICAgICAgIC8qIG1vY2sgKi9cbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0pO1xuXG4gICAgICBzY29wZS5pc0RvbmUoKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgbW9kaWZ5IFJlcXVlc3QtSUQgaGVhZGVyIHdoZW4gcmVxdWVzdElkUHJlZml4IGlzIG5vdCBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzY29wZSA9IG5vY2soJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnKVxuICAgICAgICAuZ2V0KCcvYXBpL3YxL3BpbmcnKVxuICAgICAgICAubWF0Y2hIZWFkZXIoJ1JlcXVlc3QtSUQnLCAvXjEyMzQ1JC8pXG4gICAgICAgIC5yZXBseSgyMDAsIHsgc3RhdHVzOiAnb2snIH0pO1xuXG4gICAgICBhd2FpdCBiaXRnby5waW5nKHtcbiAgICAgICAgcmVxSWQ6IHtcbiAgICAgICAgICB0b1N0cmluZzogKCkgPT4gJzEyMzQ1JyxcbiAgICAgICAgICBpbmM6ICgpID0+IHtcbiAgICAgICAgICAgIC8qIG1vY2sgKi9cbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0pO1xuXG4gICAgICBzY29wZS5pc0RvbmUoKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZm9ybWF0IFJlcXVlc3QtSUQgd2l0aCBwcmVmaXggYW5kIG51bWVyaWMgc2VxdWVuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJyxcbiAgICAgICAgcmVxdWVzdElkUHJlZml4OiAnbXlhcHAtdjEtJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzY29wZSA9IG5vY2soJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnKVxuICAgICAgICAuZ2V0KCcvYXBpL3YxL3BpbmcnKVxuICAgICAgICAubWF0Y2hIZWFkZXIoJ1JlcXVlc3QtSUQnLCAnbXlhcHAtdjEtdHJhY2UtMTIzJylcbiAgICAgICAgLnJlcGx5KDIwMCwgeyBzdGF0dXM6ICdvaycgfSk7XG5cbiAgICAgIGF3YWl0IGJpdGdvLnBpbmcoe1xuICAgICAgICByZXFJZDoge1xuICAgICAgICAgIHRvU3RyaW5nOiAoKSA9PiAndHJhY2UtMTIzJyxcbiAgICAgICAgICBpbmM6ICgpID0+IHtcbiAgICAgICAgICAgIC8qIG1vY2sgKi9cbiAgICAgICAgICB9LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0pO1xuXG4gICAgICBzY29wZS5pc0RvbmUoKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIHdpdGggZW1wdHkgc3RyaW5nIHByZWZpeCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgICByZXF1ZXN0SWRQcmVmaXg6ICcnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jaygnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcpXG4gICAgICAgIC5nZXQoJy9hcGkvdjEvcGluZycpXG4gICAgICAgIC5tYXRjaEhlYWRlcignUmVxdWVzdC1JRCcsICdhYmMtMTIzJylcbiAgICAgICAgLnJlcGx5KDIwMCwgeyBzdGF0dXM6ICdvaycgfSk7XG5cbiAgICAgIGF3YWl0IGJpdGdvLnBpbmcoe1xuICAgICAgICByZXFJZDoge1xuICAgICAgICAgIHRvU3RyaW5nOiAoKSA9PiAnYWJjLTEyMycsXG4gICAgICAgICAgaW5jOiAoKSA9PiB7XG4gICAgICAgICAgICAvKiBtb2NrICovXG4gICAgICAgICAgfSxcbiAgICAgICAgfSBhcyBhbnksXG4gICAgICB9KTtcblxuICAgICAgc2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdodHRwIHByb3h5IGFnZW50JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdodHRwIHByb3h5IGFnZW50IHNoYWxsIGJlIGNyZWF0ZWQgd2hlbiBwcm94eShjdXN0b21Qcm94eWFnZW50KSBpcyBzZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjdXN0b21Qcm94eUFnZW50ID0gbmV3IFByb3h5QWdlbnQoe1xuICAgICAgICBnZXRQcm94eUZvclVybDogKCkgPT4gJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgICBjdXN0b21Qcm94eUFnZW50LFxuICAgICAgfSk7XG5cbiAgICAgIGJpdGdvLnNob3VsZC5oYXZlLnByb3BlcnR5KCdfY3VzdG9tUHJveHlBZ2VudCcsIGN1c3RvbVByb3h5QWdlbnQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2JpdGdvIGFwaSBpcyBzdGlsbCBpbml0aWF0ZWQgd2hlbiBwcm94eShjdXN0b21Qcm94eUFnZW50KSBpcyBub3Qgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcsXG4gICAgICB9KTtcblxuICAgICAgYml0Z28uc2hvdWxkLmhhdmUucHJvcGVydHkoJ19jdXN0b21Qcm94eUFnZW50JywgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcmlmeUFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgdmVyaWZ5IGEgYmFzZTU4IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ3Rlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGJpdGdvLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiAnMk42cGFUMlRVNE4xWHBhWmpKaUFwV0pYb2V5ckwzVVdwa1onIH0pLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1Y2Nlc3NmdWxseSB2ZXJpZnkgYSBiZWNoMzIgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAndGVzdCcsXG4gICAgICB9KTtcblxuICAgICAgYml0Z29cbiAgICAgICAgLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiAndGIxcWd1enlrNHc2a2FxdHBzY3pzNWFqMHc4cjc1OThqcTM2ZWdtOGU5OHdxcGgzcndtZXg2OHNlc2xnc2cnIH0pXG4gICAgICAgIC5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndXJsJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IFVSTCBmb3IgdmVyc2lvbiAxJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICd0ZXN0JyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20nLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXRoID0gJy90ZXN0LXBhdGgnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRVcmwgPSAnaHR0cHM6Ly90ZXN0LmJpdGdvLmNvbS9hcGkvdjEvdGVzdC1wYXRoJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJpdGdvLnVybChwYXRoLCAxKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwoZXhwZWN0ZWRVcmwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgVVJMIGZvciB2ZXJzaW9uIDInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ3Rlc3QnLFxuICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly90ZXN0LmJpdGdvLmNvbScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhdGggPSAnL3Rlc3QtcGF0aCc7XG4gICAgICBjb25zdCBleHBlY3RlZFVybCA9ICdodHRwczovL3Rlc3QuYml0Z28uY29tL2FwaS92Mi90ZXN0LXBhdGgnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYml0Z28udXJsKHBhdGgsIDIpO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChleHBlY3RlZFVybCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBVUkwgZm9yIHZlcnNpb24gMycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAndGVzdCcsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL3Rlc3QuYml0Z28uY29tJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGF0aCA9ICcvdGVzdC1wYXRoJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkVXJsID0gJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20vYXBpL3YzL3Rlc3QtcGF0aCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBiaXRnby51cmwocGF0aCwgMyk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKGV4cGVjdGVkVXJsKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVmYXVsdCB0byB2ZXJzaW9uIDEgaWYgbm8gdmVyc2lvbiBpcyBwcm92aWRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAndGVzdCcsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL3Rlc3QuYml0Z28uY29tJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGF0aCA9ICcvdGVzdC1wYXRoJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkVXJsID0gJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20vYXBpL3YxL3Rlc3QtcGF0aCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBiaXRnby51cmwocGF0aCk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKGV4cGVjdGVkVXJsKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlY3J5cHRLZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBiaXRnbzogQml0R29BUEk7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAndGVzdCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIG5vIHBhcmFtcyBhcmUgcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gaW50ZW50aW9uYWxseSBjYWxsaW5nIHdpdGggbm8gcGFyYW1zIGZvciB0ZXN0XG4gICAgICAgIGJpdGdvLmRlY3J5cHRLZXlzKCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZXJyb3IgYnV0IGdvdCBub25lJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGUubWVzc2FnZS5zaG91bGQuY29udGFpbkVxbCgnTWlzc2luZyBwYXJhbWV0ZXInKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycyBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGludGVudGlvbmFsbHkgbWlzc2luZyByZXF1aXJlZCBwYXJhbVxuICAgICAgICBiaXRnby5kZWNyeXB0S2V5cyh7IHBhc3N3b3JkOiAncGFzc3dvcmQxMjMnIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGVycm9yIGJ1dCBnb3Qgbm9uZScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW5FcWwoJ01pc3NpbmcgcGFyYW1ldGVyOiB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHBhc3N3b3JkIGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gaW50ZW50aW9uYWxseSBtaXNzaW5nIHJlcXVpcmVkIHBhcmFtXG4gICAgICAgIGJpdGdvLmRlY3J5cHRLZXlzKHsgd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlyczogW10gfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZXJyb3IgYnV0IGdvdCBub25lJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGUubWVzc2FnZS5zaG91bGQuY29udGFpbkVxbCgnTWlzc2luZyBwYXJhbWV0ZXI6IHBhc3N3b3JkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHdhbGxldElkRW5jcnlwdGVkS2V5UGFpcnMgaXMgbm90IGFuIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGludGVudGlvbmFsbHkgcHJvdmlkaW5nIHdyb25nIHR5cGVcbiAgICAgICAgYml0Z28uZGVjcnlwdEtleXMoeyB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzOiAnbm90IGFuIGFycmF5JywgcGFzc3dvcmQ6ICdwYXNzd29yZDEyMycgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZXJyb3IgYnV0IGdvdCBub25lJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGUubWVzc2FnZS5zaG91bGQuZXF1YWwoJ3dhbGxldElkRW5jcnlwdGVkS2V5UGFpcnMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZW1wdHkgYXJyYXkgZm9yIGVtcHR5IHdhbGxldElkRW5jcnlwdGVkS2V5UGFpcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBiaXRnby5kZWNyeXB0S2V5cyh7IHdhbGxldElkRW5jcnlwdGVkS2V5UGFpcnM6IFtdLCBwYXNzd29yZDogJ3Bhc3N3b3JkMTIzJyB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuYW4uQXJyYXkoKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuZW1wdHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgYW55IHdhbGxldElkIGlzIG1pc3Npbmcgb3Igbm90IGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYml0Z28uZGVjcnlwdEtleXMoe1xuICAgICAgICAgIHdhbGxldElkRW5jcnlwdGVkS2V5UGFpcnM6IFtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBpbnRlbnRpb25hbGx5IG1pc3Npbmcgd2FsbGV0SWRcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLWRhdGEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBhc3N3b3JkOiAncGFzc3dvcmQxMjMnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBlcnJvciBidXQgZ290IG5vbmUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZS5tZXNzYWdlLnNob3VsZC5lcXVhbCgnZWFjaCBrZXkgcGFpciBtdXN0IGhhdmUgYSBzdHJpbmcgd2FsbGV0SWQnKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYml0Z28uZGVjcnlwdEtleXMoe1xuICAgICAgICAgIHdhbGxldElkRW5jcnlwdGVkS2V5UGFpcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGludGVudGlvbmFsbHkgcHJvdmlkaW5nIHdyb25nIHR5cGVcbiAgICAgICAgICAgICAgd2FsbGV0SWQ6IDEyMyxcbiAgICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLWRhdGEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBhc3N3b3JkOiAncGFzc3dvcmQxMjMnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBlcnJvciBidXQgZ290IG5vbmUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZS5tZXNzYWdlLnNob3VsZC5lcXVhbCgnZWFjaCBrZXkgcGFpciBtdXN0IGhhdmUgYSBzdHJpbmcgd2FsbGV0SWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgYW55IGVuY3J5cHRlZFBydiBpcyBtaXNzaW5nIG9yIG5vdCBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJpdGdvLmRlY3J5cHRLZXlzKHtcbiAgICAgICAgICB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzOiBbXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gaW50ZW50aW9uYWxseSBtaXNzaW5nIGVuY3J5cHRlZFBydlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3YWxsZXRJZDogJ3dhbGxldC1pZC0xJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwYXNzd29yZDogJ3Bhc3N3b3JkMTIzJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZXJyb3IgYnV0IGdvdCBub25lJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGUubWVzc2FnZS5zaG91bGQuZXF1YWwoJ2VhY2gga2V5IHBhaXIgbXVzdCBoYXZlIGEgc3RyaW5nIGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBiaXRnby5kZWNyeXB0S2V5cyh7XG4gICAgICAgICAgd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlyczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB3YWxsZXRJZDogJ3dhbGxldC1pZC0xJyxcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGludGVudGlvbmFsbHkgcHJvdmlkaW5nIHdyb25nIHR5cGVcbiAgICAgICAgICAgICAgZW5jcnlwdGVkUHJ2OiAxMjMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcGFzc3dvcmQ6ICdwYXNzd29yZDEyMycsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGVycm9yIGJ1dCBnb3Qgbm9uZScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmVxdWFsKCdlYWNoIGtleSBwYWlyIG11c3QgaGF2ZSBhIHN0cmluZyBlbmNyeXB0ZWRQcnYnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHdhbGxldElkcyBvZiBrZXlzIHRoYXQgZmFpbGVkIHRvIGRlY3J5cHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDcmVhdGUgYSBzdHViIGZvciB0aGUgZGVjcnlwdCBtZXRob2RcbiAgICAgIGNvbnN0IGRlY3J5cHRTdHViID0gc2lub24uc3R1YihiaXRnbywgJ2RlY3J5cHQnKTtcblxuICAgICAgLy8gTWFrZSBpdCBzdWNjZWVkIGZvciBmaXJzdCB3YWxsZXQgYW5kIGZhaWwgZm9yIHNlY29uZCB3YWxsZXRcbiAgICAgIGRlY3J5cHRTdHViLm9uRmlyc3RDYWxsKCkucmV0dXJucygnZGVjcnlwdGVkLWtleS0xJyk7XG4gICAgICBkZWNyeXB0U3R1Yi5vblNlY29uZENhbGwoKS50aHJvd3MobmV3IEVycm9yKCdkZWNyeXB0aW9uIGZhaWxlZCcpKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYml0Z28uZGVjcnlwdEtleXMoe1xuICAgICAgICB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzOiBbXG4gICAgICAgICAgeyB3YWxsZXRJZDogJ3dhbGxldC1pZC0xJywgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLWRhdGEtMScgfSxcbiAgICAgICAgICB7IHdhbGxldElkOiAnd2FsbGV0LWlkLTInLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtZGF0YS0yJyB9LFxuICAgICAgICBdLFxuICAgICAgICBwYXNzd29yZDogJ3Bhc3N3b3JkMTIzJyxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuc2hvdWxkLmJlLmFuLkFycmF5KCk7XG4gICAgICByZXN1bHQuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgcmVzdWx0WzBdLnNob3VsZC5lcXVhbCgnd2FsbGV0LWlkLTInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IHByb2Nlc3MgbXVsdGlwbGUgd2FsbGV0IGtleXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBDcmVhdGUgYSBzcHkgb24gdGhlIGRlY3J5cHQgbWV0aG9kXG4gICAgICBjb25zdCBkZWNyeXB0U3R1YiA9IHNpbm9uLnN0dWIoYml0Z28sICdkZWNyeXB0Jyk7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc3R1YiB0byB0aHJvdyBmb3Igc3BlY2lmaWMgd2FsbGV0c1xuICAgICAgZGVjcnlwdFN0dWJcbiAgICAgICAgLndpdGhBcmdzKHsgaW5wdXQ6ICdlbmNyeXB0ZWQtZGF0YS0yJywgcGFzc3dvcmQ6ICdwYXNzd29yZDEyMycgfSlcbiAgICAgICAgLnRocm93cyhuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZmFpbGVkJykpO1xuICAgICAgZGVjcnlwdFN0dWJcbiAgICAgICAgLndpdGhBcmdzKHsgaW5wdXQ6ICdlbmNyeXB0ZWQtZGF0YS00JywgcGFzc3dvcmQ6ICdwYXNzd29yZDEyMycgfSlcbiAgICAgICAgLnRocm93cyhuZXcgRXJyb3IoJ2RlY3J5cHRpb24gZmFpbGVkJykpO1xuICAgICAgZGVjcnlwdFN0dWIucmV0dXJucygnc3VjY2VzcycpOyAvLyBEZWZhdWx0IHJldHVybiBmb3Igb3RoZXIgY2FsbHNcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYml0Z28uZGVjcnlwdEtleXMoe1xuICAgICAgICB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzOiBbXG4gICAgICAgICAgeyB3YWxsZXRJZDogJ3dhbGxldC1pZC0xJywgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLWRhdGEtMScgfSxcbiAgICAgICAgICB7IHdhbGxldElkOiAnd2FsbGV0LWlkLTInLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtZGF0YS0yJyB9LFxuICAgICAgICAgIHsgd2FsbGV0SWQ6ICd3YWxsZXQtaWQtMycsIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1kYXRhLTMnIH0sXG4gICAgICAgICAgeyB3YWxsZXRJZDogJ3dhbGxldC1pZC00JywgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLWRhdGEtNCcgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGFzc3dvcmQ6ICdwYXNzd29yZDEyMycsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2hvdWxkIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIHdhbGxldFxuICAgICAgZGVjcnlwdFN0dWIuY2FsbENvdW50LnNob3VsZC5lcXVhbCg0KTtcblxuICAgICAgLy8gU2hvdWxkIGluY2x1ZGUgb25seSB0aGUgZmFpbGVkIHdhbGxldCBJRHNcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuYW4uQXJyYXkoKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgICByZXN1bHQuc2hvdWxkLmNvbnRhaW5EZWVwKFsnd2FsbGV0LWlkLTInLCAnd2FsbGV0LWlkLTQnXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdVc2VyLUFnZW50IGhlYWRlciBiYXNlZCBvbiBlbnZpcm9ubWVudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgVXNlci1BZ2VudCBoZWFkZXIgd2hlbiBydW5uaW5nIGluIE5vZGUuanMgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJyxcbiAgICAgICAgdXNlckFnZW50OiAnVGVzdEFnZW50LzEuMCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gRW5zdXJlIHdlJ3JlIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudCBieSB2ZXJpZnlpbmcgd2luZG93IGlzIHVuZGVmaW5lZFxuICAgICAgKHR5cGVvZiB3aW5kb3cpLnNob3VsZC5lcXVhbCgndW5kZWZpbmVkJyk7XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jaygnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcpXG4gICAgICAgIC5nZXQoJy9hcGkvdjEvcGluZycpXG4gICAgICAgIC5tYXRjaEhlYWRlcignVXNlci1BZ2VudCcsICdUZXN0QWdlbnQvMS4wJylcbiAgICAgICAgLnJlcGx5KDIwMCwgeyBzdGF0dXM6ICdvaycgfSk7XG5cbiAgICAgIGF3YWl0IGJpdGdvLnBpbmcoe1xuICAgICAgICByZXFJZDoge1xuICAgICAgICAgIHRvU3RyaW5nOiAoKSA9PiAndGVzdC0xMjMnLFxuICAgICAgICAgIGluYzogKCkgPT4ge1xuICAgICAgICAgICAgLyogbW9jayAqL1xuICAgICAgICAgIH0sXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgfSk7XG5cbiAgICAgIHNjb3BlLmlzRG9uZSgpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBzZXQgVXNlci1BZ2VudCBoZWFkZXIgd2hlbiBydW5uaW5nIGluIGJyb3dzZXIgKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBNb2NrIHRoZSB3aW5kb3cgb2JqZWN0IHRvIHNpbXVsYXRlIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAgICAgIGNvbnN0IHdpbmRvd1N0dWIgPSB7IGxvY2F0aW9uOiAnbW9jaycgfTtcbiAgICAgIChnbG9iYWwgYXMgYW55KS53aW5kb3cgPSB3aW5kb3dTdHViO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcsXG4gICAgICAgICAgdXNlckFnZW50OiAnVGVzdEFnZW50LzEuMCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNjb3BlID0gbm9jaygnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcpXG4gICAgICAgICAgLmdldCgnL2FwaS92MS9waW5nJylcbiAgICAgICAgICAucmVwbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gVmVyaWZ5IFVzZXItQWdlbnQgaGVhZGVyIGlzIE5PVCBzZXQgdG8gb3VyIGN1c3RvbSB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdXNlckFnZW50ID0gdGhpcy5yZXEuaGVhZGVyc1sndXNlci1hZ2VudCddO1xuICAgICAgICAgICAgaWYgKHVzZXJBZ2VudCAmJiB1c2VyQWdlbnQuaW5jbHVkZXMoJ1Rlc3RBZ2VudC8xLjAnKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXItQWdlbnQgc2hvdWxkIG5vdCBiZSBzZXQgaW4gYnJvd3NlciBlbnZpcm9ubWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFsyMDAsIHsgc3RhdHVzOiAnb2snIH1dO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IGJpdGdvLnBpbmcoe1xuICAgICAgICAgIHJlcUlkOiB7XG4gICAgICAgICAgICB0b1N0cmluZzogKCkgPT4gJ3Rlc3QtMTIzJyxcbiAgICAgICAgICAgIGluYzogKCkgPT4ge1xuICAgICAgICAgICAgICAvKiBtb2NrICovXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9KTtcblxuICAgICAgICBzY29wZS5pc0RvbmUoKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGdsb2JhbCB3aW5kb3cgbW9ja1xuICAgICAgICBkZWxldGUgKGdsb2JhbCBhcyBhbnkpLndpbmRvdztcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvbnN0YW50cyBwYXJhbWV0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhbGxvdyBwYXNzaW5nIGNvbnN0YW50cyB2aWEgb3B0aW9ucyBhbmQgZXhwb3NlIHZpYSBmZXRjaENvbnN0YW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgICBjbGllbnRDb25zdGFudHM6IHsgbWF4RmVlUmF0ZTogJzEyMzEyMzEyMzEyMzEyMycgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb25zdGFudHMgPSBhd2FpdCBiaXRnby5mZXRjaENvbnN0YW50cygpO1xuICAgICAgY29uc3RhbnRzLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtYXhGZWVSYXRlJywgJzEyMzEyMzEyMzEyMzEyMycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWZyZXNoIGNvbnN0YW50cyB3aGVuIGNhY2hlIGhhcyBleHBpcmVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IHVwIGNhY2hlZCBjb25zdGFudHMgd2l0aCBhbiBleHBpcmVkIGNhY2hlXG4gICAgICAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzID0gKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50cyB8fCB7fTtcbiAgICAgIChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHNFeHBpcmUgPSAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzRXhwaXJlIHx8IHt9O1xuICAgICAgKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50c1snY3VzdG9tJ10gPSB7IG1heEZlZVJhdGU6ICdvbGQtdmFsdWUnIH07XG4gICAgICAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzRXhwaXJlWydjdXN0b20nXSA9IG5ldyBEYXRlKERhdGUubm93KCkgLSAxMDAwKTsgLy8gRXhwaXJlZCAxIHNlY29uZCBhZ29cblxuICAgICAgY29uc3Qgc2NvcGUgPSBub2NrKCdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJylcbiAgICAgICAgLmdldCgnL2FwaS92MS9jbGllbnQvY29uc3RhbnRzJylcbiAgICAgICAgLnJlcGx5KDIwMCwge1xuICAgICAgICAgIGNvbnN0YW50czogeyBtYXhGZWVSYXRlOiAnbmV3LXZhbHVlJywgbmV3Q29uc3RhbnQ6ICdhZGRlZCcgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbnN0YW50cyA9IGF3YWl0IGJpdGdvLmZldGNoQ29uc3RhbnRzKCk7XG5cbiAgICAgIC8vIFNob3VsZCByZXR1cm4gdGhlIG5ldyBjb25zdGFudHMgZnJvbSB0aGUgc2VydmVyXG4gICAgICBjb25zdGFudHMuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21heEZlZVJhdGUnLCAnbmV3LXZhbHVlJyk7XG4gICAgICBjb25zdGFudHMuc2hvdWxkLmhhdmUucHJvcGVydHkoJ25ld0NvbnN0YW50JywgJ2FkZGVkJyk7XG5cbiAgICAgIHNjb3BlLmlzRG9uZSgpLnNob3VsZC5iZS50cnVlKCk7XG5cbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIGNhY2hlZCBjb25zdGFudHMgd2hlbiBjYWNoZSBpcyBzdGlsbCB2YWxpZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCB1cCBjYWNoZWQgY29uc3RhbnRzIHdpdGggYSBmdXR1cmUgZXhwaXJ5XG4gICAgICBjb25zdCBjYWNoZWRDb25zdGFudHMgPSB7IG1heEZlZVJhdGU6ICdjYWNoZWQtdmFsdWUnLCBhbm90aGVyU2V0dGluZzogJ2NhY2hlZC1zZXR0aW5nJyB9O1xuICAgICAgKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50cyA9IChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHMgfHwge307XG4gICAgICAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzRXhwaXJlID0gKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50c0V4cGlyZSB8fCB7fTtcbiAgICAgIChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHNbJ2N1c3RvbSddID0gY2FjaGVkQ29uc3RhbnRzO1xuICAgICAgKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50c0V4cGlyZVsnY3VzdG9tJ10gPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCk7IC8vIFZhbGlkIGZvciA1IG1vcmUgbWludXRlc1xuXG4gICAgICBjb25zdCBzY29wZSA9IG5vY2soJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnKVxuICAgICAgICAuZ2V0KCcvYXBpL3YxL2NsaWVudC9jb25zdGFudHMnKVxuICAgICAgICAucmVwbHkoMjAwLCB7IGNvbnN0YW50czogeyBzaG91bGROb3RCZVVzZWQ6IHRydWUgfSB9KTtcblxuICAgICAgY29uc3QgY29uc3RhbnRzID0gYXdhaXQgYml0Z28uZmV0Y2hDb25zdGFudHMoKTtcblxuICAgICAgLy8gU2hvdWxkIHJldHVybiB0aGUgY2FjaGVkIGNvbnN0YW50c1xuICAgICAgY29uc3RhbnRzLnNob3VsZC5kZWVwRXF1YWwoY2FjaGVkQ29uc3RhbnRzKTtcblxuICAgICAgLy8gVmVyaWZ5IHRoYXQgbm8gSFRUUCByZXF1ZXN0IHdhcyBtYWRlIChzaW5jZSBjYWNoZSB3YXMgdmFsaWQpXG4gICAgICBzY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuZmFsc2UoKTtcblxuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgY2FjaGVkIGNvbnN0YW50cyB3aGVuIG5vIGNhY2hlIGV4cGlyeSBpcyBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdXAgY2FjaGVkIGNvbnN0YW50cyB3aXRoIG5vIGV4cGlyeVxuICAgICAgY29uc3QgY2FjaGVkQ29uc3RhbnRzID0geyBtYXhGZWVSYXRlOiAnbm8tZXhwaXJ5LXZhbHVlJyB9O1xuICAgICAgKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50cyA9IChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHMgfHwge307XG4gICAgICAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzRXhwaXJlID0gKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50c0V4cGlyZSB8fCB7fTtcbiAgICAgIChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHNbJ2N1c3RvbSddID0gY2FjaGVkQ29uc3RhbnRzO1xuICAgICAgKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50c0V4cGlyZVsnY3VzdG9tJ10gPSB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jaygnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcpXG4gICAgICAgIC5nZXQoJy9hcGkvdjEvY2xpZW50L2NvbnN0YW50cycpXG4gICAgICAgIC5yZXBseSgyMDAsIHsgY29uc3RhbnRzOiB7IHNob3VsZE5vdEJlVXNlZDogdHJ1ZSB9IH0pO1xuXG4gICAgICBjb25zdCBjb25zdGFudHMgPSBhd2FpdCBiaXRnby5mZXRjaENvbnN0YW50cygpO1xuXG4gICAgICAvLyBTaG91bGQgcmV0dXJuIHRoZSBjYWNoZWQgY29uc3RhbnRzXG4gICAgICBjb25zdGFudHMuc2hvdWxkLmRlZXBFcXVhbChjYWNoZWRDb25zdGFudHMpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhhdCBubyBIVFRQIHJlcXVlc3Qgd2FzIG1hZGUgKHNpbmNlIG5vIGV4cGlyeSBtZWFucyBjYWNoZSBpcyBhbHdheXMgdmFsaWQpXG4gICAgICBzY29wZS5pc0RvbmUoKS5zaG91bGQuYmUuZmFsc2UoKTtcblxuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=encrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../../test/unit/encrypt.ts"],"names":[],"mappings":""}