@rosen-bridge/abstract-extractor 2.1.0 → 2.1.2-82c56984
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/dist/ergo/{AbstractErgoExtractor.d.ts → abstractErgoExtractor.d.ts} +3 -3
- package/dist/ergo/abstractErgoExtractor.d.ts.map +1 -0
- package/dist/ergo/{AbstractErgoExtractor.js → abstractErgoExtractor.js} +3 -3
- package/dist/ergo/{AbstractErgoExtractorAction.d.ts → abstractErgoExtractorAction.d.ts} +6 -4
- package/dist/ergo/abstractErgoExtractorAction.d.ts.map +1 -0
- package/dist/ergo/abstractErgoExtractorAction.js +219 -0
- package/dist/ergo/{AbstractErgoExtractorEntity.d.ts → abstractErgoExtractorEntity.d.ts} +1 -1
- package/dist/ergo/{AbstractErgoExtractorEntity.d.ts.map → abstractErgoExtractorEntity.d.ts.map} +1 -1
- package/dist/ergo/{AbstractErgoExtractorEntity.js → abstractErgoExtractorEntity.js} +1 -1
- package/dist/ergo/index.d.ts +6 -6
- package/dist/ergo/index.js +7 -7
- package/dist/ergo/initializable/{AbstractInitializable.d.ts → abstractInitializable.d.ts} +4 -4
- package/dist/ergo/initializable/{AbstractInitializable.d.ts.map → abstractInitializable.d.ts.map} +1 -1
- package/dist/ergo/initializable/abstractInitializable.js +162 -0
- package/dist/ergo/initializable/{AbstractInitializableAction.d.ts → abstractInitializableAction.d.ts} +4 -4
- package/dist/ergo/initializable/abstractInitializableAction.d.ts.map +1 -0
- package/dist/ergo/initializable/{AbstractInitializableAction.js → abstractInitializableAction.js} +2 -2
- package/dist/ergo/initializable/index.d.ts +2 -2
- package/dist/ergo/initializable/index.js +3 -3
- package/dist/{lib/ergo/network/AbstractNetwork.d.ts → ergo/network/abstractNetwork.d.ts} +1 -1
- package/dist/ergo/network/{AbstractNetwork.d.ts.map → abstractNetwork.d.ts.map} +1 -1
- package/dist/ergo/network/{AbstractNetwork.js → abstractNetwork.js} +1 -1
- package/dist/{lib/ergo/network/ExplorerNetwork.d.ts → ergo/network/explorerNetwork.d.ts} +2 -2
- package/dist/ergo/network/explorerNetwork.d.ts.map +1 -0
- package/dist/ergo/network/{ExplorerNetwork.js → explorerNetwork.js} +3 -3
- package/dist/ergo/network/{NodeNetwork.d.ts → nodeNetwork.d.ts} +2 -2
- package/dist/ergo/network/nodeNetwork.d.ts.map +1 -0
- package/dist/ergo/network/nodeNetwork.js +131 -0
- package/dist/ergo/utils.d.ts.map +1 -1
- package/dist/ergo/utils.js +1 -1
- package/package.json +24 -16
- package/.eslintignore +0 -1
- package/dist/ergo/AbstractErgoExtractor.d.ts.map +0 -1
- package/dist/ergo/AbstractErgoExtractorAction.d.ts.map +0 -1
- package/dist/ergo/AbstractErgoExtractorAction.js +0 -222
- package/dist/ergo/initializable/AbstractInitializable.js +0 -163
- package/dist/ergo/initializable/AbstractInitializableAction.d.ts.map +0 -1
- package/dist/ergo/network/AbstractNetwork.d.ts +0 -26
- package/dist/ergo/network/ExplorerNetwork.d.ts +0 -74
- package/dist/ergo/network/ExplorerNetwork.d.ts.map +0 -1
- package/dist/ergo/network/NodeNetwork.d.ts.map +0 -1
- package/dist/ergo/network/NodeNetwork.js +0 -131
- package/dist/lib/abstractExtractor.d.ts +0 -25
- package/dist/lib/abstractExtractor.d.ts.map +0 -1
- package/dist/lib/abstractExtractor.js +0 -3
- package/dist/lib/constants.d.ts +0 -4
- package/dist/lib/constants.d.ts.map +0 -1
- package/dist/lib/constants.js +0 -4
- package/dist/lib/ergo/AbstractErgoExtractor.d.ts +0 -80
- package/dist/lib/ergo/AbstractErgoExtractor.d.ts.map +0 -1
- package/dist/lib/ergo/AbstractErgoExtractor.js +0 -142
- package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts +0 -92
- package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts.map +0 -1
- package/dist/lib/ergo/AbstractErgoExtractorAction.js +0 -222
- package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts +0 -11
- package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts.map +0 -1
- package/dist/lib/ergo/AbstractErgoExtractorEntity.js +0 -57
- package/dist/lib/ergo/index.d.ts +0 -10
- package/dist/lib/ergo/index.d.ts.map +0 -1
- package/dist/lib/ergo/index.js +0 -10
- package/dist/lib/ergo/initializable/AbstractInitializable.d.ts +0 -48
- package/dist/lib/ergo/initializable/AbstractInitializable.d.ts.map +0 -1
- package/dist/lib/ergo/initializable/AbstractInitializable.js +0 -163
- package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts +0 -14
- package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts.map +0 -1
- package/dist/lib/ergo/initializable/AbstractInitializableAction.js +0 -16
- package/dist/lib/ergo/initializable/index.d.ts +0 -3
- package/dist/lib/ergo/initializable/index.d.ts.map +0 -1
- package/dist/lib/ergo/initializable/index.js +0 -3
- package/dist/lib/ergo/interfaces.d.ts +0 -47
- package/dist/lib/ergo/interfaces.d.ts.map +0 -1
- package/dist/lib/ergo/interfaces.js +0 -8
- package/dist/lib/ergo/network/AbstractNetwork.d.ts.map +0 -1
- package/dist/lib/ergo/network/AbstractNetwork.js +0 -3
- package/dist/lib/ergo/network/ExplorerNetwork.d.ts.map +0 -1
- package/dist/lib/ergo/network/ExplorerNetwork.js +0 -185
- package/dist/lib/ergo/network/NodeNetwork.d.ts +0 -60
- package/dist/lib/ergo/network/NodeNetwork.d.ts.map +0 -1
- package/dist/lib/ergo/network/NodeNetwork.js +0 -131
- package/dist/lib/ergo/utils.d.ts +0 -8
- package/dist/lib/ergo/utils.d.ts.map +0 -1
- package/dist/lib/ergo/utils.js +0 -16
- package/dist/lib/index.d.ts +0 -4
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/index.js +0 -4
- package/dist/tests/AbstractErgoExtractor.mock.d.ts +0 -11
- package/dist/tests/AbstractErgoExtractor.mock.d.ts.map +0 -1
- package/dist/tests/AbstractErgoExtractor.mock.js +0 -11
- package/dist/tests/AbstractErgoExtractor.spec.d.ts +0 -2
- package/dist/tests/AbstractErgoExtractor.spec.d.ts.map +0 -1
- package/dist/tests/AbstractErgoExtractor.spec.js +0 -240
- package/dist/tests/AbstractErgoExtractorAction.mock.d.ts +0 -15
- package/dist/tests/AbstractErgoExtractorAction.mock.d.ts.map +0 -1
- package/dist/tests/AbstractErgoExtractorAction.mock.js +0 -27
- package/dist/tests/AbstractErgoExtractorAction.spec.d.ts +0 -2
- package/dist/tests/AbstractErgoExtractorAction.spec.d.ts.map +0 -1
- package/dist/tests/AbstractErgoExtractorAction.spec.js +0 -221
- package/dist/tests/initializable/AbstractInitializable.mock.d.ts +0 -61
- package/dist/tests/initializable/AbstractInitializable.mock.d.ts.map +0 -1
- package/dist/tests/initializable/AbstractInitializable.mock.js +0 -18
- package/dist/tests/initializable/AbstractInitializable.spec.d.ts +0 -2
- package/dist/tests/initializable/AbstractInitializable.spec.d.ts.map +0 -1
- package/dist/tests/initializable/AbstractInitializable.spec.js +0 -299
- package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts +0 -15
- package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts.map +0 -1
- package/dist/tests/initializable/AbstractInitializableAction.mock.js +0 -27
- package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts +0 -2
- package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts.map +0 -1
- package/dist/tests/initializable/AbstractInitializableAction.spec.js +0 -54
- package/dist/tests/initializable/testData.d.ts +0 -94
- package/dist/tests/initializable/testData.d.ts.map +0 -1
- package/dist/tests/initializable/testData.js +0 -235
- package/dist/tests/network/ExplorerNetwork.spec.d.ts +0 -2
- package/dist/tests/network/ExplorerNetwork.spec.d.ts.map +0 -1
- package/dist/tests/network/ExplorerNetwork.spec.js +0 -61
- package/dist/tests/network/NodeNetwork.spec.d.ts +0 -2
- package/dist/tests/network/NodeNetwork.spec.d.ts.map +0 -1
- package/dist/tests/network/NodeNetwork.spec.js +0 -48
- package/dist/tests/network/testData.d.ts +0 -752
- package/dist/tests/network/testData.d.ts.map +0 -1
- package/dist/tests/network/testData.js +0 -1401
- package/dist/tests/testData.d.ts +0 -32
- package/dist/tests/testData.d.ts.map +0 -1
- package/dist/tests/testData.js +0 -121
- package/dist/tests/testUtils.d.ts +0 -9
- package/dist/tests/testUtils.d.ts.map +0 -1
- package/dist/tests/testUtils.js +0 -31
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/vitest.config.d.ts +0 -3
- package/dist/vitest.config.d.ts.map +0 -1
- package/dist/vitest.config.js +0 -18
- package/lib/abstractExtractor.ts +0 -31
- package/lib/constants.ts +0 -3
- package/lib/ergo/AbstractErgoExtractor.ts +0 -227
- package/lib/ergo/AbstractErgoExtractorAction.ts +0 -319
- package/lib/ergo/AbstractErgoExtractorEntity.ts +0 -32
- package/lib/ergo/index.ts +0 -9
- package/lib/ergo/initializable/AbstractInitializable.ts +0 -228
- package/lib/ergo/initializable/AbstractInitializableAction.ts +0 -33
- package/lib/ergo/initializable/index.ts +0 -2
- package/lib/ergo/interfaces.ts +0 -51
- package/lib/ergo/network/AbstractNetwork.ts +0 -29
- package/lib/ergo/network/ExplorerNetwork.ts +0 -237
- package/lib/ergo/network/NodeNetwork.ts +0 -169
- package/lib/ergo/utils.ts +0 -15
- package/lib/index.ts +0 -3
- package/tests/AbstractErgoExtractor.mock.ts +0 -33
- package/tests/AbstractErgoExtractor.spec.ts +0 -284
- package/tests/AbstractErgoExtractorAction.mock.ts +0 -45
- package/tests/AbstractErgoExtractorAction.spec.ts +0 -268
- package/tests/initializable/AbstractInitializable.mock.ts +0 -44
- package/tests/initializable/AbstractInitializable.spec.ts +0 -386
- package/tests/initializable/AbstractInitializableAction.mock.ts +0 -45
- package/tests/initializable/AbstractInitializableAction.spec.ts +0 -64
- package/tests/initializable/testData.ts +0 -283
- package/tests/network/ExplorerNetwork.spec.ts +0 -73
- package/tests/network/NodeNetwork.spec.ts +0 -56
- package/tests/network/testData.ts +0 -1708
- package/tests/testData.ts +0 -140
- package/tests/testUtils.ts +0 -22
- package/tsconfig.build.json +0 -9
- package/tsconfig.build.tsbuildinfo +0 -1
- package/tsconfig.json +0 -9
- package/vitest.config.ts +0 -18
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractErgoExtractor.spec.d.ts","sourceRoot":"","sources":["../../tests/AbstractErgoExtractor.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import { CallbackType, } from '../lib';
|
|
2
|
-
import { block, extractedData, tx } from './testData';
|
|
3
|
-
import { MockedErgoExtractor } from './AbstractErgoExtractor.mock';
|
|
4
|
-
describe('AbstractErgoExtractor', () => {
|
|
5
|
-
describe('processTransactions', () => {
|
|
6
|
-
/**
|
|
7
|
-
* @target processTransactions should initialize extractor with specified id and insert status into db
|
|
8
|
-
* @dependencies
|
|
9
|
-
* @scenario
|
|
10
|
-
* - mock extractor
|
|
11
|
-
* - mock `hasData` to return true for one box
|
|
12
|
-
* - spy `extractBoxData` and `storeBoxes`
|
|
13
|
-
* - run test (call `processTransactions`)
|
|
14
|
-
* @expected
|
|
15
|
-
* - to call `extractBoxData` for the specific box and all input extensions
|
|
16
|
-
* - to insert the extracted box to database
|
|
17
|
-
* - to return true when total procedure is successful
|
|
18
|
-
* - to trigger `INSERT` callbacks with correct data
|
|
19
|
-
*/
|
|
20
|
-
it('should process boxes with data and insert data into database', async () => {
|
|
21
|
-
const extractor = new MockedErgoExtractor();
|
|
22
|
-
const triggerCallbacks = vitest.fn();
|
|
23
|
-
extractor['triggerCallbacks'] = triggerCallbacks;
|
|
24
|
-
extractor.hasData = (box) => {
|
|
25
|
-
if (box.boxId == tx.outputs[0].boxId)
|
|
26
|
-
return true;
|
|
27
|
-
return false;
|
|
28
|
-
};
|
|
29
|
-
const extractSpy = vitest.fn().mockReturnValue(extractedData);
|
|
30
|
-
extractor.extractBoxData = extractSpy;
|
|
31
|
-
const storeSpy = vitest.fn().mockResolvedValue(true);
|
|
32
|
-
const spendSpy = vitest.fn().mockResolvedValue([]);
|
|
33
|
-
extractor['actions'] = {
|
|
34
|
-
storeBoxes: storeSpy,
|
|
35
|
-
spendBoxes: spendSpy,
|
|
36
|
-
};
|
|
37
|
-
const result = await extractor.processTransactions([tx], block);
|
|
38
|
-
expect(extractSpy).toBeCalledTimes(1);
|
|
39
|
-
expect(extractSpy).toBeCalledWith(tx.outputs[0], [tx.inputs[0].extension, {}], {});
|
|
40
|
-
expect(storeSpy).toBeCalledWith([extractedData], block, 'Test');
|
|
41
|
-
expect(result).toEqual(true);
|
|
42
|
-
expect(triggerCallbacks).toBeCalledWith(CallbackType.Insert, [
|
|
43
|
-
extractedData,
|
|
44
|
-
]);
|
|
45
|
-
});
|
|
46
|
-
/**
|
|
47
|
-
* @target processTransactions should extract spending information of all input boxes
|
|
48
|
-
* @dependencies
|
|
49
|
-
* @scenario
|
|
50
|
-
* - mock extractor (hasData returns false as default)
|
|
51
|
-
* - spy `extractBoxData`, `storeBoxes` and `spendBoxes`
|
|
52
|
-
* - run test (call `processTransactions`)
|
|
53
|
-
* @expected
|
|
54
|
-
* - not to call `extractBoxData` and `storeBoxes` when there is not any box with data
|
|
55
|
-
* - to extractor spend info of input boxes and call `spendBoxes`
|
|
56
|
-
* - to return true when total procedure is successful
|
|
57
|
-
* - to trigger `SPEND` callbacks with correct data
|
|
58
|
-
*/
|
|
59
|
-
it('should extract spending information of all input boxes', async () => {
|
|
60
|
-
const extractor = new MockedErgoExtractor();
|
|
61
|
-
const triggerCallbacks = vitest.fn();
|
|
62
|
-
extractor['triggerCallbacks'] = triggerCallbacks;
|
|
63
|
-
const extractSpy = vitest.fn();
|
|
64
|
-
extractor.extractBoxData = extractSpy;
|
|
65
|
-
const storeSpy = vitest.fn().mockResolvedValue(true);
|
|
66
|
-
const spendSpy = vitest
|
|
67
|
-
.fn()
|
|
68
|
-
.mockResolvedValue([
|
|
69
|
-
{ boxId: tx.inputs[0].boxId },
|
|
70
|
-
{ boxId: tx.inputs[1].boxId },
|
|
71
|
-
]);
|
|
72
|
-
extractor['actions'] = {
|
|
73
|
-
storeBoxes: storeSpy,
|
|
74
|
-
spendBoxes: spendSpy,
|
|
75
|
-
};
|
|
76
|
-
const result = await extractor.processTransactions([tx], block);
|
|
77
|
-
expect(extractSpy).not.toBeCalled();
|
|
78
|
-
expect(storeSpy).not.toBeCalled();
|
|
79
|
-
expect(spendSpy).toBeCalledWith([
|
|
80
|
-
{ boxId: tx.inputs[0].boxId, txId: tx.id, index: 1 },
|
|
81
|
-
{ boxId: tx.inputs[1].boxId, txId: tx.id, index: 2 },
|
|
82
|
-
], block, 'Test');
|
|
83
|
-
expect(result).toEqual(true);
|
|
84
|
-
expect(triggerCallbacks).toBeCalledWith(CallbackType.Spend, [
|
|
85
|
-
{ boxId: tx.inputs[0].boxId },
|
|
86
|
-
{ boxId: tx.inputs[1].boxId },
|
|
87
|
-
]);
|
|
88
|
-
});
|
|
89
|
-
/**
|
|
90
|
-
* @target processTransactions should return false if data insertion fails
|
|
91
|
-
* @dependencies
|
|
92
|
-
* @scenario
|
|
93
|
-
* - mock extractor
|
|
94
|
-
* - mock `hasData` to return true for one box
|
|
95
|
-
* - spy `extractBoxData` and `storeBoxes`
|
|
96
|
-
* - run test (call `processTransactions`)
|
|
97
|
-
* @expected
|
|
98
|
-
* - to return false when `insertBoxes` returns false
|
|
99
|
-
* - not to call `spendBoxes` if data insertion fails
|
|
100
|
-
*/
|
|
101
|
-
it('should return false if data insertion fails', async () => {
|
|
102
|
-
const extractor = new MockedErgoExtractor();
|
|
103
|
-
extractor.hasData = (box) => {
|
|
104
|
-
if (box.boxId == tx.outputs[0].boxId)
|
|
105
|
-
return true;
|
|
106
|
-
return false;
|
|
107
|
-
};
|
|
108
|
-
const extractSpy = vitest.fn().mockReturnValue(extractedData);
|
|
109
|
-
extractor.extractBoxData = extractSpy;
|
|
110
|
-
const storeSpy = vitest.fn().mockResolvedValue(false);
|
|
111
|
-
const spendSpy = vitest.fn();
|
|
112
|
-
extractor['actions'] = {
|
|
113
|
-
storeBoxes: storeSpy,
|
|
114
|
-
spendBoxes: spendSpy,
|
|
115
|
-
};
|
|
116
|
-
const result = await extractor.processTransactions([tx], block);
|
|
117
|
-
expect(result).toEqual(false);
|
|
118
|
-
expect(spendSpy).not.toBeCalled();
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
describe('forkBlock', () => {
|
|
122
|
-
/**
|
|
123
|
-
* @target forkBlock should remove all data extracted from the specified block
|
|
124
|
-
* @dependencies
|
|
125
|
-
* @scenario
|
|
126
|
-
* - mock extractor
|
|
127
|
-
* - spy `deleteBlockBoxes`
|
|
128
|
-
* - run test (call `forkBlock`)
|
|
129
|
-
* @expected
|
|
130
|
-
* - to call `deleteBlockBoxes` for the specific box
|
|
131
|
-
* - to trigger `DELETE` callbacks for the deleted box
|
|
132
|
-
* - to trigger `UPDATE` callbacks for the spent box
|
|
133
|
-
*/
|
|
134
|
-
it('should remove all data extracted from the specified block', async () => {
|
|
135
|
-
const extractor = new MockedErgoExtractor();
|
|
136
|
-
const removeSpy = vitest.fn().mockResolvedValue({
|
|
137
|
-
deletedData: [{ boxId: 'box1' }],
|
|
138
|
-
updatedData: [{ boxId: 'box2' }],
|
|
139
|
-
});
|
|
140
|
-
extractor['actions'] = {
|
|
141
|
-
deleteBlockBoxes: removeSpy,
|
|
142
|
-
};
|
|
143
|
-
const triggerCallbackSpy = vitest.fn().mockClear();
|
|
144
|
-
extractor['triggerCallbacks'] = triggerCallbackSpy;
|
|
145
|
-
await extractor.forkBlock(block.hash);
|
|
146
|
-
expect(removeSpy).toBeCalledWith(block.hash, 'Test');
|
|
147
|
-
expect(triggerCallbackSpy).toBeCalledWith(CallbackType.Delete, [
|
|
148
|
-
{ boxId: 'box1' },
|
|
149
|
-
]);
|
|
150
|
-
expect(triggerCallbackSpy).toBeCalledWith(CallbackType.Update, [
|
|
151
|
-
{ boxId: 'box2' },
|
|
152
|
-
]);
|
|
153
|
-
});
|
|
154
|
-
});
|
|
155
|
-
describe('hook', () => {
|
|
156
|
-
/**
|
|
157
|
-
* @target hook should hook a new callback on insert with the new id
|
|
158
|
-
* @dependencies
|
|
159
|
-
* @scenario
|
|
160
|
-
* - mock extractor
|
|
161
|
-
* - mock a callback for insert
|
|
162
|
-
* - run test (call `hook`)
|
|
163
|
-
* @expected
|
|
164
|
-
* - hook the callback with the specified id
|
|
165
|
-
* - return true
|
|
166
|
-
*/
|
|
167
|
-
it('should hook a new callback on insert with the new id', async () => {
|
|
168
|
-
const extractor = new MockedErgoExtractor();
|
|
169
|
-
const insertCallback = vitest.fn();
|
|
170
|
-
const id = await extractor.hook(CallbackType.Insert, insertCallback);
|
|
171
|
-
expect(extractor['callbacks'][CallbackType.Insert]).toEqual(new Map().set(id, insertCallback));
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
describe('unhook', () => {
|
|
175
|
-
/**
|
|
176
|
-
* @target unhook should unhook the callback on insert with the specified id
|
|
177
|
-
* @dependencies
|
|
178
|
-
* @scenario
|
|
179
|
-
* - mock extractor
|
|
180
|
-
* - mock a callback for insert
|
|
181
|
-
* - hook the callback
|
|
182
|
-
* - run test (call `unhook`)
|
|
183
|
-
* @expected
|
|
184
|
-
* - unhook the callback with the specified id
|
|
185
|
-
* - return true
|
|
186
|
-
*/
|
|
187
|
-
it('should unhook the callback on insert with the specified id', async () => {
|
|
188
|
-
const extractor = new MockedErgoExtractor();
|
|
189
|
-
const insertCallback = vitest.fn();
|
|
190
|
-
const id = await extractor.hook(CallbackType.Insert, insertCallback);
|
|
191
|
-
const result = await extractor.unhook(CallbackType.Insert, id);
|
|
192
|
-
expect(result).toBeTruthy();
|
|
193
|
-
expect(extractor['callbacks'][CallbackType.Insert].get(id)).toEqual(undefined);
|
|
194
|
-
});
|
|
195
|
-
/**
|
|
196
|
-
* @target unhook should not unhook callbacks with the same id on other types
|
|
197
|
-
* @dependencies
|
|
198
|
-
* @scenario
|
|
199
|
-
* - mock extractor
|
|
200
|
-
* - mock two callbacks for insert
|
|
201
|
-
* - hook the first callback
|
|
202
|
-
* - run test (call `unhook` with the same id for second callback)
|
|
203
|
-
* @expected
|
|
204
|
-
* - not to change hooked callbacks when the callback with the id
|
|
205
|
-
* doesn't exists on the specified type
|
|
206
|
-
* - return false
|
|
207
|
-
*/
|
|
208
|
-
it('should not unhook callbacks with the same id on other types', async () => {
|
|
209
|
-
const extractor = new MockedErgoExtractor();
|
|
210
|
-
const insertCallback = vitest.fn();
|
|
211
|
-
const id = await extractor.hook(CallbackType.Insert, insertCallback);
|
|
212
|
-
const result = await extractor.unhook(CallbackType.Update, id);
|
|
213
|
-
expect(result).toBeFalsy();
|
|
214
|
-
expect(extractor['callbacks'][CallbackType.Insert].get(id)).toEqual(insertCallback);
|
|
215
|
-
expect(extractor['callbacks'][CallbackType.Update].get(id)).toEqual(undefined);
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
describe('triggerCallbacks', () => {
|
|
219
|
-
/**
|
|
220
|
-
* @target triggerCallbacks should trigger all callbacks hooked on a type
|
|
221
|
-
* @dependencies
|
|
222
|
-
* @scenario
|
|
223
|
-
* - mock extractor
|
|
224
|
-
* - mock a callback for insert
|
|
225
|
-
* - hook the callback
|
|
226
|
-
* - run test (call `triggerCallbacks` for insert type)
|
|
227
|
-
* @expected
|
|
228
|
-
* - trigger all callbacks with the specified id
|
|
229
|
-
*/
|
|
230
|
-
it('should trigger all callbacks hooked on a type', async () => {
|
|
231
|
-
const extractor = new MockedErgoExtractor();
|
|
232
|
-
const insertCallback = vitest.fn();
|
|
233
|
-
await extractor.hook(CallbackType.Insert, insertCallback);
|
|
234
|
-
const insertedData = [{ boxId: 'boxId', serialized: 'serialized' }];
|
|
235
|
-
await extractor['triggerCallbacks'](CallbackType.Insert, insertedData);
|
|
236
|
-
expect(insertCallback).toBeCalledWith(insertedData);
|
|
237
|
-
});
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RFcmdvRXh0cmFjdG9yLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0cy9BYnN0cmFjdEVyZ29FeHRyYWN0b3Iuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBR0wsWUFBWSxHQUViLE1BQU0sUUFBUSxDQUFDO0FBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUVuRSxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO0lBQ3JDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7UUFDbkM7Ozs7Ozs7Ozs7Ozs7V0FhRztRQUNILEVBQUUsQ0FBQyw4REFBOEQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM1RSxNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsZ0JBQWdCLENBQUM7WUFDakQsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQThCLEVBQUUsRUFBRTtnQkFDckQsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbEQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlELFNBQVMsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHO2dCQUNyQixVQUFVLEVBQUUsUUFBUTtnQkFDcEIsVUFBVSxFQUFFLFFBQVE7YUFJckIsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFaEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsY0FBYyxDQUMvQixFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUNiLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQzVCLEVBQUUsQ0FDSCxDQUFDO1lBQ0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO2dCQUMzRCxhQUFhO2FBQ2QsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSDs7Ozs7Ozs7Ozs7O1dBWUc7UUFDSCxFQUFFLENBQUMsd0RBQXdELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLGdCQUFnQixDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMvQixTQUFTLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQztZQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckQsTUFBTSxRQUFRLEdBQUcsTUFBTTtpQkFDcEIsRUFBRSxFQUFFO2lCQUNKLGlCQUFpQixDQUFDO2dCQUNqQixFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDN0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7YUFDOUIsQ0FBQyxDQUFDO1lBQ0wsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHO2dCQUNyQixVQUFVLEVBQUUsUUFBUTtnQkFDcEIsVUFBVSxFQUFFLFFBQVE7YUFJckIsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFaEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxjQUFjLENBQzdCO2dCQUNFLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQ3BELEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7YUFDckQsRUFDRCxLQUFLLEVBQ0wsTUFBTSxDQUNQLENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO2dCQUMxRCxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDN0IsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7YUFDOUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSDs7Ozs7Ozs7Ozs7V0FXRztRQUNILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDNUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQThCLEVBQUUsRUFBRTtnQkFDckQsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDbEQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlELFNBQVMsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0IsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHO2dCQUNyQixVQUFVLEVBQUUsUUFBUTtnQkFDcEIsVUFBVSxFQUFFLFFBQVE7YUFJckIsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFaEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtRQUN6Qjs7Ozs7Ozs7Ozs7V0FXRztRQUNILEVBQUUsQ0FBQywyREFBMkQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN6RSxNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDNUMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO2dCQUM5QyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDaEMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7YUFDakMsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHO2dCQUNyQixnQkFBZ0IsRUFBRSxTQUFTO2FBSTVCLENBQUM7WUFDRixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztZQUNuRCxNQUFNLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtnQkFDN0QsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO2FBQ2xCLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFO2dCQUM3RCxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7YUFDbEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO1FBQ3BCOzs7Ozs7Ozs7O1dBVUc7UUFDSCxFQUFFLENBQUMsc0RBQXNELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDcEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNyRSxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDekQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUNsQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3RCOzs7Ozs7Ozs7OztXQVdHO1FBQ0gsRUFBRSxDQUFDLDREQUE0RCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzFFLE1BQU0sU0FBUyxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUM1QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkMsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDckUsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FDakUsU0FBUyxDQUNWLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVIOzs7Ozs7Ozs7Ozs7V0FZRztRQUNILEVBQUUsQ0FBQyw2REFBNkQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUMzRSxNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDNUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2pFLGNBQWMsQ0FDZixDQUFDO1lBQ0YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUNqRSxTQUFTLENBQ1YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ2hDOzs7Ozs7Ozs7O1dBVUc7UUFDSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDN0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztZQUMxRCxNQUFNLFlBQVksR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNwRSxNQUFNLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDdkUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWMSB9IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tZXhwbG9yZXInO1xuaW1wb3J0IHsgT3V0cHV0Qm94IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdEJveERhdGEsXG4gIEFic3RyYWN0RXJnb0V4dHJhY3RvckFjdGlvbixcbiAgQ2FsbGJhY2tUeXBlLFxuICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHksXG59IGZyb20gJy4uL2xpYic7XG5pbXBvcnQgeyBibG9jaywgZXh0cmFjdGVkRGF0YSwgdHggfSBmcm9tICcuL3Rlc3REYXRhJztcbmltcG9ydCB7IE1vY2tlZEVyZ29FeHRyYWN0b3IgfSBmcm9tICcuL0Fic3RyYWN0RXJnb0V4dHJhY3Rvci5tb2NrJztcblxuZGVzY3JpYmUoJ0Fic3RyYWN0RXJnb0V4dHJhY3RvcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ3Byb2Nlc3NUcmFuc2FjdGlvbnMnLCAoKSA9PiB7XG4gICAgLyoqXG4gICAgICogQHRhcmdldCBwcm9jZXNzVHJhbnNhY3Rpb25zIHNob3VsZCBpbml0aWFsaXplIGV4dHJhY3RvciB3aXRoIHNwZWNpZmllZCBpZCBhbmQgaW5zZXJ0IHN0YXR1cyBpbnRvIGRiXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYGhhc0RhdGFgIHRvIHJldHVybiB0cnVlIGZvciBvbmUgYm94XG4gICAgICogLSBzcHkgYGV4dHJhY3RCb3hEYXRhYCBhbmQgYHN0b3JlQm94ZXNgXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgcHJvY2Vzc1RyYW5zYWN0aW9uc2ApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byBjYWxsIGBleHRyYWN0Qm94RGF0YWAgZm9yIHRoZSBzcGVjaWZpYyBib3ggYW5kIGFsbCBpbnB1dCBleHRlbnNpb25zXG4gICAgICogLSB0byBpbnNlcnQgdGhlIGV4dHJhY3RlZCBib3ggdG8gZGF0YWJhc2VcbiAgICAgKiAtIHRvIHJldHVybiB0cnVlIHdoZW4gdG90YWwgcHJvY2VkdXJlIGlzIHN1Y2Nlc3NmdWxcbiAgICAgKiAtIHRvIHRyaWdnZXIgYElOU0VSVGAgY2FsbGJhY2tzIHdpdGggY29ycmVjdCBkYXRhXG4gICAgICovXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIGJveGVzIHdpdGggZGF0YSBhbmQgaW5zZXJ0IGRhdGEgaW50byBkYXRhYmFzZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRFcmdvRXh0cmFjdG9yKCk7XG4gICAgICBjb25zdCB0cmlnZ2VyQ2FsbGJhY2tzID0gdml0ZXN0LmZuKCk7XG4gICAgICBleHRyYWN0b3JbJ3RyaWdnZXJDYWxsYmFja3MnXSA9IHRyaWdnZXJDYWxsYmFja3M7XG4gICAgICBleHRyYWN0b3IuaGFzRGF0YSA9IChib3g6IFYxLk91dHB1dEluZm8gfCBPdXRwdXRCb3gpID0+IHtcbiAgICAgICAgaWYgKGJveC5ib3hJZCA9PSB0eC5vdXRwdXRzWzBdLmJveElkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGV4dHJhY3RTcHkgPSB2aXRlc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoZXh0cmFjdGVkRGF0YSk7XG4gICAgICBleHRyYWN0b3IuZXh0cmFjdEJveERhdGEgPSBleHRyYWN0U3B5O1xuICAgICAgY29uc3Qgc3RvcmVTcHkgPSB2aXRlc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh0cnVlKTtcbiAgICAgIGNvbnN0IHNwZW5kU3B5ID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pO1xuICAgICAgZXh0cmFjdG9yWydhY3Rpb25zJ10gPSB7XG4gICAgICAgIHN0b3JlQm94ZXM6IHN0b3JlU3B5LFxuICAgICAgICBzcGVuZEJveGVzOiBzcGVuZFNweSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBBYnN0cmFjdEVyZ29FeHRyYWN0b3JBY3Rpb248XG4gICAgICAgIEFic3RyYWN0Qm94RGF0YSxcbiAgICAgICAgQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5XG4gICAgICA+O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXh0cmFjdG9yLnByb2Nlc3NUcmFuc2FjdGlvbnMoW3R4XSwgYmxvY2spO1xuXG4gICAgICBleHBlY3QoZXh0cmFjdFNweSkudG9CZUNhbGxlZFRpbWVzKDEpO1xuICAgICAgZXhwZWN0KGV4dHJhY3RTcHkpLnRvQmVDYWxsZWRXaXRoKFxuICAgICAgICB0eC5vdXRwdXRzWzBdLFxuICAgICAgICBbdHguaW5wdXRzWzBdLmV4dGVuc2lvbiwge31dLFxuICAgICAgICB7fSxcbiAgICAgICk7XG4gICAgICBleHBlY3Qoc3RvcmVTcHkpLnRvQmVDYWxsZWRXaXRoKFtleHRyYWN0ZWREYXRhXSwgYmxvY2ssICdUZXN0Jyk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHRydWUpO1xuICAgICAgZXhwZWN0KHRyaWdnZXJDYWxsYmFja3MpLnRvQmVDYWxsZWRXaXRoKENhbGxiYWNrVHlwZS5JbnNlcnQsIFtcbiAgICAgICAgZXh0cmFjdGVkRGF0YSxcbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHRhcmdldCBwcm9jZXNzVHJhbnNhY3Rpb25zIHNob3VsZCBleHRyYWN0IHNwZW5kaW5nIGluZm9ybWF0aW9uIG9mIGFsbCBpbnB1dCBib3hlc1xuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yIChoYXNEYXRhIHJldHVybnMgZmFsc2UgYXMgZGVmYXVsdClcbiAgICAgKiAtIHNweSBgZXh0cmFjdEJveERhdGFgLCBgc3RvcmVCb3hlc2AgYW5kIGBzcGVuZEJveGVzYFxuICAgICAqIC0gcnVuIHRlc3QgKGNhbGwgYHByb2Nlc3NUcmFuc2FjdGlvbnNgKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gbm90IHRvIGNhbGwgYGV4dHJhY3RCb3hEYXRhYCBhbmQgYHN0b3JlQm94ZXNgIHdoZW4gdGhlcmUgaXMgbm90IGFueSBib3ggd2l0aCBkYXRhXG4gICAgICogLSB0byBleHRyYWN0b3Igc3BlbmQgaW5mbyBvZiBpbnB1dCBib3hlcyBhbmQgY2FsbCBgc3BlbmRCb3hlc2BcbiAgICAgKiAtIHRvIHJldHVybiB0cnVlIHdoZW4gdG90YWwgcHJvY2VkdXJlIGlzIHN1Y2Nlc3NmdWxcbiAgICAgKiAtIHRvIHRyaWdnZXIgYFNQRU5EYCBjYWxsYmFja3Mgd2l0aCBjb3JyZWN0IGRhdGFcbiAgICAgKi9cbiAgICBpdCgnc2hvdWxkIGV4dHJhY3Qgc3BlbmRpbmcgaW5mb3JtYXRpb24gb2YgYWxsIGlucHV0IGJveGVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEVyZ29FeHRyYWN0b3IoKTtcbiAgICAgIGNvbnN0IHRyaWdnZXJDYWxsYmFja3MgPSB2aXRlc3QuZm4oKTtcbiAgICAgIGV4dHJhY3RvclsndHJpZ2dlckNhbGxiYWNrcyddID0gdHJpZ2dlckNhbGxiYWNrcztcbiAgICAgIGNvbnN0IGV4dHJhY3RTcHkgPSB2aXRlc3QuZm4oKTtcbiAgICAgIGV4dHJhY3Rvci5leHRyYWN0Qm94RGF0YSA9IGV4dHJhY3RTcHk7XG4gICAgICBjb25zdCBzdG9yZVNweSA9IHZpdGVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKHRydWUpO1xuICAgICAgY29uc3Qgc3BlbmRTcHkgPSB2aXRlc3RcbiAgICAgICAgLmZuKClcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKFtcbiAgICAgICAgICB7IGJveElkOiB0eC5pbnB1dHNbMF0uYm94SWQgfSxcbiAgICAgICAgICB7IGJveElkOiB0eC5pbnB1dHNbMV0uYm94SWQgfSxcbiAgICAgICAgXSk7XG4gICAgICBleHRyYWN0b3JbJ2FjdGlvbnMnXSA9IHtcbiAgICAgICAgc3RvcmVCb3hlczogc3RvcmVTcHksXG4gICAgICAgIHNwZW5kQm94ZXM6IHNwZW5kU3B5LFxuICAgICAgfSBhcyB1bmtub3duIGFzIEFic3RyYWN0RXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgICAgICAgQWJzdHJhY3RCb3hEYXRhLFxuICAgICAgICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHlcbiAgICAgID47XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleHRyYWN0b3IucHJvY2Vzc1RyYW5zYWN0aW9ucyhbdHhdLCBibG9jayk7XG5cbiAgICAgIGV4cGVjdChleHRyYWN0U3B5KS5ub3QudG9CZUNhbGxlZCgpO1xuICAgICAgZXhwZWN0KHN0b3JlU3B5KS5ub3QudG9CZUNhbGxlZCgpO1xuICAgICAgZXhwZWN0KHNwZW5kU3B5KS50b0JlQ2FsbGVkV2l0aChcbiAgICAgICAgW1xuICAgICAgICAgIHsgYm94SWQ6IHR4LmlucHV0c1swXS5ib3hJZCwgdHhJZDogdHguaWQsIGluZGV4OiAxIH0sXG4gICAgICAgICAgeyBib3hJZDogdHguaW5wdXRzWzFdLmJveElkLCB0eElkOiB0eC5pZCwgaW5kZXg6IDIgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYmxvY2ssXG4gICAgICAgICdUZXN0JyxcbiAgICAgICk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHRydWUpO1xuICAgICAgZXhwZWN0KHRyaWdnZXJDYWxsYmFja3MpLnRvQmVDYWxsZWRXaXRoKENhbGxiYWNrVHlwZS5TcGVuZCwgW1xuICAgICAgICB7IGJveElkOiB0eC5pbnB1dHNbMF0uYm94SWQgfSxcbiAgICAgICAgeyBib3hJZDogdHguaW5wdXRzWzFdLmJveElkIH0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEB0YXJnZXQgcHJvY2Vzc1RyYW5zYWN0aW9ucyBzaG91bGQgcmV0dXJuIGZhbHNlIGlmIGRhdGEgaW5zZXJ0aW9uIGZhaWxzXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYGhhc0RhdGFgIHRvIHJldHVybiB0cnVlIGZvciBvbmUgYm94XG4gICAgICogLSBzcHkgYGV4dHJhY3RCb3hEYXRhYCBhbmQgYHN0b3JlQm94ZXNgXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgcHJvY2Vzc1RyYW5zYWN0aW9uc2ApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byByZXR1cm4gZmFsc2Ugd2hlbiBgaW5zZXJ0Qm94ZXNgIHJldHVybnMgZmFsc2VcbiAgICAgKiAtIG5vdCB0byBjYWxsIGBzcGVuZEJveGVzYCBpZiBkYXRhIGluc2VydGlvbiBmYWlsc1xuICAgICAqL1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGlmIGRhdGEgaW5zZXJ0aW9uIGZhaWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEVyZ29FeHRyYWN0b3IoKTtcbiAgICAgIGV4dHJhY3Rvci5oYXNEYXRhID0gKGJveDogVjEuT3V0cHV0SW5mbyB8IE91dHB1dEJveCkgPT4ge1xuICAgICAgICBpZiAoYm94LmJveElkID09IHR4Lm91dHB1dHNbMF0uYm94SWQpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuICAgICAgY29uc3QgZXh0cmFjdFNweSA9IHZpdGVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShleHRyYWN0ZWREYXRhKTtcbiAgICAgIGV4dHJhY3Rvci5leHRyYWN0Qm94RGF0YSA9IGV4dHJhY3RTcHk7XG4gICAgICBjb25zdCBzdG9yZVNweSA9IHZpdGVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKGZhbHNlKTtcbiAgICAgIGNvbnN0IHNwZW5kU3B5ID0gdml0ZXN0LmZuKCk7XG4gICAgICBleHRyYWN0b3JbJ2FjdGlvbnMnXSA9IHtcbiAgICAgICAgc3RvcmVCb3hlczogc3RvcmVTcHksXG4gICAgICAgIHNwZW5kQm94ZXM6IHNwZW5kU3B5LFxuICAgICAgfSBhcyB1bmtub3duIGFzIEFic3RyYWN0RXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgICAgICAgQWJzdHJhY3RCb3hEYXRhLFxuICAgICAgICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHlcbiAgICAgID47XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleHRyYWN0b3IucHJvY2Vzc1RyYW5zYWN0aW9ucyhbdHhdLCBibG9jayk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoZmFsc2UpO1xuICAgICAgZXhwZWN0KHNwZW5kU3B5KS5ub3QudG9CZUNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZm9ya0Jsb2NrJywgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIEB0YXJnZXQgZm9ya0Jsb2NrIHNob3VsZCByZW1vdmUgYWxsIGRhdGEgZXh0cmFjdGVkIGZyb20gdGhlIHNwZWNpZmllZCBibG9ja1xuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBzcHkgYGRlbGV0ZUJsb2NrQm94ZXNgXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgZm9ya0Jsb2NrYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIGNhbGwgYGRlbGV0ZUJsb2NrQm94ZXNgIGZvciB0aGUgc3BlY2lmaWMgYm94XG4gICAgICogLSB0byB0cmlnZ2VyIGBERUxFVEVgIGNhbGxiYWNrcyBmb3IgdGhlIGRlbGV0ZWQgYm94XG4gICAgICogLSB0byB0cmlnZ2VyIGBVUERBVEVgIGNhbGxiYWNrcyBmb3IgdGhlIHNwZW50IGJveFxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGFsbCBkYXRhIGV4dHJhY3RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgYmxvY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgTW9ja2VkRXJnb0V4dHJhY3RvcigpO1xuICAgICAgY29uc3QgcmVtb3ZlU3B5ID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICBkZWxldGVkRGF0YTogW3sgYm94SWQ6ICdib3gxJyB9XSxcbiAgICAgICAgdXBkYXRlZERhdGE6IFt7IGJveElkOiAnYm94MicgfV0sXG4gICAgICB9KTtcbiAgICAgIGV4dHJhY3RvclsnYWN0aW9ucyddID0ge1xuICAgICAgICBkZWxldGVCbG9ja0JveGVzOiByZW1vdmVTcHksXG4gICAgICB9IGFzIHVua25vd24gYXMgQWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uPFxuICAgICAgICBBYnN0cmFjdEJveERhdGEsXG4gICAgICAgIEFic3RyYWN0RXJnb0V4dHJhY3RvckVudGl0eVxuICAgICAgPjtcbiAgICAgIGNvbnN0IHRyaWdnZXJDYWxsYmFja1NweSA9IHZpdGVzdC5mbigpLm1vY2tDbGVhcigpO1xuICAgICAgZXh0cmFjdG9yWyd0cmlnZ2VyQ2FsbGJhY2tzJ10gPSB0cmlnZ2VyQ2FsbGJhY2tTcHk7XG4gICAgICBhd2FpdCBleHRyYWN0b3IuZm9ya0Jsb2NrKGJsb2NrLmhhc2gpO1xuICAgICAgZXhwZWN0KHJlbW92ZVNweSkudG9CZUNhbGxlZFdpdGgoYmxvY2suaGFzaCwgJ1Rlc3QnKTtcbiAgICAgIGV4cGVjdCh0cmlnZ2VyQ2FsbGJhY2tTcHkpLnRvQmVDYWxsZWRXaXRoKENhbGxiYWNrVHlwZS5EZWxldGUsIFtcbiAgICAgICAgeyBib3hJZDogJ2JveDEnIH0sXG4gICAgICBdKTtcbiAgICAgIGV4cGVjdCh0cmlnZ2VyQ2FsbGJhY2tTcHkpLnRvQmVDYWxsZWRXaXRoKENhbGxiYWNrVHlwZS5VcGRhdGUsIFtcbiAgICAgICAgeyBib3hJZDogJ2JveDInIH0sXG4gICAgICBdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hvb2snLCAoKSA9PiB7XG4gICAgLyoqXG4gICAgICogQHRhcmdldCBob29rIHNob3VsZCBob29rIGEgbmV3IGNhbGxiYWNrIG9uIGluc2VydCB3aXRoIHRoZSBuZXcgaWRcbiAgICAgKiBAZGVwZW5kZW5jaWVzXG4gICAgICogQHNjZW5hcmlvXG4gICAgICogLSBtb2NrIGV4dHJhY3RvclxuICAgICAqIC0gbW9jayBhIGNhbGxiYWNrIGZvciBpbnNlcnRcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGBob29rYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIGhvb2sgdGhlIGNhbGxiYWNrIHdpdGggdGhlIHNwZWNpZmllZCBpZFxuICAgICAqIC0gcmV0dXJuIHRydWVcbiAgICAgKi9cbiAgICBpdCgnc2hvdWxkIGhvb2sgYSBuZXcgY2FsbGJhY2sgb24gaW5zZXJ0IHdpdGggdGhlIG5ldyBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRFcmdvRXh0cmFjdG9yKCk7XG4gICAgICBjb25zdCBpbnNlcnRDYWxsYmFjayA9IHZpdGVzdC5mbigpO1xuICAgICAgY29uc3QgaWQgPSBhd2FpdCBleHRyYWN0b3IuaG9vayhDYWxsYmFja1R5cGUuSW5zZXJ0LCBpbnNlcnRDYWxsYmFjayk7XG4gICAgICBleHBlY3QoZXh0cmFjdG9yWydjYWxsYmFja3MnXVtDYWxsYmFja1R5cGUuSW5zZXJ0XSkudG9FcXVhbChcbiAgICAgICAgbmV3IE1hcCgpLnNldChpZCwgaW5zZXJ0Q2FsbGJhY2spLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VuaG9vaycsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IHVuaG9vayBzaG91bGQgdW5ob29rIHRoZSBjYWxsYmFjayBvbiBpbnNlcnQgd2l0aCB0aGUgc3BlY2lmaWVkIGlkXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYSBjYWxsYmFjayBmb3IgaW5zZXJ0XG4gICAgICogLSBob29rIHRoZSBjYWxsYmFja1xuICAgICAqIC0gcnVuIHRlc3QgKGNhbGwgYHVuaG9va2ApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB1bmhvb2sgdGhlIGNhbGxiYWNrIHdpdGggdGhlIHNwZWNpZmllZCBpZFxuICAgICAqIC0gcmV0dXJuIHRydWVcbiAgICAgKi9cbiAgICBpdCgnc2hvdWxkIHVuaG9vayB0aGUgY2FsbGJhY2sgb24gaW5zZXJ0IHdpdGggdGhlIHNwZWNpZmllZCBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRFcmdvRXh0cmFjdG9yKCk7XG4gICAgICBjb25zdCBpbnNlcnRDYWxsYmFjayA9IHZpdGVzdC5mbigpO1xuICAgICAgY29uc3QgaWQgPSBhd2FpdCBleHRyYWN0b3IuaG9vayhDYWxsYmFja1R5cGUuSW5zZXJ0LCBpbnNlcnRDYWxsYmFjayk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleHRyYWN0b3IudW5ob29rKENhbGxiYWNrVHlwZS5JbnNlcnQsIGlkKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChleHRyYWN0b3JbJ2NhbGxiYWNrcyddW0NhbGxiYWNrVHlwZS5JbnNlcnRdLmdldChpZCkpLnRvRXF1YWwoXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IHVuaG9vayBzaG91bGQgbm90IHVuaG9vayBjYWxsYmFja3Mgd2l0aCB0aGUgc2FtZSBpZCBvbiBvdGhlciB0eXBlc1xuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBtb2NrIHR3byBjYWxsYmFja3MgZm9yIGluc2VydFxuICAgICAqIC0gaG9vayB0aGUgZmlyc3QgY2FsbGJhY2tcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGB1bmhvb2tgIHdpdGggdGhlIHNhbWUgaWQgZm9yIHNlY29uZCBjYWxsYmFjaylcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIG5vdCB0byBjaGFuZ2UgaG9va2VkIGNhbGxiYWNrcyB3aGVuIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBpZFxuICAgICAqIGRvZXNuJ3QgZXhpc3RzIG9uIHRoZSBzcGVjaWZpZWQgdHlwZVxuICAgICAqIC0gcmV0dXJuIGZhbHNlXG4gICAgICovXG4gICAgaXQoJ3Nob3VsZCBub3QgdW5ob29rIGNhbGxiYWNrcyB3aXRoIHRoZSBzYW1lIGlkIG9uIG90aGVyIHR5cGVzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEVyZ29FeHRyYWN0b3IoKTtcbiAgICAgIGNvbnN0IGluc2VydENhbGxiYWNrID0gdml0ZXN0LmZuKCk7XG4gICAgICBjb25zdCBpZCA9IGF3YWl0IGV4dHJhY3Rvci5ob29rKENhbGxiYWNrVHlwZS5JbnNlcnQsIGluc2VydENhbGxiYWNrKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4dHJhY3Rvci51bmhvb2soQ2FsbGJhY2tUeXBlLlVwZGF0ZSwgaWQpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZUZhbHN5KCk7XG4gICAgICBleHBlY3QoZXh0cmFjdG9yWydjYWxsYmFja3MnXVtDYWxsYmFja1R5cGUuSW5zZXJ0XS5nZXQoaWQpKS50b0VxdWFsKFxuICAgICAgICBpbnNlcnRDYWxsYmFjayxcbiAgICAgICk7XG4gICAgICBleHBlY3QoZXh0cmFjdG9yWydjYWxsYmFja3MnXVtDYWxsYmFja1R5cGUuVXBkYXRlXS5nZXQoaWQpKS50b0VxdWFsKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndHJpZ2dlckNhbGxiYWNrcycsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IHRyaWdnZXJDYWxsYmFja3Mgc2hvdWxkIHRyaWdnZXIgYWxsIGNhbGxiYWNrcyBob29rZWQgb24gYSB0eXBlXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYSBjYWxsYmFjayBmb3IgaW5zZXJ0XG4gICAgICogLSBob29rIHRoZSBjYWxsYmFja1xuICAgICAqIC0gcnVuIHRlc3QgKGNhbGwgYHRyaWdnZXJDYWxsYmFja3NgIGZvciBpbnNlcnQgdHlwZSlcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRyaWdnZXIgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBzcGVjaWZpZWQgaWRcbiAgICAgKi9cbiAgICBpdCgnc2hvdWxkIHRyaWdnZXIgYWxsIGNhbGxiYWNrcyBob29rZWQgb24gYSB0eXBlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEVyZ29FeHRyYWN0b3IoKTtcbiAgICAgIGNvbnN0IGluc2VydENhbGxiYWNrID0gdml0ZXN0LmZuKCk7XG4gICAgICBhd2FpdCBleHRyYWN0b3IuaG9vayhDYWxsYmFja1R5cGUuSW5zZXJ0LCBpbnNlcnRDYWxsYmFjayk7XG4gICAgICBjb25zdCBpbnNlcnRlZERhdGEgPSBbeyBib3hJZDogJ2JveElkJywgc2VyaWFsaXplZDogJ3NlcmlhbGl6ZWQnIH1dO1xuICAgICAgYXdhaXQgZXh0cmFjdG9yWyd0cmlnZ2VyQ2FsbGJhY2tzJ10oQ2FsbGJhY2tUeXBlLkluc2VydCwgaW5zZXJ0ZWREYXRhKTtcbiAgICAgIGV4cGVjdChpbnNlcnRDYWxsYmFjaykudG9CZUNhbGxlZFdpdGgoaW5zZXJ0ZWREYXRhKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { DataSource } from '@rosen-bridge/extended-typeorm';
|
|
2
|
-
import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
-
import { AbstractErgoExtractorAction, AbstractErgoExtractorEntity, AbstractBoxData } from '../lib';
|
|
4
|
-
export declare class TestErgoExtractorAction extends AbstractErgoExtractorAction<AbstractBoxData, AbstractErgoExtractorEntity> {
|
|
5
|
-
constructor(dataSource: DataSource);
|
|
6
|
-
/**
|
|
7
|
-
* create the test database entity from data and block information
|
|
8
|
-
*/
|
|
9
|
-
createEntity: (boxes: AbstractBoxData[], block: BlockInfo, extractor: string) => Omit<AbstractErgoExtractorEntity, "id">[];
|
|
10
|
-
/**
|
|
11
|
-
* convert the database entity back to raw data
|
|
12
|
-
*/
|
|
13
|
-
convertEntityToData: (entities: AbstractErgoExtractorEntity[]) => AbstractBoxData[];
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=AbstractErgoExtractorAction.mock.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractErgoExtractorAction.mock.d.ts","sourceRoot":"","sources":["../../tests/AbstractErgoExtractorAction.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,EAC3B,eAAe,EAChB,MAAM,QAAQ,CAAC;AAGhB,qBAAa,uBAAwB,SAAQ,2BAA2B,CACtE,eAAe,EACf,2BAA2B,CAC5B;gBACa,UAAU,EAAE,UAAU;IAIlC;;OAEG;IACH,YAAY,GACV,OAAO,eAAe,EAAE,EACxB,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,IAAI,CAAC,2BAA2B,EAAE,IAAI,CAAC,EAAE,CAQ1C;IAEF;;OAEG;IACH,mBAAmB,GACjB,UAAU,2BAA2B,EAAE,KACtC,eAAe,EAAE,CAElB;CACH"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { pick } from 'lodash-es';
|
|
2
|
-
import { AbstractErgoExtractorAction, } from '../lib';
|
|
3
|
-
import { TestEntity } from './testUtils';
|
|
4
|
-
export class TestErgoExtractorAction extends AbstractErgoExtractorAction {
|
|
5
|
-
constructor(dataSource) {
|
|
6
|
-
super(dataSource, TestEntity);
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* create the test database entity from data and block information
|
|
10
|
-
*/
|
|
11
|
-
createEntity = (boxes, block, extractor) => {
|
|
12
|
-
return boxes.map((box) => ({
|
|
13
|
-
boxId: box.boxId,
|
|
14
|
-
block: block.hash,
|
|
15
|
-
height: block.height,
|
|
16
|
-
serialized: box.serialized,
|
|
17
|
-
extractor: extractor,
|
|
18
|
-
}));
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* convert the database entity back to raw data
|
|
22
|
-
*/
|
|
23
|
-
convertEntityToData = (entities) => {
|
|
24
|
-
return entities.map((data) => pick(data, ['boxId', 'serialized']));
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uLm1vY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0cy9BYnN0cmFjdEVyZ29FeHRyYWN0b3JBY3Rpb24ubW9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR2pDLE9BQU8sRUFDTCwyQkFBMkIsR0FHNUIsTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV6QyxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsMkJBRzVDO0lBQ0MsWUFBWSxVQUFzQjtRQUNoQyxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksR0FBRyxDQUNiLEtBQXdCLEVBQ3hCLEtBQWdCLEVBQ2hCLFNBQWlCLEVBQzBCLEVBQUU7UUFDN0MsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztZQUNoQixLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDakIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtZQUMxQixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsbUJBQW1CLEdBQUcsQ0FDcEIsUUFBdUMsRUFDcEIsRUFBRTtRQUNyQixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJsb2NrSW5mbyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHtcbiAgQWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uLFxuICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHksXG4gIEFic3RyYWN0Qm94RGF0YSxcbn0gZnJvbSAnLi4vbGliJztcbmltcG9ydCB7IFRlc3RFbnRpdHkgfSBmcm9tICcuL3Rlc3RVdGlscyc7XG5cbmV4cG9ydCBjbGFzcyBUZXN0RXJnb0V4dHJhY3RvckFjdGlvbiBleHRlbmRzIEFic3RyYWN0RXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgQWJzdHJhY3RCb3hEYXRhLFxuICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHlcbj4ge1xuICBjb25zdHJ1Y3RvcihkYXRhU291cmNlOiBEYXRhU291cmNlKSB7XG4gICAgc3VwZXIoZGF0YVNvdXJjZSwgVGVzdEVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIHRoZSB0ZXN0IGRhdGFiYXNlIGVudGl0eSBmcm9tIGRhdGEgYW5kIGJsb2NrIGluZm9ybWF0aW9uXG4gICAqL1xuICBjcmVhdGVFbnRpdHkgPSAoXG4gICAgYm94ZXM6IEFic3RyYWN0Qm94RGF0YVtdLFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IE9taXQ8QWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5LCAnaWQnPltdID0+IHtcbiAgICByZXR1cm4gYm94ZXMubWFwKChib3gpID0+ICh7XG4gICAgICBib3hJZDogYm94LmJveElkLFxuICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgIHNlcmlhbGl6ZWQ6IGJveC5zZXJpYWxpemVkLFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgfSkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjb252ZXJ0IHRoZSBkYXRhYmFzZSBlbnRpdHkgYmFjayB0byByYXcgZGF0YVxuICAgKi9cbiAgY29udmVydEVudGl0eVRvRGF0YSA9IChcbiAgICBlbnRpdGllczogQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5W10sXG4gICk6IEFic3RyYWN0Qm94RGF0YVtdID0+IHtcbiAgICByZXR1cm4gZW50aXRpZXMubWFwKChkYXRhKSA9PiBwaWNrKGRhdGEsIFsnYm94SWQnLCAnc2VyaWFsaXplZCddKSk7XG4gIH07XG59XG4iXX0=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractErgoExtractorAction.spec.d.ts","sourceRoot":"","sources":["../../tests/AbstractErgoExtractorAction.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
import { pick } from 'lodash-es';
|
|
2
|
-
import { TestErgoExtractorAction } from './AbstractErgoExtractorAction.mock';
|
|
3
|
-
import { createDatabase, TestEntity } from './testUtils';
|
|
4
|
-
import { block, block2, sampleEntities } from './testData';
|
|
5
|
-
describe('AbstractErgoExtractorAction', () => {
|
|
6
|
-
let dataSource;
|
|
7
|
-
let action;
|
|
8
|
-
let repository;
|
|
9
|
-
beforeEach(async () => {
|
|
10
|
-
dataSource = await createDatabase();
|
|
11
|
-
action = new TestErgoExtractorAction(dataSource);
|
|
12
|
-
repository = dataSource.getRepository(TestEntity);
|
|
13
|
-
});
|
|
14
|
-
describe('storeBoxes', () => {
|
|
15
|
-
/**
|
|
16
|
-
* @target storeBoxes should save the passed box entities to database
|
|
17
|
-
* @dependencies
|
|
18
|
-
* @scenario
|
|
19
|
-
* - run test (call `storeBoxes` with 2 new boxes)
|
|
20
|
-
* @expected
|
|
21
|
-
* - to save 2 new entities
|
|
22
|
-
* - to return 2 inserted entity data
|
|
23
|
-
*/
|
|
24
|
-
it(`should save the passed box entities to database`, async () => {
|
|
25
|
-
const result = await action.storeBoxes(sampleEntities.slice(0, 2), block, 'extractor1');
|
|
26
|
-
const [rows, rowsCount] = await repository.findAndCount();
|
|
27
|
-
expect(rowsCount).toEqual(2);
|
|
28
|
-
expect(rows[0]).toMatchObject({
|
|
29
|
-
...sampleEntities[0],
|
|
30
|
-
extractor: 'extractor1',
|
|
31
|
-
block: block.hash,
|
|
32
|
-
height: block.height,
|
|
33
|
-
spendBlock: null,
|
|
34
|
-
spendHeight: null,
|
|
35
|
-
});
|
|
36
|
-
expect(rows[1]).toMatchObject({
|
|
37
|
-
...sampleEntities[1],
|
|
38
|
-
extractor: 'extractor1',
|
|
39
|
-
block: block.hash,
|
|
40
|
-
height: block.height,
|
|
41
|
-
spendBlock: null,
|
|
42
|
-
spendHeight: null,
|
|
43
|
-
});
|
|
44
|
-
expect(result).toEqual(true);
|
|
45
|
-
});
|
|
46
|
-
/**
|
|
47
|
-
* @target storeBoxes should correctly save boxes with different extractors
|
|
48
|
-
* @dependencies
|
|
49
|
-
* @scenario
|
|
50
|
-
* - insert 2 boxes belonging to first-extractor
|
|
51
|
-
* - run test (call `storeBoxes` with same boxes for the second-extractor)
|
|
52
|
-
* @expected
|
|
53
|
-
* - to save 2 new entities belonging to second-extractor
|
|
54
|
-
* - to return 2 new inserted entity data
|
|
55
|
-
*/
|
|
56
|
-
it(`should correctly save boxes with different extractors`, async () => {
|
|
57
|
-
await repository.insert([
|
|
58
|
-
{
|
|
59
|
-
...sampleEntities[0],
|
|
60
|
-
extractor: 'first-extractor',
|
|
61
|
-
block: '1',
|
|
62
|
-
height: 1,
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
...sampleEntities[1],
|
|
66
|
-
extractor: 'first-extractor',
|
|
67
|
-
block: '1',
|
|
68
|
-
height: 1,
|
|
69
|
-
},
|
|
70
|
-
]);
|
|
71
|
-
const result = await action.storeBoxes([sampleEntities[0], sampleEntities[1]], block, 'second-extractor');
|
|
72
|
-
const [insertedRows] = await repository.findAndCount();
|
|
73
|
-
expect(insertedRows[2]).toMatchObject({
|
|
74
|
-
...sampleEntities[0],
|
|
75
|
-
extractor: 'second-extractor',
|
|
76
|
-
block: 'hash',
|
|
77
|
-
height: block.height,
|
|
78
|
-
spendBlock: null,
|
|
79
|
-
spendHeight: null,
|
|
80
|
-
});
|
|
81
|
-
expect(insertedRows[3]).toMatchObject({
|
|
82
|
-
...sampleEntities[1],
|
|
83
|
-
extractor: 'second-extractor',
|
|
84
|
-
block: 'hash',
|
|
85
|
-
height: block.height,
|
|
86
|
-
spendBlock: null,
|
|
87
|
-
spendHeight: null,
|
|
88
|
-
});
|
|
89
|
-
expect(result).toEqual(true);
|
|
90
|
-
});
|
|
91
|
-
/**
|
|
92
|
-
* @target storeBoxes should update boxes correctly
|
|
93
|
-
* @dependencies
|
|
94
|
-
* @scenario
|
|
95
|
-
* - insert 2 boxes
|
|
96
|
-
* - run test (call `storeBoxes` with the same boxes and updated info)
|
|
97
|
-
* @expected
|
|
98
|
-
* - to update the existing box in database
|
|
99
|
-
* - to return updated box id
|
|
100
|
-
*/
|
|
101
|
-
it(`storeBoxes should update boxes correctly`, async () => {
|
|
102
|
-
await repository.insert([
|
|
103
|
-
{
|
|
104
|
-
...sampleEntities[0],
|
|
105
|
-
extractor: 'extractor',
|
|
106
|
-
block: '1',
|
|
107
|
-
height: 1,
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
...sampleEntities[1],
|
|
111
|
-
extractor: 'extractor',
|
|
112
|
-
block: '1',
|
|
113
|
-
height: 1,
|
|
114
|
-
},
|
|
115
|
-
]);
|
|
116
|
-
const result = await action.storeBoxes([
|
|
117
|
-
{
|
|
118
|
-
...sampleEntities[0],
|
|
119
|
-
serialized: 'updatedBoxSerialized',
|
|
120
|
-
},
|
|
121
|
-
], block, 'extractor');
|
|
122
|
-
const [secondInsertRows, secondInsertRowsCount] = await repository.findAndCount();
|
|
123
|
-
expect(secondInsertRowsCount).toEqual(2);
|
|
124
|
-
expect(secondInsertRows[0]).toMatchObject({
|
|
125
|
-
...sampleEntities[0],
|
|
126
|
-
extractor: 'extractor',
|
|
127
|
-
serialized: 'updatedBoxSerialized',
|
|
128
|
-
block: block.hash,
|
|
129
|
-
height: block.height,
|
|
130
|
-
spendBlock: null,
|
|
131
|
-
spendHeight: null,
|
|
132
|
-
});
|
|
133
|
-
expect(result).toEqual(true);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
describe('spendBoxes', () => {
|
|
137
|
-
/**
|
|
138
|
-
* @target spendBoxes should set spendBlock and spendHeight for a set of boxes
|
|
139
|
-
* @dependencies
|
|
140
|
-
* @scenario
|
|
141
|
-
* - insert two boxes
|
|
142
|
-
* - mock spending information for the first box
|
|
143
|
-
* - run test (call `spendBoxes`)
|
|
144
|
-
* @expected
|
|
145
|
-
* - spend the first box
|
|
146
|
-
* - return boxId and serialized of spent box
|
|
147
|
-
*/
|
|
148
|
-
it(`should set spendBlock and spendHeight for a set of boxes`, async () => {
|
|
149
|
-
await action.storeBoxes(sampleEntities.slice(0, 2), block, 'extractor1');
|
|
150
|
-
const spendBlock = { ...block, hash: 'spendHash', height: 10006016 };
|
|
151
|
-
const spendInfos = [
|
|
152
|
-
{ txId: 'txId', boxId: sampleEntities[0].boxId, index: 0 },
|
|
153
|
-
];
|
|
154
|
-
const spentBoxIds = await action.spendBoxes(spendInfos, spendBlock, 'extractor1');
|
|
155
|
-
const spentBoxes = await repository.findOneBy({
|
|
156
|
-
boxId: sampleEntities[0].boxId,
|
|
157
|
-
extractor: 'extractor1',
|
|
158
|
-
});
|
|
159
|
-
expect(spentBoxes).toMatchObject({
|
|
160
|
-
...sampleEntities[0],
|
|
161
|
-
block: block.hash,
|
|
162
|
-
height: block.height,
|
|
163
|
-
extractor: 'extractor1',
|
|
164
|
-
spendBlock: spendBlock.hash,
|
|
165
|
-
spendHeight: spendBlock.height,
|
|
166
|
-
});
|
|
167
|
-
expect(spentBoxIds).toEqual([pick(sampleEntities[0], ['boxId'])]);
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
describe('deleteBlockBoxes', () => {
|
|
171
|
-
/**
|
|
172
|
-
* @target deleteBlockBoxes should delete the boxes created in the specified block
|
|
173
|
-
* @dependencies
|
|
174
|
-
* @scenario
|
|
175
|
-
* - insert four boxes created in two different blocks
|
|
176
|
-
* - run test(call `deleteBlockBoxes` to delete block2)
|
|
177
|
-
* @expected
|
|
178
|
-
* - to delete the two boxes created in block2
|
|
179
|
-
* - to return the deleted entity data
|
|
180
|
-
*/
|
|
181
|
-
it(`should delete the boxes created in the specified block`, async () => {
|
|
182
|
-
await action.storeBoxes(sampleEntities.slice(0, 2), block, 'extractor1');
|
|
183
|
-
await action.storeBoxes(sampleEntities.slice(2), block2, 'extractor1');
|
|
184
|
-
const result = await action.deleteBlockBoxes(block2.hash, 'extractor1');
|
|
185
|
-
const [rows, rowsCount] = await repository.findAndCount();
|
|
186
|
-
expect(rowsCount).toEqual(2);
|
|
187
|
-
expect(rows.map((row) => row.boxId)).not.toContain(sampleEntities.slice(2).map((box) => box.boxId));
|
|
188
|
-
expect(result).toEqual({
|
|
189
|
-
deletedData: action.convertEntityToData(sampleEntities.slice(2)),
|
|
190
|
-
updatedData: [],
|
|
191
|
-
});
|
|
192
|
-
});
|
|
193
|
-
/**
|
|
194
|
-
* @target deleteBlockBoxes should update the boxes spent in the specified block
|
|
195
|
-
* @dependencies
|
|
196
|
-
* @scenario
|
|
197
|
-
* - insert four boxes created in a block
|
|
198
|
-
* - spend one of the in the block2
|
|
199
|
-
* - run test(call `deleteBlockBoxes` to delete block2)
|
|
200
|
-
* @expected
|
|
201
|
-
* - to update the box spent in block2
|
|
202
|
-
* - to return the updated entity boxId and serialized
|
|
203
|
-
*/
|
|
204
|
-
it(`should update the boxes spent in the specified block`, async () => {
|
|
205
|
-
await action.storeBoxes(sampleEntities, block, 'extractor1');
|
|
206
|
-
const spendInfos = [
|
|
207
|
-
{ txId: 'txId', boxId: sampleEntities[0].boxId, index: 0 },
|
|
208
|
-
];
|
|
209
|
-
await action.spendBoxes(spendInfos, block2, 'extractor1');
|
|
210
|
-
const result = await action.deleteBlockBoxes(block2.hash, 'extractor1');
|
|
211
|
-
const [rows, rowsCount] = await repository.findAndCount();
|
|
212
|
-
expect(rowsCount).toEqual(4);
|
|
213
|
-
expect(rows.map((row) => row.boxId)).not.toContain(sampleEntities.slice(2).map((box) => box.boxId));
|
|
214
|
-
expect(result).toEqual({
|
|
215
|
-
deletedData: [],
|
|
216
|
-
updatedData: [pick(sampleEntities[0], ['boxId'])],
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0cy9BYnN0cmFjdEVyZ29FeHRyYWN0b3JBY3Rpb24uc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUczRCxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO0lBQzNDLElBQUksVUFBc0IsQ0FBQztJQUMzQixJQUFJLE1BQStCLENBQUM7SUFDcEMsSUFBSSxVQUFrQyxDQUFDO0lBQ3ZDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNwQixVQUFVLEdBQUcsTUFBTSxjQUFjLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqRCxVQUFVLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFO1FBQzFCOzs7Ozs7OztXQVFHO1FBQ0gsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQy9ELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FDcEMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzFCLEtBQUssRUFDTCxZQUFZLENBQ2IsQ0FBQztZQUVGLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUcs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LEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ2xELENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuaW1wb3J0IHsgcGljayB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IFRlc3RFcmdvRXh0cmFjdG9yQWN0aW9uIH0gZnJvbSAnLi9BYnN0cmFjdEVyZ29FeHRyYWN0b3JBY3Rpb24ubW9jayc7XG5pbXBvcnQgeyBjcmVhdGVEYXRhYmFzZSwgVGVzdEVudGl0eSB9IGZyb20gJy4vdGVzdFV0aWxzJztcbmltcG9ydCB7IGJsb2NrLCBibG9jazIsIHNhbXBsZUVudGl0aWVzIH0gZnJvbSAnLi90ZXN0RGF0YSc7XG5pbXBvcnQgeyBTcGVuZEluZm8gfSBmcm9tICcuLi9saWInO1xuXG5kZXNjcmliZSgnQWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uJywgKCkgPT4ge1xuICBsZXQgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgbGV0IGFjdGlvbjogVGVzdEVyZ29FeHRyYWN0b3JBY3Rpb247XG4gIGxldCByZXBvc2l0b3J5OiBSZXBvc2l0b3J5PFRlc3RFbnRpdHk+O1xuICBiZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgICBkYXRhU291cmNlID0gYXdhaXQgY3JlYXRlRGF0YWJhc2UoKTtcbiAgICBhY3Rpb24gPSBuZXcgVGVzdEVyZ29FeHRyYWN0b3JBY3Rpb24oZGF0YVNvdXJjZSk7XG4gICAgcmVwb3NpdG9yeSA9IGRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShUZXN0RW50aXR5KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0b3JlQm94ZXMnLCAoKSA9PiB7XG4gICAgLyoqXG4gICAgICogQHRhcmdldCBzdG9yZUJveGVzIHNob3VsZCBzYXZlIHRoZSBwYXNzZWQgYm94IGVudGl0aWVzIHRvIGRhdGFiYXNlXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gcnVuIHRlc3QgKGNhbGwgYHN0b3JlQm94ZXNgIHdpdGggMiBuZXcgYm94ZXMpXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byBzYXZlIDIgbmV3IGVudGl0aWVzXG4gICAgICogLSB0byByZXR1cm4gMiBpbnNlcnRlZCBlbnRpdHkgZGF0YVxuICAgICAqL1xuICAgIGl0KGBzaG91bGQgc2F2ZSB0aGUgcGFzc2VkIGJveCBlbnRpdGllcyB0byBkYXRhYmFzZWAsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGlvbi5zdG9yZUJveGVzKFxuICAgICAgICBzYW1wbGVFbnRpdGllcy5zbGljZSgwLCAyKSxcbiAgICAgICAgYmxvY2ssXG4gICAgICAgICdleHRyYWN0b3IxJyxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IFtyb3dzLCByb3dzQ291bnRdID0gYXdhaXQgcmVwb3NpdG9yeS5maW5kQW5kQ291bnQoKTtcblxuICAgICAgZXhwZWN0KHJvd3NDb3VudCkudG9FcXVhbCgyKTtcbiAgICAgIGV4cGVjdChyb3dzWzBdKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgLi4uc2FtcGxlRW50aXRpZXNbMF0sXG4gICAgICAgIGV4dHJhY3RvcjogJ2V4dHJhY3RvcjEnLFxuICAgICAgICBibG9jazogYmxvY2suaGFzaCxcbiAgICAgICAgaGVpZ2h0OiBibG9jay5oZWlnaHQsXG4gICAgICAgIHNwZW5kQmxvY2s6IG51bGwsXG4gICAgICAgIHNwZW5kSGVpZ2h0OiBudWxsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3Qocm93c1sxXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIC4uLnNhbXBsZUVudGl0aWVzWzFdLFxuICAgICAgICBleHRyYWN0b3I6ICdleHRyYWN0b3IxJyxcbiAgICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICBzcGVuZEJsb2NrOiBudWxsLFxuICAgICAgICBzcGVuZEhlaWdodDogbnVsbCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEB0YXJnZXQgc3RvcmVCb3hlcyBzaG91bGQgY29ycmVjdGx5IHNhdmUgYm94ZXMgd2l0aCBkaWZmZXJlbnQgZXh0cmFjdG9yc1xuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIGluc2VydCAyIGJveGVzIGJlbG9uZ2luZyB0byBmaXJzdC1leHRyYWN0b3JcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGBzdG9yZUJveGVzYCB3aXRoIHNhbWUgYm94ZXMgZm9yIHRoZSBzZWNvbmQtZXh0cmFjdG9yKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gdG8gc2F2ZSAyIG5ldyBlbnRpdGllcyBiZWxvbmdpbmcgdG8gc2Vjb25kLWV4dHJhY3RvclxuICAgICAqIC0gdG8gcmV0dXJuIDIgbmV3IGluc2VydGVkIGVudGl0eSBkYXRhXG4gICAgICovXG4gICAgaXQoYHNob3VsZCBjb3JyZWN0bHkgc2F2ZSBib3hlcyB3aXRoIGRpZmZlcmVudCBleHRyYWN0b3JzYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgcmVwb3NpdG9yeS5pbnNlcnQoW1xuICAgICAgICB7XG4gICAgICAgICAgLi4uc2FtcGxlRW50aXRpZXNbMF0sXG4gICAgICAgICAgZXh0cmFjdG9yOiAnZmlyc3QtZXh0cmFjdG9yJyxcbiAgICAgICAgICBibG9jazogJzEnLFxuICAgICAgICAgIGhlaWdodDogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIC4uLnNhbXBsZUVudGl0aWVzWzFdLFxuICAgICAgICAgIGV4dHJhY3RvcjogJ2ZpcnN0LWV4dHJhY3RvcicsXG4gICAgICAgICAgYmxvY2s6ICcxJyxcbiAgICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aW9uLnN0b3JlQm94ZXMoXG4gICAgICAgIFtzYW1wbGVFbnRpdGllc1swXSwgc2FtcGxlRW50aXRpZXNbMV1dLFxuICAgICAgICBibG9jayxcbiAgICAgICAgJ3NlY29uZC1leHRyYWN0b3InLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgW2luc2VydGVkUm93c10gPSBhd2FpdCByZXBvc2l0b3J5LmZpbmRBbmRDb3VudCgpO1xuICAgICAgZXhwZWN0KGluc2VydGVkUm93c1syXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIC4uLnNhbXBsZUVudGl0aWVzWzBdLFxuICAgICAgICBleHRyYWN0b3I6ICdzZWNvbmQtZXh0cmFjdG9yJyxcbiAgICAgICAgYmxvY2s6ICdoYXNoJyxcbiAgICAgICAgaGVpZ2h0OiBibG9jay5oZWlnaHQsXG4gICAgICAgIHNwZW5kQmxvY2s6IG51bGwsXG4gICAgICAgIHNwZW5kSGVpZ2h0OiBudWxsLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChpbnNlcnRlZFJvd3NbM10pLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICAuLi5zYW1wbGVFbnRpdGllc1sxXSxcbiAgICAgICAgZXh0cmFjdG9yOiAnc2Vjb25kLWV4dHJhY3RvcicsXG4gICAgICAgIGJsb2NrOiAnaGFzaCcsXG4gICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICBzcGVuZEJsb2NrOiBudWxsLFxuICAgICAgICBzcGVuZEhlaWdodDogbnVsbCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEB0YXJnZXQgc3RvcmVCb3hlcyBzaG91bGQgdXBkYXRlIGJveGVzIGNvcnJlY3RseVxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIGluc2VydCAyIGJveGVzXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgc3RvcmVCb3hlc2Agd2l0aCB0aGUgc2FtZSBib3hlcyBhbmQgdXBkYXRlZCBpbmZvKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gdG8gdXBkYXRlIHRoZSBleGlzdGluZyBib3ggaW4gZGF0YWJhc2VcbiAgICAgKiAtIHRvIHJldHVybiB1cGRhdGVkIGJveCBpZFxuICAgICAqL1xuICAgIGl0KGBzdG9yZUJveGVzIHNob3VsZCB1cGRhdGUgYm94ZXMgY29ycmVjdGx5YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgcmVwb3NpdG9yeS5pbnNlcnQoW1xuICAgICAgICB7XG4gICAgICAgICAgLi4uc2FtcGxlRW50aXRpZXNbMF0sXG4gICAgICAgICAgZXh0cmFjdG9yOiAnZXh0cmFjdG9yJyxcbiAgICAgICAgICBibG9jazogJzEnLFxuICAgICAgICAgIGhlaWdodDogMSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIC4uLnNhbXBsZUVudGl0aWVzWzFdLFxuICAgICAgICAgIGV4dHJhY3RvcjogJ2V4dHJhY3RvcicsXG4gICAgICAgICAgYmxvY2s6ICcxJyxcbiAgICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aW9uLnN0b3JlQm94ZXMoXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5zYW1wbGVFbnRpdGllc1swXSxcbiAgICAgICAgICAgIHNlcmlhbGl6ZWQ6ICd1cGRhdGVkQm94U2VyaWFsaXplZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYmxvY2ssXG4gICAgICAgICdleHRyYWN0b3InLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IFtzZWNvbmRJbnNlcnRSb3dzLCBzZWNvbmRJbnNlcnRSb3dzQ291bnRdID1cbiAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS5maW5kQW5kQ291bnQoKTtcbiAgICAgIGV4cGVjdChzZWNvbmRJbnNlcnRSb3dzQ291bnQpLnRvRXF1YWwoMik7XG4gICAgICBleHBlY3Qoc2Vjb25kSW5zZXJ0Um93c1swXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIC4uLnNhbXBsZUVudGl0aWVzWzBdLFxuICAgICAgICBleHRyYWN0b3I6ICdleHRyYWN0b3InLFxuICAgICAgICBzZXJpYWxpemVkOiAndXBkYXRlZEJveFNlcmlhbGl6ZWQnLFxuICAgICAgICBibG9jazogYmxvY2suaGFzaCxcbiAgICAgICAgaGVpZ2h0OiBibG9jay5oZWlnaHQsXG4gICAgICAgIHNwZW5kQmxvY2s6IG51bGwsXG4gICAgICAgIHNwZW5kSGVpZ2h0OiBudWxsLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3BlbmRCb3hlcycsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IHNwZW5kQm94ZXMgc2hvdWxkIHNldCBzcGVuZEJsb2NrIGFuZCBzcGVuZEhlaWdodCBmb3IgYSBzZXQgb2YgYm94ZXNcbiAgICAgKiBAZGVwZW5kZW5jaWVzXG4gICAgICogQHNjZW5hcmlvXG4gICAgICogLSBpbnNlcnQgdHdvIGJveGVzXG4gICAgICogLSBtb2NrIHNwZW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmlyc3QgYm94XG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgc3BlbmRCb3hlc2ApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSBzcGVuZCB0aGUgZmlyc3QgYm94XG4gICAgICogLSByZXR1cm4gYm94SWQgYW5kIHNlcmlhbGl6ZWQgb2Ygc3BlbnQgYm94XG4gICAgICovXG4gICAgaXQoYHNob3VsZCBzZXQgc3BlbmRCbG9jayBhbmQgc3BlbmRIZWlnaHQgZm9yIGEgc2V0IG9mIGJveGVzYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYWN0aW9uLnN0b3JlQm94ZXMoc2FtcGxlRW50aXRpZXMuc2xpY2UoMCwgMiksIGJsb2NrLCAnZXh0cmFjdG9yMScpO1xuXG4gICAgICBjb25zdCBzcGVuZEJsb2NrID0geyAuLi5ibG9jaywgaGFzaDogJ3NwZW5kSGFzaCcsIGhlaWdodDogMTAwMDYwMTYgfTtcbiAgICAgIGNvbnN0IHNwZW5kSW5mb3M6IEFycmF5PFNwZW5kSW5mbz4gPSBbXG4gICAgICAgIHsgdHhJZDogJ3R4SWQnLCBib3hJZDogc2FtcGxlRW50aXRpZXNbMF0uYm94SWQsIGluZGV4OiAwIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBzcGVudEJveElkcyA9IGF3YWl0IGFjdGlvbi5zcGVuZEJveGVzKFxuICAgICAgICBzcGVuZEluZm9zLFxuICAgICAgICBzcGVuZEJsb2NrLFxuICAgICAgICAnZXh0cmFjdG9yMScsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzcGVudEJveGVzID0gYXdhaXQgcmVwb3NpdG9yeS5maW5kT25lQnkoe1xuICAgICAgICBib3hJZDogc2FtcGxlRW50aXRpZXNbMF0uYm94SWQsXG4gICAgICAgIGV4dHJhY3RvcjogJ2V4dHJhY3RvcjEnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzcGVudEJveGVzKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgLi4uc2FtcGxlRW50aXRpZXNbMF0sXG4gICAgICAgIGJsb2NrOiBibG9jay5oYXNoLFxuICAgICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgICAgZXh0cmFjdG9yOiAnZXh0cmFjdG9yMScsXG4gICAgICAgIHNwZW5kQmxvY2s6IHNwZW5kQmxvY2suaGFzaCxcbiAgICAgICAgc3BlbmRIZWlnaHQ6IHNwZW5kQmxvY2suaGVpZ2h0LFxuICAgICAgfSk7XG4gICAgICBleHBlY3Qoc3BlbnRCb3hJZHMpLnRvRXF1YWwoW3BpY2soc2FtcGxlRW50aXRpZXNbMF0sIFsnYm94SWQnXSldKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlbGV0ZUJsb2NrQm94ZXMnLCAoKSA9PiB7XG4gICAgLyoqXG4gICAgICogQHRhcmdldCBkZWxldGVCbG9ja0JveGVzIHNob3VsZCBkZWxldGUgdGhlIGJveGVzIGNyZWF0ZWQgaW4gdGhlIHNwZWNpZmllZCBibG9ja1xuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIGluc2VydCBmb3VyIGJveGVzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBibG9ja3NcbiAgICAgKiAtIHJ1biB0ZXN0KGNhbGwgYGRlbGV0ZUJsb2NrQm94ZXNgIHRvIGRlbGV0ZSBibG9jazIpXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byBkZWxldGUgdGhlIHR3byBib3hlcyBjcmVhdGVkIGluIGJsb2NrMlxuICAgICAqIC0gdG8gcmV0dXJuIHRoZSBkZWxldGVkIGVudGl0eSBkYXRhXG4gICAgICovXG4gICAgaXQoYHNob3VsZCBkZWxldGUgdGhlIGJveGVzIGNyZWF0ZWQgaW4gdGhlIHNwZWNpZmllZCBibG9ja2AsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFjdGlvbi5zdG9yZUJveGVzKHNhbXBsZUVudGl0aWVzLnNsaWNlKDAsIDIpLCBibG9jaywgJ2V4dHJhY3RvcjEnKTtcbiAgICAgIGF3YWl0IGFjdGlvbi5zdG9yZUJveGVzKHNhbXBsZUVudGl0aWVzLnNsaWNlKDIpLCBibG9jazIsICdleHRyYWN0b3IxJyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGlvbi5kZWxldGVCbG9ja0JveGVzKGJsb2NrMi5oYXNoLCAnZXh0cmFjdG9yMScpO1xuXG4gICAgICBjb25zdCBbcm93cywgcm93c0NvdW50XSA9IGF3YWl0IHJlcG9zaXRvcnkuZmluZEFuZENvdW50KCk7XG5cbiAgICAgIGV4cGVjdChyb3dzQ291bnQpLnRvRXF1YWwoMik7XG4gICAgICBleHBlY3Qocm93cy5tYXAoKHJvdykgPT4gcm93LmJveElkKSkubm90LnRvQ29udGFpbihcbiAgICAgICAgc2FtcGxlRW50aXRpZXMuc2xpY2UoMikubWFwKChib3gpID0+IGJveC5ib3hJZCksXG4gICAgICApO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCh7XG4gICAgICAgIGRlbGV0ZWREYXRhOiBhY3Rpb24uY29udmVydEVudGl0eVRvRGF0YShcbiAgICAgICAgICBzYW1wbGVFbnRpdGllcy5zbGljZSgyKSBhcyBUZXN0RW50aXR5W10sXG4gICAgICAgICksXG4gICAgICAgIHVwZGF0ZWREYXRhOiBbXSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHRhcmdldCBkZWxldGVCbG9ja0JveGVzIHNob3VsZCB1cGRhdGUgdGhlIGJveGVzIHNwZW50IGluIHRoZSBzcGVjaWZpZWQgYmxvY2tcbiAgICAgKiBAZGVwZW5kZW5jaWVzXG4gICAgICogQHNjZW5hcmlvXG4gICAgICogLSBpbnNlcnQgZm91ciBib3hlcyBjcmVhdGVkIGluIGEgYmxvY2tcbiAgICAgKiAtIHNwZW5kIG9uZSBvZiB0aGUgaW4gdGhlIGJsb2NrMlxuICAgICAqIC0gcnVuIHRlc3QoY2FsbCBgZGVsZXRlQmxvY2tCb3hlc2AgdG8gZGVsZXRlIGJsb2NrMilcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIHVwZGF0ZSB0aGUgYm94IHNwZW50IGluIGJsb2NrMlxuICAgICAqIC0gdG8gcmV0dXJuIHRoZSB1cGRhdGVkIGVudGl0eSBib3hJZCBhbmQgc2VyaWFsaXplZFxuICAgICAqL1xuICAgIGl0KGBzaG91bGQgdXBkYXRlIHRoZSBib3hlcyBzcGVudCBpbiB0aGUgc3BlY2lmaWVkIGJsb2NrYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgYWN0aW9uLnN0b3JlQm94ZXMoc2FtcGxlRW50aXRpZXMsIGJsb2NrLCAnZXh0cmFjdG9yMScpO1xuICAgICAgY29uc3Qgc3BlbmRJbmZvczogQXJyYXk8U3BlbmRJbmZvPiA9IFtcbiAgICAgICAgeyB0eElkOiAndHhJZCcsIGJveElkOiBzYW1wbGVFbnRpdGllc1swXS5ib3hJZCwgaW5kZXg6IDAgfSxcbiAgICAgIF07XG4gICAgICBhd2FpdCBhY3Rpb24uc3BlbmRCb3hlcyhzcGVuZEluZm9zLCBibG9jazIsICdleHRyYWN0b3IxJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3Rpb24uZGVsZXRlQmxvY2tCb3hlcyhibG9jazIuaGFzaCwgJ2V4dHJhY3RvcjEnKTtcblxuICAgICAgY29uc3QgW3Jvd3MsIHJvd3NDb3VudF0gPSBhd2FpdCByZXBvc2l0b3J5LmZpbmRBbmRDb3VudCgpO1xuXG4gICAgICBleHBlY3Qocm93c0NvdW50KS50b0VxdWFsKDQpO1xuICAgICAgZXhwZWN0KHJvd3MubWFwKChyb3cpID0+IHJvdy5ib3hJZCkpLm5vdC50b0NvbnRhaW4oXG4gICAgICAgIHNhbXBsZUVudGl0aWVzLnNsaWNlKDIpLm1hcCgoYm94KSA9PiBib3guYm94SWQpLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoe1xuICAgICAgICBkZWxldGVkRGF0YTogW10sXG4gICAgICAgIHVwZGF0ZWREYXRhOiBbcGljayhzYW1wbGVFbnRpdGllc1swXSwgWydib3hJZCddKV0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|