@sentio/runtime 1.37.0-rc.6 → 1.37.0-rc.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/lib/chain-config.d.ts +6 -0
  2. package/lib/chain-config.js +3 -0
  3. package/lib/chain-config.js.map +1 -0
  4. package/lib/endpoints.d.ts +8 -0
  5. package/lib/endpoints.js +15 -0
  6. package/lib/endpoints.js.map +1 -0
  7. package/lib/full-service.d.ts +276 -0
  8. package/lib/full-service.js +47 -0
  9. package/lib/full-service.js.map +1 -0
  10. package/lib/gen/{src/google → google}/protobuf/timestamp.d.ts +1 -1
  11. package/lib/gen/{src/google → google}/protobuf/timestamp.js +4 -4
  12. package/lib/gen/google/protobuf/timestamp.js.map +1 -0
  13. package/lib/index.d.ts +7 -0
  14. package/lib/index.js +24 -0
  15. package/lib/index.js.map +1 -0
  16. package/lib/loader.d.ts +5 -0
  17. package/lib/loader.js +30 -0
  18. package/lib/loader.js.map +1 -0
  19. package/lib/plugin.d.ts +19 -0
  20. package/lib/plugin.js +50 -0
  21. package/lib/plugin.js.map +1 -0
  22. package/lib/processor-runner.d.ts +2 -0
  23. package/lib/processor-runner.js +104 -0
  24. package/lib/processor-runner.js.map +1 -0
  25. package/lib/provider.d.ts +6 -0
  26. package/lib/provider.js +67 -0
  27. package/lib/provider.js.map +1 -0
  28. package/lib/service.d.ts +20 -0
  29. package/lib/service.js +120 -0
  30. package/lib/service.js.map +1 -0
  31. package/lib/service.test.d.ts +2 -0
  32. package/lib/service.test.js.map +1 -0
  33. package/lib/state-storage.test.d.ts +1 -0
  34. package/lib/state-storage.test.js.map +1 -0
  35. package/lib/state.d.ts +22 -0
  36. package/lib/state.js +68 -0
  37. package/lib/state.js.map +1 -0
  38. package/lib/utils.d.ts +4 -0
  39. package/lib/utils.js +22 -0
  40. package/lib/utils.js.map +1 -0
  41. package/package.json +4 -5
  42. package/src/chain-config.ts +6 -0
  43. package/src/endpoints.ts +14 -0
  44. package/src/full-service.ts +61 -0
  45. package/src/gen/{src/google → google}/protobuf/timestamp.ts +45 -40
  46. package/src/index.ts +7 -0
  47. package/src/loader.ts +24 -0
  48. package/src/plugin.ts +53 -0
  49. package/src/processor-runner.ts +97 -0
  50. package/src/provider.ts +75 -0
  51. package/src/service.ts +145 -0
  52. package/src/state.ts +75 -0
  53. package/src/utils.ts +20 -0
  54. package/lib/gen/src/google/protobuf/timestamp.js.map +0 -1
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ const path_1 = __importDefault(require("path"));
31
+ const fs_extra_1 = __importDefault(require("fs-extra"));
32
+ const util = __importStar(require("util"));
33
+ const command_line_args_1 = __importDefault(require("command-line-args"));
34
+ const nice_grpc_1 = require("nice-grpc");
35
+ const winston_1 = require("winston");
36
+ const compression_algorithms_1 = require("@grpc/grpc-js/build/src/compression-algorithms");
37
+ const protos_1 = require("@sentio/protos");
38
+ const service_1 = require("./service");
39
+ const provider_1 = require("./provider");
40
+ const state_1 = require("./state");
41
+ const endpoints_1 = require("./endpoints");
42
+ const loader_1 = require("./loader");
43
+ const full_service_1 = require("./full-service");
44
+ state_1.State.reset();
45
+ endpoints_1.Endpoints.reset();
46
+ const optionDefinitions = [
47
+ { name: 'target', type: String, defaultOption: true },
48
+ { name: 'port', alias: 'p', type: String, defaultValue: '4000' },
49
+ { name: 'concurrency', type: Number, defaultValue: 4 },
50
+ { name: 'use-chainserver', type: Boolean, defaultValue: false },
51
+ {
52
+ name: 'chains-config',
53
+ alias: 'c',
54
+ type: String,
55
+ defaultValue: 'chains-config.json',
56
+ },
57
+ { name: 'chainquery-server', type: String, defaultValue: '' },
58
+ { name: 'pricefeed-server', type: String, defaultValue: '' },
59
+ { name: 'log-format', type: String, defaultValue: 'console' },
60
+ { name: 'debug', type: Boolean, defaultValue: false },
61
+ ];
62
+ const options = (0, command_line_args_1.default)(optionDefinitions, { partial: true });
63
+ if (options['log-format'] === 'json') {
64
+ const utilFormatter = {
65
+ transform: (info) => {
66
+ const args = info[Symbol.for('splat')];
67
+ if (args) {
68
+ info.message = util.format(info.message, ...args);
69
+ }
70
+ return info;
71
+ },
72
+ };
73
+ const logger = (0, winston_1.createLogger)({
74
+ format: winston_1.format.combine(winston_1.format.timestamp({ format: 'YYYY-MM-DDTHH:mm:ssZ' }), utilFormatter, winston_1.format.errors({ stack: true }), winston_1.format.json()),
75
+ transports: [new winston_1.transports.Console()],
76
+ });
77
+ console.log = (...args) => logger.info.call(logger, ...args);
78
+ console.info = (...args) => logger.info.call(logger, ...args);
79
+ console.warn = (...args) => logger.warn.call(logger, ...args);
80
+ console.error = (...args) => logger.error.call(logger, ...args);
81
+ console.debug = (...args) => logger.debug.call(logger, ...args);
82
+ }
83
+ if (options.debug) {
84
+ console.log('Starting with', options.target);
85
+ }
86
+ const fullPath = path_1.default.resolve(options['chains-config']);
87
+ const chainsConfig = fs_extra_1.default.readJsonSync(fullPath);
88
+ (0, provider_1.setProvider)(chainsConfig, options.concurrency, options['use-chainserver']);
89
+ endpoints_1.Endpoints.INSTANCE.chainQueryAPI = options['chainquery-server'];
90
+ endpoints_1.Endpoints.INSTANCE.priceFeedAPI = options['pricefeed-server'];
91
+ if (options.debug) {
92
+ console.log('Starting Server', options);
93
+ }
94
+ const server = (0, nice_grpc_1.createServer)({
95
+ 'grpc.max_send_message_length': 128 * 1024 * 1024,
96
+ 'grpc.max_receive_message_length': 128 * 1024 * 1024,
97
+ 'grpc.default_compression_algorithm': compression_algorithms_1.CompressionAlgorithms.gzip,
98
+ });
99
+ const baseService = new service_1.ProcessorServiceImpl(() => (0, loader_1.load)(options.target), server.shutdown);
100
+ const service = new full_service_1.FullProcessorServiceImpl(baseService);
101
+ server.add(protos_1.ProcessorDefinition, service);
102
+ server.listen('0.0.0.0:' + options.port);
103
+ console.log('Processor Server Started');
104
+ //# sourceMappingURL=processor-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor-runner.js","sourceRoot":"","sources":["../src/processor-runner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,gDAAuB;AACvB,wDAAyB;AACzB,2CAA4B;AAE5B,0EAA+C;AAC/C,yCAAwC;AACxC,qCAA0D;AAC1D,2FAAsF;AAEtF,2CAAoD;AACpD,uCAAgD;AAChD,yCAAwC;AACxC,mCAA+B;AAC/B,2CAAuC;AAEvC,qCAA+B;AAC/B,iDAAyD;AAEzD,aAAK,CAAC,KAAK,EAAE,CAAA;AACb,qBAAS,CAAC,KAAK,EAAE,CAAA;AAEjB,MAAM,iBAAiB,GAAG;IACxB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE;IACrD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE;IAChE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE;IACtD,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE;IAC/D;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,oBAAoB;KACnC;IACD,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE;IAC7D,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE;IAC5D,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE;IAC7D,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE;CACtD,CAAA;AAED,MAAM,OAAO,GAAG,IAAA,2BAAe,EAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAErE,IAAI,OAAO,CAAC,YAAY,CAAC,KAAK,MAAM,EAAE;IACpC,MAAM,aAAa,GAAG;QACpB,SAAS,EAAE,CAAC,IAAS,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;YACtC,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA;aAClD;YACD,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;IACD,MAAM,MAAM,GAAG,IAAA,sBAAY,EAAC;QAC1B,MAAM,EAAE,gBAAM,CAAC,OAAO,CACpB,gBAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,EACpD,aAAa,EACb,gBAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAC9B,gBAAM,CAAC,IAAI,EAAE,CACd;QACD,UAAU,EAAE,CAAC,IAAI,oBAAU,CAAC,OAAO,EAAE,CAAC;KACvC,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;IAC5D,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;IAC7D,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;IAC7D,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;IAC/D,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;CAChE;AACD,IAAI,OAAO,CAAC,KAAK,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;CAC7C;AAED,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAA;AACvD,MAAM,YAAY,GAAG,kBAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;AAE9C,IAAA,sBAAW,EAAC,YAAY,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAC1E,qBAAS,CAAC,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAC/D,qBAAS,CAAC,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;AAE7D,IAAI,OAAO,CAAC,KAAK,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;CACxC;AAED,MAAM,MAAM,GAAG,IAAA,wBAAY,EAAC;IAC1B,8BAA8B,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IACjD,iCAAiC,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;IACpD,oCAAoC,EAAE,8CAAqB,CAAC,IAAI;CACjE,CAAC,CAAA;AAEF,MAAM,WAAW,GAAG,IAAI,8BAAoB,CAAC,GAAG,EAAE,CAAC,IAAA,aAAI,EAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;AACzF,MAAM,OAAO,GAAG,IAAI,uCAAwB,CAAC,WAAW,CAAC,CAAA;AAEzD,MAAM,CAAC,GAAG,CAAC,4BAAmB,EAAE,OAAO,CAAC,CAAA;AAExC,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAExC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA","sourcesContent":["#!/usr/bin/env node\n\nimport path from 'path'\nimport fs from 'fs-extra'\nimport * as util from 'util'\n\nimport commandLineArgs from 'command-line-args'\nimport { createServer } from 'nice-grpc'\nimport { createLogger, transports, format } from 'winston'\nimport { CompressionAlgorithms } from '@grpc/grpc-js/build/src/compression-algorithms'\n\nimport { ProcessorDefinition } from '@sentio/protos'\nimport { ProcessorServiceImpl } from './service'\nimport { setProvider } from './provider'\nimport { State } from './state'\nimport { Endpoints } from './endpoints'\n\nimport { load } from './loader'\nimport { FullProcessorServiceImpl } from './full-service'\n\nState.reset()\nEndpoints.reset()\n\nconst optionDefinitions = [\n { name: 'target', type: String, defaultOption: true },\n { name: 'port', alias: 'p', type: String, defaultValue: '4000' },\n { name: 'concurrency', type: Number, defaultValue: 4 },\n { name: 'use-chainserver', type: Boolean, defaultValue: false },\n {\n name: 'chains-config',\n alias: 'c',\n type: String,\n defaultValue: 'chains-config.json',\n },\n { name: 'chainquery-server', type: String, defaultValue: '' },\n { name: 'pricefeed-server', type: String, defaultValue: '' },\n { name: 'log-format', type: String, defaultValue: 'console' },\n { name: 'debug', type: Boolean, defaultValue: false },\n]\n\nconst options = commandLineArgs(optionDefinitions, { partial: true })\n\nif (options['log-format'] === 'json') {\n const utilFormatter = {\n transform: (info: any) => {\n const args = info[Symbol.for('splat')]\n if (args) {\n info.message = util.format(info.message, ...args)\n }\n return info\n },\n }\n const logger = createLogger({\n format: format.combine(\n format.timestamp({ format: 'YYYY-MM-DDTHH:mm:ssZ' }),\n utilFormatter,\n format.errors({ stack: true }),\n format.json()\n ),\n transports: [new transports.Console()],\n })\n\n console.log = (...args) => logger.info.call(logger, ...args)\n console.info = (...args) => logger.info.call(logger, ...args)\n console.warn = (...args) => logger.warn.call(logger, ...args)\n console.error = (...args) => logger.error.call(logger, ...args)\n console.debug = (...args) => logger.debug.call(logger, ...args)\n}\nif (options.debug) {\n console.log('Starting with', options.target)\n}\n\nconst fullPath = path.resolve(options['chains-config'])\nconst chainsConfig = fs.readJsonSync(fullPath)\n\nsetProvider(chainsConfig, options.concurrency, options['use-chainserver'])\nEndpoints.INSTANCE.chainQueryAPI = options['chainquery-server']\nEndpoints.INSTANCE.priceFeedAPI = options['pricefeed-server']\n\nif (options.debug) {\n console.log('Starting Server', options)\n}\n\nconst server = createServer({\n 'grpc.max_send_message_length': 128 * 1024 * 1024,\n 'grpc.max_receive_message_length': 128 * 1024 * 1024,\n 'grpc.default_compression_algorithm': CompressionAlgorithms.gzip,\n})\n\nconst baseService = new ProcessorServiceImpl(() => load(options.target), server.shutdown)\nconst service = new FullProcessorServiceImpl(baseService)\n\nserver.add(ProcessorDefinition, service)\n\nserver.listen('0.0.0.0:' + options.port)\n\nconsole.log('Processor Server Started')\n"]}
@@ -0,0 +1,6 @@
1
+ import { Provider, StaticJsonRpcProvider } from '@ethersproject/providers';
2
+ import { Networkish } from '@ethersproject/networks';
3
+ import { ChainConfig } from './chain-config';
4
+ export declare const DummyProvider: StaticJsonRpcProvider;
5
+ export declare function getProvider(networkish?: Networkish): Provider;
6
+ export declare function setProvider(config: Record<string, ChainConfig>, concurrency?: number, useChainServer?: boolean): void;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setProvider = exports.getProvider = exports.DummyProvider = void 0;
7
+ const providers_1 = require("@ethersproject/providers");
8
+ const p_queue_1 = __importDefault(require("p-queue"));
9
+ const endpoints_1 = require("./endpoints");
10
+ exports.DummyProvider = new providers_1.StaticJsonRpcProvider(undefined, 1);
11
+ function getProvider(networkish) {
12
+ if (!networkish) {
13
+ networkish = 1;
14
+ }
15
+ const network = (0, providers_1.getNetwork)(networkish);
16
+ if (!endpoints_1.Endpoints.INSTANCE.providers) {
17
+ throw Error('Provider not set');
18
+ }
19
+ const value = endpoints_1.Endpoints.INSTANCE.providers.get(network.chainId);
20
+ if (value === undefined) {
21
+ throw Error('Provider not found for chain ' +
22
+ network.chainId +
23
+ ', configured chains: ' +
24
+ [...endpoints_1.Endpoints.INSTANCE.providers.keys()].join(' '));
25
+ }
26
+ return value;
27
+ }
28
+ exports.getProvider = getProvider;
29
+ function setProvider(config, concurrency = 4, useChainServer = false) {
30
+ endpoints_1.Endpoints.INSTANCE.providers = new Map();
31
+ for (const chainIdStr in config) {
32
+ if (isNaN(Number.parseInt(chainIdStr))) {
33
+ continue;
34
+ }
35
+ const chainConfig = config[chainIdStr];
36
+ const chainId = Number(chainIdStr);
37
+ // let providers: StaticJsonRpcProvider[] = []
38
+ // for (const http of chainConfig.Https) {
39
+ // providers.push(new StaticJsonRpcProvider(http, chainId))
40
+ // }
41
+ // random shuffle
42
+ // providers = providers.sort(() => Math.random() - 0.5)
43
+ // const provider = new FallbackProvider(providers)
44
+ let rpcAddress = '';
45
+ if (useChainServer && chainConfig.ChainServer) {
46
+ rpcAddress = chainConfig.ChainServer;
47
+ }
48
+ else {
49
+ const idx = Math.floor(Math.random() * chainConfig.Https.length);
50
+ rpcAddress = chainConfig.Https[idx];
51
+ }
52
+ const provider = new QueuedStaticJsonRpcProvider(rpcAddress, chainId, concurrency);
53
+ endpoints_1.Endpoints.INSTANCE.providers.set(chainId, provider);
54
+ }
55
+ }
56
+ exports.setProvider = setProvider;
57
+ class QueuedStaticJsonRpcProvider extends providers_1.StaticJsonRpcProvider {
58
+ executor;
59
+ constructor(url, network, concurrency) {
60
+ super(url, network);
61
+ this.executor = new p_queue_1.default({ concurrency: concurrency });
62
+ }
63
+ send(method, params) {
64
+ return this.executor.add(() => super.send(method, params));
65
+ }
66
+ }
67
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAsF;AAEtF,sDAA4B;AAG5B,2CAAuC;AAE1B,QAAA,aAAa,GAAG,IAAI,iCAAqB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;AAEpE,SAAgB,WAAW,CAAC,UAAuB;IACjD,IAAI,CAAC,UAAU,EAAE;QACf,UAAU,GAAG,CAAC,CAAA;KACf;IACD,MAAM,OAAO,GAAG,IAAA,sBAAU,EAAC,UAAU,CAAC,CAAA;IAEtC,IAAI,CAAC,qBAAS,CAAC,QAAQ,CAAC,SAAS,EAAE;QACjC,MAAM,KAAK,CAAC,kBAAkB,CAAC,CAAA;KAChC;IACD,MAAM,KAAK,GAAG,qBAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/D,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,MAAM,KAAK,CACT,+BAA+B;YAC7B,OAAO,CAAC,OAAO;YACf,uBAAuB;YACvB,CAAC,GAAG,qBAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACrD,CAAA;KACF;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAnBD,kCAmBC;AAED,SAAgB,WAAW,CAAC,MAAmC,EAAE,WAAW,GAAG,CAAC,EAAE,cAAc,GAAG,KAAK;IACtG,qBAAS,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAA;IAE1D,KAAK,MAAM,UAAU,IAAI,MAAM,EAAE;QAC/B,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE;YACtC,SAAQ;SACT;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;QACtC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;QAElC,8CAA8C;QAC9C,0CAA0C;QAC1C,6DAA6D;QAC7D,IAAI;QACJ,iBAAiB;QACjB,wDAAwD;QAExD,mDAAmD;QAEnD,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,cAAc,IAAI,WAAW,CAAC,WAAW,EAAE;YAC7C,UAAU,GAAG,WAAW,CAAC,WAAW,CAAA;SACrC;aAAM;YACL,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YAChE,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;SACpC;QAED,MAAM,QAAQ,GAAG,IAAI,2BAA2B,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;QAClF,qBAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;KACpD;AACH,CAAC;AA/BD,kCA+BC;AAED,MAAM,2BAA4B,SAAQ,iCAAqB;IAC7D,QAAQ,CAAQ;IAEhB,YAAY,GAA4B,EAAE,OAAmB,EAAE,WAAmB;QAChF,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,MAAkB;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC5D,CAAC;CACF","sourcesContent":["import { getNetwork, Provider, StaticJsonRpcProvider } from '@ethersproject/providers'\nimport { Networkish } from '@ethersproject/networks'\nimport PQueue from 'p-queue'\nimport { ConnectionInfo } from '@ethersproject/web'\nimport { ChainConfig } from './chain-config'\nimport { Endpoints } from './endpoints'\n\nexport const DummyProvider = new StaticJsonRpcProvider(undefined, 1)\n\nexport function getProvider(networkish?: Networkish): Provider {\n if (!networkish) {\n networkish = 1\n }\n const network = getNetwork(networkish)\n\n if (!Endpoints.INSTANCE.providers) {\n throw Error('Provider not set')\n }\n const value = Endpoints.INSTANCE.providers.get(network.chainId)\n if (value === undefined) {\n throw Error(\n 'Provider not found for chain ' +\n network.chainId +\n ', configured chains: ' +\n [...Endpoints.INSTANCE.providers.keys()].join(' ')\n )\n }\n return value\n}\n\nexport function setProvider(config: Record<string, ChainConfig>, concurrency = 4, useChainServer = false) {\n Endpoints.INSTANCE.providers = new Map<number, Provider>()\n\n for (const chainIdStr in config) {\n if (isNaN(Number.parseInt(chainIdStr))) {\n continue\n }\n\n const chainConfig = config[chainIdStr]\n const chainId = Number(chainIdStr)\n\n // let providers: StaticJsonRpcProvider[] = []\n // for (const http of chainConfig.Https) {\n // providers.push(new StaticJsonRpcProvider(http, chainId))\n // }\n // random shuffle\n // providers = providers.sort(() => Math.random() - 0.5)\n\n // const provider = new FallbackProvider(providers)\n\n let rpcAddress = ''\n if (useChainServer && chainConfig.ChainServer) {\n rpcAddress = chainConfig.ChainServer\n } else {\n const idx = Math.floor(Math.random() * chainConfig.Https.length)\n rpcAddress = chainConfig.Https[idx]\n }\n\n const provider = new QueuedStaticJsonRpcProvider(rpcAddress, chainId, concurrency)\n Endpoints.INSTANCE.providers.set(chainId, provider)\n }\n}\n\nclass QueuedStaticJsonRpcProvider extends StaticJsonRpcProvider {\n executor: PQueue\n\n constructor(url: ConnectionInfo | string, network: Networkish, concurrency: number) {\n super(url, network)\n this.executor = new PQueue({ concurrency: concurrency })\n }\n\n send(method: string, params: Array<any>): Promise<any> {\n return this.executor.add(() => super.send(method, params))\n }\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import { CallContext } from 'nice-grpc';
2
+ import { DataBinding, ProcessBindingResponse, ProcessBindingsRequest, ProcessConfigRequest, ProcessConfigResponse, ProcessorServiceImplementation, ProcessResult, StartRequest } from '@sentio/protos';
3
+ import { Empty } from '@sentio/protos/lib/google/protobuf/empty';
4
+ export declare class ProcessorServiceImpl implements ProcessorServiceImplementation {
5
+ private started;
6
+ private processorConfig;
7
+ private readonly loader;
8
+ private readonly shutdownHandler?;
9
+ constructor(loader: () => void, shutdownHandler?: () => void);
10
+ getConfig(request: ProcessConfigRequest, context: CallContext): Promise<ProcessConfigResponse>;
11
+ configure(): Promise<void>;
12
+ start(request: StartRequest, context: CallContext): Promise<Empty>;
13
+ stop(request: Empty, context: CallContext): Promise<Empty>;
14
+ processBindings(request: ProcessBindingsRequest, options?: CallContext): Promise<ProcessBindingResponse>;
15
+ processBinding(request: DataBinding, options?: CallContext): Promise<ProcessResult>;
16
+ processBindingsStream(requests: AsyncIterable<DataBinding>, context: CallContext): AsyncGenerator<{
17
+ result: ProcessResult;
18
+ configUpdated: boolean;
19
+ }, void, unknown>;
20
+ }
package/lib/service.js ADDED
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProcessorServiceImpl = void 0;
4
+ const nice_grpc_1 = require("nice-grpc");
5
+ const protos_1 = require("@sentio/protos");
6
+ const plugin_1 = require("./plugin");
7
+ const utils_1 = require("./utils");
8
+ BigInt.prototype.toJSON = function () {
9
+ return this.toString();
10
+ };
11
+ class ProcessorServiceImpl {
12
+ started = false;
13
+ processorConfig;
14
+ loader;
15
+ shutdownHandler;
16
+ constructor(loader, shutdownHandler) {
17
+ this.loader = loader;
18
+ this.shutdownHandler = shutdownHandler;
19
+ }
20
+ async getConfig(request, context) {
21
+ if (!this.started) {
22
+ throw new nice_grpc_1.ServerError(nice_grpc_1.Status.UNAVAILABLE, 'Service Not started.');
23
+ }
24
+ if (!this.processorConfig) {
25
+ throw new nice_grpc_1.ServerError(nice_grpc_1.Status.INTERNAL, 'Process config empty.');
26
+ }
27
+ return this.processorConfig;
28
+ }
29
+ async configure() {
30
+ this.processorConfig = protos_1.ProcessConfigResponse.fromPartial({});
31
+ plugin_1.PluginManager.INSTANCE.configure(this.processorConfig);
32
+ }
33
+ async start(request, context) {
34
+ if (this.started) {
35
+ return {};
36
+ }
37
+ try {
38
+ for (const plugin of [
39
+ '@sentio/sdk/lib/core/core-plugin',
40
+ '@sentio/sdk/lib/core/eth-plugin',
41
+ '@sentio/sdk/lib/core/sui-plugin',
42
+ '@sentio/sdk-aptos/lib/aptos-plugin',
43
+ '@sentio/sdk-solana/lib/solana-plugin',
44
+ ]) {
45
+ try {
46
+ require(plugin);
47
+ }
48
+ catch (e) {
49
+ console.error('Failed to load plugin: ', plugin);
50
+ }
51
+ }
52
+ this.loader();
53
+ }
54
+ catch (e) {
55
+ throw new nice_grpc_1.ServerError(nice_grpc_1.Status.INVALID_ARGUMENT, 'Failed to load processor: ' + (0, utils_1.errorString)(e));
56
+ }
57
+ plugin_1.PluginManager.INSTANCE.start(request);
58
+ try {
59
+ await this.configure();
60
+ }
61
+ catch (e) {
62
+ throw new nice_grpc_1.ServerError(nice_grpc_1.Status.INTERNAL, 'Failed to start processor : ' + (0, utils_1.errorString)(e));
63
+ }
64
+ this.started = true;
65
+ return {};
66
+ }
67
+ async stop(request, context) {
68
+ console.log('Server Shutting down in 5 seconds');
69
+ if (this.shutdownHandler) {
70
+ setTimeout(this.shutdownHandler, 5000);
71
+ }
72
+ return {};
73
+ }
74
+ async processBindings(request, options) {
75
+ if (!this.started) {
76
+ throw new nice_grpc_1.ServerError(nice_grpc_1.Status.UNAVAILABLE, 'Service Not started.');
77
+ }
78
+ const promises = request.bindings.map((binding) => this.processBinding(binding));
79
+ const result = (0, utils_1.mergeProcessResults)(await Promise.all(promises));
80
+ let updated = false;
81
+ if (plugin_1.PluginManager.INSTANCE.stateDiff(this.processorConfig)) {
82
+ await this.configure();
83
+ updated = true;
84
+ }
85
+ return {
86
+ result,
87
+ configUpdated: updated,
88
+ };
89
+ }
90
+ async processBinding(request, options) {
91
+ const result = await plugin_1.PluginManager.INSTANCE.processBinding(request);
92
+ recordRuntimeInfo(result, request.handlerType);
93
+ return result;
94
+ }
95
+ async *processBindingsStream(requests, context) {
96
+ for await (const request of requests) {
97
+ const result = await this.processBinding(request);
98
+ let updated = false;
99
+ if (plugin_1.PluginManager.INSTANCE.stateDiff(this.processorConfig)) {
100
+ await this.configure();
101
+ updated = true;
102
+ }
103
+ yield {
104
+ result,
105
+ configUpdated: updated,
106
+ };
107
+ }
108
+ }
109
+ }
110
+ exports.ProcessorServiceImpl = ProcessorServiceImpl;
111
+ function recordRuntimeInfo(results, handlerType) {
112
+ for (const list of [results.gauges, results.counters, results.logs, results.events, results.exports]) {
113
+ list.forEach((e) => {
114
+ e.runtimeInfo = {
115
+ from: handlerType,
116
+ };
117
+ });
118
+ }
119
+ }
120
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { CallContext, ServerError, Status } from 'nice-grpc'\n\nimport {\n DataBinding,\n HandlerType,\n ProcessBindingResponse,\n ProcessBindingsRequest,\n ProcessConfigRequest,\n ProcessConfigResponse,\n ProcessorServiceImplementation,\n ProcessResult,\n StartRequest,\n} from '@sentio/protos'\n\nimport { Empty } from '@sentio/protos/lib/google/protobuf/empty'\n\nimport { PluginManager } from './plugin'\nimport { errorString, mergeProcessResults } from './utils'\n;(BigInt.prototype as any).toJSON = function () {\n return this.toString()\n}\n\nexport class ProcessorServiceImpl implements ProcessorServiceImplementation {\n private started = false\n private processorConfig: ProcessConfigResponse\n\n private readonly loader: () => void\n\n private readonly shutdownHandler?: () => void\n\n constructor(loader: () => void, shutdownHandler?: () => void) {\n this.loader = loader\n this.shutdownHandler = shutdownHandler\n }\n\n async getConfig(request: ProcessConfigRequest, context: CallContext): Promise<ProcessConfigResponse> {\n if (!this.started) {\n throw new ServerError(Status.UNAVAILABLE, 'Service Not started.')\n }\n if (!this.processorConfig) {\n throw new ServerError(Status.INTERNAL, 'Process config empty.')\n }\n return this.processorConfig\n }\n\n async configure() {\n this.processorConfig = ProcessConfigResponse.fromPartial({})\n PluginManager.INSTANCE.configure(this.processorConfig)\n }\n\n async start(request: StartRequest, context: CallContext): Promise<Empty> {\n if (this.started) {\n return {}\n }\n\n try {\n for (const plugin of [\n '@sentio/sdk/lib/core/core-plugin',\n '@sentio/sdk/lib/core/eth-plugin',\n '@sentio/sdk/lib/core/sui-plugin',\n '@sentio/sdk-aptos/lib/aptos-plugin',\n '@sentio/sdk-solana/lib/solana-plugin',\n ]) {\n try {\n require(plugin)\n } catch (e) {\n console.error('Failed to load plugin: ', plugin)\n }\n }\n\n this.loader()\n } catch (e) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Failed to load processor: ' + errorString(e))\n }\n\n PluginManager.INSTANCE.start(request)\n\n try {\n await this.configure()\n } catch (e) {\n throw new ServerError(Status.INTERNAL, 'Failed to start processor : ' + errorString(e))\n }\n this.started = true\n return {}\n }\n\n async stop(request: Empty, context: CallContext): Promise<Empty> {\n console.log('Server Shutting down in 5 seconds')\n if (this.shutdownHandler) {\n setTimeout(this.shutdownHandler, 5000)\n }\n return {}\n }\n\n async processBindings(request: ProcessBindingsRequest, options?: CallContext): Promise<ProcessBindingResponse> {\n if (!this.started) {\n throw new ServerError(Status.UNAVAILABLE, 'Service Not started.')\n }\n\n const promises = request.bindings.map((binding) => this.processBinding(binding))\n const result = mergeProcessResults(await Promise.all(promises))\n\n let updated = false\n if (PluginManager.INSTANCE.stateDiff(this.processorConfig)) {\n await this.configure()\n updated = true\n }\n\n return {\n result,\n configUpdated: updated,\n }\n }\n\n async processBinding(request: DataBinding, options?: CallContext): Promise<ProcessResult> {\n const result = await PluginManager.INSTANCE.processBinding(request)\n recordRuntimeInfo(result, request.handlerType)\n return result\n }\n\n async *processBindingsStream(requests: AsyncIterable<DataBinding>, context: CallContext) {\n for await (const request of requests) {\n const result = await this.processBinding(request)\n let updated = false\n if (PluginManager.INSTANCE.stateDiff(this.processorConfig)) {\n await this.configure()\n updated = true\n }\n yield {\n result,\n configUpdated: updated,\n }\n }\n }\n}\n\nfunction recordRuntimeInfo(results: ProcessResult, handlerType: HandlerType) {\n for (const list of [results.gauges, results.counters, results.logs, results.events, results.exports]) {\n list.forEach((e) => {\n e.runtimeInfo = {\n from: handlerType,\n }\n })\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { CallContext } from 'nice-grpc-common';
2
+ export declare const TEST_CONTEXT: CallContext;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.js","sourceRoot":"","sources":["../src/service.test.ts"],"names":[],"mappings":";;;AAAA,uCAAgD;AAChD,iDAAyD;AAEzD,2CAAwE;AACxE,qCAAgD;AAChD,+BAA6B;AAEhB,QAAA,YAAY,GAA6B,EAAE,CAAA;AAExD,gBAAgB;AAChB,MAAM,UAAW,SAAQ,eAAM;IAC7B,KAAK,CAAC,cAAc,CAAC,OAAoB;QACvC,IAAI,OAAO,CAAC,WAAW,KAAK,oBAAW,CAAC,OAAO,EAAE;YAC/C,IAAA,aAAM,EAAC,OAAO,CAAC,IAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;SACrC;QACD,OAAO,sBAAa,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IACtC,CAAC;IACD,iBAAiB,GAAG,CAAC,oBAAW,CAAC,OAAO,CAAC,CAAA;CAC1C;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,MAAM,WAAW,GAAG,IAAI,8BAAoB,CAAC,GAAG,EAAE;QAChD,sBAAa,CAAC,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAA;QACnC,sBAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,IAAI,uCAAwB,CAAC,WAAW,CAAC,CAAA;IAEzD,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,EAAE,oBAAY,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,QAAQ,GAAgB;YAC5B,IAAI,EAAE;gBACJ,GAAG,EAAE,IAAI,UAAU,EAAE;gBACrB,QAAQ,EAAE;oBACR,KAAK,EAAE;wBACL,MAAM,EAAE,KAAK;qBACd;iBACF;aACF;YACD,WAAW,EAAE,oBAAW,CAAC,OAAO;YAChC,UAAU,EAAE,CAAC,CAAC,CAAC;SAChB,CAAA;QAED,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,oBAAY,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { ProcessorServiceImpl } from './service'\nimport { FullProcessorServiceImpl } from './full-service'\nimport { CallContext } from 'nice-grpc-common'\nimport { DataBinding, HandlerType, ProcessResult } from '@sentio/protos'\nimport { Plugin, PluginManager } from './plugin'\nimport { assert } from 'chai'\n\nexport const TEST_CONTEXT: CallContext = <CallContext>{}\n\n// TODO use mock\nclass TestPlugin extends Plugin {\n async processBinding(request: DataBinding): Promise<ProcessResult> {\n if (request.handlerType === HandlerType.UNKNOWN) {\n assert(request.data!.raw.length > 0)\n }\n return ProcessResult.fromPartial({})\n }\n supportedHandlers = [HandlerType.UNKNOWN]\n}\n\ndescribe('Test Service Compatibility', () => {\n const baseService = new ProcessorServiceImpl(() => {\n PluginManager.INSTANCE.plugins = []\n PluginManager.INSTANCE.register(new TestPlugin())\n })\n const service = new FullProcessorServiceImpl(baseService)\n\n beforeAll(async () => {\n await service.start({ templateInstances: [] }, TEST_CONTEXT)\n })\n\n test('Check tictactoe transaction dispatch', async () => {\n const binding1: DataBinding = {\n data: {\n raw: new Uint8Array(),\n ethBlock: {\n block: {\n number: '0x1',\n },\n },\n },\n handlerType: HandlerType.UNKNOWN,\n handlerIds: [0],\n }\n\n await service.processBindings({ bindings: [binding1] }, TEST_CONTEXT)\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-storage.test.js","sourceRoot":"","sources":["../src/state-storage.test.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAC7B,mCAAgD;AAEhD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,aAAK,CAAC,KAAK,EAAE,CAAA;IAEb,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;QAC7B,MAAM,SAAU,SAAQ,uBAAoB;YAC1C,MAAM,CAAC,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAA;;QAEnC,MAAM,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;QAC5C,IAAA,aAAM,EAAC,CAAC,KAAK,SAAS,CAAC,CAAA;QAEvB,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACrD,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5D,IAAA,aAAM,EAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACjB,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAE5C,IAAA,aAAM,EAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,CAAA;QACnD,IAAA,aAAM,EAAC,aAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC,CAAA;QAC1C,IAAA,aAAM,EAAC,aAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,WAAW,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["import { assert } from 'chai'\nimport { State, MapStateStorage } from './state'\n\ndescribe('state storage tests', () => {\n State.reset()\n\n test('test labels', async () => {\n class TestState extends MapStateStorage<any> {\n static INSTANCE = new TestState()\n }\n const m = TestState.INSTANCE.getOrRegister()\n assert(m !== undefined)\n\n const v1 = TestState.INSTANCE.getOrSetValue('k1', {})\n const v2 = TestState.INSTANCE.getOrSetValue('k1', { a: '' })\n assert(v1 === v2)\n TestState.INSTANCE.getOrSetValue('k2', 'v2')\n\n assert(TestState.INSTANCE.getValues().length === 2)\n assert(State.INSTANCE.stateMap.size === 1)\n assert(State.INSTANCE.stateMap.keys().next().value === 'TestState')\n })\n})\n"]}
package/lib/state.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ export declare class State {
2
+ stateMap: Map<string, any>;
3
+ static INSTANCE: State;
4
+ static reset(): void;
5
+ }
6
+ export declare abstract class StateStorage<T> {
7
+ protected constructor();
8
+ abstract initValue(): T;
9
+ key(): string;
10
+ getOrRegister(): T;
11
+ }
12
+ export declare abstract class MapStateStorage<T> extends StateStorage<Map<string, T>> {
13
+ initValue(): Map<string, T>;
14
+ getValue(key: string): T | undefined;
15
+ getValues(): T[];
16
+ getOrSetValue(key: string, value: T): T;
17
+ }
18
+ export declare abstract class ListStateStorage<T> extends StateStorage<T[]> {
19
+ initValue(): never[];
20
+ getValues(): T[];
21
+ addValue(value: T): T;
22
+ }
package/lib/state.js ADDED
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ListStateStorage = exports.MapStateStorage = exports.StateStorage = exports.State = void 0;
4
+ class State {
5
+ stateMap = new Map();
6
+ static INSTANCE = new State();
7
+ static reset() {
8
+ State.INSTANCE = new State();
9
+ }
10
+ }
11
+ exports.State = State;
12
+ class StateStorage {
13
+ // TODO learn how to define single instance for all subclasses
14
+ constructor() {
15
+ //
16
+ }
17
+ key() {
18
+ return this.constructor.name;
19
+ }
20
+ getOrRegister() {
21
+ let metricState = State.INSTANCE.stateMap.get(this.key());
22
+ if (!metricState) {
23
+ metricState = this.initValue();
24
+ State.INSTANCE.stateMap.set(this.key(), metricState);
25
+ }
26
+ return metricState;
27
+ }
28
+ }
29
+ exports.StateStorage = StateStorage;
30
+ class MapStateStorage extends StateStorage {
31
+ initValue() {
32
+ return new Map();
33
+ }
34
+ getValue(key) {
35
+ const m = this.getOrRegister();
36
+ return m.get(key);
37
+ }
38
+ getValues() {
39
+ const m = this.getOrRegister();
40
+ return Array.from(m.values());
41
+ }
42
+ getOrSetValue(key, value) {
43
+ const m = this.getOrRegister();
44
+ const oldValue = m.get(key);
45
+ if (oldValue) {
46
+ console.warn(key, 'has been registered twice, use the previous one');
47
+ return oldValue;
48
+ }
49
+ m.set(key, value);
50
+ return value;
51
+ }
52
+ }
53
+ exports.MapStateStorage = MapStateStorage;
54
+ class ListStateStorage extends StateStorage {
55
+ initValue() {
56
+ return [];
57
+ }
58
+ getValues() {
59
+ return this.getOrRegister();
60
+ }
61
+ addValue(value) {
62
+ const m = this.getOrRegister();
63
+ m.push(value);
64
+ return value;
65
+ }
66
+ }
67
+ exports.ListStateStorage = ListStateStorage;
68
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":";;;AAAA,MAAa,KAAK;IAChB,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAA;IAEjC,MAAM,CAAC,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAA;IAE7B,MAAM,CAAC,KAAK;QACV,KAAK,CAAC,QAAQ,GAAG,IAAI,KAAK,EAAE,CAAA;IAC9B,CAAC;;AAPH,sBAQC;AAED,MAAsB,YAAY;IAChC,8DAA8D;IAE9D;QACE,EAAE;IACJ,CAAC;IAID,GAAG;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;IAC9B,CAAC;IAED,aAAa;QACX,IAAI,WAAW,GAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;QAC5D,IAAI,CAAC,WAAW,EAAE;YAChB,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;YAC9B,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAA;SACrD;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;CACF;AArBD,oCAqBC;AAED,MAAsB,eAAmB,SAAQ,YAA4B;IAC3E,SAAS;QACP,OAAO,IAAI,GAAG,EAAa,CAAA;IAC7B,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAC9B,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,SAAS;QACP,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IAC/B,CAAC;IAED,aAAa,CAAC,GAAW,EAAE,KAAQ;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,QAAQ,EAAE;YACZ,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,iDAAiD,CAAC,CAAA;YACpE,OAAO,QAAQ,CAAA;SAChB;QACD,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACjB,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAzBD,0CAyBC;AAED,MAAsB,gBAAoB,SAAQ,YAAiB;IACjE,SAAS;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,aAAa,EAAE,CAAA;IAC7B,CAAC;IAED,QAAQ,CAAC,KAAQ;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QAC9B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACb,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAdD,4CAcC","sourcesContent":["export class State {\n stateMap = new Map<string, any>()\n\n static INSTANCE = new State()\n\n static reset() {\n State.INSTANCE = new State()\n }\n}\n\nexport abstract class StateStorage<T> {\n // TODO learn how to define single instance for all subclasses\n\n protected constructor() {\n //\n }\n\n abstract initValue(): T\n\n key(): string {\n return this.constructor.name\n }\n\n getOrRegister(): T {\n let metricState: T = State.INSTANCE.stateMap.get(this.key())\n if (!metricState) {\n metricState = this.initValue()\n State.INSTANCE.stateMap.set(this.key(), metricState)\n }\n return metricState\n }\n}\n\nexport abstract class MapStateStorage<T> extends StateStorage<Map<string, T>> {\n initValue() {\n return new Map<string, T>()\n }\n\n getValue(key: string): T | undefined {\n const m = this.getOrRegister()\n return m.get(key)\n }\n\n getValues(): T[] {\n const m = this.getOrRegister()\n return Array.from(m.values())\n }\n\n getOrSetValue(key: string, value: T): T {\n const m = this.getOrRegister()\n const oldValue = m.get(key)\n if (oldValue) {\n console.warn(key, 'has been registered twice, use the previous one')\n return oldValue\n }\n m.set(key, value)\n return value\n }\n}\n\nexport abstract class ListStateStorage<T> extends StateStorage<T[]> {\n initValue() {\n return []\n }\n\n getValues(): T[] {\n return this.getOrRegister()\n }\n\n addValue(value: T): T {\n const m = this.getOrRegister()\n m.push(value)\n return value\n }\n}\n"]}
package/lib/utils.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { ProcessResult } from '@sentio/protos';
2
+ export declare function mergeProcessResults(results: ProcessResult[]): ProcessResult;
3
+ export declare function errorString(e: Error): string;
4
+ export declare const USER_PROCESSOR = "user_processor";
package/lib/utils.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.USER_PROCESSOR = exports.errorString = exports.mergeProcessResults = void 0;
4
+ const protos_1 = require("@sentio/protos");
5
+ function mergeProcessResults(results) {
6
+ const res = protos_1.ProcessResult.fromPartial({});
7
+ for (const r of results) {
8
+ res.counters = res.counters.concat(r.counters);
9
+ res.gauges = res.gauges.concat(r.gauges);
10
+ res.logs = res.logs.concat(r.logs);
11
+ res.events = res.events.concat(r.events);
12
+ res.exports = res.exports.concat(r.exports);
13
+ }
14
+ return res;
15
+ }
16
+ exports.mergeProcessResults = mergeProcessResults;
17
+ function errorString(e) {
18
+ return e.stack || e.message;
19
+ }
20
+ exports.errorString = errorString;
21
+ exports.USER_PROCESSOR = 'user_processor';
22
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAE9C,SAAgB,mBAAmB,CAAC,OAAwB;IAC1D,MAAM,GAAG,GAAG,sBAAa,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAEzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;QACvB,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QAC9C,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QACxC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAClC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QACxC,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;KAC5C;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAXD,kDAWC;AAED,SAAgB,WAAW,CAAC,CAAQ;IAClC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAA;AAC7B,CAAC;AAFD,kCAEC;AAEY,QAAA,cAAc,GAAG,gBAAgB,CAAA","sourcesContent":["import { ProcessResult } from '@sentio/protos'\n\nexport function mergeProcessResults(results: ProcessResult[]): ProcessResult {\n const res = ProcessResult.fromPartial({})\n\n for (const r of results) {\n res.counters = res.counters.concat(r.counters)\n res.gauges = res.gauges.concat(r.gauges)\n res.logs = res.logs.concat(r.logs)\n res.events = res.events.concat(r.events)\n res.exports = res.exports.concat(r.exports)\n }\n return res\n}\n\nexport function errorString(e: Error): string {\n return e.stack || e.message\n}\n\nexport const USER_PROCESSOR = 'user_processor'\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sentio/runtime",
3
3
  "license": "Apache-2.0",
4
- "version": "1.37.0-rc.6",
4
+ "version": "1.37.0-rc.7",
5
5
  "scripts": {
6
6
  "compile": "tsc -p .",
7
7
  "build": "yarn compile",
@@ -10,13 +10,13 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@ethersproject/providers": "~5.7.0",
13
+ "@sentio/protos": "^1.37.0-rc.7",
13
14
  "bignumber.js": "^9.1.0",
14
15
  "command-line-args": "^5.2.1",
15
16
  "command-line-usage": "^6.1.3",
16
17
  "ethers": "~5.7.1",
17
18
  "fs-extra": "^11.0.0",
18
19
  "google-protobuf": "^3.15.8",
19
- "js-yaml": "^4.1.0",
20
20
  "nice-grpc": "^2.0.0",
21
21
  "nice-grpc-client-middleware-retry": "^2.0.1",
22
22
  "nice-grpc-error-details": "^0.1.4",
@@ -33,7 +33,6 @@
33
33
  "@types/expect": "^24.3.0",
34
34
  "@types/fs-extra": "^9.0.13",
35
35
  "@types/google-protobuf": "^3.15.6",
36
- "@types/js-yaml": "^4.0.5",
37
36
  "@types/node": "^18.0.4"
38
37
  },
39
38
  "bin": {
@@ -43,9 +42,9 @@
43
42
  "types": "./lib/index.d.ts",
44
43
  "module": "./lib/index.js",
45
44
  "files": [
46
- "{lib,src,templates}",
45
+ "{lib,src}",
47
46
  "!{lib,src}/tests",
48
47
  "!**/*.test.{js,ts}"
49
48
  ],
50
- "gitHead": "45def7918f00e0b9ce2611aa760beb1d63ac3941"
49
+ "gitHead": "123d4665245fbe433935dd4405ded58c13b2a994"
51
50
  }
@@ -0,0 +1,6 @@
1
+ export interface ChainConfig {
2
+ ChainID: string
3
+ Https: string[]
4
+ WebSockets?: string[]
5
+ ChainServer?: string
6
+ }
@@ -0,0 +1,14 @@
1
+ import { Provider } from '@ethersproject/providers'
2
+
3
+ export class Endpoints {
4
+ static INSTANCE: Endpoints = new Endpoints()
5
+
6
+ static reset() {
7
+ Endpoints.INSTANCE = new Endpoints()
8
+ }
9
+ // evm providers
10
+ providers = new Map<number, Provider>()
11
+
12
+ chainQueryAPI = ''
13
+ priceFeedAPI = ''
14
+ }