@sentio/runtime 3.0.0-rc.9 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/lib/chunk-757YRULG.js +38 -0
  2. package/lib/{chunk-CPJKSHSV.js.map → chunk-757YRULG.js.map} +1 -1
  3. package/lib/chunk-AUPVVLD3.js +3 -0
  4. package/lib/chunk-CJDESLYQ.js +3 -0
  5. package/lib/{chunk-L2A6JPIQ.js.map → chunk-CJDESLYQ.js.map} +1 -1
  6. package/lib/chunk-KF7FHZ25.js +117 -0
  7. package/lib/{chunk-4FNYVNIX.js.map → chunk-KF7FHZ25.js.map} +1 -1
  8. package/lib/chunk-TW627LH5.js +3 -0
  9. package/lib/{chunk-MV6JXS2P.js.map → chunk-TW627LH5.js.map} +1 -1
  10. package/lib/chunk-ZTRGPIW7.js +26 -0
  11. package/lib/{chunk-ROBPWJIE.js.map → chunk-ZTRGPIW7.js.map} +1 -1
  12. package/lib/getMachineId-bsd-CDSZ2S36.js +3 -0
  13. package/lib/{getMachineId-bsd-ZJR2OQTA.js.map → getMachineId-bsd-CDSZ2S36.js.map} +1 -1
  14. package/lib/getMachineId-darwin-LM5BSWCG.js +4 -0
  15. package/lib/{getMachineId-darwin-OW6SYINH.js.map → getMachineId-darwin-LM5BSWCG.js.map} +1 -1
  16. package/lib/getMachineId-linux-UA53ZQFA.js +3 -0
  17. package/lib/{getMachineId-linux-L5XPRJBN.js.map → getMachineId-linux-UA53ZQFA.js.map} +1 -1
  18. package/lib/getMachineId-unsupported-LDR77GGJ.js +3 -0
  19. package/lib/{getMachineId-unsupported-B3NMIOO3.js.map → getMachineId-unsupported-LDR77GGJ.js.map} +1 -1
  20. package/lib/getMachineId-win-XULW45X4.js +3 -0
  21. package/lib/{getMachineId-win-TT64F63B.js.map → getMachineId-win-XULW45X4.js.map} +1 -1
  22. package/lib/index.js +1 -137
  23. package/lib/index.js.map +1 -1
  24. package/lib/processor-runner.js +43 -32939
  25. package/lib/processor-runner.js.map +1 -1
  26. package/lib/service-worker.js +2 -132
  27. package/lib/service-worker.js.map +1 -1
  28. package/lib/test-processor.test.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/db-context.ts +0 -1
  31. package/src/otlp.ts +20 -12
  32. package/src/processor-runner.ts +3 -3
  33. package/src/service-v3.ts +11 -18
  34. package/lib/chunk-4FNYVNIX.js +0 -60146
  35. package/lib/chunk-CPJKSHSV.js +0 -10976
  36. package/lib/chunk-KVSDPGUI.js +0 -50
  37. package/lib/chunk-L2A6JPIQ.js +0 -21
  38. package/lib/chunk-MV6JXS2P.js +0 -1703
  39. package/lib/chunk-ROBPWJIE.js +0 -25794
  40. package/lib/getMachineId-bsd-ZJR2OQTA.js +0 -41
  41. package/lib/getMachineId-darwin-OW6SYINH.js +0 -41
  42. package/lib/getMachineId-linux-L5XPRJBN.js +0 -33
  43. package/lib/getMachineId-unsupported-B3NMIOO3.js +0 -24
  44. package/lib/getMachineId-win-TT64F63B.js +0 -43
  45. /package/lib/{chunk-KVSDPGUI.js.map → chunk-AUPVVLD3.js.map} +0 -0
@@ -1,134 +1,4 @@
1
1
  import { createRequire as createRequireShim } from 'module'; const require = createRequireShim(import.meta.url);
2
- import {
3
- setupLogger
4
- } from "./chunk-CPJKSHSV.js";
5
- import {
6
- ProcessorServiceImpl,
7
- configureEndpoints,
8
- errorString,
9
- freezeGlobalConfig,
10
- require_cjs,
11
- require_lib3 as require_lib,
12
- require_lib4 as require_lib2
13
- } from "./chunk-4FNYVNIX.js";
14
- import "./chunk-ROBPWJIE.js";
15
- import "./chunk-MV6JXS2P.js";
16
- import {
17
- __toESM
18
- } from "./chunk-KVSDPGUI.js";
19
-
20
- // src/service-worker.ts
21
- var import_nice_grpc = __toESM(require_lib(), 1);
22
- var import_nice_grpc_error_details = __toESM(require_lib2(), 1);
23
- import { threadId } from "worker_threads";
24
- import { Piscina } from "piscina";
25
- var import_rxjs = __toESM(require_cjs(), 1);
26
- var started = false;
27
- var unhandled;
28
- process.on("uncaughtException", (err) => {
29
- console.error("Uncaught Exception, please checking if await is properly used", err);
30
- unhandled = err;
31
- }).on("unhandledRejection", (reason, p) => {
32
- if (reason?.message.startsWith('invalid ENS name (disallowed character: "*"')) {
33
- return;
34
- }
35
- console.error("Unhandled Rejection, please checking if await is properly", reason);
36
- unhandled = reason;
37
- }).on("exit", () => {
38
- console.info("Worker thread exiting, threadId:", threadId);
39
- });
40
- var service;
41
- var loader = async (options) => {
42
- if (options.target) {
43
- const m = await import(options.target);
44
- console.debug("Module loaded, path:", options.target, "module:", m);
45
- return m;
46
- }
47
- };
48
- var emptyCallContext = {};
49
- async function start(request, options) {
50
- if (started) {
51
- return {};
52
- }
53
- freezeGlobalConfig();
54
- try {
55
- service = new ProcessorServiceImpl(() => loader(options), options);
56
- } catch (e) {
57
- throw new import_nice_grpc.ServerError(import_nice_grpc.Status.INVALID_ARGUMENT, "Failed to load processor: " + errorString(e));
58
- }
59
- await service.start(request, emptyCallContext);
60
- started = true;
61
- return {};
62
- }
63
- async function service_worker_default({
64
- processId,
65
- request: firstRequest,
66
- workerPort
67
- }) {
68
- const { startRequest, configRequest, options } = Piscina.workerData;
69
- if (!started) {
70
- const logLevel = process.env["LOG_LEVEL"]?.toUpperCase();
71
- setupLogger(options.logFormat === "json", logLevel === "debug" ? true : options.debug, threadId);
72
- configureEndpoints(options);
73
- if (startRequest) {
74
- await start(startRequest, options);
75
- console.debug("worker", threadId, " started, template instance:", startRequest.templateInstances?.length);
76
- }
77
- if (configRequest) {
78
- await service?.getConfig(configRequest, emptyCallContext);
79
- console.debug("worker", threadId, " configured");
80
- }
81
- }
82
- if (unhandled) {
83
- const err = unhandled;
84
- unhandled = void 0;
85
- console.error("Unhandled exception/rejection in previous request:", err);
86
- throw new import_nice_grpc_error_details.RichServerError(
87
- import_nice_grpc.Status.UNAVAILABLE,
88
- "Unhandled exception/rejection in previous request: " + errorString(err),
89
- [
90
- import_nice_grpc_error_details.DebugInfo.fromPartial({
91
- detail: err.message,
92
- stackEntries: err.stack?.split("\n")
93
- })
94
- ]
95
- );
96
- }
97
- const timeout = (options.workerTimeout || 0) * 1e3;
98
- const enablePartition = options.enablePartition || false;
99
- await new Promise((resolve, reject) => {
100
- const subject = new import_rxjs.Subject();
101
- let timeoutId = void 0;
102
- subject.subscribe((resp) => {
103
- console.debug("Worker", threadId, "send response:", resp.result ? "result" : "dbResult");
104
- workerPort.postMessage(resp);
105
- if (resp.result) {
106
- if (timeoutId) clearTimeout(timeoutId);
107
- resolve();
108
- workerPort.close();
109
- }
110
- });
111
- workerPort.on("message", (msg) => {
112
- const request = msg;
113
- console.debug("Worker", threadId, "received request:", request.start ? "start" : "dbResult");
114
- service?.handleRequest(request, firstRequest.binding, subject);
115
- if (enablePartition && request.start && timeout > 0) {
116
- timeoutId = setTimeout(async () => {
117
- reject(new import_nice_grpc_error_details.RichServerError(import_nice_grpc.Status.DEADLINE_EXCEEDED, "Worker timeout exceeded"));
118
- }, timeout);
119
- }
120
- });
121
- console.debug("Worker", threadId, "handle request: binding");
122
- service?.handleRequest(firstRequest, firstRequest.binding, subject);
123
- if (!enablePartition && timeout > 0) {
124
- timeoutId = setTimeout(() => {
125
- reject(new import_nice_grpc_error_details.RichServerError(import_nice_grpc.Status.DEADLINE_EXCEEDED, "Worker timeout exceeded"));
126
- }, timeout);
127
- }
128
- });
129
- }
130
- import("node:process").then((p) => p.stdout.write(""));
131
- export {
132
- service_worker_default as default
133
- };
2
+ import{a as k}from"./chunk-757YRULG.js";import{E as I,c as h,j as S,l as x,m as C,q,z as y}from"./chunk-KF7FHZ25.js";import"./chunk-ZTRGPIW7.js";import"./chunk-TW627LH5.js";import{e as E}from"./chunk-AUPVVLD3.js";var s=E(x(),1);var i=E(C(),1);import{threadId as o}from"worker_threads";import{Piscina as L}from"piscina";var D=E(y(),1),b=!1,u;process.on("uncaughtException",e=>{console.error("Uncaught Exception, please checking if await is properly used",e),u=e}).on("unhandledRejection",(e,t)=>{e?.message.startsWith('invalid ENS name (disallowed character: "*"')||(console.error("Unhandled Rejection, please checking if await is properly",e),u=e)}).on("exit",()=>{console.info("Worker thread exiting, threadId:",o)});var d,A=async e=>{if(e.target){let t=await import(e.target);return console.debug("Module loaded, path:",e.target,"module:",t),t}},v={};async function N(e,t){if(b)return{};q();try{d=new I(()=>A(t),t)}catch(a){throw new s.ServerError(s.Status.INVALID_ARGUMENT,"Failed to load processor: "+h(a))}return await d.start(e,v),b=!0,{}}async function F({processId:e,request:t,workerPort:a}){let{startRequest:p,configRequest:w,options:n}=L.workerData;if(!b){let r=process.env.LOG_LEVEL?.toUpperCase();k(n.logFormat==="json",r==="debug"?!0:n.debug,o),S(n),p&&(await N(p,n),console.debug("worker",o," started, template instance:",p.templateInstances?.length)),w&&(await d?.getConfig(w,v),console.debug("worker",o," configured"))}if(u){let r=u;throw u=void 0,console.error("Unhandled exception/rejection in previous request:",r),new i.RichServerError(s.Status.UNAVAILABLE,"Unhandled exception/rejection in previous request: "+h(r),[i.DebugInfo.fromPartial({detail:r.message,stackEntries:r.stack?.split(`
3
+ `)})])}let l=(n.workerTimeout||0)*1e3,P=n.enablePartition||!1;await new Promise((r,R)=>{let f=new D.Subject,m;f.subscribe(c=>{console.debug("Worker",o,"send response:",c.result?"result":"dbResult"),a.postMessage(c),c.result&&(m&&clearTimeout(m),r(),a.close())}),a.on("message",c=>{let g=c;console.debug("Worker",o,"received request:",g.start?"start":"dbResult"),d?.handleRequest(g,t.binding,f),P&&g.start&&l>0&&(m=setTimeout(async()=>{R(new i.RichServerError(s.Status.DEADLINE_EXCEEDED,"Worker timeout exceeded"))},l))}),console.debug("Worker",o,"handle request: binding"),d?.handleRequest(t,t.binding,f),!P&&l>0&&(m=setTimeout(()=>{R(new i.RichServerError(s.Status.DEADLINE_EXCEEDED,"Worker timeout exceeded"))},l))})}import("node:process").then(e=>e.stdout.write(""));export{F as default};
134
4
  //# sourceMappingURL=service-worker.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/service-worker.ts"],"sourcesContent":["import { DeepPartial, Empty, ProcessStreamRequest, ProcessStreamResponse, StartRequest } from '@sentio/protos'\nimport { CallContext, ServerError, Status } from 'nice-grpc'\nimport { errorString } from './utils.js'\nimport { freezeGlobalConfig } from './global-config.js'\nimport { DebugInfo, RichServerError } from 'nice-grpc-error-details'\nimport { ProcessorServiceImpl } from './service.js'\nimport { MessagePort, threadId } from 'worker_threads'\nimport { Piscina } from 'piscina'\nimport { configureEndpoints } from './endpoints.js'\nimport { setupLogger } from './logger.js'\nimport { Subject } from 'rxjs'\nimport { ProcessorRuntimeOptions } from 'processor-runner-program.js'\n\nlet started = false\n\nlet unhandled: Error | undefined\n\nprocess\n .on('uncaughtException', (err) => {\n console.error('Uncaught Exception, please checking if await is properly used', err)\n unhandled = err\n })\n .on('unhandledRejection', (reason, p) => {\n // @ts-ignore ignore invalid ens error\n if (reason?.message.startsWith('invalid ENS name (disallowed character: \"*\"')) {\n return\n }\n console.error('Unhandled Rejection, please checking if await is properly', reason)\n unhandled = reason as Error\n // shutdownServers(1)\n })\n .on('exit', () => {\n console.info('Worker thread exiting, threadId:', threadId)\n })\n\nlet service: ProcessorServiceImpl | undefined\n\nconst loader = async (options: ProcessorRuntimeOptions) => {\n if (options.target) {\n const m = await import(options.target)\n console.debug('Module loaded, path:', options.target, 'module:', m)\n return m\n }\n}\n\nconst emptyCallContext = <CallContext>{}\n\nasync function start(request: StartRequest, options: ProcessorRuntimeOptions): Promise<Empty> {\n if (started) {\n return {}\n }\n freezeGlobalConfig()\n\n try {\n service = new ProcessorServiceImpl(() => loader(options), options)\n } catch (e) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Failed to load processor: ' + errorString(e))\n }\n\n await service.start(request, emptyCallContext)\n started = true\n return {}\n}\n\nexport default async function ({\n processId,\n request: firstRequest,\n workerPort\n}: {\n processId: number\n request: ProcessStreamRequest\n workerPort: MessagePort\n}) {\n const { startRequest, configRequest, options } = Piscina.workerData\n if (!started) {\n const logLevel = process.env['LOG_LEVEL']?.toUpperCase()\n setupLogger(options.logFormat === 'json', logLevel === 'debug' ? true : options.debug, threadId)\n\n configureEndpoints(options)\n\n if (startRequest) {\n await start(startRequest, options)\n console.debug('worker', threadId, ' started, template instance:', startRequest.templateInstances?.length)\n }\n\n if (configRequest) {\n await service?.getConfig(configRequest, emptyCallContext)\n console.debug('worker', threadId, ' configured')\n }\n }\n\n if (unhandled) {\n const err = unhandled\n unhandled = undefined\n console.error('Unhandled exception/rejection in previous request:', err)\n throw new RichServerError(\n Status.UNAVAILABLE,\n 'Unhandled exception/rejection in previous request: ' + errorString(err),\n [\n DebugInfo.fromPartial({\n detail: err.message,\n stackEntries: err.stack?.split('\\n')\n })\n ]\n )\n }\n const timeout = (options.workerTimeout || 0) * 1000 // convert to milliseconds\n const enablePartition = options.enablePartition || false\n await new Promise<void>((resolve, reject) => {\n const subject = new Subject<DeepPartial<ProcessStreamResponse>>()\n let timeoutId: NodeJS.Timeout | undefined = undefined\n subject.subscribe((resp: ProcessStreamResponse) => {\n console.debug('Worker', threadId, 'send response:', resp.result ? 'result' : 'dbResult')\n workerPort.postMessage(resp)\n // receive the response from the processor , close and resolve the promise\n if (resp.result) {\n if (timeoutId) clearTimeout(timeoutId)\n resolve()\n workerPort.close()\n }\n })\n workerPort.on('message', (msg: ProcessStreamRequest) => {\n const request = msg as ProcessStreamRequest\n console.debug('Worker', threadId, 'received request:', request.start ? 'start' : 'dbResult')\n service?.handleRequest(request, firstRequest.binding, subject)\n if (enablePartition && request.start && timeout > 0) {\n timeoutId = setTimeout(async () => {\n reject(new RichServerError(Status.DEADLINE_EXCEEDED, 'Worker timeout exceeded'))\n }, timeout)\n }\n })\n console.debug('Worker', threadId, 'handle request: binding')\n service?.handleRequest(firstRequest, firstRequest.binding, subject)\n if (!enablePartition && timeout > 0) {\n timeoutId = setTimeout(() => {\n reject(new RichServerError(Status.DEADLINE_EXCEEDED, 'Worker timeout exceeded'))\n }, timeout)\n }\n })\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/service-worker.ts"],"sourcesContent":["import { DeepPartial, Empty, ProcessStreamRequest, ProcessStreamResponse, StartRequest } from '@sentio/protos'\nimport { CallContext, ServerError, Status } from 'nice-grpc'\nimport { errorString } from './utils.js'\nimport { freezeGlobalConfig } from './global-config.js'\nimport { DebugInfo, RichServerError } from 'nice-grpc-error-details'\nimport { ProcessorServiceImpl } from './service.js'\nimport { MessagePort, threadId } from 'worker_threads'\nimport { Piscina } from 'piscina'\nimport { configureEndpoints } from './endpoints.js'\nimport { setupLogger } from './logger.js'\nimport { Subject } from 'rxjs'\nimport { ProcessorRuntimeOptions } from 'processor-runner-program.js'\n\nlet started = false\n\nlet unhandled: Error | undefined\n\nprocess\n .on('uncaughtException', (err) => {\n console.error('Uncaught Exception, please checking if await is properly used', err)\n unhandled = err\n })\n .on('unhandledRejection', (reason, p) => {\n // @ts-ignore ignore invalid ens error\n if (reason?.message.startsWith('invalid ENS name (disallowed character: \"*\"')) {\n return\n }\n console.error('Unhandled Rejection, please checking if await is properly', reason)\n unhandled = reason as Error\n // shutdownServers(1)\n })\n .on('exit', () => {\n console.info('Worker thread exiting, threadId:', threadId)\n })\n\nlet service: ProcessorServiceImpl | undefined\n\nconst loader = async (options: ProcessorRuntimeOptions) => {\n if (options.target) {\n const m = await import(options.target)\n console.debug('Module loaded, path:', options.target, 'module:', m)\n return m\n }\n}\n\nconst emptyCallContext = <CallContext>{}\n\nasync function start(request: StartRequest, options: ProcessorRuntimeOptions): Promise<Empty> {\n if (started) {\n return {}\n }\n freezeGlobalConfig()\n\n try {\n service = new ProcessorServiceImpl(() => loader(options), options)\n } catch (e) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Failed to load processor: ' + errorString(e))\n }\n\n await service.start(request, emptyCallContext)\n started = true\n return {}\n}\n\nexport default async function ({\n processId,\n request: firstRequest,\n workerPort\n}: {\n processId: number\n request: ProcessStreamRequest\n workerPort: MessagePort\n}) {\n const { startRequest, configRequest, options } = Piscina.workerData\n if (!started) {\n const logLevel = process.env['LOG_LEVEL']?.toUpperCase()\n setupLogger(options.logFormat === 'json', logLevel === 'debug' ? true : options.debug, threadId)\n\n configureEndpoints(options)\n\n if (startRequest) {\n await start(startRequest, options)\n console.debug('worker', threadId, ' started, template instance:', startRequest.templateInstances?.length)\n }\n\n if (configRequest) {\n await service?.getConfig(configRequest, emptyCallContext)\n console.debug('worker', threadId, ' configured')\n }\n }\n\n if (unhandled) {\n const err = unhandled\n unhandled = undefined\n console.error('Unhandled exception/rejection in previous request:', err)\n throw new RichServerError(\n Status.UNAVAILABLE,\n 'Unhandled exception/rejection in previous request: ' + errorString(err),\n [\n DebugInfo.fromPartial({\n detail: err.message,\n stackEntries: err.stack?.split('\\n')\n })\n ]\n )\n }\n const timeout = (options.workerTimeout || 0) * 1000 // convert to milliseconds\n const enablePartition = options.enablePartition || false\n await new Promise<void>((resolve, reject) => {\n const subject = new Subject<DeepPartial<ProcessStreamResponse>>()\n let timeoutId: NodeJS.Timeout | undefined = undefined\n subject.subscribe((resp: ProcessStreamResponse) => {\n console.debug('Worker', threadId, 'send response:', resp.result ? 'result' : 'dbResult')\n workerPort.postMessage(resp)\n // receive the response from the processor , close and resolve the promise\n if (resp.result) {\n if (timeoutId) clearTimeout(timeoutId)\n resolve()\n workerPort.close()\n }\n })\n workerPort.on('message', (msg: ProcessStreamRequest) => {\n const request = msg as ProcessStreamRequest\n console.debug('Worker', threadId, 'received request:', request.start ? 'start' : 'dbResult')\n service?.handleRequest(request, firstRequest.binding, subject)\n if (enablePartition && request.start && timeout > 0) {\n timeoutId = setTimeout(async () => {\n reject(new RichServerError(Status.DEADLINE_EXCEEDED, 'Worker timeout exceeded'))\n }, timeout)\n }\n })\n console.debug('Worker', threadId, 'handle request: binding')\n service?.handleRequest(firstRequest, firstRequest.binding, subject)\n if (!enablePartition && timeout > 0) {\n timeoutId = setTimeout(() => {\n reject(new RichServerError(Status.DEADLINE_EXCEEDED, 'Worker timeout exceeded'))\n }, timeout)\n }\n })\n}\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));"],"mappings":"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","names":["import_nice_grpc","import_nice_grpc_error_details","threadId","Piscina","import_rxjs","started","unhandled","err","reason","p","threadId","service","loader","options","m","emptyCallContext","start","request","freezeGlobalConfig","ProcessorServiceImpl","e","errorString","service_worker_default","processId","firstRequest","workerPort","startRequest","configRequest","Piscina","logLevel","setupLogger","configureEndpoints","timeout","enablePartition","resolve","reject","subject","timeoutId","resp","msg"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/test-processor.test.ts"],"sourcesContent":["import { Plugin, PluginManager } from './plugin.js'\nimport { DataBinding, HandlerType, ProcessResult } from './gen/processor/protos/processor.js'\nimport { AccountConfig, InitResponse, ProcessConfigResponse, ProcessStreamResponse_Partitions } from '@sentio/protos'\n\nexport class TestPlugin extends Plugin {\n async processBinding(request: DataBinding): Promise<ProcessResult> {\n const dbContext = PluginManager.INSTANCE.dbContextLocalStorage.getStore()\n if (dbContext) {\n await dbContext.sendRequest({\n get: {\n entity: 'Test',\n id: '1'\n }\n })\n }\n\n return ProcessResult.fromPartial({\n states: {\n configUpdated: true\n }\n })\n }\n supportedHandlers = [HandlerType.UNKNOWN, HandlerType.ETH_LOG]\n\n async partition(request: DataBinding): Promise<ProcessStreamResponse_Partitions> {\n return {\n partitions: request.handlerIds.reduce(\n (acc, id) => ({\n ...acc,\n [id]: {\n userValue: 'test'\n }\n }),\n {}\n )\n }\n }\n\n async init(config: InitResponse): Promise<void> {\n config.chainIds = ['1']\n }\n\n async configure(config: ProcessConfigResponse, forChainId?: string): Promise<void> {\n config.accountConfigs = [\n AccountConfig.fromPartial({\n address: '0x',\n chainId: '1'\n })\n ]\n }\n}\n\nPluginManager.INSTANCE.plugins = []\nPluginManager.INSTANCE.register(new TestPlugin())\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));"],"mappings":";;;;;;;;;;AAIO,IAAM,aAAN,cAAyB,OAAO;AAAA,EACrC,MAAM,eAAe,SAA8C;AACjE,UAAM,YAAY,cAAc,SAAS,sBAAsB,SAAS;AACxE,QAAI,WAAW;AACb,YAAM,UAAU,YAAY;AAAA,QAC1B,KAAK;AAAA,UACH,QAAQ;AAAA,UACR,IAAI;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,cAAc,YAAY;AAAA,MAC/B,QAAQ;AAAA,QACN,eAAe;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACA,oBAAoB,iCAAyC;AAAA,EAE7D,MAAM,UAAU,SAAiE;AAC/E,WAAO;AAAA,MACL,YAAY,QAAQ,WAAW;AAAA,QAC7B,CAAC,KAAK,QAAQ;AAAA,UACZ,GAAG;AAAA,UACH,CAAC,EAAE,GAAG;AAAA,YACJ,WAAW;AAAA,UACb;AAAA,QACF;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,QAAqC;AAC9C,WAAO,WAAW,CAAC,GAAG;AAAA,EACxB;AAAA,EAEA,MAAM,UAAU,QAA+B,YAAoC;AACjF,WAAO,iBAAiB;AAAA,MACtB,cAAc,YAAY;AAAA,QACxB,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,cAAc,SAAS,UAAU,CAAC;AAClC,cAAc,SAAS,SAAS,IAAI,WAAW,CAAC;AAC/C,OAAO,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/test-processor.test.ts"],"sourcesContent":["import { Plugin, PluginManager } from './plugin.js'\nimport { DataBinding, HandlerType, ProcessResult } from './gen/processor/protos/processor.js'\nimport { AccountConfig, InitResponse, ProcessConfigResponse, ProcessStreamResponse_Partitions } from '@sentio/protos'\n\nexport class TestPlugin extends Plugin {\n async processBinding(request: DataBinding): Promise<ProcessResult> {\n const dbContext = PluginManager.INSTANCE.dbContextLocalStorage.getStore()\n if (dbContext) {\n await dbContext.sendRequest({\n get: {\n entity: 'Test',\n id: '1'\n }\n })\n }\n\n return ProcessResult.fromPartial({\n states: {\n configUpdated: true\n }\n })\n }\n supportedHandlers = [HandlerType.UNKNOWN, HandlerType.ETH_LOG]\n\n async partition(request: DataBinding): Promise<ProcessStreamResponse_Partitions> {\n return {\n partitions: request.handlerIds.reduce(\n (acc, id) => ({\n ...acc,\n [id]: {\n userValue: 'test'\n }\n }),\n {}\n )\n }\n }\n\n async init(config: InitResponse): Promise<void> {\n config.chainIds = ['1']\n }\n\n async configure(config: ProcessConfigResponse, forChainId?: string): Promise<void> {\n config.accountConfigs = [\n AccountConfig.fromPartial({\n address: '0x',\n chainId: '1'\n })\n ]\n }\n}\n\nPluginManager.INSTANCE.plugins = []\nPluginManager.INSTANCE.register(new TestPlugin())\n;import(\"node:process\").then((p) => p.stdout.write(\"\"));"],"mappings":";yFAIO,IAAMA,EAAN,cAAyBC,CAAO,CACrC,MAAM,eAAeC,EAA8C,CACjE,IAAMC,EAAYC,EAAc,SAAS,sBAAsB,SAAS,EACxE,OAAID,GACF,MAAMA,EAAU,YAAY,CAC1B,IAAK,CACH,OAAQ,OACR,GAAI,GACN,CACF,CAAC,EAGIE,EAAc,YAAY,CAC/B,OAAQ,CACN,cAAe,EACjB,CACF,CAAC,CACH,CACA,kBAAoB,IAAyC,EAE7D,MAAM,UAAUH,EAAiE,CAC/E,MAAO,CACL,WAAYA,EAAQ,WAAW,OAC7B,CAACI,EAAKC,KAAQ,CACZ,GAAGD,EACH,CAACC,CAAE,EAAG,CACJ,UAAW,MACb,CACF,GACA,CAAC,CACH,CACF,CACF,CAEA,MAAM,KAAKC,EAAqC,CAC9CA,EAAO,SAAW,CAAC,GAAG,CACxB,CAEA,MAAM,UAAUA,EAA+BC,EAAoC,CACjFD,EAAO,eAAiB,CACtBE,EAAc,YAAY,CACxB,QAAS,KACT,QAAS,GACX,CAAC,CACH,CACF,CACF,EAEAN,EAAc,SAAS,QAAU,CAAC,EAClCA,EAAc,SAAS,SAAS,IAAIJ,CAAY,EAC/C,OAAO,cAAc,EAAE,KAAMW,GAAMA,EAAE,OAAO,MAAM,EAAE,CAAC","names":["TestPlugin","Plugin","request","dbContext","PluginManager","ProcessResult","acc","id","config","forChainId","AccountConfig","p"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentio/runtime",
3
- "version": "3.0.0-rc.9",
3
+ "version": "3.0.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "exports": {
package/src/db-context.ts CHANGED
@@ -281,7 +281,6 @@ export class DataBindingContext extends AbstractStoreContext implements IDataBin
281
281
  }
282
282
 
283
283
  doSend(resp: DeepPartial<ProcessStreamResponseV3>) {
284
- console.debug('sending db request, processId ', this.processId, 'opId', resp.dbRequest?.opId)
285
284
  this.subject.next({
286
285
  ...resp,
287
286
  processId: this.processId
package/src/otlp.ts CHANGED
@@ -1,32 +1,40 @@
1
- import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
1
+ import { IMetricReader, MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'
2
2
  import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-grpc'
3
3
  import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'
4
- import { NodeSDK } from '@opentelemetry/sdk-node'
5
- import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc'
6
4
  import { diag, DiagConsoleLogger, DiagLogLevel, metrics } from '@opentelemetry/api'
7
5
 
8
6
  export async function setupOTLP(debug?: boolean) {
7
+ console.log('Setting up OTLP metrics, debug=', !!debug)
9
8
  if (debug) {
10
9
  diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG)
11
10
  }
12
11
 
13
- const sdk = new NodeSDK({
14
- autoDetectResources: true,
15
- traceExporter: new OTLPTraceExporter(),
16
- metricReaders: [
17
- new PeriodicExportingMetricReader({
18
- exporter: new OTLPMetricExporter()
19
- }),
12
+ const readers: IMetricReader[] = [
13
+ new PeriodicExportingMetricReader({
14
+ exporter: new OTLPMetricExporter(),
15
+ exportIntervalMillis: 60000
16
+ })
17
+ ]
18
+ if (debug) {
19
+ readers.push(
20
20
  new PrometheusExporter({
21
21
  host: '0.0.0.0',
22
22
  port: 4041
23
23
  })
24
+ )
25
+ }
26
+ const meterProvider = new MeterProvider({
27
+ readers: [
28
+ new PeriodicExportingMetricReader({
29
+ exporter: new OTLPMetricExporter(),
30
+ exportIntervalMillis: 60000
31
+ })
24
32
  ]
25
33
  })
26
34
 
27
- sdk.start()
35
+ metrics.setGlobalMeterProvider(meterProvider)
28
36
  ;['SIGINT', 'SIGTERM'].forEach((signal) => {
29
- process.on(signal as any, () => sdk.shutdown().catch(console.error))
37
+ process.on(signal as any, () => meterProvider.forceFlush().catch(console.error))
30
38
  })
31
39
 
32
40
  metrics.getMeter('processor').createGauge('up').record(1)
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import fs from 'fs-extra'
4
-
4
+ // import { compressionAlgorithms } from '@grpc/grpc-js'
5
5
  import { createServer } from 'nice-grpc'
6
6
  import { errorDetailsServerMiddleware } from 'nice-grpc-error-details'
7
7
  // import { registry as niceGrpcRegistry } from 'nice-grpc-prometheus'
8
- import { openTelemetryServerMiddleware } from 'nice-grpc-opentelemetry'
8
+ // import { openTelemetryServerMiddleware } from 'nice-grpc-opentelemetry'
9
9
  import http from 'http'
10
10
  // @ts-ignore inspector promises is not included in @type/node
11
11
  import { Session } from 'node:inspector/promises'
@@ -61,7 +61,7 @@ if (options.startActionServer) {
61
61
  // 'grpc.default_compression_algorithm': compressionAlgorithms.gzip
62
62
  })
63
63
  // .use(prometheusServerMiddleware())
64
- .use(openTelemetryServerMiddleware())
64
+ // .use(openTelemetryServerMiddleware())
65
65
  .use(errorDetailsServerMiddleware)
66
66
 
67
67
  if (options.worker > 1) {
package/src/service-v3.ts CHANGED
@@ -29,6 +29,9 @@ import { ProcessorRuntimeOptions } from 'processor-runner-program.js'
29
29
 
30
30
  const { process_binding_count, process_binding_time, process_binding_error } = processMetrics
31
31
 
32
+ const WRITE_V2_EVENT_LOGS = process.env.WRITE_V2_EVENT_LOGS !== 'false'
33
+ const TIME_SERIES_RESULT_BATCH_SIZE = 1000
34
+
32
35
  export class ProcessorServiceImplV3 implements ProcessorV3ServiceImplementation {
33
36
  readonly enablePartition: boolean
34
37
  private readonly loader: () => Promise<any>
@@ -165,35 +168,26 @@ export class ProcessorServiceImplV3 implements ProcessorV3ServiceImplementation
165
168
  ) {
166
169
  const context = this.contexts.new(processId, subject)
167
170
  const start = Date.now()
168
- console.debug('process binding', processId)
169
171
  PluginManager.INSTANCE.processBinding(binding, undefined, context)
170
172
  .then(async (result) => {
171
- console.debug(`process binding ${processId} done`)
172
173
  await context.awaitPendings()
173
174
  const { timeseriesResult, ...otherResults } = result
174
- console.debug('sending ts data length:', result.timeseriesResult.length)
175
- for (const ts of timeseriesResult) {
175
+ for (let i = 0; i < timeseriesResult.length; i += TIME_SERIES_RESULT_BATCH_SIZE) {
176
+ const batch = timeseriesResult.slice(i, i + TIME_SERIES_RESULT_BATCH_SIZE)
176
177
  subject.next({
177
178
  processId,
178
179
  tsRequest: {
179
- data: [ts]
180
+ data: batch
180
181
  }
181
182
  })
182
183
  }
183
184
 
184
- /* if (result.states?.configUpdated) {
185
- console.debug('sending tpl updates:')
186
- subject.next({
187
- processId,
188
- tplRequest: {
189
- templates: TemplateInstanceState.INSTANCE.getValues()
190
- }
191
- })
192
- }*/
193
-
194
- console.debug('sending binding result', processId)
195
185
  subject.next({
196
- result: otherResults,
186
+ result: WRITE_V2_EVENT_LOGS
187
+ ? otherResults
188
+ : {
189
+ states: otherResults.states
190
+ },
197
191
  processId: processId
198
192
  })
199
193
  recordRuntimeInfo(result, binding.handlerType)
@@ -207,7 +201,6 @@ export class ProcessorServiceImplV3 implements ProcessorV3ServiceImplementation
207
201
  const cost = Date.now() - start
208
202
  process_binding_time.add(cost)
209
203
  this.contexts.delete(processId)
210
- console.debug('process binding done', processId)
211
204
  })
212
205
  }
213
206