@subql/node-ethereum 2.12.6-1 → 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.
- package/CHANGELOG.md +11 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/configure/NodeConfig.d.ts +21 -0
- package/dist/configure/NodeConfig.js +31 -0
- package/dist/configure/NodeConfig.js.map +1 -0
- package/dist/configure/SubqueryProject.d.ts +21 -29
- package/dist/configure/SubqueryProject.js +48 -72
- package/dist/configure/SubqueryProject.js.map +1 -1
- package/dist/configure/configure.module.d.ts +2 -2
- package/dist/configure/configure.module.js +19 -89
- package/dist/configure/configure.module.js.map +1 -1
- package/dist/ethereum/api.connection.d.ts +7 -7
- package/dist/ethereum/api.connection.js +4 -4
- package/dist/ethereum/api.connection.js.map +1 -1
- package/dist/ethereum/api.ethereum.d.ts +14 -8
- package/dist/ethereum/api.ethereum.js +24 -13
- package/dist/ethereum/api.ethereum.js.map +1 -1
- package/dist/ethereum/api.ethereum.test.js +29 -32
- package/dist/ethereum/api.ethereum.test.js.map +1 -1
- package/dist/ethereum/api.service.ethereum.d.ts +9 -7
- package/dist/ethereum/api.service.ethereum.js +56 -64
- package/dist/ethereum/api.service.ethereum.js.map +1 -1
- package/dist/ethereum/api.service.ethereum.test.js +8 -13
- package/dist/ethereum/api.service.ethereum.test.js.map +1 -1
- package/dist/ethereum/block.ethereum.d.ts +6 -15
- package/dist/ethereum/block.ethereum.js +52 -79
- package/dist/ethereum/block.ethereum.js.map +1 -1
- package/dist/ethereum/ethers/celo/celo-json-rpc-batch-provider.spec.js +3 -6
- package/dist/ethereum/ethers/celo/celo-json-rpc-batch-provider.spec.js.map +1 -1
- package/dist/ethereum/ethers/celo/celo-json-rpc-provider.spec.js +3 -6
- package/dist/ethereum/ethers/celo/celo-json-rpc-provider.spec.js.map +1 -1
- package/dist/ethereum/ethers/celo/celo-ws-provider.spec.js +3 -6
- package/dist/ethereum/ethers/celo/celo-ws-provider.spec.js.map +1 -1
- package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +7 -7
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js +7 -6
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -1
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +4 -4
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +9 -18
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
- package/dist/indexer/dictionary.service.d.ts +3 -3
- package/dist/indexer/dictionary.service.js +7 -5
- package/dist/indexer/dictionary.service.js.map +1 -1
- package/dist/indexer/dynamic-ds.service.d.ts +3 -3
- package/dist/indexer/dynamic-ds.service.js.map +1 -1
- package/dist/indexer/fetch.module.js +8 -10
- package/dist/indexer/fetch.module.js.map +1 -1
- package/dist/indexer/fetch.service.d.ts +10 -10
- package/dist/indexer/fetch.service.js +22 -43
- package/dist/indexer/fetch.service.js.map +1 -1
- package/dist/indexer/fetch.service.spec.js +25 -45
- package/dist/indexer/fetch.service.spec.js.map +1 -1
- package/dist/indexer/indexer.manager.d.ts +10 -12
- package/dist/indexer/indexer.manager.js +20 -30
- package/dist/indexer/indexer.manager.js.map +1 -1
- package/dist/indexer/project.service.d.ts +8 -6
- package/dist/indexer/project.service.js +19 -12
- package/dist/indexer/project.service.js.map +1 -1
- package/dist/indexer/project.service.test.d.ts +1 -0
- package/dist/indexer/project.service.test.js +26 -0
- package/dist/indexer/project.service.test.js.map +1 -0
- package/dist/indexer/sandbox.service.d.ts +1 -1
- package/dist/indexer/sandbox.service.js +1 -0
- package/dist/indexer/sandbox.service.js.map +1 -1
- package/dist/indexer/types.d.ts +2 -11
- package/dist/indexer/types.js +0 -6
- package/dist/indexer/types.js.map +1 -1
- package/dist/indexer/unfinalizedBlocks.service.d.ts +4 -4
- package/dist/indexer/unfinalizedBlocks.service.js +25 -1
- package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
- package/dist/indexer/worker/worker.d.ts +4 -28
- package/dist/indexer/worker/worker.js +8 -71
- package/dist/indexer/worker/worker.js.map +1 -1
- package/dist/indexer/worker/worker.module.js +2 -2
- package/dist/indexer/worker/worker.module.js.map +1 -1
- package/dist/indexer/worker/worker.service.d.ts +11 -13
- package/dist/indexer/worker/worker.service.js +14 -56
- package/dist/indexer/worker/worker.service.js.map +1 -1
- package/dist/indexer/worker/worker.unfinalizedBlocks.service.d.ts +4 -8
- package/dist/indexer/worker/worker.unfinalizedBlocks.service.js +8 -7
- package/dist/indexer/worker/worker.unfinalizedBlocks.service.js.map +1 -1
- package/dist/indexer/worker-fetch.module.d.ts +2 -0
- package/dist/indexer/{indexer.module.js → worker-fetch.module.js} +10 -33
- package/dist/indexer/worker-fetch.module.js.map +1 -0
- package/dist/init.js +1 -1
- package/dist/init.js.map +1 -1
- package/dist/main.js +4 -8
- package/dist/main.js.map +1 -1
- package/dist/subcommands/reindex.init.js +1 -2
- package/dist/subcommands/reindex.init.js.map +1 -1
- package/dist/subcommands/reindex.module.js +10 -6
- package/dist/subcommands/reindex.module.js.map +1 -1
- package/dist/subcommands/testing.init.js +2 -4
- package/dist/subcommands/testing.init.js.map +1 -1
- package/dist/subcommands/testing.module.js +3 -8
- package/dist/subcommands/testing.module.js.map +1 -1
- package/dist/subcommands/testing.service.d.ts +8 -5
- package/dist/subcommands/testing.service.js +3 -8
- package/dist/subcommands/testing.service.js.map +1 -1
- package/dist/utils/project.d.ts +5 -4
- package/dist/utils/project.js +17 -1
- package/dist/utils/project.js.map +1 -1
- package/dist/yargs.d.ts +7 -90
- package/dist/yargs.js +9 -112
- package/dist/yargs.js.map +1 -1
- package/package.json +8 -8
- package/dist/indexer/indexer.module.d.ts +0 -2
- package/dist/indexer/indexer.module.js.map +0 -1
- package/dist/subcommands/mmrMigrate.init.d.ts +0 -2
- package/dist/subcommands/mmrMigrate.init.js +0 -28
- package/dist/subcommands/mmrMigrate.init.js.map +0 -1
- package/dist/subcommands/mmrMigrate.module.d.ts +0 -2
- package/dist/subcommands/mmrMigrate.module.js +0 -28
- package/dist/subcommands/mmrMigrate.module.js.map +0 -1
- package/dist/subcommands/mmrRegenerate.init.d.ts +0 -1
- package/dist/subcommands/mmrRegenerate.init.js +0 -28
- package/dist/subcommands/mmrRegenerate.init.js.map +0 -1
- package/dist/subcommands/mmrRegenerate.module.d.ts +0 -2
- package/dist/subcommands/mmrRegenerate.module.js +0 -30
- package/dist/subcommands/mmrRegenerate.module.js.map +0 -1
- package/dist/subcommands/reindex.service.d.ts +0 -11
- package/dist/subcommands/reindex.service.js +0 -46
- 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,
|
|
30
|
-
super(dsProcessorService, apiService, poiService,
|
|
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
|
|
34
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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(
|
|
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
|
-
|
|
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,
|
|
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;
|
|
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"]}
|
package/dist/indexer/types.d.ts
CHANGED
|
@@ -1,11 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
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;
|
package/dist/indexer/types.js
CHANGED
|
@@ -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
|
|
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 {
|
|
4
|
-
export declare function blockToHeader(block:
|
|
5
|
-
export declare class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<
|
|
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:
|
|
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
|
|
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,
|
|
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 {
|
|
2
|
-
|
|
3
|
-
|
|
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:
|
|
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
|
-
|
|
31
|
-
logger.
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
74
|
-
return
|
|
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
|