@subql/node-stellar 3.12.1-0 → 3.12.2-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/app.module.js +38 -4
- package/dist/app.module.js.map +1 -1
- package/dist/configure/SubqueryProject.d.ts +7 -18
- package/dist/configure/SubqueryProject.js +16 -103
- package/dist/configure/SubqueryProject.js.map +1 -1
- package/dist/configure/configure.module.js +1 -1
- package/dist/configure/configure.module.js.map +1 -1
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js +1 -3
- package/dist/indexer/blockDispatcher/block-dispatcher.service.js.map +1 -1
- package/dist/indexer/blockDispatcher/stellar-block-dispatcher.d.ts +1 -1
- package/dist/indexer/blockDispatcher/stellar-block-dispatcher.js.map +1 -1
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js +2 -7
- package/dist/indexer/blockDispatcher/worker-block-dispatcher.service.js.map +1 -1
- package/dist/indexer/dictionary/stellarDictionary.service.d.ts +0 -1
- package/dist/indexer/dictionary/stellarDictionary.service.js +2 -8
- package/dist/indexer/dictionary/stellarDictionary.service.js.map +1 -1
- package/dist/indexer/dictionary/v1/stellarDictionaryV1.d.ts +8 -9
- package/dist/indexer/dictionary/v1/stellarDictionaryV1.js +17 -42
- package/dist/indexer/dictionary/v1/stellarDictionaryV1.js.map +1 -1
- package/dist/indexer/dynamic-ds.service.js +1 -3
- package/dist/indexer/dynamic-ds.service.js.map +1 -1
- package/dist/indexer/fetch.module.js +4 -14
- package/dist/indexer/fetch.module.js.map +1 -1
- package/dist/indexer/fetch.service.d.ts +3 -4
- package/dist/indexer/fetch.service.js +8 -13
- package/dist/indexer/fetch.service.js.map +1 -1
- package/dist/indexer/indexer.manager.d.ts +2 -2
- package/dist/indexer/indexer.manager.js.map +1 -1
- package/dist/indexer/project.service.js +1 -3
- package/dist/indexer/project.service.js.map +1 -1
- package/dist/indexer/unfinalizedBlocks.service.js +4 -3
- package/dist/indexer/unfinalizedBlocks.service.js.map +1 -1
- package/dist/indexer/worker/worker-fetch.module.js +3 -21
- package/dist/indexer/worker/worker-fetch.module.js.map +1 -1
- package/dist/indexer/worker/worker.js.map +1 -1
- package/dist/indexer/worker/worker.module.js +1 -0
- package/dist/indexer/worker/worker.module.js.map +1 -1
- package/dist/init.js +1 -6
- package/dist/init.js.map +1 -1
- package/dist/stellar/api.connection.d.ts +2 -2
- package/dist/stellar/api.connection.js +3 -7
- package/dist/stellar/api.connection.js.map +1 -1
- package/dist/stellar/api.service.stellar.d.ts +5 -5
- package/dist/stellar/api.service.stellar.js +15 -12
- package/dist/stellar/api.service.stellar.js.map +1 -1
- package/dist/stellar/api.service.stellar.spec.js +2 -2
- package/dist/stellar/api.service.stellar.spec.js.map +1 -1
- package/dist/stellar/api.stellar.d.ts +9 -8
- package/dist/stellar/api.stellar.js +18 -6
- package/dist/stellar/api.stellar.js.map +1 -1
- package/dist/stellar/api.stellar.spec.js +2 -2
- package/dist/stellar/api.stellar.spec.js.map +1 -1
- package/dist/stellar/block.stellar.js +2 -2
- package/dist/stellar/block.stellar.js.map +1 -1
- package/dist/stellar/block.stellar.spec.js +12 -12
- package/dist/stellar/block.stellar.spec.js.map +1 -1
- package/dist/stellar/safe-api.d.ts +2 -3
- package/dist/stellar/safe-api.js +2 -2
- package/dist/stellar/safe-api.js.map +1 -1
- package/dist/stellar/soroban.server.d.ts +1 -1
- package/dist/stellar/soroban.server.js +5 -1
- package/dist/stellar/soroban.server.js.map +1 -1
- package/dist/stellar/soroban.server.spec.js +1 -1
- package/dist/stellar/soroban.server.spec.js.map +1 -1
- package/dist/stellar/stellar.server.d.ts +3 -2
- package/dist/stellar/stellar.server.js +3 -3
- package/dist/stellar/stellar.server.js.map +1 -1
- package/dist/stellar/utils.stellar.d.ts +3 -2
- package/dist/stellar/utils.stellar.js +7 -7
- package/dist/stellar/utils.stellar.js.map +1 -1
- package/dist/subcommands/testing.module.js +3 -2
- package/dist/subcommands/testing.module.js.map +1 -1
- package/dist/subcommands/testing.service.js +1 -3
- package/dist/subcommands/testing.service.js.map +1 -1
- package/dist/utils/string.d.ts +1 -1
- package/dist/utils/string.js.map +1 -1
- package/package.json +7 -7
- package/dist/admin/admin.module.d.ts +0 -2
- package/dist/admin/admin.module.js +0 -25
- package/dist/admin/admin.module.js.map +0 -1
- package/dist/meta/meta.controller.d.ts +0 -21
- package/dist/meta/meta.controller.js +0 -37
- package/dist/meta/meta.controller.js.map +0 -1
- package/dist/meta/meta.module.d.ts +0 -2
- package/dist/meta/meta.module.js +0 -28
- package/dist/meta/meta.module.js.map +0 -1
- package/dist/meta/meta.service.d.ts +0 -24
- package/dist/meta/meta.service.js +0 -124
- package/dist/meta/meta.service.js.map +0 -1
|
@@ -24,22 +24,13 @@ let WorkerFetchModule = class WorkerFetchModule {
|
|
|
24
24
|
};
|
|
25
25
|
WorkerFetchModule = __decorate([
|
|
26
26
|
(0, common_1.Module)({
|
|
27
|
+
imports: [node_core_1.WorkerCoreModule],
|
|
27
28
|
providers: [
|
|
28
29
|
indexer_manager_1.IndexerManager,
|
|
29
|
-
{
|
|
30
|
-
provide: node_core_1.ConnectionPoolStateManager,
|
|
31
|
-
useFactory: () => {
|
|
32
|
-
if (worker_threads_1.isMainThread) {
|
|
33
|
-
throw new Error('Expected to be worker thread');
|
|
34
|
-
}
|
|
35
|
-
return new node_core_1.WorkerConnectionPoolStateManager(global.host);
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
node_core_1.ConnectionPoolService,
|
|
39
30
|
{
|
|
40
31
|
provide: node_core_1.ApiService,
|
|
41
|
-
useFactory: async (project,
|
|
42
|
-
const apiService = new stellar_1.StellarApiService(project,
|
|
32
|
+
useFactory: async (project, connectionPoolService, eventEmitter, nodeConfig) => {
|
|
33
|
+
const apiService = new stellar_1.StellarApiService(project, connectionPoolService, eventEmitter, nodeConfig);
|
|
43
34
|
await apiService.init();
|
|
44
35
|
return apiService;
|
|
45
36
|
},
|
|
@@ -50,7 +41,6 @@ WorkerFetchModule = __decorate([
|
|
|
50
41
|
event_emitter_1.EventEmitter2,
|
|
51
42
|
],
|
|
52
43
|
},
|
|
53
|
-
node_core_1.SandboxService,
|
|
54
44
|
ds_processor_service_1.DsProcessorService,
|
|
55
45
|
{
|
|
56
46
|
provide: dynamic_ds_service_1.DynamicDsService,
|
|
@@ -75,14 +65,6 @@ WorkerFetchModule = __decorate([
|
|
|
75
65
|
return new node_core_1.WorkerUnfinalizedBlocksService(global.host);
|
|
76
66
|
},
|
|
77
67
|
},
|
|
78
|
-
{
|
|
79
|
-
provide: node_core_1.MonitorService,
|
|
80
|
-
useFactory: () => new node_core_1.WorkerMonitorService(global.host),
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
provide: node_core_1.InMemoryCacheService,
|
|
84
|
-
useFactory: () => new node_core_1.WorkerInMemoryCacheService(global.host),
|
|
85
|
-
},
|
|
86
68
|
],
|
|
87
69
|
})
|
|
88
70
|
], WorkerFetchModule);
|
|
@@ -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,mDAA8C;AAC9C,2CAAwC;AACxC,yDAAsD;AACtD,
|
|
1
|
+
{"version":3,"file":"worker-fetch.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker-fetch.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,mDAA8C;AAC9C,2CAAwC;AACxC,yDAAsD;AACtD,gDAO0B;AAE1B,2CAAkD;AAElD,kEAA6D;AAC7D,8DAAyD;AACzD,wDAAoD;AACpD,wDAAoD;AACpD,4EAAwE;AACxE,qDAAiD;AAwD1C,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;CAAG,CAAA;AAApB,iBAAiB;IAtD7B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAgB,CAAC;QAC3B,SAAS,EAAE;YACT,gCAAc;YACd;gBACE,OAAO,EAAE,sBAAU;gBACnB,UAAU,EAAE,KAAK,EACf,OAAwB,EACxB,qBAAkE,EAClE,YAA2B,EAC3B,UAAsB,EACtB,EAAE;oBACF,MAAM,UAAU,GAAG,IAAI,2BAAiB,CACtC,OAAO,EACP,qBAAqB,EACrB,YAAY,EACZ,UAAU,CACX,CAAC;oBACF,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;oBACxB,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE;oBACN,kBAAkB;oBAClB,wBAAwB;oBACxB,iCAAqB;oBACrB,6BAAa;iBACd;aACF;YACD,yCAAkB;YAClB;gBACE,OAAO,EAAE,qCAAgB;gBACzB,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,6BAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBACD,OAAO,IAAI,kCAAsB,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC;gBAC1D,CAAC;aACF;YACD;gBACE,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,gCAAc;aACzB;YACD,8BAAa;YACb;gBACE,OAAO,EAAE,oDAAwB;gBACjC,UAAU,EAAE,GAAG,EAAE;oBACf,IAAI,6BAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;qBACjD;oBACD,OAAO,IAAI,0CAA8B,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC;gBAClE,CAAC;aACF;SACF;KACF,CAAC;GACW,iBAAiB,CAAG;AAApB,8CAAiB","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { isMainThread } from 'worker_threads';\nimport { Module } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n WorkerCoreModule,\n ConnectionPoolService,\n WorkerDynamicDsService,\n NodeConfig,\n WorkerUnfinalizedBlocksService,\n ApiService,\n} from '@subql/node-core';\nimport { SubqueryProject } from '../../configure/SubqueryProject';\nimport { StellarApiService } from '../../stellar';\nimport { StellarApiConnection } from '../../stellar/api.connection';\nimport { DsProcessorService } from '../ds-processor.service';\nimport { DynamicDsService } from '../dynamic-ds.service';\nimport { IndexerManager } from '../indexer.manager';\nimport { ProjectService } from '../project.service';\nimport { UnfinalizedBlocksService } from '../unfinalizedBlocks.service';\nimport { WorkerService } from './worker.service';\n\n@Module({\n imports: [WorkerCoreModule],\n providers: [\n IndexerManager,\n {\n provide: ApiService,\n useFactory: async (\n project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<StellarApiConnection>,\n eventEmitter: EventEmitter2,\n nodeConfig: NodeConfig,\n ) => {\n const apiService = new StellarApiService(\n project,\n connectionPoolService,\n eventEmitter,\n nodeConfig,\n );\n await apiService.init();\n return apiService;\n },\n inject: [\n 'ISubqueryProject',\n 'IProjectUpgradeService',\n ConnectionPoolService,\n EventEmitter2,\n ],\n },\n DsProcessorService,\n {\n provide: DynamicDsService,\n useFactory: () => {\n if (isMainThread) {\n throw new Error('Expected to be worker thread');\n }\n return new WorkerDynamicDsService((global as any).host);\n },\n },\n {\n provide: 'IProjectService',\n useClass: ProjectService,\n },\n WorkerService,\n {\n provide: UnfinalizedBlocksService,\n useFactory: () => {\n if (isMainThread) {\n throw new Error('Expected to be worker thread');\n }\n return new WorkerUnfinalizedBlocksService((global as any).host);\n },\n },\n ],\n})\nexport class WorkerFetchModule {}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,iEAAiE;AACjE,kDAAkD;AAClD,wCAAwC;AACxC,oDAAqD;AACrD,wCAAwC;AACxC,uCAA2C;AAE3C,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,IAAA,mBAAU,EACR,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAA+B,EACpC,IAAI,CAAC,QAA8B,CACpC,CAAC;AAEF,6DAA+C;AAC/C,uCAA2C;AAC3C,gDAM0B;AAE1B,mDAA+C;AAC/C,qDAAiD;AAEjD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,WAAW,8BAAQ,EAAE,CAAC,CAAC;AAEhD,KAAK,UAAU,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAEnC,iEAAiE;AACjE,kDAAkD;AAClD,wCAAwC;AACxC,oDAAqD;AACrD,wCAAwC;AACxC,uCAA2C;AAE3C,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,IAAA,mBAAU,EACR,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,SAA+B,EACpC,IAAI,CAAC,QAA8B,CACpC,CAAC;AAEF,6DAA+C;AAC/C,uCAA2C;AAC3C,gDAM0B;AAE1B,mDAA+C;AAC/C,qDAAiD;AAEjD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,WAAW,8BAAQ,EAAE,CAAC,CAAC;AAEhD,KAAK,UAAU,UAAU,CAAC,WAAoB;IAC5C,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,4BAAY,EAAE;YACjD,MAAM,EAAE,IAAI,sBAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,0EAA0E;SACjH,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,cAAc,GAAmB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,uGAAuG;QACvG,MAAM,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvC,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,8BAAa,CAAC,CAAC;QAE7C,IAAA,8BAAkB,EAAC,GAAG,EAAE,aAAa,CAAC,CAAC;KACxC;IAAC,OAAO,CAAM,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC;KACT;AACH,CAAC;AAGA,MAAc,CAAC,IAAI,GAAG,IAAA,4BAAgB,EAAC,EAAE,EAAE;IAC1C,UAAU;CACX,CAAC,CAAC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\n// initlogger and yargs must be imported before all other imports\n// making sure logger is defined before its called\n// eslint-disable-next-line import/order\nimport { initLogger } from '@subql/node-core/logger';\n// eslint-disable-next-line import/order\nimport { yargsOptions } from '../../yargs';\n\nconst { argv } = yargsOptions;\n\ninitLogger(\n argv.debug,\n argv.outputFmt as 'json' | 'colored',\n argv.logLevel as string | undefined,\n);\n\nimport { threadId } from 'node:worker_threads';\nimport { NestFactory } from '@nestjs/core';\nimport {\n getLogger,\n NestLogger,\n initWorkerServices,\n IBaseIndexerWorker,\n createWorkerHost,\n} from '@subql/node-core';\nimport { ProjectService } from '../project.service';\nimport { WorkerModule } from './worker.module';\nimport { WorkerService } from './worker.service';\n\nconst logger = getLogger(`worker #${threadId}`);\n\nasync function initWorker(startHeight?: number): Promise<void> {\n try {\n const app = await NestFactory.create(WorkerModule, {\n logger: new NestLogger(!!argv.debug), // TIP: If the worker is crashing comment out this line for better logging\n });\n\n await app.init();\n\n const projectService: ProjectService = app.get('IProjectService');\n // Initialise async services, we do this here rather than in factories so we can capture one off events\n await projectService.init(startHeight);\n\n const workerService = app.get(WorkerService);\n\n initWorkerServices(app, workerService);\n } catch (e: any) {\n console.log('Failed to start worker', e);\n logger.error(e, 'Failed to start worker');\n throw e;\n }\n}\nexport type IIndexerWorker = IBaseIndexerWorker;\n\n(global as any).host = createWorkerHost([], {\n initWorker,\n});\n"]}
|
|
@@ -24,6 +24,7 @@ WorkerModule = __decorate([
|
|
|
24
24
|
event_emitter_1.EventEmitterModule.forRoot(),
|
|
25
25
|
configure_module_1.ConfigureModule.register(),
|
|
26
26
|
schedule_1.ScheduleModule.forRoot(),
|
|
27
|
+
node_core_1.WorkerCoreModule,
|
|
27
28
|
worker_fetch_module_1.WorkerFetchModule,
|
|
28
29
|
],
|
|
29
30
|
controllers: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA2D;AAC3D,+CAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"worker.module.js","sourceRoot":"","sources":["../../../src/indexer/worker/worker.module.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;AAEnC,2CAAwC;AACxC,yDAA2D;AAC3D,+CAAkD;AAClD,gDAA8D;AAC9D,uEAAmE;AACnE,+DAA0D;AAanD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,YAAY;IAXxB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,oBAAQ,CAAC,OAAO,EAAE;YAClB,kCAAkB,CAAC,OAAO,EAAE;YAC5B,kCAAe,CAAC,QAAQ,EAAE;YAC1B,yBAAc,CAAC,OAAO,EAAE;YACxB,4BAAgB;YAChB,uCAAiB;SAClB;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;GACW,YAAY,CAAG;AAAf,oCAAY","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Module } from '@nestjs/common';\nimport { EventEmitterModule } from '@nestjs/event-emitter';\nimport { ScheduleModule } from '@nestjs/schedule';\nimport { DbModule, WorkerCoreModule } from '@subql/node-core';\nimport { ConfigureModule } from '../../configure/configure.module';\nimport { WorkerFetchModule } from './worker-fetch.module';\n\n@Module({\n imports: [\n DbModule.forRoot(),\n EventEmitterModule.forRoot(),\n ConfigureModule.register(),\n ScheduleModule.forRoot(),\n WorkerCoreModule,\n WorkerFetchModule,\n ],\n controllers: [],\n})\nexport class WorkerModule {}\n"]}
|
package/dist/init.js
CHANGED
|
@@ -11,16 +11,11 @@ const fetch_service_1 = require("./indexer/fetch.service");
|
|
|
11
11
|
const yargs_1 = require("./yargs");
|
|
12
12
|
const pjson = require('../package.json');
|
|
13
13
|
const { argv } = yargs_1.yargsOptions;
|
|
14
|
-
const DEFAULT_PORT = 3000;
|
|
15
14
|
const logger = (0, node_core_1.getLogger)('subql-node');
|
|
16
15
|
(0, common_1.notifyUpdates)(pjson, logger);
|
|
17
16
|
async function bootstrap() {
|
|
18
17
|
logger.info(`Current ${pjson.name} version is ${pjson.version}`);
|
|
19
|
-
const
|
|
20
|
-
const p = parseInt(x);
|
|
21
|
-
return isNaN(p) ? null : p;
|
|
22
|
-
};
|
|
23
|
-
const port = validate(argv.port) ?? (await (0, common_1.findAvailablePort)(DEFAULT_PORT));
|
|
18
|
+
const port = await (0, node_core_1.getValidPort)(argv.port);
|
|
24
19
|
if (!port) {
|
|
25
20
|
(0, node_core_1.exitWithError)(`Unable to find available port (tried ports in range (${port}..${port + 10})). Try setting a free port manually by setting the --port flag`, logger);
|
|
26
21
|
}
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,uCAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAEnC,uCAA2C;AAC3C,0CAA8C;AAC9C,gDAK0B;AAC1B,6CAAyC;AACzC,2DAAuD;AAEvD,mCAAuC;AACvC,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAEzC,MAAM,EAAE,IAAI,EAAE,GAAG,oBAAY,CAAC;AAE9B,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,YAAY,CAAC,CAAC;AAEvC,IAAA,sBAAa,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAEtB,KAAK,UAAU,SAAS;IAC7B,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAEjE,MAAM,IAAI,GAAG,MAAM,IAAA,wBAAY,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,EAAE;QACT,IAAA,yBAAa,EACX,wDAAwD,IAAI,KAC1D,IAAI,GAAG,EACT,iEAAiE,EACjE,MAAM,CACP,CAAC;KACH;IAED,IAAI,IAAI,CAAC,MAAM,EAAE;QACf,MAAM,CAAC,IAAI,CACT,mHAAmH,CACpH,CAAC;KACH;IAED,IAAI;QACF,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,EAAE;YAC9C,MAAM,EAAE,IAAI,sBAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;SACrC,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,MAAM,cAAc,GAAmB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,4BAAY,CAAC,CAAC;QAE3C,yGAAyG;QACzG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAEpD,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAE1B,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;KAC9C;IAAC,OAAO,CAAC,EAAE;QACV,IAAA,yBAAa,EAAC,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;KACxE;AACH,CAAC;AAzCD,8BAyCC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { NestFactory } from '@nestjs/core';\nimport { notifyUpdates } from '@subql/common';\nimport {\n exitWithError,\n getLogger,\n NestLogger,\n getValidPort,\n} from '@subql/node-core';\nimport { AppModule } from './app.module';\nimport { FetchService } from './indexer/fetch.service';\nimport { ProjectService } from './indexer/project.service';\nimport { yargsOptions } from './yargs';\nconst pjson = require('../package.json');\n\nconst { argv } = yargsOptions;\n\nconst logger = getLogger('subql-node');\n\nnotifyUpdates(pjson, logger);\n\nexport async function bootstrap(): Promise<void> {\n logger.info(`Current ${pjson.name} version is ${pjson.version}`);\n\n const port = await getValidPort(argv.port);\n if (!port) {\n exitWithError(\n `Unable to find available port (tried ports in range (${port}..${\n port + 10\n })). Try setting a free port manually by setting the --port flag`,\n logger,\n );\n }\n\n if (argv.unsafe) {\n logger.warn(\n 'UNSAFE MODE IS ENABLED. This is not recommended for most projects and will not be supported by our hosted service',\n );\n }\n\n try {\n const app = await NestFactory.create(AppModule, {\n logger: new NestLogger(!!argv.debug),\n });\n\n await app.init();\n\n const projectService: ProjectService = app.get('IProjectService');\n const fetchService = app.get(FetchService);\n\n // Initialise async services, we do this here rather than in factories, so we can capture one off eventss\n await projectService.init();\n await fetchService.init(projectService.startHeight);\n\n app.enableShutdownHooks();\n\n await app.listen(port);\n\n logger.info(`Node started on port: ${port}`);\n } catch (e) {\n exitWithError(new Error('Node failed to start', { cause: e }), logger);\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
2
2
|
import { ApiConnectionError, IApiConnectionSpecific, NetworkMetadataPayload, IBlock } from '@subql/node-core';
|
|
3
|
-
import { StellarBlockWrapper } from '@subql/types-stellar';
|
|
3
|
+
import { StellarBlockWrapper, IStellarEndpointConfig } from '@subql/types-stellar';
|
|
4
4
|
import { StellarApi } from './api.stellar';
|
|
5
5
|
import SafeStellarProvider from './safe-api';
|
|
6
6
|
import { SorobanServer } from './soroban.server';
|
|
@@ -10,7 +10,7 @@ export declare class StellarApiConnection implements IApiConnectionSpecific<Stel
|
|
|
10
10
|
private fetchBlocksBatches;
|
|
11
11
|
readonly networkMeta: NetworkMetadataPayload;
|
|
12
12
|
constructor(unsafeApi: StellarApi, fetchBlocksBatches: FetchFunc);
|
|
13
|
-
static create(endpoint: string, fetchBlockBatches: FetchFunc, eventEmitter: EventEmitter2, soroban?: SorobanServer): Promise<StellarApiConnection>;
|
|
13
|
+
static create(endpoint: string, fetchBlockBatches: FetchFunc, eventEmitter: EventEmitter2, soroban?: SorobanServer, config?: IStellarEndpointConfig): Promise<StellarApiConnection>;
|
|
14
14
|
safeApi(height: number): SafeStellarProvider;
|
|
15
15
|
apiConnect(): Promise<void>;
|
|
16
16
|
apiDisconnect(): Promise<void>;
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors
|
|
3
3
|
// SPDX-License-Identifier: GPL-3.0
|
|
4
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
-
};
|
|
7
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
5
|
exports.StellarApiConnection = void 0;
|
|
9
6
|
const node_core_1 = require("@subql/node-core");
|
|
10
7
|
const api_stellar_1 = require("./api.stellar");
|
|
11
|
-
const safe_api_1 = __importDefault(require("./safe-api"));
|
|
12
8
|
class StellarApiConnection {
|
|
13
9
|
unsafeApi;
|
|
14
10
|
fetchBlocksBatches;
|
|
@@ -22,14 +18,14 @@ class StellarApiConnection {
|
|
|
22
18
|
genesisHash: unsafeApi.getGenesisHash(),
|
|
23
19
|
};
|
|
24
20
|
}
|
|
25
|
-
static async create(endpoint, fetchBlockBatches, eventEmitter, soroban) {
|
|
26
|
-
const api = new api_stellar_1.StellarApi(endpoint, eventEmitter, soroban);
|
|
21
|
+
static async create(endpoint, fetchBlockBatches, eventEmitter, soroban, config) {
|
|
22
|
+
const api = new api_stellar_1.StellarApi(endpoint, eventEmitter, soroban, config);
|
|
27
23
|
await api.init();
|
|
28
24
|
return new StellarApiConnection(api, fetchBlockBatches);
|
|
29
25
|
}
|
|
30
26
|
safeApi(height) {
|
|
31
27
|
//safe api not implemented
|
|
32
|
-
|
|
28
|
+
throw new Error(`Not Implemented`);
|
|
33
29
|
}
|
|
34
30
|
async apiConnect() {
|
|
35
31
|
await this.unsafeApi.connect();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.connection.js","sourceRoot":"","sources":["../../src/stellar/api.connection.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC
|
|
1
|
+
{"version":3,"file":"api.connection.js","sourceRoot":"","sources":["../../src/stellar/api.connection.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;AAGnC,gDAU0B;AAK1B,+CAA2C;AAS3C,MAAa,oBAAoB;IAWtB;IACC;IAJD,WAAW,CAAyB;IAE7C,YACS,SAAqB,EACpB,kBAA6B;QAD9B,cAAS,GAAT,SAAS,CAAY;QACpB,uBAAkB,GAAlB,kBAAkB,CAAW;QAErC,IAAI,CAAC,WAAW,GAAG;YACjB,KAAK,EAAE,SAAS,CAAC,UAAU,EAAE;YAC7B,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE;YACjC,WAAW,EAAE,SAAS,CAAC,cAAc,EAAE;SACxC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,QAAgB,EAChB,iBAA4B,EAC5B,YAA2B,EAC3B,OAAuB,EACvB,MAA+B;QAE/B,MAAM,GAAG,GAAG,IAAI,wBAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAEpE,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAEjB,OAAO,IAAI,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,0BAA0B;QAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAiB;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,WAAW,GAAG,oBAAoB,CAAC,WAAW,CAAC;IAE/C,MAAM,CAAC,WAAW,CAAC,CAAQ;QACzB,IAAI,eAAmC,CAAC;QACxC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YACjC,eAAe,GAAG,IAAI,wBAAY,CAAC,CAAC,CAAC,CAAC;SACvC;aAAM,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE;YACrD,eAAe,GAAG,IAAI,8BAAkB,CAAC,CAAC,CAAC,CAAC;SAC7C;aAAM,IACL,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACzC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACvC;YACA,eAAe,GAAG,IAAI,0BAAc,CAAC,CAAC,CAAC,CAAC;SACzC;aAAM,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE;YACtD,eAAe,GAAG,IAAI,8BAAkB,CAAC,CAAC,CAAC,CAAC;SAC7C;aAAM;YACL,eAAe,GAAG,IAAI,8BAAkB,CACtC,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,OAAO,EACT,wBAAY,CAAC,OAAO,CACrB,CAAC;SACH;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;CACF;AA7ED,oDA6EC","sourcesContent":["// Copyright 2020-2024 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n ApiConnectionError,\n ApiErrorType,\n IApiConnectionSpecific,\n NetworkMetadataPayload,\n TimeoutError,\n RateLimitError,\n DisconnectionError,\n LargeResponseError,\n IBlock,\n} from '@subql/node-core';\nimport {\n StellarBlockWrapper,\n IStellarEndpointConfig,\n} from '@subql/types-stellar';\nimport { StellarApi } from './api.stellar';\nimport SafeStellarProvider from './safe-api';\nimport { SorobanServer } from './soroban.server';\n\ntype FetchFunc = (\n api: StellarApi,\n batch: number[],\n) => Promise<IBlock<StellarBlockWrapper>[]>;\n\nexport class StellarApiConnection\n implements\n IApiConnectionSpecific<\n StellarApi,\n SafeStellarProvider,\n IBlock<StellarBlockWrapper>[]\n >\n{\n readonly networkMeta: NetworkMetadataPayload;\n\n constructor(\n public unsafeApi: StellarApi,\n private fetchBlocksBatches: FetchFunc,\n ) {\n this.networkMeta = {\n chain: unsafeApi.getChainId(),\n specName: unsafeApi.getSpecName(),\n genesisHash: unsafeApi.getGenesisHash(),\n };\n }\n\n static async create(\n endpoint: string,\n fetchBlockBatches: FetchFunc,\n eventEmitter: EventEmitter2,\n soroban?: SorobanServer,\n config?: IStellarEndpointConfig,\n ): Promise<StellarApiConnection> {\n const api = new StellarApi(endpoint, eventEmitter, soroban, config);\n\n await api.init();\n\n return new StellarApiConnection(api, fetchBlockBatches);\n }\n\n safeApi(height: number): SafeStellarProvider {\n //safe api not implemented\n throw new Error(`Not Implemented`);\n }\n\n async apiConnect(): Promise<void> {\n await this.unsafeApi.connect();\n }\n\n async apiDisconnect(): Promise<void> {\n await this.unsafeApi.disconnect();\n }\n\n async fetchBlocks(heights: number[]): Promise<IBlock<StellarBlockWrapper>[]> {\n const blocks = await this.fetchBlocksBatches(this.unsafeApi, heights);\n return blocks;\n }\n\n handleError = StellarApiConnection.handleError;\n\n static handleError(e: Error): ApiConnectionError {\n let formatted_error: ApiConnectionError;\n if (e.message.includes(`Timeout`)) {\n formatted_error = new TimeoutError(e);\n } else if (e.message.startsWith(`disconnected from `)) {\n formatted_error = new DisconnectionError(e);\n } else if (\n e.message.includes(`Rate Limit Exceeded`) ||\n e.message.includes('Too Many Requests')\n ) {\n formatted_error = new RateLimitError(e);\n } else if (e.message.includes(`limit must not exceed`)) {\n formatted_error = new LargeResponseError(e);\n } else {\n formatted_error = new ApiConnectionError(\n e.name,\n e.message,\n ApiErrorType.Default,\n );\n }\n return formatted_error;\n }\n}\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
2
|
-
import { ApiService, ConnectionPoolService,
|
|
3
|
-
import { StellarBlockWrapper } from '@subql/types-stellar';
|
|
2
|
+
import { ApiService, ConnectionPoolService, IBlock, NodeConfig } from '@subql/node-core';
|
|
3
|
+
import { StellarBlockWrapper, IStellarEndpointConfig } from '@subql/types-stellar';
|
|
4
4
|
import { SubqueryProject } from '../configure/SubqueryProject';
|
|
5
5
|
import { StellarApiConnection } from './api.connection';
|
|
6
6
|
import { StellarApi } from './api.stellar';
|
|
7
7
|
import SafeStellarProvider from './safe-api';
|
|
8
|
-
export declare class StellarApiService extends ApiService<StellarApi, SafeStellarProvider, IBlock<StellarBlockWrapper>[]> {
|
|
8
|
+
export declare class StellarApiService extends ApiService<StellarApi, SafeStellarProvider, IBlock<StellarBlockWrapper>[], StellarApiConnection, IStellarEndpointConfig> {
|
|
9
9
|
private project;
|
|
10
|
-
private
|
|
11
|
-
constructor(project: SubqueryProject,
|
|
10
|
+
private nodeConfig;
|
|
11
|
+
constructor(project: SubqueryProject, connectionPoolService: ConnectionPoolService<StellarApiConnection>, eventEmitter: EventEmitter2, nodeConfig: NodeConfig);
|
|
12
12
|
init(): Promise<StellarApiService>;
|
|
13
13
|
get api(): StellarApi;
|
|
14
14
|
safeApi(height: number): SafeStellarProvider;
|
|
@@ -24,11 +24,11 @@ const soroban_server_1 = require("./soroban.server");
|
|
|
24
24
|
const logger = (0, node_core_1.getLogger)('api');
|
|
25
25
|
let StellarApiService = class StellarApiService extends node_core_1.ApiService {
|
|
26
26
|
project;
|
|
27
|
-
|
|
28
|
-
constructor(project,
|
|
27
|
+
nodeConfig;
|
|
28
|
+
constructor(project, connectionPoolService, eventEmitter, nodeConfig) {
|
|
29
29
|
super(connectionPoolService, eventEmitter);
|
|
30
30
|
this.project = project;
|
|
31
|
-
this.
|
|
31
|
+
this.nodeConfig = nodeConfig;
|
|
32
32
|
}
|
|
33
33
|
async init() {
|
|
34
34
|
let network;
|
|
@@ -38,9 +38,11 @@ let StellarApiService = class StellarApiService extends node_core_1.ApiService {
|
|
|
38
38
|
catch (e) {
|
|
39
39
|
(0, node_core_1.exitWithError)(new Error(`Failed to init api`, { cause: e }), logger);
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
this.
|
|
43
|
-
|
|
41
|
+
if (this.nodeConfig.primaryNetworkEndpoint) {
|
|
42
|
+
const [endpoint, config] = this.nodeConfig.primaryNetworkEndpoint;
|
|
43
|
+
network.endpoint[endpoint] = config;
|
|
44
|
+
}
|
|
45
|
+
const sorobanEndpoint = network.sorobanEndpoint;
|
|
44
46
|
if (!network.sorobanEndpoint && sorobanEndpoint) {
|
|
45
47
|
//update sorobanEndpoint from parent project
|
|
46
48
|
this.project.network.sorobanEndpoint = sorobanEndpoint;
|
|
@@ -55,7 +57,7 @@ let StellarApiService = class StellarApiService extends node_core_1.ApiService {
|
|
|
55
57
|
const sorobanClient = sorobanEndpoint
|
|
56
58
|
? new soroban_server_1.SorobanServer(sorobanEndpoint)
|
|
57
59
|
: undefined;
|
|
58
|
-
await this.createConnections(network, (endpoint) => api_connection_1.StellarApiConnection.create(endpoint, this.fetchBlockBatches, this.eventEmitter, sorobanClient));
|
|
60
|
+
await this.createConnections(network, (endpoint, config) => api_connection_1.StellarApiConnection.create(endpoint, this.fetchBlockBatches, this.eventEmitter, sorobanClient, config));
|
|
59
61
|
return this;
|
|
60
62
|
}
|
|
61
63
|
get api() {
|
|
@@ -83,6 +85,9 @@ let StellarApiService = class StellarApiService extends node_core_1.ApiService {
|
|
|
83
85
|
}
|
|
84
86
|
}
|
|
85
87
|
logger.error(`Maximum retries (${maxRetries}) exceeded for api at height ${height}`);
|
|
88
|
+
if (!throwingError) {
|
|
89
|
+
throw new Error('Failed to make request, maximum retries failed');
|
|
90
|
+
}
|
|
86
91
|
throw throwingError;
|
|
87
92
|
};
|
|
88
93
|
}
|
|
@@ -98,11 +103,9 @@ let StellarApiService = class StellarApiService extends node_core_1.ApiService {
|
|
|
98
103
|
StellarApiService = __decorate([
|
|
99
104
|
(0, common_1.Injectable)(),
|
|
100
105
|
__param(0, (0, common_1.Inject)('ISubqueryProject')),
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
node_core_1.
|
|
104
|
-
node_core_1.ConnectionPoolService,
|
|
105
|
-
event_emitter_1.EventEmitter2])
|
|
106
|
+
__metadata("design:paramtypes", [Object, node_core_1.ConnectionPoolService,
|
|
107
|
+
event_emitter_1.EventEmitter2,
|
|
108
|
+
node_core_1.NodeConfig])
|
|
106
109
|
], StellarApiService);
|
|
107
110
|
exports.StellarApiService = StellarApiService;
|
|
108
111
|
//# sourceMappingURL=api.service.stellar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.stellar.js","sourceRoot":"","sources":["../../src/stellar/api.service.stellar.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;;;;;;;;;;;;;;AAEnC,2CAAoD;AACpD,yDAAsD;AAKtD,
|
|
1
|
+
{"version":3,"file":"api.service.stellar.js","sourceRoot":"","sources":["../../src/stellar/api.service.stellar.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 { Inject, Injectable } from '@nestjs/common';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport {\n StellarProjectNetwork,\n StellarProjectNetworkConfig,\n} from '@subql/common-stellar';\nimport {\n ApiService,\n ConnectionPoolService,\n getLogger,\n ProjectUpgradeService,\n IBlock,\n exitWithError,\n NodeConfig,\n} from '@subql/node-core';\nimport { IEndpointConfig } from '@subql/types-core';\nimport {\n StellarBlockWrapper,\n SubqlDatasource,\n IStellarEndpointConfig,\n} from '@subql/types-stellar';\nimport {\n SubqueryProject,\n dsHasSorobanEventHandler,\n} from '../configure/SubqueryProject';\nimport { StellarApiConnection } from './api.connection';\nimport { StellarApi } from './api.stellar';\nimport SafeStellarProvider from './safe-api';\nimport { SorobanServer } from './soroban.server';\n\nconst logger = getLogger('api');\n\n@Injectable()\nexport class StellarApiService extends ApiService<\n StellarApi,\n SafeStellarProvider,\n IBlock<StellarBlockWrapper>[],\n StellarApiConnection,\n IStellarEndpointConfig\n> {\n private nodeConfig: NodeConfig;\n constructor(\n @Inject('ISubqueryProject') private project: SubqueryProject,\n connectionPoolService: ConnectionPoolService<StellarApiConnection>,\n eventEmitter: EventEmitter2,\n nodeConfig: NodeConfig,\n ) {\n super(connectionPoolService, eventEmitter);\n this.nodeConfig = nodeConfig;\n }\n\n async init(): Promise<StellarApiService> {\n let network: StellarProjectNetworkConfig;\n try {\n network = this.project.network;\n } catch (e) {\n exitWithError(new Error(`Failed to init api`, { cause: e }), logger);\n }\n\n if (this.nodeConfig.primaryNetworkEndpoint) {\n const [endpoint, config] = this.nodeConfig.primaryNetworkEndpoint;\n (network.endpoint as Record<string, IEndpointConfig>)[endpoint] = config;\n }\n\n const sorobanEndpoint: string | undefined = network.sorobanEndpoint;\n\n if (!network.sorobanEndpoint && sorobanEndpoint) {\n //update sorobanEndpoint from parent project\n this.project.network.sorobanEndpoint = sorobanEndpoint;\n }\n\n if (\n dsHasSorobanEventHandler([\n ...this.project.dataSources,\n ...(this.project.templates as SubqlDatasource[]),\n ]) &&\n !sorobanEndpoint\n ) {\n throw new Error(\n `Soroban network endpoint must be provided for network. chainId=\"${this.project.network.chainId}\"`,\n );\n }\n\n const sorobanClient = sorobanEndpoint\n ? new SorobanServer(sorobanEndpoint)\n : undefined;\n\n await this.createConnections(network, (endpoint, config) =>\n StellarApiConnection.create(\n endpoint,\n this.fetchBlockBatches,\n this.eventEmitter,\n sorobanClient,\n config,\n ),\n );\n\n return this;\n }\n\n get api(): StellarApi {\n return this.unsafeApi;\n }\n\n safeApi(height: number): SafeStellarProvider {\n const maxRetries = 5;\n\n const handler: ProxyHandler<SafeStellarProvider> = {\n get: (target, prop, receiver) => {\n const originalMethod = target[prop as keyof SafeStellarProvider];\n if (typeof originalMethod === 'function') {\n return async (\n ...args: any[]\n ): Promise<ReturnType<typeof originalMethod>> => {\n let retries = 0;\n let currentApi = target;\n let throwingError: Error | undefined;\n\n while (retries < maxRetries) {\n try {\n return await originalMethod.apply(currentApi, args);\n } catch (error: any) {\n logger.warn(\n `Request failed with api at height ${height} (retry ${retries}): ${error.message}`,\n );\n throwingError = error;\n currentApi = this.unsafeApi.getSafeApi(height);\n retries++;\n }\n }\n\n logger.error(\n `Maximum retries (${maxRetries}) exceeded for api at height ${height}`,\n );\n if (!throwingError) {\n throw new Error('Failed to make request, maximum retries failed');\n }\n throw throwingError;\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n };\n\n return new Proxy(this.unsafeApi.getSafeApi(height), handler);\n }\n\n private async fetchBlockBatches(\n api: StellarApi,\n batch: number[],\n ): Promise<IBlock<StellarBlockWrapper>[]> {\n return api.fetchBlocks(batch);\n }\n}\n"]}
|
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
6
6
|
const testing_1 = require("@nestjs/testing");
|
|
7
|
+
const stellar_sdk_1 = require("@stellar/stellar-sdk");
|
|
7
8
|
const node_core_1 = require("@subql/node-core");
|
|
8
9
|
const dist_1 = require("@subql/node-core/dist");
|
|
9
10
|
const graphql_1 = require("graphql");
|
|
10
11
|
const lodash_1 = require("lodash");
|
|
11
|
-
const stellar_sdk_1 = require("stellar-sdk");
|
|
12
12
|
const api_service_stellar_1 = require("./api.service.stellar");
|
|
13
13
|
const api_stellar_1 = require("./api.stellar");
|
|
14
14
|
const HTTP_ENDPOINT = 'https://horizon-futurenet.stellar.org';
|
|
@@ -115,7 +115,7 @@ describe.skip('testnet StellarApiService', () => {
|
|
|
115
115
|
const blocks = await apiService.fetchBlocks([228236]);
|
|
116
116
|
expect(blocks).toBeDefined();
|
|
117
117
|
const block228236 = blocks[0];
|
|
118
|
-
const transferEvent = block228236.block.events
|
|
118
|
+
const transferEvent = block228236.block.events?.find((e) => e.id === '0000980266155778048-0000000001');
|
|
119
119
|
const [sys, from, to] = transferEvent.topic;
|
|
120
120
|
const decodedFrom = (0, stellar_sdk_1.scValToNative)(from).toString();
|
|
121
121
|
const decodedTo = (0, stellar_sdk_1.scValToNative)(to).toString();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.service.stellar.spec.js","sourceRoot":"","sources":["../../src/stellar/api.service.stellar.spec.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAGnC,yDAA2D;AAC3D,6CAAuC;AACvC,gDAA4E;AAC5E,gDAAmE;AACnE,qCAAwC;AACxC,mCAAqC;
|
|
1
|
+
{"version":3,"file":"api.service.stellar.spec.js","sourceRoot":"","sources":["../../src/stellar/api.service.stellar.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 { EventEmitterModule } from '@nestjs/event-emitter';\nimport { Test } from '@nestjs/testing';\nimport { scValToNative } from '@stellar/stellar-sdk';\nimport { ConnectionPoolService, delay, NodeConfig } from '@subql/node-core';\nimport { ConnectionPoolStateManager } from '@subql/node-core/dist';\nimport { GraphQLSchema } from 'graphql';\nimport { range, some } from 'lodash';\nimport { SubqueryProject } from '../configure/SubqueryProject';\nimport { StellarApiService } from './api.service.stellar';\nimport { StellarApi } from './api.stellar';\nimport { StellarBlockWrapped } from './block.stellar';\n\nconst HTTP_ENDPOINT = 'https://horizon-futurenet.stellar.org';\nconst SOROBAN_ENDPOINT = 'https://rpc-futurenet.stellar.org';\n\nfunction testSubqueryProject(\n endpoint: string,\n sorobanEndpoint: string,\n): SubqueryProject {\n return {\n network: {\n endpoint: [endpoint],\n sorobanEndpoint,\n chainId: 'Test SDF Future Network ; October 2022',\n },\n dataSources: [],\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: [],\n } as unknown as SubqueryProject;\n}\n\nconst prepareApiService = async (\n endpoint: string = HTTP_ENDPOINT,\n soroban: string = SOROBAN_ENDPOINT,\n project?: SubqueryProject,\n): Promise<[StellarApiService, INestApplication]> => {\n const module = await Test.createTestingModule({\n providers: [\n ConnectionPoolService,\n ConnectionPoolStateManager,\n {\n provide: 'IProjectUpgradeService',\n useFactory: () => ({}),\n },\n {\n provide: NodeConfig,\n useFactory: () => ({}),\n },\n {\n provide: 'ISubqueryProject',\n useFactory: () => project ?? testSubqueryProject(endpoint, soroban),\n },\n StellarApiService,\n ],\n imports: [EventEmitterModule.forRoot()],\n }).compile();\n\n const app = module.createNestApplication();\n await app.init();\n const apiService = app.get(StellarApiService);\n await apiService.init();\n return [apiService, app];\n};\n\njest.setTimeout(90000);\ndescribe('StellarApiService', () => {\n let apiService: StellarApiService;\n let app: INestApplication;\n\n beforeEach(async () => {\n [apiService, app] = await prepareApiService();\n });\n\n it('should instantiate api', () => {\n expect(apiService.api).toBeInstanceOf(StellarApi);\n });\n\n it('should fetch blocks', async () => {\n const latestHeight = await apiService.api.getFinalizedBlockHeight();\n const blocks = await apiService.fetchBlocks(\n range(latestHeight - 1, latestHeight),\n );\n expect(blocks).toBeDefined();\n expect(blocks[0].block.block.sequence).toEqual(latestHeight - 1);\n });\n\n it('should throw error when chainId does not match', async () => {\n const faultyProject = {\n ...testSubqueryProject(HTTP_ENDPOINT, SOROBAN_ENDPOINT),\n network: {\n ...testSubqueryProject(HTTP_ENDPOINT, SOROBAN_ENDPOINT).network,\n chainId: 'Incorrect ChainId',\n },\n };\n\n await expect(\n prepareApiService(\n HTTP_ENDPOINT,\n SOROBAN_ENDPOINT,\n faultyProject as unknown as SubqueryProject,\n ),\n ).rejects.toThrow();\n });\n\n it('fails after maximum retries', async () => {\n const api = apiService.unsafeApi;\n\n // Mock the fetchBlocks method to always throw an error\n (api as any).fetchBlocks = jest\n .fn()\n .mockRejectedValue(new Error('Network error'));\n\n await expect(\n (api as any).fetchBlocks(range(50000, 50100)),\n ).rejects.toThrow();\n });\n});\n\n// Skip test as rpc is pruned and block can be missing,\n// To test this, find any block with transfer event first\ndescribe.skip('testnet StellarApiService', () => {\n let apiService: StellarApiService;\n let app: INestApplication;\n\n function testSubqueryProject2(\n endpoint: string,\n sorobanEndpoint: string,\n ): SubqueryProject {\n return {\n network: {\n endpoint: [endpoint],\n sorobanEndpoint,\n chainId: 'Test SDF Network ; September 2015',\n },\n dataSources: [],\n id: 'test',\n root: './',\n schema: new GraphQLSchema({}),\n templates: [],\n } as unknown as SubqueryProject;\n }\n\n beforeEach(async () => {\n [apiService, app] = await prepareApiService(\n 'https://horizon-testnet.stellar.org',\n 'https://soroban-testnet.stellar.org',\n testSubqueryProject2(\n 'https://horizon-testnet.stellar.org',\n 'https://soroban-testnet.stellar.org',\n ),\n );\n });\n\n it('should fetch blocks, and decode address', async () => {\n const blocks = await apiService.fetchBlocks([228236]);\n expect(blocks).toBeDefined();\n\n const block228236 = blocks[0];\n const transferEvent = block228236.block.events?.find(\n (e) => e.id === '0000980266155778048-0000000001',\n );\n\n const [sys, from, to] = transferEvent!.topic;\n const decodedFrom = scValToNative(from).toString();\n const decodedTo = scValToNative(to).toString();\n\n console.log(scValToNative(sys));\n console.log(decodedFrom);\n console.log(decodedTo);\n });\n});\n"]}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
2
|
+
import { Horizon } from '@stellar/stellar-sdk';
|
|
2
3
|
import { IBlock } from '@subql/node-core';
|
|
3
|
-
import { ApiWrapper, SorobanEvent, StellarBlockWrapper } from '@subql/types-stellar';
|
|
4
|
-
import { Server, ServerApi } from 'stellar-sdk/lib/horizon';
|
|
4
|
+
import { ApiWrapper, SorobanEvent, StellarBlockWrapper, IStellarEndpointConfig } from '@subql/types-stellar';
|
|
5
5
|
import SafeStellarProvider from './safe-api';
|
|
6
6
|
import { SorobanServer } from './soroban.server';
|
|
7
7
|
export declare class StellarApi implements ApiWrapper {
|
|
8
8
|
private endpoint;
|
|
9
9
|
private eventEmitter;
|
|
10
|
-
private
|
|
10
|
+
private _sorobanClient?;
|
|
11
|
+
private config?;
|
|
11
12
|
private stellarClient;
|
|
12
|
-
private chainId
|
|
13
|
-
|
|
14
|
-
constructor(endpoint: string, eventEmitter: EventEmitter2, sorobanClient?: SorobanServer);
|
|
13
|
+
private chainId?;
|
|
14
|
+
constructor(endpoint: string, eventEmitter: EventEmitter2, _sorobanClient?: SorobanServer | undefined, config?: IStellarEndpointConfig | undefined);
|
|
15
15
|
init(): Promise<void>;
|
|
16
|
-
|
|
16
|
+
get sorobanClient(): SorobanServer;
|
|
17
|
+
getFinalizedBlock(): Promise<Horizon.ServerApi.LedgerRecord>;
|
|
17
18
|
getFinalizedBlockHeight(): Promise<number>;
|
|
18
19
|
getBestBlockHeight(): Promise<number>;
|
|
19
20
|
getRuntimeChain(): string;
|
|
@@ -31,7 +32,7 @@ export declare class StellarApi implements ApiWrapper {
|
|
|
31
32
|
private wrapTransactionsForLedger;
|
|
32
33
|
private fetchAndWrapLedger;
|
|
33
34
|
fetchBlocks(bufferBlocks: number[]): Promise<IBlock<StellarBlockWrapper>[]>;
|
|
34
|
-
get api(): Server;
|
|
35
|
+
get api(): Horizon.Server;
|
|
35
36
|
getSafeApi(blockHeight: number): SafeStellarProvider;
|
|
36
37
|
connect(): Promise<void>;
|
|
37
38
|
disconnect(): Promise<void>;
|
|
@@ -6,6 +6,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
6
6
|
};
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.StellarApi = void 0;
|
|
9
|
+
const assert_1 = __importDefault(require("assert"));
|
|
9
10
|
const node_core_1 = require("@subql/node-core");
|
|
10
11
|
const lodash_1 = require("lodash");
|
|
11
12
|
const block_stellar_1 = require("../stellar/block.stellar");
|
|
@@ -18,21 +19,25 @@ const logger = (0, node_core_1.getLogger)('api.Stellar');
|
|
|
18
19
|
class StellarApi {
|
|
19
20
|
endpoint;
|
|
20
21
|
eventEmitter;
|
|
21
|
-
|
|
22
|
+
_sorobanClient;
|
|
23
|
+
config;
|
|
22
24
|
//private client: Server;
|
|
23
25
|
stellarClient;
|
|
24
26
|
chainId;
|
|
25
|
-
|
|
26
|
-
constructor(endpoint, eventEmitter, sorobanClient) {
|
|
27
|
+
constructor(endpoint, eventEmitter, _sorobanClient, config) {
|
|
27
28
|
this.endpoint = endpoint;
|
|
28
29
|
this.eventEmitter = eventEmitter;
|
|
29
|
-
this.
|
|
30
|
+
this._sorobanClient = _sorobanClient;
|
|
31
|
+
this.config = config;
|
|
30
32
|
const { hostname, protocol, searchParams } = new URL(this.endpoint);
|
|
31
33
|
const protocolStr = protocol.replace(':', '');
|
|
32
34
|
logger.info(`Api host: ${hostname}, method: ${protocolStr}`);
|
|
33
35
|
if (protocolStr === 'https' || protocolStr === 'http') {
|
|
34
36
|
const options = {
|
|
35
37
|
allowHttp: protocolStr === 'http',
|
|
38
|
+
headers: {
|
|
39
|
+
...config?.headers,
|
|
40
|
+
},
|
|
36
41
|
};
|
|
37
42
|
this.stellarClient = new stellar_server_1.StellarServer(endpoint, options);
|
|
38
43
|
}
|
|
@@ -46,6 +51,10 @@ class StellarApi {
|
|
|
46
51
|
this.chainId = (await this.stellarClient.getNetwork()).network_passphrase;
|
|
47
52
|
//this.genesisHash = genesisLedger.hash;
|
|
48
53
|
}
|
|
54
|
+
get sorobanClient() {
|
|
55
|
+
(0, assert_1.default)(this._sorobanClient, 'Soraban client is not initialized');
|
|
56
|
+
return this._sorobanClient;
|
|
57
|
+
}
|
|
49
58
|
async getFinalizedBlock() {
|
|
50
59
|
return (await this.stellarClient.ledgers().order('desc').call()).records[0];
|
|
51
60
|
}
|
|
@@ -56,12 +65,15 @@ class StellarApi {
|
|
|
56
65
|
return (await this.getFinalizedBlockHeight()) + 1;
|
|
57
66
|
}
|
|
58
67
|
getRuntimeChain() {
|
|
59
|
-
|
|
68
|
+
(0, assert_1.default)(this.chainId, 'Api has not been initialised');
|
|
69
|
+
return this.chainId;
|
|
60
70
|
}
|
|
61
71
|
getChainId() {
|
|
72
|
+
(0, assert_1.default)(this.chainId, 'Api has not been initialised');
|
|
62
73
|
return this.chainId;
|
|
63
74
|
}
|
|
64
75
|
getGenesisHash() {
|
|
76
|
+
(0, assert_1.default)(this.chainId, 'Api has not been initialised');
|
|
65
77
|
return this.chainId;
|
|
66
78
|
}
|
|
67
79
|
getSpecName() {
|
|
@@ -264,7 +276,7 @@ class StellarApi {
|
|
|
264
276
|
}
|
|
265
277
|
getSafeApi(blockHeight) {
|
|
266
278
|
//safe api not implemented yet
|
|
267
|
-
return new safe_api_1.default(
|
|
279
|
+
return new safe_api_1.default(this.sorobanClient, blockHeight);
|
|
268
280
|
}
|
|
269
281
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
270
282
|
async connect() {
|