@rosen-bridge/abstract-extractor 2.1.2 → 3.0.0-8f3c7016
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 +9 -0
- package/dist/abstractExtractor.d.ts +24 -12
- package/dist/abstractExtractor.d.ts.map +1 -1
- package/dist/abstractExtractor.js +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/ergo/database/actions/abstractErgoAction.d.ts +83 -0
- package/dist/ergo/database/actions/abstractErgoAction.d.ts.map +1 -0
- package/dist/ergo/database/actions/abstractErgoAction.js +167 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts +31 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts.map +1 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.js +70 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts +18 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts.map +1 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.js +36 -0
- package/dist/ergo/database/entities/abstractErgoEntity.d.ts +26 -0
- package/dist/ergo/database/entities/abstractErgoEntity.d.ts.map +1 -0
- package/dist/ergo/database/entities/abstractErgoEntity.js +64 -0
- package/dist/ergo/database/index.d.ts +5 -0
- package/dist/ergo/database/index.d.ts.map +1 -0
- package/dist/ergo/database/index.js +5 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts +67 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.js +106 -0
- package/dist/ergo/extractors/abstractErgoExtractor.d.ts +53 -0
- package/dist/ergo/extractors/abstractErgoExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoExtractor.js +92 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts +56 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.js +81 -0
- package/dist/ergo/extractors/index.d.ts +4 -0
- package/dist/ergo/extractors/index.d.ts.map +1 -0
- package/dist/ergo/extractors/index.js +4 -0
- package/dist/ergo/index.d.ts +5 -7
- package/dist/ergo/index.d.ts.map +1 -1
- package/dist/ergo/index.js +6 -8
- package/dist/ergo/initializers/ergoBoxInitializer.d.ts +36 -0
- package/dist/ergo/initializers/ergoBoxInitializer.d.ts.map +1 -0
- package/dist/ergo/initializers/ergoBoxInitializer.js +80 -0
- package/dist/ergo/initializers/ergoInitializer.d.ts +39 -0
- package/dist/ergo/initializers/ergoInitializer.d.ts.map +1 -0
- package/dist/ergo/initializers/ergoInitializer.js +80 -0
- package/dist/ergo/initializers/index.d.ts +4 -0
- package/dist/ergo/initializers/index.d.ts.map +1 -0
- package/dist/ergo/initializers/index.js +4 -0
- package/dist/ergo/initializers/strategies/constants.d.ts +3 -0
- package/dist/ergo/initializers/strategies/constants.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/constants.js +3 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts +59 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.js +141 -0
- package/dist/ergo/initializers/strategies/index.d.ts +4 -0
- package/dist/ergo/initializers/strategies/index.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/index.js +4 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts +29 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.js +66 -0
- package/dist/ergo/initializers/strategies/workerManager.d.ts +79 -0
- package/dist/ergo/initializers/strategies/workerManager.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/workerManager.js +183 -0
- package/dist/ergo/interfaces.d.ts +31 -17
- package/dist/ergo/interfaces.d.ts.map +1 -1
- package/dist/ergo/interfaces.js +1 -1
- package/dist/ergo/networks/explorerNetwork.d.ts +52 -0
- package/dist/ergo/networks/explorerNetwork.d.ts.map +1 -0
- package/dist/ergo/networks/explorerNetwork.js +127 -0
- package/dist/ergo/networks/index.d.ts +3 -0
- package/dist/ergo/networks/index.d.ts.map +1 -0
- package/dist/ergo/networks/index.js +3 -0
- package/dist/ergo/networks/nodeNetwork.d.ts +28 -0
- package/dist/ergo/networks/nodeNetwork.d.ts.map +1 -0
- package/dist/ergo/networks/nodeNetwork.js +59 -0
- package/dist/ergo/utils.d.ts +15 -0
- package/dist/ergo/utils.d.ts.map +1 -1
- package/dist/ergo/utils.js +34 -1
- package/package.json +3 -1
- package/dist/ergo/abstractErgoExtractor.d.ts +0 -80
- package/dist/ergo/abstractErgoExtractor.d.ts.map +0 -1
- package/dist/ergo/abstractErgoExtractor.js +0 -142
- package/dist/ergo/abstractErgoExtractorAction.d.ts +0 -89
- package/dist/ergo/abstractErgoExtractorAction.d.ts.map +0 -1
- package/dist/ergo/abstractErgoExtractorAction.js +0 -219
- package/dist/ergo/abstractErgoExtractorEntity.d.ts +0 -11
- package/dist/ergo/abstractErgoExtractorEntity.d.ts.map +0 -1
- package/dist/ergo/abstractErgoExtractorEntity.js +0 -57
- package/dist/ergo/initializable/abstractInitializable.d.ts +0 -48
- package/dist/ergo/initializable/abstractInitializable.d.ts.map +0 -1
- package/dist/ergo/initializable/abstractInitializable.js +0 -162
- package/dist/ergo/initializable/abstractInitializableAction.d.ts +0 -14
- package/dist/ergo/initializable/abstractInitializableAction.d.ts.map +0 -1
- package/dist/ergo/initializable/abstractInitializableAction.js +0 -16
- package/dist/ergo/initializable/index.d.ts +0 -3
- package/dist/ergo/initializable/index.d.ts.map +0 -1
- package/dist/ergo/initializable/index.js +0 -3
- package/dist/ergo/network/abstractNetwork.d.ts +0 -26
- package/dist/ergo/network/abstractNetwork.d.ts.map +0 -1
- package/dist/ergo/network/abstractNetwork.js +0 -3
- package/dist/ergo/network/explorerNetwork.d.ts +0 -74
- package/dist/ergo/network/explorerNetwork.d.ts.map +0 -1
- package/dist/ergo/network/explorerNetwork.js +0 -185
- package/dist/ergo/network/nodeNetwork.d.ts +0 -60
- package/dist/ergo/network/nodeNetwork.d.ts.map +0 -1
- package/dist/ergo/network/nodeNetwork.js +0 -131
package/dist/ergo/index.d.ts
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
1
|
+
export * from './extractors';
|
|
2
|
+
export * from './initializers';
|
|
3
|
+
export * from './database';
|
|
3
4
|
export * from './interfaces';
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './network/abstractNetwork';
|
|
7
|
-
export * from './initializable';
|
|
5
|
+
export * from './networks';
|
|
6
|
+
export * from './initializers';
|
|
8
7
|
export * from './utils';
|
|
9
|
-
export * from './abstractErgoExtractorEntity';
|
|
10
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/ergo/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/ergo/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/ergo/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
|
package/dist/ergo/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
1
|
+
export * from './extractors';
|
|
2
|
+
export * from './initializers';
|
|
3
|
+
export * from './database';
|
|
3
4
|
export * from './interfaces';
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './network/abstractNetwork';
|
|
7
|
-
export * from './initializable';
|
|
5
|
+
export * from './networks';
|
|
6
|
+
export * from './initializers';
|
|
8
7
|
export * from './utils';
|
|
9
|
-
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXJnby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdEVyZ29FeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdEVyZ29FeHRyYWN0b3JBY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vbmV0d29yay9leHBsb3Jlck5ldHdvcmsnO1xuZXhwb3J0ICogZnJvbSAnLi9uZXR3b3JrL25vZGVOZXR3b3JrJztcbmV4cG9ydCAqIGZyb20gJy4vbmV0d29yay9hYnN0cmFjdE5ldHdvcmsnO1xuZXhwb3J0ICogZnJvbSAnLi9pbml0aWFsaXphYmxlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHknO1xuIl19
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXJnby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbml0aWFsaXplcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9uZXR3b3Jrcyc7XG5leHBvcnQgKiBmcm9tICcuL2luaXRpYWxpemVycyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { BlockInfo, ErgoNetworkType, OutputBox, Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
+
import { AbstractErgoBoxAction, AbstractErgoEntity } from '../database';
|
|
4
|
+
import { AbstractEntityData, ExtendedSpendInfo, ExtendedTransaction } from '../interfaces';
|
|
5
|
+
import { ErgoInitializer } from './ergoInitializer';
|
|
6
|
+
export declare class ErgoBoxInitializer<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoEntity> extends ErgoInitializer<ExtractedData, ExtractorEntity> {
|
|
7
|
+
protected extractorId: string;
|
|
8
|
+
protected hasBoxData: (box: OutputBox) => boolean;
|
|
9
|
+
protected processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>;
|
|
10
|
+
protected actions: AbstractErgoBoxAction<ExtractedData, ExtractorEntity>;
|
|
11
|
+
protected logger: DummyLogger;
|
|
12
|
+
private spendRecordsMutex;
|
|
13
|
+
private spendRecords;
|
|
14
|
+
constructor(networkType: ErgoNetworkType, url: string, address: string, extractorId: string, hasBoxData: (box: OutputBox) => boolean, processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>, actions: AbstractErgoBoxAction<ExtractedData, ExtractorEntity>, maxParallelRequests?: number, logger?: DummyLogger);
|
|
15
|
+
/**
|
|
16
|
+
* Extracts spending information of all related boxes in the transaction
|
|
17
|
+
* Note: override this function if the extractor needs extra spending info
|
|
18
|
+
* @param tx
|
|
19
|
+
* @returns transaction spend info
|
|
20
|
+
*/
|
|
21
|
+
protected extractTxSpendInfo: (tx: ExtendedTransaction) => ExtendedSpendInfo[];
|
|
22
|
+
/**
|
|
23
|
+
* Extract and store all spending information of a transaction batch
|
|
24
|
+
* @param txs
|
|
25
|
+
*/
|
|
26
|
+
protected storeExtraInfo: (txs: ExtendedTransaction[]) => Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Apply stored spend records into extractor database
|
|
29
|
+
* Note: As transactions are processed out of order (due to parallel
|
|
30
|
+
* processing), some box spend information may be invalid after the first pass
|
|
31
|
+
* To avoid processing everything twice, we keep all spend records in the
|
|
32
|
+
* first pass and reapply them at the end
|
|
33
|
+
*/
|
|
34
|
+
protected applyExtraInfo: () => Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ergoBoxInitializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ergoBoxInitializer.d.ts","sourceRoot":"","sources":["../../../lib/ergo/initializers/ergoBoxInitializer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EACL,SAAS,EACT,eAAe,EACf,SAAS,EACT,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,kBAAkB,CAC7B,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,kBAAkB,CAC1C,SAAQ,eAAe,CAAC,aAAa,EAAE,eAAe,CAAC;IAQrD,SAAS,CAAC,WAAW,EAAE,MAAM;IAC7B,SAAS,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO;IACjD,SAAS,CAAC,mBAAmB,EAAE,CAC7B,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,SAAS,KACb,OAAO,CAAC,OAAO,CAAC;IACrB,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC;IAExE,SAAS,CAAC,MAAM;IAflB,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,YAAY,CAAsB;gBAGxC,WAAW,EAAE,eAAe,EAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACL,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO,EACvC,mBAAmB,EAAE,CAC7B,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,SAAS,KACb,OAAO,CAAC,OAAO,CAAC,EACX,OAAO,EAAE,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC,EACxE,mBAAmB,SAAwB,EACjC,MAAM,cAAoB;IAetC;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,GAC1B,IAAI,mBAAmB,KACtB,iBAAiB,EAAE,CAepB;IAEF;;;OAGG;IACH,SAAS,CAAC,cAAc,GACtB,KAAK,mBAAmB,EAAE,KACzB,OAAO,CAAC,IAAI,CAAC,CASd;IAEF;;;;;;OAMG;IACH,SAAS,CAAC,cAAc,sBAoBtB;CACH"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Mutex } from 'await-semaphore';
|
|
2
|
+
import { groupBy, sortBy } from 'lodash-es';
|
|
3
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
4
|
+
import { MAX_PARALLEL_REQUESTS } from '../../constants';
|
|
5
|
+
import { ErgoInitializer } from './ergoInitializer';
|
|
6
|
+
export class ErgoBoxInitializer extends ErgoInitializer {
|
|
7
|
+
extractorId;
|
|
8
|
+
hasBoxData;
|
|
9
|
+
processTransactions;
|
|
10
|
+
actions;
|
|
11
|
+
logger;
|
|
12
|
+
spendRecordsMutex = new Mutex();
|
|
13
|
+
spendRecords;
|
|
14
|
+
constructor(networkType, url, address, extractorId, hasBoxData, processTransactions, actions, maxParallelRequests = MAX_PARALLEL_REQUESTS, logger = new DummyLogger()) {
|
|
15
|
+
super(networkType, url, address, extractorId, processTransactions, actions, maxParallelRequests, logger);
|
|
16
|
+
this.extractorId = extractorId;
|
|
17
|
+
this.hasBoxData = hasBoxData;
|
|
18
|
+
this.processTransactions = processTransactions;
|
|
19
|
+
this.actions = actions;
|
|
20
|
+
this.logger = logger;
|
|
21
|
+
this.spendRecords = [];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extracts spending information of all related boxes in the transaction
|
|
25
|
+
* Note: override this function if the extractor needs extra spending info
|
|
26
|
+
* @param tx
|
|
27
|
+
* @returns transaction spend info
|
|
28
|
+
*/
|
|
29
|
+
extractTxSpendInfo = (tx) => {
|
|
30
|
+
const txSpendInfo = [];
|
|
31
|
+
for (let i = 0; i < tx.inputs.length; i++) {
|
|
32
|
+
const box = tx.inputs[i];
|
|
33
|
+
if (this.hasBoxData(box)) {
|
|
34
|
+
txSpendInfo.push({
|
|
35
|
+
boxId: box.boxId,
|
|
36
|
+
txId: box.transactionId,
|
|
37
|
+
index: i,
|
|
38
|
+
height: tx.inclusionHeight,
|
|
39
|
+
block: tx.blockId,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return txSpendInfo;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Extract and store all spending information of a transaction batch
|
|
47
|
+
* @param txs
|
|
48
|
+
*/
|
|
49
|
+
storeExtraInfo = async (txs) => {
|
|
50
|
+
const spendRecordsBatch = [];
|
|
51
|
+
for (const tx of txs) {
|
|
52
|
+
spendRecordsBatch.push(...this.extractTxSpendInfo(tx));
|
|
53
|
+
}
|
|
54
|
+
const release = await this.spendRecordsMutex.acquire();
|
|
55
|
+
this.spendRecords.push(...spendRecordsBatch);
|
|
56
|
+
release();
|
|
57
|
+
this.logger.debug(`Stored ${spendRecordsBatch.length} new spend records`);
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Apply stored spend records into extractor database
|
|
61
|
+
* Note: As transactions are processed out of order (due to parallel
|
|
62
|
+
* processing), some box spend information may be invalid after the first pass
|
|
63
|
+
* To avoid processing everything twice, we keep all spend records in the
|
|
64
|
+
* first pass and reapply them at the end
|
|
65
|
+
*/
|
|
66
|
+
applyExtraInfo = async () => {
|
|
67
|
+
const sortedRecords = sortBy(this.spendRecords, (record) => record.height);
|
|
68
|
+
const groupedRecords = groupBy(sortedRecords, (tx) => tx.block);
|
|
69
|
+
this.logger.debug(`Spend records grouped to ${Object.keys(groupedRecords).length} blocks`);
|
|
70
|
+
const release = await this.dbMutex.acquire();
|
|
71
|
+
for (const blockId in groupedRecords) {
|
|
72
|
+
const blockRecords = groupedRecords[blockId];
|
|
73
|
+
const block = { hash: blockId, height: blockRecords[0].height };
|
|
74
|
+
this.logger.debug(`Processing spend records at height ${blockRecords[0].height}`);
|
|
75
|
+
await this.actions.updateSpendingInfo(blockRecords, block, this.extractorId);
|
|
76
|
+
}
|
|
77
|
+
release();
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJnb0JveEluaXRpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vaW5pdGlhbGl6ZXJzL2VyZ29Cb3hJbml0aWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBUTVELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBT3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sa0JBR1gsU0FBUSxlQUErQztJQVEzQztJQUNBO0lBQ0E7SUFJQTtJQUVBO0lBZkosaUJBQWlCLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUNoQyxZQUFZLENBQXNCO0lBRTFDLFlBQ0UsV0FBNEIsRUFDNUIsR0FBVyxFQUNYLE9BQWUsRUFDTCxXQUFtQixFQUNuQixVQUF1QyxFQUN2QyxtQkFHVyxFQUNYLE9BQThELEVBQ3hFLG1CQUFtQixHQUFHLHFCQUFxQixFQUNqQyxTQUFTLElBQUksV0FBVyxFQUFFO1FBRXBDLEtBQUssQ0FDSCxXQUFXLEVBQ1gsR0FBRyxFQUNILE9BQU8sRUFDUCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLE9BQU8sRUFDUCxtQkFBbUIsRUFDbkIsTUFBTSxDQUNQLENBQUM7UUFuQlEsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIsZUFBVSxHQUFWLFVBQVUsQ0FBNkI7UUFDdkMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUdSO1FBQ1gsWUFBTyxHQUFQLE9BQU8sQ0FBdUQ7UUFFOUQsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFZcEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENB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SCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE11dGV4IH0gZnJvbSAnYXdhaXQtc2VtYXBob3JlJztcbmltcG9ydCB7IGdyb3VwQnksIHNvcnRCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHtcbiAgQmxvY2tJbmZvLFxuICBFcmdvTmV0d29ya1R5cGUsXG4gIE91dHB1dEJveCxcbiAgVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgTUFYX1BBUkFMTEVMX1JFUVVFU1RTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEFic3RyYWN0RXJnb0JveEFjdGlvbiwgQWJzdHJhY3RFcmdvRW50aXR5IH0gZnJvbSAnLi4vZGF0YWJhc2UnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RFbnRpdHlEYXRhLFxuICBFeHRlbmRlZFNwZW5kSW5mbyxcbiAgRXh0ZW5kZWRUcmFuc2FjdGlvbixcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFcmdvSW5pdGlhbGl6ZXIgfSBmcm9tICcuL2VyZ29Jbml0aWFsaXplcic7XG5cbmV4cG9ydCBjbGFzcyBFcmdvQm94SW5pdGlhbGl6ZXI8XG4gIEV4dHJhY3RlZERhdGEgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eURhdGEsXG4gIEV4dHJhY3RvckVudGl0eSBleHRlbmRzIEFic3RyYWN0RXJnb0VudGl0eSxcbj4gZXh0ZW5kcyBFcmdvSW5pdGlhbGl6ZXI8RXh0cmFjdGVkRGF0YSwgRXh0cmFjdG9yRW50aXR5PiB7XG4gIHByaXZhdGUgc3BlbmRSZWNvcmRzTXV0ZXggPSBuZXcgTXV0ZXgoKTtcbiAgcHJpdmF0ZSBzcGVuZFJlY29yZHM6IEV4dGVuZGVkU3BlbmRJbmZvW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbmV0d29ya1R5cGU6IEVyZ29OZXR3b3JrVHlwZSxcbiAgICB1cmw6IHN0cmluZyxcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGV4dHJhY3RvcklkOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGhhc0JveERhdGE6IChib3g6IE91dHB1dEJveCkgPT4gYm9vbGVhbixcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1RyYW5zYWN0aW9uczogKFxuICAgICAgdHhzOiBUcmFuc2FjdGlvbltdLFxuICAgICAgYmxvY2s6IEJsb2NrSW5mbyxcbiAgICApID0+IFByb21pc2U8Ym9vbGVhbj4sXG4gICAgcHJvdGVjdGVkIGFjdGlvbnM6IEFic3RyYWN0RXJnb0JveEFjdGlvbjxFeHRyYWN0ZWREYXRhLCBFeHRyYWN0b3JFbnRpdHk+LFxuICAgIG1heFBhcmFsbGVsUmVxdWVzdHMgPSBNQVhfUEFSQUxMRUxfUkVRVUVTVFMsXG4gICAgcHJvdGVjdGVkIGxvZ2dlciA9IG5ldyBEdW1teUxvZ2dlcigpLFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIG5ldHdvcmtUeXBlLFxuICAgICAgdXJsLFxuICAgICAgYWRkcmVzcyxcbiAgICAgIGV4dHJhY3RvcklkLFxuICAgICAgcHJvY2Vzc1RyYW5zYWN0aW9ucyxcbiAgICAgIGFjdGlvbnMsXG4gICAgICBtYXhQYXJhbGxlbFJlcXVlc3RzLFxuICAgICAgbG9nZ2VyLFxuICAgICk7XG4gICAgdGhpcy5zcGVuZFJlY29yZHMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBzcGVuZGluZyBpbmZvcm1hdGlvbiBvZiBhbGwgcmVsYXRlZCBib3hlcyBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogTm90ZTogb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiBpZiB0aGUgZXh0cmFjdG9yIG5lZWRzIGV4dHJhIHNwZW5kaW5nIGluZm9cbiAgICogQHBhcmFtIHR4XG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uIHNwZW5kIGluZm9cbiAgICovXG4gIHByb3RlY3RlZCBleHRyYWN0VHhTcGVuZEluZm8gPSAoXG4gICAgdHg6IEV4dGVuZGVkVHJhbnNhY3Rpb24sXG4gICk6IEV4dGVuZGVkU3BlbmRJbmZvW10gPT4ge1xuICAgIGNvbnN0IHR4U3BlbmRJbmZvID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eC5pbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJveCA9IHR4LmlucHV0c1tpXTtcbiAgICAgIGlmICh0aGlzLmhhc0JveERhdGEoYm94KSkge1xuICAgICAgICB0eFNwZW5kSW5mby5wdXNoKHtcbiAgICAgICAgICBib3hJZDogYm94LmJveElkLFxuICAgICAgICAgIHR4SWQ6IGJveC50cmFuc2FjdGlvbklkLFxuICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgIGhlaWdodDogdHguaW5jbHVzaW9uSGVpZ2h0LFxuICAgICAgICAgIGJsb2NrOiB0eC5ibG9ja0lkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR4U3BlbmRJbmZvO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGFuZCBzdG9yZSBhbGwgc3BlbmRpbmcgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2FjdGlvbiBiYXRjaFxuICAgKiBAcGFyYW0gdHhzXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RvcmVFeHRyYUluZm8gPSBhc3luYyAoXG4gICAgdHhzOiBFeHRlbmRlZFRyYW5zYWN0aW9uW10sXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHNwZW5kUmVjb3Jkc0JhdGNoOiBFeHRlbmRlZFNwZW5kSW5mb1tdID0gW107XG4gICAgZm9yIChjb25zdCB0eCBvZiB0eHMpIHtcbiAgICAgIHNwZW5kUmVjb3Jkc0JhdGNoLnB1c2goLi4udGhpcy5leHRyYWN0VHhTcGVuZEluZm8odHgpKTtcbiAgICB9XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHRoaXMuc3BlbmRSZWNvcmRzTXV0ZXguYWNxdWlyZSgpO1xuICAgIHRoaXMuc3BlbmRSZWNvcmRzLnB1c2goLi4uc3BlbmRSZWNvcmRzQmF0Y2gpO1xuICAgIHJlbGVhc2UoKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgU3RvcmVkICR7c3BlbmRSZWNvcmRzQmF0Y2gubGVuZ3RofSBuZXcgc3BlbmQgcmVjb3Jkc2ApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBzdG9yZWQgc3BlbmQgcmVjb3JkcyBpbnRvIGV4dHJhY3RvciBkYXRhYmFzZVxuICAgKiBOb3RlOiBBcyB0cmFuc2FjdGlvbnMgYXJlIHByb2Nlc3NlZCBvdXQgb2Ygb3JkZXIgKGR1ZSB0byBwYXJhbGxlbFxuICAgKiBwcm9jZXNzaW5nKSwgc29tZSBib3ggc3BlbmQgaW5mb3JtYXRpb24gbWF5IGJlIGludmFsaWQgYWZ0ZXIgdGhlIGZpcnN0IHBhc3NcbiAgICogVG8gYXZvaWQgcHJvY2Vzc2luZyBldmVyeXRoaW5nIHR3aWNlLCB3ZSBrZWVwIGFsbCBzcGVuZCByZWNvcmRzIGluIHRoZVxuICAgKiBmaXJzdCBwYXNzIGFuZCByZWFwcGx5IHRoZW0gYXQgdGhlIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFwcGx5RXh0cmFJbmZvID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNvcnRlZFJlY29yZHMgPSBzb3J0QnkodGhpcy5zcGVuZFJlY29yZHMsIChyZWNvcmQpID0+IHJlY29yZC5oZWlnaHQpO1xuICAgIGNvbnN0IGdyb3VwZWRSZWNvcmRzID0gZ3JvdXBCeShzb3J0ZWRSZWNvcmRzLCAodHgpID0+IHR4LmJsb2NrKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBTcGVuZCByZWNvcmRzIGdyb3VwZWQgdG8gJHtPYmplY3Qua2V5cyhncm91cGVkUmVjb3JkcykubGVuZ3RofSBibG9ja3NgLFxuICAgICk7XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHRoaXMuZGJNdXRleC5hY3F1aXJlKCk7XG4gICAgZm9yIChjb25zdCBibG9ja0lkIGluIGdyb3VwZWRSZWNvcmRzKSB7XG4gICAgICBjb25zdCBibG9ja1JlY29yZHMgPSBncm91cGVkUmVjb3Jkc1tibG9ja0lkXTtcbiAgICAgIGNvbnN0IGJsb2NrID0geyBoYXNoOiBibG9ja0lkLCBoZWlnaHQ6IGJsb2NrUmVjb3Jkc1swXS5oZWlnaHQgfTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUHJvY2Vzc2luZyBzcGVuZCByZWNvcmRzIGF0IGhlaWdodCAke2Jsb2NrUmVjb3Jkc1swXS5oZWlnaHR9YCxcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmFjdGlvbnMudXBkYXRlU3BlbmRpbmdJbmZvKFxuICAgICAgICBibG9ja1JlY29yZHMsXG4gICAgICAgIGJsb2NrLFxuICAgICAgICB0aGlzLmV4dHJhY3RvcklkLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmVsZWFzZSgpO1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Mutex } from 'await-semaphore';
|
|
2
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
+
import { BlockInfo, ErgoNetworkType, Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
4
|
+
import { AbstractErgoAction, AbstractErgoEntity } from '../database';
|
|
5
|
+
import { AbstractEntityData, ExtendedTransaction } from '../interfaces';
|
|
6
|
+
import { ExplorerInitializationStrategy, NodeInitializationStrategy } from './strategies';
|
|
7
|
+
export declare class ErgoInitializer<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoEntity> {
|
|
8
|
+
protected extractorId: string;
|
|
9
|
+
protected processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>;
|
|
10
|
+
protected actions: AbstractErgoAction<ExtractedData, ExtractorEntity>;
|
|
11
|
+
protected logger: DummyLogger;
|
|
12
|
+
protected dbMutex: Mutex;
|
|
13
|
+
protected initializationStrategy: ExplorerInitializationStrategy | NodeInitializationStrategy;
|
|
14
|
+
constructor(networkType: ErgoNetworkType, url: string, address: string, extractorId: string, processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>, actions: AbstractErgoAction<ExtractedData, ExtractorEntity>, maxParallelRequests?: number, logger?: DummyLogger);
|
|
15
|
+
/**
|
|
16
|
+
* override this function to store extra information of a transaction batch
|
|
17
|
+
* @param txs list of transactions
|
|
18
|
+
*/
|
|
19
|
+
protected storeExtraInfo(txs: ExtendedTransaction[]): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* override this function to apply extra information to the extractor database
|
|
22
|
+
*/
|
|
23
|
+
protected applyExtraInfo: () => Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Process a batch of transactions
|
|
26
|
+
* group txs into blocks and process them using `processTransactions`
|
|
27
|
+
* @param txs
|
|
28
|
+
*/
|
|
29
|
+
private processTransactionBatch;
|
|
30
|
+
/**
|
|
31
|
+
* remove all old data and initialize extractor database with data created
|
|
32
|
+
* below the initial height and finally apply the stored spend records to make
|
|
33
|
+
* sure all stored data is valid
|
|
34
|
+
* ignore initialization if this feature is off
|
|
35
|
+
* @param initialBlock
|
|
36
|
+
*/
|
|
37
|
+
initializeData: (initialBlock: BlockInfo) => Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=ergoInitializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ergoInitializer.d.ts","sourceRoot":"","sources":["../../../lib/ergo/initializers/ergoInitializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EACL,SAAS,EACT,eAAe,EACf,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AAEtB,qBAAa,eAAe,CAC1B,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,kBAAkB;IAWxC,SAAS,CAAC,WAAW,EAAE,MAAM;IAC7B,SAAS,CAAC,mBAAmB,EAAE,CAC7B,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,SAAS,KACb,OAAO,CAAC,OAAO,CAAC;IACrB,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC,aAAa,EAAE,eAAe,CAAC;IAErE,SAAS,CAAC,MAAM;IAhBlB,SAAS,CAAC,OAAO,QAAe;IAChC,SAAS,CAAC,sBAAsB,EAC5B,8BAA8B,GAC9B,0BAA0B,CAAC;gBAG7B,WAAW,EAAE,eAAe,EAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACL,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,CAC7B,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,SAAS,KACb,OAAO,CAAC,OAAO,CAAC,EACX,OAAO,EAAE,kBAAkB,CAAC,aAAa,EAAE,eAAe,CAAC,EACrE,mBAAmB,SAAwB,EACjC,MAAM,cAAoB;IAsBtC;;;OAGG;IACH,SAAS,CAAC,cAAc,CACtB,GAAG,EAAE,mBAAmB,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC;IAIhB;;OAEG;IACH,SAAS,CAAC,cAAc,QAAO,OAAO,CAAC,IAAI,CAAC,CAE1C;IAEF;;;;OAIG;IACH,OAAO,CAAC,uBAAuB,CA0B7B;IAEF;;;;;;OAMG;IACH,cAAc,GAAU,cAAc,SAAS,mBAQ7C;CACH"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Mutex } from 'await-semaphore';
|
|
2
|
+
import { groupBy, sortBy } from 'lodash-es';
|
|
3
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
4
|
+
import { ErgoNetworkType, } from '@rosen-bridge/scanner-interfaces';
|
|
5
|
+
import { MAX_PARALLEL_REQUESTS } from '../../constants';
|
|
6
|
+
import { ExplorerInitializationStrategy, NodeInitializationStrategy, } from './strategies';
|
|
7
|
+
export class ErgoInitializer {
|
|
8
|
+
extractorId;
|
|
9
|
+
processTransactions;
|
|
10
|
+
actions;
|
|
11
|
+
logger;
|
|
12
|
+
dbMutex = new Mutex();
|
|
13
|
+
initializationStrategy;
|
|
14
|
+
constructor(networkType, url, address, extractorId, processTransactions, actions, maxParallelRequests = MAX_PARALLEL_REQUESTS, logger = new DummyLogger()) {
|
|
15
|
+
this.extractorId = extractorId;
|
|
16
|
+
this.processTransactions = processTransactions;
|
|
17
|
+
this.actions = actions;
|
|
18
|
+
this.logger = logger;
|
|
19
|
+
if (networkType == ErgoNetworkType.Explorer) {
|
|
20
|
+
this.initializationStrategy = new ExplorerInitializationStrategy(url, address, maxParallelRequests, this.processTransactions, this.processTransactionBatch, logger);
|
|
21
|
+
}
|
|
22
|
+
else if (networkType == ErgoNetworkType.Node) {
|
|
23
|
+
this.initializationStrategy = new NodeInitializationStrategy(url, address, maxParallelRequests, this.processTransactionBatch, logger);
|
|
24
|
+
}
|
|
25
|
+
else
|
|
26
|
+
throw new Error(`Network type ${networkType} is not supported`);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* override this function to store extra information of a transaction batch
|
|
30
|
+
* @param txs list of transactions
|
|
31
|
+
*/
|
|
32
|
+
storeExtraInfo(txs) {
|
|
33
|
+
return Promise.resolve();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* override this function to apply extra information to the extractor database
|
|
37
|
+
*/
|
|
38
|
+
applyExtraInfo = () => {
|
|
39
|
+
return Promise.resolve();
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Process a batch of transactions
|
|
43
|
+
* group txs into blocks and process them using `processTransactions`
|
|
44
|
+
* @param txs
|
|
45
|
+
*/
|
|
46
|
+
processTransactionBatch = async (txs) => {
|
|
47
|
+
txs = sortBy(txs, (tx) => tx.inclusionHeight);
|
|
48
|
+
const groupedTxs = groupBy(txs, (tx) => tx.blockId);
|
|
49
|
+
this.logger.debug(`The transaction batch grouped to ${Object.keys(groupedTxs).length} blocks`);
|
|
50
|
+
const release = await this.dbMutex.acquire();
|
|
51
|
+
for (const blockId in groupedTxs) {
|
|
52
|
+
const blockTxs = groupedTxs[blockId];
|
|
53
|
+
const block = { hash: blockId, height: blockTxs[0].inclusionHeight };
|
|
54
|
+
this.logger.debug(`Processing transactions at height ${blockTxs[0].inclusionHeight}`);
|
|
55
|
+
const success = await this.processTransactions(blockTxs, block);
|
|
56
|
+
if (!success) {
|
|
57
|
+
release();
|
|
58
|
+
throw Error(`Processing transactions failed at height ${blockTxs[0].inclusionHeight}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
release();
|
|
62
|
+
this.logger.debug(`storing spend info of transaction batch`);
|
|
63
|
+
await this.storeExtraInfo(txs);
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* remove all old data and initialize extractor database with data created
|
|
67
|
+
* below the initial height and finally apply the stored spend records to make
|
|
68
|
+
* sure all stored data is valid
|
|
69
|
+
* ignore initialization if this feature is off
|
|
70
|
+
* @param initialBlock
|
|
71
|
+
*/
|
|
72
|
+
initializeData = async (initialBlock) => {
|
|
73
|
+
this.logger.info(`Initialization process for ${this.extractorId} started`);
|
|
74
|
+
await this.actions.removeAllData(this.extractorId);
|
|
75
|
+
await this.initializationStrategy.initialize(initialBlock);
|
|
76
|
+
await this.applyExtraInfo();
|
|
77
|
+
this.logger.info(`Initialization completed successfully for ${this.extractorId}`);
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJnb0luaXRpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vaW5pdGlhbGl6ZXJzL2VyZ29Jbml0aWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFFTCxlQUFlLEdBRWhCLE1BQU0sa0NBQWtDLENBQUM7QUFFMUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHeEQsT0FBTyxFQUNMLDhCQUE4QixFQUM5QiwwQkFBMEIsR0FDM0IsTUFBTSxjQUFjLENBQUM7QUFFdEIsTUFBTSxPQUFPLGVBQWU7SUFhZDtJQUNBO0lBSUE7SUFFQTtJQWhCRixPQUFPLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUN0QixzQkFBc0IsQ0FFRDtJQUUvQixZQUNFLFdBQTRCLEVBQzVCLEdBQVcsRUFDWCxPQUFlLEVBQ0wsV0FBbUIsRUFDbkIsbUJBR1csRUFDWCxPQUEyRCxFQUNyRSxtQkFBbUIsR0FBRyxxQkFBcUIsRUFDakMsU0FBUyxJQUFJLFdBQVcsRUFBRTtRQVAxQixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUNuQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBR1I7UUFDWCxZQUFPLEdBQVAsT0FBTyxDQUFvRDtRQUUzRCxXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUVwQyxJQUFJLFdBQVcsSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksOEJBQThCLENBQzlELEdBQUcsRUFDSCxPQUFPLEVBQ1AsbUJBQW1CLEVBQ25CLElBQUksQ0FBQyxtQkFBbUIsRUFD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Q0FBNkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUNoRSxDQUFDO0lBQ0osQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNdXRleCB9IGZyb20gJ2F3YWl0LXNlbWFwaG9yZSc7XG5pbXBvcnQgeyBncm91cEJ5LCBzb3J0QnkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7XG4gIEJsb2NrSW5mbyxcbiAgRXJnb05ldHdvcmtUeXBlLFxuICBUcmFuc2FjdGlvbixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBNQVhfUEFSQUxMRUxfUkVRVUVTVFMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQWJzdHJhY3RFcmdvQWN0aW9uLCBBYnN0cmFjdEVyZ29FbnRpdHkgfSBmcm9tICcuLi9kYXRhYmFzZSc7XG5pbXBvcnQgeyBBYnN0cmFjdEVudGl0eURhdGEsIEV4dGVuZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIEV4cGxvcmVySW5pdGlhbGl6YXRpb25TdHJhdGVneSxcbiAgTm9kZUluaXRpYWxpemF0aW9uU3RyYXRlZ3ksXG59IGZyb20gJy4vc3RyYXRlZ2llcyc7XG5cbmV4cG9ydCBjbGFzcyBFcmdvSW5pdGlhbGl6ZXI8XG4gIEV4dHJhY3RlZERhdGEgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eURhdGEsXG4gIEV4dHJhY3RvckVudGl0eSBleHRlbmRzIEFic3RyYWN0RXJnb0VudGl0eSxcbj4ge1xuICBwcm90ZWN0ZWQgZGJNdXRleCA9IG5ldyBNdXRleCgpO1xuICBwcm90ZWN0ZWQgaW5pdGlhbGl6YXRpb25TdHJhdGVneTpcbiAgICB8IEV4cGxvcmVySW5pdGlhbGl6YXRpb25TdHJhdGVneVxuICAgIHwgTm9kZUluaXRpYWxpemF0aW9uU3RyYXRlZ3k7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbmV0d29ya1R5cGU6IEVyZ29OZXR3b3JrVHlwZSxcbiAgICB1cmw6IHN0cmluZyxcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGV4dHJhY3RvcklkOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NUcmFuc2FjdGlvbnM6IChcbiAgICAgIHR4czogVHJhbnNhY3Rpb25bXSxcbiAgICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgKSA9PiBQcm9taXNlPGJvb2xlYW4+LFxuICAgIHByb3RlY3RlZCBhY3Rpb25zOiBBYnN0cmFjdEVyZ29BY3Rpb248RXh0cmFjdGVkRGF0YSwgRXh0cmFjdG9yRW50aXR5PixcbiAgICBtYXhQYXJhbGxlbFJlcXVlc3RzID0gTUFYX1BBUkFMTEVMX1JFUVVFU1RTLFxuICAgIHByb3RlY3RlZCBsb2dnZXIgPSBuZXcgRHVtbXlMb2dnZXIoKSxcbiAgKSB7XG4gICAgaWYgKG5ldHdvcmtUeXBlID09IEVyZ29OZXR3b3JrVHlwZS5FeHBsb3Jlcikge1xuICAgICAgdGhpcy5pbml0aWFsaXphdGlvblN0cmF0ZWd5ID0gbmV3IEV4cGxvcmVySW5pdGlhbGl6YXRpb25TdHJhdGVneShcbiAgICAgICAgdXJsLFxuICAgICAgICBhZGRyZXNzLFxuICAgICAgICBtYXhQYXJhbGxlbFJlcXVlc3RzLFxuICAgICAgICB0aGlzLnByb2Nlc3NUcmFuc2FjdGlvbnMsXG4gICAgICAgIHRoaXMucHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2gsXG4gICAgICAgIGxvZ2dlcixcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChuZXR3b3JrVHlwZSA9PSBFcmdvTmV0d29ya1R5cGUuTm9kZSkge1xuICAgICAgdGhpcy5pbml0aWFsaXphdGlvblN0cmF0ZWd5ID0gbmV3IE5vZGVJbml0aWFsaXphdGlvblN0cmF0ZWd5KFxuICAgICAgICB1cmwsXG4gICAgICAgIGFkZHJlc3MsXG4gICAgICAgIG1heFBhcmFsbGVsUmVxdWVzdHMsXG4gICAgICAgIHRoaXMucHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2gsXG4gICAgICAgIGxvZ2dlcixcbiAgICAgICk7XG4gICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgTmV0d29yayB0eXBlICR7bmV0d29ya1R5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIHN0b3JlIGV4dHJhIGluZm9ybWF0aW9uIG9mIGEgdHJhbnNhY3Rpb24gYmF0Y2hcbiAgICogQHBhcmFtIHR4cyBsaXN0IG9mIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgcHJvdGVjdGVkIHN0b3JlRXh0cmFJbmZvKFxuICAgIHR4czogRXh0ZW5kZWRUcmFuc2FjdGlvbltdLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICAvKipcbiAgICogb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB0byBhcHBseSBleHRyYSBpbmZvcm1hdGlvbiB0byB0aGUgZXh0cmFjdG9yIGRhdGFiYXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXBwbHlFeHRyYUluZm8gPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGEgYmF0Y2ggb2YgdHJhbnNhY3Rpb25zXG4gICAqIGdyb3VwIHR4cyBpbnRvIGJsb2NrcyBhbmQgcHJvY2VzcyB0aGVtIHVzaW5nIGBwcm9jZXNzVHJhbnNhY3Rpb25zYFxuICAgKiBAcGFyYW0gdHhzXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NUcmFuc2FjdGlvbkJhdGNoID0gYXN5bmMgKHR4czogQXJyYXk8RXh0ZW5kZWRUcmFuc2FjdGlvbj4pID0+IHtcbiAgICB0eHMgPSBzb3J0QnkodHhzLCAodHgpID0+IHR4LmluY2x1c2lvbkhlaWdodCk7XG4gICAgY29uc3QgZ3JvdXBlZFR4cyA9IGdyb3VwQnkodHhzLCAodHgpID0+IHR4LmJsb2NrSWQpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYFRoZSB0cmFuc2FjdGlvbiBiYXRjaCBncm91cGVkIHRvICR7XG4gICAgICAgIE9iamVjdC5rZXlzKGdyb3VwZWRUeHMpLmxlbmd0aFxuICAgICAgfSBibG9ja3NgLFxuICAgICk7XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHRoaXMuZGJNdXRleC5hY3F1aXJlKCk7XG4gICAgZm9yIChjb25zdCBibG9ja0lkIGluIGdyb3VwZWRUeHMpIHtcbiAgICAgIGNvbnN0IGJsb2NrVHhzID0gZ3JvdXBlZFR4c1tibG9ja0lkXTtcbiAgICAgIGNvbnN0IGJsb2NrID0geyBoYXNoOiBibG9ja0lkLCBoZWlnaHQ6IGJsb2NrVHhzWzBdLmluY2x1c2lvbkhlaWdodCB9O1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBQcm9jZXNzaW5nIHRyYW5zYWN0aW9ucyBhdCBoZWlnaHQgJHtibG9ja1R4c1swXS5pbmNsdXNpb25IZWlnaHR9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5wcm9jZXNzVHJhbnNhY3Rpb25zKGJsb2NrVHhzLCBibG9jayk7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgUHJvY2Vzc2luZyB0cmFuc2FjdGlvbnMgZmFpbGVkIGF0IGhlaWdodCAke2Jsb2NrVHhzWzBdLmluY2x1c2lvbkhlaWdodH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZWxlYXNlKCk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYHN0b3Jpbmcgc3BlbmQgaW5mbyBvZiB0cmFuc2FjdGlvbiBiYXRjaGApO1xuICAgIGF3YWl0IHRoaXMuc3RvcmVFeHRyYUluZm8odHhzKTtcbiAgfTtcblxuICAvKipcbiAgICogcmVtb3ZlIGFsbCBvbGQgZGF0YSBhbmQgaW5pdGlhbGl6ZSBleHRyYWN0b3IgZGF0YWJhc2Ugd2l0aCBkYXRhIGNyZWF0ZWRcbiAgICogYmVsb3cgdGhlIGluaXRpYWwgaGVpZ2h0IGFuZCBmaW5hbGx5IGFwcGx5IHRoZSBzdG9yZWQgc3BlbmQgcmVjb3JkcyB0byBtYWtlXG4gICAqIHN1cmUgYWxsIHN0b3JlZCBkYXRhIGlzIHZhbGlkXG4gICAqIGlnbm9yZSBpbml0aWFsaXphdGlvbiBpZiB0aGlzIGZlYXR1cmUgaXMgb2ZmXG4gICAqIEBwYXJhbSBpbml0aWFsQmxvY2tcbiAgICovXG4gIGluaXRpYWxpemVEYXRhID0gYXN5bmMgKGluaXRpYWxCbG9jazogQmxvY2tJbmZvKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhgSW5pdGlhbGl6YXRpb24gcHJvY2VzcyBmb3IgJHt0aGlzLmV4dHJhY3RvcklkfSBzdGFydGVkYCk7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25zLnJlbW92ZUFsbERhdGEodGhpcy5leHRyYWN0b3JJZCk7XG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXphdGlvblN0cmF0ZWd5LmluaXRpYWxpemUoaW5pdGlhbEJsb2NrKTtcbiAgICBhd2FpdCB0aGlzLmFwcGx5RXh0cmFJbmZvKCk7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgIGBJbml0aWFsaXphdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGZvciAke3RoaXMuZXh0cmFjdG9ySWR9YCxcbiAgICApO1xuICB9O1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/ergo/initializers/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './ergoInitializer';
|
|
2
|
+
export * from './ergoBoxInitializer';
|
|
3
|
+
export * from './strategies';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXJnby9pbml0aWFsaXplcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9lcmdvSW5pdGlhbGl6ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9lcmdvQm94SW5pdGlhbGl6ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zdHJhdGVnaWVzJztcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/initializers/strategies/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,8BAA8B,OAAO,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export const DELAY_BETWEEN_INIT_REQUESTS = 100; // In milliseconds (only applies to node initialization)
|
|
2
|
+
export const INIT_WORKERS_REASSIGN_INTERVAL = 5000; //milliseconds (only applies to explorer initialization)
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2VyZ28vaW5pdGlhbGl6ZXJzL3N0cmF0ZWdpZXMvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEdBQUcsQ0FBQyxDQUFDLHdEQUF3RDtBQUN4RyxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLENBQUMsQ0FBQyx3REFBd0QiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgREVMQVlfQkVUV0VFTl9JTklUX1JFUVVFU1RTID0gMTAwOyAvLyBJbiBtaWxsaXNlY29uZHMgKG9ubHkgYXBwbGllcyB0byBub2RlIGluaXRpYWxpemF0aW9uKVxuZXhwb3J0IGNvbnN0IElOSVRfV09SS0VSU19SRUFTU0lHTl9JTlRFUlZBTCA9IDUwMDA7IC8vbWlsbGlzZWNvbmRzIChvbmx5IGFwcGxpZXMgdG8gZXhwbG9yZXIgaW5pdGlhbGl6YXRpb24pXG4iXX0=
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { BlockInfo, Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
+
import { ExtendedTransaction } from '../../interfaces';
|
|
4
|
+
export declare class ExplorerInitializationStrategy {
|
|
5
|
+
private address;
|
|
6
|
+
private maxWorkers;
|
|
7
|
+
private processTransactions;
|
|
8
|
+
private processTransactionBatch;
|
|
9
|
+
private logger;
|
|
10
|
+
private network;
|
|
11
|
+
private extraLargeBlocks;
|
|
12
|
+
private promiseQueue;
|
|
13
|
+
private workerManager;
|
|
14
|
+
constructor(url: string, address: string, maxWorkers: number, processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>, processTransactionBatch: (txs: ExtendedTransaction[]) => Promise<void>, logger?: DummyLogger);
|
|
15
|
+
/**
|
|
16
|
+
* Get height range transaction count
|
|
17
|
+
* retry the request to avoid failure in case of accidental network issues
|
|
18
|
+
* @param fromHeight
|
|
19
|
+
* @param toHeight
|
|
20
|
+
* @returns transaction count
|
|
21
|
+
*/
|
|
22
|
+
private getRangeTxCount;
|
|
23
|
+
/**
|
|
24
|
+
* Get height range transactions and process them
|
|
25
|
+
* retry the request to avoid failure in case of accidental network issues
|
|
26
|
+
* @param rangeQuery
|
|
27
|
+
*/
|
|
28
|
+
private processRange;
|
|
29
|
+
/**
|
|
30
|
+
* Get block id in the specified height and process the block
|
|
31
|
+
* add the block to extra large blocks
|
|
32
|
+
* @param height
|
|
33
|
+
*/
|
|
34
|
+
private processBlockAtHeight;
|
|
35
|
+
/**
|
|
36
|
+
* Get block transactions and process them
|
|
37
|
+
* retry the request to avoid failure in case of accidental network issues
|
|
38
|
+
* @param block
|
|
39
|
+
*/
|
|
40
|
+
private processBlock;
|
|
41
|
+
/**
|
|
42
|
+
* Start the worker on the assigned range
|
|
43
|
+
* - worker process the range and split it to smaller ones if it's not processable
|
|
44
|
+
* - a range is processable if:
|
|
45
|
+
* 1- has less than or equal to API_LIMIT transactions (Uses processRange)
|
|
46
|
+
* 2- contains a single block (uses processBlockAtHeight)
|
|
47
|
+
* - after processing a range, all older ranges are updated accordingly
|
|
48
|
+
* - to optimize the workflow, the worker selects the biggest processable
|
|
49
|
+
* range from top of the range list
|
|
50
|
+
* @param workerIndex
|
|
51
|
+
*/
|
|
52
|
+
private startWorker;
|
|
53
|
+
/**
|
|
54
|
+
* Initialize extractor using Explorer network
|
|
55
|
+
* @param initialBlock
|
|
56
|
+
*/
|
|
57
|
+
initialize: (initialBlock: BlockInfo) => Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=explorerInitializationStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explorerInitializationStrategy.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/initializers/strategies/explorerInitializationStrategy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAG1E,OAAO,EAAE,mBAAmB,EAAc,MAAM,kBAAkB,CAAC;AAMnE,qBAAa,8BAA8B;IAQvC,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,uBAAuB;IAG/B,OAAO,CAAC,MAAM;IAhBhB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,gBAAgB,CAAc;IACtC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAAgB;gBAGnC,GAAG,EAAE,MAAM,EACH,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,CAC3B,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,SAAS,KACb,OAAO,CAAC,OAAO,CAAC,EACb,uBAAuB,EAAE,CAC/B,GAAG,EAAE,mBAAmB,EAAE,KACvB,OAAO,CAAC,IAAI,CAAC,EACV,MAAM,cAAoB;IAYpC;;;;;;OAMG;IACH,OAAO,CAAC,eAAe,CAarB;IAEF;;;;OAIG;IACH,OAAO,CAAC,YAAY,CA2BlB;IAEF;;;;OAIG;IACH,OAAO,CAAC,oBAAoB,CAS1B;IAEF;;;;OAIG;IACH,OAAO,CAAC,YAAY,CASlB;IAEF;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW,CA+BjB;IAEF;;;OAGG;IACH,UAAU,GAAU,cAAc,SAAS,mBA0BzC;CACH"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import PQueue from 'p-queue';
|
|
2
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
+
import { API_LIMIT } from '../../../constants';
|
|
4
|
+
import { ExplorerNetwork } from '../../networks/explorerNetwork';
|
|
5
|
+
import { requestWithRetrial } from '../../utils';
|
|
6
|
+
import { INIT_WORKERS_REASSIGN_INTERVAL } from './constants';
|
|
7
|
+
import { WorkerManager } from './workerManager';
|
|
8
|
+
export class ExplorerInitializationStrategy {
|
|
9
|
+
address;
|
|
10
|
+
maxWorkers;
|
|
11
|
+
processTransactions;
|
|
12
|
+
processTransactionBatch;
|
|
13
|
+
logger;
|
|
14
|
+
network;
|
|
15
|
+
extraLargeBlocks;
|
|
16
|
+
promiseQueue;
|
|
17
|
+
workerManager;
|
|
18
|
+
constructor(url, address, maxWorkers, processTransactions, processTransactionBatch, logger = new DummyLogger()) {
|
|
19
|
+
this.address = address;
|
|
20
|
+
this.maxWorkers = maxWorkers;
|
|
21
|
+
this.processTransactions = processTransactions;
|
|
22
|
+
this.processTransactionBatch = processTransactionBatch;
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
this.network = new ExplorerNetwork(url);
|
|
25
|
+
this.extraLargeBlocks = [];
|
|
26
|
+
this.promiseQueue = new PQueue({ concurrency: maxWorkers });
|
|
27
|
+
this.workerManager = new WorkerManager(this.maxWorkers, this.getRangeTxCount, this.logger);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get height range transaction count
|
|
31
|
+
* retry the request to avoid failure in case of accidental network issues
|
|
32
|
+
* @param fromHeight
|
|
33
|
+
* @param toHeight
|
|
34
|
+
* @returns transaction count
|
|
35
|
+
*/
|
|
36
|
+
getRangeTxCount = async (fromHeight, toHeight) => {
|
|
37
|
+
return (await requestWithRetrial(() => this.network.getAddressTransactionsWithHeight(this.address, fromHeight, toHeight, 1), this.logger)).total;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Get height range transactions and process them
|
|
41
|
+
* retry the request to avoid failure in case of accidental network issues
|
|
42
|
+
* @param rangeQuery
|
|
43
|
+
*/
|
|
44
|
+
processRange = async (rangeQuery) => {
|
|
45
|
+
if (rangeQuery.count == 0) {
|
|
46
|
+
this.logger.debug(`skipping range [${rangeQuery.start}, ${rangeQuery.end}] with 0 txs`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const txs = await requestWithRetrial(() => this.network.getAddressTransactionsWithHeight(this.address, rangeQuery.start, rangeQuery.end), this.logger);
|
|
50
|
+
if (txs.total != rangeQuery.count)
|
|
51
|
+
this.logger.error(`Impossible behavior: Range query count ${rangeQuery.count} differs from total ${txs.total} for range [${rangeQuery.start}, ${rangeQuery.end}]`);
|
|
52
|
+
this.logger.debug(`Processing started for [${rangeQuery.start}, ${rangeQuery.end}] with ${txs.total} txs`);
|
|
53
|
+
await this.processTransactionBatch(txs.items);
|
|
54
|
+
this.logger.debug(`Processing finished for [${rangeQuery.start}, ${rangeQuery.end}] with ${txs.total} txs`);
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Get block id in the specified height and process the block
|
|
58
|
+
* add the block to extra large blocks
|
|
59
|
+
* @param height
|
|
60
|
+
*/
|
|
61
|
+
processBlockAtHeight = async (height) => {
|
|
62
|
+
const blockId = await requestWithRetrial(() => this.network.getBlockIdAtHeight(height), this.logger);
|
|
63
|
+
const block = { hash: blockId, height: height };
|
|
64
|
+
await this.processBlock(block);
|
|
65
|
+
this.extraLargeBlocks.push(block);
|
|
66
|
+
this.logger.debug(`Added block at height ${height} to extra large blocks`);
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Get block transactions and process them
|
|
70
|
+
* retry the request to avoid failure in case of accidental network issues
|
|
71
|
+
* @param block
|
|
72
|
+
*/
|
|
73
|
+
processBlock = async (block) => {
|
|
74
|
+
const blockTxs = await requestWithRetrial(() => this.network.getBlockTxs(block.hash), this.logger);
|
|
75
|
+
this.logger.debug(`Found ${blockTxs.length} transactions at height ${block.height}`);
|
|
76
|
+
await this.processTransactions(blockTxs, block);
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Start the worker on the assigned range
|
|
80
|
+
* - worker process the range and split it to smaller ones if it's not processable
|
|
81
|
+
* - a range is processable if:
|
|
82
|
+
* 1- has less than or equal to API_LIMIT transactions (Uses processRange)
|
|
83
|
+
* 2- contains a single block (uses processBlockAtHeight)
|
|
84
|
+
* - after processing a range, all older ranges are updated accordingly
|
|
85
|
+
* - to optimize the workflow, the worker selects the biggest processable
|
|
86
|
+
* range from top of the range list
|
|
87
|
+
* @param workerIndex
|
|
88
|
+
*/
|
|
89
|
+
startWorker = async (workerIndex) => {
|
|
90
|
+
while (this.workerManager.isWorkerActive(workerIndex)) {
|
|
91
|
+
const lastRangeQuery = await this.workerManager.getLastRange(workerIndex, API_LIMIT);
|
|
92
|
+
this.logger.debug(`Worker-${workerIndex} is checking range query ${JSON.stringify(lastRangeQuery)}`);
|
|
93
|
+
if (lastRangeQuery.count > API_LIMIT &&
|
|
94
|
+
lastRangeQuery.start != lastRangeQuery.end) {
|
|
95
|
+
// range is not processable
|
|
96
|
+
await this.workerManager.limitLastRange(workerIndex);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// range is processable
|
|
100
|
+
if (lastRangeQuery.count <= API_LIMIT) {
|
|
101
|
+
this.logger.debug(`Processing transactions in range query`);
|
|
102
|
+
await this.processRange(lastRangeQuery);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.logger.debug(`processing extra large block at height ${lastRangeQuery.start}`);
|
|
106
|
+
await this.processBlockAtHeight(lastRangeQuery.start);
|
|
107
|
+
}
|
|
108
|
+
await this.workerManager.popLastRangeQuery(workerIndex);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Initialize extractor using Explorer network
|
|
114
|
+
* @param initialBlock
|
|
115
|
+
*/
|
|
116
|
+
initialize = async (initialBlock) => {
|
|
117
|
+
this.workerManager.setup(initialBlock.height);
|
|
118
|
+
const addWorkerJob = (i) => this.promiseQueue.add(() => this.startWorker(i));
|
|
119
|
+
// Initialize the workers
|
|
120
|
+
await Promise.all(Array.from({ length: this.maxWorkers }, async (_, i) => {
|
|
121
|
+
await this.workerManager.registerWorker(i);
|
|
122
|
+
addWorkerJob(i);
|
|
123
|
+
}));
|
|
124
|
+
// Periodically check for idle workers and reassign a new range to them
|
|
125
|
+
const reassignWorker = setInterval(async () => {
|
|
126
|
+
const newWorkers = await this.workerManager.reassignIdleWorkers();
|
|
127
|
+
if (newWorkers.length > 0) {
|
|
128
|
+
this.logger.debug(`Reassigned workers ${newWorkers}`);
|
|
129
|
+
newWorkers.forEach((workerIndex) => addWorkerJob(workerIndex));
|
|
130
|
+
}
|
|
131
|
+
}, INIT_WORKERS_REASSIGN_INTERVAL);
|
|
132
|
+
// Wait for all workers to finish their jobs
|
|
133
|
+
await this.promiseQueue.onIdle();
|
|
134
|
+
// Stop reassigning interval
|
|
135
|
+
clearInterval(reassignWorker);
|
|
136
|
+
for (const block of this.extraLargeBlocks) {
|
|
137
|
+
await this.processBlock(block);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbG9yZXJJbml0aWFsaXphdGlvblN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2VyZ28vaW5pdGlhbGl6ZXJzL3N0cmF0ZWdpZXMvZXhwbG9yZXJJbml0aWFsaXphdGlvblN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUU3QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxNQUFNLE9BQU8sOEJBQThCO0lBUS9CO0lBQ0E7SUFDQTtJQUlBO0lBR0E7SUFoQkYsT0FBTyxDQUFrQjtJQUN6QixnQkFBZ0IsQ0FBYztJQUM5QixZQUFZLENBQVM7SUFDckIsYUFBYSxDQUFnQjtJQUVyQyxZQUNFLEdBQVcsRUFDSCxPQUFlLEVBQ2YsVUFBa0IsRUFDbEIsbUJBR2EsRUFDYix1QkFFVSxFQUNWLFNBQVMsSUFBSSxXQUFXLEVBQUU7UUFUMUIsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUdOO1FBQ2IsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUViO1FBQ1YsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFFbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcs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RyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNsRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNqRSxDQUFDO1FBQ0gsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDbkMsNENBQTRDO1FBQzVDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQyw0QkFBNEI7UUFDNUIsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQUXVldWUgZnJvbSAncC1xdWV1ZSc7XG5cbmltcG9ydCB7IER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgQmxvY2tJbmZvLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgQVBJX0xJTUlUIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEV4dGVuZGVkVHJhbnNhY3Rpb24sIFJhbmdlUXVlcnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEV4cGxvcmVyTmV0d29yayB9IGZyb20gJy4uLy4uL25ldHdvcmtzL2V4cGxvcmVyTmV0d29yayc7XG5pbXBvcnQgeyByZXF1ZXN0V2l0aFJldHJpYWwgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBJTklUX1dPUktFUlNfUkVBU1NJR05fSU5URVJWQUwgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBXb3JrZXJNYW5hZ2VyIH0gZnJvbSAnLi93b3JrZXJNYW5hZ2VyJztcblxuZXhwb3J0IGNsYXNzIEV4cGxvcmVySW5pdGlhbGl6YXRpb25TdHJhdGVneSB7XG4gIHByaXZhdGUgbmV0d29yazogRXhwbG9yZXJOZXR3b3JrO1xuICBwcml2YXRlIGV4dHJhTGFyZ2VCbG9ja3M6IEJsb2NrSW5mb1tdO1xuICBwcml2YXRlIHByb21pc2VRdWV1ZTogUFF1ZXVlO1xuICBwcml2YXRlIHdvcmtlck1hbmFnZXI6IFdvcmtlck1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBhZGRyZXNzOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBtYXhXb3JrZXJzOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBwcm9jZXNzVHJhbnNhY3Rpb25zOiAoXG4gICAgICB0eHM6IFRyYW5zYWN0aW9uW10sXG4gICAgICBibG9jazogQmxvY2tJbmZvLFxuICAgICkgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgICBwcml2YXRlIHByb2Nlc3NUcmFuc2FjdGlvbkJhdGNoOiAoXG4gICAgICB0eHM6IEV4dGVuZGVkVHJhbnNhY3Rpb25bXSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gICAgcHJpdmF0ZSBsb2dnZXIgPSBuZXcgRHVtbXlMb2dnZXIoKSxcbiAgKSB7XG4gICAgdGhpcy5uZXR3b3JrID0gbmV3IEV4cGxvcmVyTmV0d29yayh1cmwpO1xuICAgIHRoaXMuZXh0cmFMYXJnZUJsb2NrcyA9IFtdO1xuICAgIHRoaXMucHJvbWlzZVF1ZXVlID0gbmV3IFBRdWV1ZSh7IGNvbmN1cnJlbmN5OiBtYXhXb3JrZXJzIH0pO1xuICAgIHRoaXMud29ya2VyTWFuYWdlciA9IG5ldyBXb3JrZXJNYW5hZ2VyKFxuICAgICAgdGhpcy5tYXhXb3JrZXJzLFxuICAgICAgdGhpcy5nZXRSYW5nZVR4Q291bnQsXG4gICAgICB0aGlzLmxvZ2dlcixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBoZWlnaHQgcmFuZ2UgdHJhbnNhY3Rpb24gY291bnRcbiAgICogcmV0cnkgdGhlIHJlcXVlc3QgdG8gYXZvaWQgZmFpbHVyZSBpbiBjYXNlIG9mIGFjY2lkZW50YWwgbmV0d29yayBpc3N1ZXNcbiAgICogQHBhcmFtIGZyb21IZWlnaHRcbiAgICogQHBhcmFtIHRvSGVpZ2h0XG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uIGNvdW50XG4gICAqL1xuICBwcml2YXRlIGdldFJhbmdlVHhDb3VudCA9IGFzeW5jIChmcm9tSGVpZ2h0OiBudW1iZXIsIHRvSGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgcmVxdWVzdFdpdGhSZXRyaWFsKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIHRoaXMubmV0d29yay5nZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aEhlaWdodChcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzcyxcbiAgICAgICAgICAgIGZyb21IZWlnaHQsXG4gICAgICAgICAgICB0b0hlaWdodCxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgKSxcbiAgICAgICAgdGhpcy5sb2dnZXIsXG4gICAgICApXG4gICAgKS50b3RhbDtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGhlaWdodCByYW5nZSB0cmFuc2FjdGlvbnMgYW5kIHByb2Nlc3MgdGhlbVxuICAgKiByZXRyeSB0aGUgcmVxdWVzdCB0byBhdm9pZCBmYWlsdXJlIGluIGNhc2Ugb2YgYWNjaWRlbnRhbCBuZXR3b3JrIGlzc3Vlc1xuICAgKiBAcGFyYW0gcmFuZ2VRdWVyeVxuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzUmFuZ2UgPSBhc3luYyAocmFuZ2VRdWVyeTogUmFuZ2VRdWVyeSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChyYW5nZVF1ZXJ5LmNvdW50ID09IDApIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgc2tpcHBpbmcgcmFuZ2UgWyR7cmFuZ2VRdWVyeS5zdGFydH0sICR7cmFuZ2VRdWVyeS5lbmR9XSB3aXRoIDAgdHhzYCxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHR4cyA9IGF3YWl0IHJlcXVlc3RXaXRoUmV0cmlhbChcbiAgICAgICgpID0+XG4gICAgICAgIHRoaXMubmV0d29yay5nZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aEhlaWdodChcbiAgICAgICAgICB0aGlzLmFkZHJlc3MsXG4gICAgICAgICAgcmFuZ2VRdWVyeS5zdGFydCxcbiAgICAgICAgICByYW5nZVF1ZXJ5LmVuZCxcbiAgICAgICAgKSxcbiAgICAgIHRoaXMubG9nZ2VyLFxuICAgICk7XG4gICAgaWYgKHR4cy50b3RhbCAhPSByYW5nZVF1ZXJ5LmNvdW50KVxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBJbXBvc3NpYmxlIGJlaGF2aW9yOiBSYW5nZSBxdWVyeSBjb3VudCAke3JhbmdlUXVlcnkuY291bnR9IGRpZmZlcnMgZnJvbSB0b3RhbCAke3R4cy50b3RhbH0gZm9yIHJhbmdlIFske3JhbmdlUXVlcnkuc3RhcnR9LCAke3JhbmdlUXVlcnkuZW5kfV1gLFxuICAgICAgKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBQcm9jZXNzaW5nIHN0YXJ0ZWQgZm9yIFske3JhbmdlUXVlcnkuc3RhcnR9LCAke3JhbmdlUXVlcnkuZW5kfV0gd2l0aCAke3R4cy50b3RhbH0gdHhzYCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2godHhzLml0ZW1zKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBQcm9jZXNzaW5nIGZpbmlzaGVkIGZvciBbJHtyYW5nZVF1ZXJ5LnN0YXJ0fSwgJHtyYW5nZVF1ZXJ5LmVuZH1dIHdpdGggJHt0eHMudG90YWx9IHR4c2AsXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGJsb2NrIGlkIGluIHRoZSBzcGVjaWZpZWQgaGVpZ2h0IGFuZCBwcm9jZXNzIHRoZSBibG9ja1xuICAgKiBhZGQgdGhlIGJsb2NrIHRvIGV4dHJhIGxhcmdlIGJsb2Nrc1xuICAgKiBAcGFyYW0gaGVpZ2h0XG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NCbG9ja0F0SGVpZ2h0ID0gYXN5bmMgKGhlaWdodDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgYmxvY2tJZCA9IGF3YWl0IHJlcXVlc3RXaXRoUmV0cmlhbChcbiAgICAgICgpID0+IHRoaXMubmV0d29yay5nZXRCbG9ja0lkQXRIZWlnaHQoaGVpZ2h0KSxcbiAgICAgIHRoaXMubG9nZ2VyLFxuICAgICk7XG4gICAgY29uc3QgYmxvY2sgPSB7IGhhc2g6IGJsb2NrSWQsIGhlaWdodDogaGVpZ2h0IH07XG4gICAgYXdhaXQgdGhpcy5wcm9jZXNzQmxvY2soYmxvY2spO1xuICAgIHRoaXMuZXh0cmFMYXJnZUJsb2Nrcy5wdXNoKGJsb2NrKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQWRkZWQgYmxvY2sgYXQgaGVpZ2h0ICR7aGVpZ2h0fSB0byBleHRyYSBsYXJnZSBibG9ja3NgKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGJsb2NrIHRyYW5zYWN0aW9ucyBhbmQgcHJvY2VzcyB0aGVtXG4gICAqIHJldHJ5IHRoZSByZXF1ZXN0IHRvIGF2b2lkIGZhaWx1cmUgaW4gY2FzZSBvZiBhY2NpZGVudGFsIG5ldHdvcmsgaXNzdWVzXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKi9cbiAgcHJpdmF0ZSBwcm9jZXNzQmxvY2sgPSBhc3luYyAoYmxvY2s6IEJsb2NrSW5mbykgPT4ge1xuICAgIGNvbnN0IGJsb2NrVHhzID0gYXdhaXQgcmVxdWVzdFdpdGhSZXRyaWFsKFxuICAgICAgKCkgPT4gdGhpcy5uZXR3b3JrLmdldEJsb2NrVHhzKGJsb2NrLmhhc2gpLFxuICAgICAgdGhpcy5sb2dnZXIsXG4gICAgKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBGb3VuZCAke2Jsb2NrVHhzLmxlbmd0aH0gdHJhbnNhY3Rpb25zIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH1gLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5wcm9jZXNzVHJhbnNhY3Rpb25zKGJsb2NrVHhzLCBibG9jayk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSB3b3JrZXIgb24gdGhlIGFzc2lnbmVkIHJhbmdlXG4gICAqIC0gd29ya2VyIHByb2Nlc3MgdGhlIHJhbmdlIGFuZCBzcGxpdCBpdCB0byBzbWFsbGVyIG9uZXMgaWYgaXQncyBub3QgcHJvY2Vzc2FibGVcbiAgICogLSBhIHJhbmdlIGlzIHByb2Nlc3NhYmxlIGlmOlxuICAgKiAgICAxLSBoYXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIEFQSV9MSU1JVCB0cmFuc2FjdGlvbnMgKFVzZXMgcHJvY2Vzc1JhbmdlKVxuICAgKiAgICAyLSBjb250YWlucyBhIHNpbmdsZSBibG9jayAodXNlcyBwcm9jZXNzQmxvY2tBdEhlaWdodClcbiAgICogLSBhZnRlciBwcm9jZXNzaW5nIGEgcmFuZ2UsIGFsbCBvbGRlciByYW5nZXMgYXJlIHVwZGF0ZWQgYWNjb3JkaW5nbHlcbiAgICogLSB0byBvcHRpbWl6ZSB0aGUgd29ya2Zsb3csIHRoZSB3b3JrZXIgc2VsZWN0cyB0aGUgYmlnZ2VzdCBwcm9jZXNzYWJsZVxuICAgKiAgICByYW5nZSBmcm9tIHRvcCBvZiB0aGUgcmFuZ2UgbGlzdFxuICAgKiBAcGFyYW0gd29ya2VySW5kZXhcbiAgICovXG4gIHByaXZhdGUgc3RhcnRXb3JrZXIgPSBhc3luYyAod29ya2VySW5kZXg6IG51bWJlcikgPT4ge1xuICAgIHdoaWxlICh0aGlzLndvcmtlck1hbmFnZXIuaXNXb3JrZXJBY3RpdmUod29ya2VySW5kZXgpKSB7XG4gICAgICBjb25zdCBsYXN0UmFuZ2VRdWVyeSA9IGF3YWl0IHRoaXMud29ya2VyTWFuYWdlci5nZXRMYXN0UmFuZ2UoXG4gICAgICAgIHdvcmtlckluZGV4LFxuICAgICAgICBBUElfTElNSVQsXG4gICAgICApO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBXb3JrZXItJHt3b3JrZXJJbmRleH0gaXMgY2hlY2tpbmcgcmFuZ2UgcXVlcnkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBsYXN0UmFuZ2VRdWVyeSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgbGFzdFJhbmdlUXVlcnkuY291bnQgPiBBUElfTElNSVQgJiZcbiAgICAgICAgbGFzdFJhbmdlUXVlcnkuc3RhcnQgIT0gbGFzdFJhbmdlUXVlcnkuZW5kXG4gICAgICApIHtcbiAgICAgICAgLy8gcmFuZ2UgaXMgbm90IHByb2Nlc3NhYmxlXG4gICAgICAgIGF3YWl0IHRoaXMud29ya2VyTWFuYWdlci5saW1pdExhc3RSYW5nZSh3b3JrZXJJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByYW5nZSBpcyBwcm9jZXNzYWJsZVxuICAgICAgICBpZiAobGFzdFJhbmdlUXVlcnkuY291bnQgPD0gQVBJX0xJTUlUKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFByb2Nlc3NpbmcgdHJhbnNhY3Rpb25zIGluIHJhbmdlIHF1ZXJ5YCk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzUmFuZ2UobGFzdFJhbmdlUXVlcnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYHByb2Nlc3NpbmcgZXh0cmEgbGFyZ2UgYmxvY2sgYXQgaGVpZ2h0ICR7bGFzdFJhbmdlUXVlcnkuc3RhcnR9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Jsb2NrQXRIZWlnaHQobGFzdFJhbmdlUXVlcnkuc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMud29ya2VyTWFuYWdlci5wb3BMYXN0UmFuZ2VRdWVyeSh3b3JrZXJJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGV4dHJhY3RvciB1c2luZyBFeHBsb3JlciBuZXR3b3JrXG4gICAqIEBwYXJhbSBpbml0aWFsQmxvY2tcbiAgICovXG4gIGluaXRpYWxpemUgPSBhc3luYyAoaW5pdGlhbEJsb2NrOiBCbG9ja0luZm8pID0+IHtcbiAgICB0aGlzLndvcmtlck1hbmFnZXIuc2V0dXAoaW5pdGlhbEJsb2NrLmhlaWdodCk7XG4gICAgY29uc3QgYWRkV29ya2VySm9iID0gKGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMucHJvbWlzZVF1ZXVlLmFkZCgoKSA9PiB0aGlzLnN0YXJ0V29ya2VyKGkpKTtcbiAgICAvLyBJbml0aWFsaXplIHRoZSB3b3JrZXJzXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLm1heFdvcmtlcnMgfSwgYXN5bmMgKF8sIGkpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZXJNYW5hZ2VyLnJlZ2lzdGVyV29ya2VyKGkpO1xuICAgICAgICBhZGRXb3JrZXJKb2IoaSk7XG4gICAgICB9KSxcbiAgICApO1xuICAgIC8vIFBlcmlvZGljYWxseSBjaGVjayBmb3IgaWRsZSB3b3JrZXJzIGFuZCByZWFzc2lnbiBhIG5ldyByYW5nZSB0byB0aGVtXG4gICAgY29uc3QgcmVhc3NpZ25Xb3JrZXIgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBuZXdXb3JrZXJzID0gYXdhaXQgdGhpcy53b3JrZXJNYW5hZ2VyLnJlYXNzaWduSWRsZVdvcmtlcnMoKTtcbiAgICAgIGlmIChuZXdXb3JrZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFJlYXNzaWduZWQgd29ya2VycyAke25ld1dvcmtlcnN9YCk7XG4gICAgICAgIG5ld1dvcmtlcnMuZm9yRWFjaCgod29ya2VySW5kZXgpID0+IGFkZFdvcmtlckpvYih3b3JrZXJJbmRleCkpO1xuICAgICAgfVxuICAgIH0sIElOSVRfV09SS0VSU19SRUFTU0lHTl9JTlRFUlZBTCk7XG4gICAgLy8gV2FpdCBmb3IgYWxsIHdvcmtlcnMgdG8gZmluaXNoIHRoZWlyIGpvYnNcbiAgICBhd2FpdCB0aGlzLnByb21pc2VRdWV1ZS5vbklkbGUoKTtcbiAgICAvLyBTdG9wIHJlYXNzaWduaW5nIGludGVydmFsXG4gICAgY2xlYXJJbnRlcnZhbChyZWFzc2lnbldvcmtlcik7XG4gICAgZm9yIChjb25zdCBibG9jayBvZiB0aGlzLmV4dHJhTGFyZ2VCbG9ja3MpIHtcbiAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0Jsb2NrKGJsb2NrKTtcbiAgICB9XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/initializers/strategies/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './explorerInitializationStrategy';
|
|
2
|
+
export * from './nodeInitializationStrategy';
|
|
3
|
+
export * from './workerManager';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvZXJnby9pbml0aWFsaXplcnMvc3RyYXRlZ2llcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZXhwbG9yZXJJbml0aWFsaXphdGlvblN0cmF0ZWd5JztcbmV4cG9ydCAqIGZyb20gJy4vbm9kZUluaXRpYWxpemF0aW9uU3RyYXRlZ3knO1xuZXhwb3J0ICogZnJvbSAnLi93b3JrZXJNYW5hZ2VyJztcbiJdfQ==
|