@subql/node-ethereum 1.10.1-2 → 2.0.0
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 +65 -0
- package/README.md +3 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/configure/SubqueryProject.d.ts +9 -11
- package/dist/configure/SubqueryProject.js +19 -9
- package/dist/configure/SubqueryProject.js.map +1 -1
- package/dist/configure/configure.module.js +5 -7
- package/dist/configure/configure.module.js.map +1 -1
- package/dist/ethereum/api.connection.d.ts +11 -0
- package/dist/ethereum/api.connection.js +27 -0
- package/dist/ethereum/api.connection.js.map +1 -0
- package/dist/ethereum/api.ethereum.d.ts +18 -5
- package/dist/ethereum/api.ethereum.js +138 -81
- package/dist/ethereum/api.ethereum.js.map +1 -1
- package/dist/ethereum/api.service.ethereum.d.ts +11 -3
- package/dist/ethereum/api.service.ethereum.js +68 -18
- package/dist/ethereum/api.service.ethereum.js.map +1 -1
- package/dist/ethereum/api.service.ethereum.test.d.ts +1 -0
- package/dist/ethereum/api.service.ethereum.test.js +73 -0
- package/dist/ethereum/api.service.ethereum.test.js.map +1 -0
- package/dist/ethereum/block.ethereum.d.ts +1 -1
- package/dist/ethereum/block.ethereum.js +10 -12
- package/dist/ethereum/block.ethereum.js.map +1 -1
- package/dist/ethereum/ethers/json-rpc-batch-provider.d.ts +21 -0
- package/dist/ethereum/ethers/json-rpc-batch-provider.js +114 -0
- package/dist/ethereum/ethers/json-rpc-batch-provider.js.map +1 -0
- package/dist/ethereum/ethers/json-rpc-provider.d.ts +7 -0
- package/dist/ethereum/ethers/json-rpc-provider.js +68 -0
- package/dist/ethereum/ethers/json-rpc-provider.js.map +1 -0
- package/dist/ethereum/ethers/web/_version.d.ts +1 -0
- package/dist/ethereum/ethers/web/_version.js +6 -0
- package/dist/ethereum/ethers/web/_version.js.map +1 -0
- package/dist/ethereum/ethers/web/geturl.d.ts +3 -0
- package/dist/ethereum/ethers/web/geturl.js +116 -0
- package/dist/ethereum/ethers/web/geturl.js.map +1 -0
- package/dist/ethereum/ethers/web/index.d.ts +49 -0
- package/dist/ethereum/ethers/web/index.js +437 -0
- package/dist/ethereum/ethers/web/index.js.map +1 -0
- package/dist/ethereum/ethers/web/types.d.ts +26 -0
- package/dist/ethereum/ethers/web/types.js +4 -0
- package/dist/ethereum/ethers/web/types.js.map +1 -0
- package/dist/ethereum/safe-api.d.ts +34 -0
- package/dist/ethereum/safe-api.js +114 -0
- package/dist/ethereum/safe-api.js.map +1 -0
- package/dist/ethereum/utils.ethereum.d.ts +1 -1
- package/dist/ethereum/utils.ethereum.js +22 -87
- package/dist/ethereum/utils.ethereum.js.map +1 -1
- package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +17 -0
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js +55 -0
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -0
- package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.d.ts +4 -0
- package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js +5 -0
- package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js.map +1 -0
- package/dist/indexer/blockDispatcher/index.d.ts +4 -0
- package/dist/indexer/blockDispatcher/index.js +10 -0
- package/dist/indexer/blockDispatcher/index.js.map +1 -0
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +15 -0
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +88 -0
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -0
- package/dist/indexer/dictionary.service.d.ts +1 -0
- package/dist/indexer/dictionary.service.js +22 -2
- package/dist/indexer/dictionary.service.js.map +1 -1
- package/dist/indexer/ds-processor.service.d.ts +1 -1
- package/dist/indexer/ds-processor.service.js +4 -0
- package/dist/indexer/ds-processor.service.js.map +1 -1
- package/dist/indexer/dynamic-ds.service.d.ts +3 -19
- package/dist/indexer/dynamic-ds.service.js +20 -72
- package/dist/indexer/dynamic-ds.service.js.map +1 -1
- package/dist/indexer/fetch.module.js +40 -12
- package/dist/indexer/fetch.module.js.map +1 -1
- package/dist/indexer/fetch.service.d.ts +16 -7
- package/dist/indexer/fetch.service.js +188 -78
- package/dist/indexer/fetch.service.js.map +1 -1
- package/dist/indexer/indexer.manager.d.ts +11 -17
- package/dist/indexer/indexer.manager.js +68 -71
- package/dist/indexer/indexer.manager.js.map +1 -1
- package/dist/indexer/indexer.module.js +32 -8
- package/dist/indexer/indexer.module.js.map +1 -1
- package/dist/indexer/project.service.d.ts +11 -8
- package/dist/indexer/project.service.js +76 -82
- package/dist/indexer/project.service.js.map +1 -1
- package/dist/indexer/sandbox.service.js +11 -2
- package/dist/indexer/sandbox.service.js.map +1 -1
- package/dist/indexer/types.d.ts +2 -1
- package/dist/indexer/types.js.map +1 -1
- package/dist/indexer/unfinalizedBlocks.service.d.ts +36 -0
- package/dist/indexer/unfinalizedBlocks.service.js +197 -0
- package/dist/indexer/unfinalizedBlocks.service.js.map +1 -0
- package/dist/indexer/unfinalizedBlocks.spec.d.ts +1 -0
- package/dist/indexer/unfinalizedBlocks.spec.js +195 -0
- package/dist/indexer/unfinalizedBlocks.spec.js.map +1 -0
- package/dist/indexer/worker/worker.d.ts +22 -6
- package/dist/indexer/worker/worker.js +16 -3
- package/dist/indexer/worker/worker.js.map +1 -1
- package/dist/indexer/worker/worker.service.d.ts +10 -6
- package/dist/indexer/worker/worker.service.js +23 -10
- package/dist/indexer/worker/worker.service.js.map +1 -1
- package/dist/indexer/worker/worker.unfinalizedBlocks.service.d.ts +11 -0
- package/dist/indexer/worker/worker.unfinalizedBlocks.service.js +32 -0
- package/dist/indexer/worker/worker.unfinalizedBlocks.service.js.map +1 -0
- package/dist/init.js +2 -2
- package/dist/init.js.map +1 -1
- package/dist/main.js +6 -1
- package/dist/main.js.map +1 -1
- package/dist/meta/meta.module.js +8 -0
- package/dist/meta/meta.module.js.map +1 -1
- package/dist/meta/meta.service.d.ts +18 -3
- package/dist/meta/meta.service.js +89 -5
- package/dist/meta/meta.service.js.map +1 -1
- package/dist/subcommands/forceClean.service.d.ts +3 -1
- package/dist/subcommands/forceClean.service.js +30 -6
- package/dist/subcommands/forceClean.service.js.map +1 -1
- package/dist/subcommands/reindex.init.js +6 -1
- package/dist/subcommands/reindex.init.js.map +1 -1
- package/dist/subcommands/reindex.module.js +20 -1
- package/dist/subcommands/reindex.module.js.map +1 -1
- package/dist/subcommands/reindex.service.d.ts +7 -3
- package/dist/subcommands/reindex.service.js +44 -50
- package/dist/subcommands/reindex.service.js.map +1 -1
- package/dist/subcommands/testing.init.d.ts +1 -0
- package/dist/subcommands/testing.init.js +34 -0
- package/dist/subcommands/testing.init.js.map +1 -0
- package/dist/subcommands/testing.module.d.ts +4 -0
- package/dist/subcommands/testing.module.js +77 -0
- package/dist/subcommands/testing.module.js.map +1 -0
- package/dist/subcommands/testing.service.d.ts +9 -0
- package/dist/subcommands/testing.service.js +43 -0
- package/dist/subcommands/testing.service.js.map +1 -0
- package/dist/utils/project.d.ts +3 -0
- package/dist/utils/project.js +45 -1
- package/dist/utils/project.js.map +1 -1
- package/dist/utils/reindex.d.ts +6 -0
- package/dist/utils/reindex.js +48 -0
- package/dist/utils/reindex.js.map +1 -0
- package/dist/utils/string.js +10 -2
- package/dist/utils/string.js.map +1 -1
- package/dist/yargs.d.ts +97 -49
- package/dist/yargs.js +130 -69
- package/dist/yargs.js.map +1 -1
- package/package.json +13 -12
- package/dist/indexer/worker/block-dispatcher.service.d.ts +0 -69
- package/dist/indexer/worker/block-dispatcher.service.js +0 -356
- package/dist/indexer/worker/block-dispatcher.service.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindex.init.js","sourceRoot":"","sources":["../../src/subcommands/reindex.init.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;AAEtC,uCAA2C;AAC3C,gDAA6C;AAC7C,qDAAiD;AACjD,uDAAmD;AAEnD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,aAAa,CAAC,CAAC;AACjC,KAAK,UAAU,WAAW,CAAC,YAAoB;IACpD,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,8BAAa,CAAC,CAAC;QAEpD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,gCAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"reindex.init.js","sourceRoot":"","sources":["../../src/subcommands/reindex.init.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;AAEtC,uCAA2C;AAC3C,gDAA6C;AAC7C,qDAAiD;AACjD,uDAAmD;AAEnD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,aAAa,CAAC,CAAC;AACjC,KAAK,UAAU,WAAW,CAAC,YAAoB;IACpD,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,8BAAa,CAAC,CAAC;QAEpD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,gCAAc,CAAC,CAAC;QAE/C,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,mBAAmB,GACvB,MAAM,cAAc,CAAC,oCAAoC,CAAC,YAAY,CAAC,CAAC;QAC1E,IAAI,mBAAmB,KAAK,YAAY,EAAE;YACxC,MAAM,CAAC,IAAI,CACT,6BAA6B,YAAY,qCAAqC,mBAAmB,mBAAmB,mBAAmB,EAAE,CAC1I,CAAC;SACH;QACD,MAAM,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;KACnD;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AArBD,kCAqBC","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { NestFactory } from '@nestjs/core';\nimport { getLogger } from '@subql/node-core';\nimport { ReindexModule } from './reindex.module';\nimport { ReindexService } from './reindex.service';\n\nconst logger = getLogger('CLI-Reindex');\nexport async function reindexInit(targetHeight: number): Promise<void> {\n try {\n const app = await NestFactory.create(ReindexModule);\n\n await app.init();\n const reindexService = app.get(ReindexService);\n\n await reindexService.init();\n const actualReindexHeight =\n await reindexService.getTargetHeightWithUnfinalizedBlocks(targetHeight);\n if (actualReindexHeight !== targetHeight) {\n logger.info(\n `Found index target height ${targetHeight} beyond indexed unfinalized block ${actualReindexHeight}, will index to ${actualReindexHeight}`,\n );\n }\n await reindexService.reindex(actualReindexHeight);\n } catch (e) {\n logger.error(e, 'Reindex failed to execute');\n process.exit(1);\n }\n process.exit(0);\n}\n"]}
|
|
@@ -10,15 +10,33 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
11
|
exports.ReindexModule = exports.ReindexFeatureModule = void 0;
|
|
12
12
|
const common_1 = require("@nestjs/common");
|
|
13
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
13
14
|
const node_core_1 = require("@subql/node-core");
|
|
14
15
|
const configure_module_1 = require("../configure/configure.module");
|
|
16
|
+
const ds_processor_service_1 = require("../indexer/ds-processor.service");
|
|
17
|
+
const dynamic_ds_service_1 = require("../indexer/dynamic-ds.service");
|
|
18
|
+
const unfinalizedBlocks_service_1 = require("../indexer/unfinalizedBlocks.service");
|
|
15
19
|
const forceClean_service_1 = require("./forceClean.service");
|
|
16
20
|
const reindex_service_1 = require("./reindex.service");
|
|
17
21
|
let ReindexFeatureModule = class ReindexFeatureModule {
|
|
18
22
|
};
|
|
19
23
|
ReindexFeatureModule = __decorate([
|
|
20
24
|
(0, common_1.Module)({
|
|
21
|
-
providers: [
|
|
25
|
+
providers: [
|
|
26
|
+
node_core_1.StoreCacheService,
|
|
27
|
+
node_core_1.StoreService,
|
|
28
|
+
reindex_service_1.ReindexService,
|
|
29
|
+
node_core_1.MmrService,
|
|
30
|
+
forceClean_service_1.ForceCleanService,
|
|
31
|
+
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
32
|
+
dynamic_ds_service_1.DynamicDsService,
|
|
33
|
+
ds_processor_service_1.DsProcessorService,
|
|
34
|
+
{
|
|
35
|
+
// Used to work with DI for unfinalizedBlocksService but not used with reindex
|
|
36
|
+
provide: node_core_1.ApiService,
|
|
37
|
+
useFactory: () => undefined,
|
|
38
|
+
},
|
|
39
|
+
],
|
|
22
40
|
controllers: [],
|
|
23
41
|
})
|
|
24
42
|
], ReindexFeatureModule);
|
|
@@ -31,6 +49,7 @@ ReindexModule = __decorate([
|
|
|
31
49
|
node_core_1.DbModule.forRoot(),
|
|
32
50
|
configure_module_1.ConfigureModule.register(),
|
|
33
51
|
ReindexFeatureModule,
|
|
52
|
+
event_emitter_1.EventEmitterModule.forRoot(),
|
|
34
53
|
],
|
|
35
54
|
controllers: [],
|
|
36
55
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindex.module.js","sourceRoot":"","sources":["../../src/subcommands/reindex.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,2CAAwC;AACxC,
|
|
1
|
+
{"version":3,"file":"reindex.module.js","sourceRoot":"","sources":["../../src/subcommands/reindex.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,2CAAwC;AACxC,yDAA2D;AAC3D,gDAM0B;AAC1B,oEAAgE;AAChE,0EAAqE;AACrE,sEAAiE;AACjE,oFAAgF;AAChF,6DAAyD;AACzD,uDAAmD;AAoB5C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oBAAoB;IAlBhC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,6BAAiB;YACjB,wBAAY;YACZ,gCAAc;YACd,sBAAU;YACV,sCAAiB;YACjB,oDAAwB;YACxB,qCAAgB;YAChB,yCAAkB;YAClB;gBACE,8EAA8E;gBAC9E,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS;aAC5B;SACF;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,oBAAoB,CAAG;AAAvB,oDAAoB;AAW1B,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,aAAa;IATzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAe,CAAC,QAAQ,EAAE;YAC1B,oBAAoB;YACpB,kCAAkB,CAAC,OAAO,EAAE;SAC7B;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,aAAa,CAAG;AAAhB,sCAAa","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport {\n ApiService,\n DbModule,\n MmrService,\n StoreCacheService,\n StoreService,\n} from '@subql/node-core';\nimport { ConfigureModule } from '../configure/configure.module';\nimport { DsProcessorService } from '../indexer/ds-processor.service';\nimport { DynamicDsService } from '../indexer/dynamic-ds.service';\nimport { UnfinalizedBlocksService } from '../indexer/unfinalizedBlocks.service';\nimport { ForceCleanService } from './forceClean.service';\nimport { ReindexService } from './reindex.service';\n\n@Module({\n providers: [\n StoreCacheService,\n StoreService,\n ReindexService,\n MmrService,\n ForceCleanService,\n UnfinalizedBlocksService,\n DynamicDsService,\n DsProcessorService,\n {\n // Used to work with DI for unfinalizedBlocksService but not used with reindex\n provide: ApiService,\n useFactory: () => undefined,\n },\n ],\n controllers: [],\n})\nexport class ReindexFeatureModule {}\n\n@Module({\n imports: [\n DbModule.forRoot(),\n ConfigureModule.register(),\n ReindexFeatureModule,\n EventEmitterModule.forRoot(),\n ],\n controllers: [],\n})\nexport class ReindexModule {}\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { MmrService, NodeConfig, StoreService } from '@subql/node-core';
|
|
2
2
|
import { Sequelize } from 'sequelize';
|
|
3
3
|
import { SubqueryProject } from '../configure/SubqueryProject';
|
|
4
|
+
import { DynamicDsService } from '../indexer/dynamic-ds.service';
|
|
5
|
+
import { UnfinalizedBlocksService } from '../indexer/unfinalizedBlocks.service';
|
|
4
6
|
import { ForceCleanService } from './forceClean.service';
|
|
5
7
|
export declare class ReindexService {
|
|
6
8
|
private readonly sequelize;
|
|
@@ -9,11 +11,13 @@ export declare class ReindexService {
|
|
|
9
11
|
private readonly mmrService;
|
|
10
12
|
private readonly project;
|
|
11
13
|
private readonly forceCleanService;
|
|
14
|
+
private readonly unfinalizedBlocksService;
|
|
15
|
+
private readonly dynamicDsService;
|
|
12
16
|
private schema;
|
|
13
17
|
private metadataRepo;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
constructor(sequelize: Sequelize, nodeConfig: NodeConfig, storeService: StoreService, mmrService: MmrService, project: SubqueryProject, forceCleanService: ForceCleanService, unfinalizedBlocksService: UnfinalizedBlocksService, dynamicDsService: DynamicDsService);
|
|
19
|
+
init(): Promise<void>;
|
|
20
|
+
getTargetHeightWithUnfinalizedBlocks(inputHeight: number): Promise<number>;
|
|
17
21
|
private getExistingProjectSchema;
|
|
18
22
|
private getLastProcessedHeight;
|
|
19
23
|
private getMetadataBlockOffset;
|
|
@@ -10,44 +10,69 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
10
10
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
11
11
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
12
12
|
};
|
|
13
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
14
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
15
|
+
};
|
|
13
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
17
|
exports.ReindexService = void 0;
|
|
15
18
|
const common_1 = require("@nestjs/common");
|
|
16
19
|
const node_core_1 = require("@subql/node-core");
|
|
17
20
|
const sequelize_1 = require("sequelize");
|
|
18
21
|
const SubqueryProject_1 = require("../configure/SubqueryProject");
|
|
22
|
+
const dynamic_ds_service_1 = require("../indexer/dynamic-ds.service");
|
|
23
|
+
const unfinalizedBlocks_service_1 = require("../indexer/unfinalizedBlocks.service");
|
|
19
24
|
const project_1 = require("../utils/project");
|
|
25
|
+
const reindex_1 = require("../utils/reindex");
|
|
20
26
|
const forceClean_service_1 = require("./forceClean.service");
|
|
21
27
|
const logger = (0, node_core_1.getLogger)('Reindex');
|
|
22
28
|
let ReindexService = class ReindexService {
|
|
23
|
-
constructor(sequelize, nodeConfig, storeService, mmrService, project, forceCleanService) {
|
|
29
|
+
constructor(sequelize, nodeConfig, storeService, mmrService, project, forceCleanService, unfinalizedBlocksService, dynamicDsService) {
|
|
24
30
|
this.sequelize = sequelize;
|
|
25
31
|
this.nodeConfig = nodeConfig;
|
|
26
32
|
this.storeService = storeService;
|
|
27
33
|
this.mmrService = mmrService;
|
|
28
34
|
this.project = project;
|
|
29
35
|
this.forceCleanService = forceCleanService;
|
|
36
|
+
this.unfinalizedBlocksService = unfinalizedBlocksService;
|
|
37
|
+
this.dynamicDsService = dynamicDsService;
|
|
38
|
+
}
|
|
39
|
+
async init() {
|
|
40
|
+
this.schema = await this.getExistingProjectSchema();
|
|
41
|
+
if (!this.schema) {
|
|
42
|
+
logger.error('Unable to locate schema');
|
|
43
|
+
throw new Error('Schema does not exist.');
|
|
44
|
+
}
|
|
45
|
+
await this.initDbSchema();
|
|
46
|
+
this.metadataRepo = this.storeService.storeCache.metadata;
|
|
47
|
+
this.dynamicDsService.init(this.metadataRepo);
|
|
48
|
+
}
|
|
49
|
+
async getTargetHeightWithUnfinalizedBlocks(inputHeight) {
|
|
50
|
+
// Why does this happen?
|
|
51
|
+
this.unfinalizedBlocksService.metadataRepo = this.metadataRepo;
|
|
52
|
+
const unfinalizedBlocks = await this.unfinalizedBlocksService.getMetadataUnfinalizedBlocks();
|
|
53
|
+
const bestBlocks = unfinalizedBlocks.filter(([bestBlockHeight]) => Number(bestBlockHeight) <= inputHeight);
|
|
54
|
+
if (bestBlocks.length === 0) {
|
|
55
|
+
return inputHeight;
|
|
56
|
+
}
|
|
57
|
+
const [firstBestBlock] = bestBlocks[0];
|
|
58
|
+
return Math.min(inputHeight, firstBestBlock);
|
|
30
59
|
}
|
|
31
60
|
async getExistingProjectSchema() {
|
|
32
61
|
return (0, node_core_1.getExistingProjectSchema)(this.nodeConfig, this.sequelize);
|
|
33
62
|
}
|
|
34
63
|
async getLastProcessedHeight() {
|
|
35
|
-
return
|
|
64
|
+
return this.metadataRepo.find('lastProcessedHeight');
|
|
36
65
|
}
|
|
37
66
|
async getMetadataBlockOffset() {
|
|
38
|
-
return
|
|
67
|
+
return this.metadataRepo.find('blockOffset');
|
|
39
68
|
}
|
|
40
69
|
async getMetadataSpecName() {
|
|
41
|
-
|
|
42
|
-
where: { key: 'specName' },
|
|
43
|
-
});
|
|
44
|
-
return res === null || res === void 0 ? void 0 : res.value;
|
|
70
|
+
return this.metadataRepo.find('specName');
|
|
45
71
|
}
|
|
46
72
|
async initDbSchema() {
|
|
47
73
|
await (0, project_1.initDbSchema)(this.project, this.schema, this.storeService);
|
|
48
74
|
}
|
|
49
|
-
|
|
50
|
-
async getStartBlockFromDataSources() {
|
|
75
|
+
getStartBlockFromDataSources() {
|
|
51
76
|
const datasources = this.project.dataSources;
|
|
52
77
|
const startBlocksList = datasources.map((item) => { var _a; return (_a = item.startBlock) !== null && _a !== void 0 ? _a : 1; });
|
|
53
78
|
if (startBlocksList.length === 0) {
|
|
@@ -59,56 +84,25 @@ let ReindexService = class ReindexService {
|
|
|
59
84
|
}
|
|
60
85
|
}
|
|
61
86
|
async reindex(targetBlockHeight) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
await this.
|
|
68
|
-
this.metadataRepo = (0, node_core_1.MetadataFactory)(this.sequelize, this.schema);
|
|
69
|
-
this.startHeight = await this.getStartBlockFromDataSources();
|
|
70
|
-
const lastProcessedHeight = await this.getLastProcessedHeight();
|
|
71
|
-
if (!this.storeService.historical) {
|
|
72
|
-
logger.warn('Unable to reindex, historical state not enabled');
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
if (!lastProcessedHeight || lastProcessedHeight < targetBlockHeight) {
|
|
76
|
-
logger.warn(`Skipping reindexing to block ${targetBlockHeight}: current indexing height ${lastProcessedHeight} is behind requested block`);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
// if startHeight is greater than the targetHeight, just force clean
|
|
80
|
-
if (targetBlockHeight < this.startHeight) {
|
|
81
|
-
logger.info(`targetHeight: ${targetBlockHeight} is less than startHeight: ${this.startHeight}. Hence executing force-clean`);
|
|
82
|
-
await this.forceCleanService.forceClean();
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
logger.info(`Reindexing to block: ${targetBlockHeight}`);
|
|
86
|
-
const transaction = await this.sequelize.transaction();
|
|
87
|
-
try {
|
|
88
|
-
await this.storeService.rewind(targetBlockHeight, transaction);
|
|
89
|
-
const blockOffset = await this.getMetadataBlockOffset();
|
|
90
|
-
if (blockOffset) {
|
|
91
|
-
await this.mmrService.deleteMmrNode(targetBlockHeight + 1, blockOffset);
|
|
92
|
-
}
|
|
93
|
-
await transaction.commit();
|
|
94
|
-
logger.info('Reindex Success');
|
|
95
|
-
}
|
|
96
|
-
catch (err) {
|
|
97
|
-
logger.error(err, 'Reindexing failed');
|
|
98
|
-
await transaction.rollback();
|
|
99
|
-
throw err;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
87
|
+
const [startHeight, lastProcessedHeight] = await Promise.all([
|
|
88
|
+
this.getStartBlockFromDataSources(),
|
|
89
|
+
this.getLastProcessedHeight(),
|
|
90
|
+
]);
|
|
91
|
+
await (0, reindex_1.reindex)(startHeight, await this.getMetadataBlockOffset(), targetBlockHeight, lastProcessedHeight, this.storeService, this.unfinalizedBlocksService, this.dynamicDsService, this.mmrService, this.sequelize, this.forceCleanService);
|
|
92
|
+
await this.storeService.storeCache.flushCache(true, true);
|
|
102
93
|
}
|
|
103
94
|
};
|
|
104
95
|
ReindexService = __decorate([
|
|
105
96
|
(0, common_1.Injectable)(),
|
|
97
|
+
__param(4, (0, common_1.Inject)('ISubqueryProject')),
|
|
106
98
|
__metadata("design:paramtypes", [sequelize_1.Sequelize,
|
|
107
99
|
node_core_1.NodeConfig,
|
|
108
100
|
node_core_1.StoreService,
|
|
109
101
|
node_core_1.MmrService,
|
|
110
102
|
SubqueryProject_1.SubqueryProject,
|
|
111
|
-
forceClean_service_1.ForceCleanService
|
|
103
|
+
forceClean_service_1.ForceCleanService,
|
|
104
|
+
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
105
|
+
dynamic_ds_service_1.DynamicDsService])
|
|
112
106
|
], ReindexService);
|
|
113
107
|
exports.ReindexService = ReindexService;
|
|
114
108
|
//# sourceMappingURL=reindex.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reindex.service.js","sourceRoot":"","sources":["../../src/subcommands/reindex.service.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC
|
|
1
|
+
{"version":3,"file":"reindex.service.js","sourceRoot":"","sources":["../../src/subcommands/reindex.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n getLogger,\n MmrService,\n NodeConfig,\n StoreService,\n getExistingProjectSchema,\n CacheMetadataModel,\n} from '@subql/node-core';\nimport { Sequelize } from 'sequelize';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { DynamicDsService } from '../indexer/dynamic-ds.service';\nimport { UnfinalizedBlocksService } from '../indexer/unfinalizedBlocks.service';\nimport { initDbSchema } from '../utils/project';\nimport { reindex } from '../utils/reindex';\n\nimport { ForceCleanService } from './forceClean.service';\n\nconst logger = getLogger('Reindex');\n\n@Injectable()\nexport class ReindexService {\n private schema: string;\n private metadataRepo: CacheMetadataModel;\n\n constructor(\n private readonly sequelize: Sequelize,\n private readonly nodeConfig: NodeConfig,\n private readonly storeService: StoreService,\n private readonly mmrService: MmrService,\n @Inject('ISubqueryProject') private readonly project: SubqueryProject,\n private readonly forceCleanService: ForceCleanService,\n private readonly unfinalizedBlocksService: UnfinalizedBlocksService,\n private readonly dynamicDsService: DynamicDsService,\n ) {}\n\n async init(): Promise<void> {\n this.schema = await this.getExistingProjectSchema();\n\n if (!this.schema) {\n logger.error('Unable to locate schema');\n throw new Error('Schema does not exist.');\n }\n await this.initDbSchema();\n\n this.metadataRepo = this.storeService.storeCache.metadata;\n\n this.dynamicDsService.init(this.metadataRepo);\n }\n\n async getTargetHeightWithUnfinalizedBlocks(\n inputHeight: number,\n ): Promise<number> {\n // Why does this happen?\n (this.unfinalizedBlocksService as any).metadataRepo = this.metadataRepo;\n const unfinalizedBlocks =\n await this.unfinalizedBlocksService.getMetadataUnfinalizedBlocks();\n const bestBlocks = unfinalizedBlocks.filter(\n ([bestBlockHeight]) => Number(bestBlockHeight) <= inputHeight,\n );\n if (bestBlocks.length === 0) {\n return inputHeight;\n }\n const [firstBestBlock] = bestBlocks[0];\n return Math.min(inputHeight, firstBestBlock);\n }\n\n private async getExistingProjectSchema(): Promise<string> {\n return getExistingProjectSchema(this.nodeConfig, this.sequelize);\n }\n\n private async getLastProcessedHeight(): Promise<number | undefined> {\n return this.metadataRepo.find('lastProcessedHeight');\n }\n\n private async getMetadataBlockOffset(): Promise<number | undefined> {\n return this.metadataRepo.find('blockOffset');\n }\n\n private async getMetadataSpecName(): Promise<string | undefined> {\n return this.metadataRepo.find('specName');\n }\n\n private async initDbSchema(): Promise<void> {\n await initDbSchema(this.project, this.schema, this.storeService);\n }\n\n private getStartBlockFromDataSources(): number {\n const datasources = this.project.dataSources;\n\n const startBlocksList = datasources.map((item) => item.startBlock ?? 1);\n if (startBlocksList.length === 0) {\n logger.error(\n `Failed to find a valid datasource, Please check your endpoint if specName filter is used.`,\n );\n process.exit(1);\n } else {\n return Math.min(...startBlocksList);\n }\n }\n\n async reindex(targetBlockHeight: number): Promise<void> {\n const [startHeight, lastProcessedHeight] = await Promise.all([\n this.getStartBlockFromDataSources(),\n this.getLastProcessedHeight(),\n ]);\n\n await reindex(\n startHeight,\n await this.getMetadataBlockOffset(),\n targetBlockHeight,\n lastProcessedHeight,\n this.storeService,\n this.unfinalizedBlocksService,\n this.dynamicDsService,\n this.mmrService,\n this.sequelize,\n this.forceCleanService,\n );\n await this.storeService.storeCache.flushCache(true, true);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function testingInit(): Promise<void>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2022 OnFinality Limited authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.testingInit = void 0;
|
|
6
|
+
const core_1 = require("@nestjs/core");
|
|
7
|
+
const node_core_1 = require("@subql/node-core");
|
|
8
|
+
const project_service_1 = require("../indexer/project.service");
|
|
9
|
+
const testing_module_1 = require("./testing.module");
|
|
10
|
+
const testing_service_1 = require("./testing.service");
|
|
11
|
+
const logger = (0, node_core_1.getLogger)('Testing');
|
|
12
|
+
async function testingInit() {
|
|
13
|
+
try {
|
|
14
|
+
const app = await core_1.NestFactory.create(testing_module_1.TestingModule, {
|
|
15
|
+
logger: new node_core_1.NestLogger(),
|
|
16
|
+
});
|
|
17
|
+
await app.init();
|
|
18
|
+
const projectService = app.get(project_service_1.ProjectService);
|
|
19
|
+
const apiService = app.get(node_core_1.ApiService);
|
|
20
|
+
// Initialise async services, we do this here rather than in factories, so we can capture one off events
|
|
21
|
+
await apiService.init();
|
|
22
|
+
await projectService.init();
|
|
23
|
+
const testingService = app.get(testing_service_1.TestingService);
|
|
24
|
+
await testingService.init();
|
|
25
|
+
await testingService.run();
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
logger.error(e, 'Testing failed');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
exports.testingInit = testingInit;
|
|
34
|
+
//# sourceMappingURL=testing.init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.init.js","sourceRoot":"","sources":["../../src/subcommands/testing.init.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;AAEtC,uCAA2C;AAC3C,gDAAqE;AACrE,gEAA4D;AAC5D,qDAAiD;AACjD,uDAAmD;AAEnD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,SAAS,CAAC,CAAC;AAC7B,KAAK,UAAU,WAAW;IAC/B,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,8BAAa,EAAE;YAClD,MAAM,EAAE,IAAI,sBAAU,EAAE;SACzB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,gCAAc,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,sBAAU,CAAC,CAAC;QAEvC,wGAAwG;QACxG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAE5B,MAAM,cAAc,GAAG,GAAG,CAAC,GAAG,CAAC,gCAAc,CAAC,CAAC;QAC/C,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC;KAC5B;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAtBD,kCAsBC","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { NestFactory } from '@nestjs/core';\nimport { getLogger, NestLogger, ApiService } from '@subql/node-core';\nimport { ProjectService } from '../indexer/project.service';\nimport { TestingModule } from './testing.module';\nimport { TestingService } from './testing.service';\n\nconst logger = getLogger('Testing');\nexport async function testingInit(): Promise<void> {\n try {\n const app = await NestFactory.create(TestingModule, {\n logger: new NestLogger(),\n });\n\n await app.init();\n const projectService = app.get(ProjectService);\n const apiService = app.get(ApiService);\n\n // Initialise async services, we do this here rather than in factories, so we can capture one off events\n await apiService.init();\n await projectService.init();\n\n const testingService = app.get(TestingService);\n await testingService.init();\n await testingService.run();\n } catch (e) {\n logger.error(e, 'Testing failed');\n process.exit(1);\n }\n process.exit(0);\n}\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2022 OnFinality Limited authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.TestingModule = exports.TestingFeatureModule = void 0;
|
|
12
|
+
const common_1 = require("@nestjs/common");
|
|
13
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
14
|
+
const schedule_1 = require("@nestjs/schedule");
|
|
15
|
+
const node_core_1 = require("@subql/node-core");
|
|
16
|
+
const configure_module_1 = require("../configure/configure.module");
|
|
17
|
+
const ethereum_1 = require("../ethereum");
|
|
18
|
+
const ds_processor_service_1 = require("../indexer/ds-processor.service");
|
|
19
|
+
const dynamic_ds_service_1 = require("../indexer/dynamic-ds.service");
|
|
20
|
+
const fetch_module_1 = require("../indexer/fetch.module");
|
|
21
|
+
const indexer_manager_1 = require("../indexer/indexer.manager");
|
|
22
|
+
const project_service_1 = require("../indexer/project.service");
|
|
23
|
+
const sandbox_service_1 = require("../indexer/sandbox.service");
|
|
24
|
+
const unfinalizedBlocks_service_1 = require("../indexer/unfinalizedBlocks.service");
|
|
25
|
+
const meta_module_1 = require("../meta/meta.module");
|
|
26
|
+
const testing_service_1 = require("./testing.service");
|
|
27
|
+
let TestingFeatureModule = class TestingFeatureModule {
|
|
28
|
+
};
|
|
29
|
+
TestingFeatureModule = __decorate([
|
|
30
|
+
(0, common_1.Module)({
|
|
31
|
+
providers: [
|
|
32
|
+
node_core_1.StoreService,
|
|
33
|
+
testing_service_1.TestingService,
|
|
34
|
+
event_emitter_1.EventEmitter2,
|
|
35
|
+
node_core_1.PoiService,
|
|
36
|
+
sandbox_service_1.SandboxService,
|
|
37
|
+
ds_processor_service_1.DsProcessorService,
|
|
38
|
+
dynamic_ds_service_1.DynamicDsService,
|
|
39
|
+
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
40
|
+
project_service_1.ProjectService,
|
|
41
|
+
node_core_1.ConnectionPoolService,
|
|
42
|
+
{
|
|
43
|
+
provide: 'IProjectService',
|
|
44
|
+
useClass: project_service_1.ProjectService,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
provide: node_core_1.ApiService,
|
|
48
|
+
useFactory: async (project, connectionPoolService, eventEmitter) => {
|
|
49
|
+
const apiService = new ethereum_1.EthereumApiService(project, connectionPoolService, eventEmitter);
|
|
50
|
+
await apiService.init();
|
|
51
|
+
return apiService;
|
|
52
|
+
},
|
|
53
|
+
inject: ['ISubqueryProject', node_core_1.ConnectionPoolService, event_emitter_1.EventEmitter2],
|
|
54
|
+
},
|
|
55
|
+
indexer_manager_1.IndexerManager,
|
|
56
|
+
],
|
|
57
|
+
imports: [meta_module_1.MetaModule, fetch_module_1.FetchModule],
|
|
58
|
+
controllers: [],
|
|
59
|
+
})
|
|
60
|
+
], TestingFeatureModule);
|
|
61
|
+
exports.TestingFeatureModule = TestingFeatureModule;
|
|
62
|
+
let TestingModule = class TestingModule {
|
|
63
|
+
};
|
|
64
|
+
TestingModule = __decorate([
|
|
65
|
+
(0, common_1.Module)({
|
|
66
|
+
imports: [
|
|
67
|
+
node_core_1.DbModule.forRoot(),
|
|
68
|
+
configure_module_1.ConfigureModule.register(),
|
|
69
|
+
event_emitter_1.EventEmitterModule.forRoot(),
|
|
70
|
+
schedule_1.ScheduleModule.forRoot(),
|
|
71
|
+
TestingFeatureModule,
|
|
72
|
+
],
|
|
73
|
+
controllers: [],
|
|
74
|
+
})
|
|
75
|
+
], TestingModule);
|
|
76
|
+
exports.TestingModule = TestingModule;
|
|
77
|
+
//# sourceMappingURL=testing.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.module.js","sourceRoot":"","sources":["../../src/subcommands/testing.module.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;AAEtC,2CAAwC;AACxC,yDAA0E;AAC1E,+CAAkD;AAClD,gDAM0B;AAC1B,oEAAgE;AAEhE,0CAAiD;AAEjD,0EAAqE;AACrE,sEAAiE;AACjE,0DAAsD;AACtD,gEAA4D;AAC5D,gEAA4D;AAC5D,gEAA4D;AAC5D,oFAAgF;AAChF,qDAAiD;AACjD,uDAAmD;AAyC5C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;CAAG,CAAA;AAAvB,oBAAoB;IAvChC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,wBAAY;YACZ,gCAAc;YACd,6BAAa;YACb,sBAAU;YACV,gCAAc;YACd,yCAAkB;YAClB,qCAAgB;YAChB,oDAAwB;YACxB,gCAAc;YACd,iCAAqB;YACrB;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,gCAAc;aACzB;YACD;gBACE,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,KAAK,EACf,OAAwB,EACxB,qBAAmE,EACnE,YAA2B,EAC3B,EAAE;oBACF,MAAM,UAAU,GAAG,IAAI,6BAAkB,CACvC,OAAO,EACP,qBAAqB,EACrB,YAAY,CACb,CAAC;oBACF,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;oBACxB,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE,CAAC,kBAAkB,EAAE,iCAAqB,EAAE,6BAAa,CAAC;aACnE;YACD,gCAAc;SACf;QAED,OAAO,EAAE,CAAC,wBAAU,EAAE,0BAAW,CAAC;QAClC,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,oBAAoB,CAAG;AAAvB,oDAAoB;AAY1B,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,aAAa;IAVzB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAe,CAAC,QAAQ,EAAE;YAC1B,kCAAkB,CAAC,OAAO,EAAE;YAC5B,yBAAc,CAAC,OAAO,EAAE;YACxB,oBAAoB;SACrB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,aAAa,CAAG;AAAhB,sCAAa","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2, EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport {\n ApiService,\n ConnectionPoolService,\n DbModule,\n PoiService,\n StoreService,\n} from '@subql/node-core';\nimport { ConfigureModule } from '../configure/configure.module';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { EthereumApiService } from '../ethereum';\nimport { EthereumApiConnection } from '../ethereum/api.connection';\nimport { DsProcessorService } from '../indexer/ds-processor.service';\nimport { DynamicDsService } from '../indexer/dynamic-ds.service';\nimport { FetchModule } from '../indexer/fetch.module';\nimport { IndexerManager } from '../indexer/indexer.manager';\nimport { ProjectService } from '../indexer/project.service';\nimport { SandboxService } from '../indexer/sandbox.service';\nimport { UnfinalizedBlocksService } from '../indexer/unfinalizedBlocks.service';\nimport { MetaModule } from '../meta/meta.module';\nimport { TestingService } from './testing.service';\n\n@Module({\n providers: [\n StoreService,\n TestingService,\n EventEmitter2,\n PoiService,\n SandboxService,\n DsProcessorService,\n DynamicDsService,\n UnfinalizedBlocksService,\n ProjectService,\n ConnectionPoolService,\n {\n provide: 'IProjectService',\n useClass: ProjectService,\n },\n {\n provide: ApiService,\n useFactory: async (\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n eventEmitter: EventEmitter2,\n ) => {\n const apiService = new EthereumApiService(\n project,\n connectionPoolService,\n eventEmitter,\n );\n await apiService.init();\n return apiService;\n },\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n IndexerManager,\n ],\n\n imports: [MetaModule, FetchModule],\n controllers: [],\n})\nexport class TestingFeatureModule {}\n\n@Module({\n imports: [\n DbModule.forRoot(),\n ConfigureModule.register(),\n EventEmitterModule.forRoot(),\n ScheduleModule.forRoot(),\n TestingFeatureModule,\n ],\n controllers: [],\n})\nexport class TestingModule {}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ApiService, NodeConfig, StoreService, TestingService as BaseTestingService } from '@subql/node-core';
|
|
2
|
+
import { EthereumBlockWrapper } from '@subql/types-ethereum';
|
|
3
|
+
import { Sequelize } from 'sequelize';
|
|
4
|
+
import { SubqlProjectDs, SubqueryProject } from '../configure/SubqueryProject';
|
|
5
|
+
import { IndexerManager } from '../indexer/indexer.manager';
|
|
6
|
+
export declare class TestingService extends BaseTestingService<EthereumBlockWrapper, SubqlProjectDs> {
|
|
7
|
+
constructor(sequelize: Sequelize, nodeConfig: NodeConfig, storeService: StoreService, project: SubqueryProject, apiService: ApiService, indexerManager: IndexerManager);
|
|
8
|
+
indexBlock(block: EthereumBlockWrapper, handler: string): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2020-2022 OnFinality Limited authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
5
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
6
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
7
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
8
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
9
|
+
};
|
|
10
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
12
|
+
};
|
|
13
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
14
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.TestingService = void 0;
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const node_core_1 = require("@subql/node-core");
|
|
20
|
+
const sequelize_1 = require("sequelize");
|
|
21
|
+
const SubqueryProject_1 = require("../configure/SubqueryProject");
|
|
22
|
+
const indexer_manager_1 = require("../indexer/indexer.manager");
|
|
23
|
+
const logger = (0, node_core_1.getLogger)('subql-testing');
|
|
24
|
+
let TestingService = class TestingService extends node_core_1.TestingService {
|
|
25
|
+
constructor(sequelize, nodeConfig, storeService, project, apiService, indexerManager) {
|
|
26
|
+
super(sequelize, nodeConfig, storeService, project, apiService, indexerManager);
|
|
27
|
+
}
|
|
28
|
+
async indexBlock(block, handler) {
|
|
29
|
+
await this.indexerManager.indexBlock(block, this.getDsWithHandler(handler));
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
TestingService = __decorate([
|
|
33
|
+
(0, common_1.Injectable)(),
|
|
34
|
+
__param(3, (0, common_1.Inject)('ISubqueryProject')),
|
|
35
|
+
__metadata("design:paramtypes", [sequelize_1.Sequelize,
|
|
36
|
+
node_core_1.NodeConfig,
|
|
37
|
+
node_core_1.StoreService,
|
|
38
|
+
SubqueryProject_1.SubqueryProject,
|
|
39
|
+
node_core_1.ApiService,
|
|
40
|
+
indexer_manager_1.IndexerManager])
|
|
41
|
+
], TestingService);
|
|
42
|
+
exports.TestingService = TestingService;
|
|
43
|
+
//# sourceMappingURL=testing.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.service.js","sourceRoot":"","sources":["../../src/subcommands/testing.service.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;;;;;;;AAEtC,2CAAoD;AACpD,gDAM0B;AAE1B,yCAAsC;AACtC,kEAA+E;AAC/E,gEAA4D;AAE5D,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,eAAe,CAAC,CAAC;AAGnC,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,0BAGnC;IACC,YACE,SAAoB,EACpB,UAAsB,EACtB,YAA0B,EACE,OAAwB,EACpD,UAAsB,EACtB,cAA8B;QAE9B,KAAK,CACH,SAAS,EACT,UAAU,EACV,YAAY,EACZ,OAAO,EACP,UAAU,EACV,cAAc,CACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CACd,KAA2B,EAC3B,OAAe;QAEf,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,CAAC;CACF,CAAA;AA5BY,cAAc;IAD1B,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAHhB,qBAAS;QACR,sBAAU;QACR,wBAAY;QACW,iCAAe;QACxC,sBAAU;QACN,gCAAc;GAVrB,cAAc,CA4B1B;AA5BY,wCAAc","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n ApiService,\n NodeConfig,\n StoreService,\n getLogger,\n TestingService as BaseTestingService,\n} from '@subql/node-core';\nimport { EthereumBlockWrapper } from '@subql/types-ethereum';\nimport { Sequelize } from 'sequelize';\nimport { SubqlProjectDs, SubqueryProject } from '../configure/SubqueryProject';\nimport { IndexerManager } from '../indexer/indexer.manager';\n\nconst logger = getLogger('subql-testing');\n\n@Injectable()\nexport class TestingService extends BaseTestingService<\n EthereumBlockWrapper,\n SubqlProjectDs\n> {\n constructor(\n sequelize: Sequelize,\n nodeConfig: NodeConfig,\n storeService: StoreService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n apiService: ApiService,\n indexerManager: IndexerManager,\n ) {\n super(\n sequelize,\n nodeConfig,\n storeService,\n project,\n apiService,\n indexerManager,\n );\n }\n\n async indexBlock(\n block: EthereumBlockWrapper,\n handler: string,\n ): Promise<void> {\n await this.indexerManager.indexBlock(block, this.getDsWithHandler(handler));\n }\n}\n"]}
|
package/dist/utils/project.d.ts
CHANGED
|
@@ -11,3 +11,6 @@ export declare function getChainTypes(reader: Reader, root: string, file: string
|
|
|
11
11
|
export declare function loadDataSourceScript(reader: Reader, file?: string): Promise<string>;
|
|
12
12
|
export declare function getProjectRoot(reader: Reader): Promise<string>;
|
|
13
13
|
export declare function initDbSchema(project: SubqueryProject, schema: string, storeService: StoreService): Promise<void>;
|
|
14
|
+
export declare function initHotSchemaReload(schema: string, storeService: StoreService): Promise<void>;
|
|
15
|
+
export declare function retryOnFailEth<T>(request: () => Promise<T>, errors?: string[]): Promise<T>;
|
|
16
|
+
export declare function onlyHasLogDataSources(dataSources: SubqlProjectDs[]): boolean;
|
package/dist/utils/project.js
CHANGED
|
@@ -5,12 +5,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
6
|
};
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.initDbSchema = exports.getProjectRoot = exports.loadDataSourceScript = exports.getChainTypes = exports.updateDataSourcesV0_2_0 = exports.isCustomHandler = exports.isBaseHandler = exports.getProjectEntry = exports.prepareProjectDir = void 0;
|
|
8
|
+
exports.onlyHasLogDataSources = exports.retryOnFailEth = exports.initHotSchemaReload = exports.initDbSchema = exports.getProjectRoot = exports.loadDataSourceScript = exports.getChainTypes = exports.updateDataSourcesV0_2_0 = exports.isCustomHandler = exports.isBaseHandler = exports.getProjectEntry = exports.prepareProjectDir = void 0;
|
|
9
9
|
const fs_1 = __importDefault(require("fs"));
|
|
10
10
|
const os_1 = __importDefault(require("os"));
|
|
11
11
|
const path_1 = __importDefault(require("path"));
|
|
12
12
|
const common_1 = require("@subql/common");
|
|
13
13
|
const common_ethereum_1 = require("@subql/common-ethereum");
|
|
14
|
+
const node_core_1 = require("@subql/node-core");
|
|
14
15
|
const utils_1 = require("@subql/utils");
|
|
15
16
|
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
16
17
|
const tar_1 = __importDefault(require("tar"));
|
|
@@ -62,6 +63,27 @@ exports.isCustomHandler = isCustomHandler;
|
|
|
62
63
|
async function updateDataSourcesV0_2_0(_dataSources, reader, root) {
|
|
63
64
|
// force convert to updated ds
|
|
64
65
|
return Promise.all(_dataSources.map(async (dataSource) => {
|
|
66
|
+
if (dataSource.kind === 'flare/Runtime') {
|
|
67
|
+
dataSource.kind = common_ethereum_1.EthereumDatasourceKind.Runtime;
|
|
68
|
+
}
|
|
69
|
+
dataSource.mapping.handlers = dataSource.mapping.handlers.map((handler) => {
|
|
70
|
+
switch (handler.kind) {
|
|
71
|
+
case 'flare/BlockHandler': {
|
|
72
|
+
handler.kind = common_ethereum_1.EthereumHandlerKind.Block;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case 'flare/TransactionHandler': {
|
|
76
|
+
handler.kind = common_ethereum_1.EthereumHandlerKind.Call;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'flare/LogHandler': {
|
|
80
|
+
handler.kind = common_ethereum_1.EthereumHandlerKind.Event;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
default:
|
|
84
|
+
}
|
|
85
|
+
return handler;
|
|
86
|
+
});
|
|
65
87
|
const entryScript = await loadDataSourceScript(reader, dataSource.mapping.file);
|
|
66
88
|
const file = await updateDataSourcesEntry(reader, dataSource.mapping.file, root, entryScript);
|
|
67
89
|
if (dataSource.assets) {
|
|
@@ -188,4 +210,26 @@ async function initDbSchema(project, schema, storeService) {
|
|
|
188
210
|
await storeService.init(modelsRelation, schema);
|
|
189
211
|
}
|
|
190
212
|
exports.initDbSchema = initDbSchema;
|
|
213
|
+
async function initHotSchemaReload(schema, storeService) {
|
|
214
|
+
await storeService.initHotSchemaReloadQueries(schema);
|
|
215
|
+
}
|
|
216
|
+
exports.initHotSchemaReload = initHotSchemaReload;
|
|
217
|
+
const handledErrors = ['timeout'];
|
|
218
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
219
|
+
async function retryOnFailEth(request, errors = handledErrors) {
|
|
220
|
+
return (0, node_core_1.retryOnFail)(request, (e) => !!errors.find((t) => t === (e === null || e === void 0 ? void 0 : e.reason)));
|
|
221
|
+
}
|
|
222
|
+
exports.retryOnFailEth = retryOnFailEth;
|
|
223
|
+
function onlyHasLogDataSources(dataSources) {
|
|
224
|
+
for (const ds of dataSources) {
|
|
225
|
+
for (const handler of ds.mapping.handlers) {
|
|
226
|
+
if (handler.kind !== common_ethereum_1.SubqlEthereumHandlerKind.EthEvent &&
|
|
227
|
+
handler.kind !== common_ethereum_1.SubqlEthereumHandlerKind.FlareEvent) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
234
|
+
exports.onlyHasLogDataSources = onlyHasLogDataSources;
|
|
191
235
|
//# sourceMappingURL=project.js.map
|