@subql/node-ethereum 2.0.1 → 2.0.2-1

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 (100) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/configure/SubqueryProject.d.ts +2 -4
  3. package/dist/configure/SubqueryProject.js +17 -17
  4. package/dist/configure/SubqueryProject.js.map +1 -1
  5. package/dist/configure/configure.module.d.ts +1 -4
  6. package/dist/configure/configure.module.js +24 -71
  7. package/dist/configure/configure.module.js.map +1 -1
  8. package/dist/ethereum/api.ethereum.d.ts +8 -6
  9. package/dist/ethereum/api.ethereum.js +13 -6
  10. package/dist/ethereum/api.ethereum.js.map +1 -1
  11. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +1 -0
  12. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
  13. package/dist/indexer/dictionary.service.js +1 -1
  14. package/dist/indexer/dictionary.service.js.map +1 -1
  15. package/dist/indexer/ds-processor.service.d.ts +4 -21
  16. package/dist/indexer/ds-processor.service.js +6 -97
  17. package/dist/indexer/ds-processor.service.js.map +1 -1
  18. package/dist/indexer/dynamic-ds.service.js +1 -1
  19. package/dist/indexer/dynamic-ds.service.js.map +1 -1
  20. package/dist/indexer/fetch.module.js +8 -1
  21. package/dist/indexer/fetch.module.js.map +1 -1
  22. package/dist/indexer/fetch.service.d.ts +18 -43
  23. package/dist/indexer/fetch.service.js +28 -286
  24. package/dist/indexer/fetch.service.js.map +1 -1
  25. package/dist/indexer/indexer.manager.d.ts +33 -18
  26. package/dist/indexer/indexer.manager.js +29 -164
  27. package/dist/indexer/indexer.manager.js.map +1 -1
  28. package/dist/indexer/indexer.module.js +0 -1
  29. package/dist/indexer/indexer.module.js.map +1 -1
  30. package/dist/indexer/project.service.d.ts +5 -35
  31. package/dist/indexer/project.service.js +6 -203
  32. package/dist/indexer/project.service.js.map +1 -1
  33. package/dist/indexer/sandbox.service.d.ts +6 -5
  34. package/dist/indexer/sandbox.service.js +14 -18
  35. package/dist/indexer/sandbox.service.js.map +1 -1
  36. package/dist/indexer/unfinalizedBlocks.service.d.ts +10 -33
  37. package/dist/indexer/unfinalizedBlocks.service.js +23 -166
  38. package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
  39. package/dist/indexer/worker/worker.d.ts +2 -1
  40. package/dist/indexer/worker/worker.js.map +1 -1
  41. package/dist/indexer/worker/worker.service.d.ts +2 -8
  42. package/dist/indexer/worker/worker.service.js +1 -3
  43. package/dist/indexer/worker/worker.service.js.map +1 -1
  44. package/dist/indexer/worker/worker.unfinalizedBlocks.service.d.ts +8 -5
  45. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js +10 -0
  46. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js.map +1 -1
  47. package/dist/main.js +4 -1
  48. package/dist/main.js.map +1 -1
  49. package/dist/meta/meta.controller.d.ts +4 -6
  50. package/dist/meta/meta.module.js +1 -52
  51. package/dist/meta/meta.module.js.map +1 -1
  52. package/dist/meta/meta.service.d.ts +7 -40
  53. package/dist/meta/meta.service.js +9 -83
  54. package/dist/meta/meta.service.js.map +1 -1
  55. package/dist/subcommands/forceClean.init.js +1 -2
  56. package/dist/subcommands/forceClean.init.js.map +1 -1
  57. package/dist/subcommands/forceClean.module.js +2 -2
  58. package/dist/subcommands/forceClean.module.js.map +1 -1
  59. package/dist/subcommands/mmrMigrate.init.d.ts +2 -0
  60. package/dist/subcommands/mmrMigrate.init.js +28 -0
  61. package/dist/subcommands/mmrMigrate.init.js.map +1 -0
  62. package/dist/subcommands/mmrMigrate.module.d.ts +4 -0
  63. package/dist/subcommands/mmrMigrate.module.js +48 -0
  64. package/dist/subcommands/mmrMigrate.module.js.map +1 -0
  65. package/dist/subcommands/mmrRegenerate.init.d.ts +1 -0
  66. package/dist/subcommands/mmrRegenerate.init.js +27 -0
  67. package/dist/subcommands/mmrRegenerate.init.js.map +1 -0
  68. package/dist/subcommands/mmrRegenerate.module.d.ts +4 -0
  69. package/dist/subcommands/mmrRegenerate.module.js +46 -0
  70. package/dist/subcommands/mmrRegenerate.module.js.map +1 -0
  71. package/dist/subcommands/reindex.module.js +3 -2
  72. package/dist/subcommands/reindex.module.js.map +1 -1
  73. package/dist/subcommands/reindex.service.d.ts +1 -2
  74. package/dist/subcommands/reindex.service.js +5 -10
  75. package/dist/subcommands/reindex.service.js.map +1 -1
  76. package/dist/subcommands/testing.init.js.map +1 -1
  77. package/dist/subcommands/testing.module.js +1 -0
  78. package/dist/subcommands/testing.module.js.map +1 -1
  79. package/dist/subcommands/testing.service.d.ts +1 -1
  80. package/dist/subcommands/testing.service.js +0 -1
  81. package/dist/subcommands/testing.service.js.map +1 -1
  82. package/dist/utils/project.d.ts +4 -11
  83. package/dist/utils/project.js +9 -138
  84. package/dist/utils/project.js.map +1 -1
  85. package/dist/yargs.d.ts +90 -2
  86. package/dist/yargs.js +113 -0
  87. package/dist/yargs.js.map +1 -1
  88. package/package.json +11 -19
  89. package/dist/configure/configure.module.spec.d.ts +0 -1
  90. package/dist/configure/configure.module.spec.js +0 -26
  91. package/dist/configure/configure.module.spec.js.map +0 -1
  92. package/dist/indexer/unfinalizedBlocks.spec.d.ts +0 -1
  93. package/dist/indexer/unfinalizedBlocks.spec.js +0 -195
  94. package/dist/indexer/unfinalizedBlocks.spec.js.map +0 -1
  95. package/dist/subcommands/forceClean.service.d.ts +0 -10
  96. package/dist/subcommands/forceClean.service.js +0 -89
  97. package/dist/subcommands/forceClean.service.js.map +0 -1
  98. package/dist/utils/reindex.d.ts +0 -6
  99. package/dist/utils/reindex.js +0 -48
  100. package/dist/utils/reindex.js.map +0 -1
@@ -26,90 +26,30 @@ const project_service_1 = require("./project.service");
26
26
  const sandbox_service_1 = require("./sandbox.service");
27
27
  const unfinalizedBlocks_service_1 = require("./unfinalizedBlocks.service");
28
28
  const logger = (0, node_core_1.getLogger)('indexer');
29
- let IndexerManager = class IndexerManager {
29
+ let IndexerManager = class IndexerManager extends node_core_1.BaseIndexerManager {
30
30
  constructor(apiService, nodeConfig, sandboxService, dsProcessorService, dynamicDsService, unfinalizedBlocksService, projectService) {
31
- this.apiService = apiService;
32
- this.nodeConfig = nodeConfig;
33
- this.sandboxService = sandboxService;
34
- this.dsProcessorService = dsProcessorService;
35
- this.dynamicDsService = dynamicDsService;
36
- this.unfinalizedBlocksService = unfinalizedBlocksService;
31
+ super(apiService, nodeConfig, sandboxService, dsProcessorService, dynamicDsService, unfinalizedBlocksService, FilterTypeMap, ProcessorTypeMap);
37
32
  this.projectService = projectService;
38
- logger.info('indexer manager start');
39
- }
40
- async indexBlock(blockContent, dataSources) {
41
- const { block, blockHeight } = blockContent;
42
- let dynamicDsCreated = false;
43
- let reindexBlockHeight = null;
44
- const filteredDataSources = this.filterDataSources(blockHeight, dataSources);
45
- this.assertDataSources(filteredDataSources, blockHeight);
46
- reindexBlockHeight = await this.processUnfinalizedBlocks(block);
47
- // Only index block if we're not going to reindex
48
- if (!reindexBlockHeight) {
49
- await this.indexBlockData(blockContent, filteredDataSources,
50
- // eslint-disable-next-line @typescript-eslint/require-await
51
- async (ds) => {
52
- const vm = this.sandboxService.getDsProcessorWrapper(ds, this.apiService.api, blockContent);
53
- // Inject function to create ds into vm
54
- vm.freeze(async (templateName, args) => {
55
- const newDs = await this.dynamicDsService.createDynamicDatasource({
56
- templateName,
57
- args,
58
- startBlock: blockHeight,
59
- });
60
- // Push the newly created dynamic ds to be processed this block on any future extrinsics/events
61
- filteredDataSources.push(newDs);
62
- dynamicDsCreated = true;
63
- }, 'createDynamicDatasource');
64
- return vm;
65
- });
66
- }
67
- return {
68
- dynamicDsCreated,
69
- blockHash: block.hash,
70
- reindexBlockHeight,
71
- };
33
+ this.isRuntimeDs = common_ethereum_1.isRuntimeDs;
34
+ this.isCustomDs = common_ethereum_1.isCustomDs;
35
+ this.updateCustomProcessor = ds_processor_service_1.asSecondLayerHandlerProcessor_1_0_0;
72
36
  }
73
37
  async start() {
74
38
  await this.projectService.init();
75
39
  logger.info('indexer manager started');
76
40
  }
77
- async processUnfinalizedBlocks(block) {
78
- if (this.nodeConfig.unfinalizedBlocks) {
79
- return this.unfinalizedBlocksService.processUnfinalizedBlocks(block);
80
- }
81
- return null;
41
+ async indexBlock(block, dataSources) {
42
+ return super.internalIndexBlock(block, dataSources, () => this.getApi(block));
82
43
  }
83
- filterDataSources(nextProcessingHeight, dataSources) {
84
- let filteredDs;
85
- filteredDs = dataSources.filter((ds) => ds.startBlock <= nextProcessingHeight);
86
- if (filteredDs.length === 0) {
87
- logger.error(`Did not find any matching datasouces`);
88
- process.exit(1);
89
- }
90
- // perform filter for custom ds
91
- filteredDs = filteredDs.filter((ds) => {
92
- if ((0, common_ethereum_1.isCustomDs)(ds)) {
93
- return this.dsProcessorService
94
- .getDsProcessor(ds)
95
- .dsFilterProcessor(ds, this.apiService.api);
96
- }
97
- else {
98
- return true;
99
- }
100
- });
101
- if (!filteredDs.length) {
102
- logger.error(`Did not find any datasources with associated processor`);
103
- process.exit(1);
104
- }
105
- return filteredDs;
44
+ getBlockHeight(block) {
45
+ return block.blockHeight;
106
46
  }
107
- assertDataSources(ds, blockHeight) {
108
- if (!ds.length) {
109
- logger.error(`Your start block is greater than the current indexed block height in your database. Either change your startBlock (project.yaml) to <= ${blockHeight}
110
- or delete your database and start again from the currently specified startBlock`);
111
- process.exit(1);
112
- }
47
+ getBlockHash(block) {
48
+ return block.block.hash;
49
+ }
50
+ // eslint-disable-next-line @typescript-eslint/require-await
51
+ async getApi(block) {
52
+ return this.apiService.api.getSafeApi(this.getBlockHeight(block));
113
53
  }
114
54
  async indexBlockData({ block, transactions }, dataSources, getVM) {
115
55
  var _a;
@@ -136,94 +76,19 @@ let IndexerManager = class IndexerManager {
136
76
  await this.indexData(common_ethereum_1.EthereumHandlerKind.Event, log, ds, getVM);
137
77
  }
138
78
  }
139
- async indexData(kind, data, ds, getVM) {
140
- let vm;
141
- if ((0, common_ethereum_1.isRuntimeDs)(ds)) {
142
- const handlers = ds.mapping.handlers.filter((h) => {
143
- var _a;
144
- return h.kind === kind &&
145
- FilterTypeMap[kind](data, h.filter, (_a = ds.options) === null || _a === void 0 ? void 0 : _a.address);
146
- });
147
- if (!handlers.length) {
148
- return;
149
- }
150
- const parsedData = await DataAbiParser[kind](this.apiService.api)(data, ds);
151
- for (const handler of handlers) {
152
- vm = vm !== null && vm !== void 0 ? vm : (await getVM(ds));
153
- this.nodeConfig.profiler
154
- ? await (0, node_core_1.profilerWrap)(vm.securedExec.bind(vm), 'handlerPerformance', handler.handler)(handler.handler, [parsedData])
155
- : await vm.securedExec(handler.handler, [parsedData]);
156
- }
157
- }
158
- else if ((0, common_ethereum_1.isCustomDs)(ds)) {
159
- const handlers = this.filterCustomDsHandlers(ds, data, ProcessorTypeMap[kind], (data, baseFilter) => {
160
- switch (kind) {
161
- case common_ethereum_1.EthereumHandlerKind.Block:
162
- return block_ethereum_1.EthereumBlockWrapped.filterBlocksProcessor(data, baseFilter);
163
- case common_ethereum_1.EthereumHandlerKind.Call:
164
- return block_ethereum_1.EthereumBlockWrapped.filterTransactionsProcessor(data, baseFilter);
165
- case common_ethereum_1.EthereumHandlerKind.Event:
166
- return block_ethereum_1.EthereumBlockWrapped.filterLogsProcessor(data, baseFilter);
167
- default:
168
- throw new Error('Unsupported handler kind');
169
- }
170
- });
171
- if (!handlers.length) {
172
- return;
173
- }
174
- const parsedData = await DataAbiParser[kind](this.apiService.api)(data, ds);
175
- for (const handler of handlers) {
176
- vm = vm !== null && vm !== void 0 ? vm : (await getVM(ds));
177
- await this.transformAndExecuteCustomDs(ds, vm, handler, parsedData);
178
- }
179
- }
180
- }
181
- filterCustomDsHandlers(ds, data, baseHandlerCheck, baseFilter) {
182
- const plugin = this.dsProcessorService.getDsProcessor(ds);
183
- return ds.mapping.handlers
184
- .filter((handler) => {
185
- const processor = plugin.handlerProcessors[handler.kind];
186
- if (baseHandlerCheck(processor)) {
187
- processor.baseFilter;
188
- return baseFilter(data, processor.baseFilter);
189
- }
190
- return false;
191
- })
192
- .filter((handler) => {
193
- const processor = (0, ds_processor_service_1.asSecondLayerHandlerProcessor_1_0_0)(plugin.handlerProcessors[handler.kind]);
194
- try {
195
- return processor.filterProcessor({
196
- filter: handler.filter,
197
- input: data,
198
- ds,
199
- });
200
- }
201
- catch (e) {
202
- logger.error(e, 'Failed to run ds processer filter.');
203
- throw e;
204
- }
205
- });
79
+ async prepareFilteredData(kind, data, ds) {
80
+ return DataAbiParser[kind](this.apiService.api)(data, ds);
206
81
  }
207
- async transformAndExecuteCustomDs(ds, vm, handler, data) {
208
- const plugin = this.dsProcessorService.getDsProcessor(ds);
209
- const assets = await this.dsProcessorService.getAssets(ds);
210
- const processor = (0, ds_processor_service_1.asSecondLayerHandlerProcessor_1_0_0)(plugin.handlerProcessors[handler.kind]);
211
- const transformedData = await processor
212
- .transformer({
213
- input: data,
214
- ds,
215
- api: this.apiService.api,
216
- filter: handler.filter,
217
- assets,
218
- })
219
- .catch((e) => {
220
- logger.error(e, 'Failed to transform data with ds processor.');
221
- throw e;
222
- });
223
- // We can not run this in parallel. the transformed data items may be dependent on one another.
224
- // An example of this is with Acala EVM packing multiple EVM logs into a single Substrate event
225
- for (const _data of transformedData) {
226
- await vm.securedExec(handler.handler, [_data]);
82
+ baseCustomHandlerFilter(kind, data, baseFilter) {
83
+ switch (kind) {
84
+ case common_ethereum_1.EthereumHandlerKind.Block:
85
+ return block_ethereum_1.EthereumBlockWrapped.filterBlocksProcessor(data, baseFilter);
86
+ case common_ethereum_1.EthereumHandlerKind.Call:
87
+ return block_ethereum_1.EthereumBlockWrapped.filterTransactionsProcessor(data, baseFilter);
88
+ case common_ethereum_1.EthereumHandlerKind.Event:
89
+ return block_ethereum_1.EthereumBlockWrapped.filterLogsProcessor(data, baseFilter);
90
+ default:
91
+ throw new Error('Unsupported handler kind');
227
92
  }
228
93
  }
229
94
  };
@@ -257,7 +122,7 @@ const FilterTypeMap = {
257
122
  };
258
123
  const DataAbiParser = {
259
124
  [common_ethereum_1.EthereumHandlerKind.Block]: () => (data) => data,
260
- [common_ethereum_1.EthereumHandlerKind.Event]: (api) => api.parseLog.bind(api),
261
- [common_ethereum_1.EthereumHandlerKind.Call]: (api) => api.parseTransaction.bind(api),
125
+ [common_ethereum_1.EthereumHandlerKind.Event]: (api) => (data, ds) => api.parseLog(data, ds),
126
+ [common_ethereum_1.EthereumHandlerKind.Call]: (api) => (data, ds) => api.parseTransaction(data, ds),
262
127
  };
263
128
  //# sourceMappingURL=indexer.manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.manager.js","sourceRoot":"","sources":["../../src/indexer/indexer.manager.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n isBlockHandlerProcessor,\n isCallHandlerProcessor,\n isEventHandlerProcessor,\n isCustomDs,\n isRuntimeDs,\n SubqlEthereumCustomDataSource,\n SubqlCustomHandler,\n EthereumHandlerKind,\n EthereumRuntimeHandlerInputMap,\n} from '@subql/common-ethereum';\nimport {\n NodeConfig,\n getLogger,\n profiler,\n profilerWrap,\n IndexerSandbox,\n ProcessBlockResponse,\n ApiService,\n IIndexerManager,\n} from '@subql/node-core';\nimport {\n EthereumTransaction,\n EthereumLog,\n SubqlRuntimeHandler,\n EthereumBlockWrapper,\n EthereumBlock,\n} from '@subql/types-ethereum';\nimport { SubqlProjectDs } from '../configure/SubqueryProject';\nimport { EthereumApi } from '../ethereum';\nimport { EthereumBlockWrapped } from '../ethereum/block.ethereum';\nimport { yargsOptions } from '../yargs';\nimport {\n asSecondLayerHandlerProcessor_1_0_0,\n DsProcessorService,\n} from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { ProjectService } from './project.service';\nimport { SandboxService } from './sandbox.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\nconst logger = getLogger('indexer');\n\n@Injectable()\nexport class IndexerManager\n implements IIndexerManager<EthereumBlockWrapper, SubqlProjectDs>\n{\n constructor(\n private apiService: ApiService,\n private nodeConfig: NodeConfig,\n private sandboxService: SandboxService,\n private dsProcessorService: DsProcessorService,\n private dynamicDsService: DynamicDsService,\n private unfinalizedBlocksService: UnfinalizedBlocksService,\n @Inject('IProjectService') private projectService: ProjectService,\n ) {\n logger.info('indexer manager start');\n }\n\n @profiler(yargsOptions.argv.profiler)\n async indexBlock(\n blockContent: EthereumBlockWrapper,\n dataSources: SubqlProjectDs[],\n ): Promise<ProcessBlockResponse> {\n const { block, blockHeight } = blockContent;\n let dynamicDsCreated = false;\n let reindexBlockHeight: number | null = null;\n\n const filteredDataSources = this.filterDataSources(\n blockHeight,\n dataSources,\n );\n\n this.assertDataSources(filteredDataSources, blockHeight);\n reindexBlockHeight = await this.processUnfinalizedBlocks(block);\n\n // Only index block if we're not going to reindex\n if (!reindexBlockHeight) {\n await this.indexBlockData(\n blockContent,\n filteredDataSources,\n // eslint-disable-next-line @typescript-eslint/require-await\n async (ds: SubqlProjectDs) => {\n const vm = this.sandboxService.getDsProcessorWrapper(\n ds,\n this.apiService.api,\n blockContent,\n );\n\n // Inject function to create ds into vm\n vm.freeze(\n async (templateName: string, args?: Record<string, unknown>) => {\n const newDs = await this.dynamicDsService.createDynamicDatasource(\n {\n templateName,\n args,\n startBlock: blockHeight,\n },\n );\n // Push the newly created dynamic ds to be processed this block on any future extrinsics/events\n filteredDataSources.push(newDs);\n dynamicDsCreated = true;\n },\n 'createDynamicDatasource',\n );\n\n return vm;\n },\n );\n }\n\n return {\n dynamicDsCreated,\n blockHash: block.hash,\n reindexBlockHeight,\n };\n }\n\n async start(): Promise<void> {\n await this.projectService.init();\n logger.info('indexer manager started');\n }\n\n private async processUnfinalizedBlocks(\n block: EthereumBlock,\n ): Promise<number | null> {\n if (this.nodeConfig.unfinalizedBlocks) {\n return this.unfinalizedBlocksService.processUnfinalizedBlocks(block);\n }\n return null;\n }\n\n private filterDataSources(\n nextProcessingHeight: number,\n dataSources: SubqlProjectDs[],\n ): SubqlProjectDs[] {\n let filteredDs: SubqlProjectDs[];\n\n filteredDs = dataSources.filter(\n (ds) => ds.startBlock <= nextProcessingHeight,\n );\n\n if (filteredDs.length === 0) {\n logger.error(`Did not find any matching datasouces`);\n process.exit(1);\n }\n // perform filter for custom ds\n filteredDs = filteredDs.filter((ds) => {\n if (isCustomDs(ds)) {\n return this.dsProcessorService\n .getDsProcessor(ds)\n .dsFilterProcessor(ds, this.apiService.api);\n } else {\n return true;\n }\n });\n\n if (!filteredDs.length) {\n logger.error(`Did not find any datasources with associated processor`);\n process.exit(1);\n }\n return filteredDs;\n }\n\n private assertDataSources(ds: SubqlProjectDs[], blockHeight: number) {\n if (!ds.length) {\n logger.error(\n `Your start block is greater than the current indexed block height in your database. Either change your startBlock (project.yaml) to <= ${blockHeight}\n or delete your database and start again from the currently specified startBlock`,\n );\n process.exit(1);\n }\n }\n\n private async indexBlockData(\n { block, transactions }: EthereumBlockWrapper,\n dataSources: SubqlProjectDs[],\n getVM: (d: SubqlProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n await this.indexBlockContent(block, dataSources, getVM);\n\n for (const tx of transactions) {\n await this.indexTransaction(tx, dataSources, getVM);\n\n for (const log of tx.logs ?? []) {\n await this.indexEvent(log, dataSources, getVM);\n }\n }\n }\n\n private async indexBlockContent(\n block: EthereumBlock,\n dataSources: SubqlProjectDs[],\n getVM: (d: SubqlProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(EthereumHandlerKind.Block, block, ds, getVM);\n }\n }\n\n private async indexTransaction(\n tx: EthereumTransaction,\n dataSources: SubqlProjectDs[],\n getVM: (d: SubqlProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(EthereumHandlerKind.Call, tx, ds, getVM);\n }\n }\n\n private async indexEvent(\n log: EthereumLog,\n dataSources: SubqlProjectDs[],\n getVM: (d: SubqlProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(EthereumHandlerKind.Event, log, ds, getVM);\n }\n }\n\n private async indexData<K extends EthereumHandlerKind>(\n kind: K,\n data: EthereumRuntimeHandlerInputMap[K],\n ds: SubqlProjectDs,\n getVM: (ds: SubqlProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n let vm: IndexerSandbox;\n if (isRuntimeDs(ds)) {\n const handlers = (ds.mapping.handlers as SubqlRuntimeHandler[]).filter(\n (h) =>\n h.kind === kind &&\n FilterTypeMap[kind](\n data as any,\n h.filter as any,\n ds.options?.address,\n ),\n );\n\n if (!handlers.length) {\n return;\n }\n const parsedData = await DataAbiParser[kind](this.apiService.api)(\n data,\n ds,\n );\n\n for (const handler of handlers) {\n vm = vm ?? (await getVM(ds));\n this.nodeConfig.profiler\n ? await profilerWrap(\n vm.securedExec.bind(vm),\n 'handlerPerformance',\n handler.handler,\n )(handler.handler, [parsedData])\n : await vm.securedExec(handler.handler, [parsedData]);\n }\n } else if (isCustomDs(ds)) {\n const handlers = this.filterCustomDsHandlers<K>(\n ds,\n data,\n ProcessorTypeMap[kind],\n (data, baseFilter) => {\n switch (kind) {\n case EthereumHandlerKind.Block:\n return EthereumBlockWrapped.filterBlocksProcessor(\n data as EthereumBlock,\n baseFilter,\n );\n case EthereumHandlerKind.Call:\n return EthereumBlockWrapped.filterTransactionsProcessor(\n data as EthereumTransaction,\n baseFilter,\n );\n case EthereumHandlerKind.Event:\n return EthereumBlockWrapped.filterLogsProcessor(\n data as EthereumLog,\n baseFilter,\n );\n default:\n throw new Error('Unsupported handler kind');\n }\n },\n );\n\n if (!handlers.length) {\n return;\n }\n\n const parsedData = await DataAbiParser[kind](this.apiService.api)(\n data,\n ds,\n );\n\n for (const handler of handlers) {\n vm = vm ?? (await getVM(ds));\n await this.transformAndExecuteCustomDs(ds, vm, handler, parsedData);\n }\n }\n }\n\n private filterCustomDsHandlers<K extends EthereumHandlerKind>(\n ds: SubqlEthereumCustomDataSource<string, any>,\n data: EthereumRuntimeHandlerInputMap[K],\n baseHandlerCheck: ProcessorTypeMap[K],\n baseFilter: (\n data: EthereumRuntimeHandlerInputMap[K],\n baseFilter: any,\n ) => boolean,\n ): SubqlCustomHandler[] {\n const plugin = this.dsProcessorService.getDsProcessor(ds);\n\n return ds.mapping.handlers\n .filter((handler) => {\n const processor = plugin.handlerProcessors[handler.kind];\n if (baseHandlerCheck(processor)) {\n processor.baseFilter;\n\n return baseFilter(data, processor.baseFilter);\n }\n return false;\n })\n .filter((handler) => {\n const processor = asSecondLayerHandlerProcessor_1_0_0(\n plugin.handlerProcessors[handler.kind],\n );\n\n try {\n return processor.filterProcessor({\n filter: handler.filter,\n input: data,\n ds,\n });\n } catch (e) {\n logger.error(e, 'Failed to run ds processer filter.');\n throw e;\n }\n });\n }\n\n private async transformAndExecuteCustomDs<K extends EthereumHandlerKind>(\n ds: SubqlEthereumCustomDataSource<string, any>,\n vm: IndexerSandbox,\n handler: SubqlCustomHandler,\n data: EthereumRuntimeHandlerInputMap[K],\n ): Promise<void> {\n const plugin = this.dsProcessorService.getDsProcessor(ds);\n const assets = await this.dsProcessorService.getAssets(ds);\n\n const processor = asSecondLayerHandlerProcessor_1_0_0(\n plugin.handlerProcessors[handler.kind],\n );\n\n const transformedData = await processor\n .transformer({\n input: data,\n ds,\n api: this.apiService.api,\n filter: handler.filter,\n assets,\n })\n .catch((e) => {\n logger.error(e, 'Failed to transform data with ds processor.');\n throw e;\n });\n\n // We can not run this in parallel. the transformed data items may be dependent on one another.\n // An example of this is with Acala EVM packing multiple EVM logs into a single Substrate event\n for (const _data of transformedData) {\n await vm.securedExec(handler.handler, [_data]);\n }\n }\n}\n\ntype ProcessorTypeMap = {\n [EthereumHandlerKind.Block]: typeof isBlockHandlerProcessor;\n [EthereumHandlerKind.Event]: typeof isEventHandlerProcessor;\n [EthereumHandlerKind.Call]: typeof isCallHandlerProcessor;\n};\n\nconst ProcessorTypeMap = {\n [EthereumHandlerKind.Block]: isBlockHandlerProcessor,\n [EthereumHandlerKind.Event]: isEventHandlerProcessor,\n [EthereumHandlerKind.Call]: isCallHandlerProcessor,\n};\n\nconst FilterTypeMap = {\n [EthereumHandlerKind.Block]: EthereumBlockWrapped.filterBlocksProcessor,\n [EthereumHandlerKind.Event]: EthereumBlockWrapped.filterLogsProcessor,\n [EthereumHandlerKind.Call]: EthereumBlockWrapped.filterTransactionsProcessor,\n};\n\nconst DataAbiParser = {\n [EthereumHandlerKind.Block]: () => (data: EthereumBlock) => data,\n [EthereumHandlerKind.Event]: (api: EthereumApi) => api.parseLog.bind(api),\n [EthereumHandlerKind.Call]: (api: EthereumApi) =>\n api.parseTransaction.bind(api),\n};\n"]}
1
+ {"version":3,"file":"indexer.manager.js","sourceRoot":"","sources":["../../src/indexer/indexer.manager.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n isBlockHandlerProcessor,\n isCallHandlerProcessor,\n isEventHandlerProcessor,\n isCustomDs,\n isRuntimeDs,\n SubqlEthereumCustomDataSource,\n EthereumHandlerKind,\n EthereumRuntimeHandlerInputMap,\n SubqlEthereumDataSource,\n} from '@subql/common-ethereum';\nimport {\n NodeConfig,\n getLogger,\n profiler,\n IndexerSandbox,\n ProcessBlockResponse,\n BaseIndexerManager,\n ApiService,\n} from '@subql/node-core';\nimport {\n EthereumTransaction,\n EthereumLog,\n EthereumBlockWrapper,\n EthereumBlock,\n SubqlRuntimeDatasource,\n} from '@subql/types-ethereum';\nimport { SubqlProjectDs } from '../configure/SubqueryProject';\nimport { EthereumApi } from '../ethereum';\nimport { EthereumBlockWrapped } from '../ethereum/block.ethereum';\nimport SafeEthProvider from '../ethereum/safe-api';\nimport { yargsOptions } from '../yargs';\nimport {\n asSecondLayerHandlerProcessor_1_0_0,\n DsProcessorService,\n} from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { ProjectService } from './project.service';\nimport { SandboxService } from './sandbox.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\nconst logger = getLogger('indexer');\n\n@Injectable()\nexport class IndexerManager extends BaseIndexerManager<\n ApiService,\n SafeEthProvider,\n EthereumBlockWrapper,\n SubqlEthereumDataSource,\n SubqlEthereumCustomDataSource,\n typeof FilterTypeMap,\n typeof ProcessorTypeMap,\n EthereumRuntimeHandlerInputMap\n> {\n protected isRuntimeDs = isRuntimeDs;\n protected isCustomDs = isCustomDs;\n protected updateCustomProcessor = asSecondLayerHandlerProcessor_1_0_0;\n\n constructor(\n apiService: ApiService,\n nodeConfig: NodeConfig,\n sandboxService: SandboxService,\n dsProcessorService: DsProcessorService,\n dynamicDsService: DynamicDsService,\n unfinalizedBlocksService: UnfinalizedBlocksService,\n @Inject('IProjectService') private projectService: ProjectService,\n ) {\n super(\n apiService,\n nodeConfig,\n sandboxService,\n dsProcessorService,\n dynamicDsService,\n unfinalizedBlocksService,\n FilterTypeMap,\n ProcessorTypeMap,\n );\n }\n\n async start(): Promise<void> {\n await this.projectService.init();\n logger.info('indexer manager started');\n }\n\n @profiler(yargsOptions.argv.profiler)\n async indexBlock(\n block: EthereumBlockWrapper,\n dataSources: SubqlEthereumDataSource[],\n ): Promise<ProcessBlockResponse> {\n return super.internalIndexBlock(block, dataSources, () =>\n this.getApi(block),\n );\n }\n\n getBlockHeight(block: EthereumBlockWrapper): number {\n return block.blockHeight;\n }\n\n getBlockHash(block: EthereumBlockWrapper): string {\n return block.block.hash;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n private async getApi(block: EthereumBlockWrapper): Promise<SafeEthProvider> {\n return this.apiService.api.getSafeApi(this.getBlockHeight(block));\n }\n\n protected async indexBlockData(\n { block, transactions }: EthereumBlockWrapper,\n dataSources: SubqlProjectDs[],\n getVM: (d: SubqlProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n await this.indexBlockContent(block, dataSources, getVM);\n\n for (const tx of transactions) {\n await this.indexTransaction(tx, dataSources, getVM);\n\n for (const log of tx.logs ?? []) {\n await this.indexEvent(log, dataSources, getVM);\n }\n }\n }\n\n private async indexBlockContent(\n block: EthereumBlock,\n dataSources: SubqlProjectDs[],\n getVM: (d: SubqlProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(EthereumHandlerKind.Block, block, ds, getVM);\n }\n }\n\n private async indexTransaction(\n tx: EthereumTransaction,\n dataSources: SubqlProjectDs[],\n getVM: (d: SubqlProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(EthereumHandlerKind.Call, tx, ds, getVM);\n }\n }\n\n private async indexEvent(\n log: EthereumLog,\n dataSources: SubqlProjectDs[],\n getVM: (d: SubqlProjectDs) => Promise<IndexerSandbox>,\n ): Promise<void> {\n for (const ds of dataSources) {\n await this.indexData(EthereumHandlerKind.Event, log, ds, getVM);\n }\n }\n\n protected async prepareFilteredData(\n kind: EthereumHandlerKind,\n data: any,\n ds: SubqlRuntimeDatasource,\n ): Promise<any> {\n return DataAbiParser[kind](this.apiService.api)(data, ds);\n }\n\n protected baseCustomHandlerFilter(\n kind: EthereumHandlerKind,\n data: any,\n baseFilter: any,\n ): boolean {\n switch (kind) {\n case EthereumHandlerKind.Block:\n return EthereumBlockWrapped.filterBlocksProcessor(\n data as EthereumBlock,\n baseFilter,\n );\n case EthereumHandlerKind.Call:\n return EthereumBlockWrapped.filterTransactionsProcessor(\n data as EthereumTransaction,\n baseFilter,\n );\n case EthereumHandlerKind.Event:\n return EthereumBlockWrapped.filterLogsProcessor(\n data as EthereumLog,\n baseFilter,\n );\n default:\n throw new Error('Unsupported handler kind');\n }\n }\n}\n\ntype ProcessorTypeMap = {\n [EthereumHandlerKind.Block]: typeof isBlockHandlerProcessor;\n [EthereumHandlerKind.Event]: typeof isEventHandlerProcessor;\n [EthereumHandlerKind.Call]: typeof isCallHandlerProcessor;\n};\n\nconst ProcessorTypeMap = {\n [EthereumHandlerKind.Block]: isBlockHandlerProcessor,\n [EthereumHandlerKind.Event]: isEventHandlerProcessor,\n [EthereumHandlerKind.Call]: isCallHandlerProcessor,\n};\n\nconst FilterTypeMap = {\n [EthereumHandlerKind.Block]: EthereumBlockWrapped.filterBlocksProcessor,\n [EthereumHandlerKind.Event]: EthereumBlockWrapped.filterLogsProcessor,\n [EthereumHandlerKind.Call]: EthereumBlockWrapped.filterTransactionsProcessor,\n};\n\nconst DataAbiParser = {\n [EthereumHandlerKind.Block]: () => (data: EthereumBlock) => data,\n [EthereumHandlerKind.Event]:\n (api: EthereumApi) => (data: EthereumLog, ds: SubqlRuntimeDatasource) =>\n api.parseLog(data, ds),\n [EthereumHandlerKind.Call]:\n (api: EthereumApi) =>\n (data: EthereumTransaction, ds: SubqlRuntimeDatasource) =>\n api.parseTransaction(data, ds),\n};\n"]}
@@ -31,7 +31,6 @@ IndexerModule = __decorate([
31
31
  node_core_1.StoreCacheService,
32
32
  node_core_1.StoreService,
33
33
  node_core_1.ConnectionPoolService,
34
- ethereum_1.EthereumApiService,
35
34
  {
36
35
  provide: node_core_1.ApiService,
37
36
  useFactory: async (project, connectionPoolService, eventEmitter) => {
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.module.js","sourceRoot":"","sources":["../../src/indexer/indexer.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,mDAA8C;AAC9C,2CAAwC;AACxC,yDAAsD;AACtD,gDAQ0B;AAE1B,0CAAiD;AAEjD,iEAA4D;AAC5D,6DAAwD;AACxD,uDAAmD;AACnD,uDAAmD;AACnD,uDAAmD;AACnD,2EAAuE;AACvE,4DAAwD;AACxD,gGAA2F;AAwDpF,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,aAAa;IAtDzB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,gCAAc;YACd,6BAAiB;YACjB,wBAAY;YACZ,iCAAqB;YACrB,6BAAkB;YAClB;gBACE,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,KAAK,EACf,OAAwB,EACxB,qBAAmE,EACnE,YAA2B,EAC3B,EAAE;oBACF,MAAM,UAAU,GAAG,IAAI,6BAAkB,CACvC,OAAO,EACP,qBAAqB,EACrB,YAAY,CACb,CAAC;oBACF,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;oBACxB,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE,CAAC,kBAAkB,EAAE,iCAAqB,EAAE,6BAAa,CAAC;aACnE;YACD,gCAAc;YACd,yCAAkB;YAClB;gBACE,OAAO,EAAE,qCAAgB;gBACzB,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,6BAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBACD,OAAO,IAAI,kCAAsB,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC;aACF;YACD,sBAAU;YACV,sBAAU;YACV;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,gCAAc;aACzB;YACD,8BAAa;YACb;gBACE,OAAO,EAAE,oDAAwB;gBACjC,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,6BAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBACD,OAAO,IAAI,iEAA8B,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC;gBAClE,CAAC;aACF;SACF;QACD,OAAO,EAAE,CAAC,wBAAY,CAAC;KACxB,CAAC;GACW,aAAa,CAAG;AAAhB,sCAAa","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n StoreService,\n PoiService,\n MmrService,\n ConnectionPoolService,\n StoreCacheService,\n WorkerDynamicDsService,\n} from '@subql/node-core';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { EthereumApiService } from '../ethereum';\nimport { EthereumApiConnection } from '../ethereum/api.connection';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { IndexerManager } from './indexer.manager';\nimport { ProjectService } from './project.service';\nimport { SandboxService } from './sandbox.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\nimport { WorkerService } from './worker/worker.service';\nimport { WorkerUnfinalizedBlocksService } from './worker/worker.unfinalizedBlocks.service';\n\n@Module({\n providers: [\n IndexerManager,\n StoreCacheService,\n StoreService,\n ConnectionPoolService,\n EthereumApiService,\n {\n provide: ApiService,\n useFactory: async (\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n eventEmitter: EventEmitter2,\n ) => {\n const apiService = new EthereumApiService(\n project,\n connectionPoolService,\n eventEmitter,\n );\n await apiService.init();\n return apiService;\n },\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n SandboxService,\n DsProcessorService,\n {\n provide: DynamicDsService,\n useFactory: () => {\n if (isMainThread) {\n throw new Error('Expected to be worker thread');\n }\n return new WorkerDynamicDsService((global as any).host);\n },\n },\n PoiService,\n MmrService,\n {\n provide: 'IProjectService',\n useClass: ProjectService,\n },\n WorkerService,\n {\n provide: UnfinalizedBlocksService,\n useFactory: () => {\n if (isMainThread) {\n throw new Error('Expected to be worker thread');\n }\n return new WorkerUnfinalizedBlocksService((global as any).host);\n },\n },\n ],\n exports: [StoreService],\n})\nexport class IndexerModule {}\n"]}
1
+ {"version":3,"file":"indexer.module.js","sourceRoot":"","sources":["../../src/indexer/indexer.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,mDAA8C;AAC9C,2CAAwC;AACxC,yDAAsD;AACtD,gDAQ0B;AAE1B,0CAAiD;AAEjD,iEAA4D;AAC5D,6DAAwD;AACxD,uDAAmD;AACnD,uDAAmD;AACnD,uDAAmD;AACnD,2EAAuE;AACvE,4DAAwD;AACxD,gGAA2F;AAuDpF,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,aAAa;IArDzB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,gCAAc;YACd,6BAAiB;YACjB,wBAAY;YACZ,iCAAqB;YACrB;gBACE,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,KAAK,EACf,OAAwB,EACxB,qBAAmE,EACnE,YAA2B,EAC3B,EAAE;oBACF,MAAM,UAAU,GAAG,IAAI,6BAAkB,CACvC,OAAO,EACP,qBAAqB,EACrB,YAAY,CACb,CAAC;oBACF,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;oBACxB,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE,CAAC,kBAAkB,EAAE,iCAAqB,EAAE,6BAAa,CAAC;aACnE;YACD,gCAAc;YACd,yCAAkB;YAClB;gBACE,OAAO,EAAE,qCAAgB;gBACzB,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,6BAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBACD,OAAO,IAAI,kCAAsB,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC;aACF;YACD,sBAAU;YACV,sBAAU;YACV;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,gCAAc;aACzB;YACD,8BAAa;YACb;gBACE,OAAO,EAAE,oDAAwB;gBACjC,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,6BAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBACD,OAAO,IAAI,iEAA8B,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC;gBAClE,CAAC;aACF;SACF;QACD,OAAO,EAAE,CAAC,wBAAY,CAAC;KACxB,CAAC;GACW,aAAa,CAAG;AAAhB,sCAAa","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n StoreService,\n PoiService,\n MmrService,\n ConnectionPoolService,\n StoreCacheService,\n WorkerDynamicDsService,\n} from '@subql/node-core';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { EthereumApiService } from '../ethereum';\nimport { EthereumApiConnection } from '../ethereum/api.connection';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { IndexerManager } from './indexer.manager';\nimport { ProjectService } from './project.service';\nimport { SandboxService } from './sandbox.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\nimport { WorkerService } from './worker/worker.service';\nimport { WorkerUnfinalizedBlocksService } from './worker/worker.unfinalizedBlocks.service';\n\n@Module({\n providers: [\n IndexerManager,\n StoreCacheService,\n StoreService,\n ConnectionPoolService,\n {\n provide: ApiService,\n useFactory: async (\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n eventEmitter: EventEmitter2,\n ) => {\n const apiService = new EthereumApiService(\n project,\n connectionPoolService,\n eventEmitter,\n );\n await apiService.init();\n return apiService;\n },\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n SandboxService,\n DsProcessorService,\n {\n provide: DynamicDsService,\n useFactory: () => {\n if (isMainThread) {\n throw new Error('Expected to be worker thread');\n }\n return new WorkerDynamicDsService((global as any).host);\n },\n },\n PoiService,\n MmrService,\n {\n provide: 'IProjectService',\n useClass: ProjectService,\n },\n WorkerService,\n {\n provide: UnfinalizedBlocksService,\n useFactory: () => {\n if (isMainThread) {\n throw new Error('Expected to be worker thread');\n }\n return new WorkerUnfinalizedBlocksService((global as any).host);\n },\n },\n ],\n exports: [StoreService],\n})\nexport class IndexerModule {}\n"]}
@@ -1,43 +1,13 @@
1
1
  import { EventEmitter2 } from '@nestjs/event-emitter';
2
- import { ApiService, IProjectService, NodeConfig, StoreService, PoiService, MmrService } from '@subql/node-core';
2
+ import { PoiService, MmrService, BaseProjectService, StoreService, NodeConfig, ApiService } from '@subql/node-core';
3
3
  import { Sequelize } from 'sequelize';
4
4
  import { SubqlProjectDs, SubqueryProject } from '../configure/SubqueryProject';
5
5
  import { DsProcessorService } from './ds-processor.service';
6
6
  import { DynamicDsService } from './dynamic-ds.service';
7
7
  import { UnfinalizedBlocksService } from './unfinalizedBlocks.service';
8
- export declare class ProjectService implements IProjectService<SubqlProjectDs> {
9
- private readonly dsProcessorService;
10
- private readonly apiService;
11
- private readonly poiService;
12
- protected readonly mmrService: MmrService;
13
- private readonly sequelize;
14
- private readonly project;
15
- private readonly storeService;
16
- private readonly nodeConfig;
17
- private readonly dynamicDsService;
18
- private eventEmitter;
19
- private unfinalizedBlockService;
20
- private _schema;
21
- private _startHeight;
22
- private _blockOffset;
8
+ export declare class ProjectService extends BaseProjectService<SubqlProjectDs> {
9
+ protected packageVersion: any;
23
10
  constructor(dsProcessorService: DsProcessorService, apiService: ApiService, poiService: PoiService, mmrService: MmrService, sequelize: Sequelize, project: SubqueryProject, storeService: StoreService, nodeConfig: NodeConfig, dynamicDsService: DynamicDsService, eventEmitter: EventEmitter2, unfinalizedBlockService: UnfinalizedBlocksService);
24
- get schema(): string;
25
- get dataSources(): SubqlProjectDs[];
26
- get blockOffset(): number;
27
- get startHeight(): number;
28
- get isHistorical(): boolean;
29
- private getExistingProjectSchema;
30
- init(): Promise<void>;
31
- private ensureProject;
32
- private createProjectSchema;
33
- private initHotSchemaReload;
34
- private initDbSchema;
35
- private ensureMetadata;
36
- private getMetadataBlockOffset;
37
- private getLastProcessedHeight;
38
- private getStartHeight;
39
- setBlockOffset(offset: number): Promise<void>;
40
- private getStartBlockFromDataSources;
41
- reindex(targetBlockHeight: number): Promise<void>;
42
- getAllDataSources(blockHeight: number): Promise<SubqlProjectDs[]>;
11
+ protected generateTimestampReferenceForBlockFilters(ds: SubqlProjectDs[]): Promise<SubqlProjectDs[]>;
12
+ protected getStartBlockDatasources(): SubqlProjectDs[];
43
13
  }
@@ -13,226 +13,29 @@ var __metadata = (this && this.__metadata) || function (k, v) {
13
13
  var __param = (this && this.__param) || function (paramIndex, decorator) {
14
14
  return function (target, key) { decorator(target, key, paramIndex); }
15
15
  };
16
- var __importDefault = (this && this.__importDefault) || function (mod) {
17
- return (mod && mod.__esModule) ? mod : { "default": mod };
18
- };
19
16
  Object.defineProperty(exports, "__esModule", { value: true });
20
17
  exports.ProjectService = void 0;
21
- const assert_1 = __importDefault(require("assert"));
22
- const worker_threads_1 = require("worker_threads");
23
18
  const common_1 = require("@nestjs/common");
24
19
  const event_emitter_1 = require("@nestjs/event-emitter");
25
20
  const node_core_1 = require("@subql/node-core");
26
21
  const sequelize_1 = require("sequelize");
27
22
  const SubqueryProject_1 = require("../configure/SubqueryProject");
28
- const project_1 = require("../utils/project");
29
- const reindex_1 = require("../utils/reindex");
30
23
  const ds_processor_service_1 = require("./ds-processor.service");
31
24
  const dynamic_ds_service_1 = require("./dynamic-ds.service");
32
25
  const unfinalizedBlocks_service_1 = require("./unfinalizedBlocks.service");
33
26
  // eslint-disable-next-line @typescript-eslint/no-var-requires
34
27
  const { version: packageVersion } = require('../../package.json');
35
- const logger = (0, node_core_1.getLogger)('Project');
36
- let ProjectService = class ProjectService {
28
+ let ProjectService = class ProjectService extends node_core_1.BaseProjectService {
37
29
  constructor(dsProcessorService, apiService, poiService, mmrService, sequelize, project, storeService, nodeConfig, dynamicDsService, eventEmitter, unfinalizedBlockService) {
38
- this.dsProcessorService = dsProcessorService;
39
- this.apiService = apiService;
40
- this.poiService = poiService;
41
- this.mmrService = mmrService;
42
- this.sequelize = sequelize;
43
- this.project = project;
44
- this.storeService = storeService;
45
- this.nodeConfig = nodeConfig;
46
- this.dynamicDsService = dynamicDsService;
47
- this.eventEmitter = eventEmitter;
48
- this.unfinalizedBlockService = unfinalizedBlockService;
30
+ super(dsProcessorService, apiService, poiService, mmrService, sequelize, project, storeService, nodeConfig, dynamicDsService, eventEmitter, unfinalizedBlockService);
31
+ this.packageVersion = packageVersion;
49
32
  }
50
- get schema() {
51
- return this._schema;
33
+ async generateTimestampReferenceForBlockFilters(ds) {
34
+ return (0, SubqueryProject_1.generateTimestampReferenceForBlockFilters)(ds, this.apiService.api);
52
35
  }
53
- get dataSources() {
36
+ getStartBlockDatasources() {
54
37
  return this.project.dataSources;
55
38
  }
56
- get blockOffset() {
57
- return this._blockOffset;
58
- }
59
- get startHeight() {
60
- return this._startHeight;
61
- }
62
- get isHistorical() {
63
- return this.storeService.historical;
64
- }
65
- async getExistingProjectSchema() {
66
- return (0, node_core_1.getExistingProjectSchema)(this.nodeConfig, this.sequelize);
67
- }
68
- async init() {
69
- // Used to load assets into DS-processor, has to be done in any thread
70
- await this.dsProcessorService.validateProjectCustomDatasources();
71
- // Do extra work on main thread to setup stuff
72
- this.project.dataSources = await (0, SubqueryProject_1.generateTimestampReferenceForBlockFilters)(this.project.dataSources, this.apiService.api);
73
- if (worker_threads_1.isMainThread) {
74
- this._schema = await this.ensureProject();
75
- await this.initDbSchema();
76
- await this.ensureMetadata();
77
- this.dynamicDsService.init(this.storeService.storeCache.metadata);
78
- await this.initHotSchemaReload();
79
- if (this.nodeConfig.proofOfIndex) {
80
- const blockOffset = await this.getMetadataBlockOffset();
81
- void this.setBlockOffset(Number(blockOffset));
82
- await this.poiService.init();
83
- }
84
- this._startHeight = await this.getStartHeight();
85
- if (this.nodeConfig.unfinalizedBlocks && !this.isHistorical) {
86
- logger.error('Unfinalized blocks cannot be enabled without historical. You will need to reindex your project to enable historical');
87
- process.exit(1);
88
- }
89
- const reindexedTo = await this.unfinalizedBlockService.init(this.reindex.bind(this));
90
- if (reindexedTo !== undefined) {
91
- this._startHeight = reindexedTo;
92
- }
93
- // Flush any pending operations to setup DB
94
- await this.storeService.storeCache.flushCache(true);
95
- }
96
- else {
97
- this._schema = await this.getExistingProjectSchema();
98
- await this.sequelize.sync();
99
- (0, assert_1.default)(this._schema, 'Schema should be created in main thread');
100
- await this.initDbSchema();
101
- if (this.nodeConfig.proofOfIndex) {
102
- await this.poiService.init();
103
- }
104
- }
105
- }
106
- async ensureProject() {
107
- let schema = await this.getExistingProjectSchema();
108
- if (!schema) {
109
- schema = await this.createProjectSchema();
110
- }
111
- this.eventEmitter.emit(node_core_1.IndexerEvent.Ready, {
112
- value: true,
113
- });
114
- return schema;
115
- }
116
- async createProjectSchema() {
117
- const schema = this.nodeConfig.dbSchema;
118
- const schemas = await this.sequelize.showAllSchemas(undefined);
119
- if (!schemas.includes(schema)) {
120
- await this.sequelize.createSchema(`"${schema}"`, undefined);
121
- }
122
- return schema;
123
- }
124
- async initHotSchemaReload() {
125
- await (0, project_1.initHotSchemaReload)(this.schema, this.storeService);
126
- }
127
- async initDbSchema() {
128
- await (0, project_1.initDbSchema)(this.project, this.schema, this.storeService);
129
- }
130
- async ensureMetadata() {
131
- var _a;
132
- const metadata = this.storeService.storeCache.metadata;
133
- this.eventEmitter.emit(node_core_1.IndexerEvent.NetworkMetadata, this.apiService.networkMeta);
134
- const keys = [
135
- 'lastProcessedHeight',
136
- 'blockOffset',
137
- 'indexerNodeVersion',
138
- 'chain',
139
- 'specName',
140
- 'genesisHash',
141
- 'startHeight',
142
- 'processedBlockCount',
143
- 'lastFinalizedVerifiedHeight',
144
- 'schemaMigrationCount',
145
- ];
146
- const existing = await metadata.findMany(keys);
147
- const { chain, genesisHash, specName } = this.apiService.networkMeta;
148
- if (this.project.runner) {
149
- const { node, query } = this.project.runner;
150
- metadata.setBulk([
151
- { key: 'runnerNode', value: node.name },
152
- { key: 'runnerNodeVersion', value: node.version },
153
- { key: 'runnerQuery', value: query.name },
154
- { key: 'runnerQueryVersion', value: query.version },
155
- ]);
156
- }
157
- if (!existing.genesisHash) {
158
- metadata.set('genesisHash', genesisHash);
159
- }
160
- else {
161
- // Check if the configured genesisHash matches the currently stored genesisHash
162
- (0, assert_1.default)(
163
- // Configured project yaml genesisHash only exists in specVersion v0.2.0, fallback to api fetched genesisHash on v0.0.1
164
- ((_a = this.project.network.genesisHash) !== null && _a !== void 0 ? _a : genesisHash) ===
165
- existing.genesisHash, 'Specified project manifest chain id / genesis hash does not match database stored genesis hash, consider cleaning project schema using --force-clean');
166
- }
167
- if (existing.chain !== chain) {
168
- metadata.set('chain', chain);
169
- }
170
- if (existing.specName !== specName) {
171
- metadata.set('specName', specName);
172
- }
173
- // If project was created before this feature, don't add the key. If it is project created after, add this key.
174
- if (!existing.processedBlockCount && !existing.lastProcessedHeight) {
175
- metadata.set('processedBlockCount', 0);
176
- }
177
- if (existing.indexerNodeVersion !== packageVersion) {
178
- metadata.set('indexerNodeVersion', packageVersion);
179
- }
180
- if (!existing.schemaMigrationCount) {
181
- metadata.set('schemaMigrationCount', 0);
182
- }
183
- if (!existing.startHeight) {
184
- metadata.set('startHeight', this.getStartBlockFromDataSources());
185
- }
186
- }
187
- async getMetadataBlockOffset() {
188
- return this.storeService.storeCache.metadata.find('blockOffset');
189
- }
190
- async getLastProcessedHeight() {
191
- return this.storeService.storeCache.metadata.find('lastProcessedHeight');
192
- }
193
- async getStartHeight() {
194
- let startHeight;
195
- const lastProcessedHeight = await this.getLastProcessedHeight();
196
- if (lastProcessedHeight !== null && lastProcessedHeight !== undefined) {
197
- startHeight = Number(lastProcessedHeight) + 1;
198
- }
199
- else {
200
- startHeight = this.getStartBlockFromDataSources();
201
- }
202
- return startHeight;
203
- }
204
- async setBlockOffset(offset) {
205
- if (this._blockOffset !== undefined ||
206
- offset === null ||
207
- offset === undefined ||
208
- isNaN(offset)) {
209
- return;
210
- }
211
- logger.info(`set blockOffset to ${offset}`);
212
- this._blockOffset = offset;
213
- return this.mmrService.syncFileBaseFromPoi(offset).catch((err) => {
214
- logger.error(err, 'failed to sync poi to mmr');
215
- process.exit(1);
216
- });
217
- }
218
- getStartBlockFromDataSources() {
219
- const startBlocksList = this.project.dataSources.map((item) => { var _a; return (_a = item.startBlock) !== null && _a !== void 0 ? _a : 1; });
220
- if (startBlocksList.length === 0) {
221
- logger.error(`Failed to find a valid datasource, Please check your endpoint if specName filter is used.`);
222
- process.exit(1);
223
- }
224
- else {
225
- return Math.min(...startBlocksList);
226
- }
227
- }
228
- async reindex(targetBlockHeight) {
229
- const lastProcessedHeight = await this.getLastProcessedHeight();
230
- return (0, reindex_1.reindex)(this.getStartBlockFromDataSources(), await this.getMetadataBlockOffset(), targetBlockHeight, lastProcessedHeight, this.storeService, this.unfinalizedBlockService, this.dynamicDsService, this.mmrService, this.sequelize);
231
- }
232
- async getAllDataSources(blockHeight) {
233
- const dynamicDs = await this.dynamicDsService.getDynamicDatasources();
234
- return [...this.dataSources, ...dynamicDs].filter((ds) => ds.startBlock <= blockHeight);
235
- }
236
39
  };
237
40
  ProjectService = __decorate([
238
41
  (0, common_1.Injectable)(),