diff --git a/common/cluster-api/src/main/proto/jsinvoke.proto b/common/cluster-api/src/main/proto/jsinvoke.proto index 71912a9884..73f988af45 100644 --- a/common/cluster-api/src/main/proto/jsinvoke.proto +++ b/common/cluster-api/src/main/proto/jsinvoke.proto @@ -41,34 +41,34 @@ message RemoteJsResponse { } message JsCompileRequest { - string scriptHash = 1; - string functionName = 2; - string scriptBody = 3; + string functionName = 3; + string scriptBody = 4; + string scriptHash = 5; } message JsReleaseRequest { - string scriptHash = 1; - string functionName = 2; + string functionName = 3; + string scriptHash = 4; } message JsReleaseResponse { bool success = 1; - string scriptHash = 2; + string scriptHash = 4; } message JsCompileResponse { bool success = 1; - string scriptHash = 2; - JsInvokeErrorCode errorCode = 3; - string errorDetails = 4; + JsInvokeErrorCode errorCode = 4; + string errorDetails = 5; + string scriptHash = 6; } message JsInvokeRequest { - string scriptHash = 1; - string functionName = 2; - string scriptBody = 3; - int32 timeout = 4; - repeated string args = 5; + string functionName = 3; + string scriptBody = 4; + int32 timeout = 5; + repeated string args = 6; + string scriptHash = 7; } message JsInvokeResponse { diff --git a/msa/js-executor/api/jsExecutor.models.ts b/msa/js-executor/api/jsExecutor.models.ts index ae88e132fe..7a6b53cd8a 100644 --- a/msa/js-executor/api/jsExecutor.models.ts +++ b/msa/js-executor/api/jsExecutor.models.ts @@ -16,6 +16,8 @@ export interface TbMessage { + scriptIdMSB: string; // deprecated + scriptIdLSB: string; // deprecated scriptHash: string; } diff --git a/msa/js-executor/api/jsInvokeMessageProcessor.ts b/msa/js-executor/api/jsInvokeMessageProcessor.ts index bb31666ddf..668cd61f50 100644 --- a/msa/js-executor/api/jsInvokeMessageProcessor.ts +++ b/msa/js-executor/api/jsInvokeMessageProcessor.ts @@ -18,7 +18,7 @@ import config from 'config'; import { _logger } from '../config/logger'; import { JsExecutor, TbScript } from './jsExecutor'; import { performance } from 'perf_hooks'; -import { isString, parseJsErrorDetails, toUUIDString, UUIDFromBuffer, UUIDToBits } from './utils'; +import { isString, parseJsErrorDetails, toUUIDString, UUIDFromBuffer, UUIDToBits, isNotUUID } from './utils'; import { IQueue } from '../queue/queue.models'; import { JsCompileRequest, @@ -176,7 +176,7 @@ export class JsInvokeMessageProcessor { this.logger.debug('[%s] Sending success invoke response, scriptId: [%s]', requestId, scriptId); this.sendResponse(requestId, responseTopic, headers, scriptId, undefined, invokeResponse); } else { - let err = { + const err = { name: 'Error', message: 'script invocation result exceeds maximum allowed size of ' + maxResultSize + ' symbols' } @@ -200,7 +200,7 @@ export class JsInvokeMessageProcessor { }, (err: any) => { let errorCode = COMPILATION_ERROR; - if (err && isString(err.name) && err.name.includes('script body not found')) { + if (err?.name === 'script body not found') { errorCode = NOT_FOUND_ERROR; } const invokeResponse = JsInvokeMessageProcessor.createInvokeResponse("", false, errorCode, err); @@ -301,12 +301,26 @@ export class JsInvokeMessageProcessor { } private static createCompileResponse(scriptId: string, success: boolean, errorCode?: number, err?: any): JsCompileResponse { - return { - errorCode: errorCode, - success: success, - errorDetails: parseJsErrorDetails(err), - scriptHash: scriptId, - }; + if (isNotUUID(scriptId)) { + return { + errorCode: errorCode, + success: success, + errorDetails: parseJsErrorDetails(err), + scriptIdMSB: "0", + scriptIdLSB: "0", + scriptHash: scriptId + }; + } else { // this is for backward compatibility (to be able to work with tb-node of previous version) - todo: remove in the next release + let scriptIdBits = UUIDToBits(scriptId); + return { + errorCode: errorCode, + success: success, + errorDetails: parseJsErrorDetails(err), + scriptIdMSB: scriptIdBits[0], + scriptIdLSB: scriptIdBits[1], + scriptHash: "" + }; + } } private static createInvokeResponse(result: string, success: boolean, errorCode?: number, err?: any): JsInvokeResponse { @@ -319,14 +333,26 @@ export class JsInvokeMessageProcessor { } private static createReleaseResponse(scriptId: string, success: boolean): JsReleaseResponse { - return { - success: success, - scriptHash: scriptId, - }; + if (isNotUUID(scriptId)) { + return { + success: success, + scriptIdMSB: "0", + scriptIdLSB: "0", + scriptHash: scriptId, + }; + } else { // todo: remove in the next release + let scriptIdBits = UUIDToBits(scriptId); + return { + success: success, + scriptIdMSB: scriptIdBits[0], + scriptIdLSB: scriptIdBits[1], + scriptHash: "" + } + } } private static getScriptId(request: TbMessage): string { - return request.scriptHash; + return request.scriptHash ? request.scriptHash : toUUIDString(request.scriptIdMSB, request.scriptIdLSB); } private incrementUseScriptId(scriptId: string) { diff --git a/msa/js-executor/api/utils.ts b/msa/js-executor/api/utils.ts index 361025f806..58fec28b0b 100644 --- a/msa/js-executor/api/utils.ts +++ b/msa/js-executor/api/utils.ts @@ -58,3 +58,7 @@ export function parseJsErrorDetails(err: any): string | undefined { } return details; } + +export function isNotUUID(candidate: string) { + return candidate.length != 36 || !candidate.includes('-'); +}