@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.
Files changed (104) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/abstractExtractor.d.ts +24 -12
  3. package/dist/abstractExtractor.d.ts.map +1 -1
  4. package/dist/abstractExtractor.js +1 -1
  5. package/dist/constants.d.ts +1 -0
  6. package/dist/constants.d.ts.map +1 -1
  7. package/dist/constants.js +2 -1
  8. package/dist/ergo/database/actions/abstractErgoAction.d.ts +83 -0
  9. package/dist/ergo/database/actions/abstractErgoAction.d.ts.map +1 -0
  10. package/dist/ergo/database/actions/abstractErgoAction.js +167 -0
  11. package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts +31 -0
  12. package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts.map +1 -0
  13. package/dist/ergo/database/actions/abstractErgoBoxAction.js +70 -0
  14. package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts +18 -0
  15. package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts.map +1 -0
  16. package/dist/ergo/database/entities/abstractErgoBoxEntity.js +36 -0
  17. package/dist/ergo/database/entities/abstractErgoEntity.d.ts +26 -0
  18. package/dist/ergo/database/entities/abstractErgoEntity.d.ts.map +1 -0
  19. package/dist/ergo/database/entities/abstractErgoEntity.js +64 -0
  20. package/dist/ergo/database/index.d.ts +5 -0
  21. package/dist/ergo/database/index.d.ts.map +1 -0
  22. package/dist/ergo/database/index.js +5 -0
  23. package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts +67 -0
  24. package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts.map +1 -0
  25. package/dist/ergo/extractors/abstractErgoBoxExtractor.js +106 -0
  26. package/dist/ergo/extractors/abstractErgoExtractor.d.ts +53 -0
  27. package/dist/ergo/extractors/abstractErgoExtractor.d.ts.map +1 -0
  28. package/dist/ergo/extractors/abstractErgoExtractor.js +92 -0
  29. package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts +56 -0
  30. package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts.map +1 -0
  31. package/dist/ergo/extractors/abstractErgoTxExtractor.js +81 -0
  32. package/dist/ergo/extractors/index.d.ts +4 -0
  33. package/dist/ergo/extractors/index.d.ts.map +1 -0
  34. package/dist/ergo/extractors/index.js +4 -0
  35. package/dist/ergo/index.d.ts +5 -7
  36. package/dist/ergo/index.d.ts.map +1 -1
  37. package/dist/ergo/index.js +6 -8
  38. package/dist/ergo/initializers/ergoBoxInitializer.d.ts +36 -0
  39. package/dist/ergo/initializers/ergoBoxInitializer.d.ts.map +1 -0
  40. package/dist/ergo/initializers/ergoBoxInitializer.js +80 -0
  41. package/dist/ergo/initializers/ergoInitializer.d.ts +39 -0
  42. package/dist/ergo/initializers/ergoInitializer.d.ts.map +1 -0
  43. package/dist/ergo/initializers/ergoInitializer.js +80 -0
  44. package/dist/ergo/initializers/index.d.ts +4 -0
  45. package/dist/ergo/initializers/index.d.ts.map +1 -0
  46. package/dist/ergo/initializers/index.js +4 -0
  47. package/dist/ergo/initializers/strategies/constants.d.ts +3 -0
  48. package/dist/ergo/initializers/strategies/constants.d.ts.map +1 -0
  49. package/dist/ergo/initializers/strategies/constants.js +3 -0
  50. package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts +59 -0
  51. package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts.map +1 -0
  52. package/dist/ergo/initializers/strategies/explorerInitializationStrategy.js +141 -0
  53. package/dist/ergo/initializers/strategies/index.d.ts +4 -0
  54. package/dist/ergo/initializers/strategies/index.d.ts.map +1 -0
  55. package/dist/ergo/initializers/strategies/index.js +4 -0
  56. package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts +29 -0
  57. package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts.map +1 -0
  58. package/dist/ergo/initializers/strategies/nodeInitializationStrategy.js +66 -0
  59. package/dist/ergo/initializers/strategies/workerManager.d.ts +79 -0
  60. package/dist/ergo/initializers/strategies/workerManager.d.ts.map +1 -0
  61. package/dist/ergo/initializers/strategies/workerManager.js +183 -0
  62. package/dist/ergo/interfaces.d.ts +31 -17
  63. package/dist/ergo/interfaces.d.ts.map +1 -1
  64. package/dist/ergo/interfaces.js +1 -1
  65. package/dist/ergo/networks/explorerNetwork.d.ts +52 -0
  66. package/dist/ergo/networks/explorerNetwork.d.ts.map +1 -0
  67. package/dist/ergo/networks/explorerNetwork.js +127 -0
  68. package/dist/ergo/networks/index.d.ts +3 -0
  69. package/dist/ergo/networks/index.d.ts.map +1 -0
  70. package/dist/ergo/networks/index.js +3 -0
  71. package/dist/ergo/networks/nodeNetwork.d.ts +28 -0
  72. package/dist/ergo/networks/nodeNetwork.d.ts.map +1 -0
  73. package/dist/ergo/networks/nodeNetwork.js +59 -0
  74. package/dist/ergo/utils.d.ts +15 -0
  75. package/dist/ergo/utils.d.ts.map +1 -1
  76. package/dist/ergo/utils.js +34 -1
  77. package/package.json +3 -1
  78. package/dist/ergo/abstractErgoExtractor.d.ts +0 -80
  79. package/dist/ergo/abstractErgoExtractor.d.ts.map +0 -1
  80. package/dist/ergo/abstractErgoExtractor.js +0 -142
  81. package/dist/ergo/abstractErgoExtractorAction.d.ts +0 -89
  82. package/dist/ergo/abstractErgoExtractorAction.d.ts.map +0 -1
  83. package/dist/ergo/abstractErgoExtractorAction.js +0 -219
  84. package/dist/ergo/abstractErgoExtractorEntity.d.ts +0 -11
  85. package/dist/ergo/abstractErgoExtractorEntity.d.ts.map +0 -1
  86. package/dist/ergo/abstractErgoExtractorEntity.js +0 -57
  87. package/dist/ergo/initializable/abstractInitializable.d.ts +0 -48
  88. package/dist/ergo/initializable/abstractInitializable.d.ts.map +0 -1
  89. package/dist/ergo/initializable/abstractInitializable.js +0 -162
  90. package/dist/ergo/initializable/abstractInitializableAction.d.ts +0 -14
  91. package/dist/ergo/initializable/abstractInitializableAction.d.ts.map +0 -1
  92. package/dist/ergo/initializable/abstractInitializableAction.js +0 -16
  93. package/dist/ergo/initializable/index.d.ts +0 -3
  94. package/dist/ergo/initializable/index.d.ts.map +0 -1
  95. package/dist/ergo/initializable/index.js +0 -3
  96. package/dist/ergo/network/abstractNetwork.d.ts +0 -26
  97. package/dist/ergo/network/abstractNetwork.d.ts.map +0 -1
  98. package/dist/ergo/network/abstractNetwork.js +0 -3
  99. package/dist/ergo/network/explorerNetwork.d.ts +0 -74
  100. package/dist/ergo/network/explorerNetwork.d.ts.map +0 -1
  101. package/dist/ergo/network/explorerNetwork.js +0 -185
  102. package/dist/ergo/network/nodeNetwork.d.ts +0 -60
  103. package/dist/ergo/network/nodeNetwork.d.ts.map +0 -1
  104. package/dist/ergo/network/nodeNetwork.js +0 -131
@@ -1,10 +1,8 @@
1
- export * from './abstractErgoExtractor';
2
- export * from './abstractErgoExtractorAction';
1
+ export * from './extractors';
2
+ export * from './initializers';
3
+ export * from './database';
3
4
  export * from './interfaces';
4
- export * from './network/explorerNetwork';
5
- export * from './network/nodeNetwork';
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/ergo/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,+BAA+B,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"}
@@ -1,10 +1,8 @@
1
- export * from './abstractErgoExtractor';
2
- export * from './abstractErgoExtractorAction';
1
+ export * from './extractors';
2
+ export * from './initializers';
3
+ export * from './database';
3
4
  export * from './interfaces';
4
- export * from './network/explorerNetwork';
5
- export * from './network/nodeNetwork';
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
- //# 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,4 @@
1
+ export * from './ergoInitializer';
2
+ export * from './ergoBoxInitializer';
3
+ export * from './strategies';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export declare const DELAY_BETWEEN_INIT_REQUESTS = 100;
2
+ export declare const INIT_WORKERS_REASSIGN_INTERVAL = 5000;
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -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,4 @@
1
+ export * from './explorerInitializationStrategy';
2
+ export * from './nodeInitializationStrategy';
3
+ export * from './workerManager';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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==