@subql/node-ethereum 2.9.3-4 → 2.10.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 +13 -4
- package/dist/.tsbuildinfo +1 -1
- package/dist/configure/configure.module.d.ts +6 -0
- package/dist/configure/configure.module.js +5 -1
- package/dist/configure/configure.module.js.map +1 -1
- package/dist/ethereum/api.connection.d.ts +1 -5
- package/dist/ethereum/api.connection.js +4 -17
- package/dist/ethereum/api.connection.js.map +1 -1
- package/dist/ethereum/api.service.ethereum.js +40 -15
- package/dist/ethereum/api.service.ethereum.js.map +1 -1
- package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js +2 -2
- package/dist/indexer/blockDispatcher/ethereum-block-dispatcher.js.map +1 -1
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +3 -2
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +6 -17
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
- package/dist/indexer/fetch.module.js +5 -2
- package/dist/indexer/fetch.module.js.map +1 -1
- package/dist/indexer/indexer.module.js +9 -0
- package/dist/indexer/indexer.module.js.map +1 -1
- package/dist/indexer/worker/worker.js +6 -1
- package/dist/indexer/worker/worker.js.map +1 -1
- package/dist/subcommands/testing.init.js +4 -11
- package/dist/subcommands/testing.init.js.map +1 -1
- package/dist/subcommands/testing.module.js +11 -1
- package/dist/subcommands/testing.module.js.map +1 -1
- package/dist/subcommands/testing.service.d.ts +4 -4
- package/dist/subcommands/testing.service.js +23 -13
- package/dist/subcommands/testing.service.js.map +1 -1
- package/package.json +6 -7
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import { NodeConfig } from '@subql/node-core';
|
|
3
|
+
import { SubqueryProject } from './SubqueryProject';
|
|
2
4
|
export declare class ConfigureModule {
|
|
5
|
+
static getInstance(): Promise<{
|
|
6
|
+
config: NodeConfig;
|
|
7
|
+
project: () => Promise<SubqueryProject>;
|
|
8
|
+
}>;
|
|
3
9
|
static register(): Promise<DynamicModule>;
|
|
4
10
|
}
|
|
@@ -49,7 +49,7 @@ function warnDeprecations() {
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
let ConfigureModule = ConfigureModule_1 = class ConfigureModule {
|
|
52
|
-
static async
|
|
52
|
+
static async getInstance() {
|
|
53
53
|
const { argv } = yargs_1.yargsOptions;
|
|
54
54
|
let config;
|
|
55
55
|
let rawManifest;
|
|
@@ -101,6 +101,10 @@ let ConfigureModule = ConfigureModule_1 = class ConfigureModule {
|
|
|
101
101
|
});
|
|
102
102
|
return p;
|
|
103
103
|
};
|
|
104
|
+
return { config, project };
|
|
105
|
+
}
|
|
106
|
+
static async register() {
|
|
107
|
+
const { config, project } = await ConfigureModule_1.getInstance();
|
|
104
108
|
return {
|
|
105
109
|
module: ConfigureModule_1,
|
|
106
110
|
providers: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.module.js","sourceRoot":"","sources":["../../src/configure/configure.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;AAEnC,oDAA4B;AAC5B,2CAA+D;AAC/D,0CAIuB;AAEvB,gDAQ0B;AAC1B,mCAAkD;AAClD,oCAAwC;AACxC,uDAAoD;AAEpD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,WAAW,CAAC,CAAC;AAEtC,MAAM,gBAAgB,GAA2B,EAAE,CAAC;AAIpD,SAAS,cAAc,CAAC,KAAW;IACjC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;;QACxD,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QAE1C,IAAI,GAAG,KAAK,kBAAkB,EAAE;YAC9B,IAAI;gBACF,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC;aACrC;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;aAClE;SACF;QACD,GAAG,CAAC,MAAA,gBAAgB,CAAC,GAAG,CAAC,mCAAI,IAAA,kBAAS,EAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QACrD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAS,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;IAC9B,IAAI,IAAI,CAAC,eAAe,CAAC,EAAE;QACzB,MAAM,CAAC,IAAI,CACT,iFAAiF,CAClF,CAAC;KACH;IACD,IAAI,IAAI,CAAC,KAAK,EAAE;QACd,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;KAC/D;AACH,CAAC;AAIM,IAAM,eAAe,uBAArB,MAAM,eAAe;IAC1B,MAAM,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"configure.module.js","sourceRoot":"","sources":["../../src/configure/configure.module.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport assert from 'assert';\nimport { DynamicModule, Global, Module } from '@nestjs/common';\nimport {\n handleCreateSubqueryProjectError,\n Reader,\n ReaderFactory,\n} from '@subql/common';\nimport { EthereumProjectNetworkConfig } from '@subql/common-ethereum';\nimport {\n IConfig,\n NodeConfig,\n getLogger,\n setLevel,\n rebaseArgsWithManifest,\n defaultSubqueryName,\n validDbSchemaName,\n} from '@subql/node-core';\nimport { camelCase, omitBy, isNil } from 'lodash';\nimport { yargsOptions } from '../yargs';\nimport { SubqueryProject } from './SubqueryProject';\n\nconst logger = getLogger('configure');\n\nconst YargsNameMapping: Record<string, string> = {};\n\ntype Args = (typeof yargsOptions.argv)['argv'];\n\nfunction yargsToIConfig(yargs: Args): Partial<IConfig> {\n return Object.entries(yargs).reduce((acc, [key, value]) => {\n if (['_', '$0'].includes(key)) return acc;\n\n if (key === 'network-registry') {\n try {\n value = JSON.parse(value as string);\n } catch (e) {\n throw new Error('Argument `network-registry` is not valid JSON');\n }\n }\n acc[YargsNameMapping[key] ?? camelCase(key)] = value;\n return acc;\n }, {} as any);\n}\n\nfunction warnDeprecations() {\n const { argv } = yargsOptions;\n if (argv['subquery-name']) {\n logger.warn(\n 'Note that argument --subquery-name has been deprecated in favour of --db-schema',\n );\n }\n if (argv.local) {\n logger.warn('Note that argument --local has been deprecated');\n }\n}\n\n@Global()\n@Module({})\nexport class ConfigureModule {\n static async getInstance(): Promise<{\n config: NodeConfig;\n project: () => Promise<SubqueryProject>;\n }> {\n const { argv } = yargsOptions;\n let config: NodeConfig;\n let rawManifest: unknown;\n let reader: Reader;\n\n const isTest = argv._[0] === 'test';\n\n // Override order : Sub-command/Args/Flags > Manifest Runner options > Default configs\n // Therefore, we should rebase the manifest runner options with args first but not the config in the end\n if (argv.config) {\n // get manifest options\n config = NodeConfig.fromFile(argv.config, yargsToIConfig(argv), isTest);\n reader = await ReaderFactory.create(config.subquery, {\n ipfs: config.ipfs,\n });\n rawManifest = await reader.getProjectSchema();\n rebaseArgsWithManifest(argv, rawManifest);\n // use rebased argv generate config to override current config\n config = NodeConfig.rebaseWithArgs(config, yargsToIConfig(argv), isTest);\n } else {\n if (!argv.subquery) {\n logger.error(\n 'Subquery path is missing neither in cli options nor in config file',\n );\n yargsOptions.showHelp();\n process.exit(1);\n }\n\n warnDeprecations();\n assert(argv.subquery, 'subquery path is missing');\n reader = await ReaderFactory.create(argv.subquery, {\n ipfs: argv.ipfs,\n });\n rawManifest = await reader.getProjectSchema();\n rebaseArgsWithManifest(argv, rawManifest);\n // Create new nodeConfig with rebased argv\n config = new NodeConfig(\n defaultSubqueryName(yargsToIConfig(argv)),\n isTest,\n );\n }\n\n if (!validDbSchemaName(config.dbSchema)) {\n process.exit(1);\n }\n\n if (config.debug) {\n setLevel('debug');\n }\n\n const project = async () => {\n const p = await SubqueryProject.create(\n argv.subquery,\n rawManifest,\n reader,\n omitBy<EthereumProjectNetworkConfig>(\n {\n endpoint: config.networkEndpoints,\n dictionary: config.networkDictionary,\n },\n isNil,\n ),\n config.root,\n ).catch((err) => {\n const pjson = require('../../package.json');\n handleCreateSubqueryProjectError(err, pjson, rawManifest, logger);\n process.exit(1);\n });\n return p;\n };\n return { config, project };\n }\n static async register(): Promise<DynamicModule> {\n const { config, project } = await ConfigureModule.getInstance();\n\n return {\n module: ConfigureModule,\n providers: [\n {\n provide: NodeConfig,\n useValue: config,\n },\n {\n provide: 'ISubqueryProject',\n useFactory: project,\n },\n ],\n exports: [NodeConfig, 'ISubqueryProject'],\n };\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
2
|
-
import { ApiConnectionError,
|
|
2
|
+
import { ApiConnectionError, NetworkMetadataPayload, IApiConnectionSpecific } from '@subql/node-core';
|
|
3
3
|
import { EthereumBlockWrapper } from '@subql/types-ethereum';
|
|
4
4
|
import { EthereumApi } from './api.ethereum';
|
|
5
5
|
import SafeEthProvider from './safe-api';
|
|
@@ -16,9 +16,5 @@ export declare class EthereumApiConnection implements IApiConnectionSpecific<Eth
|
|
|
16
16
|
fetchBlocks(heights: number[]): Promise<EthereumBlockWrapper[]>;
|
|
17
17
|
handleError: typeof EthereumApiConnection.handleError;
|
|
18
18
|
static handleError(e: Error): ApiConnectionError;
|
|
19
|
-
static handleLargeResponseError(e: Error): ApiConnectionError;
|
|
20
|
-
static handleRateLimitError(e: Error): ApiConnectionError;
|
|
21
|
-
static handleTimeoutError(e: Error): ApiConnectionError;
|
|
22
|
-
static handleDisconnectionError(e: Error): ApiConnectionError;
|
|
23
19
|
}
|
|
24
20
|
export {};
|
|
@@ -37,35 +37,22 @@ class EthereumApiConnection {
|
|
|
37
37
|
static handleError(e) {
|
|
38
38
|
let formatted_error;
|
|
39
39
|
if (e.message.startsWith(`No response received from RPC endpoint in`)) {
|
|
40
|
-
formatted_error =
|
|
40
|
+
formatted_error = new node_core_1.TimeoutError(e);
|
|
41
41
|
}
|
|
42
42
|
else if (e.message.startsWith(`disconnected from `)) {
|
|
43
|
-
formatted_error =
|
|
43
|
+
formatted_error = new node_core_1.DisconnectionError(e);
|
|
44
44
|
}
|
|
45
45
|
else if (e.message.startsWith(`Rate Limited at endpoint`)) {
|
|
46
|
-
formatted_error =
|
|
46
|
+
formatted_error = new node_core_1.RateLimitError(e);
|
|
47
47
|
}
|
|
48
48
|
else if (e.message.includes(`Exceeded max limit of`)) {
|
|
49
|
-
formatted_error =
|
|
49
|
+
formatted_error = new node_core_1.LargeResponseError(e);
|
|
50
50
|
}
|
|
51
51
|
else {
|
|
52
52
|
formatted_error = new node_core_1.ApiConnectionError(e.name, e.message, node_core_1.ApiErrorType.Default);
|
|
53
53
|
}
|
|
54
54
|
return formatted_error;
|
|
55
55
|
}
|
|
56
|
-
static handleLargeResponseError(e) {
|
|
57
|
-
const newMessage = `Oversized RPC node response. This issue is related to the network's RPC nodes configuration, not your application. You may report it to the network's maintainers or try a different RPC node.\n\n${e.message}`;
|
|
58
|
-
return new node_core_1.ApiConnectionError('RpcInternalError', newMessage, node_core_1.ApiErrorType.Default);
|
|
59
|
-
}
|
|
60
|
-
static handleRateLimitError(e) {
|
|
61
|
-
return new node_core_1.ApiConnectionError('RateLimit', e.message, node_core_1.ApiErrorType.RateLimit);
|
|
62
|
-
}
|
|
63
|
-
static handleTimeoutError(e) {
|
|
64
|
-
return new node_core_1.ApiConnectionError('TimeoutError', e.message, node_core_1.ApiErrorType.Timeout);
|
|
65
|
-
}
|
|
66
|
-
static handleDisconnectionError(e) {
|
|
67
|
-
return new node_core_1.ApiConnectionError('ConnectionError', e.message, node_core_1.ApiErrorType.Connection);
|
|
68
|
-
}
|
|
69
56
|
}
|
|
70
57
|
exports.EthereumApiConnection = EthereumApiConnection;
|
|
71
58
|
//# sourceMappingURL=api.connection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.connection.js","sourceRoot":"","sources":["../../src/ethereum/api.connection.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAGnC,
|
|
1
|
+
{"version":3,"file":"api.connection.js","sourceRoot":"","sources":["../../src/ethereum/api.connection.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAGnC,gDAS0B;AAE1B,iDAA6C;AAQ7C,MAAa,qBAAqB;IAMhC,YACS,SAAsB,EACrB,kBAA6B;QAD9B,cAAS,GAAT,SAAS,CAAa;QACrB,uBAAkB,GAAlB,kBAAkB,CAAW;QAsCvC,gBAAW,GAAG,qBAAqB,CAAC,WAAW,CAAC;QApC9C,IAAI,CAAC,WAAW,GAAG;YACjB,KAAK,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE;YACxC,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE;YACjC,WAAW,EAAE,SAAS,CAAC,cAAc,EAAE;SACxC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,QAAgB,EAChB,iBAA4B,EAC5B,YAA2B;QAE3B,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEpD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,OAAO,IAAI,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAiB;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;IAID,MAAM,CAAC,WAAW,CAAC,CAAQ;QACzB,IAAI,eAAmC,CAAC;QACxC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,2CAA2C,CAAC,EAAE;YACrE,eAAe,GAAG,IAAI,wBAAY,CAAC,CAAC,CAAC,CAAC;SACvC;aAAM,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE;YACrD,eAAe,GAAG,IAAI,8BAAkB,CAAC,CAAC,CAAC,CAAC;SAC7C;aAAM,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE;YAC3D,eAAe,GAAG,IAAI,0BAAc,CAAC,CAAC,CAAC,CAAC;SACzC;aAAM,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE;YACtD,eAAe,GAAG,IAAI,8BAAkB,CAAC,CAAC,CAAC,CAAC;SAC7C;aAAM;YACL,eAAe,GAAG,IAAI,8BAAkB,CACtC,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,OAAO,EACT,wBAAY,CAAC,OAAO,CACrB,CAAC;SACH;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;CACF;AAnED,sDAmEC","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiConnectionError,\n ApiErrorType,\n DisconnectionError,\n LargeResponseError,\n NetworkMetadataPayload,\n RateLimitError,\n TimeoutError,\n IApiConnectionSpecific,\n} from '@subql/node-core';\nimport { EthereumBlockWrapper } from '@subql/types-ethereum';\nimport { EthereumApi } from './api.ethereum';\nimport SafeEthProvider from './safe-api';\n\ntype FetchFunc = (\n api: EthereumApi,\n batch: number[],\n) => Promise<EthereumBlockWrapper[]>;\n\nexport class EthereumApiConnection\n implements\n IApiConnectionSpecific<EthereumApi, SafeEthProvider, EthereumBlockWrapper>\n{\n readonly networkMeta: NetworkMetadataPayload;\n\n constructor(\n public unsafeApi: EthereumApi,\n private fetchBlocksBatches: FetchFunc,\n ) {\n this.networkMeta = {\n chain: unsafeApi.getChainId().toString(),\n specName: unsafeApi.getSpecName(),\n genesisHash: unsafeApi.getGenesisHash(),\n };\n }\n\n static async create(\n endpoint: string,\n fetchBlockBatches: FetchFunc,\n eventEmitter: EventEmitter2,\n ): Promise<EthereumApiConnection> {\n const api = new EthereumApi(endpoint, eventEmitter);\n\n await api.init();\n\n return new EthereumApiConnection(api, fetchBlockBatches);\n }\n\n safeApi(height: number): SafeEthProvider {\n throw new Error(`Not Implemented`);\n }\n\n async apiConnect(): Promise<void> {\n await this.unsafeApi.connect();\n }\n\n async apiDisconnect(): Promise<void> {\n await this.unsafeApi.disconnect();\n }\n\n async fetchBlocks(heights: number[]): Promise<EthereumBlockWrapper[]> {\n const blocks = await this.fetchBlocksBatches(this.unsafeApi, heights);\n return blocks;\n }\n\n handleError = EthereumApiConnection.handleError;\n\n static handleError(e: Error): ApiConnectionError {\n let formatted_error: ApiConnectionError;\n if (e.message.startsWith(`No response received from RPC endpoint in`)) {\n formatted_error = new TimeoutError(e);\n } else if (e.message.startsWith(`disconnected from `)) {\n formatted_error = new DisconnectionError(e);\n } else if (e.message.startsWith(`Rate Limited at endpoint`)) {\n formatted_error = new RateLimitError(e);\n } else if (e.message.includes(`Exceeded max limit of`)) {\n formatted_error = new LargeResponseError(e);\n } else {\n formatted_error = new ApiConnectionError(\n e.name,\n e.message,\n ApiErrorType.Default,\n );\n }\n return formatted_error;\n }\n}\n"]}
|
|
@@ -13,6 +13,13 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
13
13
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
14
14
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
15
15
|
};
|
|
16
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
17
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
18
|
+
var m = o[Symbol.asyncIterator], i;
|
|
19
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
20
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
21
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
22
|
+
};
|
|
16
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
24
|
exports.EthereumApiService = void 0;
|
|
18
25
|
const common_1 = require("@nestjs/common");
|
|
@@ -29,6 +36,7 @@ let EthereumApiService = class EthereumApiService extends node_core_1.ApiService
|
|
|
29
36
|
this.eventEmitter = eventEmitter;
|
|
30
37
|
}
|
|
31
38
|
async init() {
|
|
39
|
+
var _a, e_1, _b, _c;
|
|
32
40
|
try {
|
|
33
41
|
let network;
|
|
34
42
|
try {
|
|
@@ -42,23 +50,40 @@ let EthereumApiService = class EthereumApiService extends node_core_1.ApiService
|
|
|
42
50
|
? network.endpoint
|
|
43
51
|
: [network.endpoint];
|
|
44
52
|
const endpointToApiIndex = {};
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
try {
|
|
54
|
+
for (var _d = true, _e = __asyncValues(endpoints.entries()), _f; _f = await _e.next(), _a = _f.done, !_a;) {
|
|
55
|
+
_c = _f.value;
|
|
56
|
+
_d = false;
|
|
57
|
+
try {
|
|
58
|
+
const [i, endpoint] = _c;
|
|
59
|
+
const connection = await api_connection_1.EthereumApiConnection.create(endpoint, this.fetchBlockBatches, this.eventEmitter);
|
|
60
|
+
const api = connection.unsafeApi;
|
|
61
|
+
this.eventEmitter.emit(node_core_1.IndexerEvent.ApiConnected, {
|
|
62
|
+
value: 1,
|
|
63
|
+
apiIndex: i,
|
|
64
|
+
endpoint: endpoint,
|
|
65
|
+
});
|
|
66
|
+
if (!this.networkMeta) {
|
|
67
|
+
this.networkMeta = connection.networkMeta;
|
|
68
|
+
}
|
|
69
|
+
if (network.chainId !== api.getChainId().toString()) {
|
|
70
|
+
throw this.metadataMismatchError('ChainId', network.chainId, api.getChainId().toString());
|
|
71
|
+
}
|
|
72
|
+
endpointToApiIndex[endpoint] = connection;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
_d = true;
|
|
76
|
+
}
|
|
55
77
|
}
|
|
56
|
-
|
|
57
|
-
|
|
78
|
+
}
|
|
79
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
80
|
+
finally {
|
|
81
|
+
try {
|
|
82
|
+
if (!_d && !_a && (_b = _e.return)) await _b.call(_e);
|
|
58
83
|
}
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
this.connectionPoolService.addBatchToConnections(endpointToApiIndex);
|
|
84
|
+
finally { if (e_1) throw e_1.error; }
|
|
85
|
+
}
|
|
86
|
+
await this.connectionPoolService.addBatchToConnections(endpointToApiIndex);
|
|
62
87
|
return this;
|
|
63
88
|
}
|
|
64
89
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.ethereum.js","sourceRoot":"","sources":["../../src/ethereum/api.service.ethereum.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC
|
|
1
|
+
{"version":3,"file":"api.service.ethereum.js","sourceRoot":"","sources":["../../src/ethereum/api.service.ethereum.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { ProjectNetworkV1_0_0 } from '@subql/common-ethereum';\nimport {\n ApiService,\n ConnectionPoolService,\n NetworkMetadataPayload,\n getLogger,\n IndexerEvent,\n} from '@subql/node-core';\nimport { EthereumBlockWrapper } from '@subql/types-ethereum';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { EthereumApiConnection } from './api.connection';\nimport { EthereumApi } from './api.ethereum';\nimport SafeEthProvider from './safe-api';\n\nconst logger = getLogger('api');\n\nconst MAX_RECONNECT_ATTEMPTS = 5;\n\n@Injectable()\nexport class EthereumApiService extends ApiService<\n EthereumApi,\n SafeEthProvider,\n EthereumBlockWrapper\n> {\n constructor(\n @Inject('ISubqueryProject') private project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n private eventEmitter: EventEmitter2,\n ) {\n super(connectionPoolService);\n }\n\n networkMeta: NetworkMetadataPayload;\n\n async init(): Promise<EthereumApiService> {\n try {\n let network: ProjectNetworkV1_0_0;\n try {\n network = this.project.network;\n } catch (e) {\n logger.error(Object.keys(e));\n process.exit(1);\n }\n\n const endpoints = Array.isArray(network.endpoint)\n ? network.endpoint\n : [network.endpoint];\n\n const endpointToApiIndex: Record<string, EthereumApiConnection> = {};\n\n for await (const [i, endpoint] of endpoints.entries()) {\n const connection = await EthereumApiConnection.create(\n endpoint,\n this.fetchBlockBatches,\n this.eventEmitter,\n );\n\n const api = connection.unsafeApi;\n\n this.eventEmitter.emit(IndexerEvent.ApiConnected, {\n value: 1,\n apiIndex: i,\n endpoint: endpoint,\n });\n\n if (!this.networkMeta) {\n this.networkMeta = connection.networkMeta;\n }\n\n if (network.chainId !== api.getChainId().toString()) {\n throw this.metadataMismatchError(\n 'ChainId',\n network.chainId,\n api.getChainId().toString(),\n );\n }\n\n endpointToApiIndex[endpoint] = connection;\n }\n\n await this.connectionPoolService.addBatchToConnections(\n endpointToApiIndex,\n );\n\n return this;\n } catch (e) {\n logger.error(e, 'Failed to init api service');\n process.exit(1);\n }\n }\n\n private metadataMismatchError(\n metadata: string,\n expected: string,\n actual: string,\n ): Error {\n return Error(\n `Value of ${metadata} does not match across all endpoints. Please check that your endpoints are for the same network.\\n\n Expected: ${expected}\n Actual: ${actual}`,\n );\n }\n\n get api(): EthereumApi {\n return this.unsafeApi;\n }\n\n safeApi(height: number): SafeEthProvider {\n const maxRetries = 5;\n\n const retryErrorCodes = [\n 'UNKNOWN_ERROR',\n 'NOT_IMPLEMENTED',\n 'NETWORK_ERROR',\n 'SERVER_ERROR',\n 'TIMEOUT',\n 'BAD_DATA',\n 'CANCELLED',\n ];\n\n const handler: ProxyHandler<SafeEthProvider> = {\n get: (target, prop, receiver) => {\n const originalMethod = target[prop as keyof SafeEthProvider];\n if (typeof originalMethod === 'function') {\n return async (...args: any[]) => {\n let retries = 0;\n let currentApi = target;\n let throwingError: Error;\n\n while (retries < maxRetries) {\n try {\n return await originalMethod.apply(currentApi, args);\n } catch (error: any) {\n // other than retryErrorCodes, other errors does not have anything to do with network request, retrying would not change its outcome\n if (!retryErrorCodes.includes(error?.code)) {\n throw error;\n }\n\n logger.warn(\n `Request failed with api at height ${height} (retry ${retries}): ${error.message}`,\n );\n throwingError = error;\n currentApi = this.unsafeApi.getSafeApi(height);\n retries++;\n }\n }\n\n logger.error(\n `Maximum retries (${maxRetries}) exceeded for api at height ${height}`,\n );\n throw throwingError;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n };\n\n return new Proxy(this.unsafeApi.getSafeApi(height), handler);\n }\n\n private async fetchBlockBatches(\n api: EthereumApi,\n batch: number[],\n ): Promise<EthereumBlockWrapper[]> {\n return api.fetchBlocks(batch);\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
//
|
|
3
|
-
// SPDX-License-Identifier:
|
|
2
|
+
// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors
|
|
3
|
+
// SPDX-License-Identifier: GPL-3.0
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
//# sourceMappingURL=ethereum-block-dispatcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethereum-block-dispatcher.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/ethereum-block-dispatcher.ts"],"names":[],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"file":"ethereum-block-dispatcher.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/ethereum-block-dispatcher.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 { IBlockDispatcher } from '@subql/node-core';\n\nexport interface IEthereumBlockDispatcher extends IBlockDispatcher {\n init(onDynamicDsCreated: (height: number) => Promise<void>): Promise<void>;\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { OnApplicationShutdown } from '@nestjs/common';
|
|
2
2
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
3
|
-
import { NodeConfig, SmartBatchService, StoreService, PoiService, StoreCacheService, IProjectService, WorkerBlockDispatcher } from '@subql/node-core';
|
|
3
|
+
import { NodeConfig, SmartBatchService, StoreService, PoiService, StoreCacheService, IProjectService, WorkerBlockDispatcher, ConnectionPoolStateManager } from '@subql/node-core';
|
|
4
4
|
import { SubqlProjectDs, SubqueryProject } from '../../configure/SubqueryProject';
|
|
5
|
+
import { EthereumApiConnection } from '../../ethereum/api.connection';
|
|
5
6
|
import { DynamicDsService } from '../dynamic-ds.service';
|
|
6
7
|
import { UnfinalizedBlocksService } from '../unfinalizedBlocks.service';
|
|
7
8
|
import { IIndexerWorker } from '../worker/worker';
|
|
@@ -9,7 +10,7 @@ type IndexerWorker = IIndexerWorker & {
|
|
|
9
10
|
terminate: () => Promise<number>;
|
|
10
11
|
};
|
|
11
12
|
export declare class WorkerBlockDispatcherService extends WorkerBlockDispatcher<SubqlProjectDs, IndexerWorker> implements OnApplicationShutdown {
|
|
12
|
-
constructor(nodeConfig: NodeConfig, eventEmitter: EventEmitter2, projectService: IProjectService<SubqlProjectDs>, smartBatchService: SmartBatchService, storeService: StoreService, storeCacheService: StoreCacheService, poiService: PoiService, project: SubqueryProject, dynamicDsService: DynamicDsService, unfinalizedBlocksSevice: UnfinalizedBlocksService);
|
|
13
|
+
constructor(nodeConfig: NodeConfig, eventEmitter: EventEmitter2, projectService: IProjectService<SubqlProjectDs>, smartBatchService: SmartBatchService, storeService: StoreService, storeCacheService: StoreCacheService, poiService: PoiService, project: SubqueryProject, dynamicDsService: DynamicDsService, unfinalizedBlocksSevice: UnfinalizedBlocksService, connectionPoolState: ConnectionPoolStateManager<EthereumApiConnection>);
|
|
13
14
|
protected fetchBlock(worker: IndexerWorker, height: number): Promise<void>;
|
|
14
15
|
}
|
|
15
16
|
export {};
|
|
@@ -26,7 +26,7 @@ const SubqueryProject_1 = require("../../configure/SubqueryProject");
|
|
|
26
26
|
const dynamic_ds_service_1 = require("../dynamic-ds.service");
|
|
27
27
|
const unfinalizedBlocks_service_1 = require("../unfinalizedBlocks.service");
|
|
28
28
|
const logger = (0, node_core_1.getLogger)('WorkerBlockDispatcherService');
|
|
29
|
-
async function createIndexerWorker(store, dynamicDsService, unfinalizedBlocksService, root) {
|
|
29
|
+
async function createIndexerWorker(store, dynamicDsService, unfinalizedBlocksService, connectionPoolState, root) {
|
|
30
30
|
const indexerWorker = node_core_1.Worker.create(path_1.default.resolve(__dirname, '../../../dist/indexer/worker/worker.js'), [
|
|
31
31
|
'initWorker',
|
|
32
32
|
'processBlock',
|
|
@@ -36,25 +36,13 @@ async function createIndexerWorker(store, dynamicDsService, unfinalizedBlocksSer
|
|
|
36
36
|
'getStatus',
|
|
37
37
|
'getMemoryLeft',
|
|
38
38
|
'waitForWorkerBatchSize',
|
|
39
|
-
], {
|
|
40
|
-
storeGet: store.get.bind(store),
|
|
41
|
-
storeGetByField: store.getByField.bind(store),
|
|
42
|
-
storeGetOneByField: store.getOneByField.bind(store),
|
|
43
|
-
storeSet: store.set.bind(store),
|
|
44
|
-
storeBulkCreate: store.bulkCreate.bind(store),
|
|
45
|
-
storeBulkUpdate: store.bulkUpdate.bind(store),
|
|
46
|
-
storeRemove: store.remove.bind(store),
|
|
47
|
-
storeBulkRemove: store.bulkRemove.bind(store),
|
|
48
|
-
dynamicDsCreateDynamicDatasource: dynamicDsService.createDynamicDatasource.bind(dynamicDsService),
|
|
49
|
-
dynamicDsGetDynamicDatasources: dynamicDsService.getDynamicDatasources.bind(dynamicDsService),
|
|
50
|
-
unfinalizedBlocksProcess: unfinalizedBlocksService.processUnfinalizedBlockHeader.bind(unfinalizedBlocksService),
|
|
51
|
-
}, root);
|
|
39
|
+
], Object.assign({ storeGet: store.get.bind(store), storeGetByField: store.getByField.bind(store), storeGetOneByField: store.getOneByField.bind(store), storeSet: store.set.bind(store), storeBulkCreate: store.bulkCreate.bind(store), storeBulkUpdate: store.bulkUpdate.bind(store), storeRemove: store.remove.bind(store), storeBulkRemove: store.bulkRemove.bind(store), dynamicDsCreateDynamicDatasource: dynamicDsService.createDynamicDatasource.bind(dynamicDsService), dynamicDsGetDynamicDatasources: dynamicDsService.getDynamicDatasources.bind(dynamicDsService), unfinalizedBlocksProcess: unfinalizedBlocksService.processUnfinalizedBlockHeader.bind(unfinalizedBlocksService) }, (0, node_core_1.connectionPoolStateHostFunctions)(connectionPoolState)), root);
|
|
52
40
|
await indexerWorker.initWorker();
|
|
53
41
|
return indexerWorker;
|
|
54
42
|
}
|
|
55
43
|
let WorkerBlockDispatcherService = class WorkerBlockDispatcherService extends node_core_1.WorkerBlockDispatcher {
|
|
56
|
-
constructor(nodeConfig, eventEmitter, projectService, smartBatchService, storeService, storeCacheService, poiService, project, dynamicDsService, unfinalizedBlocksSevice) {
|
|
57
|
-
super(nodeConfig, eventEmitter, projectService, smartBatchService, storeService, storeCacheService, poiService, project, dynamicDsService, () => createIndexerWorker(storeService.getStore(), dynamicDsService, unfinalizedBlocksSevice, project.root));
|
|
44
|
+
constructor(nodeConfig, eventEmitter, projectService, smartBatchService, storeService, storeCacheService, poiService, project, dynamicDsService, unfinalizedBlocksSevice, connectionPoolState) {
|
|
45
|
+
super(nodeConfig, eventEmitter, projectService, smartBatchService, storeService, storeCacheService, poiService, project, dynamicDsService, () => createIndexerWorker(storeService.getStore(), dynamicDsService, unfinalizedBlocksSevice, connectionPoolState, project.root));
|
|
58
46
|
}
|
|
59
47
|
async fetchBlock(worker, height) {
|
|
60
48
|
const start = new Date();
|
|
@@ -83,7 +71,8 @@ WorkerBlockDispatcherService = __decorate([
|
|
|
83
71
|
node_core_1.PoiService,
|
|
84
72
|
SubqueryProject_1.SubqueryProject,
|
|
85
73
|
dynamic_ds_service_1.DynamicDsService,
|
|
86
|
-
unfinalizedBlocks_service_1.UnfinalizedBlocksService
|
|
74
|
+
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
75
|
+
node_core_1.ConnectionPoolStateManager])
|
|
87
76
|
], WorkerBlockDispatcherService);
|
|
88
77
|
exports.WorkerBlockDispatcherService = WorkerBlockDispatcherService;
|
|
89
78
|
//# sourceMappingURL=worker-block-dispatcher.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/worker-block-dispatcher.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;;;;AAEnC,gDAAwB;AACxB,2CAA2E;AAC3E,yDAAsD;AACtD,
|
|
1
|
+
{"version":3,"file":"worker-block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/worker-block-dispatcher.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport path from 'path';\nimport { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n getLogger,\n NodeConfig,\n Worker,\n SmartBatchService,\n StoreService,\n PoiService,\n StoreCacheService,\n IProjectService,\n IDynamicDsService,\n HostStore,\n HostDynamicDS,\n WorkerBlockDispatcher,\n IUnfinalizedBlocksService,\n HostConnectionPoolState,\n ConnectionPoolStateManager,\n connectionPoolStateHostFunctions,\n} from '@subql/node-core';\nimport { Store } from '@subql/types-ethereum';\nimport {\n SubqlProjectDs,\n SubqueryProject,\n} from '../../configure/SubqueryProject';\nimport { EthereumApiConnection } from '../../ethereum/api.connection';\n\nimport { EthereumBlockWrapped } from '../../ethereum/block.ethereum';\nimport { DynamicDsService } from '../dynamic-ds.service';\nimport { UnfinalizedBlocksService } from '../unfinalizedBlocks.service';\nimport { IIndexerWorker, IInitIndexerWorker } from '../worker/worker';\nimport { HostUnfinalizedBlocks } from '../worker/worker.unfinalizedBlocks.service';\n\nconst logger = getLogger('WorkerBlockDispatcherService');\n\ntype IndexerWorker = IIndexerWorker & {\n terminate: () => Promise<number>;\n};\n\nasync function createIndexerWorker(\n store: Store,\n dynamicDsService: IDynamicDsService<SubqlProjectDs>,\n unfinalizedBlocksService: IUnfinalizedBlocksService<EthereumBlockWrapped>,\n connectionPoolState: ConnectionPoolStateManager<EthereumApiConnection>,\n\n root: string,\n): Promise<IndexerWorker> {\n const indexerWorker = Worker.create<\n IInitIndexerWorker,\n HostDynamicDS<SubqlProjectDs> & HostStore & HostUnfinalizedBlocks\n >(\n path.resolve(__dirname, '../../../dist/indexer/worker/worker.js'),\n [\n 'initWorker',\n 'processBlock',\n 'fetchBlock',\n 'numFetchedBlocks',\n 'numFetchingBlocks',\n 'getStatus',\n 'getMemoryLeft',\n 'waitForWorkerBatchSize',\n ],\n {\n storeGet: store.get.bind(store),\n storeGetByField: store.getByField.bind(store),\n storeGetOneByField: store.getOneByField.bind(store),\n storeSet: store.set.bind(store),\n storeBulkCreate: store.bulkCreate.bind(store),\n storeBulkUpdate: store.bulkUpdate.bind(store),\n storeRemove: store.remove.bind(store),\n storeBulkRemove: store.bulkRemove.bind(store),\n dynamicDsCreateDynamicDatasource:\n dynamicDsService.createDynamicDatasource.bind(dynamicDsService),\n dynamicDsGetDynamicDatasources:\n dynamicDsService.getDynamicDatasources.bind(dynamicDsService),\n unfinalizedBlocksProcess:\n unfinalizedBlocksService.processUnfinalizedBlockHeader.bind(\n unfinalizedBlocksService,\n ),\n ...connectionPoolStateHostFunctions(connectionPoolState),\n },\n root,\n );\n\n await indexerWorker.initWorker();\n\n return indexerWorker;\n}\n\n@Injectable()\nexport class WorkerBlockDispatcherService\n extends WorkerBlockDispatcher<SubqlProjectDs, IndexerWorker>\n implements OnApplicationShutdown\n{\n constructor(\n nodeConfig: NodeConfig,\n eventEmitter: EventEmitter2,\n @Inject('IProjectService') projectService: IProjectService<SubqlProjectDs>,\n smartBatchService: SmartBatchService,\n storeService: StoreService,\n storeCacheService: StoreCacheService,\n poiService: PoiService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n dynamicDsService: DynamicDsService,\n unfinalizedBlocksSevice: UnfinalizedBlocksService,\n connectionPoolState: ConnectionPoolStateManager<EthereumApiConnection>,\n ) {\n super(\n nodeConfig,\n eventEmitter,\n projectService,\n smartBatchService,\n storeService,\n storeCacheService,\n poiService,\n project,\n dynamicDsService,\n () =>\n createIndexerWorker(\n storeService.getStore(),\n dynamicDsService,\n unfinalizedBlocksSevice,\n connectionPoolState,\n project.root,\n ),\n );\n }\n\n protected async fetchBlock(\n worker: IndexerWorker,\n height: number,\n ): Promise<void> {\n const start = new Date();\n await worker.fetchBlock(height);\n const end = new Date();\n\n // const waitTime = end.getTime() - start.getTime();\n // if (waitTime > 1000) {\n // logger.info(\n // `Waiting to fetch block ${height}: ${chalk.red(`${waitTime}ms`)}`,\n // );\n // } else if (waitTime > 200) {\n // logger.info(\n // `Waiting to fetch block ${height}: ${chalk.yellow(`${waitTime}ms`)}`,\n // );\n // }\n }\n}\n"]}
|
|
@@ -39,6 +39,7 @@ FetchModule = __decorate([
|
|
|
39
39
|
inject: ['ISubqueryProject', node_core_1.ConnectionPoolService, event_emitter_1.EventEmitter2],
|
|
40
40
|
},
|
|
41
41
|
indexer_manager_1.IndexerManager,
|
|
42
|
+
node_core_1.ConnectionPoolStateManager,
|
|
42
43
|
node_core_1.ConnectionPoolService,
|
|
43
44
|
{
|
|
44
45
|
provide: node_core_1.SmartBatchService,
|
|
@@ -56,8 +57,8 @@ FetchModule = __decorate([
|
|
|
56
57
|
},
|
|
57
58
|
{
|
|
58
59
|
provide: 'IBlockDispatcher',
|
|
59
|
-
useFactory: (nodeConfig, eventEmitter, projectService, apiService, indexerManager, smartBatchService, storeService, storeCacheService, poiService, project, dynamicDsService, unfinalizedBlocks) => nodeConfig.workers !== undefined
|
|
60
|
-
? new blockDispatcher_1.WorkerBlockDispatcherService(nodeConfig, eventEmitter, projectService, smartBatchService, storeService, storeCacheService, poiService, project, dynamicDsService, unfinalizedBlocks)
|
|
60
|
+
useFactory: (nodeConfig, eventEmitter, projectService, apiService, indexerManager, smartBatchService, storeService, storeCacheService, poiService, project, dynamicDsService, unfinalizedBlocks, connectionPoolState) => nodeConfig.workers !== undefined
|
|
61
|
+
? new blockDispatcher_1.WorkerBlockDispatcherService(nodeConfig, eventEmitter, projectService, smartBatchService, storeService, storeCacheService, poiService, project, dynamicDsService, unfinalizedBlocks, connectionPoolState)
|
|
61
62
|
: new blockDispatcher_1.BlockDispatcherService(apiService, nodeConfig, indexerManager, eventEmitter, projectService, smartBatchService, storeService, storeCacheService, poiService, project, dynamicDsService),
|
|
62
63
|
inject: [
|
|
63
64
|
node_core_1.NodeConfig,
|
|
@@ -72,9 +73,11 @@ FetchModule = __decorate([
|
|
|
72
73
|
'ISubqueryProject',
|
|
73
74
|
dynamic_ds_service_1.DynamicDsService,
|
|
74
75
|
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
76
|
+
node_core_1.ConnectionPoolStateManager,
|
|
75
77
|
],
|
|
76
78
|
},
|
|
77
79
|
fetch_service_1.FetchService,
|
|
80
|
+
node_core_1.ConnectionPoolService,
|
|
78
81
|
node_core_1.IndexingBenchmarkService,
|
|
79
82
|
node_core_1.PoiBenchmarkService,
|
|
80
83
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.module.js","sourceRoot":"","sources":["../../src/indexer/fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAAsD;AACtD,
|
|
1
|
+
{"version":3,"file":"fetch.module.js","sourceRoot":"","sources":["../../src/indexer/fetch.module.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n PoiBenchmarkService,\n IndexingBenchmarkService,\n MmrService,\n StoreService,\n PoiService,\n ApiService,\n NodeConfig,\n ConnectionPoolService,\n ConnectionPoolStateManager,\n SmartBatchService,\n StoreCacheService,\n PgMmrCacheService,\n MmrQueryService,\n} from '@subql/node-core';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { EthereumApiConnection } from '../ethereum/api.connection';\nimport { EthereumApiService } from '../ethereum/api.service.ethereum';\nimport {\n BlockDispatcherService,\n WorkerBlockDispatcherService,\n} from './blockDispatcher';\nimport { DictionaryService } from './dictionary.service';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { FetchService } from './fetch.service';\nimport { IndexerManager } from './indexer.manager';\nimport { ProjectService } from './project.service';\nimport { SandboxService } from './sandbox.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\n@Module({\n providers: [\n StoreService,\n StoreCacheService,\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 ConnectionPoolStateManager,\n ConnectionPoolService,\n {\n provide: SmartBatchService,\n useFactory: (nodeConfig: NodeConfig) => {\n return new SmartBatchService(nodeConfig.batchSize);\n },\n inject: [NodeConfig],\n },\n {\n provide: SmartBatchService,\n useFactory: (nodeConfig: NodeConfig) => {\n return new SmartBatchService(nodeConfig.batchSize);\n },\n inject: [NodeConfig],\n },\n {\n provide: 'IBlockDispatcher',\n useFactory: (\n nodeConfig: NodeConfig,\n eventEmitter: EventEmitter2,\n projectService: ProjectService,\n apiService: EthereumApiService,\n indexerManager: IndexerManager,\n smartBatchService: SmartBatchService,\n storeService: StoreService,\n storeCacheService: StoreCacheService,\n poiService: PoiService,\n project: SubqueryProject,\n dynamicDsService: DynamicDsService,\n unfinalizedBlocks: UnfinalizedBlocksService,\n connectionPoolState: ConnectionPoolStateManager<EthereumApiConnection>,\n ) =>\n nodeConfig.workers !== undefined\n ? new WorkerBlockDispatcherService(\n nodeConfig,\n eventEmitter,\n projectService,\n smartBatchService,\n storeService,\n storeCacheService,\n poiService,\n project,\n dynamicDsService,\n unfinalizedBlocks,\n connectionPoolState,\n )\n : new BlockDispatcherService(\n apiService,\n nodeConfig,\n indexerManager,\n eventEmitter,\n projectService,\n smartBatchService,\n storeService,\n storeCacheService,\n poiService,\n project,\n dynamicDsService,\n ),\n inject: [\n NodeConfig,\n EventEmitter2,\n 'IProjectService',\n ApiService,\n IndexerManager,\n SmartBatchService,\n StoreService,\n StoreCacheService,\n PoiService,\n 'ISubqueryProject',\n DynamicDsService,\n UnfinalizedBlocksService,\n ConnectionPoolStateManager,\n ],\n },\n FetchService,\n ConnectionPoolService,\n IndexingBenchmarkService,\n PoiBenchmarkService,\n {\n provide: DictionaryService,\n useFactory: async (project: SubqueryProject, nodeConfig: NodeConfig) => {\n const dictionaryService = await DictionaryService.create(\n project,\n nodeConfig,\n );\n return dictionaryService;\n },\n inject: ['ISubqueryProject', NodeConfig],\n },\n SandboxService,\n DsProcessorService,\n DynamicDsService,\n PoiService,\n MmrService,\n MmrQueryService,\n PgMmrCacheService,\n {\n useClass: ProjectService,\n provide: 'IProjectService',\n },\n UnfinalizedBlocksService,\n ],\n exports: [StoreService, MmrService, StoreCacheService, MmrQueryService],\n})\nexport class FetchModule {}\n"]}
|
|
@@ -30,6 +30,15 @@ IndexerModule = __decorate([
|
|
|
30
30
|
indexer_manager_1.IndexerManager,
|
|
31
31
|
node_core_1.StoreCacheService,
|
|
32
32
|
node_core_1.StoreService,
|
|
33
|
+
{
|
|
34
|
+
provide: node_core_1.ConnectionPoolStateManager,
|
|
35
|
+
useFactory: () => {
|
|
36
|
+
if (worker_threads_1.isMainThread) {
|
|
37
|
+
throw new Error('Expected to be worker thread');
|
|
38
|
+
}
|
|
39
|
+
return new node_core_1.WorkerConnectionPoolStateManager(global.host);
|
|
40
|
+
},
|
|
41
|
+
},
|
|
33
42
|
node_core_1.ConnectionPoolService,
|
|
34
43
|
{
|
|
35
44
|
provide: node_core_1.ApiService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.module.js","sourceRoot":"","sources":["../../src/indexer/indexer.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAwC;AACxC,yDAAsD;AACtD,
|
|
1
|
+
{"version":3,"file":"indexer.module.js","sourceRoot":"","sources":["../../src/indexer/indexer.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAwC;AACxC,yDAAsD;AACtD,gDAa0B;AAE1B,0CAAiD;AAEjD,iEAA4D;AAC5D,6DAAwD;AACxD,uDAAmD;AACnD,uDAAmD;AACnD,uDAAmD;AACnD,2EAAuE;AACvE,4DAAwD;AACxD,gGAA2F;AAkEpF,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,aAAa;IAhEzB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE;YACT,gCAAc;YACd,6BAAiB;YACjB,wBAAY;YACZ;gBACE,OAAO,EAAE,sCAA0B;gBACnC,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,6BAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBACD,OAAO,IAAI,4CAAgC,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC;gBACpE,CAAC;aACF;YACD,iCAAqB;YACrB;gBACE,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,KAAK,EACf,OAAwB,EACxB,qBAAmE,EACnE,YAA2B,EAC3B,EAAE;oBACF,MAAM,UAAU,GAAG,IAAI,6BAAkB,CACvC,OAAO,EACP,qBAAqB,EACrB,YAAY,CACb,CAAC;oBACF,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;oBACxB,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE,CAAC,kBAAkB,EAAE,iCAAqB,EAAE,6BAAa,CAAC;aACnE;YACD,gCAAc;YACd,yCAAkB;YAClB;gBACE,OAAO,EAAE,qCAAgB;gBACzB,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,6BAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBACD,OAAO,IAAI,kCAAsB,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC;aACF;YACD,sBAAU;YACV,sBAAU;YACV,6BAAiB;YACjB,2BAAe;YACf;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,gCAAc;aACzB;YACD,8BAAa;YACb;gBACE,OAAO,EAAE,oDAAwB;gBACjC,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,6BAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBACD,OAAO,IAAI,iEAA8B,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC;gBAClE,CAAC;aACF;SACF;QACD,OAAO,EAAE,CAAC,wBAAY,EAAE,sBAAU,EAAE,2BAAe,CAAC;KACrD,CAAC;GACW,aAAa,CAAG;AAAhB,sCAAa","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n StoreService,\n PoiService,\n MmrService,\n ConnectionPoolService,\n StoreCacheService,\n WorkerDynamicDsService,\n WorkerConnectionPoolStateManager,\n ConnectionPoolStateManager,\n NodeConfig,\n PgMmrCacheService,\n MmrQueryService,\n} from '@subql/node-core';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { EthereumApiService } from '../ethereum';\nimport { EthereumApiConnection } from '../ethereum/api.connection';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\nimport { IndexerManager } from './indexer.manager';\nimport { ProjectService } from './project.service';\nimport { SandboxService } from './sandbox.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\nimport { WorkerService } from './worker/worker.service';\nimport { WorkerUnfinalizedBlocksService } from './worker/worker.unfinalizedBlocks.service';\n\n@Module({\n providers: [\n IndexerManager,\n StoreCacheService,\n StoreService,\n {\n provide: ConnectionPoolStateManager,\n useFactory: () => {\n if (isMainThread) {\n throw new Error('Expected to be worker thread');\n }\n return new WorkerConnectionPoolStateManager((global as any).host);\n },\n },\n ConnectionPoolService,\n {\n provide: ApiService,\n useFactory: async (\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<EthereumApiConnection>,\n eventEmitter: EventEmitter2,\n ) => {\n const apiService = new EthereumApiService(\n project,\n connectionPoolService,\n eventEmitter,\n );\n await apiService.init();\n return apiService;\n },\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n SandboxService,\n DsProcessorService,\n {\n provide: DynamicDsService,\n useFactory: () => {\n if (isMainThread) {\n throw new Error('Expected to be worker thread');\n }\n return new WorkerDynamicDsService((global as any).host);\n },\n },\n PoiService,\n MmrService,\n PgMmrCacheService,\n MmrQueryService,\n {\n provide: 'IProjectService',\n useClass: ProjectService,\n },\n WorkerService,\n {\n provide: UnfinalizedBlocksService,\n useFactory: () => {\n if (isMainThread) {\n throw new Error('Expected to be worker thread');\n }\n return new WorkerUnfinalizedBlocksService((global as any).host);\n },\n },\n ],\n exports: [StoreService, MmrService, MmrQueryService],\n})\nexport class IndexerModule {}\n"]}
|
|
@@ -81,7 +81,12 @@ async function waitForWorkerBatchSize(heapSizeInBytes) {
|
|
|
81
81
|
await (0, node_core_1.waitForBatchSize)(heapSizeInBytes);
|
|
82
82
|
}
|
|
83
83
|
// Register these functions to be exposed to worker host
|
|
84
|
-
global.host = node_core_1.WorkerHost.create([
|
|
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
|
+
], {
|
|
85
90
|
initWorker,
|
|
86
91
|
fetchBlock,
|
|
87
92
|
processBlock,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;AAEnC,iEAAiE;AACjE,kDAAkD;AAClD,wCAAwC;AACxC,oDAAqD;AACrD,wCAAwC;AACxC,uCAA2C;AAE3C,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,IAAA,mBAAU,EACR,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAA+B,EACpC,IAAI,CAAC,QAA8B,CACpC,CAAC;AAEF,oDAA4B;AAC5B,6DAA+C;AAC/C,2BAAuC;AAEvC,uCAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2023 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\n// initlogger and yargs must be imported before all other imports\n// making sure logger is defined before its called\n// eslint-disable-next-line import/order\nimport { initLogger } from '@subql/node-core/logger';\n// eslint-disable-next-line import/order\nimport { yargsOptions } from '../../yargs';\n\nconst { argv } = yargsOptions;\n\ninitLogger(\n argv.debug,\n argv.outputFmt as 'json' | 'colored',\n argv.logLevel as string | undefined,\n);\n\nimport assert from 'assert';\nimport { threadId } from 'node:worker_threads';\nimport { getHeapStatistics } from 'v8';\nimport { INestApplication } from '@nestjs/common';\nimport { NestFactory } from '@nestjs/core';\nimport {\n waitForBatchSize,\n WorkerHost,\n getLogger,\n NestLogger,\n hostStoreKeys,\n HostStore,\n hostDynamicDsKeys,\n HostDynamicDS,\n ProcessBlockResponse,\n HostConnectionPoolState,\n hostConnectionPoolStateKeys,\n} from '@subql/node-core';\nimport { SubqlProjectDs } from '../../configure/SubqueryProject';\nimport { EthereumApiConnection } from '../../ethereum/api.connection';\nimport { IndexerManager } from '../indexer.manager';\nimport { WorkerModule } from './worker.module';\nimport {\n FetchBlockResponse,\n WorkerService,\n WorkerStatusResponse,\n} from './worker.service';\nimport {\n HostUnfinalizedBlocks,\n hostUnfinalizedBlocksKeys,\n} from './worker.unfinalizedBlocks.service';\nlet app: INestApplication;\nlet workerService: WorkerService;\n\nconst logger = getLogger(`worker #${threadId}`);\n\nasync function initWorker(): Promise<void> {\n try {\n if (app) {\n logger.warn('Worker already initialised');\n return;\n }\n\n app = await NestFactory.create(WorkerModule, {\n logger: new NestLogger(), // TIP: If the worker is crashing comment out this line for better logging\n });\n\n await app.init();\n\n const indexerManager = app.get(IndexerManager);\n // Initialise async services, we do this here rather than in factories so we can capture one off events\n await indexerManager.start();\n\n workerService = app.get(WorkerService);\n } catch (e) {\n console.log('Failed to start worker', e);\n logger.error(e, 'Failed to start worker');\n throw e;\n }\n}\n\nasync function fetchBlock(height: number): Promise<FetchBlockResponse> {\n assert(workerService, 'Not initialised');\n return workerService.fetchBlock(height);\n}\n\nasync function processBlock(height: number): Promise<ProcessBlockResponse> {\n assert(workerService, 'Not initialised');\n\n return workerService.processBlock(height);\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nasync function numFetchedBlocks(): Promise<number> {\n return workerService.numFetchedBlocks;\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nasync function numFetchingBlocks(): Promise<number> {\n return workerService.numFetchingBlocks;\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nasync function getStatus(): Promise<WorkerStatusResponse> {\n return {\n threadId,\n fetchedBlocks: workerService.numFetchedBlocks,\n toFetchBlocks: workerService.numFetchingBlocks,\n isIndexing: workerService.isIndexing,\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await\nasync function getMemoryLeft(): Promise<number> {\n const totalHeap = getHeapStatistics().heap_size_limit;\n const heapUsed = process.memoryUsage().heapUsed;\n\n return totalHeap - heapUsed;\n}\n\nasync function waitForWorkerBatchSize(heapSizeInBytes: number): Promise<void> {\n await waitForBatchSize(heapSizeInBytes);\n}\n\n// Register these functions to be exposed to worker host\n(global as any).host = WorkerHost.create<\n HostStore &\n HostDynamicDS<SubqlProjectDs> &\n HostUnfinalizedBlocks &\n HostConnectionPoolState<EthereumApiConnection>,\n IInitIndexerWorker\n>(\n [\n ...hostStoreKeys,\n ...hostDynamicDsKeys,\n ...hostUnfinalizedBlocksKeys,\n ...hostConnectionPoolStateKeys,\n ],\n {\n initWorker,\n fetchBlock,\n processBlock,\n numFetchedBlocks,\n numFetchingBlocks,\n getStatus,\n getMemoryLeft,\n waitForWorkerBatchSize,\n },\n logger,\n);\n\n// Export types to be used on the parent\ntype InitWorker = typeof initWorker;\ntype FetchBlock = typeof fetchBlock;\ntype ProcessBlock = typeof processBlock;\ntype NumFetchedBlocks = typeof numFetchedBlocks;\ntype NumFetchingBlocks = typeof numFetchingBlocks;\ntype GetWorkerStatus = typeof getStatus;\ntype GetMemoryLeft = typeof getMemoryLeft;\ntype WaitForWorkerBatchSize = typeof waitForWorkerBatchSize;\n\nexport type IIndexerWorker = {\n processBlock: ProcessBlock;\n fetchBlock: FetchBlock;\n numFetchedBlocks: NumFetchedBlocks;\n numFetchingBlocks: NumFetchingBlocks;\n getStatus: GetWorkerStatus;\n getMemoryLeft: GetMemoryLeft;\n waitForWorkerBatchSize: WaitForWorkerBatchSize;\n};\n\nexport type IInitIndexerWorker = IIndexerWorker & {\n initWorker: InitWorker;\n};\n\nprocess.on('uncaughtException', (e) => {\n logger.error(e, 'Uncaught Exception');\n throw e;\n});\n"]}
|