@subql/node-algorand 3.14.4 → 3.15.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 +10 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/algorand/algorand.spec.js +5 -2
- package/dist/algorand/algorand.spec.js.map +1 -1
- package/dist/algorand/api.service.algorand.d.ts +2 -2
- package/dist/algorand/api.service.algorand.js +7 -5
- package/dist/algorand/api.service.algorand.js.map +1 -1
- package/dist/indexer/api.service.spec.js +5 -2
- package/dist/indexer/api.service.spec.js.map +1 -1
- package/dist/indexer/blockDispatcher/block-dispatcher.service.d.ts +2 -2
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js +4 -5
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -1
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.d.ts +4 -3
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +5 -6
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
- package/dist/indexer/fetch.module.js +5 -9
- package/dist/indexer/fetch.module.js.map +1 -1
- package/dist/indexer/fetch.service.d.ts +2 -2
- package/dist/indexer/fetch.service.js +4 -4
- package/dist/indexer/fetch.service.js.map +1 -1
- package/dist/indexer/unfinalizedBlocks.service.d.ts +3 -3
- package/dist/indexer/unfinalizedBlocks.service.js +7 -4
- package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
- package/dist/indexer/worker/worker-fetch.module.js +1 -5
- package/dist/indexer/worker/worker-fetch.module.js.map +1 -1
- package/dist/indexer/worker/worker.service.d.ts +3 -7
- package/dist/indexer/worker/worker.service.js +1 -3
- package/dist/indexer/worker/worker.service.js.map +1 -1
- package/dist/subcommands/reindex.module.js +6 -1
- package/dist/subcommands/reindex.module.js.map +1 -1
- package/dist/subcommands/testing.module.js +11 -2
- package/dist/subcommands/testing.module.js.map +1 -1
- package/dist/subcommands/testing.service.js +0 -1
- package/dist/subcommands/testing.service.js.map +1 -1
- package/package.json +4 -4
|
@@ -37,14 +37,17 @@ const prepareApiService = async (endpoint = mainnetEndpoint, chainId = mainnetCh
|
|
|
37
37
|
node_core_1.NodeConfig,
|
|
38
38
|
node_core_1.ConnectionPoolStateManager,
|
|
39
39
|
node_core_1.ConnectionPoolService,
|
|
40
|
-
|
|
40
|
+
{
|
|
41
|
+
provide: algorand_1.AlgorandApiService,
|
|
42
|
+
useFactory: algorand_1.AlgorandApiService.init,
|
|
43
|
+
inject: ['ISubqueryProject', node_core_1.ConnectionPoolService, event_emitter_1.EventEmitter2],
|
|
44
|
+
},
|
|
41
45
|
],
|
|
42
46
|
imports: [event_emitter_1.EventEmitterModule.forRoot()],
|
|
43
47
|
}).compile();
|
|
44
48
|
const app = module.createNestApplication();
|
|
45
49
|
await app.init();
|
|
46
50
|
const apiService = app.get(algorand_1.AlgorandApiService);
|
|
47
|
-
await apiService.init();
|
|
48
51
|
return [app, apiService];
|
|
49
52
|
};
|
|
50
53
|
exports.prepareApiService = prepareApiService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"algorand.spec.js","sourceRoot":"","sources":["../../src/algorand/algorand.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAGnC,
|
|
1
|
+
{"version":3,"file":"algorand.spec.js","sourceRoot":"","sources":["../../src/algorand/algorand.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { INestApplication } from '@nestjs/common';\nimport { EventEmitter2, EventEmitterModule } from '@nestjs/event-emitter';\nimport { Test } from '@nestjs/testing';\nimport {\n ApiService,\n ConnectionPoolService,\n ConnectionPoolStateManager,\n NodeConfig,\n} from '@subql/node-core';\nimport { GraphQLSchema } from 'graphql';\nimport { AlgorandApiService, filterTransaction } from '../algorand';\nimport { SubqueryProject } from '../configure/SubqueryProject';\n\nconst mainnetEndpoint = 'https://mainnet-idx.algonode.cloud/';\nconst testnetEndpoint = 'https://testnet-idx.algonode.cloud';\n\nconst mainnetChainId = 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=';\nconst testnetChainId = 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=';\n\nfunction testSubqueryProject(endpoint: string, chainId): SubqueryProject {\n return {\n network: {\n chainId,\n endpoint: [endpoint],\n dictionary: `https://api.subquery.network/sq/subquery/Algorand-Dictionary`,\n },\n dataSources: [],\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: [],\n } as any;\n}\n\n// eslint-disable-next-line jest/no-export\nexport const prepareApiService = async (\n endpoint: string = mainnetEndpoint,\n chainId: string = mainnetChainId,\n): Promise<[INestApplication, AlgorandApiService]> => {\n const module = await Test.createTestingModule({\n providers: [\n {\n provide: 'ISubqueryProject',\n useFactory: () => testSubqueryProject(endpoint, chainId),\n },\n NodeConfig,\n ConnectionPoolStateManager,\n ConnectionPoolService,\n {\n provide: AlgorandApiService,\n useFactory: AlgorandApiService.init,\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n ],\n imports: [EventEmitterModule.forRoot()],\n }).compile();\n\n const app = module.createNestApplication();\n await app.init();\n const apiService = app.get(AlgorandApiService);\n\n return [app, apiService];\n};\n\njest.setTimeout(90000);\ndescribe('Algorand RPC', () => {\n let app: INestApplication;\n let apiService: ApiService;\n\n afterEach(() => {\n return app?.close();\n });\n\n it('Can filter acfg with sender', () => {\n const tx = {\n assetConfigTransaction: {\n assetId: 0,\n params: {\n clawback:\n '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n creator: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n decimals: 0,\n defaultFrozen: false,\n freeze: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n manager: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n name: 'flowTest.algo',\n nameB64: 'Zmxvd1Rlc3QuYWxnbw==',\n reserve: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n total: 1,\n unitName: 'xAns',\n unitNameB64: 'eEFucw==',\n url: 'https://xgov.app',\n urlB64: 'aHR0cHM6Ly94Z292LmFwcA==',\n },\n },\n closeRewards: 0,\n closingAmount: 0,\n confirmedRound: 27081666,\n createdAssetIndex: 154583116,\n fee: 1000,\n firstValid: 27081664,\n genesisHash: 'SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI=',\n genesisId: 'testnet-v1.0',\n id: '5CUFVHAA7XZFZDRXO5J2Q26O6O4KB6DHSOB54P5LO3S57S2JF5NA',\n intraRoundOffset: 12,\n lastValid: 27082664,\n receiverRewards: 0,\n roundTime: 1674020229,\n sender: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n senderRewards: 0,\n signature: {\n sig: 'rawhKc26WQe98vKweozDOJmH32c60fI83ddi5kwXg2BYu8EJCh0V3dlzRkOcY/4C3Gh7Bkzi12Yte9EejE1QBw==',\n },\n txType: 'acfg',\n };\n\n expect(\n filterTransaction(tx as any, {\n txType: 'acfg',\n sender: '7JMGBIDKQRR4MC3DNC73QU4QUNNN43VNY5RYPN2FRWEG6NXAHQMCPD4BIQ',\n }),\n ).toBe(true);\n });\n\n // This is failing since switching from algo explorer api. This is due to a node configuration limit\n it('paginate large blocks', async () => {\n [app, apiService] = await prepareApiService(\n testnetEndpoint,\n testnetChainId,\n );\n const failingBlock = 27739202; // testnet\n const api = apiService.api;\n\n const paginateSpy = jest.spyOn(api, 'paginatedTransactions');\n const result = await api.getBlockByHeight(failingBlock);\n expect(paginateSpy).toHaveBeenCalledTimes(3);\n expect(result.transactions.length).toEqual(13916);\n });\n\n it('can stringify blocks and transactions with circular references', async () => {\n [app, apiService] = await prepareApiService();\n\n const block = await apiService.api.getBlockByHeight(30478896);\n\n // The circular ref\n expect(block.transactions[13].block).toBeDefined();\n\n // We can stringify the objects\n expect(() => JSON.stringify(block)).not.toThrow();\n expect(() => JSON.stringify(block.transactions[13])).not.toThrow();\n\n expect(JSON.parse(JSON.stringify(block)).round).toEqual(block.round);\n });\n\n it('can get the grouped transactions within a block', async () => {\n [app, apiService] = await prepareApiService();\n\n const block = await apiService.api.getBlockByHeight(30478896);\n\n const groupTx = block.getTransactionsByGroup(block.transactions[13].group);\n\n expect(groupTx.length).toEqual(3);\n });\n});\n"]}
|
|
@@ -7,8 +7,8 @@ import { AlgorandApi, SafeAPIService } from './api.algorand';
|
|
|
7
7
|
import { AlgorandApiConnection } from './api.connection';
|
|
8
8
|
export declare class AlgorandApiService extends ApiService<AlgorandApi, SafeAPIService, IBlock<BlockContent>[]> {
|
|
9
9
|
private project;
|
|
10
|
-
constructor(
|
|
11
|
-
init(): Promise<AlgorandApiService>;
|
|
10
|
+
private constructor();
|
|
11
|
+
static init(project: SubqueryProject, connectionPoolService: ConnectionPoolService<AlgorandApiConnection>, eventEmitter: EventEmitter2): Promise<AlgorandApiService>;
|
|
12
12
|
get api(): AlgorandApi;
|
|
13
13
|
fetchBlockBatches(api: AlgorandApi, blocks: number[]): Promise<IBlock<BlockContent>[]>;
|
|
14
14
|
protected assertChainId(network: ProjectNetworkConfig & {
|
|
@@ -13,6 +13,7 @@ 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 AlgorandApiService_1;
|
|
16
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
18
|
exports.AlgorandApiService = void 0;
|
|
18
19
|
const common_1 = require("@nestjs/common");
|
|
@@ -20,20 +21,21 @@ const event_emitter_1 = require("@nestjs/event-emitter");
|
|
|
20
21
|
const node_core_1 = require("@subql/node-core");
|
|
21
22
|
const api_connection_1 = require("./api.connection");
|
|
22
23
|
const logger = (0, node_core_1.getLogger)('api');
|
|
23
|
-
let AlgorandApiService = class AlgorandApiService extends node_core_1.ApiService {
|
|
24
|
+
let AlgorandApiService = AlgorandApiService_1 = class AlgorandApiService extends node_core_1.ApiService {
|
|
24
25
|
project;
|
|
25
26
|
constructor(project, connectionPoolService, eventEmitter) {
|
|
26
27
|
super(connectionPoolService, eventEmitter);
|
|
27
28
|
this.project = project;
|
|
28
29
|
}
|
|
29
|
-
async init() {
|
|
30
|
+
static async init(project, connectionPoolService, eventEmitter) {
|
|
31
|
+
const apiService = new AlgorandApiService_1(project, connectionPoolService, eventEmitter);
|
|
30
32
|
try {
|
|
31
|
-
await
|
|
33
|
+
await apiService.createConnections(apiService.project.network, (endpoint, config) => api_connection_1.AlgorandApiConnection.create(endpoint, config, apiService.fetchBlockBatches));
|
|
32
34
|
}
|
|
33
35
|
catch (e) {
|
|
34
36
|
(0, node_core_1.exitWithError)(new Error(`Failed to init api`, { cause: e }), logger);
|
|
35
37
|
}
|
|
36
|
-
return
|
|
38
|
+
return apiService;
|
|
37
39
|
}
|
|
38
40
|
get api() {
|
|
39
41
|
return this.unsafeApi;
|
|
@@ -47,7 +49,7 @@ let AlgorandApiService = class AlgorandApiService extends node_core_1.ApiService
|
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
51
|
};
|
|
50
|
-
AlgorandApiService = __decorate([
|
|
52
|
+
AlgorandApiService = AlgorandApiService_1 = __decorate([
|
|
51
53
|
(0, common_1.Injectable)(),
|
|
52
54
|
__param(0, (0, common_1.Inject)('ISubqueryProject')),
|
|
53
55
|
__metadata("design:paramtypes", [Object, node_core_1.ConnectionPoolService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.algorand.js","sourceRoot":"","sources":["../../src/algorand/api.service.algorand.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC
|
|
1
|
+
{"version":3,"file":"api.service.algorand.js","sourceRoot":"","sources":["../../src/algorand/api.service.algorand.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,gDAO0B;AAK1B,qDAAyD;AAEzD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,KAAK,CAAC,CAAC;AAGzB,IAAM,kBAAkB,0BAAxB,MAAM,kBAAmB,SAAQ,sBAIvC;IAEuC;IADtC,YACsC,OAAwB,EAC5D,qBAAmE,EACnE,YAA2B;QAE3B,KAAK,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;QAJP,YAAO,GAAP,OAAO,CAAiB;IAK9D,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,OAAwB,EACxB,qBAAmE,EACnE,YAA2B;QAE3B,MAAM,UAAU,GAAG,IAAI,oBAAkB,CACvC,OAAO,EACP,qBAAqB,EACrB,YAAY,CACb,CAAC;QACF,IAAI;YACF,MAAM,UAAU,CAAC,iBAAiB,CAChC,UAAU,CAAC,OAAO,CAAC,OAAO,EAC1B,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CACnB,sCAAqB,CAAC,MAAM,CAC1B,QAAQ,EACR,MAAM,EACN,UAAU,CAAC,iBAAiB,CAC7B,CACJ,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACV,IAAA,yBAAa,EAAC,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;SACtE;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,GAAgB,EAChB,MAAgB;QAEhB,OAAO,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAES,aAAa,CACrB,OAAmD,EACnD,UAAiC;QAEjC,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC,WAAW,CAAC,WAAW,EAAE;YAC1D,MAAM,IAAI,iCAAqB,CAC7B,SAAS,EACT,OAAO,CAAC,OAAO,EACf,UAAU,CAAC,WAAW,CAAC,WAAW,CACnC,CAAC;SACH;IACH,CAAC;CACF,CAAA;AA/DY,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;6CACJ,iCAAqB;QAC9B,6BAAa;GARlB,kBAAkB,CA+D9B;AA/DY,gDAAkB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiService,\n ConnectionPoolService,\n getLogger,\n IBlock,\n MetadataMismatchError,\n exitWithError,\n} from '@subql/node-core';\nimport { ProjectNetworkConfig } from '@subql/types-core';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { BlockContent } from '../indexer/types';\nimport { AlgorandApi, SafeAPIService } from './api.algorand';\nimport { AlgorandApiConnection } from './api.connection';\n\nconst logger = getLogger('api');\n\n@Injectable()\nexport class AlgorandApiService extends ApiService<\n AlgorandApi,\n SafeAPIService,\n IBlock<BlockContent>[]\n> {\n private constructor(\n @Inject('ISubqueryProject') private project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<AlgorandApiConnection>,\n eventEmitter: EventEmitter2,\n ) {\n super(connectionPoolService, eventEmitter);\n }\n\n static async init(\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<AlgorandApiConnection>,\n eventEmitter: EventEmitter2,\n ): Promise<AlgorandApiService> {\n const apiService = new AlgorandApiService(\n project,\n connectionPoolService,\n eventEmitter,\n );\n try {\n await apiService.createConnections(\n apiService.project.network,\n (endpoint, config) =>\n AlgorandApiConnection.create(\n endpoint,\n config,\n apiService.fetchBlockBatches,\n ),\n );\n } catch (e) {\n exitWithError(new Error(`Failed to init api`, { cause: e }), logger);\n }\n\n return apiService;\n }\n\n get api(): AlgorandApi {\n return this.unsafeApi;\n }\n\n async fetchBlockBatches(\n api: AlgorandApi,\n blocks: number[],\n ): Promise<IBlock<BlockContent>[]> {\n return api.fetchBlocks(blocks);\n }\n\n protected assertChainId(\n network: ProjectNetworkConfig & { chainId: string },\n connection: AlgorandApiConnection,\n ): void {\n if (network.chainId !== connection.networkMeta.genesisHash) {\n throw new MetadataMismatchError(\n 'ChainId',\n network.chainId,\n connection.networkMeta.genesisHash,\n );\n }\n }\n}\n"]}
|
|
@@ -38,14 +38,17 @@ describe('ApiService', () => {
|
|
|
38
38
|
node_core_1.ConnectionPoolStateManager,
|
|
39
39
|
node_core_1.ConnectionPoolService,
|
|
40
40
|
node_core_1.NodeConfig,
|
|
41
|
-
|
|
41
|
+
{
|
|
42
|
+
provide: algorand_1.AlgorandApiService,
|
|
43
|
+
useFactory: algorand_1.AlgorandApiService.init,
|
|
44
|
+
inject: ['ISubqueryProject', node_core_1.ConnectionPoolService, event_emitter_1.EventEmitter2],
|
|
45
|
+
},
|
|
42
46
|
],
|
|
43
47
|
imports: [event_emitter_1.EventEmitterModule.forRoot()],
|
|
44
48
|
}).compile();
|
|
45
49
|
app = module.createNestApplication();
|
|
46
50
|
await app.init();
|
|
47
51
|
const apiService = app.get(algorand_1.AlgorandApiService);
|
|
48
|
-
await apiService.init();
|
|
49
52
|
return apiService;
|
|
50
53
|
};
|
|
51
54
|
it('can fetch block with hash', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.spec.js","sourceRoot":"","sources":["../../src/indexer/api.service.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAGnC,
|
|
1
|
+
{"version":3,"file":"api.service.spec.js","sourceRoot":"","sources":["../../src/indexer/api.service.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { INestApplication } from '@nestjs/common';\nimport { EventEmitter2, EventEmitterModule } from '@nestjs/event-emitter';\nimport { Test } from '@nestjs/testing';\nimport {\n ConnectionPoolService,\n ConnectionPoolStateManager,\n NodeConfig,\n} from '@subql/node-core';\nimport { GraphQLSchema } from 'graphql';\nimport { AlgorandApiService } from '../algorand';\nimport { SubqueryProject } from '../configure/SubqueryProject';\n\nconst ENDPOINT = 'https://mainnet-idx.algonode.cloud/';\n\nfunction testSubqueryProject(endpoint: string): SubqueryProject {\n return {\n network: {\n endpoint: [endpoint],\n dictionary: `https://api.subquery.network/sq/subquery/Algorand-Dictionary`,\n chainId: 'wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=',\n },\n dataSources: [],\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: [],\n } as any;\n}\n\njest.setTimeout(90000);\ndescribe('ApiService', () => {\n let app: INestApplication;\n\n afterEach(() => {\n return app?.close();\n });\n\n const prepareApiService = async (\n endpoint: string = ENDPOINT,\n ): Promise<AlgorandApiService> => {\n const module = await Test.createTestingModule({\n providers: [\n {\n provide: 'ISubqueryProject',\n useFactory: () => testSubqueryProject(endpoint),\n },\n ConnectionPoolStateManager,\n ConnectionPoolService,\n NodeConfig,\n {\n provide: AlgorandApiService,\n useFactory: AlgorandApiService.init,\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n ],\n imports: [EventEmitterModule.forRoot()],\n }).compile();\n\n app = module.createNestApplication();\n await app.init();\n const apiService = app.get(AlgorandApiService);\n\n return apiService;\n };\n\n it('can fetch block with hash', async () => {\n const apiService = await prepareApiService();\n\n const block = (await apiService.api.fetchBlocks([50000]))[0];\n\n expect(block.block.hash).toEqual(\n 'Gss169f22yVUBJzbNT9qXtQukjh0tgecvapaQY5NIRg=',\n );\n });\n\n it('waits on pending block to fetch hash', async () => {\n const apiService = await prepareApiService();\n const api = apiService.api;\n\n const checkHealth = await api.api.makeHealthCheck().do();\n const currentRound = checkHealth.round;\n\n const fetchLatestBlock = async () =>\n (await apiService.api.fetchBlocks([currentRound]))[0];\n\n expect(fetchLatestBlock).not.toThrow();\n\n const block = await fetchLatestBlock();\n expect(block.block.hash).toBeDefined();\n });\n});\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OnApplicationShutdown } from '@nestjs/common';
|
|
2
2
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
3
|
-
import { NodeConfig,
|
|
3
|
+
import { NodeConfig, IStoreModelProvider, StoreService, IProjectService, PoiSyncService, BlockDispatcher, ProcessBlockResponse, IProjectUpgradeService, IBlock } from '@subql/node-core';
|
|
4
4
|
import { AlgorandBlock, AlgorandDataSource } from '@subql/types-algorand';
|
|
5
5
|
import { AlgorandApiService } from '../../algorand';
|
|
6
6
|
import { SubqueryProject } from '../../configure/SubqueryProject';
|
|
@@ -10,7 +10,7 @@ import { IndexerManager } from '../indexer.manager';
|
|
|
10
10
|
*/
|
|
11
11
|
export declare class BlockDispatcherService extends BlockDispatcher<AlgorandBlock, AlgorandDataSource> implements OnApplicationShutdown {
|
|
12
12
|
private indexerManager;
|
|
13
|
-
constructor(apiService: AlgorandApiService, nodeConfig: NodeConfig, indexerManager: IndexerManager, eventEmitter: EventEmitter2, projectService: IProjectService<AlgorandDataSource>, projectUpgradeService: IProjectUpgradeService, storeService: StoreService,
|
|
13
|
+
constructor(apiService: AlgorandApiService, nodeConfig: NodeConfig, indexerManager: IndexerManager, eventEmitter: EventEmitter2, projectService: IProjectService<AlgorandDataSource>, projectUpgradeService: IProjectUpgradeService, storeService: StoreService, storeModelProvider: IStoreModelProvider, poiSyncService: PoiSyncService, project: SubqueryProject);
|
|
14
14
|
protected getBlockHeight(block: AlgorandBlock): number;
|
|
15
15
|
protected indexBlock(block: IBlock<AlgorandBlock>): Promise<ProcessBlockResponse>;
|
|
16
16
|
}
|
|
@@ -25,8 +25,8 @@ const indexer_manager_1 = require("../indexer.manager");
|
|
|
25
25
|
*/
|
|
26
26
|
let BlockDispatcherService = class BlockDispatcherService extends node_core_1.BlockDispatcher {
|
|
27
27
|
indexerManager;
|
|
28
|
-
constructor(apiService, nodeConfig, indexerManager, eventEmitter, projectService, projectUpgradeService, storeService,
|
|
29
|
-
super(nodeConfig, eventEmitter, projectService, projectUpgradeService, storeService,
|
|
28
|
+
constructor(apiService, nodeConfig, indexerManager, eventEmitter, projectService, projectUpgradeService, storeService, storeModelProvider, poiSyncService, project) {
|
|
29
|
+
super(nodeConfig, eventEmitter, projectService, projectUpgradeService, storeService, storeModelProvider, poiSyncService, project, apiService.fetchBlocks.bind(apiService));
|
|
30
30
|
this.indexerManager = indexerManager;
|
|
31
31
|
}
|
|
32
32
|
getBlockHeight(block) {
|
|
@@ -40,13 +40,12 @@ BlockDispatcherService = __decorate([
|
|
|
40
40
|
(0, common_1.Injectable)(),
|
|
41
41
|
__param(4, (0, common_1.Inject)('IProjectService')),
|
|
42
42
|
__param(5, (0, common_1.Inject)('IProjectUpgradeService')),
|
|
43
|
+
__param(7, (0, common_1.Inject)('IStoreModelProvider')),
|
|
43
44
|
__param(9, (0, common_1.Inject)('ISubqueryProject')),
|
|
44
45
|
__metadata("design:paramtypes", [algorand_1.AlgorandApiService,
|
|
45
46
|
node_core_1.NodeConfig,
|
|
46
47
|
indexer_manager_1.IndexerManager,
|
|
47
|
-
event_emitter_1.EventEmitter2, Object, Object, node_core_1.StoreService,
|
|
48
|
-
node_core_1.StoreCacheService,
|
|
49
|
-
node_core_1.PoiSyncService, Object])
|
|
48
|
+
event_emitter_1.EventEmitter2, Object, Object, node_core_1.StoreService, Object, node_core_1.PoiSyncService, Object])
|
|
50
49
|
], BlockDispatcherService);
|
|
51
50
|
exports.BlockDispatcherService = BlockDispatcherService;
|
|
52
51
|
//# sourceMappingURL=block-dispatcher.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/block-dispatcher.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAA2E;AAC3E,yDAAsD;AACtD,gDAU0B;AAE1B,6CAAoD;AAEpD,wDAAoD;AAEpD;;GAEG;AAEI,IAAM,sBAAsB,GAA5B,MAAM,sBACX,SAAQ,2BAAkD;IAMhD;IAHV,YACE,UAA8B,EAC9B,UAAsB,EACd,cAA8B,EACtC,YAA2B,EAE3B,cAAmD,EAEnD,qBAA6C,EAC7C,YAA0B,
|
|
1
|
+
{"version":3,"file":"block-dispatcher.service.js","sourceRoot":"","sources":["../../../src/indexer/blockDispatcher/block-dispatcher.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAA2E;AAC3E,yDAAsD;AACtD,gDAU0B;AAE1B,6CAAoD;AAEpD,wDAAoD;AAEpD;;GAEG;AAEI,IAAM,sBAAsB,GAA5B,MAAM,sBACX,SAAQ,2BAAkD;IAMhD;IAHV,YACE,UAA8B,EAC9B,UAAsB,EACd,cAA8B,EACtC,YAA2B,EAE3B,cAAmD,EAEnD,qBAA6C,EAC7C,YAA0B,EACK,kBAAuC,EACtE,cAA8B,EACF,OAAwB;QAEpD,KAAK,CACH,UAAU,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CACxC,CAAC;QArBM,mBAAc,GAAd,cAAc,CAAgB;IAsBxC,CAAC;IAES,cAAc,CAAC,KAAoB;QAC3C,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAES,KAAK,CAAC,UAAU,CACxB,KAA4B;QAE5B,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CACnC,KAAK,EACL,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CACxE,CAAC;IACJ,CAAC;CACF,CAAA;AA3CY,sBAAsB;IADlC,IAAA,mBAAU,GAAE;IAUR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IAEzB,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAGhC,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;IAE7B,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAXf,6BAAkB;QAClB,sBAAU;QACE,gCAAc;QACxB,6BAAa,kBAKb,wBAAY,UAEV,0BAAc;GAfrB,sBAAsB,CA2ClC;AA3CY,wDAAsB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable, OnApplicationShutdown } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n NodeConfig,\n IStoreModelProvider,\n StoreService,\n IProjectService,\n PoiSyncService,\n BlockDispatcher,\n ProcessBlockResponse,\n IProjectUpgradeService,\n IBlock,\n} from '@subql/node-core';\nimport { AlgorandBlock, AlgorandDataSource } from '@subql/types-algorand';\nimport { AlgorandApiService } from '../../algorand';\nimport { SubqueryProject } from '../../configure/SubqueryProject';\nimport { IndexerManager } from '../indexer.manager';\n\n/**\n * @description Intended to behave the same as WorkerBlockDispatcherService but doesn't use worker threads or any parallel processing\n */\n@Injectable()\nexport class BlockDispatcherService\n extends BlockDispatcher<AlgorandBlock, AlgorandDataSource>\n implements OnApplicationShutdown\n{\n constructor(\n apiService: AlgorandApiService,\n nodeConfig: NodeConfig,\n private indexerManager: IndexerManager,\n eventEmitter: EventEmitter2,\n @Inject('IProjectService')\n projectService: IProjectService<AlgorandDataSource>,\n @Inject('IProjectUpgradeService')\n projectUpgradeService: IProjectUpgradeService,\n storeService: StoreService,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n poiSyncService: PoiSyncService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n ) {\n super(\n nodeConfig,\n eventEmitter,\n projectService,\n projectUpgradeService,\n storeService,\n storeModelProvider,\n poiSyncService,\n project,\n apiService.fetchBlocks.bind(apiService),\n );\n }\n\n protected getBlockHeight(block: AlgorandBlock): number {\n return block.round;\n }\n\n protected async indexBlock(\n block: IBlock<AlgorandBlock>,\n ): Promise<ProcessBlockResponse> {\n return this.indexerManager.indexBlock(\n block,\n await this.projectService.getDataSources(block.getHeader().blockHeight),\n );\n }\n}\n"]}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { OnApplicationShutdown } from '@nestjs/common';
|
|
2
2
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
3
|
-
import { NodeConfig, StoreService, PoiSyncService,
|
|
3
|
+
import { NodeConfig, StoreService, PoiSyncService, IProjectService, WorkerBlockDispatcher, ConnectionPoolStateManager, IProjectUpgradeService, InMemoryCacheService, MonitorServiceInterface, IStoreModelProvider } from '@subql/node-core';
|
|
4
4
|
import { AlgorandBlock, AlgorandDataSource } from '@subql/types-algorand';
|
|
5
5
|
import { AlgorandApiConnection } from '../../algorand';
|
|
6
6
|
import { SubqueryProject } from '../../configure/SubqueryProject';
|
|
7
7
|
import { DynamicDsService } from '../dynamic-ds.service';
|
|
8
8
|
import { UnfinalizedBlocksService } from '../unfinalizedBlocks.service';
|
|
9
9
|
import { IIndexerWorker } from '../worker/worker';
|
|
10
|
+
import { FetchBlockResponse } from '../worker/worker.service';
|
|
10
11
|
type IndexerWorker = IIndexerWorker & {
|
|
11
12
|
terminate: () => Promise<number>;
|
|
12
13
|
};
|
|
13
14
|
export declare class WorkerBlockDispatcherService extends WorkerBlockDispatcher<AlgorandDataSource, IndexerWorker, AlgorandBlock> implements OnApplicationShutdown {
|
|
14
|
-
constructor(nodeConfig: NodeConfig, eventEmitter: EventEmitter2, projectService: IProjectService<AlgorandDataSource>, projectUpgadeService: IProjectUpgradeService, cacheService: InMemoryCacheService, storeService: StoreService,
|
|
15
|
-
protected fetchBlock(worker: IndexerWorker, height: number): Promise<
|
|
15
|
+
constructor(nodeConfig: NodeConfig, eventEmitter: EventEmitter2, projectService: IProjectService<AlgorandDataSource>, projectUpgadeService: IProjectUpgradeService, cacheService: InMemoryCacheService, storeService: StoreService, storeModelProvider: IStoreModelProvider, poiSyncService: PoiSyncService, project: SubqueryProject, dynamicDsService: DynamicDsService, unfinalizedBlocksService: UnfinalizedBlocksService, connectionPoolState: ConnectionPoolStateManager<AlgorandApiConnection>, monitorService?: MonitorServiceInterface);
|
|
16
|
+
protected fetchBlock(worker: IndexerWorker, height: number): Promise<FetchBlockResponse>;
|
|
16
17
|
}
|
|
17
18
|
export {};
|
|
@@ -25,23 +25,22 @@ const node_core_1 = require("@subql/node-core");
|
|
|
25
25
|
const dynamic_ds_service_1 = require("../dynamic-ds.service");
|
|
26
26
|
const unfinalizedBlocks_service_1 = require("../unfinalizedBlocks.service");
|
|
27
27
|
let WorkerBlockDispatcherService = class WorkerBlockDispatcherService extends node_core_1.WorkerBlockDispatcher {
|
|
28
|
-
constructor(nodeConfig, eventEmitter, projectService, projectUpgadeService, cacheService, storeService,
|
|
29
|
-
super(nodeConfig, eventEmitter, projectService, projectUpgadeService, storeService,
|
|
28
|
+
constructor(nodeConfig, eventEmitter, projectService, projectUpgadeService, cacheService, storeService, storeModelProvider, poiSyncService, project, dynamicDsService, unfinalizedBlocksService, connectionPoolState, monitorService) {
|
|
29
|
+
super(nodeConfig, eventEmitter, projectService, projectUpgadeService, storeService, storeModelProvider, poiSyncService, project, () => (0, node_core_1.createIndexerWorker)(path_1.default.resolve(__dirname, '../../../dist/indexer/worker/worker.js'), [], storeService.getStore(), cacheService.getCache(), dynamicDsService, unfinalizedBlocksService, connectionPoolState, project.root, projectService.startHeight, monitorService), monitorService);
|
|
30
30
|
}
|
|
31
31
|
async fetchBlock(worker, height) {
|
|
32
|
-
|
|
32
|
+
return worker.fetchBlock(height, 0 /* Unused with algorand */);
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
35
|
WorkerBlockDispatcherService = __decorate([
|
|
36
36
|
(0, common_1.Injectable)(),
|
|
37
37
|
__param(2, (0, common_1.Inject)('IProjectService')),
|
|
38
38
|
__param(3, (0, common_1.Inject)('IProjectUpgradeService')),
|
|
39
|
+
__param(6, (0, common_1.Inject)('IStoreModelProvider')),
|
|
39
40
|
__param(8, (0, common_1.Inject)('ISubqueryProject')),
|
|
40
41
|
__metadata("design:paramtypes", [node_core_1.NodeConfig,
|
|
41
42
|
event_emitter_1.EventEmitter2, Object, Object, node_core_1.InMemoryCacheService,
|
|
42
|
-
node_core_1.StoreService,
|
|
43
|
-
node_core_1.StoreCacheService,
|
|
44
|
-
node_core_1.PoiSyncService, Object, dynamic_ds_service_1.DynamicDsService,
|
|
43
|
+
node_core_1.StoreService, Object, node_core_1.PoiSyncService, Object, dynamic_ds_service_1.DynamicDsService,
|
|
45
44
|
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
46
45
|
node_core_1.ConnectionPoolStateManager, Object])
|
|
47
46
|
], WorkerBlockDispatcherService);
|
|
@@ -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,gDAY0B;AAI1B,8DAAyD;AAEzD,4EAAwE;
|
|
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,gDAY0B;AAI1B,8DAAyD;AAEzD,4EAAwE;AASjE,IAAM,4BAA4B,GAAlC,MAAM,4BACX,SAAQ,iCAIP;IAGD,YACE,UAAsB,EACtB,YAA2B,EAE3B,cAAmD,EAEnD,oBAA4C,EAC5C,YAAkC,EAClC,YAA0B,EACK,kBAAuC,EACtE,cAA8B,EACF,OAAwB,EACpD,gBAAkC,EAClC,wBAAkD,EAClD,mBAAsE,EACtE,cAAwC;QAExC,KAAK,CACH,UAAU,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,GAAG,EAAE,CACH,IAAA,+BAAmB,EAMjB,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,wCAAwC,CAAC,EACjE,EAAE,EACF,YAAY,CAAC,QAAQ,EAAE,EACvB,YAAY,CAAC,QAAQ,EAAE,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,OAAO,CAAC,IAAI,EACZ,cAAc,CAAC,WAAW,EAC1B,cAAc,CACf,EACH,cAAc,CACf,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,UAAU,CACxB,MAAqB,EACrB,MAAc;QAEd,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACjE,CAAC;CACF,CAAA;AA9DY,4BAA4B;IADxC,IAAA,mBAAU,GAAE;IAYR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IAEzB,WAAA,IAAA,eAAM,EAAC,wBAAwB,CAAC,CAAA;IAIhC,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;IAE7B,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;qCAVf,sBAAU;QACR,6BAAa,kBAKb,gCAAoB;QACpB,wBAAY,UAEV,0BAAc,UAEZ,qCAAgB;QACR,oDAAwB;QAC7B,sCAA0B;GAtBtC,4BAA4B,CA8DxC;AA9DY,oEAA4B","sourcesContent":["// Copyright 2020-2024 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 NodeConfig,\n StoreService,\n PoiSyncService,\n IProjectService,\n WorkerBlockDispatcher,\n ConnectionPoolStateManager,\n IProjectUpgradeService,\n InMemoryCacheService,\n createIndexerWorker,\n MonitorServiceInterface,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport { AlgorandBlock, AlgorandDataSource } from '@subql/types-algorand';\nimport { AlgorandApiConnection } from '../../algorand';\nimport { SubqueryProject } from '../../configure/SubqueryProject';\nimport { DynamicDsService } from '../dynamic-ds.service';\nimport { BlockContent } from '../types';\nimport { UnfinalizedBlocksService } from '../unfinalizedBlocks.service';\nimport { IIndexerWorker } from '../worker/worker';\nimport { FetchBlockResponse } from '../worker/worker.service';\n\ntype IndexerWorker = IIndexerWorker & {\n terminate: () => Promise<number>;\n};\n\n@Injectable()\nexport class WorkerBlockDispatcherService\n extends WorkerBlockDispatcher<\n AlgorandDataSource,\n IndexerWorker,\n AlgorandBlock\n >\n implements OnApplicationShutdown\n{\n constructor(\n nodeConfig: NodeConfig,\n eventEmitter: EventEmitter2,\n @Inject('IProjectService')\n projectService: IProjectService<AlgorandDataSource>,\n @Inject('IProjectUpgradeService')\n projectUpgadeService: IProjectUpgradeService,\n cacheService: InMemoryCacheService,\n storeService: StoreService,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n poiSyncService: PoiSyncService,\n @Inject('ISubqueryProject') project: SubqueryProject,\n dynamicDsService: DynamicDsService,\n unfinalizedBlocksService: UnfinalizedBlocksService,\n connectionPoolState: ConnectionPoolStateManager<AlgorandApiConnection>,\n monitorService?: MonitorServiceInterface,\n ) {\n super(\n nodeConfig,\n eventEmitter,\n projectService,\n projectUpgadeService,\n storeService,\n storeModelProvider,\n poiSyncService,\n project,\n () =>\n createIndexerWorker<\n IIndexerWorker,\n AlgorandApiConnection,\n BlockContent,\n AlgorandDataSource\n >(\n path.resolve(__dirname, '../../../dist/indexer/worker/worker.js'),\n [],\n storeService.getStore(),\n cacheService.getCache(),\n dynamicDsService,\n unfinalizedBlocksService,\n connectionPoolState,\n project.root,\n projectService.startHeight,\n monitorService,\n ),\n monitorService,\n );\n }\n\n protected async fetchBlock(\n worker: IndexerWorker,\n height: number,\n ): Promise<FetchBlockResponse> {\n return worker.fetchBlock(height, 0 /* Unused with algorand */);\n }\n}\n"]}
|
|
@@ -30,19 +30,15 @@ FetchModule = __decorate([
|
|
|
30
30
|
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
31
31
|
{
|
|
32
32
|
provide: algorand_1.AlgorandApiService,
|
|
33
|
-
useFactory:
|
|
34
|
-
const apiService = new algorand_1.AlgorandApiService(project, connectionPoolService, eventEmitter);
|
|
35
|
-
await apiService.init();
|
|
36
|
-
return apiService;
|
|
37
|
-
},
|
|
33
|
+
useFactory: algorand_1.AlgorandApiService.init,
|
|
38
34
|
inject: ['ISubqueryProject', node_core_1.ConnectionPoolService, event_emitter_1.EventEmitter2],
|
|
39
35
|
},
|
|
40
36
|
indexer_manager_1.IndexerManager,
|
|
41
37
|
{
|
|
42
38
|
provide: 'IBlockDispatcher',
|
|
43
|
-
useFactory: (nodeConfig, eventEmitter, projectService, projectUpgradeService, apiService, indexerManager, cacheService, storeService,
|
|
44
|
-
? new blockDispatcher_1.WorkerBlockDispatcherService(nodeConfig, eventEmitter, projectService, projectUpgradeService, cacheService, storeService,
|
|
45
|
-
: new blockDispatcher_1.BlockDispatcherService(apiService, nodeConfig, indexerManager, eventEmitter, projectService, projectUpgradeService, storeService,
|
|
39
|
+
useFactory: (nodeConfig, eventEmitter, projectService, projectUpgradeService, apiService, indexerManager, cacheService, storeService, storeModelProvider, poiSyncService, project, dynamicDsService, unfinalizedBlocksService, connectionPoolState, monitorService) => nodeConfig.workers
|
|
40
|
+
? new blockDispatcher_1.WorkerBlockDispatcherService(nodeConfig, eventEmitter, projectService, projectUpgradeService, cacheService, storeService, storeModelProvider, poiSyncService, project, dynamicDsService, unfinalizedBlocksService, connectionPoolState, monitorService)
|
|
41
|
+
: new blockDispatcher_1.BlockDispatcherService(apiService, nodeConfig, indexerManager, eventEmitter, projectService, projectUpgradeService, storeService, storeModelProvider, poiSyncService, project),
|
|
46
42
|
inject: [
|
|
47
43
|
node_core_1.NodeConfig,
|
|
48
44
|
event_emitter_1.EventEmitter2,
|
|
@@ -52,7 +48,7 @@ FetchModule = __decorate([
|
|
|
52
48
|
indexer_manager_1.IndexerManager,
|
|
53
49
|
node_core_1.InMemoryCacheService,
|
|
54
50
|
node_core_1.StoreService,
|
|
55
|
-
|
|
51
|
+
'IStoreModelProvider',
|
|
56
52
|
node_core_1.PoiSyncService,
|
|
57
53
|
'ISubqueryProject',
|
|
58
54
|
dynamic_ds_service_1.DynamicDsService,
|
|
@@ -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,gDAW0B;AAC1B,0CAAwE;AAExE,uDAG2B;AAC3B,6CAAyD;AACzD,iEAA4D;AAC5D,6DAAwD;AACxD,mDAA+C;AAC/C,uDAAmD;AACnD,uDAAmD;AACnD,2EAAuE;
|
|
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,gDAW0B;AAC1B,0CAAwE;AAExE,uDAG2B;AAC3B,6CAAyD;AACzD,iEAA4D;AAC5D,6DAAwD;AACxD,mDAA+C;AAC/C,uDAAmD;AACnD,uDAAmD;AACnD,2EAAuE;AAwFhE,IAAM,WAAW,GAAjB,MAAM,WAAW;CAAG,CAAA;AAAd,WAAW;IAtFvB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,sBAAU,CAAC;QACrB,SAAS,EAAE;YACT,oDAAwB;YACxB;gBACE,OAAO,EAAE,6BAAkB;gBAC3B,UAAU,EAAE,6BAAkB,CAAC,IAAI;gBACnC,MAAM,EAAE,CAAC,kBAAkB,EAAE,iCAAqB,EAAE,6BAAa,CAAC;aACnE;YACD,gCAAc;YACd;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,UAAU,EAAE,CACV,UAAsB,EACtB,YAA2B,EAC3B,cAA8B,EAC9B,qBAA6C,EAC7C,UAA8B,EAC9B,cAA8B,EAC9B,YAAkC,EAClC,YAA0B,EAC1B,kBAAuC,EACvC,cAA8B,EAC9B,OAAwB,EACxB,gBAAkC,EAClC,wBAAkD,EAClD,mBAAsE,EACtE,cAA+B,EAC/B,EAAE,CACF,UAAU,CAAC,OAAO;oBAChB,CAAC,CAAC,IAAI,8CAA4B,CAC9B,UAAU,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,OAAO,EACP,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,cAAc,CACf;oBACH,CAAC,CAAC,IAAI,wCAAsB,CACxB,UAAU,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,OAAO,CACR;gBACP,MAAM,EAAE;oBACN,sBAAU;oBACV,6BAAa;oBACb,iBAAiB;oBACjB,wBAAwB;oBACxB,6BAAkB;oBAClB,gCAAc;oBACd,gCAAoB;oBACpB,wBAAY;oBACZ,qBAAqB;oBACrB,0BAAc;oBACd,kBAAkB;oBAClB,qCAAgB;oBAChB,oDAAwB;oBACxB,sCAA0B;oBAC1B,0BAAc;iBACf;aACF;YACD,4BAAY;YACZ,sCAAyB;YACzB,yCAAkB;YAClB,qCAAgB;YAChB;gBACE,QAAQ,EAAE,gCAAc;gBACxB,OAAO,EAAE,iBAAiB;aAC3B;YACD,0BAAc;SACf;KACF,CAAC;GACW,WAAW,CAAG;AAAd,kCAAW","sourcesContent":["// Copyright 2020-2024 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 StoreService,\n PoiSyncService,\n NodeConfig,\n ConnectionPoolService,\n ConnectionPoolStateManager,\n IProjectUpgradeService,\n InMemoryCacheService,\n MonitorService,\n CoreModule,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport { AlgorandApiConnection, AlgorandApiService } from '../algorand';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport {\n BlockDispatcherService,\n WorkerBlockDispatcherService,\n} from './blockDispatcher';\nimport { AlgorandDictionaryService } from './dictionary';\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 { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\n@Module({\n imports: [CoreModule],\n providers: [\n UnfinalizedBlocksService,\n {\n provide: AlgorandApiService,\n useFactory: AlgorandApiService.init,\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n IndexerManager,\n {\n provide: 'IBlockDispatcher',\n useFactory: (\n nodeConfig: NodeConfig,\n eventEmitter: EventEmitter2,\n projectService: ProjectService,\n projectUpgradeService: IProjectUpgradeService,\n apiService: AlgorandApiService,\n indexerManager: IndexerManager,\n cacheService: InMemoryCacheService,\n storeService: StoreService,\n storeModelProvider: IStoreModelProvider,\n poiSyncService: PoiSyncService,\n project: SubqueryProject,\n dynamicDsService: DynamicDsService,\n unfinalizedBlocksService: UnfinalizedBlocksService,\n connectionPoolState: ConnectionPoolStateManager<AlgorandApiConnection>,\n monitorService?: MonitorService,\n ) =>\n nodeConfig.workers\n ? new WorkerBlockDispatcherService(\n nodeConfig,\n eventEmitter,\n projectService,\n projectUpgradeService,\n cacheService,\n storeService,\n storeModelProvider,\n poiSyncService,\n project,\n dynamicDsService,\n unfinalizedBlocksService,\n connectionPoolState,\n monitorService,\n )\n : new BlockDispatcherService(\n apiService,\n nodeConfig,\n indexerManager,\n eventEmitter,\n projectService,\n projectUpgradeService,\n storeService,\n storeModelProvider,\n poiSyncService,\n project,\n ),\n inject: [\n NodeConfig,\n EventEmitter2,\n 'IProjectService',\n 'IProjectUpgradeService',\n AlgorandApiService,\n IndexerManager,\n InMemoryCacheService,\n StoreService,\n 'IStoreModelProvider',\n PoiSyncService,\n 'ISubqueryProject',\n DynamicDsService,\n UnfinalizedBlocksService,\n ConnectionPoolStateManager,\n MonitorService,\n ],\n },\n FetchService,\n AlgorandDictionaryService,\n DsProcessorService,\n DynamicDsService,\n {\n useClass: ProjectService,\n provide: 'IProjectService',\n },\n MonitorService,\n ],\n})\nexport class FetchModule {}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
2
2
|
import { SchedulerRegistry } from '@nestjs/schedule';
|
|
3
3
|
import { AlgorandDataSource } from '@subql/common-algorand';
|
|
4
|
-
import { NodeConfig, BaseFetchService, Header,
|
|
4
|
+
import { NodeConfig, BaseFetchService, Header, IStoreModelProvider } from '@subql/node-core';
|
|
5
5
|
import { AlgorandBlock } from '@subql/types-algorand';
|
|
6
6
|
import { AlgorandApi, AlgorandApiService } from '../algorand';
|
|
7
7
|
import { IAlgorandBlockDispatcher } from './blockDispatcher';
|
|
@@ -10,7 +10,7 @@ import { ProjectService } from './project.service';
|
|
|
10
10
|
import { UnfinalizedBlocksService } from './unfinalizedBlocks.service';
|
|
11
11
|
export declare class FetchService extends BaseFetchService<AlgorandDataSource, IAlgorandBlockDispatcher, AlgorandBlock> {
|
|
12
12
|
private apiService;
|
|
13
|
-
constructor(apiService: AlgorandApiService, nodeConfig: NodeConfig, projectService: ProjectService, blockDispatcher: IAlgorandBlockDispatcher, dictionaryService: AlgorandDictionaryService, unfinalizedBlocksService: UnfinalizedBlocksService, eventEmitter: EventEmitter2, schedulerRegistry: SchedulerRegistry,
|
|
13
|
+
constructor(apiService: AlgorandApiService, nodeConfig: NodeConfig, projectService: ProjectService, blockDispatcher: IAlgorandBlockDispatcher, dictionaryService: AlgorandDictionaryService, unfinalizedBlocksService: UnfinalizedBlocksService, eventEmitter: EventEmitter2, schedulerRegistry: SchedulerRegistry, storeModelProvider: IStoreModelProvider);
|
|
14
14
|
get api(): AlgorandApi;
|
|
15
15
|
protected getFinalizedHeader(): Promise<Header>;
|
|
16
16
|
protected getBestHeight(): Promise<number>;
|
|
@@ -28,8 +28,8 @@ const BLOCK_TIME_VARIANCE = 5000; //ms
|
|
|
28
28
|
const INTERVAL_PERCENT = 0.9;
|
|
29
29
|
let FetchService = class FetchService extends node_core_1.BaseFetchService {
|
|
30
30
|
apiService;
|
|
31
|
-
constructor(apiService, nodeConfig, projectService, blockDispatcher, dictionaryService, unfinalizedBlocksService, eventEmitter, schedulerRegistry,
|
|
32
|
-
super(nodeConfig, projectService, blockDispatcher, dictionaryService, eventEmitter, schedulerRegistry, unfinalizedBlocksService,
|
|
31
|
+
constructor(apiService, nodeConfig, projectService, blockDispatcher, dictionaryService, unfinalizedBlocksService, eventEmitter, schedulerRegistry, storeModelProvider) {
|
|
32
|
+
super(nodeConfig, projectService, blockDispatcher, dictionaryService, eventEmitter, schedulerRegistry, unfinalizedBlocksService, storeModelProvider);
|
|
33
33
|
this.apiService = apiService;
|
|
34
34
|
}
|
|
35
35
|
get api() {
|
|
@@ -66,13 +66,13 @@ FetchService = __decorate([
|
|
|
66
66
|
(0, common_1.Injectable)(),
|
|
67
67
|
__param(2, (0, common_1.Inject)('IProjectService')),
|
|
68
68
|
__param(3, (0, common_1.Inject)('IBlockDispatcher')),
|
|
69
|
+
__param(8, (0, common_1.Inject)('IStoreModelProvider')),
|
|
69
70
|
__metadata("design:paramtypes", [algorand_1.AlgorandApiService,
|
|
70
71
|
node_core_1.NodeConfig,
|
|
71
72
|
project_service_1.ProjectService, Object, dictionary_1.AlgorandDictionaryService,
|
|
72
73
|
unfinalizedBlocks_service_1.UnfinalizedBlocksService,
|
|
73
74
|
event_emitter_1.EventEmitter2,
|
|
74
|
-
schedule_1.SchedulerRegistry,
|
|
75
|
-
node_core_1.StoreCacheService])
|
|
75
|
+
schedule_1.SchedulerRegistry, Object])
|
|
76
76
|
], FetchService);
|
|
77
77
|
exports.FetchService = FetchService;
|
|
78
78
|
//# sourceMappingURL=fetch.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.service.js","sourceRoot":"","sources":["../../src/indexer/fetch.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,+CAAqD;AACrD,4DAIgC;AAChC,gDAM0B;AAE1B,0CAKqB;AAErB,6CAAyD;AACzD,uDAAmD;AACnD,2EAAuE;AAEvE,MAAM,mBAAmB,GAAG,IAAI,CAAC,CAAC,IAAI;AAEtC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAGtB,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,4BAIjC;IAEW;IADV,YACU,UAA8B,EACtC,UAAsB,EACK,cAA8B,EAEzD,eAAyC,EACzC,iBAA4C,EAC5C,wBAAkD,EAClD,YAA2B,EAC3B,iBAAoC,
|
|
1
|
+
{"version":3,"file":"fetch.service.js","sourceRoot":"","sources":["../../src/indexer/fetch.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AACtD,+CAAqD;AACrD,4DAIgC;AAChC,gDAM0B;AAE1B,0CAKqB;AAErB,6CAAyD;AACzD,uDAAmD;AACnD,2EAAuE;AAEvE,MAAM,mBAAmB,GAAG,IAAI,CAAC,CAAC,IAAI;AAEtC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAGtB,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,4BAIjC;IAEW;IADV,YACU,UAA8B,EACtC,UAAsB,EACK,cAA8B,EAEzD,eAAyC,EACzC,iBAA4C,EAC5C,wBAAkD,EAClD,YAA2B,EAC3B,iBAAoC,EACL,kBAAuC;QAEtE,KAAK,CACH,UAAU,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,CACnB,CAAC;QApBM,eAAU,GAAV,UAAU,CAAoB;IAqBxC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;IACnC,CAAC;IAES,KAAK,CAAC,kBAAkB;QAChC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;QACpD,OAAO,IAAA,gCAAqB,EAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAES,KAAK,CAAC,aAAa;QAC3B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9D,OAAO,WAAW,CAAC,KAAK,CAAC;IAC3B,CAAC;IAES,KAAK,CAAC,UAAU;QACxB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;IACpD,CAAC;IAES,KAAK,CAAC,mBAAmB;QACjC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,4DAA4D;IAClD,KAAK,CAAC,gBAAgB;QAC9B,MAAM,aAAa,GAAG,IAAA,uBAAY,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC;QACpE,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;IACtD,CAAC;IAES,UAAU,CAAC,WAAiC;QACpD,OAAO,IAAA,sBAAU,EAAC,WAAW,EAAE,4BAAU,EAAE,qCAAmB,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IACS,KAAK,CAAC,WAAW;QACzB,4CAA4C;QAC5C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF,CAAA;AAhEY,YAAY;IADxB,IAAA,mBAAU,GAAE;IASR,WAAA,IAAA,eAAM,EAAC,iBAAiB,CAAC,CAAA;IACzB,WAAA,IAAA,eAAM,EAAC,kBAAkB,CAAC,CAAA;IAM1B,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;qCATV,6BAAkB;QAC1B,sBAAU;QACqB,gCAAc,UAGtC,sCAAyB;QAClB,oDAAwB;QACpC,6BAAa;QACR,4BAAiB;GAd3B,YAAY,CAgExB;AAhEY,oCAAY","sourcesContent":["// Copyright 2020-2024 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 { SchedulerRegistry } from '@nestjs/schedule';\nimport {\n isCustomDs,\n AlgorandHandlerKind,\n AlgorandDataSource,\n} from '@subql/common-algorand';\nimport {\n NodeConfig,\n BaseFetchService,\n getModulos,\n Header,\n IStoreModelProvider,\n} from '@subql/node-core';\nimport { AlgorandBlock } from '@subql/types-algorand';\nimport {\n AlgorandApi,\n AlgorandApiService,\n algorandBlockToHeader,\n calcInterval,\n} from '../algorand';\nimport { IAlgorandBlockDispatcher } from './blockDispatcher';\nimport { AlgorandDictionaryService } from './dictionary';\nimport { ProjectService } from './project.service';\nimport { UnfinalizedBlocksService } from './unfinalizedBlocks.service';\n\nconst BLOCK_TIME_VARIANCE = 5000; //ms\n\nconst INTERVAL_PERCENT = 0.9;\n\n@Injectable()\nexport class FetchService extends BaseFetchService<\n AlgorandDataSource,\n IAlgorandBlockDispatcher,\n AlgorandBlock\n> {\n constructor(\n private apiService: AlgorandApiService,\n nodeConfig: NodeConfig,\n @Inject('IProjectService') projectService: ProjectService,\n @Inject('IBlockDispatcher')\n blockDispatcher: IAlgorandBlockDispatcher,\n dictionaryService: AlgorandDictionaryService,\n unfinalizedBlocksService: UnfinalizedBlocksService,\n eventEmitter: EventEmitter2,\n schedulerRegistry: SchedulerRegistry,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n ) {\n super(\n nodeConfig,\n projectService,\n blockDispatcher,\n dictionaryService,\n eventEmitter,\n schedulerRegistry,\n unfinalizedBlocksService,\n storeModelProvider,\n );\n }\n\n get api(): AlgorandApi {\n return this.apiService.unsafeApi;\n }\n\n protected async getFinalizedHeader(): Promise<Header> {\n const block = await this.api.getLatestBlockHeader();\n return algorandBlockToHeader(block);\n }\n\n protected async getBestHeight(): Promise<number> {\n const checkHealth = await this.api.api.makeHealthCheck().do();\n return checkHealth.round;\n }\n\n protected async getChainId(): Promise<string> {\n return Promise.resolve(this.api.getGenesisHash());\n }\n\n protected async initBlockDispatcher(): Promise<void> {\n await this.blockDispatcher.init(this.resetForNewDs.bind(this));\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n protected async getChainInterval(): Promise<number> {\n const chainInterval = calcInterval(this.api.api) * INTERVAL_PERCENT;\n return Math.min(BLOCK_TIME_VARIANCE, chainInterval);\n }\n\n protected getModulos(dataSources: AlgorandDataSource[]): number[] {\n return getModulos(dataSources, isCustomDs, AlgorandHandlerKind.Block);\n }\n protected async preLoopHook(): Promise<void> {\n // Algorand doesn't need to do anything here\n return Promise.resolve();\n }\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { BaseUnfinalizedBlocksService, Header, NodeConfig,
|
|
1
|
+
import { BaseUnfinalizedBlocksService, Header, NodeConfig, IStoreModelProvider } from '@subql/node-core';
|
|
2
2
|
import { AlgorandApiService } from '../algorand';
|
|
3
3
|
import { BlockContent } from './types';
|
|
4
4
|
export declare class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<BlockContent> {
|
|
5
5
|
private readonly apiService;
|
|
6
|
-
constructor(apiService: AlgorandApiService, nodeConfig: NodeConfig,
|
|
6
|
+
constructor(apiService: AlgorandApiService, nodeConfig: NodeConfig, storeModelProvider: IStoreModelProvider);
|
|
7
7
|
protected getFinalizedHead(): Promise<Header>;
|
|
8
8
|
protected getHeaderForHash(hash: string): Promise<Header>;
|
|
9
|
-
|
|
9
|
+
getHeaderForHeight(height: number): Promise<Header>;
|
|
10
10
|
}
|
|
@@ -10,6 +10,9 @@ 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.UnfinalizedBlocksService = void 0;
|
|
15
18
|
const common_1 = require("@nestjs/common");
|
|
@@ -17,8 +20,8 @@ const node_core_1 = require("@subql/node-core");
|
|
|
17
20
|
const algorand_1 = require("../algorand");
|
|
18
21
|
let UnfinalizedBlocksService = class UnfinalizedBlocksService extends node_core_1.BaseUnfinalizedBlocksService {
|
|
19
22
|
apiService;
|
|
20
|
-
constructor(apiService, nodeConfig,
|
|
21
|
-
super(nodeConfig,
|
|
23
|
+
constructor(apiService, nodeConfig, storeModelProvider) {
|
|
24
|
+
super(nodeConfig, storeModelProvider);
|
|
22
25
|
this.apiService = apiService;
|
|
23
26
|
}
|
|
24
27
|
async getFinalizedHead() {
|
|
@@ -53,9 +56,9 @@ __decorate([
|
|
|
53
56
|
], UnfinalizedBlocksService.prototype, "getHeaderForHeight", null);
|
|
54
57
|
UnfinalizedBlocksService = __decorate([
|
|
55
58
|
(0, common_1.Injectable)(),
|
|
59
|
+
__param(2, (0, common_1.Inject)('IStoreModelProvider')),
|
|
56
60
|
__metadata("design:paramtypes", [algorand_1.AlgorandApiService,
|
|
57
|
-
node_core_1.NodeConfig,
|
|
58
|
-
node_core_1.StoreCacheService])
|
|
61
|
+
node_core_1.NodeConfig, Object])
|
|
59
62
|
], UnfinalizedBlocksService);
|
|
60
63
|
exports.UnfinalizedBlocksService = UnfinalizedBlocksService;
|
|
61
64
|
//# sourceMappingURL=unfinalizedBlocks.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unfinalizedBlocks.service.js","sourceRoot":"","sources":["../../src/indexer/unfinalizedBlocks.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC
|
|
1
|
+
{"version":3,"file":"unfinalizedBlocks.service.js","sourceRoot":"","sources":["../../src/indexer/unfinalizedBlocks.service.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,gDAM0B;AAC1B,0CAAwE;AAIjE,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,wCAA0C;IAEnE;IADnB,YACmB,UAA8B,EAC/C,UAAsB,EACS,kBAAuC;QAEtE,KAAK,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAJrB,eAAU,GAAV,UAAU,CAAoB;IAKjD,CAAC;IAGe,AAAN,KAAK,CAAC,gBAAgB;QAC9B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;QACzE,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC;QACvC,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IAGe,AAAN,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC3C,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IAGK,AAAN,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACrC,OAAO,IAAA,gCAAqB,EAC1B,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAChD,CAAC;IACJ,CAAC;CACF,CAAA;AAjBiB;IADf,IAAA,0BAAc,GAAE;;;;gEAKhB;AAGe;IADf,IAAA,0BAAc,GAAE;;;;gEAGhB;AAGK;IADL,IAAA,0BAAc,GAAE;;;;kEAKhB;AA1BU,wBAAwB;IADpC,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,qBAAqB,CAAC,CAAA;qCAFD,6BAAkB;QACnC,sBAAU;GAHb,wBAAwB,CA2BpC;AA3BY,4DAAwB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject, Injectable } from '@nestjs/common';\nimport {\n BaseUnfinalizedBlocksService,\n Header,\n NodeConfig,\n IStoreModelProvider,\n mainThreadOnly,\n} from '@subql/node-core';\nimport { AlgorandApiService, algorandBlockToHeader } from '../algorand';\nimport { BlockContent } from './types';\n\n@Injectable()\nexport class UnfinalizedBlocksService extends BaseUnfinalizedBlocksService<BlockContent> {\n constructor(\n private readonly apiService: AlgorandApiService,\n nodeConfig: NodeConfig,\n @Inject('IStoreModelProvider') storeModelProvider: IStoreModelProvider,\n ) {\n super(nodeConfig, storeModelProvider);\n }\n\n @mainThreadOnly()\n protected async getFinalizedHead(): Promise<Header> {\n const checkHealth = await this.apiService.api.api.makeHealthCheck().do();\n const latestHeight = checkHealth.round;\n return this.getHeaderForHeight(latestHeight);\n }\n\n @mainThreadOnly()\n protected async getHeaderForHash(hash: string): Promise<Header> {\n return this.getHeaderForHeight(parseInt(hash, 10));\n }\n\n @mainThreadOnly()\n async getHeaderForHeight(height: number): Promise<Header> {\n return algorandBlockToHeader(\n await this.apiService.api.getHeaderOnly(height),\n );\n }\n}\n"]}
|
|
@@ -28,11 +28,7 @@ WorkerFetchModule = __decorate([
|
|
|
28
28
|
indexer_manager_1.IndexerManager,
|
|
29
29
|
{
|
|
30
30
|
provide: algorand_1.AlgorandApiService,
|
|
31
|
-
useFactory:
|
|
32
|
-
const apiService = new algorand_1.AlgorandApiService(project, connectionPoolService, eventEmitter);
|
|
33
|
-
await apiService.init();
|
|
34
|
-
return apiService;
|
|
35
|
-
},
|
|
31
|
+
useFactory: algorand_1.AlgorandApiService.init,
|
|
36
32
|
inject: ['ISubqueryProject', node_core_1.ConnectionPoolService, event_emitter_1.EventEmitter2],
|
|
37
33
|
},
|
|
38
34
|
ds_processor_service_1.DsProcessorService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-fetch.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker-fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAAsD;AACtD,gDAK0B;AAC1B,6CAA2E;AAE3E,kEAA6D;AAC7D,8DAAyD;AACzD,wDAAoD;AACpD,wDAAoD;AACpD,4EAAwE;AACxE,qDAAiD;
|
|
1
|
+
{"version":3,"file":"worker-fetch.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker-fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAAsD;AACtD,gDAK0B;AAC1B,6CAA2E;AAE3E,kEAA6D;AAC7D,8DAAyD;AACzD,wDAAoD;AACpD,wDAAoD;AACpD,4EAAwE;AACxE,qDAAiD;AA6B1C,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAAG,CAAA;AAApB,iBAAiB;IA3B7B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAgB,CAAC;QAC3B,SAAS,EAAE;YACT,gCAAc;YACd;gBACE,OAAO,EAAE,6BAAkB;gBAC3B,UAAU,EAAE,6BAAkB,CAAC,IAAI;gBACnC,MAAM,EAAE,CAAC,kBAAkB,EAAE,iCAAqB,EAAE,6BAAa,CAAC;aACnE;YACD,yCAAkB;YAClB;gBACE,OAAO,EAAE,qCAAgB;gBACzB,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,kCAAsB,CAAE,MAAc,CAAC,IAAI,CAAC;aACnE;YACD;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,gCAAc;aACzB;YACD;gBACE,OAAO,EAAE,oDAAwB;gBACjC,UAAU,EAAE,GAAG,EAAE,CACf,IAAI,0CAA8B,CAAE,MAAc,CAAC,IAAI,CAAC;aAC3D;YACD,8BAAa;SACd;QACD,OAAO,EAAE,EAAE;KACZ,CAAC;GACW,iBAAiB,CAAG;AAApB,8CAAiB","sourcesContent":["// Copyright 2020-2024 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 ConnectionPoolService,\n WorkerDynamicDsService,\n WorkerUnfinalizedBlocksService,\n WorkerCoreModule,\n} from '@subql/node-core';\nimport { AlgorandApiService, AlgorandApiConnection } from '../../algorand';\nimport { SubqueryProject } from '../../configure/SubqueryProject';\nimport { DsProcessorService } from '../ds-processor.service';\nimport { DynamicDsService } from '../dynamic-ds.service';\nimport { IndexerManager } from '../indexer.manager';\nimport { ProjectService } from '../project.service';\nimport { UnfinalizedBlocksService } from '../unfinalizedBlocks.service';\nimport { WorkerService } from './worker.service';\n\n@Module({\n imports: [WorkerCoreModule],\n providers: [\n IndexerManager,\n {\n provide: AlgorandApiService,\n useFactory: AlgorandApiService.init,\n inject: ['ISubqueryProject', ConnectionPoolService, EventEmitter2],\n },\n DsProcessorService,\n {\n provide: DynamicDsService,\n useFactory: () => new WorkerDynamicDsService((global as any).host),\n },\n {\n provide: 'IProjectService',\n useClass: ProjectService,\n },\n {\n provide: UnfinalizedBlocksService,\n useFactory: () =>\n new WorkerUnfinalizedBlocksService((global as any).host),\n },\n WorkerService,\n ],\n exports: [],\n})\nexport class WorkerFetchModule {}\n"]}
|