@subql/node-ethereum 2.12.6-0 → 2.12.6-2

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 (122) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/configure/NodeConfig.d.ts +21 -0
  4. package/dist/configure/NodeConfig.js +31 -0
  5. package/dist/configure/NodeConfig.js.map +1 -0
  6. package/dist/configure/SubqueryProject.d.ts +21 -29
  7. package/dist/configure/SubqueryProject.js +48 -72
  8. package/dist/configure/SubqueryProject.js.map +1 -1
  9. package/dist/configure/configure.module.d.ts +2 -2
  10. package/dist/configure/configure.module.js +19 -89
  11. package/dist/configure/configure.module.js.map +1 -1
  12. package/dist/ethereum/api.connection.d.ts +7 -7
  13. package/dist/ethereum/api.connection.js +4 -4
  14. package/dist/ethereum/api.connection.js.map +1 -1
  15. package/dist/ethereum/api.ethereum.d.ts +14 -8
  16. package/dist/ethereum/api.ethereum.js +24 -13
  17. package/dist/ethereum/api.ethereum.js.map +1 -1
  18. package/dist/ethereum/api.ethereum.test.js +29 -32
  19. package/dist/ethereum/api.ethereum.test.js.map +1 -1
  20. package/dist/ethereum/api.service.ethereum.d.ts +9 -7
  21. package/dist/ethereum/api.service.ethereum.js +56 -64
  22. package/dist/ethereum/api.service.ethereum.js.map +1 -1
  23. package/dist/ethereum/api.service.ethereum.test.js +8 -13
  24. package/dist/ethereum/api.service.ethereum.test.js.map +1 -1
  25. package/dist/ethereum/block.ethereum.d.ts +6 -15
  26. package/dist/ethereum/block.ethereum.js +52 -76
  27. package/dist/ethereum/block.ethereum.js.map +1 -1
  28. package/dist/ethereum/ethers/celo/celo-json-rpc-batch-provider.spec.js +3 -6
  29. package/dist/ethereum/ethers/celo/celo-json-rpc-batch-provider.spec.js.map +1 -1
  30. package/dist/ethereum/ethers/celo/celo-json-rpc-provider.spec.js +3 -6
  31. package/dist/ethereum/ethers/celo/celo-json-rpc-provider.spec.js.map +1 -1
  32. package/dist/ethereum/ethers/celo/celo-ws-provider.spec.js +3 -6
  33. package/dist/ethereum/ethers/celo/celo-ws-provider.spec.js.map +1 -1
  34. package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +7 -7
  35. package/dist/indexer/blockDispatcher/block-dispatcher.service.js +7 -6
  36. package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -1
  37. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +4 -4
  38. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +9 -18
  39. package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
  40. package/dist/indexer/dictionary.service.d.ts +3 -3
  41. package/dist/indexer/dictionary.service.js +7 -5
  42. package/dist/indexer/dictionary.service.js.map +1 -1
  43. package/dist/indexer/dynamic-ds.service.d.ts +3 -3
  44. package/dist/indexer/dynamic-ds.service.js.map +1 -1
  45. package/dist/indexer/fetch.module.js +8 -10
  46. package/dist/indexer/fetch.module.js.map +1 -1
  47. package/dist/indexer/fetch.service.d.ts +10 -10
  48. package/dist/indexer/fetch.service.js +22 -43
  49. package/dist/indexer/fetch.service.js.map +1 -1
  50. package/dist/indexer/fetch.service.spec.js +25 -45
  51. package/dist/indexer/fetch.service.spec.js.map +1 -1
  52. package/dist/indexer/indexer.manager.d.ts +10 -12
  53. package/dist/indexer/indexer.manager.js +20 -30
  54. package/dist/indexer/indexer.manager.js.map +1 -1
  55. package/dist/indexer/project.service.d.ts +8 -6
  56. package/dist/indexer/project.service.js +19 -12
  57. package/dist/indexer/project.service.js.map +1 -1
  58. package/dist/indexer/project.service.test.d.ts +1 -0
  59. package/dist/indexer/project.service.test.js +26 -0
  60. package/dist/indexer/project.service.test.js.map +1 -0
  61. package/dist/indexer/sandbox.service.d.ts +1 -1
  62. package/dist/indexer/sandbox.service.js +1 -0
  63. package/dist/indexer/sandbox.service.js.map +1 -1
  64. package/dist/indexer/types.d.ts +2 -11
  65. package/dist/indexer/types.js +0 -6
  66. package/dist/indexer/types.js.map +1 -1
  67. package/dist/indexer/unfinalizedBlocks.service.d.ts +4 -4
  68. package/dist/indexer/unfinalizedBlocks.service.js +25 -1
  69. package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
  70. package/dist/indexer/worker/worker.d.ts +4 -28
  71. package/dist/indexer/worker/worker.js +8 -71
  72. package/dist/indexer/worker/worker.js.map +1 -1
  73. package/dist/indexer/worker/worker.module.js +2 -2
  74. package/dist/indexer/worker/worker.module.js.map +1 -1
  75. package/dist/indexer/worker/worker.service.d.ts +11 -13
  76. package/dist/indexer/worker/worker.service.js +14 -56
  77. package/dist/indexer/worker/worker.service.js.map +1 -1
  78. package/dist/indexer/worker/worker.unfinalizedBlocks.service.d.ts +4 -8
  79. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js +8 -7
  80. package/dist/indexer/worker/worker.unfinalizedBlocks.service.js.map +1 -1
  81. package/dist/indexer/worker-fetch.module.d.ts +2 -0
  82. package/dist/indexer/{indexer.module.js → worker-fetch.module.js} +10 -33
  83. package/dist/indexer/worker-fetch.module.js.map +1 -0
  84. package/dist/init.js +1 -1
  85. package/dist/init.js.map +1 -1
  86. package/dist/main.js +4 -8
  87. package/dist/main.js.map +1 -1
  88. package/dist/subcommands/reindex.init.js +1 -2
  89. package/dist/subcommands/reindex.init.js.map +1 -1
  90. package/dist/subcommands/reindex.module.js +10 -6
  91. package/dist/subcommands/reindex.module.js.map +1 -1
  92. package/dist/subcommands/testing.init.js +2 -4
  93. package/dist/subcommands/testing.init.js.map +1 -1
  94. package/dist/subcommands/testing.module.js +3 -8
  95. package/dist/subcommands/testing.module.js.map +1 -1
  96. package/dist/subcommands/testing.service.d.ts +8 -5
  97. package/dist/subcommands/testing.service.js +3 -8
  98. package/dist/subcommands/testing.service.js.map +1 -1
  99. package/dist/utils/project.d.ts +5 -4
  100. package/dist/utils/project.js +17 -1
  101. package/dist/utils/project.js.map +1 -1
  102. package/dist/yargs.d.ts +7 -90
  103. package/dist/yargs.js +9 -112
  104. package/dist/yargs.js.map +1 -1
  105. package/package.json +8 -8
  106. package/dist/indexer/indexer.module.d.ts +0 -2
  107. package/dist/indexer/indexer.module.js.map +0 -1
  108. package/dist/subcommands/mmrMigrate.init.d.ts +0 -2
  109. package/dist/subcommands/mmrMigrate.init.js +0 -28
  110. package/dist/subcommands/mmrMigrate.init.js.map +0 -1
  111. package/dist/subcommands/mmrMigrate.module.d.ts +0 -2
  112. package/dist/subcommands/mmrMigrate.module.js +0 -28
  113. package/dist/subcommands/mmrMigrate.module.js.map +0 -1
  114. package/dist/subcommands/mmrRegenerate.init.d.ts +0 -1
  115. package/dist/subcommands/mmrRegenerate.init.js +0 -28
  116. package/dist/subcommands/mmrRegenerate.init.js.map +0 -1
  117. package/dist/subcommands/mmrRegenerate.module.d.ts +0 -2
  118. package/dist/subcommands/mmrRegenerate.module.js +0 -30
  119. package/dist/subcommands/mmrRegenerate.module.js.map +0 -1
  120. package/dist/subcommands/reindex.service.d.ts +0 -11
  121. package/dist/subcommands/reindex.service.js +0 -46
  122. package/dist/subcommands/reindex.service.js.map +0 -1
@@ -15,39 +15,46 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.ProjectService = void 0;
18
+ const worker_threads_1 = require("worker_threads");
18
19
  const common_1 = require("@nestjs/common");
19
20
  const event_emitter_1 = require("@nestjs/event-emitter");
20
21
  const node_core_1 = require("@subql/node-core");
21
22
  const x_sequelize_1 = require("@subql/x-sequelize");
22
23
  const SubqueryProject_1 = require("../configure/SubqueryProject");
24
+ const ethereum_1 = require("../ethereum");
23
25
  const ds_processor_service_1 = require("./ds-processor.service");
24
26
  const dynamic_ds_service_1 = require("./dynamic-ds.service");
25
27
  const unfinalizedBlocks_service_1 = require("./unfinalizedBlocks.service");
26
28
  // eslint-disable-next-line @typescript-eslint/no-var-requires
27
29
  const { version: packageVersion } = require('../../package.json');
28
30
  let ProjectService = class ProjectService extends node_core_1.BaseProjectService {
29
- constructor(dsProcessorService, apiService, poiService, mmrService, mmrQueryService, sequelize, project, storeService, nodeConfig, dynamicDsService, eventEmitter, unfinalizedBlockService) {
30
- super(dsProcessorService, apiService, poiService, mmrService, mmrQueryService, sequelize, project, storeService, nodeConfig, dynamicDsService, eventEmitter, unfinalizedBlockService);
31
+ constructor(dsProcessorService, apiService, poiService, sequelize, project, projectUpgradeService, storeService, nodeConfig, dynamicDsService, eventEmitter, unfinalizedBlockService) {
32
+ super(dsProcessorService, apiService, poiService, sequelize, project, projectUpgradeService, storeService, nodeConfig, dynamicDsService, eventEmitter, unfinalizedBlockService);
33
+ this.projectUpgradeService = projectUpgradeService;
31
34
  this.packageVersion = packageVersion;
32
35
  }
33
- async generateTimestampReferenceForBlockFilters(ds) {
34
- return (0, SubqueryProject_1.generateTimestampReferenceForBlockFilters)(ds, this.apiService.api);
36
+ async getBlockTimestamp(height) {
37
+ const block = await this.apiService.unsafeApi.api.getBlock(height);
38
+ return new Date(block.timestamp * 1000); // TODO test and make sure its in MS not S
35
39
  }
36
- getStartBlockDatasources() {
37
- return this.project.dataSources;
40
+ onProjectChange(project) {
41
+ // TODO update this when implementing skipBlock feature for Eth
42
+ this.apiService.updateBlockFetching();
38
43
  }
39
44
  };
40
45
  ProjectService = __decorate([
41
46
  (0, common_1.Injectable)(),
42
- __param(6, (0, common_1.Inject)('ISubqueryProject')),
47
+ __param(1, (0, common_1.Inject)(node_core_1.ApiService)),
48
+ __param(2, (0, common_1.Inject)(worker_threads_1.isMainThread ? node_core_1.PoiService : 'Null')),
49
+ __param(3, (0, common_1.Inject)(worker_threads_1.isMainThread ? x_sequelize_1.Sequelize : 'Null')),
50
+ __param(4, (0, common_1.Inject)('ISubqueryProject')),
51
+ __param(5, (0, common_1.Inject)('IProjectUpgradeService')),
52
+ __param(6, (0, common_1.Inject)(worker_threads_1.isMainThread ? node_core_1.StoreService : 'Null')),
43
53
  __metadata("design:paramtypes", [ds_processor_service_1.DsProcessorService,
44
- node_core_1.ApiService,
54
+ ethereum_1.EthereumApiService,
45
55
  node_core_1.PoiService,
46
- node_core_1.MmrService,
47
- node_core_1.MmrQueryService,
48
56
  x_sequelize_1.Sequelize,
49
- SubqueryProject_1.SubqueryProject,
50
- node_core_1.StoreService,
57
+ SubqueryProject_1.SubqueryProject, Object, node_core_1.StoreService,
51
58
  node_core_1.NodeConfig,
52
59
  dynamic_ds_service_1.DynamicDsService,
53
60
  event_emitter_1.EventEmitter2,
@@ -1 +1 @@
1
- {"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../src/indexer/project.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,gDAQ0B;AAC1B,oDAA+C;AAC/C,kEAIsC;AACtC,iEAA4D;AAC5D,6DAAwD;AACxD,2EAAuE;AAEvE,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAG3D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,8BAGnC;IAGC,YACE,kBAAsC,EACtC,UAAsB,EACtB,UAAsB,EACtB,UAAsB,EACtB,eAAgC,EAChC,SAAoB,EACQ,OAAwB,EACpD,YAA0B,EAC1B,UAAsB,EACtB,gBAAkC,EAClC,YAA2B,EAC3B,uBAAiD;QAEjD,KAAK,CACH,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,UAAU,EACV,eAAe,EACf,SAAS,EACT,OAAO,EACP,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,CACxB,CAAC;QA7BM,mBAAc,GAAG,cAAc,CAAC;IA8B1C,CAAC;IAES,KAAK,CAAC,yCAAyC,CACvD,EAAoB;QAEpB,OAAO,IAAA,2DAAyC,EAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IAES,wBAAwB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAClC,CAAC;CACF,CAAA;AA7CY,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAcR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCANP,yCAAkB;QAC1B,sBAAU;QACV,sBAAU;QACV,sBAAU;QACL,2BAAe;QACrB,uBAAS;QACiB,iCAAe;QACtC,wBAAY;QACd,sBAAU;QACJ,qCAAgB;QACpB,6BAAa;QACF,oDAAwB;GAlBxC,cAAc,CA6C1B;AA7CY,wCAAc","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n PoiService,\n MmrService,\n BaseProjectService,\n StoreService,\n NodeConfig,\n ApiService,\n MmrQueryService,\n} from '@subql/node-core';\nimport { Sequelize } from '@subql/x-sequelize';\nimport {\n generateTimestampReferenceForBlockFilters,\n SubqlProjectDs,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\n@Injectable()\nexport class ProjectService extends BaseProjectService<\n ApiService,\n SubqlProjectDs\n> {\n protected packageVersion = packageVersion;\n\n constructor(\n dsProcessorService: DsProcessorService,\n apiService: ApiService,\n poiService: PoiService,\n mmrService: MmrService,\n mmrQueryService: MmrQueryService,\n sequelize: Sequelize,\n @Inject('ISubqueryProject') project: SubqueryProject,\n storeService: StoreService,\n nodeConfig: NodeConfig,\n dynamicDsService: DynamicDsService,\n eventEmitter: EventEmitter2,\n unfinalizedBlockService: UnfinalizedBlocksService,\n ) {\n super(\n dsProcessorService,\n apiService,\n poiService,\n mmrService,\n mmrQueryService,\n sequelize,\n project,\n storeService,\n nodeConfig,\n dynamicDsService,\n eventEmitter,\n unfinalizedBlockService,\n );\n }\n\n protected async generateTimestampReferenceForBlockFilters(\n ds: SubqlProjectDs[],\n ): Promise<SubqlProjectDs[]> {\n return generateTimestampReferenceForBlockFilters(ds, this.apiService.api);\n }\n\n protected getStartBlockDatasources(): SubqlProjectDs[] {\n return this.project.dataSources;\n }\n}\n"]}
1
+ {"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../src/indexer/project.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAoD;AACpD,yDAAsD;AACtD,gDAO0B;AAC1B,oDAA+C;AAC/C,kEAGsC;AACtC,0CAAiD;AACjD,iEAA4D;AAC5D,6DAAwD;AACxD,2EAAuE;AAEvE,8DAA8D;AAC9D,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAG3D,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,8BAGnC;IAGC,YACE,kBAAsC,EAClB,UAA8B,EACN,UAAsB,EACvB,SAAoB,EACnC,OAAwB,EAEjC,qBAA8D,EACnC,YAA0B,EACxE,UAAsB,EACtB,gBAAkC,EAClC,YAA2B,EAC3B,uBAAiD;QAEjD,KAAK,CACH,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,SAAS,EACT,OAAO,EACP,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,uBAAuB,CACxB,CAAC;QAnBiB,0BAAqB,GAArB,qBAAqB,CAAyC;QATzE,mBAAc,GAAG,cAAc,CAAC;IA6B1C,CAAC;IAES,KAAK,CAAC,iBAAiB,CAAC,MAAc;QAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEnE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,0CAA0C;IACrF,CAAC;IAES,eAAe,CAAC,OAAwB;QAChD,+DAA+D;QAC/D,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;IACxC,CAAC;CACF,CAAA;AA7CY,cAAc;IAD1B,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,sBAAU,CAAC,CAAA;IAClB,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,sBAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAC1C,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,uBAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IACzC,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAC1B,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAEhC,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,wBAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;qCAPzB,yCAAkB;QACN,6BAAkB;QACM,sBAAU;QACZ,uBAAS;QAC1B,iCAAe,UAGQ,wBAAY;QAC5D,sBAAU;QACJ,qCAAgB;QACpB,6BAAa;QACF,oDAAwB;GAlBxC,cAAc,CA6C1B;AA7CY,wCAAc","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n PoiService,\n BaseProjectService,\n StoreService,\n NodeConfig,\n IProjectUpgradeService,\n ApiService,\n} from '@subql/node-core';\nimport { Sequelize } from '@subql/x-sequelize';\nimport {\n EthereumProjectDs,\n SubqueryProject,\n} from '../configure/SubqueryProject';\nimport { EthereumApiService } from '../ethereum';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\n@Injectable()\nexport class ProjectService extends BaseProjectService<\n EthereumApiService,\n EthereumProjectDs\n> {\n protected packageVersion = packageVersion;\n\n constructor(\n dsProcessorService: DsProcessorService,\n @Inject(ApiService) apiService: EthereumApiService,\n @Inject(isMainThread ? PoiService : 'Null') poiService: PoiService,\n @Inject(isMainThread ? Sequelize : 'Null') sequelize: Sequelize,\n @Inject('ISubqueryProject') project: SubqueryProject,\n @Inject('IProjectUpgradeService')\n protected readonly projectUpgradeService: IProjectUpgradeService<SubqueryProject>,\n @Inject(isMainThread ? StoreService : 'Null') storeService: StoreService,\n nodeConfig: NodeConfig,\n dynamicDsService: DynamicDsService,\n eventEmitter: EventEmitter2,\n unfinalizedBlockService: UnfinalizedBlocksService,\n ) {\n super(\n dsProcessorService,\n apiService,\n poiService,\n sequelize,\n project,\n projectUpgradeService,\n storeService,\n nodeConfig,\n dynamicDsService,\n eventEmitter,\n unfinalizedBlockService,\n );\n }\n\n protected async getBlockTimestamp(height: number): Promise<Date> {\n const block = await this.apiService.unsafeApi.api.getBlock(height);\n\n return new Date(block.timestamp * 1000); // TODO test and make sure its in MS not S\n }\n\n protected onProjectChange(project: SubqueryProject): void | Promise<void> {\n // TODO update this when implementing skipBlock feature for Eth\n this.apiService.updateBlockFetching();\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
3
+ // SPDX-License-Identifier: GPL-3.0
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const event_emitter_1 = require("@nestjs/event-emitter");
6
+ const ethereum_1 = require("../ethereum");
7
+ const project_service_1 = require("./project.service");
8
+ const mockApiService = () => {
9
+ const ethApi = new ethereum_1.EthereumApi('https://eth.api.onfinality.io/public', 20, new event_emitter_1.EventEmitter2());
10
+ // await ethApi.init();
11
+ return {
12
+ unsafeApi: ethApi,
13
+ };
14
+ };
15
+ describe('ProjectService', () => {
16
+ let projectService;
17
+ beforeEach(() => {
18
+ const apiService = mockApiService();
19
+ projectService = new project_service_1.ProjectService(null, apiService, null, null, null, null, null, {}, null, null, null);
20
+ });
21
+ it('can get a block timestamps', async () => {
22
+ const timestamp = await projectService.getBlockTimestamp(4000000);
23
+ expect(timestamp).toEqual(new Date('2017-07-09T20:52:47.000Z'));
24
+ });
25
+ });
26
+ //# sourceMappingURL=project.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.service.test.js","sourceRoot":"","sources":["../../src/indexer/project.service.test.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,yDAAsD;AACtD,0CAA8D;AAC9D,uDAAmD;AAEnD,MAAM,cAAc,GAAG,GAAuB,EAAE;IAC9C,MAAM,MAAM,GAAG,IAAI,sBAAW,CAC5B,sCAAsC,EACtC,EAAE,EACF,IAAI,6BAAa,EAAE,CACpB,CAAC;IAEF,uBAAuB;IAEvB,OAAO;QACL,SAAS,EAAE,MAAM;KACX,CAAC;AACX,CAAC,CAAC;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,cAA8B,CAAC;IAEnC,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QAEpC,cAAc,GAAG,IAAI,gCAAc,CACjC,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,EAAS,EACT,IAAI,EACJ,IAAI,EACJ,IAAI,CACL,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,SAAS,GAAG,MAAO,cAAsB,CAAC,iBAAiB,CAC/D,OAAS,CACV,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { EthereumApi, EthereumApiService } from '../ethereum';\nimport { ProjectService } from './project.service';\n\nconst mockApiService = (): EthereumApiService => {\n const ethApi = new EthereumApi(\n 'https://eth.api.onfinality.io/public',\n 20,\n new EventEmitter2(),\n );\n\n // await ethApi.init();\n\n return {\n unsafeApi: ethApi,\n } as any;\n};\n\ndescribe('ProjectService', () => {\n let projectService: ProjectService;\n\n beforeEach(() => {\n const apiService = mockApiService();\n\n projectService = new ProjectService(\n null,\n apiService,\n null,\n null,\n null,\n null,\n null,\n {} as any,\n null,\n null,\n null,\n );\n });\n\n it('can get a block timestamps', async () => {\n const timestamp = await (projectService as any).getBlockTimestamp(\n 4_000_000,\n );\n\n expect(timestamp).toEqual(new Date('2017-07-09T20:52:47.000Z'));\n });\n});\n"]}
@@ -1,5 +1,5 @@
1
- import { BaseDataSource } from '@subql/common';
2
1
  import { NodeConfig, StoreService, IndexerSandbox, ISubqueryProject, ApiService } from '@subql/node-core';
2
+ import { BaseDataSource } from '@subql/types-core';
3
3
  import SafeEthProvider from '../ethereum/safe-api';
4
4
  export declare class SandboxService {
5
5
  private readonly apiService;
@@ -55,6 +55,7 @@ let SandboxService = class SandboxService {
55
55
  };
56
56
  SandboxService = __decorate([
57
57
  (0, common_1.Injectable)(),
58
+ __param(1, (0, common_1.Inject)(worker_threads_1.isMainThread ? node_core_1.StoreService : 'Null')),
58
59
  __param(3, (0, common_1.Inject)('ISubqueryProject')),
59
60
  __metadata("design:paramtypes", [node_core_1.ApiService,
60
61
  node_core_1.StoreService,
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox.service.js","sourceRoot":"","sources":["../../src/indexer/sandbox.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAoD;AAEpD,gDAO0B;AAI1B,+GAA+G;AAExG,IAAM,cAAc,GAApB,MAAM,cAAc;IAGzB,YACmB,UAAsB,EACtB,YAA0B,EAC1B,UAAsB,EACM,OAAyB;QAHrD,eAAU,GAAV,UAAU,CAAY;QACtB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,eAAU,GAAV,UAAU,CAAY;QACM,YAAO,GAAP,OAAO,CAAkB;QANhE,mBAAc,GAAmC,EAAE,CAAC;IAOzD,CAAC;IAEJ,cAAc,CAAC,EAAkB,EAAE,GAAoB;QACrD,MAAM,KAAK,GAAU,6BAAY;YAC/B,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC9B,CAAC,CAAC,IAAA,4BAAgB,EAAE,MAAc,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;QAEpE,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,EAAE;YACd,SAAS,GAAG,IAAI,0BAAc,CAC5B;gBACE,KAAK;gBACL,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBACvB,KAAK;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;aACtC,EACD,IAAI,CAAC,UAAU,CAChB,CAAC;YACF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;SACxC;QACD,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YAC1B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;SACxD;QACD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,EAAkB;QAC3C,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACzB,CAAC;CACF,CAAA;AAxCY,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAQR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAHE,sBAAU;QACR,wBAAY;QACd,sBAAU;GAN9B,cAAc,CAwC1B;AAxCY,wCAAc","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { BaseDataSource } from '@subql/common';\nimport {\n NodeConfig,\n StoreService,\n IndexerSandbox,\n hostStoreToStore,\n ISubqueryProject,\n ApiService,\n} from '@subql/node-core';\nimport { Store } from '@subql/types-ethereum';\nimport SafeEthProvider from '../ethereum/safe-api';\n\n/* It would be nice to move this to node core but need to find a way to inject other things into the sandbox */\n@Injectable()\nexport class SandboxService {\n private processorCache: Record<string, IndexerSandbox> = {};\n\n constructor(\n private readonly apiService: ApiService,\n private readonly storeService: StoreService,\n private readonly nodeConfig: NodeConfig,\n @Inject('ISubqueryProject') private readonly project: ISubqueryProject,\n ) {}\n\n getDsProcessor(ds: BaseDataSource, api: SafeEthProvider): IndexerSandbox {\n const store: Store = isMainThread\n ? this.storeService.getStore()\n : hostStoreToStore((global as any).host); // Provided in worker.ts\n\n const entry = this.getDataSourceEntry(ds);\n let processor = this.processorCache[entry];\n if (!processor) {\n processor = new IndexerSandbox(\n {\n store,\n root: this.project.root,\n entry,\n chainId: this.project.network.chainId,\n },\n this.nodeConfig,\n );\n this.processorCache[entry] = processor;\n }\n processor.freeze(api, 'api');\n if (this.nodeConfig.unsafe) {\n processor.freeze(this.apiService.api.api, 'unsafeApi');\n }\n processor.freeze(this.project.network.chainId, 'chainId');\n return processor;\n }\n\n private getDataSourceEntry(ds: BaseDataSource): string {\n return ds.mapping.file;\n }\n}\n"]}
1
+ {"version":3,"file":"sandbox.service.js","sourceRoot":"","sources":["../../src/indexer/sandbox.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAoD;AACpD,gDAO0B;AAI1B,+GAA+G;AAExG,IAAM,cAAc,GAApB,MAAM,cAAc;IAGzB,YACmB,UAAsB,EAEtB,YAA0B,EAC1B,UAAsB,EACM,OAAyB;QAJrD,eAAU,GAAV,UAAU,CAAY;QAEtB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,eAAU,GAAV,UAAU,CAAY;QACM,YAAO,GAAP,OAAO,CAAkB;QAPhE,mBAAc,GAAmC,EAAE,CAAC;IAQzD,CAAC;IAEJ,cAAc,CAAC,EAAkB,EAAE,GAAoB;QACrD,MAAM,KAAK,GAAU,6BAAY;YAC/B,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC9B,CAAC,CAAC,IAAA,4BAAgB,EAAE,MAAc,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;QAEpE,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,EAAE;YACd,SAAS,GAAG,IAAI,0BAAc,CAC5B;gBACE,KAAK;gBACL,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBACvB,KAAK;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;aACtC,EACD,IAAI,CAAC,UAAU,CAChB,CAAC;YACF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;SACxC;QACD,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YAC1B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;SACxD;QACD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,EAAkB;QAC3C,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACzB,CAAC;CACF,CAAA;AAzCY,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAMR,WAAA,IAAA,eAAM,EAAC,6BAAY,CAAC,CAAC,CAAC,wBAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAG5C,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAJE,sBAAU;QAER,wBAAY;QACd,sBAAU;GAP9B,cAAc,CAyC1B;AAzCY,wCAAc","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n NodeConfig,\n StoreService,\n IndexerSandbox,\n hostStoreToStore,\n ISubqueryProject,\n ApiService,\n} from '@subql/node-core';\nimport { BaseDataSource, Store } from '@subql/types-core';\nimport SafeEthProvider from '../ethereum/safe-api';\n\n/* It would be nice to move this to node core but need to find a way to inject other things into the sandbox */\n@Injectable()\nexport class SandboxService {\n private processorCache: Record<string, IndexerSandbox> = {};\n\n constructor(\n private readonly apiService: ApiService,\n @Inject(isMainThread ? StoreService : 'Null')\n private readonly storeService: StoreService,\n private readonly nodeConfig: NodeConfig,\n @Inject('ISubqueryProject') private readonly project: ISubqueryProject,\n ) {}\n\n getDsProcessor(ds: BaseDataSource, api: SafeEthProvider): IndexerSandbox {\n const store: Store = isMainThread\n ? this.storeService.getStore()\n : hostStoreToStore((global as any).host); // Provided in worker.ts\n\n const entry = this.getDataSourceEntry(ds);\n let processor = this.processorCache[entry];\n if (!processor) {\n processor = new IndexerSandbox(\n {\n store,\n root: this.project.root,\n entry,\n chainId: this.project.network.chainId,\n },\n this.nodeConfig,\n );\n this.processorCache[entry] = processor;\n }\n processor.freeze(api, 'api');\n if (this.nodeConfig.unsafe) {\n processor.freeze(this.apiService.api.api, 'unsafeApi');\n }\n processor.freeze(this.project.network.chainId, 'chainId');\n return processor;\n }\n\n private getDataSourceEntry(ds: BaseDataSource): string {\n return ds.mapping.file;\n }\n}\n"]}
@@ -1,11 +1,2 @@
1
- import { Entity } from '@subql/types-ethereum';
2
- export declare enum OperationType {
3
- Set = "Set",
4
- Remove = "Remove"
5
- }
6
- export type OperationEntity = {
7
- operation: OperationType;
8
- entityType: string;
9
- data: Entity | string;
10
- };
11
- export type BestBlocks = Record<number, string>;
1
+ import { EthereumBlock, LightEthereumBlock } from '@subql/types-ethereum';
2
+ export type BlockContent = EthereumBlock | LightEthereumBlock;
@@ -2,10 +2,4 @@
2
2
  // Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
3
3
  // SPDX-License-Identifier: GPL-3.0
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.OperationType = void 0;
6
- var OperationType;
7
- (function (OperationType) {
8
- OperationType["Set"] = "Set";
9
- OperationType["Remove"] = "Remove";
10
- })(OperationType = exports.OperationType || (exports.OperationType = {}));
11
5
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAInC,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,4BAAW,CAAA;IACX,kCAAiB,CAAA;AACnB,CAAC,EAHW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAGxB","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Entity } from '@subql/types-ethereum';\n\nexport enum OperationType {\n Set = 'Set',\n Remove = 'Remove',\n}\n\nexport type OperationEntity = {\n operation: OperationType;\n entityType: string;\n data: Entity | string;\n};\n\nexport type BestBlocks = Record<number, string>;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EthereumBlock, LightEthereumBlock } from '@subql/types-ethereum';\n\nexport type BlockContent = EthereumBlock | LightEthereumBlock;\n"]}
@@ -1,11 +1,11 @@
1
1
  import { Block } from '@ethersproject/abstract-provider';
2
2
  import { ApiService, BaseUnfinalizedBlocksService, Header, NodeConfig, StoreCacheService } from '@subql/node-core';
3
- import { BlockWrapper, EthereumBlock } from '@subql/types-ethereum';
4
- export declare function blockToHeader(block: EthereumBlock | Block): Header;
5
- export declare class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<BlockWrapper> {
3
+ import { BlockContent } from './types';
4
+ export declare function blockToHeader(block: BlockContent | Block): Header;
5
+ export declare class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<BlockContent> {
6
6
  private readonly apiService;
7
7
  constructor(apiService: ApiService, nodeConfig: NodeConfig, storeCache: StoreCacheService);
8
- protected blockToHeader(block: BlockWrapper): Header;
8
+ protected blockToHeader(block: BlockContent): Header;
9
9
  protected getFinalizedHead(): Promise<Header>;
10
10
  protected getHeaderForHash(hash: string): Promise<Header>;
11
11
  protected getHeaderForHeight(height: number): Promise<Header>;
@@ -28,7 +28,7 @@ let UnfinalizedBlocksService = class UnfinalizedBlocksService extends node_core_
28
28
  this.apiService = apiService;
29
29
  }
30
30
  blockToHeader(block) {
31
- return blockToHeader(block.block);
31
+ return blockToHeader(block);
32
32
  }
33
33
  async getFinalizedHead() {
34
34
  const finalizedBlock = await this.apiService.api.getFinalizedBlock();
@@ -43,6 +43,30 @@ let UnfinalizedBlocksService = class UnfinalizedBlocksService extends node_core_
43
43
  return blockToHeader(block);
44
44
  }
45
45
  };
46
+ __decorate([
47
+ (0, node_core_1.mainThreadOnly)(),
48
+ __metadata("design:type", Function),
49
+ __metadata("design:paramtypes", [Object]),
50
+ __metadata("design:returntype", Object)
51
+ ], UnfinalizedBlocksService.prototype, "blockToHeader", null);
52
+ __decorate([
53
+ (0, node_core_1.mainThreadOnly)(),
54
+ __metadata("design:type", Function),
55
+ __metadata("design:paramtypes", []),
56
+ __metadata("design:returntype", Promise)
57
+ ], UnfinalizedBlocksService.prototype, "getFinalizedHead", null);
58
+ __decorate([
59
+ (0, node_core_1.mainThreadOnly)(),
60
+ __metadata("design:type", Function),
61
+ __metadata("design:paramtypes", [String]),
62
+ __metadata("design:returntype", Promise)
63
+ ], UnfinalizedBlocksService.prototype, "getHeaderForHash", null);
64
+ __decorate([
65
+ (0, node_core_1.mainThreadOnly)(),
66
+ __metadata("design:type", Function),
67
+ __metadata("design:paramtypes", [Number]),
68
+ __metadata("design:returntype", Promise)
69
+ ], UnfinalizedBlocksService.prototype, "getHeaderForHeight", null);
46
70
  UnfinalizedBlocksService = __decorate([
47
71
  (0, common_1.Injectable)(),
48
72
  __metadata("design:paramtypes", [node_core_1.ApiService,
@@ -1 +1 @@
1
- {"version":3,"file":"unfinalizedBlocks.service.js","sourceRoot":"","sources":["../../src/indexer/unfinalizedBlocks.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;AAGnC,2CAA4C;AAC5C,gDAM0B;AAG1B,SAAgB,aAAa,CAAC,KAA4B;IACxD,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC;AAND,sCAMC;AAGM,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,wCAA0C;IACtF,YACmB,UAAsB,EACvC,UAAsB,EACtB,UAA6B;QAE7B,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAJb,eAAU,GAAV,UAAU,CAAY;IAKzC,CAAC;IAES,aAAa,CAAC,KAAmB;QACzC,OAAO,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAES,KAAK,CAAC,gBAAgB;QAC9B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACrE,OAAO,aAAa,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC;IAES,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAES,KAAK,CAAC,kBAAkB,CAAC,MAAc;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACvE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF,CAAA;AA3BY,wBAAwB;IADpC,IAAA,mBAAU,GAAE;qCAGoB,sBAAU;QAC3B,sBAAU;QACV,6BAAiB;GAJpB,wBAAwB,CA2BpC;AA3BY,4DAAwB","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Block } from '@ethersproject/abstract-provider';\nimport { Injectable } from '@nestjs/common';\nimport {\n ApiService,\n BaseUnfinalizedBlocksService,\n Header,\n NodeConfig,\n StoreCacheService,\n} from '@subql/node-core';\nimport { BlockWrapper, EthereumBlock } from '@subql/types-ethereum';\n\nexport function blockToHeader(block: EthereumBlock | Block): Header {\n return {\n blockHeight: block.number,\n blockHash: block.hash,\n parentHash: block.parentHash,\n };\n}\n\n@Injectable()\nexport class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<BlockWrapper> {\n constructor(\n private readonly apiService: ApiService,\n nodeConfig: NodeConfig,\n storeCache: StoreCacheService,\n ) {\n super(nodeConfig, storeCache);\n }\n\n protected blockToHeader(block: BlockWrapper): Header {\n return blockToHeader(block.block);\n }\n\n protected async getFinalizedHead(): Promise<Header> {\n const finalizedBlock = await this.apiService.api.getFinalizedBlock();\n return blockToHeader(finalizedBlock);\n }\n\n protected async getHeaderForHash(hash: string): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(hash);\n return blockToHeader(block);\n }\n\n protected async getHeaderForHeight(height: number): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(height);\n return blockToHeader(block);\n }\n}\n"]}
1
+ {"version":3,"file":"unfinalizedBlocks.service.js","sourceRoot":"","sources":["../../src/indexer/unfinalizedBlocks.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;AAGnC,2CAA4C;AAC5C,gDAO0B;AAG1B,SAAgB,aAAa,CAAC,KAA2B;IACvD,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC;AAND,sCAMC;AAGM,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,wCAA0C;IACtF,YACmB,UAAsB,EACvC,UAAsB,EACtB,UAA6B;QAE7B,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAJb,eAAU,GAAV,UAAU,CAAY;IAKzC,CAAC;IAGS,aAAa,CAAC,KAAmB;QACzC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAGe,AAAN,KAAK,CAAC,gBAAgB;QAC9B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACrE,OAAO,aAAa,CAAC,cAAc,CAAC,CAAC;IACvC,CAAC;IAGe,AAAN,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAGe,AAAN,KAAK,CAAC,kBAAkB,CAAC,MAAc;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACvE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF,CAAA;AAtBC;IAAC,IAAA,0BAAc,GAAE;;;;6DAGhB;AAGe;IADf,IAAA,0BAAc,GAAE;;;;gEAIhB;AAGe;IADf,IAAA,0BAAc,GAAE;;;;gEAIhB;AAGe;IADf,IAAA,0BAAc,GAAE;;;;kEAIhB;AA9BU,wBAAwB;IADpC,IAAA,mBAAU,GAAE;qCAGoB,sBAAU;QAC3B,sBAAU;QACV,6BAAiB;GAJpB,wBAAwB,CA+BpC;AA/BY,4DAAwB","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Block } from '@ethersproject/abstract-provider';\nimport { Injectable } from '@nestjs/common';\nimport {\n ApiService,\n BaseUnfinalizedBlocksService,\n Header,\n mainThreadOnly,\n NodeConfig,\n StoreCacheService,\n} from '@subql/node-core';\nimport { BlockContent } from './types';\n\nexport function blockToHeader(block: BlockContent | Block): Header {\n return {\n blockHeight: block.number,\n blockHash: block.hash,\n parentHash: block.parentHash,\n };\n}\n\n@Injectable()\nexport class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<BlockContent> {\n constructor(\n private readonly apiService: ApiService,\n nodeConfig: NodeConfig,\n storeCache: StoreCacheService,\n ) {\n super(nodeConfig, storeCache);\n }\n\n @mainThreadOnly()\n protected blockToHeader(block: BlockContent): Header {\n return blockToHeader(block);\n }\n\n @mainThreadOnly()\n protected async getFinalizedHead(): Promise<Header> {\n const finalizedBlock = await this.apiService.api.getFinalizedBlock();\n return blockToHeader(finalizedBlock);\n }\n\n @mainThreadOnly()\n protected async getHeaderForHash(hash: string): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(hash);\n return blockToHeader(block);\n }\n\n @mainThreadOnly()\n protected async getHeaderForHeight(height: number): Promise<Header> {\n const block = await this.apiService.api.getBlockByHeightOrHash(height);\n return blockToHeader(block);\n }\n}\n"]}
@@ -1,31 +1,7 @@
1
- import { ProcessBlockResponse } from '@subql/node-core';
2
- import { FetchBlockResponse, WorkerStatusResponse } from './worker.service';
3
- declare function initWorker(): Promise<void>;
4
- declare function fetchBlock(height: number): Promise<FetchBlockResponse>;
5
- declare function processBlock(height: number): Promise<ProcessBlockResponse>;
6
- declare function numFetchedBlocks(): Promise<number>;
7
- declare function numFetchingBlocks(): Promise<number>;
8
- declare function getStatus(): Promise<WorkerStatusResponse>;
9
- declare function getMemoryLeft(): Promise<number>;
10
- declare function waitForWorkerBatchSize(heapSizeInBytes: number): Promise<void>;
11
- type InitWorker = typeof initWorker;
12
- type FetchBlock = typeof fetchBlock;
13
- type ProcessBlock = typeof processBlock;
14
- type NumFetchedBlocks = typeof numFetchedBlocks;
15
- type NumFetchingBlocks = typeof numFetchingBlocks;
16
- type GetWorkerStatus = typeof getStatus;
17
- type GetMemoryLeft = typeof getMemoryLeft;
18
- type WaitForWorkerBatchSize = typeof waitForWorkerBatchSize;
19
- export type IIndexerWorker = {
20
- processBlock: ProcessBlock;
21
- fetchBlock: FetchBlock;
22
- numFetchedBlocks: NumFetchedBlocks;
23
- numFetchingBlocks: NumFetchingBlocks;
24
- getStatus: GetWorkerStatus;
25
- getMemoryLeft: GetMemoryLeft;
26
- waitForWorkerBatchSize: WaitForWorkerBatchSize;
27
- };
1
+ import { IBaseIndexerWorker } from '@subql/node-core';
2
+ declare function initWorker(startHeight: number): Promise<void>;
3
+ export type IIndexerWorker = IBaseIndexerWorker;
28
4
  export type IInitIndexerWorker = IIndexerWorker & {
29
- initWorker: InitWorker;
5
+ initWorker: typeof initWorker;
30
6
  };
31
7
  export {};
@@ -1,9 +1,6 @@
1
1
  "use strict";
2
2
  // Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
3
3
  // SPDX-License-Identifier: GPL-3.0
4
- var __importDefault = (this && this.__importDefault) || function (mod) {
5
- return (mod && mod.__esModule) ? mod : { "default": mod };
6
- };
7
4
  Object.defineProperty(exports, "__esModule", { value: true });
8
5
  // initlogger and yargs must be imported before all other imports
9
6
  // making sure logger is defined before its called
@@ -13,32 +10,23 @@ const logger_1 = require("@subql/node-core/logger");
13
10
  const yargs_1 = require("../../yargs");
14
11
  const { argv } = yargs_1.yargsOptions;
15
12
  (0, logger_1.initLogger)(argv.debug, argv.outputFmt, argv.logLevel);
16
- const assert_1 = __importDefault(require("assert"));
17
13
  const node_worker_threads_1 = require("node:worker_threads");
18
- const v8_1 = require("v8");
19
14
  const core_1 = require("@nestjs/core");
20
15
  const node_core_1 = require("@subql/node-core");
21
- const indexer_manager_1 = require("../indexer.manager");
22
16
  const worker_module_1 = require("./worker.module");
23
17
  const worker_service_1 = require("./worker.service");
24
- const worker_unfinalizedBlocks_service_1 = require("./worker.unfinalizedBlocks.service");
25
- let app;
26
- let workerService;
27
18
  const logger = (0, node_core_1.getLogger)(`worker #${node_worker_threads_1.threadId}`);
28
- async function initWorker() {
19
+ async function initWorker(startHeight) {
29
20
  try {
30
- if (app) {
31
- logger.warn('Worker already initialised');
32
- return;
33
- }
34
- app = await core_1.NestFactory.create(worker_module_1.WorkerModule, {
35
- logger: new node_core_1.NestLogger(), // TIP: If the worker is crashing comment out this line for better logging
21
+ const app = await core_1.NestFactory.create(worker_module_1.WorkerModule, {
22
+ logger: new node_core_1.NestLogger(argv.debug), // TIP: If the worker is crashing comment out this line for better logging
36
23
  });
37
24
  await app.init();
38
- const indexerManager = app.get(indexer_manager_1.IndexerManager);
25
+ const projectService = app.get('IProjectService');
39
26
  // Initialise async services, we do this here rather than in factories so we can capture one off events
40
- await indexerManager.start();
41
- workerService = app.get(worker_service_1.WorkerService);
27
+ await projectService.init(startHeight);
28
+ const workerService = app.get(worker_service_1.WorkerService);
29
+ (0, node_core_1.initWorkerServices)(app, workerService);
42
30
  }
43
31
  catch (e) {
44
32
  console.log('Failed to start worker', e);
@@ -46,58 +34,7 @@ async function initWorker() {
46
34
  throw e;
47
35
  }
48
36
  }
49
- async function fetchBlock(height) {
50
- (0, assert_1.default)(workerService, 'Not initialised');
51
- return workerService.fetchBlock(height);
52
- }
53
- async function processBlock(height) {
54
- (0, assert_1.default)(workerService, 'Not initialised');
55
- return workerService.processBlock(height);
56
- }
57
- // eslint-disable-next-line @typescript-eslint/require-await
58
- async function numFetchedBlocks() {
59
- return workerService.numFetchedBlocks;
60
- }
61
- // eslint-disable-next-line @typescript-eslint/require-await
62
- async function numFetchingBlocks() {
63
- return workerService.numFetchingBlocks;
64
- }
65
- // eslint-disable-next-line @typescript-eslint/require-await
66
- async function getStatus() {
67
- return {
68
- threadId: node_worker_threads_1.threadId,
69
- fetchedBlocks: workerService.numFetchedBlocks,
70
- toFetchBlocks: workerService.numFetchingBlocks,
71
- isIndexing: workerService.isIndexing,
72
- };
73
- }
74
- // eslint-disable-next-line @typescript-eslint/require-await
75
- async function getMemoryLeft() {
76
- const totalHeap = (0, v8_1.getHeapStatistics)().heap_size_limit;
77
- const heapUsed = process.memoryUsage().heapUsed;
78
- return totalHeap - heapUsed;
79
- }
80
- async function waitForWorkerBatchSize(heapSizeInBytes) {
81
- await (0, node_core_1.waitForBatchSize)(heapSizeInBytes);
82
- }
83
- // Register these functions to be exposed to worker host
84
- global.host = node_core_1.WorkerHost.create([
85
- ...node_core_1.hostStoreKeys,
86
- ...node_core_1.hostDynamicDsKeys,
87
- ...worker_unfinalizedBlocks_service_1.hostUnfinalizedBlocksKeys,
88
- ...node_core_1.hostConnectionPoolStateKeys,
89
- ], {
37
+ global.host = (0, node_core_1.createWorkerHost)([], {
90
38
  initWorker,
91
- fetchBlock,
92
- processBlock,
93
- numFetchedBlocks,
94
- numFetchingBlocks,
95
- getStatus,
96
- getMemoryLeft,
97
- waitForWorkerBatchSize,
98
- }, logger);
99
- process.on('uncaughtException', (e) => {
100
- logger.error(e, 'Uncaught Exception');
101
- throw e;
102
39
  });
103
40
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;AAEnC,iEAAiE;AACjE,kDAAkD;AAClD,wCAAwC;AACxC,oDAAqD;AACrD,wCAAwC;AACxC,uCAA2C;AAE3C,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,IAAA,mBAAU,EACR,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAA+B,EACpC,IAAI,CAAC,QAA8B,CACpC,CAAC;AAEF,oDAA4B;AAC5B,6DAA+C;AAC/C,2BAAuC;AAEvC,uCAA2C;AAC3C,gDAY0B;AAG1B,wDAAoD;AACpD,mDAA+C;AAC/C,qDAI0B;AAC1B,yFAG4C;AAC5C,IAAI,GAAqB,CAAC;AAC1B,IAAI,aAA4B,CAAC;AAEjC,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,WAAW,8BAAQ,EAAE,CAAC,CAAC;AAEhD,KAAK,UAAU,UAAU;IACvB,IAAI;QACF,IAAI,GAAG,EAAE;YACP,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO;SACR;QAED,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,4BAAY,EAAE;YAC3C,MAAM,EAAE,IAAI,sBAAU,EAAE,EAAE,0EAA0E;SACrG,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,gCAAc,CAAC,CAAC;QAC/C,uGAAuG;QACvG,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;QAE7B,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,8BAAa,CAAC,CAAC;KACxC;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC;KACT;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAc;IACtC,IAAA,gBAAM,EAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IACzC,OAAO,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAAc;IACxC,IAAA,gBAAM,EAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAEzC,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,4DAA4D;AAC5D,KAAK,UAAU,gBAAgB;IAC7B,OAAO,aAAa,CAAC,gBAAgB,CAAC;AACxC,CAAC;AAED,4DAA4D;AAC5D,KAAK,UAAU,iBAAiB;IAC9B,OAAO,aAAa,CAAC,iBAAiB,CAAC;AACzC,CAAC;AAED,4DAA4D;AAC5D,KAAK,UAAU,SAAS;IACtB,OAAO;QACL,QAAQ,EAAR,8BAAQ;QACR,aAAa,EAAE,aAAa,CAAC,gBAAgB;QAC7C,aAAa,EAAE,aAAa,CAAC,iBAAiB;QAC9C,UAAU,EAAE,aAAa,CAAC,UAAU;KACrC,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,KAAK,UAAU,aAAa;IAC1B,MAAM,SAAS,GAAG,IAAA,sBAAiB,GAAE,CAAC,eAAe,CAAC;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;IAEhD,OAAO,SAAS,GAAG,QAAQ,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,eAAuB;IAC3D,MAAM,IAAA,4BAAgB,EAAC,eAAe,CAAC,CAAC;AAC1C,CAAC;AAED,wDAAwD;AACvD,MAAc,CAAC,IAAI,GAAG,sBAAU,CAAC,MAAM,CAOtC;IACE,GAAG,yBAAa;IAChB,GAAG,6BAAiB;IACpB,GAAG,4DAAyB;IAC5B,GAAG,uCAA2B;CAC/B,EACD;IACE,UAAU;IACV,UAAU;IACV,YAAY;IACZ,gBAAgB;IAChB,iBAAiB;IACjB,SAAS;IACT,aAAa;IACb,sBAAsB;CACvB,EACD,MAAM,CACP,CAAC;AA0BF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE;IACpC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACtC,MAAM,CAAC,CAAC;AACV,CAAC,CAAC,CAAC","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\n// initlogger and yargs must be imported before all other imports\n// making sure logger is defined before its called\n// eslint-disable-next-line import/order\nimport { initLogger } from '@subql/node-core/logger';\n// eslint-disable-next-line import/order\nimport { yargsOptions } from '../../yargs';\n\nconst { argv } = yargsOptions;\n\ninitLogger(\n argv.debug,\n argv.outputFmt as 'json' | 'colored',\n argv.logLevel as string | undefined,\n);\n\nimport assert from 'assert';\nimport { threadId } from 'node:worker_threads';\nimport { getHeapStatistics } from 'v8';\nimport { INestApplication } from '@nestjs/common';\nimport { NestFactory } from '@nestjs/core';\nimport {\n waitForBatchSize,\n WorkerHost,\n getLogger,\n NestLogger,\n hostStoreKeys,\n HostStore,\n hostDynamicDsKeys,\n HostDynamicDS,\n ProcessBlockResponse,\n HostConnectionPoolState,\n hostConnectionPoolStateKeys,\n} from '@subql/node-core';\nimport { SubqlProjectDs } from '../../configure/SubqueryProject';\nimport { EthereumApiConnection } from '../../ethereum/api.connection';\nimport { IndexerManager } from '../indexer.manager';\nimport { WorkerModule } from './worker.module';\nimport {\n FetchBlockResponse,\n WorkerService,\n WorkerStatusResponse,\n} from './worker.service';\nimport {\n HostUnfinalizedBlocks,\n hostUnfinalizedBlocksKeys,\n} from './worker.unfinalizedBlocks.service';\nlet app: INestApplication;\nlet workerService: WorkerService;\n\nconst logger = getLogger(`worker #${threadId}`);\n\nasync function initWorker(): Promise<void> {\n try {\n if (app) {\n logger.warn('Worker already initialised');\n return;\n }\n\n app = await NestFactory.create(WorkerModule, {\n logger: new NestLogger(), // TIP: If the worker is crashing comment out this line for better logging\n });\n\n await app.init();\n\n const indexerManager = app.get(IndexerManager);\n // Initialise async services, we do this here rather than in factories so we can capture one off events\n await indexerManager.start();\n\n workerService = app.get(WorkerService);\n } catch (e) {\n console.log('Failed to start worker', e);\n logger.error(e, 'Failed to start worker');\n throw e;\n }\n}\n\nasync function fetchBlock(height: number): Promise<FetchBlockResponse> {\n assert(workerService, 'Not initialised');\n return workerService.fetchBlock(height);\n}\n\nasync function processBlock(height: number): Promise<ProcessBlockResponse> {\n assert(workerService, 'Not initialised');\n\n return workerService.processBlock(height);\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nasync function numFetchedBlocks(): Promise<number> {\n return workerService.numFetchedBlocks;\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nasync function numFetchingBlocks(): Promise<number> {\n return workerService.numFetchingBlocks;\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nasync function getStatus(): Promise<WorkerStatusResponse> {\n return {\n threadId,\n fetchedBlocks: workerService.numFetchedBlocks,\n toFetchBlocks: workerService.numFetchingBlocks,\n isIndexing: workerService.isIndexing,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nasync function getMemoryLeft(): Promise<number> {\n const totalHeap = getHeapStatistics().heap_size_limit;\n const heapUsed = process.memoryUsage().heapUsed;\n\n return totalHeap - heapUsed;\n}\n\nasync function waitForWorkerBatchSize(heapSizeInBytes: number): Promise<void> {\n await waitForBatchSize(heapSizeInBytes);\n}\n\n// Register these functions to be exposed to worker host\n(global as any).host = WorkerHost.create<\n HostStore &\n HostDynamicDS<SubqlProjectDs> &\n HostUnfinalizedBlocks &\n HostConnectionPoolState<EthereumApiConnection>,\n IInitIndexerWorker\n>(\n [\n ...hostStoreKeys,\n ...hostDynamicDsKeys,\n ...hostUnfinalizedBlocksKeys,\n ...hostConnectionPoolStateKeys,\n ],\n {\n initWorker,\n fetchBlock,\n processBlock,\n numFetchedBlocks,\n numFetchingBlocks,\n getStatus,\n getMemoryLeft,\n waitForWorkerBatchSize,\n },\n logger,\n);\n\n// Export types to be used on the parent\ntype InitWorker = typeof initWorker;\ntype FetchBlock = typeof fetchBlock;\ntype ProcessBlock = typeof processBlock;\ntype NumFetchedBlocks = typeof numFetchedBlocks;\ntype NumFetchingBlocks = typeof numFetchingBlocks;\ntype GetWorkerStatus = typeof getStatus;\ntype GetMemoryLeft = typeof getMemoryLeft;\ntype WaitForWorkerBatchSize = typeof waitForWorkerBatchSize;\n\nexport type IIndexerWorker = {\n processBlock: ProcessBlock;\n fetchBlock: FetchBlock;\n numFetchedBlocks: NumFetchedBlocks;\n numFetchingBlocks: NumFetchingBlocks;\n getStatus: GetWorkerStatus;\n getMemoryLeft: GetMemoryLeft;\n waitForWorkerBatchSize: WaitForWorkerBatchSize;\n};\n\nexport type IInitIndexerWorker = IIndexerWorker & {\n initWorker: InitWorker;\n};\n\nprocess.on('uncaughtException', (e) => {\n logger.error(e, 'Uncaught Exception');\n throw e;\n});\n"]}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,iEAAiE;AACjE,kDAAkD;AAClD,wCAAwC;AACxC,oDAAqD;AACrD,wCAAwC;AACxC,uCAA2C;AAE3C,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,IAAA,mBAAU,EACR,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAA+B,EACpC,IAAI,CAAC,QAA8B,CACpC,CAAC;AAEF,6DAA+C;AAC/C,uCAA2C;AAC3C,gDAM0B;AAE1B,mDAA+C;AAC/C,qDAAiD;AAEjD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,WAAW,8BAAQ,EAAE,CAAC,CAAC;AAEhD,KAAK,UAAU,UAAU,CAAC,WAAmB;IAC3C,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,4BAAY,EAAE;YACjD,MAAM,EAAE,IAAI,sBAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,0EAA0E;SAC/G,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,cAAc,GAAmB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,uGAAuG;QACvG,MAAM,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvC,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,8BAAa,CAAC,CAAC;QAE7C,IAAA,8BAAkB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAC;KACxC;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC;KACT;AACH,CAAC;AAQA,MAAc,CAAC,IAAI,GAAG,IAAA,4BAAgB,EAAC,EAAE,EAAE;IAC1C,UAAU;CACX,CAAC,CAAC","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\n// initlogger and yargs must be imported before all other imports\n// making sure logger is defined before its called\n// eslint-disable-next-line import/order\nimport { initLogger } from '@subql/node-core/logger';\n// eslint-disable-next-line import/order\nimport { yargsOptions } from '../../yargs';\n\nconst { argv } = yargsOptions;\n\ninitLogger(\n argv.debug,\n argv.outputFmt as 'json' | 'colored',\n argv.logLevel as string | undefined,\n);\n\nimport { threadId } from 'node:worker_threads';\nimport { NestFactory } from '@nestjs/core';\nimport {\n getLogger,\n NestLogger,\n createWorkerHost,\n IBaseIndexerWorker,\n initWorkerServices,\n} from '@subql/node-core';\nimport { ProjectService } from '../project.service';\nimport { WorkerModule } from './worker.module';\nimport { WorkerService } from './worker.service';\n\nconst logger = getLogger(`worker #${threadId}`);\n\nasync function initWorker(startHeight: number): Promise<void> {\n try {\n const app = await NestFactory.create(WorkerModule, {\n logger: new NestLogger(argv.debug), // TIP: If the worker is crashing comment out this line for better logging\n });\n\n await app.init();\n\n const projectService: ProjectService = app.get('IProjectService');\n // Initialise async services, we do this here rather than in factories so we can capture one off events\n await projectService.init(startHeight);\n\n const workerService = app.get(WorkerService);\n\n initWorkerServices(app, workerService);\n } catch (e) {\n console.log('Failed to start worker', e);\n logger.error(e, 'Failed to start worker');\n throw e;\n }\n}\n\nexport type IIndexerWorker = IBaseIndexerWorker;\n\nexport type IInitIndexerWorker = IIndexerWorker & {\n initWorker: typeof initWorker;\n};\n\n(global as any).host = createWorkerHost([], {\n initWorker,\n});\n"]}
@@ -14,7 +14,7 @@ const event_emitter_1 = require("@nestjs/event-emitter");
14
14
  const schedule_1 = require("@nestjs/schedule");
15
15
  const node_core_1 = require("@subql/node-core");
16
16
  const configure_module_1 = require("../../configure/configure.module");
17
- const indexer_module_1 = require("../indexer.module");
17
+ const worker_fetch_module_1 = require("../worker-fetch.module");
18
18
  let WorkerModule = class WorkerModule {
19
19
  };
20
20
  WorkerModule = __decorate([
@@ -24,7 +24,7 @@ WorkerModule = __decorate([
24
24
  event_emitter_1.EventEmitterModule.forRoot(),
25
25
  configure_module_1.ConfigureModule.register(),
26
26
  schedule_1.ScheduleModule.forRoot(),
27
- indexer_module_1.IndexerModule,
27
+ worker_fetch_module_1.WorkerFetchModule,
28
28
  ],
29
29
  controllers: [],
30
30
  })
@@ -1 +1 @@
1
- {"version":3,"file":"worker.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA2D;AAC3D,+CAAkD;AAClD,gDAA4C;AAC5C,uEAAmE;AACnE,sDAAkD;AAY3C,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,YAAY;IAVxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAkB,CAAC,OAAO,EAAE;YAC5B,kCAAe,CAAC,QAAQ,EAAE;YAC1B,yBAAc,CAAC,OAAO,EAAE;YACxB,8BAAa;SACd;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,YAAY,CAAG;AAAf,oCAAY","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport { DbModule } from '@subql/node-core';\nimport { ConfigureModule } from '../../configure/configure.module';\nimport { IndexerModule } from '../indexer.module';\n\n@Module({\n imports: [\n DbModule.forRoot(),\n EventEmitterModule.forRoot(),\n ConfigureModule.register(),\n ScheduleModule.forRoot(),\n IndexerModule,\n ],\n controllers: [],\n})\nexport class WorkerModule {}\n"]}
1
+ {"version":3,"file":"worker.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA2D;AAC3D,+CAAkD;AAClD,gDAA4C;AAC5C,uEAAmE;AACnE,gEAA2D;AAYpD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,YAAY;IAVxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAkB,CAAC,OAAO,EAAE;YAC5B,kCAAe,CAAC,QAAQ,EAAE;YAC1B,yBAAc,CAAC,OAAO,EAAE;YACxB,uCAAiB;SAClB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,YAAY,CAAG;AAAf,oCAAY","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport { DbModule } from '@subql/node-core';\nimport { ConfigureModule } from '../../configure/configure.module';\nimport { WorkerFetchModule } from '../worker-fetch.module';\n\n@Module({\n imports: [\n DbModule.forRoot(),\n EventEmitterModule.forRoot(),\n ConfigureModule.register(),\n ScheduleModule.forRoot(),\n WorkerFetchModule,\n ],\n controllers: [],\n})\nexport class WorkerModule {}\n"]}
@@ -1,6 +1,8 @@
1
- import { NodeConfig, IProjectService, ProcessBlockResponse, ApiService } from '@subql/node-core';
2
- import { SubqlProjectDs } from '../../configure/SubqueryProject';
1
+ import { SubqlEthereumDataSource } from '@subql/common-ethereum';
2
+ import { NodeConfig, IProjectService, ProcessBlockResponse, ApiService, BaseWorkerService, IProjectUpgradeService } from '@subql/node-core';
3
+ import { EthereumProjectDs } from '../../configure/SubqueryProject';
3
4
  import { IndexerManager } from '../indexer.manager';
5
+ import { BlockContent } from '../types';
4
6
  export type FetchBlockResponse = {
5
7
  parentHash: string;
6
8
  } | undefined;
@@ -10,17 +12,13 @@ export type WorkerStatusResponse = {
10
12
  fetchedBlocks: number;
11
13
  toFetchBlocks: number;
12
14
  };
13
- export declare class WorkerService {
15
+ export declare class WorkerService extends BaseWorkerService<BlockContent, FetchBlockResponse, SubqlEthereumDataSource, {}> {
14
16
  private apiService;
15
17
  private indexerManager;
16
- private projectService;
17
- private fetchedBlocks;
18
- private _isIndexing;
19
- private queue;
20
- constructor(apiService: ApiService, indexerManager: IndexerManager, projectService: IProjectService<SubqlProjectDs>, nodeConfig: NodeConfig);
21
- fetchBlock(height: number): Promise<FetchBlockResponse>;
22
- processBlock(height: number): Promise<ProcessBlockResponse>;
23
- get numFetchedBlocks(): number;
24
- get numFetchingBlocks(): number;
25
- get isIndexing(): boolean;
18
+ constructor(apiService: ApiService, indexerManager: IndexerManager, projectService: IProjectService<EthereumProjectDs>, projectUpgradeService: IProjectUpgradeService, nodeConfig: NodeConfig);
19
+ protected fetchChainBlock(heights: number, extra: {}): Promise<BlockContent>;
20
+ protected toBlockResponse(block: BlockContent): {
21
+ parentHash: string;
22
+ };
23
+ protected processFetchedBlock(block: BlockContent, dataSources: SubqlEthereumDataSource[]): Promise<ProcessBlockResponse>;
26
24
  }
@@ -15,76 +15,34 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.WorkerService = void 0;
18
- const node_worker_threads_1 = require("node:worker_threads");
19
18
  const common_1 = require("@nestjs/common");
20
19
  const node_core_1 = require("@subql/node-core");
21
20
  const indexer_manager_1 = require("../indexer.manager");
22
- const logger = (0, node_core_1.getLogger)(`Worker Service #${node_worker_threads_1.threadId}`);
23
- let WorkerService = class WorkerService {
24
- constructor(apiService, indexerManager, projectService, nodeConfig) {
21
+ let WorkerService = class WorkerService extends node_core_1.BaseWorkerService {
22
+ constructor(apiService, indexerManager, projectService, projectUpgradeService, nodeConfig) {
23
+ super(projectService, projectUpgradeService, nodeConfig);
25
24
  this.apiService = apiService;
26
25
  this.indexerManager = indexerManager;
27
- this.projectService = projectService;
28
- this.fetchedBlocks = {};
29
- this._isIndexing = false;
30
- this.queue = new node_core_1.AutoQueue(undefined, nodeConfig.batchSize);
31
26
  }
32
- async fetchBlock(height) {
33
- try {
34
- return await this.queue.put(async () => {
35
- // If a dynamic ds is created we might be asked to fetch blocks again, use existing result
36
- if (!this.fetchedBlocks[height]) {
37
- if (node_core_1.memoryLock.isLocked()) {
38
- const start = Date.now();
39
- await node_core_1.memoryLock.waitForUnlock();
40
- const end = Date.now();
41
- logger.debug(`memory lock wait time: ${end - start}ms`);
42
- }
43
- const [block] = await this.apiService.fetchBlocks([height]);
44
- this.fetchedBlocks[height] = block;
45
- }
46
- // Return info to get the runtime version, this lets the worker thread know
47
- return undefined;
48
- });
49
- }
50
- catch (e) {
51
- logger.error(/*e, */ `Failed to fetch block ${height}`);
52
- throw e;
53
- }
27
+ async fetchChainBlock(heights, extra) {
28
+ const [block] = await this.apiService.fetchBlocks([heights]);
29
+ return block;
54
30
  }
55
- async processBlock(height) {
56
- try {
57
- this._isIndexing = true;
58
- const block = this.fetchedBlocks[height];
59
- if (!block) {
60
- throw new Error(`Block ${height} has not been fetched`);
61
- }
62
- delete this.fetchedBlocks[height];
63
- return await this.indexerManager.indexBlock(block, await this.projectService.getAllDataSources(height));
64
- }
65
- catch (e) {
66
- logger.error(e, `Failed to index block ${height}: ${e.stack}`);
67
- throw e;
68
- }
69
- finally {
70
- this._isIndexing = false;
71
- }
31
+ toBlockResponse(block) {
32
+ return {
33
+ parentHash: block.parentHash,
34
+ };
72
35
  }
73
- get numFetchedBlocks() {
74
- return Object.keys(this.fetchedBlocks).length;
75
- }
76
- get numFetchingBlocks() {
77
- return this.queue.size;
78
- }
79
- get isIndexing() {
80
- return this._isIndexing;
36
+ async processFetchedBlock(block, dataSources) {
37
+ return this.indexerManager.indexBlock(block, dataSources);
81
38
  }
82
39
  };
83
40
  WorkerService = __decorate([
84
41
  (0, common_1.Injectable)(),
85
42
  __param(2, (0, common_1.Inject)('IProjectService')),
43
+ __param(3, (0, common_1.Inject)('IProjectUpgradeService')),
86
44
  __metadata("design:paramtypes", [node_core_1.ApiService,
87
- indexer_manager_1.IndexerManager, Object, node_core_1.NodeConfig])
45
+ indexer_manager_1.IndexerManager, Object, Object, node_core_1.NodeConfig])
88
46
  ], WorkerService);
89
47
  exports.WorkerService = WorkerService;
90
48
  //# sourceMappingURL=worker.service.js.map