diff --git a/ts/examples/simple-example-ts/index.ts b/ts/examples/simple-example-ts/index.ts index 3663532..c4c0f90 100644 --- a/ts/examples/simple-example-ts/index.ts +++ b/ts/examples/simple-example-ts/index.ts @@ -23,7 +23,7 @@ sdk.registerDataTypes({ type: "any", }) -sdk.registerFunctionDefinitions({ +sdk.registerRuntimeFunctionDefinitionsAndFunctionDefinitions({ definition: { signature: "(n: NUMBER) => NUMBER", linkedDataTypes: ["NUMBER"], @@ -55,8 +55,9 @@ sdk.registerFunctionDefinitions({ sdk.registerFlowTypes( { + signature: "(): TEXT", + linkedDataTypes: ["TEXT"], editable: false, - inputType: "STRING", identifier: "test_flow", } ) diff --git a/ts/examples/simple-example-ts/package-lock.json b/ts/examples/simple-example-ts/package-lock.json index ed24c2f..8bdbf96 100644 --- a/ts/examples/simple-example-ts/package-lock.json +++ b/ts/examples/simple-example-ts/package-lock.json @@ -16,10 +16,10 @@ "node_modules/@code0-tech/hercules": { "version": "0.0.0", "resolved": "file:../../code0-tech-hercules-0.0.0.tgz", - "integrity": "sha512-iPWOm0wNfjgGfMbrlzWfzOpGjGb7EZ7WyTkvVgGxwLQrtE5BzeaoYZ0ugmnof3WDnY84RTptENNi+EEgkzAVxQ==", + "integrity": "sha512-p5QarLysqUiuz6fWvJdZBlJoBaeal5oGxKMMX/B1vWOFhKrMfkSF1XGhUWeAMcjLchAxRkdI17wEnsuyCPY9QA==", "license": "ISC", "dependencies": { - "@code0-tech/tucana": "0.0.62", + "@code0-tech/tucana": "^0.0.67", "@grpc/grpc-js": "^1.14.3", "@protobuf-ts/grpc-backend": "^2.11.1", "@protobuf-ts/grpc-transport": "^2.11.1", @@ -27,6 +27,12 @@ "@protobuf-ts/runtime-rpc": "^2.11.1" } }, + "node_modules/@code0-tech/hercules/node_modules/@code0-tech/tucana": { + "version": "0.0.67", + "resolved": "https://registry.npmjs.org/@code0-tech/tucana/-/tucana-0.0.67.tgz", + "integrity": "sha512-3V1h3LB+iWeXnt80nsIQo+TeMgVTgbDxvDsAArbffHyU37ii1tsAAV6Ty7wAdkrCSsObyFRpdiIZgzgYVVKfzw==", + "license": "Apache-2.0" + }, "node_modules/@code0-tech/tucana": { "version": "0.0.62", "resolved": "https://registry.npmjs.org/@code0-tech/tucana/-/tucana-0.0.62.tgz", diff --git a/ts/package-lock.json b/ts/package-lock.json index 14534ee..bf6863b 100644 --- a/ts/package-lock.json +++ b/ts/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "license": "ISC", "dependencies": { - "@code0-tech/tucana": "^0.0.66", + "@code0-tech/tucana": "^0.0.67", "@grpc/grpc-js": "^1.14.3", "@protobuf-ts/grpc-backend": "^2.11.1", "@protobuf-ts/grpc-transport": "^2.11.1", @@ -76,9 +76,9 @@ } }, "node_modules/@code0-tech/tucana": { - "version": "0.0.66", - "resolved": "https://registry.npmjs.org/@code0-tech/tucana/-/tucana-0.0.66.tgz", - "integrity": "sha512-9w5uQ3Qwt8RXUWiXQuinm0wuF38uIt2T0wt1fBK3DvOVAtESUkJSUiuUrCYug6HL6VR/Bj/M3FCv7zi4gqER3A==", + "version": "0.0.67", + "resolved": "https://registry.npmjs.org/@code0-tech/tucana/-/tucana-0.0.67.tgz", + "integrity": "sha512-3V1h3LB+iWeXnt80nsIQo+TeMgVTgbDxvDsAArbffHyU37ii1tsAAV6Ty7wAdkrCSsObyFRpdiIZgzgYVVKfzw==", "license": "Apache-2.0" }, "node_modules/@emnapi/core": { diff --git a/ts/package.json b/ts/package.json index e661c2b..cef30d2 100644 --- a/ts/package.json +++ b/ts/package.json @@ -30,7 +30,7 @@ "license": "ISC", "type": "module", "dependencies": { - "@code0-tech/tucana": "^0.0.66", + "@code0-tech/tucana": "^0.0.67", "@grpc/grpc-js": "^1.14.3", "@protobuf-ts/grpc-backend": "^2.11.1", "@protobuf-ts/grpc-transport": "^2.11.1", diff --git a/ts/src/action_sdk.ts b/ts/src/action_sdk.ts index 49abdcf..d7d6ad8 100644 --- a/ts/src/action_sdk.ts +++ b/ts/src/action_sdk.ts @@ -3,7 +3,8 @@ import {ChannelCredentials} from "@grpc/grpc-js"; import {RpcOptions} from "@protobuf-ts/runtime-rpc"; import { ActionSdk, HerculesActionConfigurationDefinition, - HerculesActionProjectConfiguration, HerculesFunctionContext, SdkState, RuntimeErrorException + HerculesActionProjectConfiguration, HerculesFunctionContext, SdkState, RuntimeErrorException, + HerculesRegisterRuntimeFunctionParameter, HerculesRegisterFunctionDefinition } from "./types.js"; import { ActionTransferServiceClient, @@ -52,6 +53,73 @@ const createSdk = (config: ActionSdk["config"], configDefinitions?: HerculesActi fullyConnected: false } + const registerFunctionDefinitions = async (...functionDefinitions: Array) => { + for (const functionDefinition of functionDefinitions) { + state.functions.push({ + identifier: functionDefinition.runtimeName, + definition: { + displayMessage: functionDefinition.displayMessage || [], + name: functionDefinition.name || [], + documentation: functionDefinition.documentation || [], + description: functionDefinition.description || [], + deprecationMessage: functionDefinition.deprecationMessage || [], + displayIcon: functionDefinition.displayIcon || "", + alias: functionDefinition.alias || [], + linkedDataTypeIdentifiers: functionDefinition.linkedDataTypes || [], + definitionSource: "action", + version: functionDefinition.version || config.version, + runtimeName: functionDefinition.runtimeName, + parameterDefinitions: (functionDefinition.parameters || []).map(param => ({ + runtimeName: param.runtimeName, + name: param.name || [], + description: param.description || [], + documentation: param.documentation || [], + defaultValue: constructValue(param.defaultValue || null), + hidden: param.hidden || false, + optional: param.hidden || false, + runtimeDefinitionName: param.runtimeDefinitionName || param.runtimeName + })), + signature: functionDefinition.signature, + throwsError: functionDefinition.throwsError || false, + runtimeDefinitionName: functionDefinition.runtimeDefinitionName + } + }); + } + return Promise.resolve() + }; + const registerRuntimeFunctionDefinitions = async (...runtimeFunctionDefinitions: HerculesRegisterRuntimeFunctionParameter[]) => { + for (const registeredFunction of runtimeFunctionDefinitions) { + const handler = registeredFunction.handler; + const functionDefinition = registeredFunction.definition; + state.runtimeFunctions.push({ + identifier: functionDefinition.runtimeName, + definition: { + displayMessage: functionDefinition.displayMessage || [], + name: functionDefinition.name || [], + documentation: functionDefinition.documentation || [], + description: functionDefinition.description || [], + deprecationMessage: functionDefinition.deprecationMessage || [], + displayIcon: functionDefinition.displayIcon || "", + alias: functionDefinition.alias || [], + linkedDataTypeIdentifiers: functionDefinition.linkedDataTypes || [], + definitionSource: "action", + version: functionDefinition.version || config.version, + runtimeName: functionDefinition.runtimeName, + runtimeParameterDefinitions: (functionDefinition.parameters || []).map(param => ({ + runtimeName: param.runtimeName, + name: param.name || [], + description: param.description || [], + documentation: param.documentation || [], + defaultValue: constructValue(param.defaultValue || null), + })), + signature: functionDefinition.signature, + throwsError: functionDefinition.throwsError || false, + }, + handler: handler, + }); + } + return Promise.resolve() + }; return { fullyConnected(): boolean { return state.fullyConnected; @@ -140,69 +208,29 @@ const createSdk = (config: ActionSdk["config"], configDefinitions?: HerculesActi }) return Promise.resolve() }, - registerRuntimeFunctionDefinitions: async (...runtimeFunctionDefinitions) => { - for (const registeredFunction of runtimeFunctionDefinitions) { - const handler = registeredFunction.handler; - const functionDefinition = registeredFunction.definition; - state.runtimeFunctions.push({ - identifier: functionDefinition.runtimeName, - definition: { - displayMessage: functionDefinition.displayMessage || [], - name: functionDefinition.name || [], - documentation: functionDefinition.documentation || [], - description: functionDefinition.description || [], - deprecationMessage: functionDefinition.deprecationMessage || [], - displayIcon: functionDefinition.displayIcon || "", - alias: functionDefinition.alias || [], - linkedDataTypeIdentifiers: functionDefinition.linkedDataTypes || [], - definitionSource: "action", - version: functionDefinition.version || config.version, - runtimeName: functionDefinition.runtimeName, - runtimeParameterDefinitions: (functionDefinition.parameters || []).map(param => ({ - runtimeName: param.runtimeName, - name: param.name || [], - description: param.description || [], - documentation: param.documentation || [], - defaultValue: constructValue(param.defaultValue || null), - })), - signature: functionDefinition.signature, - throwsError: functionDefinition.throwsError || false, - }, - handler: handler, - }); - } - return Promise.resolve() - }, - registerFunctionDefinitions: async (...functionDefinitions) => { - for (const functionDefinition of functionDefinitions) { - state.functions.push({ - identifier: functionDefinition.runtimeName, - definition: { - displayMessage: functionDefinition.displayMessage || [], - name: functionDefinition.name || [], - documentation: functionDefinition.documentation || [], - description: functionDefinition.description || [], - deprecationMessage: functionDefinition.deprecationMessage || [], - displayIcon: functionDefinition.displayIcon || "", - alias: functionDefinition.alias || [], - linkedDataTypeIdentifiers: functionDefinition.linkedDataTypes || [], - definitionSource: "action", - version: functionDefinition.version || config.version, - runtimeName: functionDefinition.runtimeName, - parameterDefinitions: (functionDefinition.parameters || []).map(param => ({ - runtimeName: param.runtimeName, - name: param.name || [], - description: param.description || [], - documentation: param.documentation || [], - defaultValue: constructValue(param.defaultValue || null), - })), - signature: functionDefinition.signature, - throwsError: functionDefinition.throwsError || false, - } - }); - } - return Promise.resolve() + registerRuntimeFunctionDefinitionsAndFunctionDefinitions: async (...runtimeFunctionDefinitions) => { + await Promise.all(runtimeFunctionDefinitions.map(async (register) => { + await Promise.all([ + registerRuntimeFunctionDefinitions( + register + ), + registerFunctionDefinitions( + { + ...register.definition, + runtimeDefinitionName: register.definition.runtimeName, + parameters: register.definition.parameters?.map(param => { + return { + ...param, + runtimeDefinitionName: param.runtimeName, + } + }) + } + ) + ]) + })); }, + registerRuntimeFunctionDefinitions: registerRuntimeFunctionDefinitions, + registerFunctionDefinitions: registerFunctionDefinitions, dispatchEvent: async (eventType, projectId, payload) => { if (!state.stream) { return Promise.reject("SDK is not connected. Call connect() before dispatching events."); diff --git a/ts/src/types.ts b/ts/src/types.ts index 35c472b..7215e86 100644 --- a/ts/src/types.ts +++ b/ts/src/types.ts @@ -12,7 +12,6 @@ import {PlainValue} from "@code0-tech/tucana/helpers"; import {ActionTransferServiceClient, TransferRequest, TransferResponse} from "@code0-tech/tucana/aquila"; - export interface HerculesFunctionContext { projectId: number | bigint, executionId: string, @@ -65,6 +64,8 @@ export interface HerculesRuntimeFunctionDefinition { name?: Translation[], description?: Translation[], documentation?: Translation[], + hidden?: boolean, + optional?: boolean }[], signature: string, throwsError?: boolean, @@ -79,7 +80,31 @@ export interface HerculesRuntimeFunctionDefinition { displayIcon?: string, } -export type HerculesRegisterFunctionDefinition = HerculesRuntimeFunctionDefinition +export interface HerculesRegisterFunctionDefinition { + runtimeDefinitionName: string, + runtimeName: string, + parameters?: { + runtimeName: string, + defaultValue?: PlainValue, + name?: Translation[], + description?: Translation[], + documentation?: Translation[], + hidden?: boolean, + optional?: boolean, + runtimeDefinitionName?: string + }[], + signature: string, + throwsError?: boolean, + name?: Translation[], + description?: Translation[], + documentation?: Translation[], + deprecationMessage?: Translation[], + displayMessage?: Translation[], + alias?: Translation[], + linkedDataTypes?: string[], + version?: string, + displayIcon?: string, +} export interface HerculesActionProjectConfiguration { projectId: number | bigint, @@ -120,6 +145,7 @@ export interface ActionSdk { registerConfigDefinitions: (...actionConfigurations: Array) => Promise, registerDataTypes: (...dataType: Array) => Promise, registerFlowTypes: (...flowTypes: Array) => Promise, + registerRuntimeFunctionDefinitionsAndFunctionDefinitions: (...runtimeFunctionDefinitions: Array) => Promise, registerFunctionDefinitions: (...functionDefinitions: Array) => Promise, registerRuntimeFunctionDefinitions: (...runtimeFunctionDefinitions: Array) => Promise, dispatchEvent: (eventType: string, projectId: number | bigint, payload: PlainValue) => Promise,