@bitgo/sdk-api 1.69.2 → 1.70.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 (35) hide show
  1. package/dist/package.json +7 -4
  2. package/dist/src/bitgoAPI.d.ts +8 -2
  3. package/dist/src/bitgoAPI.d.ts.map +1 -1
  4. package/dist/src/bitgoAPI.js +40 -19
  5. package/dist/src/types.d.ts +5 -0
  6. package/dist/src/types.d.ts.map +1 -1
  7. package/dist/src/types.js +1 -1
  8. package/dist/test/unit/api.d.ts +2 -0
  9. package/dist/test/unit/api.d.ts.map +1 -0
  10. package/dist/test/unit/api.js +158 -0
  11. package/dist/test/unit/bitgoAPI.d.ts +2 -0
  12. package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
  13. package/dist/test/unit/bitgoAPI.js +393 -0
  14. package/dist/test/unit/encrypt.d.ts +2 -0
  15. package/dist/test/unit/encrypt.d.ts.map +1 -0
  16. package/dist/test/unit/encrypt.js +62 -0
  17. package/dist/test/unit/utils.d.ts +2 -0
  18. package/dist/test/unit/utils.d.ts.map +1 -0
  19. package/dist/test/unit/utils.js +65 -0
  20. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
  21. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
  22. package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
  23. package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
  24. package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
  25. package/dist/test/unit/v1/fixtures/index.js +24 -0
  26. package/dist/test/unit/v1/signPsbt.d.ts +2 -0
  27. package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
  28. package/dist/test/unit/v1/signPsbt.js +53 -0
  29. package/dist/test/unit/v1/wallet.d.ts +2 -0
  30. package/dist/test/unit/v1/wallet.d.ts.map +1 -0
  31. package/dist/test/unit/v1/wallet.js +1371 -0
  32. package/dist/tsconfig.tsbuildinfo +1 -0
  33. package/package.json +7 -4
  34. package/.eslintignore +0 -5
  35. package/CHANGELOG.md +0 -1321
@@ -0,0 +1,393 @@
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('http proxy agent', function () {
74
+ it('http proxy agent shall be created when proxy(customProxyagent) is set', function () {
75
+ const customProxyAgent = new proxy_agent_1.ProxyAgent({
76
+ getProxyForUrl: () => 'http://localhost:3000',
77
+ });
78
+ const bitgo = new bitgoAPI_1.BitGoAPI({
79
+ env: 'custom',
80
+ customRootURI: 'https://app.example.local',
81
+ customProxyAgent,
82
+ });
83
+ bitgo.should.have.property('_customProxyAgent', customProxyAgent);
84
+ });
85
+ it('bitgo api is still initiated when proxy(customProxyAgent) is not set', function () {
86
+ const bitgo = new bitgoAPI_1.BitGoAPI({
87
+ env: 'custom',
88
+ customRootURI: 'https://app.example.local',
89
+ });
90
+ bitgo.should.have.property('_customProxyAgent', undefined);
91
+ });
92
+ });
93
+ describe('verifyAddress', function () {
94
+ it('should successfully verify a base58 address', function () {
95
+ const bitgo = new bitgoAPI_1.BitGoAPI({
96
+ env: 'test',
97
+ });
98
+ bitgo.verifyAddress({ address: '2N6paT2TU4N1XpaZjJiApWJXoeyrL3UWpkZ' }).should.be.true();
99
+ });
100
+ it('should successfully verify a bech32 address', function () {
101
+ const bitgo = new bitgoAPI_1.BitGoAPI({
102
+ env: 'test',
103
+ });
104
+ bitgo
105
+ .verifyAddress({ address: 'tb1qguzyk4w6kaqtpsczs5aj0w8r7598jq36egm8e98wqph3rwmex68seslgsg' })
106
+ .should.be.true();
107
+ });
108
+ });
109
+ describe('url', function () {
110
+ it('should return the correct URL for version 1', function () {
111
+ const bitgo = new bitgoAPI_1.BitGoAPI({
112
+ env: 'test',
113
+ customRootURI: 'https://test.bitgo.com',
114
+ });
115
+ const path = '/test-path';
116
+ const expectedUrl = 'https://test.bitgo.com/api/v1/test-path';
117
+ const result = bitgo.url(path, 1);
118
+ result.should.equal(expectedUrl);
119
+ });
120
+ it('should return the correct URL for version 2', function () {
121
+ const bitgo = new bitgoAPI_1.BitGoAPI({
122
+ env: 'test',
123
+ customRootURI: 'https://test.bitgo.com',
124
+ });
125
+ const path = '/test-path';
126
+ const expectedUrl = 'https://test.bitgo.com/api/v2/test-path';
127
+ const result = bitgo.url(path, 2);
128
+ result.should.equal(expectedUrl);
129
+ });
130
+ it('should return the correct URL for version 3', function () {
131
+ const bitgo = new bitgoAPI_1.BitGoAPI({
132
+ env: 'test',
133
+ customRootURI: 'https://test.bitgo.com',
134
+ });
135
+ const path = '/test-path';
136
+ const expectedUrl = 'https://test.bitgo.com/api/v3/test-path';
137
+ const result = bitgo.url(path, 3);
138
+ result.should.equal(expectedUrl);
139
+ });
140
+ it('should default to version 1 if no version is provided', function () {
141
+ const bitgo = new bitgoAPI_1.BitGoAPI({
142
+ env: 'test',
143
+ customRootURI: 'https://test.bitgo.com',
144
+ });
145
+ const path = '/test-path';
146
+ const expectedUrl = 'https://test.bitgo.com/api/v1/test-path';
147
+ const result = bitgo.url(path);
148
+ result.should.equal(expectedUrl);
149
+ });
150
+ });
151
+ describe('decryptKeys', function () {
152
+ let bitgo;
153
+ beforeEach(function () {
154
+ bitgo = new bitgoAPI_1.BitGoAPI({
155
+ env: 'test',
156
+ });
157
+ });
158
+ afterEach(function () {
159
+ sinon.restore();
160
+ });
161
+ it('should throw if no params are provided', function () {
162
+ try {
163
+ // @ts-expect-error - intentionally calling with no params for test
164
+ bitgo.decryptKeys();
165
+ throw new Error('Expected error but got none');
166
+ }
167
+ catch (e) {
168
+ e.message.should.containEql('Missing parameter');
169
+ }
170
+ });
171
+ it('should throw if walletIdEncryptedKeyPairs is missing', function () {
172
+ try {
173
+ // @ts-expect-error - intentionally missing required param
174
+ bitgo.decryptKeys({ password: 'password123' });
175
+ throw new Error('Expected error but got none');
176
+ }
177
+ catch (e) {
178
+ e.message.should.containEql('Missing parameter: walletIdEncryptedKeyPairs');
179
+ }
180
+ });
181
+ it('should throw if password is missing', function () {
182
+ try {
183
+ // @ts-expect-error - intentionally missing required param
184
+ bitgo.decryptKeys({ walletIdEncryptedKeyPairs: [] });
185
+ throw new Error('Expected error but got none');
186
+ }
187
+ catch (e) {
188
+ e.message.should.containEql('Missing parameter: password');
189
+ }
190
+ });
191
+ it('should throw if walletIdEncryptedKeyPairs is not an array', function () {
192
+ try {
193
+ // @ts-expect-error - intentionally providing wrong type
194
+ bitgo.decryptKeys({ walletIdEncryptedKeyPairs: 'not an array', password: 'password123' });
195
+ throw new Error('Expected error but got none');
196
+ }
197
+ catch (e) {
198
+ e.message.should.equal('walletIdEncryptedKeyPairs must be an array');
199
+ }
200
+ });
201
+ it('should return empty array for empty walletIdEncryptedKeyPairs', function () {
202
+ const result = bitgo.decryptKeys({ walletIdEncryptedKeyPairs: [], password: 'password123' });
203
+ result.should.be.an.Array();
204
+ result.should.be.empty();
205
+ });
206
+ it('should throw if any walletId is missing or not a string', function () {
207
+ try {
208
+ bitgo.decryptKeys({
209
+ walletIdEncryptedKeyPairs: [
210
+ // @ts-expect-error - intentionally missing walletId
211
+ {
212
+ encryptedPrv: 'encrypted-data',
213
+ },
214
+ ],
215
+ password: 'password123',
216
+ });
217
+ throw new Error('Expected error but got none');
218
+ }
219
+ catch (e) {
220
+ e.message.should.equal('each key pair must have a string walletId');
221
+ }
222
+ try {
223
+ bitgo.decryptKeys({
224
+ walletIdEncryptedKeyPairs: [
225
+ {
226
+ // @ts-expect-error - intentionally providing wrong type
227
+ walletId: 123,
228
+ encryptedPrv: 'encrypted-data',
229
+ },
230
+ ],
231
+ password: 'password123',
232
+ });
233
+ throw new Error('Expected error but got none');
234
+ }
235
+ catch (e) {
236
+ e.message.should.equal('each key pair must have a string walletId');
237
+ }
238
+ });
239
+ it('should throw if any encryptedPrv is missing or not a string', function () {
240
+ try {
241
+ bitgo.decryptKeys({
242
+ walletIdEncryptedKeyPairs: [
243
+ // @ts-expect-error - intentionally missing encryptedPrv
244
+ {
245
+ walletId: 'wallet-id-1',
246
+ },
247
+ ],
248
+ password: 'password123',
249
+ });
250
+ throw new Error('Expected error but got none');
251
+ }
252
+ catch (e) {
253
+ e.message.should.equal('each key pair must have a string encryptedPrv');
254
+ }
255
+ try {
256
+ bitgo.decryptKeys({
257
+ walletIdEncryptedKeyPairs: [
258
+ {
259
+ walletId: 'wallet-id-1',
260
+ // @ts-expect-error - intentionally providing wrong type
261
+ encryptedPrv: 123,
262
+ },
263
+ ],
264
+ password: 'password123',
265
+ });
266
+ throw new Error('Expected error but got none');
267
+ }
268
+ catch (e) {
269
+ e.message.should.equal('each key pair must have a string encryptedPrv');
270
+ }
271
+ });
272
+ it('should return walletIds of keys that failed to decrypt', function () {
273
+ // Create a stub for the decrypt method
274
+ const decryptStub = sinon.stub(bitgo, 'decrypt');
275
+ // Make it succeed for first wallet and fail for second wallet
276
+ decryptStub.onFirstCall().returns('decrypted-key-1');
277
+ decryptStub.onSecondCall().throws(new Error('decryption failed'));
278
+ const result = bitgo.decryptKeys({
279
+ walletIdEncryptedKeyPairs: [
280
+ { walletId: 'wallet-id-1', encryptedPrv: 'encrypted-data-1' },
281
+ { walletId: 'wallet-id-2', encryptedPrv: 'encrypted-data-2' },
282
+ ],
283
+ password: 'password123',
284
+ });
285
+ result.should.be.an.Array();
286
+ result.should.have.length(1);
287
+ result[0].should.equal('wallet-id-2');
288
+ });
289
+ it('should correctly process multiple wallet keys', function () {
290
+ // Create a spy on the decrypt method
291
+ const decryptStub = sinon.stub(bitgo, 'decrypt');
292
+ // Configure the stub to throw for specific wallets
293
+ decryptStub
294
+ .withArgs({ input: 'encrypted-data-2', password: 'password123' })
295
+ .throws(new Error('decryption failed'));
296
+ decryptStub
297
+ .withArgs({ input: 'encrypted-data-4', password: 'password123' })
298
+ .throws(new Error('decryption failed'));
299
+ decryptStub.returns('success'); // Default return for other calls
300
+ const result = bitgo.decryptKeys({
301
+ walletIdEncryptedKeyPairs: [
302
+ { walletId: 'wallet-id-1', encryptedPrv: 'encrypted-data-1' },
303
+ { walletId: 'wallet-id-2', encryptedPrv: 'encrypted-data-2' },
304
+ { walletId: 'wallet-id-3', encryptedPrv: 'encrypted-data-3' },
305
+ { walletId: 'wallet-id-4', encryptedPrv: 'encrypted-data-4' },
306
+ ],
307
+ password: 'password123',
308
+ });
309
+ // Should be called once for each wallet
310
+ decryptStub.callCount.should.equal(4);
311
+ // Should include only the failed wallet IDs
312
+ result.should.be.an.Array();
313
+ result.should.have.length(2);
314
+ result.should.containDeep(['wallet-id-2', 'wallet-id-4']);
315
+ });
316
+ });
317
+ describe('constants parameter', function () {
318
+ it('should allow passing constants via options and expose via fetchConstants', async function () {
319
+ const bitgo = new bitgoAPI_1.BitGoAPI({
320
+ env: 'custom',
321
+ customRootURI: 'https://app.example.local',
322
+ clientConstants: { maxFeeRate: '123123123123123' },
323
+ });
324
+ const constants = await bitgo.fetchConstants();
325
+ constants.should.have.property('maxFeeRate', '123123123123123');
326
+ });
327
+ it('should refresh constants when cache has expired', async function () {
328
+ const bitgo = new bitgoAPI_1.BitGoAPI({
329
+ env: 'custom',
330
+ customRootURI: 'https://app.example.local',
331
+ });
332
+ // Set up cached constants with an expired cache
333
+ bitgoAPI_1.BitGoAPI._constants = bitgoAPI_1.BitGoAPI._constants || {};
334
+ bitgoAPI_1.BitGoAPI._constantsExpire = bitgoAPI_1.BitGoAPI._constantsExpire || {};
335
+ bitgoAPI_1.BitGoAPI._constants['custom'] = { maxFeeRate: 'old-value' };
336
+ bitgoAPI_1.BitGoAPI._constantsExpire['custom'] = new Date(Date.now() - 1000); // Expired 1 second ago
337
+ const scope = (0, nock_1.default)('https://app.example.local')
338
+ .get('/api/v1/client/constants')
339
+ .reply(200, {
340
+ constants: { maxFeeRate: 'new-value', newConstant: 'added' },
341
+ });
342
+ const constants = await bitgo.fetchConstants();
343
+ // Should return the new constants from the server
344
+ constants.should.have.property('maxFeeRate', 'new-value');
345
+ constants.should.have.property('newConstant', 'added');
346
+ scope.isDone().should.be.true();
347
+ nock_1.default.cleanAll();
348
+ });
349
+ it('should use cached constants when cache is still valid', async function () {
350
+ const bitgo = new bitgoAPI_1.BitGoAPI({
351
+ env: 'custom',
352
+ customRootURI: 'https://app.example.local',
353
+ });
354
+ // Set up cached constants with a future expiry
355
+ const cachedConstants = { maxFeeRate: 'cached-value', anotherSetting: 'cached-setting' };
356
+ bitgoAPI_1.BitGoAPI._constants = bitgoAPI_1.BitGoAPI._constants || {};
357
+ bitgoAPI_1.BitGoAPI._constantsExpire = bitgoAPI_1.BitGoAPI._constantsExpire || {};
358
+ bitgoAPI_1.BitGoAPI._constants['custom'] = cachedConstants;
359
+ bitgoAPI_1.BitGoAPI._constantsExpire['custom'] = new Date(Date.now() + 5 * 60 * 1000); // Valid for 5 more minutes
360
+ const scope = (0, nock_1.default)('https://app.example.local')
361
+ .get('/api/v1/client/constants')
362
+ .reply(200, { constants: { shouldNotBeUsed: true } });
363
+ const constants = await bitgo.fetchConstants();
364
+ // Should return the cached constants
365
+ constants.should.deepEqual(cachedConstants);
366
+ // Verify that no HTTP request was made (since cache was valid)
367
+ scope.isDone().should.be.false();
368
+ nock_1.default.cleanAll();
369
+ });
370
+ it('should use cached constants when no cache expiry is set', async function () {
371
+ const bitgo = new bitgoAPI_1.BitGoAPI({
372
+ env: 'custom',
373
+ customRootURI: 'https://app.example.local',
374
+ });
375
+ // Set up cached constants with no expiry
376
+ const cachedConstants = { maxFeeRate: 'no-expiry-value' };
377
+ bitgoAPI_1.BitGoAPI._constants = bitgoAPI_1.BitGoAPI._constants || {};
378
+ bitgoAPI_1.BitGoAPI._constantsExpire = bitgoAPI_1.BitGoAPI._constantsExpire || {};
379
+ bitgoAPI_1.BitGoAPI._constants['custom'] = cachedConstants;
380
+ bitgoAPI_1.BitGoAPI._constantsExpire['custom'] = undefined;
381
+ const scope = (0, nock_1.default)('https://app.example.local')
382
+ .get('/api/v1/client/constants')
383
+ .reply(200, { constants: { shouldNotBeUsed: true } });
384
+ const constants = await bitgo.fetchConstants();
385
+ // Should return the cached constants
386
+ constants.should.deepEqual(cachedConstants);
387
+ // Verify that no HTTP request was made (since no expiry means cache is always valid)
388
+ scope.isDone().should.be.false();
389
+ nock_1.default.cleanAll();
390
+ });
391
+ });
392
+ });
393
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29BUEkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvYml0Z29BUEkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrQkFBZ0I7QUFDaEIsaURBQThDO0FBQzlDLDZDQUF5QztBQUN6Qyw2Q0FBK0I7QUFDL0IsZ0RBQXdCO0FBRXhCLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsUUFBUSxDQUFDLG9DQUFvQyxFQUFFO1FBQzdDLEVBQUUsQ0FBQyxpREFBaUQsRUFBRTtZQUNwRCxNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFRLENBQUM7Z0JBQ3pCLEdBQUcsRUFBRSxRQUFRO2dCQUNiLGFBQWEsRUFBRSwyQkFBMkI7Z0JBQzFDLHlCQUF5QixFQUFFLElBQUk7YUFDaEMsQ0FBQyxDQUFDO1lBRUgsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDeEQsS0FBSyxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7WUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBUSxDQUFDO2dCQUN6QixHQUFHLEVBQUUsUUFBUTtnQkFDYixhQUFhLEVBQUUsMkJBQTJCO2dCQUMxQyx5QkFBeUIsRUFBRSxLQUFLO2FBQ2pDLENBQUMsQ0FBQztZQUVILEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3hELEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELE1B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LElBQUksRUFBRSxDQUFDO1lBQ2pFLG1CQUFnQixDQUFDLGdCQUFnQixHQUFJLG1CQUFnQixDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztZQUM3RSxtQkFBZ0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQ3hELG1CQUFnQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQztZQUV6RCxNQUFNLEtBQUssR0FBRyxJQUFBLGNBQUksRUFBQywyQkFBMkIsQ0FBQztpQkFDNUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO2lCQUMvQixLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV4RCxNQUFNLFNBQVMsR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUUvQyxxQ0FBcUM7WUFDckMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFNUMscUZBQXFGO1lBQ3JGLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRWpDLGNBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJy4uLy4uL3NyYy9iaXRnb0FQSSc7XG5pbXBvcnQgeyBQcm94eUFnZW50IH0gZnJvbSAncHJveHktYWdlbnQnO1xuaW1wb3J0ICogYXMgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IG5vY2sgZnJvbSAnbm9jayc7XG5cbmRlc2NyaWJlKCdDb25zdHJ1Y3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgYXJndW1lbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgaXMgZW5hYmxlZCBleHBsaWNpdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcsXG4gICAgICAgIGNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQ6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgYml0Z28uc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQnKTtcbiAgICAgIGJpdGdvLmNvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgaXMgZGlzYWJsZWQgZXhwbGljaXRseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgICBjb29raWVzUHJvcGFnYXRpb25FbmFibGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBiaXRnby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZCcpO1xuICAgICAgYml0Z28uY29va2llc1Byb3BhZ2F0aW9uRW5hYmxlZC5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Nvb2tpZXNQcm9wYWdhdGlvbkVuYWJsZWQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgfSk7XG5cbiAgICAgIGJpdGdvLnNob3VsZC5oYXZlLnByb3BlcnR5KCdjb29raWVzUHJvcGFnYXRpb25FbmFibGVkJyk7XG4gICAgICBiaXRnby5jb29raWVzUHJvcGFnYXRpb25FbmFibGVkLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnaHR0cCBwcm94eSBhZ2VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnaHR0cCBwcm94eSBhZ2VudCBzaGFsbCBiZSBjcmVhdGVkIHdoZW4gcHJveHkoY3VzdG9tUHJveHlhZ2VudCkgaXMgc2V0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY3VzdG9tUHJveHlBZ2VudCA9IG5ldyBQcm94eUFnZW50KHtcbiAgICAgICAgZ2V0UHJveHlGb3JVcmw6ICgpID0+ICdodHRwOi8vbG9jYWxob3N0OjMwMDAnLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJyxcbiAgICAgICAgY3VzdG9tUHJveHlBZ2VudCxcbiAgICAgIH0pO1xuXG4gICAgICBiaXRnby5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnX2N1c3RvbVByb3h5QWdlbnQnLCBjdXN0b21Qcm94eUFnZW50KTtcbiAgICB9KTtcblxuICAgIGl0KCdiaXRnbyBhcGkgaXMgc3RpbGwgaW5pdGlhdGVkIHdoZW4gcHJveHkoY3VzdG9tUHJveHlBZ2VudCkgaXMgbm90IHNldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgfSk7XG5cbiAgICAgIGJpdGdvLnNob3VsZC5oYXZlLnByb3BlcnR5KCdfY3VzdG9tUHJveHlBZ2VudCcsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2ZXJpZnlBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IHZlcmlmeSBhIGJhc2U1OCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICd0ZXN0JyxcbiAgICAgIH0pO1xuXG4gICAgICBiaXRnby52ZXJpZnlBZGRyZXNzKHsgYWRkcmVzczogJzJONnBhVDJUVTROMVhwYVpqSmlBcFdKWG9leXJMM1VXcGtaJyB9KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZXNzZnVsbHkgdmVyaWZ5IGEgYmVjaDMyIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ3Rlc3QnLFxuICAgICAgfSk7XG5cbiAgICAgIGJpdGdvXG4gICAgICAgIC52ZXJpZnlBZGRyZXNzKHsgYWRkcmVzczogJ3RiMXFndXp5azR3NmthcXRwc2N6czVhajB3OHI3NTk4anEzNmVnbThlOTh3cXBoM3J3bWV4NjhzZXNsZ3NnJyB9KVxuICAgICAgICAuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VybCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBVUkwgZm9yIHZlcnNpb24gMScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAndGVzdCcsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL3Rlc3QuYml0Z28uY29tJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcGF0aCA9ICcvdGVzdC1wYXRoJztcbiAgICAgIGNvbnN0IGV4cGVjdGVkVXJsID0gJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20vYXBpL3YxL3Rlc3QtcGF0aCc7XG4gICAgICBjb25zdCByZXN1bHQgPSBiaXRnby51cmwocGF0aCwgMSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKGV4cGVjdGVkVXJsKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IFVSTCBmb3IgdmVyc2lvbiAyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICd0ZXN0JyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vdGVzdC5iaXRnby5jb20nLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwYXRoID0gJy90ZXN0LXBhdGgnO1xuICAgICAgY29uc3QgZXhwZWN0ZWRVcmwgPSAnaHR0cHM6Ly90ZXN0LmJpdGdvLmNvbS9hcGkvdjIvdGVzdC1wYXRoJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJpdGdvLnVybChwYXRoLCAyKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZXF1YWwoZXhwZWN0ZWRVcmwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgVVJMIGZvciB2ZXJzaW9uIDMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ3Rlc3QnLFxuICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly90ZXN0LmJpdGdvLmNvbScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhdGggPSAnL3Rlc3QtcGF0aCc7XG4gICAgICBjb25zdCBleHBlY3RlZFVybCA9ICdodHRwczovL3Rlc3QuYml0Z28uY29tL2FwaS92My90ZXN0LXBhdGgnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYml0Z28udXJsKHBhdGgsIDMpO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChleHBlY3RlZFVybCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRlZmF1bHQgdG8gdmVyc2lvbiAxIGlmIG5vIHZlcnNpb24gaXMgcHJvdmlkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ3Rlc3QnLFxuICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly90ZXN0LmJpdGdvLmNvbScsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhdGggPSAnL3Rlc3QtcGF0aCc7XG4gICAgICBjb25zdCBleHBlY3RlZFVybCA9ICdodHRwczovL3Rlc3QuYml0Z28uY29tL2FwaS92MS90ZXN0LXBhdGgnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYml0Z28udXJsKHBhdGgpO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChleHBlY3RlZFVybCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkZWNyeXB0S2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgYml0Z286IEJpdEdvQVBJO1xuXG4gICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ3Rlc3QnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgc2lub24ucmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBubyBwYXJhbXMgYXJlIHByb3ZpZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGludGVudGlvbmFsbHkgY2FsbGluZyB3aXRoIG5vIHBhcmFtcyBmb3IgdGVzdFxuICAgICAgICBiaXRnby5kZWNyeXB0S2V5cygpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGVycm9yIGJ1dCBnb3Qgbm9uZScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW5FcWwoJ01pc3NpbmcgcGFyYW1ldGVyJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHdhbGxldElkRW5jcnlwdGVkS2V5UGFpcnMgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBpbnRlbnRpb25hbGx5IG1pc3NpbmcgcmVxdWlyZWQgcGFyYW1cbiAgICAgICAgYml0Z28uZGVjcnlwdEtleXMoeyBwYXNzd29yZDogJ3Bhc3N3b3JkMTIzJyB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBlcnJvciBidXQgZ290IG5vbmUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZS5tZXNzYWdlLnNob3VsZC5jb250YWluRXFsKCdNaXNzaW5nIHBhcmFtZXRlcjogd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlycycpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBwYXNzd29yZCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGludGVudGlvbmFsbHkgbWlzc2luZyByZXF1aXJlZCBwYXJhbVxuICAgICAgICBiaXRnby5kZWNyeXB0S2V5cyh7IHdhbGxldElkRW5jcnlwdGVkS2V5UGFpcnM6IFtdIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGVycm9yIGJ1dCBnb3Qgbm9uZScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmNvbnRhaW5FcWwoJ01pc3NpbmcgcGFyYW1ldGVyOiBwYXNzd29yZCcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzIGlzIG5vdCBhbiBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBpbnRlbnRpb25hbGx5IHByb3ZpZGluZyB3cm9uZyB0eXBlXG4gICAgICAgIGJpdGdvLmRlY3J5cHRLZXlzKHsgd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlyczogJ25vdCBhbiBhcnJheScsIHBhc3N3b3JkOiAncGFzc3dvcmQxMjMnIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGVycm9yIGJ1dCBnb3Qgbm9uZScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmVxdWFsKCd3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGVtcHR5IGFycmF5IGZvciBlbXB0eSB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYml0Z28uZGVjcnlwdEtleXMoeyB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzOiBbXSwgcGFzc3dvcmQ6ICdwYXNzd29yZDEyMycgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmJlLmFuLkFycmF5KCk7XG4gICAgICByZXN1bHQuc2hvdWxkLmJlLmVtcHR5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGFueSB3YWxsZXRJZCBpcyBtaXNzaW5nIG9yIG5vdCBhIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJpdGdvLmRlY3J5cHRLZXlzKHtcbiAgICAgICAgICB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzOiBbXG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gaW50ZW50aW9uYWxseSBtaXNzaW5nIHdhbGxldElkXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1kYXRhJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwYXNzd29yZDogJ3Bhc3N3b3JkMTIzJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZXJyb3IgYnV0IGdvdCBub25lJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGUubWVzc2FnZS5zaG91bGQuZXF1YWwoJ2VhY2gga2V5IHBhaXIgbXVzdCBoYXZlIGEgc3RyaW5nIHdhbGxldElkJyk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGJpdGdvLmRlY3J5cHRLZXlzKHtcbiAgICAgICAgICB3YWxsZXRJZEVuY3J5cHRlZEtleVBhaXJzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBpbnRlbnRpb25hbGx5IHByb3ZpZGluZyB3cm9uZyB0eXBlXG4gICAgICAgICAgICAgIHdhbGxldElkOiAxMjMsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1kYXRhJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBwYXNzd29yZDogJ3Bhc3N3b3JkMTIzJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZXJyb3IgYnV0IGdvdCBub25lJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGUubWVzc2FnZS5zaG91bGQuZXF1YWwoJ2VhY2gga2V5IHBhaXIgbXVzdCBoYXZlIGEgc3RyaW5nIHdhbGxldElkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGFueSBlbmNyeXB0ZWRQcnYgaXMgbWlzc2luZyBvciBub3QgYSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBiaXRnby5kZWNyeXB0S2V5cyh7XG4gICAgICAgICAgd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlyczogW1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGludGVudGlvbmFsbHkgbWlzc2luZyBlbmNyeXB0ZWRQcnZcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd2FsbGV0SWQ6ICd3YWxsZXQtaWQtMScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgcGFzc3dvcmQ6ICdwYXNzd29yZDEyMycsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGVycm9yIGJ1dCBnb3Qgbm9uZScpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkLmVxdWFsKCdlYWNoIGtleSBwYWlyIG11c3QgaGF2ZSBhIHN0cmluZyBlbmNyeXB0ZWRQcnYnKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYml0Z28uZGVjcnlwdEtleXMoe1xuICAgICAgICAgIHdhbGxldElkRW5jcnlwdGVkS2V5UGFpcnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgd2FsbGV0SWQ6ICd3YWxsZXQtaWQtMScsXG4gICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBpbnRlbnRpb25hbGx5IHByb3ZpZGluZyB3cm9uZyB0eXBlXG4gICAgICAgICAgICAgIGVuY3J5cHRlZFBydjogMTIzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBhc3N3b3JkOiAncGFzc3dvcmQxMjMnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBlcnJvciBidXQgZ290IG5vbmUnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZS5tZXNzYWdlLnNob3VsZC5lcXVhbCgnZWFjaCBrZXkgcGFpciBtdXN0IGhhdmUgYSBzdHJpbmcgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB3YWxsZXRJZHMgb2Yga2V5cyB0aGF0IGZhaWxlZCB0byBkZWNyeXB0JywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ3JlYXRlIGEgc3R1YiBmb3IgdGhlIGRlY3J5cHQgbWV0aG9kXG4gICAgICBjb25zdCBkZWNyeXB0U3R1YiA9IHNpbm9uLnN0dWIoYml0Z28sICdkZWNyeXB0Jyk7XG5cbiAgICAgIC8vIE1ha2UgaXQgc3VjY2VlZCBmb3IgZmlyc3Qgd2FsbGV0IGFuZCBmYWlsIGZvciBzZWNvbmQgd2FsbGV0XG4gICAgICBkZWNyeXB0U3R1Yi5vbkZpcnN0Q2FsbCgpLnJldHVybnMoJ2RlY3J5cHRlZC1rZXktMScpO1xuICAgICAgZGVjcnlwdFN0dWIub25TZWNvbmRDYWxsKCkudGhyb3dzKG5ldyBFcnJvcignZGVjcnlwdGlvbiBmYWlsZWQnKSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJpdGdvLmRlY3J5cHRLZXlzKHtcbiAgICAgICAgd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlyczogW1xuICAgICAgICAgIHsgd2FsbGV0SWQ6ICd3YWxsZXQtaWQtMScsIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1kYXRhLTEnIH0sXG4gICAgICAgICAgeyB3YWxsZXRJZDogJ3dhbGxldC1pZC0yJywgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLWRhdGEtMicgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGFzc3dvcmQ6ICdwYXNzd29yZDEyMycsXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5iZS5hbi5BcnJheSgpO1xuICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIHJlc3VsdFswXS5zaG91bGQuZXF1YWwoJ3dhbGxldC1pZC0yJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBwcm9jZXNzIG11bHRpcGxlIHdhbGxldCBrZXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQ3JlYXRlIGEgc3B5IG9uIHRoZSBkZWNyeXB0IG1ldGhvZFxuICAgICAgY29uc3QgZGVjcnlwdFN0dWIgPSBzaW5vbi5zdHViKGJpdGdvLCAnZGVjcnlwdCcpO1xuXG4gICAgICAvLyBDb25maWd1cmUgdGhlIHN0dWIgdG8gdGhyb3cgZm9yIHNwZWNpZmljIHdhbGxldHNcbiAgICAgIGRlY3J5cHRTdHViXG4gICAgICAgIC53aXRoQXJncyh7IGlucHV0OiAnZW5jcnlwdGVkLWRhdGEtMicsIHBhc3N3b3JkOiAncGFzc3dvcmQxMjMnIH0pXG4gICAgICAgIC50aHJvd3MobmV3IEVycm9yKCdkZWNyeXB0aW9uIGZhaWxlZCcpKTtcbiAgICAgIGRlY3J5cHRTdHViXG4gICAgICAgIC53aXRoQXJncyh7IGlucHV0OiAnZW5jcnlwdGVkLWRhdGEtNCcsIHBhc3N3b3JkOiAncGFzc3dvcmQxMjMnIH0pXG4gICAgICAgIC50aHJvd3MobmV3IEVycm9yKCdkZWNyeXB0aW9uIGZhaWxlZCcpKTtcbiAgICAgIGRlY3J5cHRTdHViLnJldHVybnMoJ3N1Y2Nlc3MnKTsgLy8gRGVmYXVsdCByZXR1cm4gZm9yIG90aGVyIGNhbGxzXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJpdGdvLmRlY3J5cHRLZXlzKHtcbiAgICAgICAgd2FsbGV0SWRFbmNyeXB0ZWRLZXlQYWlyczogW1xuICAgICAgICAgIHsgd2FsbGV0SWQ6ICd3YWxsZXQtaWQtMScsIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1kYXRhLTEnIH0sXG4gICAgICAgICAgeyB3YWxsZXRJZDogJ3dhbGxldC1pZC0yJywgZW5jcnlwdGVkUHJ2OiAnZW5jcnlwdGVkLWRhdGEtMicgfSxcbiAgICAgICAgICB7IHdhbGxldElkOiAnd2FsbGV0LWlkLTMnLCBlbmNyeXB0ZWRQcnY6ICdlbmNyeXB0ZWQtZGF0YS0zJyB9LFxuICAgICAgICAgIHsgd2FsbGV0SWQ6ICd3YWxsZXQtaWQtNCcsIGVuY3J5cHRlZFBydjogJ2VuY3J5cHRlZC1kYXRhLTQnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHBhc3N3b3JkOiAncGFzc3dvcmQxMjMnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCB3YWxsZXRcbiAgICAgIGRlY3J5cHRTdHViLmNhbGxDb3VudC5zaG91bGQuZXF1YWwoNCk7XG5cbiAgICAgIC8vIFNob3VsZCBpbmNsdWRlIG9ubHkgdGhlIGZhaWxlZCB3YWxsZXQgSURzXG4gICAgICByZXN1bHQuc2hvdWxkLmJlLmFuLkFycmF5KCk7XG4gICAgICByZXN1bHQuc2hvdWxkLmhhdmUubGVuZ3RoKDIpO1xuICAgICAgcmVzdWx0LnNob3VsZC5jb250YWluRGVlcChbJ3dhbGxldC1pZC0yJywgJ3dhbGxldC1pZC00J10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29uc3RhbnRzIHBhcmFtZXRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGFsbG93IHBhc3NpbmcgY29uc3RhbnRzIHZpYSBvcHRpb25zIGFuZCBleHBvc2UgdmlhIGZldGNoQ29uc3RhbnRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcsXG4gICAgICAgIGNsaWVudENvbnN0YW50czogeyBtYXhGZWVSYXRlOiAnMTIzMTIzMTIzMTIzMTIzJyB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbnN0YW50cyA9IGF3YWl0IGJpdGdvLmZldGNoQ29uc3RhbnRzKCk7XG4gICAgICBjb25zdGFudHMuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21heEZlZVJhdGUnLCAnMTIzMTIzMTIzMTIzMTIzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlZnJlc2ggY29uc3RhbnRzIHdoZW4gY2FjaGUgaGFzIGV4cGlyZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7XG4gICAgICAgIGVudjogJ2N1c3RvbScsXG4gICAgICAgIGN1c3RvbVJvb3RVUkk6ICdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdXAgY2FjaGVkIGNvbnN0YW50cyB3aXRoIGFuIGV4cGlyZWQgY2FjaGVcbiAgICAgIChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHMgPSAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzIHx8IHt9O1xuICAgICAgKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50c0V4cGlyZSA9IChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHNFeHBpcmUgfHwge307XG4gICAgICAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzWydjdXN0b20nXSA9IHsgbWF4RmVlUmF0ZTogJ29sZC12YWx1ZScgfTtcbiAgICAgIChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHNFeHBpcmVbJ2N1c3RvbSddID0gbmV3IERhdGUoRGF0ZS5ub3coKSAtIDEwMDApOyAvLyBFeHBpcmVkIDEgc2Vjb25kIGFnb1xuXG4gICAgICBjb25zdCBzY29wZSA9IG5vY2soJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnKVxuICAgICAgICAuZ2V0KCcvYXBpL3YxL2NsaWVudC9jb25zdGFudHMnKVxuICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAgY29uc3RhbnRzOiB7IG1heEZlZVJhdGU6ICduZXctdmFsdWUnLCBuZXdDb25zdGFudDogJ2FkZGVkJyB9LFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgY29uc3RhbnRzID0gYXdhaXQgYml0Z28uZmV0Y2hDb25zdGFudHMoKTtcblxuICAgICAgLy8gU2hvdWxkIHJldHVybiB0aGUgbmV3IGNvbnN0YW50cyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgIGNvbnN0YW50cy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWF4RmVlUmF0ZScsICduZXctdmFsdWUnKTtcbiAgICAgIGNvbnN0YW50cy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbmV3Q29uc3RhbnQnLCAnYWRkZWQnKTtcblxuICAgICAgc2NvcGUuaXNEb25lKCkuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgY2FjaGVkIGNvbnN0YW50cyB3aGVuIGNhY2hlIGlzIHN0aWxsIHZhbGlkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYml0Z28gPSBuZXcgQml0R29BUEkoe1xuICAgICAgICBlbnY6ICdjdXN0b20nLFxuICAgICAgICBjdXN0b21Sb290VVJJOiAnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcsXG4gICAgICB9KTtcblxuICAgICAgLy8gU2V0IHVwIGNhY2hlZCBjb25zdGFudHMgd2l0aCBhIGZ1dHVyZSBleHBpcnlcbiAgICAgIGNvbnN0IGNhY2hlZENvbnN0YW50cyA9IHsgbWF4RmVlUmF0ZTogJ2NhY2hlZC12YWx1ZScsIGFub3RoZXJTZXR0aW5nOiAnY2FjaGVkLXNldHRpbmcnIH07XG4gICAgICAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzID0gKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50cyB8fCB7fTtcbiAgICAgIChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHNFeHBpcmUgPSAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzRXhwaXJlIHx8IHt9O1xuICAgICAgKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50c1snY3VzdG9tJ10gPSBjYWNoZWRDb25zdGFudHM7XG4gICAgICAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzRXhwaXJlWydjdXN0b20nXSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyA1ICogNjAgKiAxMDAwKTsgLy8gVmFsaWQgZm9yIDUgbW9yZSBtaW51dGVzXG5cbiAgICAgIGNvbnN0IHNjb3BlID0gbm9jaygnaHR0cHM6Ly9hcHAuZXhhbXBsZS5sb2NhbCcpXG4gICAgICAgIC5nZXQoJy9hcGkvdjEvY2xpZW50L2NvbnN0YW50cycpXG4gICAgICAgIC5yZXBseSgyMDAsIHsgY29uc3RhbnRzOiB7IHNob3VsZE5vdEJlVXNlZDogdHJ1ZSB9IH0pO1xuXG4gICAgICBjb25zdCBjb25zdGFudHMgPSBhd2FpdCBiaXRnby5mZXRjaENvbnN0YW50cygpO1xuXG4gICAgICAvLyBTaG91bGQgcmV0dXJuIHRoZSBjYWNoZWQgY29uc3RhbnRzXG4gICAgICBjb25zdGFudHMuc2hvdWxkLmRlZXBFcXVhbChjYWNoZWRDb25zdGFudHMpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhhdCBubyBIVFRQIHJlcXVlc3Qgd2FzIG1hZGUgKHNpbmNlIGNhY2hlIHdhcyB2YWxpZClcbiAgICAgIHNjb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5mYWxzZSgpO1xuXG4gICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSBjYWNoZWQgY29uc3RhbnRzIHdoZW4gbm8gY2FjaGUgZXhwaXJ5IGlzIHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJpdGdvID0gbmV3IEJpdEdvQVBJKHtcbiAgICAgICAgZW52OiAnY3VzdG9tJyxcbiAgICAgICAgY3VzdG9tUm9vdFVSSTogJ2h0dHBzOi8vYXBwLmV4YW1wbGUubG9jYWwnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCB1cCBjYWNoZWQgY29uc3RhbnRzIHdpdGggbm8gZXhwaXJ5XG4gICAgICBjb25zdCBjYWNoZWRDb25zdGFudHMgPSB7IG1heEZlZVJhdGU6ICduby1leHBpcnktdmFsdWUnIH07XG4gICAgICAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzID0gKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50cyB8fCB7fTtcbiAgICAgIChCaXRHb0FQSSBhcyBhbnkpLl9jb25zdGFudHNFeHBpcmUgPSAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzRXhwaXJlIHx8IHt9O1xuICAgICAgKEJpdEdvQVBJIGFzIGFueSkuX2NvbnN0YW50c1snY3VzdG9tJ10gPSBjYWNoZWRDb25zdGFudHM7XG4gICAgICAoQml0R29BUEkgYXMgYW55KS5fY29uc3RhbnRzRXhwaXJlWydjdXN0b20nXSA9IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgc2NvcGUgPSBub2NrKCdodHRwczovL2FwcC5leGFtcGxlLmxvY2FsJylcbiAgICAgICAgLmdldCgnL2FwaS92MS9jbGllbnQvY29uc3RhbnRzJylcbiAgICAgICAgLnJlcGx5KDIwMCwgeyBjb25zdGFudHM6IHsgc2hvdWxkTm90QmVVc2VkOiB0cnVlIH0gfSk7XG5cbiAgICAgIGNvbnN0IGNvbnN0YW50cyA9IGF3YWl0IGJpdGdvLmZldGNoQ29uc3RhbnRzKCk7XG5cbiAgICAgIC8vIFNob3VsZCByZXR1cm4gdGhlIGNhY2hlZCBjb25zdGFudHNcbiAgICAgIGNvbnN0YW50cy5zaG91bGQuZGVlcEVxdWFsKGNhY2hlZENvbnN0YW50cyk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGF0IG5vIEhUVFAgcmVxdWVzdCB3YXMgbWFkZSAoc2luY2Ugbm8gZXhwaXJ5IG1lYW5zIGNhY2hlIGlzIGFsd2F5cyB2YWxpZClcbiAgICAgIHNjb3BlLmlzRG9uZSgpLnNob3VsZC5iZS5mYWxzZSgpO1xuXG4gICAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -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":""}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const crypto_1 = require("crypto");
8
+ const src_1 = require("../../src");
9
+ describe('encryption methods tests', () => {
10
+ describe('encrypt', () => {
11
+ it('encrypts the plaintext with the given password', () => {
12
+ const password = 'myPassword';
13
+ const plaintext = 'Hello, World!';
14
+ const ciphertext = (0, src_1.encrypt)(password, plaintext);
15
+ (0, assert_1.default)(ciphertext !== plaintext, 'ciphertext should not be equal to plaintext');
16
+ });
17
+ it('returns a different ciphertext for the same plaintext and password', () => {
18
+ const password = 'myPassword';
19
+ const plaintext = 'Hello, World!';
20
+ const ciphertext1 = (0, src_1.encrypt)(password, plaintext);
21
+ const ciphertext2 = (0, src_1.encrypt)(password, plaintext);
22
+ (0, assert_1.default)(ciphertext1 !== ciphertext2, 'ciphertexts should not be equal');
23
+ });
24
+ it('throws an error if the salt length is not 8 bytes', () => {
25
+ const password = 'myPassword';
26
+ const plaintext = 'Hello, World!';
27
+ const options = { salt: (0, crypto_1.randomBytes)(4) };
28
+ assert_1.default.throws(() => (0, src_1.encrypt)(password, plaintext, options), new Error(`salt must be 8 bytes`));
29
+ });
30
+ it('throws an error if the iv length is not 16 bytes', () => {
31
+ const password = 'myPassword';
32
+ const plaintext = 'Hello, World!';
33
+ const options = { iv: (0, crypto_1.randomBytes)(4) };
34
+ assert_1.default.throws(() => (0, src_1.encrypt)(password, plaintext, options), new Error(`iv must be 16 bytes`));
35
+ });
36
+ });
37
+ describe('decrypt', () => {
38
+ it('decrypts the ciphertext with the given password', () => {
39
+ const password = 'myPassword';
40
+ const plaintext = 'Hello, World!';
41
+ const ciphertext = (0, src_1.encrypt)(password, plaintext);
42
+ const decrypted = (0, src_1.decrypt)(password, ciphertext);
43
+ (0, assert_1.default)(decrypted === plaintext, 'decrypted should be equal to plaintext');
44
+ });
45
+ it('throws an error if the password is wrong', () => {
46
+ const password = 'myPassword';
47
+ const plaintext = 'Hello, World!';
48
+ const ciphertext = (0, src_1.encrypt)(password, plaintext);
49
+ const wrongPassword = 'wrongPassword';
50
+ assert_1.default.throws(() => (0, src_1.decrypt)(wrongPassword, ciphertext), 'sjcl exception: cc: invalid aes key');
51
+ });
52
+ it('decrypts the ciphertext with the given password and adata', () => {
53
+ const password = 'myPassword';
54
+ const plaintext = 'Hello, World!';
55
+ const adata = 'additional data';
56
+ const ciphertext = (0, src_1.encrypt)(password, plaintext, { adata });
57
+ const decrypted = (0, src_1.decrypt)(password, ciphertext);
58
+ (0, assert_1.default)(decrypted === plaintext, 'decrypted should be equal to plaintext');
59
+ });
60
+ });
61
+ });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFxQztBQUVyQyxtQ0FBNkM7QUFFN0MsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQ3hELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRWhELElBQUEsZ0JBQU0sRUFBQyxVQUFVLEtBQUssU0FBUyxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1lBQzVFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxXQUFXLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVqRCxJQUFBLGdCQUFNLEVBQUMsV0FBVyxLQUFLLFdBQVcsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFLEdBQUcsRUFBRTtZQUMzRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRXpDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQ2hHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRXZDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixFQUFFLENBQUMsaURBQWlELEVBQUUsR0FBRyxFQUFFO1lBQ3pELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUVoRCxJQUFBLGdCQUFNLEVBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtZQUNsRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7WUFDOUIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUEsYUFBTyxFQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNoRCxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUM7WUFFdEMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSxhQUFPLEVBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7UUFDakcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1lBQ25FLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUM7WUFDaEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBQSxhQUFPLEVBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBRWhELElBQUEsZ0JBQU0sRUFBQyxTQUFTLEtBQUssU0FBUyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0LCBlbmNyeXB0IH0gZnJvbSAnLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ2VuY3J5cHRpb24gbWV0aG9kcyB0ZXN0cycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2VuY3J5cHQnLCAoKSA9PiB7XG4gICAgaXQoJ2VuY3J5cHRzIHRoZSBwbGFpbnRleHQgd2l0aCB0aGUgZ2l2ZW4gcGFzc3dvcmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuXG4gICAgICBhc3NlcnQoY2lwaGVydGV4dCAhPT0gcGxhaW50ZXh0LCAnY2lwaGVydGV4dCBzaG91bGQgbm90IGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgYSBkaWZmZXJlbnQgY2lwaGVydGV4dCBmb3IgdGhlIHNhbWUgcGxhaW50ZXh0IGFuZCBwYXNzd29yZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gJ215UGFzc3dvcmQnO1xuICAgICAgY29uc3QgcGxhaW50ZXh0ID0gJ0hlbGxvLCBXb3JsZCEnO1xuICAgICAgY29uc3QgY2lwaGVydGV4dDEgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3QgY2lwaGVydGV4dDIgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuXG4gICAgICBhc3NlcnQoY2lwaGVydGV4dDEgIT09IGNpcGhlcnRleHQyLCAnY2lwaGVydGV4dHMgc2hvdWxkIG5vdCBiZSBlcXVhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBhbiBlcnJvciBpZiB0aGUgc2FsdCBsZW5ndGggaXMgbm90IDggYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IHNhbHQ6IHJhbmRvbUJ5dGVzKDQpIH07XG5cbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCBvcHRpb25zKSwgbmV3IEVycm9yKGBzYWx0IG11c3QgYmUgOCBieXRlc2ApKTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGl2IGxlbmd0aCBpcyBub3QgMTYgYnl0ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGl2OiByYW5kb21CeXRlcyg0KSB9O1xuXG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyksIG5ldyBFcnJvcihgaXYgbXVzdCBiZSAxNiBieXRlc2ApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlY3J5cHQnLCAoKSA9PiB7XG4gICAgaXQoJ2RlY3J5cHRzIHRoZSBjaXBoZXJ0ZXh0IHdpdGggdGhlIGdpdmVuIHBhc3N3b3JkJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSAnbXlQYXNzd29yZCc7XG4gICAgICBjb25zdCBwbGFpbnRleHQgPSAnSGVsbG8sIFdvcmxkISc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0KTtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuXG4gICAgICBhc3NlcnQoZGVjcnlwdGVkID09PSBwbGFpbnRleHQsICdkZWNyeXB0ZWQgc2hvdWxkIGJlIGVxdWFsIHRvIHBsYWludGV4dCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBhbiBlcnJvciBpZiB0aGUgcGFzc3dvcmQgaXMgd3JvbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBlbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQpO1xuICAgICAgY29uc3Qgd3JvbmdQYXNzd29yZCA9ICd3cm9uZ1Bhc3N3b3JkJztcblxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBkZWNyeXB0KHdyb25nUGFzc3dvcmQsIGNpcGhlcnRleHQpLCAnc2pjbCBleGNlcHRpb246IGNjOiBpbnZhbGlkIGFlcyBrZXknKTtcbiAgICB9KTtcblxuICAgIGl0KCdkZWNyeXB0cyB0aGUgY2lwaGVydGV4dCB3aXRoIHRoZSBnaXZlbiBwYXNzd29yZCBhbmQgYWRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9ICdteVBhc3N3b3JkJztcbiAgICAgIGNvbnN0IHBsYWludGV4dCA9ICdIZWxsbywgV29ybGQhJztcbiAgICAgIGNvbnN0IGFkYXRhID0gJ2FkZGl0aW9uYWwgZGF0YSc7XG4gICAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGFkYXRhIH0pO1xuICAgICAgY29uc3QgZGVjcnlwdGVkID0gZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG5cbiAgICAgIGFzc2VydChkZWNyeXB0ZWQgPT09IHBsYWludGV4dCwgJ2RlY3J5cHRlZCBzaG91bGQgYmUgZXF1YWwgdG8gcGxhaW50ZXh0Jyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const src_1 = require("../../src");
8
+ /**
9
+ * These tests are based on the Bluebird try.js tests:
10
+ * https://github.com/petkaantonov/bluebird/blob/master/test/mocha/try.js
11
+ *
12
+ * They have been adapted to TypeScript and modified to assert tryPromise
13
+ * perserves the same behavior as Bluebird.try.
14
+ */
15
+ const error = new Error();
16
+ const thrower = function () {
17
+ throw error;
18
+ };
19
+ describe('tryPromise', function () {
20
+ it('should reject when the function throws', function () {
21
+ let async = false;
22
+ const ret = (0, src_1.tryPromise)(thrower).then(() => assert_1.default.fail('Should not fulfill'), (e) => {
23
+ (0, assert_1.default)(async);
24
+ (0, assert_1.default)(e === error);
25
+ });
26
+ async = true;
27
+ return ret;
28
+ });
29
+ it('should reject when the function is not a function', function () {
30
+ let async = false;
31
+ const ret = (0, src_1.tryPromise)(null).then(() => assert_1.default.fail('Should not fulfill'), (e) => {
32
+ (0, assert_1.default)(async);
33
+ (0, assert_1.default)(e instanceof TypeError);
34
+ });
35
+ async = true;
36
+ return ret;
37
+ });
38
+ it('should unwrap returned promise', function () {
39
+ let resolve;
40
+ const promise = new Promise((r) => {
41
+ resolve = r;
42
+ });
43
+ const ret = (0, src_1.tryPromise)(() => {
44
+ return promise;
45
+ }).then((v) => {
46
+ assert_1.default.strictEqual(v, 3);
47
+ });
48
+ setTimeout(() => {
49
+ resolve(3);
50
+ }, 1);
51
+ return ret;
52
+ });
53
+ it('should unwrap returned thenable', function () {
54
+ return (0, src_1.tryPromise)(() => {
55
+ return {
56
+ then: function (f) {
57
+ f(3);
58
+ },
59
+ };
60
+ }).then((v) => {
61
+ assert_1.default.strictEqual(v, 3);
62
+ });
63
+ });
64
+ });
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQXVDO0FBRXZDOzs7Ozs7R0FNRztBQUVILE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDMUIsTUFBTSxPQUFPLEdBQUc7SUFDZCxNQUFNLEtBQUssQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGLFFBQVEsQ0FBQyxZQUFZLEVBQUU7SUFDckIsRUFBRSxDQUFDLHdDQUF3QyxFQUFFO1FBQzNDLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFBLGdCQUFVLEVBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUNsQyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUN2QyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2QsSUFBQSxnQkFBTSxFQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQ0YsQ0FBQztRQUNGLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDYixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1FBQ3RELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEdBQUcsR0FBRyxJQUFBLGdCQUFVLEVBQUMsSUFBVyxDQUFDLENBQUMsSUFBSSxDQUN0QyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUN2QyxDQUFDLENBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBQSxnQkFBTSxFQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2QsSUFBQSxnQkFBTSxFQUFDLENBQUMsWUFBWSxTQUFTLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQ0YsQ0FBQztRQUNGLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDYixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdDQUFnQyxFQUFFO1FBQ25DLElBQUksT0FBZ0MsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3hDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sR0FBRyxHQUFHLElBQUEsZ0JBQVUsRUFBQyxHQUFHLEVBQUU7WUFDMUIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDWixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsT0FBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRU4sT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtRQUNwQyxPQUFPLElBQUEsZ0JBQVUsRUFBQyxHQUFHLEVBQUU7WUFDckIsT0FBTztnQkFDTCxJQUFJLEVBQUUsVUFBVSxDQUEwQjtvQkFDeEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7YUFDaUIsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNaLGdCQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyB0cnlQcm9taXNlIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuLyoqXG4gKiBUaGVzZSB0ZXN0cyBhcmUgYmFzZWQgb24gdGhlIEJsdWViaXJkIHRyeS5qcyB0ZXN0czpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRrYWFudG9ub3YvYmx1ZWJpcmQvYmxvYi9tYXN0ZXIvdGVzdC9tb2NoYS90cnkuanNcbiAqXG4gKiBUaGV5IGhhdmUgYmVlbiBhZGFwdGVkIHRvIFR5cGVTY3JpcHQgYW5kIG1vZGlmaWVkIHRvIGFzc2VydCB0cnlQcm9taXNlXG4gKiBwZXJzZXJ2ZXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgQmx1ZWJpcmQudHJ5LlxuICovXG5cbmNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7XG5jb25zdCB0aHJvd2VyID0gZnVuY3Rpb24gKCk6IG5ldmVyIHtcbiAgdGhyb3cgZXJyb3I7XG59O1xuXG5kZXNjcmliZSgndHJ5UHJvbWlzZScsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiB0aGUgZnVuY3Rpb24gdGhyb3dzJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBhc3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHJldCA9IHRyeVByb21pc2UodGhyb3dlcikudGhlbihcbiAgICAgICgpID0+IGFzc2VydC5mYWlsKCdTaG91bGQgbm90IGZ1bGZpbGwnKSxcbiAgICAgIChlOiBFcnJvcikgPT4ge1xuICAgICAgICBhc3NlcnQoYXN5bmMpO1xuICAgICAgICBhc3NlcnQoZSA9PT0gZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gICAgYXN5bmMgPSB0cnVlO1xuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVqZWN0IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIG5vdCBhIGZ1bmN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGxldCBhc3luYyA9IGZhbHNlO1xuICAgIGNvbnN0IHJldCA9IHRyeVByb21pc2UobnVsbCBhcyBhbnkpLnRoZW4oXG4gICAgICAoKSA9PiBhc3NlcnQuZmFpbCgnU2hvdWxkIG5vdCBmdWxmaWxsJyksXG4gICAgICAoZTogRXJyb3IpID0+IHtcbiAgICAgICAgYXNzZXJ0KGFzeW5jKTtcbiAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gICAgYXN5bmMgPSB0cnVlO1xuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdW53cmFwIHJldHVybmVkIHByb21pc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHJlc29sdmU6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxudW1iZXI+KChyKSA9PiB7XG4gICAgICByZXNvbHZlID0gcjtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldCA9IHRyeVByb21pc2UoKCkgPT4ge1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfSkudGhlbigodikgPT4ge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHYsIDMpO1xuICAgIH0pO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZXNvbHZlISgzKTtcbiAgICB9LCAxKTtcblxuICAgIHJldHVybiByZXQ7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdW53cmFwIHJldHVybmVkIHRoZW5hYmxlJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0cnlQcm9taXNlKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRoZW46IGZ1bmN0aW9uIChmOiAodmFsdWU6IG51bWJlcikgPT4gdm9pZCkge1xuICAgICAgICAgIGYoMyk7XG4gICAgICAgIH0sXG4gICAgICB9IGFzIFByb21pc2U8bnVtYmVyPjtcbiAgICB9KS50aGVuKCh2KSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwodiwgMyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export declare function getFixtures(): {
2
+ [txId: string]: string;
3
+ };
4
+ //# sourceMappingURL=accelerate-tx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accelerate-tx.d.ts","sourceRoot":"","sources":["../../../../../test/unit/v1/fixtures/accelerate-tx.ts"],"names":[],"mappings":"AAeA,wBAAgB,WAAW,IAAI;IAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAQxD"}