@subql/node-ethereum 1.10.1-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.
Files changed (118) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +201 -0
  3. package/README.md +76 -0
  4. package/bin/run +4 -0
  5. package/bin/run.cmd +3 -0
  6. package/dist/.tsbuildinfo +1 -0
  7. package/dist/app.module.d.ts +2 -0
  8. package/dist/app.module.js +35 -0
  9. package/dist/app.module.js.map +1 -0
  10. package/dist/configure/SubqueryProject.d.ts +29 -0
  11. package/dist/configure/SubqueryProject.js +82 -0
  12. package/dist/configure/SubqueryProject.js.map +1 -0
  13. package/dist/configure/configure.module.d.ts +7 -0
  14. package/dist/configure/configure.module.js +172 -0
  15. package/dist/configure/configure.module.js.map +1 -0
  16. package/dist/configure/configure.module.spec.d.ts +1 -0
  17. package/dist/configure/configure.module.spec.js +26 -0
  18. package/dist/configure/configure.module.spec.js.map +1 -0
  19. package/dist/ethereum/api.ethereum.d.ts +21 -0
  20. package/dist/ethereum/api.ethereum.js +190 -0
  21. package/dist/ethereum/api.ethereum.js.map +1 -0
  22. package/dist/ethereum/api.service.ethereum.d.ts +8 -0
  23. package/dist/ethereum/api.service.ethereum.js +57 -0
  24. package/dist/ethereum/api.service.ethereum.js.map +1 -0
  25. package/dist/ethereum/block.ethereum.d.ts +15 -0
  26. package/dist/ethereum/block.ethereum.js +87 -0
  27. package/dist/ethereum/block.ethereum.js.map +1 -0
  28. package/dist/ethereum/index.d.ts +2 -0
  29. package/dist/ethereum/index.js +21 -0
  30. package/dist/ethereum/index.js.map +1 -0
  31. package/dist/ethereum/utils.ethereum.d.ts +6 -0
  32. package/dist/ethereum/utils.ethereum.js +131 -0
  33. package/dist/ethereum/utils.ethereum.js.map +1 -0
  34. package/dist/indexer/dictionary.service.d.ts +7 -0
  35. package/dist/indexer/dictionary.service.js +29 -0
  36. package/dist/indexer/dictionary.service.js.map +1 -0
  37. package/dist/indexer/ds-processor.service.d.ts +26 -0
  38. package/dist/indexer/ds-processor.service.js +133 -0
  39. package/dist/indexer/ds-processor.service.js.map +1 -0
  40. package/dist/indexer/dynamic-ds.service.d.ts +23 -0
  41. package/dist/indexer/dynamic-ds.service.js +105 -0
  42. package/dist/indexer/dynamic-ds.service.js.map +1 -0
  43. package/dist/indexer/fetch.module.d.ts +2 -0
  44. package/dist/indexer/fetch.module.js +68 -0
  45. package/dist/indexer/fetch.module.js.map +1 -0
  46. package/dist/indexer/fetch.service.d.ts +43 -0
  47. package/dist/indexer/fetch.service.js +359 -0
  48. package/dist/indexer/fetch.service.js.map +1 -0
  49. package/dist/indexer/indexer.manager.d.ts +36 -0
  50. package/dist/indexer/indexer.manager.js +256 -0
  51. package/dist/indexer/indexer.manager.js.map +1 -0
  52. package/dist/indexer/indexer.module.d.ts +2 -0
  53. package/dist/indexer/indexer.module.js +52 -0
  54. package/dist/indexer/indexer.module.js.map +1 -0
  55. package/dist/indexer/project.service.d.ts +39 -0
  56. package/dist/indexer/project.service.js +255 -0
  57. package/dist/indexer/project.service.js.map +1 -0
  58. package/dist/indexer/sandbox.service.d.ts +12 -0
  59. package/dist/indexer/sandbox.service.js +58 -0
  60. package/dist/indexer/sandbox.service.js.map +1 -0
  61. package/dist/indexer/types.d.ts +10 -0
  62. package/dist/indexer/types.js +11 -0
  63. package/dist/indexer/types.js.map +1 -0
  64. package/dist/indexer/worker/block-dispatcher.service.d.ts +69 -0
  65. package/dist/indexer/worker/block-dispatcher.service.js +356 -0
  66. package/dist/indexer/worker/block-dispatcher.service.js.map +1 -0
  67. package/dist/indexer/worker/worker.d.ts +14 -0
  68. package/dist/indexer/worker/worker.js +85 -0
  69. package/dist/indexer/worker/worker.js.map +1 -0
  70. package/dist/indexer/worker/worker.module.d.ts +2 -0
  71. package/dist/indexer/worker/worker.module.js +33 -0
  72. package/dist/indexer/worker/worker.module.js.map +1 -0
  73. package/dist/indexer/worker/worker.service.d.ts +28 -0
  74. package/dist/indexer/worker/worker.service.js +79 -0
  75. package/dist/indexer/worker/worker.service.js.map +1 -0
  76. package/dist/init.d.ts +1 -0
  77. package/dist/init.js +54 -0
  78. package/dist/init.js.map +1 -0
  79. package/dist/main.d.ts +1 -0
  80. package/dist/main.js +14 -0
  81. package/dist/main.js.map +1 -0
  82. package/dist/meta/meta.controller.d.ts +23 -0
  83. package/dist/meta/meta.controller.js +36 -0
  84. package/dist/meta/meta.controller.js.map +1 -0
  85. package/dist/meta/meta.module.d.ts +2 -0
  86. package/dist/meta/meta.module.js +77 -0
  87. package/dist/meta/meta.module.js.map +1 -0
  88. package/dist/meta/meta.service.d.ts +42 -0
  89. package/dist/meta/meta.service.js +110 -0
  90. package/dist/meta/meta.service.js.map +1 -0
  91. package/dist/subcommands/forceClean.init.d.ts +1 -0
  92. package/dist/subcommands/forceClean.init.js +25 -0
  93. package/dist/subcommands/forceClean.init.js.map +1 -0
  94. package/dist/subcommands/forceClean.module.d.ts +4 -0
  95. package/dist/subcommands/forceClean.module.js +38 -0
  96. package/dist/subcommands/forceClean.module.js.map +1 -0
  97. package/dist/subcommands/forceClean.service.d.ts +8 -0
  98. package/dist/subcommands/forceClean.service.js +65 -0
  99. package/dist/subcommands/forceClean.service.js.map +1 -0
  100. package/dist/subcommands/reindex.init.d.ts +1 -0
  101. package/dist/subcommands/reindex.init.js +25 -0
  102. package/dist/subcommands/reindex.init.js.map +1 -0
  103. package/dist/subcommands/reindex.module.d.ts +4 -0
  104. package/dist/subcommands/reindex.module.js +39 -0
  105. package/dist/subcommands/reindex.module.js.map +1 -0
  106. package/dist/subcommands/reindex.service.d.ts +24 -0
  107. package/dist/subcommands/reindex.service.js +114 -0
  108. package/dist/subcommands/reindex.service.js.map +1 -0
  109. package/dist/utils/project.d.ts +13 -0
  110. package/dist/utils/project.js +191 -0
  111. package/dist/utils/project.js.map +1 -0
  112. package/dist/utils/string.d.ts +4 -0
  113. package/dist/utils/string.js +32 -0
  114. package/dist/utils/string.js.map +1 -0
  115. package/dist/yargs.d.ts +154 -0
  116. package/dist/yargs.js +193 -0
  117. package/dist/yargs.js.map +1 -0
  118. package/package.json +77 -0
@@ -0,0 +1,255 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ProjectService = void 0;
18
+ const assert_1 = __importDefault(require("assert"));
19
+ const worker_threads_1 = require("worker_threads");
20
+ const common_1 = require("@nestjs/common");
21
+ const event_emitter_1 = require("@nestjs/event-emitter");
22
+ const node_core_1 = require("@subql/node-core");
23
+ const sequelize_1 = require("sequelize");
24
+ const SubqueryProject_1 = require("../configure/SubqueryProject");
25
+ const project_1 = require("../utils/project");
26
+ const ds_processor_service_1 = require("./ds-processor.service");
27
+ const dynamic_ds_service_1 = require("./dynamic-ds.service");
28
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
29
+ const { version: packageVersion } = require('../../package.json');
30
+ const DEFAULT_DB_SCHEMA = 'public';
31
+ const logger = (0, node_core_1.getLogger)('Project');
32
+ let ProjectService = class ProjectService {
33
+ constructor(dsProcessorService, apiService, poiService, mmrService, sequelize, project, storeService, nodeConfig, dynamicDsService, eventEmitter) {
34
+ this.dsProcessorService = dsProcessorService;
35
+ this.apiService = apiService;
36
+ this.poiService = poiService;
37
+ this.mmrService = mmrService;
38
+ this.sequelize = sequelize;
39
+ this.project = project;
40
+ this.storeService = storeService;
41
+ this.nodeConfig = nodeConfig;
42
+ this.dynamicDsService = dynamicDsService;
43
+ this.eventEmitter = eventEmitter;
44
+ }
45
+ get schema() {
46
+ return this._schema;
47
+ }
48
+ get blockOffset() {
49
+ return this._blockOffset;
50
+ }
51
+ get startHeight() {
52
+ return this._startHeight;
53
+ }
54
+ async getExistingProjectSchema() {
55
+ return (0, node_core_1.getExistingProjectSchema)(this.nodeConfig, this.sequelize);
56
+ }
57
+ async init() {
58
+ // Used to load assets into DS-processor, has to be done in any thread
59
+ await this.dsProcessorService.validateProjectCustomDatasources();
60
+ // Do extra work on main thread to setup stuff
61
+ if (worker_threads_1.isMainThread) {
62
+ this._schema = await this.ensureProject();
63
+ await this.initDbSchema();
64
+ this.metadataRepo = await this.ensureMetadata();
65
+ this.dynamicDsService.init(this.metadataRepo);
66
+ if (this.nodeConfig.proofOfIndex) {
67
+ const blockOffset = await this.getMetadataBlockOffset();
68
+ void this.setBlockOffset(Number(blockOffset));
69
+ await this.poiService.init(this.schema);
70
+ }
71
+ this._startHeight = await this.getStartHeight();
72
+ }
73
+ else {
74
+ this.metadataRepo = (0, node_core_1.MetadataFactory)(this.sequelize, this.schema);
75
+ this.dynamicDsService.init(this.metadataRepo);
76
+ await this.sequelize.sync();
77
+ this._schema = await this.getExistingProjectSchema();
78
+ (0, assert_1.default)(this._schema, 'Schema should be created in main thread');
79
+ await this.initDbSchema();
80
+ if (this.nodeConfig.proofOfIndex) {
81
+ await this.poiService.init(this.schema);
82
+ }
83
+ }
84
+ }
85
+ async ensureProject() {
86
+ let schema = await this.getExistingProjectSchema();
87
+ if (!schema) {
88
+ schema = await this.createProjectSchema();
89
+ }
90
+ this.eventEmitter.emit(node_core_1.IndexerEvent.Ready, {
91
+ value: true,
92
+ });
93
+ return schema;
94
+ }
95
+ async createProjectSchema() {
96
+ let schema;
97
+ if (this.nodeConfig.localMode) {
98
+ // create tables in default schema if local mode is enabled
99
+ schema = DEFAULT_DB_SCHEMA;
100
+ }
101
+ else {
102
+ schema = this.nodeConfig.dbSchema;
103
+ const schemas = await this.sequelize.showAllSchemas(undefined);
104
+ if (!schemas.includes(schema)) {
105
+ await this.sequelize.createSchema(`"${schema}"`, undefined);
106
+ }
107
+ }
108
+ return schema;
109
+ }
110
+ async initDbSchema() {
111
+ await (0, project_1.initDbSchema)(this.project, this.schema, this.storeService);
112
+ }
113
+ async ensureMetadata() {
114
+ var _a;
115
+ const metadataRepo = (0, node_core_1.MetadataFactory)(this.sequelize, this.schema);
116
+ this.eventEmitter.emit(node_core_1.IndexerEvent.NetworkMetadata, this.apiService.networkMeta);
117
+ const keys = [
118
+ 'lastProcessedHeight',
119
+ 'blockOffset',
120
+ 'indexerNodeVersion',
121
+ 'chain',
122
+ 'specName',
123
+ 'genesisHash',
124
+ 'chainId',
125
+ 'processedBlockCount',
126
+ ];
127
+ const entries = await metadataRepo.findAll({
128
+ where: {
129
+ key: keys,
130
+ },
131
+ });
132
+ const keyValue = entries.reduce((arr, curr) => {
133
+ arr[curr.key] = curr.value;
134
+ return arr;
135
+ }, {});
136
+ const { chain, genesisHash, specName } = this.apiService.networkMeta;
137
+ if (this.project.runner) {
138
+ await Promise.all([
139
+ metadataRepo.upsert({
140
+ key: 'runnerNode',
141
+ value: this.project.runner.node.name,
142
+ }),
143
+ metadataRepo.upsert({
144
+ key: 'runnerNodeVersion',
145
+ value: this.project.runner.node.version,
146
+ }),
147
+ metadataRepo.upsert({
148
+ key: 'runnerQuery',
149
+ value: this.project.runner.query.name,
150
+ }),
151
+ metadataRepo.upsert({
152
+ key: 'runnerQueryVersion',
153
+ value: this.project.runner.query.version,
154
+ }),
155
+ ]);
156
+ }
157
+ if (!keyValue.genesisHash) {
158
+ await metadataRepo.upsert({ key: 'genesisHash', value: genesisHash });
159
+ }
160
+ else {
161
+ // Check if the configured genesisHash matches the currently stored genesisHash
162
+ (0, assert_1.default)(
163
+ // Configured project yaml genesisHash only exists in specVersion v0.2.0, fallback to api fetched genesisHash on v0.0.1
164
+ ((_a = this.project.network.genesisHash) !== null && _a !== void 0 ? _a : genesisHash) ===
165
+ keyValue.genesisHash, 'Specified project manifest chain id / genesis hash does not match database stored genesis hash, consider cleaning project schema using --force-clean');
166
+ }
167
+ if (keyValue.chain !== chain) {
168
+ await metadataRepo.upsert({ key: 'chain', value: chain });
169
+ }
170
+ if (keyValue.specName !== specName) {
171
+ await metadataRepo.upsert({ key: 'specName', value: specName });
172
+ }
173
+ // If project was created before this feature, don't add the key. If it is project created after, add this key.
174
+ if (!keyValue.processedBlockCount && !keyValue.lastProcessedHeight) {
175
+ await metadataRepo.upsert({ key: 'processedBlockCount', value: 0 });
176
+ }
177
+ if (keyValue.indexerNodeVersion !== packageVersion) {
178
+ await metadataRepo.upsert({
179
+ key: 'indexerNodeVersion',
180
+ value: packageVersion,
181
+ });
182
+ }
183
+ return metadataRepo;
184
+ }
185
+ async upsertMetadataBlockOffset(height) {
186
+ await this.metadataRepo.upsert({
187
+ key: 'blockOffset',
188
+ value: height,
189
+ });
190
+ }
191
+ async getMetadataBlockOffset() {
192
+ return (0, node_core_1.getMetaDataInfo)(this.metadataRepo, 'blockOffset');
193
+ }
194
+ async getLastProcessedHeight() {
195
+ return (0, node_core_1.getMetaDataInfo)(this.metadataRepo, 'lastProcessedHeight');
196
+ }
197
+ async getStartHeight() {
198
+ let startHeight;
199
+ const lastProcessedHeight = await this.getLastProcessedHeight();
200
+ if (lastProcessedHeight !== null && lastProcessedHeight !== undefined) {
201
+ startHeight = Number(lastProcessedHeight) + 1;
202
+ }
203
+ else {
204
+ startHeight = this.getStartBlockFromDataSources();
205
+ }
206
+ return startHeight;
207
+ }
208
+ async setBlockOffset(offset) {
209
+ if (this._blockOffset ||
210
+ offset === null ||
211
+ offset === undefined ||
212
+ isNaN(offset)) {
213
+ return;
214
+ }
215
+ logger.info(`set blockOffset to ${offset}`);
216
+ this._blockOffset = offset;
217
+ return this.mmrService
218
+ .syncFileBaseFromPoi(this.schema, offset)
219
+ .catch((err) => {
220
+ logger.error(err, 'failed to sync poi to mmr');
221
+ process.exit(1);
222
+ });
223
+ }
224
+ async getProcessedBlockCount() {
225
+ const res = await this.metadataRepo.findOne({
226
+ where: { key: 'processedBlockCount' },
227
+ });
228
+ return res === null || res === void 0 ? void 0 : res.value;
229
+ }
230
+ getStartBlockFromDataSources() {
231
+ const startBlocksList = this.project.dataSources.map((item) => { var _a; return (_a = item.startBlock) !== null && _a !== void 0 ? _a : 1; });
232
+ if (startBlocksList.length === 0) {
233
+ logger.error(`Failed to find a valid datasource, Please check your endpoint if specName filter is used.`);
234
+ process.exit(1);
235
+ }
236
+ else {
237
+ return Math.min(...startBlocksList);
238
+ }
239
+ }
240
+ };
241
+ ProjectService = __decorate([
242
+ (0, common_1.Injectable)(),
243
+ __metadata("design:paramtypes", [ds_processor_service_1.DsProcessorService,
244
+ node_core_1.ApiService,
245
+ node_core_1.PoiService,
246
+ node_core_1.MmrService,
247
+ sequelize_1.Sequelize,
248
+ SubqueryProject_1.SubqueryProject,
249
+ node_core_1.StoreService,
250
+ node_core_1.NodeConfig,
251
+ dynamic_ds_service_1.DynamicDsService,
252
+ event_emitter_1.EventEmitter2])
253
+ ], ProjectService);
254
+ exports.ProjectService = ProjectService;
255
+ //# sourceMappingURL=project.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../src/indexer/project.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 assert from 'assert';\nimport { isMainThread } from 'worker_threads';\nimport { Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n MetadataFactory,\n MetadataRepo,\n NodeConfig,\n IndexerEvent,\n StoreService,\n PoiService,\n MmrService,\n getLogger,\n getExistingProjectSchema,\n getMetaDataInfo,\n} from '@subql/node-core';\nimport { Sequelize } from 'sequelize';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { initDbSchema } from '../utils/project';\nimport { DsProcessorService } from './ds-processor.service';\nimport { DynamicDsService } from './dynamic-ds.service';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\nconst DEFAULT_DB_SCHEMA = 'public';\n\nconst logger = getLogger('Project');\n\n@Injectable()\nexport class ProjectService {\n private _schema: string;\n private metadataRepo: MetadataRepo;\n private _startHeight: number;\n private _blockOffset: number;\n\n constructor(\n private readonly dsProcessorService: DsProcessorService,\n private readonly apiService: ApiService,\n private readonly poiService: PoiService,\n protected readonly mmrService: MmrService,\n private readonly sequelize: Sequelize,\n private readonly project: SubqueryProject,\n private readonly storeService: StoreService,\n private readonly nodeConfig: NodeConfig,\n private readonly dynamicDsService: DynamicDsService,\n private eventEmitter: EventEmitter2,\n ) {}\n\n get schema(): string {\n return this._schema;\n }\n\n get blockOffset(): number {\n return this._blockOffset;\n }\n\n get startHeight(): number {\n return this._startHeight;\n }\n\n private async getExistingProjectSchema(): Promise<string> {\n return getExistingProjectSchema(this.nodeConfig, this.sequelize);\n }\n\n async init(): Promise<void> {\n // Used to load assets into DS-processor, has to be done in any thread\n await this.dsProcessorService.validateProjectCustomDatasources();\n // Do extra work on main thread to setup stuff\n if (isMainThread) {\n this._schema = await this.ensureProject();\n await this.initDbSchema();\n this.metadataRepo = await this.ensureMetadata();\n this.dynamicDsService.init(this.metadataRepo);\n\n if (this.nodeConfig.proofOfIndex) {\n const blockOffset = await this.getMetadataBlockOffset();\n void this.setBlockOffset(Number(blockOffset));\n await this.poiService.init(this.schema);\n }\n\n this._startHeight = await this.getStartHeight();\n } else {\n this.metadataRepo = MetadataFactory(this.sequelize, this.schema);\n\n this.dynamicDsService.init(this.metadataRepo);\n\n await this.sequelize.sync();\n\n this._schema = await this.getExistingProjectSchema();\n assert(this._schema, 'Schema should be created in main thread');\n await this.initDbSchema();\n\n if (this.nodeConfig.proofOfIndex) {\n await this.poiService.init(this.schema);\n }\n }\n }\n\n private async ensureProject(): Promise<string> {\n let schema = await this.getExistingProjectSchema();\n if (!schema) {\n schema = await this.createProjectSchema();\n }\n this.eventEmitter.emit(IndexerEvent.Ready, {\n value: true,\n });\n\n return schema;\n }\n\n private async createProjectSchema(): Promise<string> {\n let schema: string;\n if (this.nodeConfig.localMode) {\n // create tables in default schema if local mode is enabled\n schema = DEFAULT_DB_SCHEMA;\n } else {\n schema = this.nodeConfig.dbSchema;\n const schemas = await this.sequelize.showAllSchemas(undefined);\n if (!(schemas as unknown as string[]).includes(schema)) {\n await this.sequelize.createSchema(`\"${schema}\"`, undefined);\n }\n }\n\n return schema;\n }\n\n private async initDbSchema(): Promise<void> {\n await initDbSchema(this.project, this.schema, this.storeService);\n }\n\n private async ensureMetadata(): Promise<MetadataRepo> {\n const metadataRepo = MetadataFactory(this.sequelize, this.schema);\n\n this.eventEmitter.emit(\n IndexerEvent.NetworkMetadata,\n this.apiService.networkMeta,\n );\n\n const keys = [\n 'lastProcessedHeight',\n 'blockOffset',\n 'indexerNodeVersion',\n 'chain',\n 'specName',\n 'genesisHash',\n 'chainId',\n 'processedBlockCount',\n ] as const;\n\n const entries = await metadataRepo.findAll({\n where: {\n key: keys,\n },\n });\n\n const keyValue = entries.reduce((arr, curr) => {\n arr[curr.key] = curr.value;\n return arr;\n }, {} as { [key in typeof keys[number]]: string | boolean | number });\n\n const { chain, genesisHash, specName } = this.apiService.networkMeta;\n\n if (this.project.runner) {\n await Promise.all([\n metadataRepo.upsert({\n key: 'runnerNode',\n value: this.project.runner.node.name,\n }),\n metadataRepo.upsert({\n key: 'runnerNodeVersion',\n value: this.project.runner.node.version,\n }),\n metadataRepo.upsert({\n key: 'runnerQuery',\n value: this.project.runner.query.name,\n }),\n metadataRepo.upsert({\n key: 'runnerQueryVersion',\n value: this.project.runner.query.version,\n }),\n ]);\n }\n if (!keyValue.genesisHash) {\n await metadataRepo.upsert({ key: 'genesisHash', value: genesisHash });\n } else {\n // Check if the configured genesisHash matches the currently stored genesisHash\n assert(\n // Configured project yaml genesisHash only exists in specVersion v0.2.0, fallback to api fetched genesisHash on v0.0.1\n (this.project.network.genesisHash ?? genesisHash) ===\n keyValue.genesisHash,\n 'Specified project manifest chain id / genesis hash does not match database stored genesis hash, consider cleaning project schema using --force-clean',\n );\n }\n\n if (keyValue.chain !== chain) {\n await metadataRepo.upsert({ key: 'chain', value: chain });\n }\n\n if (keyValue.specName !== specName) {\n await metadataRepo.upsert({ key: 'specName', value: specName });\n }\n\n // If project was created before this feature, don't add the key. If it is project created after, add this key.\n if (!keyValue.processedBlockCount && !keyValue.lastProcessedHeight) {\n await metadataRepo.upsert({ key: 'processedBlockCount', value: 0 });\n }\n\n if (keyValue.indexerNodeVersion !== packageVersion) {\n await metadataRepo.upsert({\n key: 'indexerNodeVersion',\n value: packageVersion,\n });\n }\n\n return metadataRepo;\n }\n\n async upsertMetadataBlockOffset(height: number): Promise<void> {\n await this.metadataRepo.upsert({\n key: 'blockOffset',\n value: height,\n });\n }\n\n async getMetadataBlockOffset(): Promise<number | undefined> {\n return getMetaDataInfo(this.metadataRepo, 'blockOffset');\n }\n\n async getLastProcessedHeight(): Promise<number | undefined> {\n return getMetaDataInfo(this.metadataRepo, 'lastProcessedHeight');\n }\n\n private async getStartHeight(): Promise<number> {\n let startHeight: number;\n const lastProcessedHeight = await this.getLastProcessedHeight();\n if (lastProcessedHeight !== null && lastProcessedHeight !== undefined) {\n startHeight = Number(lastProcessedHeight) + 1;\n } else {\n startHeight = this.getStartBlockFromDataSources();\n }\n\n return startHeight;\n }\n\n async setBlockOffset(offset: number): Promise<void> {\n if (\n this._blockOffset ||\n offset === null ||\n offset === undefined ||\n isNaN(offset)\n ) {\n return;\n }\n logger.info(`set blockOffset to ${offset}`);\n this._blockOffset = offset;\n return this.mmrService\n .syncFileBaseFromPoi(this.schema, offset)\n .catch((err) => {\n logger.error(err, 'failed to sync poi to mmr');\n process.exit(1);\n });\n }\n async getProcessedBlockCount(): Promise<number> {\n const res = await this.metadataRepo.findOne({\n where: { key: 'processedBlockCount' },\n });\n\n return res?.value as number | undefined;\n }\n\n private getStartBlockFromDataSources() {\n const startBlocksList = this.project.dataSources.map(\n (item) => item.startBlock ?? 1,\n );\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"]}
@@ -0,0 +1,12 @@
1
+ import { NodeConfig, StoreService, IndexerSandbox } from '@subql/node-core';
2
+ import { ApiWrapper, EthereumBlockWrapper } from '@subql/types-ethereum';
3
+ import { SubqlProjectDs, SubqueryProject } from '../configure/SubqueryProject';
4
+ export declare class SandboxService {
5
+ private readonly storeService;
6
+ private readonly nodeConfig;
7
+ private readonly project;
8
+ private processorCache;
9
+ constructor(storeService: StoreService, nodeConfig: NodeConfig, project: SubqueryProject);
10
+ getDsProcessorWrapper(ds: SubqlProjectDs, api: ApiWrapper, blockContent: EthereumBlockWrapper): IndexerSandbox;
11
+ private getDataSourceEntry;
12
+ }
@@ -0,0 +1,58 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.SandboxService = void 0;
15
+ const common_1 = require("@nestjs/common");
16
+ const common_ethereum_1 = require("@subql/common-ethereum");
17
+ const node_core_1 = require("@subql/node-core");
18
+ const SubqueryProject_1 = require("../configure/SubqueryProject");
19
+ const project_1 = require("../utils/project");
20
+ let SandboxService = class SandboxService {
21
+ constructor(storeService, nodeConfig, project) {
22
+ this.storeService = storeService;
23
+ this.nodeConfig = nodeConfig;
24
+ this.project = project;
25
+ this.processorCache = {};
26
+ }
27
+ getDsProcessorWrapper(ds, api, blockContent) {
28
+ const entry = this.getDataSourceEntry(ds);
29
+ let processor = this.processorCache[entry];
30
+ if (!processor) {
31
+ processor = new node_core_1.IndexerSandbox({
32
+ store: this.storeService.getStore(),
33
+ root: this.project.root,
34
+ script: ds.mapping.entryScript,
35
+ entry,
36
+ }, this.nodeConfig);
37
+ this.processorCache[entry] = processor;
38
+ }
39
+ api.freezeApi(processor, blockContent);
40
+ return processor;
41
+ }
42
+ getDataSourceEntry(ds) {
43
+ if ((0, common_ethereum_1.isDatasourceV0_2_0)(ds)) {
44
+ return ds.mapping.file;
45
+ }
46
+ else {
47
+ return (0, project_1.getProjectEntry)(this.project.root);
48
+ }
49
+ }
50
+ };
51
+ SandboxService = __decorate([
52
+ (0, common_1.Injectable)(),
53
+ __metadata("design:paramtypes", [node_core_1.StoreService,
54
+ node_core_1.NodeConfig,
55
+ SubqueryProject_1.SubqueryProject])
56
+ ], SandboxService);
57
+ exports.SandboxService = SandboxService;
58
+ //# sourceMappingURL=sandbox.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.service.js","sourceRoot":"","sources":["../../src/indexer/sandbox.service.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;;;;;;;;;;AAEtC,2CAA4C;AAC5C,4DAGgC;AAChC,gDAA4E;AAE5E,kEAA+E;AAC/E,8CAAmD;AAG5C,IAAM,cAAc,GAApB,MAAM,cAAc;IAGzB,YACmB,YAA0B,EAC1B,UAAsB,EACtB,OAAwB;QAFxB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,eAAU,GAAV,UAAU,CAAY;QACtB,YAAO,GAAP,OAAO,CAAiB;QALnC,mBAAc,GAAmC,EAAE,CAAC;IAMzD,CAAC;IAEJ,qBAAqB,CACnB,EAAkB,EAClB,GAAe,EACf,YAAkC;QAElC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,EAAE;YACd,SAAS,GAAG,IAAI,0BAAc,CAC5B;gBACE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;gBACnC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBACvB,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW;gBAC9B,KAAK;aACN,EACD,IAAI,CAAC,UAAU,CAChB,CAAC;YACF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;SACxC;QACD,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACvC,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,EAA2B;QACpD,IAAI,IAAA,oCAAkB,EAAC,EAAE,CAAC,EAAE;YAC1B,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;SACxB;aAAM;YACL,OAAO,IAAA,yBAAe,EAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC3C;IACH,CAAC;CACF,CAAA;AAvCY,cAAc;IAD1B,IAAA,mBAAU,GAAE;qCAKsB,wBAAY;QACd,sBAAU;QACb,iCAAe;GANhC,cAAc,CAuC1B;AAvCY,wCAAc","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Injectable } from '@nestjs/common';\nimport {\n isDatasourceV0_2_0,\n SubqlEthereumDataSource,\n} from '@subql/common-ethereum';\nimport { NodeConfig, StoreService, IndexerSandbox } from '@subql/node-core';\nimport { ApiWrapper, EthereumBlockWrapper } from '@subql/types-ethereum';\nimport { SubqlProjectDs, SubqueryProject } from '../configure/SubqueryProject';\nimport { getProjectEntry } from '../utils/project';\n\n@Injectable()\nexport class SandboxService {\n private processorCache: Record<string, IndexerSandbox> = {};\n\n constructor(\n private readonly storeService: StoreService,\n private readonly nodeConfig: NodeConfig,\n private readonly project: SubqueryProject,\n ) {}\n\n getDsProcessorWrapper(\n ds: SubqlProjectDs,\n api: ApiWrapper,\n blockContent: EthereumBlockWrapper,\n ): IndexerSandbox {\n const entry = this.getDataSourceEntry(ds);\n let processor = this.processorCache[entry];\n if (!processor) {\n processor = new IndexerSandbox(\n {\n store: this.storeService.getStore(),\n root: this.project.root,\n script: ds.mapping.entryScript,\n entry,\n },\n this.nodeConfig,\n );\n this.processorCache[entry] = processor;\n }\n api.freezeApi(processor, blockContent);\n return processor;\n }\n\n private getDataSourceEntry(ds: SubqlEthereumDataSource): string {\n if (isDatasourceV0_2_0(ds)) {\n return ds.mapping.file;\n } else {\n return getProjectEntry(this.project.root);\n }\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { Entity } from '@subql/types-ethereum';
2
+ export declare enum OperationType {
3
+ Set = "Set",
4
+ Remove = "Remove"
5
+ }
6
+ export declare type OperationEntity = {
7
+ operation: OperationType;
8
+ entityType: string;
9
+ data: Entity | string;
10
+ };
@@ -0,0 +1,11 @@
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.OperationType = void 0;
6
+ var OperationType;
7
+ (function (OperationType) {
8
+ OperationType["Set"] = "Set";
9
+ OperationType["Remove"] = "Remove";
10
+ })(OperationType = exports.OperationType || (exports.OperationType = {}));
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,sCAAsC;;;AAItC,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,4BAAW,CAAA;IACX,kCAAiB,CAAA;AACnB,CAAC,EAHW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAGxB","sourcesContent":["// Copyright 2020-2022 OnFinality Limited authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Entity } from '@subql/types-ethereum';\n\nexport enum OperationType {\n Set = 'Set',\n Remove = 'Remove',\n}\n\nexport type OperationEntity = {\n operation: OperationType;\n entityType: string;\n data: Entity | string;\n};\n"]}
@@ -0,0 +1,69 @@
1
+ import { OnApplicationShutdown } from '@nestjs/common';
2
+ import { EventEmitter2 } from '@nestjs/event-emitter';
3
+ import { ApiService, NodeConfig } from '@subql/node-core';
4
+ import { IndexerManager } from '../indexer.manager';
5
+ import { ProjectService } from '../project.service';
6
+ export interface IBlockDispatcher {
7
+ init(onDynamicDsCreated: (height: number) => Promise<void>): Promise<void>;
8
+ enqueueBlocks(heights: number[]): void;
9
+ queueSize: number;
10
+ freeSize: number;
11
+ latestBufferedHeight: number | undefined;
12
+ flushQueue(height: number): void;
13
+ }
14
+ /**
15
+ * @description Intended to behave the same as WorkerBlockDispatcherService but doesn't use worker threads or any parallel processing
16
+ */
17
+ export declare class BlockDispatcherService implements IBlockDispatcher, OnApplicationShutdown {
18
+ private apiService;
19
+ private nodeConfig;
20
+ private indexerManager;
21
+ private eventEmitter;
22
+ private projectService;
23
+ private fetchQueue;
24
+ private processQueue;
25
+ private fetching;
26
+ private isShutdown;
27
+ private onDynamicDsCreated;
28
+ private _latestBufferedHeight;
29
+ private _processedBlockCount;
30
+ private fetchBlocksBatches;
31
+ private latestProcessedHeight;
32
+ constructor(apiService: ApiService, nodeConfig: NodeConfig, indexerManager: IndexerManager, eventEmitter: EventEmitter2, projectService: ProjectService);
33
+ init(onDynamicDsCreated: (height: number) => Promise<void>): Promise<void>;
34
+ onApplicationShutdown(): void;
35
+ enqueueBlocks(heights: number[]): void;
36
+ flushQueue(height: number): void;
37
+ private setProcessedBlockCount;
38
+ private fetchBlocksFromQueue;
39
+ get queueSize(): number;
40
+ get freeSize(): number;
41
+ get latestBufferedHeight(): number;
42
+ set latestBufferedHeight(height: number);
43
+ }
44
+ export declare class WorkerBlockDispatcherService implements IBlockDispatcher, OnApplicationShutdown {
45
+ private nodeConfig;
46
+ private eventEmitter;
47
+ private projectService;
48
+ private workers;
49
+ private numWorkers;
50
+ private onDynamicDsCreated;
51
+ private taskCounter;
52
+ private isShutdown;
53
+ private queue;
54
+ private _latestBufferedHeight;
55
+ private _processedBlockCount;
56
+ constructor(nodeConfig: NodeConfig, eventEmitter: EventEmitter2, projectService: ProjectService);
57
+ init(onDynamicDsCreated: (height: number) => Promise<void>): Promise<void>;
58
+ private setProcessedBlockCount;
59
+ onApplicationShutdown(): Promise<void>;
60
+ enqueueBlocks(heights: number[]): void;
61
+ flushQueue(height: number): void;
62
+ private enqueueBlock;
63
+ sampleWorkerStatus(): Promise<void>;
64
+ get queueSize(): number;
65
+ get freeSize(): number;
66
+ get latestBufferedHeight(): number;
67
+ set latestBufferedHeight(height: number);
68
+ private getNextWorkerIndex;
69
+ }