@transai/connector-runner-otto-fleet-manager-v2 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 0.7.1 (2026-02-25)
2
+
3
+ ### 🧱 Updated Dependencies
4
+
5
+ - Updated @transai/connector-runtime-sdk to 0.9.1
6
+
7
+ ## 0.7.0 (2026-02-24)
8
+
9
+ ### 🧱 Updated Dependencies
10
+
11
+ - Updated @transai/connector-runtime-sdk to 0.9.0
12
+
1
13
  ## 0.6.1 (2026-02-12)
2
14
 
3
15
  ### 🧱 Updated Dependencies
package/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var I=Object.create;var l=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var K=Object.getPrototypeOf,M=Object.prototype.hasOwnProperty;var x=(o,t)=>{for(var e in t)l(o,e,{get:t[e],enumerable:!0})},h=(o,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of A(t))!M.call(o,n)&&n!==e&&l(o,n,{get:()=>t[n],enumerable:!(r=b(t,n))||r.enumerable});return o};var y=(o,t,e)=>(e=o!=null?I(K(o)):{},h(t||!o||!o.__esModule?l(e,"default",{value:o,enumerable:!0}):e,o)),D=o=>h(l({},"__esModule",{value:!0}),o);var k={};x(k,{ConnectorRunnerOttoFleetManagerV2:()=>C});module.exports=D(k);var i=y(require("node:process")),m=class{constructor(t,e){this.#e="connector-runtime";this.init=()=>Promise.resolve();this.start=()=>Promise.resolve();this.stop=()=>Promise.resolve();this.#t=e,i.default.on?i.default.on("message",r=>{r.cmd===this.#e&&e.logger.verbose(`${i.default.pid} Received message from parent process:`,r)}):e.logger.warn("IPC channel is not available. process.on is undefined."),i.default.send||e.logger.warn("IPC channel is not available. process.send is undefined."),t.actions?.forEach(r=>{if(r.config.templates===void 0)return;let n={};Object.entries(r.config.templates).forEach(([a,p])=>{try{n[a]=e.templating.compile(p)}catch(d){e.logger.error(`Error compiling template ${a} for action ${r.identifier}`,d)}}),r.config.parsedTemplates=n})}#e;#t;set callbackFunction(t){this.connectorSDK.receiver.registerCallback(this.#o(t))}get connectorSDK(){return this.#t}#o(t){return async e=>{let r=await this.#t.receiver.getActionConfig(e);return r?t(e,r):this.#t.receiver.responses.badRequest("Action not found")(e)}}};var f=class{#e;constructor(t){this.#e=t}get jsonrpc(){return"2.0"}async execute(t){let e=Math.floor(1e7+Math.random()*9e7);return(await this.#e.post("/operations",{id:e,jsonrpc:this.jsonrpc,method:this.method,params:t})).data.result.id}};var s=class extends f{static{this.TYPE="create-mission"}get method(){return"createMission"}};var g=class{#e;#t;constructor(t,e){this.#e=t,this.#t={[s.TYPE]:new s(e)}}get callbackFunctionChain(){return this.#o(this.#e.receiver.emitEventType(this.#e.receiver.responses.created()))}#o(t){return async(e,r)=>{let n=r.config.parsedTemplates,a=n.action({inputs:e.payload}).trim(),p=this.#t[a];if(!p)return this.#e.receiver.responses.badRequest(`Action ${a} does not exist.`)(e);let d=n.params({inputs:e.payload}).trim(),u=await p.execute(JSON.parse(d));return this.#e.logger.info(`Action ${a} executed successfully with id: ${u}`),t(e)}}};var c=class o{static{this.NAME="otto-fleet-manager-v2-extractor-missions"}static{this.INTERVAL=60}#e;#t;constructor(t,e){this.#e=t,this.#t=e}get name(){return o.NAME}async onRun(){let t=new URLSearchParams({limit:"100",offset:"0"});for(;;){let e=await this.#t.get(`/missions?${t.toString()}`);if(await this.#e.sender.documents(e.data.results,{collection:"missions",keyField:"id"}),!e.data.next)break;let r=new URL(e.data.next);if(!r.searchParams.get("offset"))break;t.set("offset",r.searchParams.get("offset")||"0")}}};var C=class extends m{constructor(e,r){super(e,r);this.init=async()=>{await Promise.all([this.connectorSDK.processing.registerInterval(c.INTERVAL,new c(this.connectorSDK,this.#e))])};let{config:n}=this.connectorSDK;this.#e=this.connectorSDK.httpClient({baseUrl:`https://${n.hostname}/api/fleet/v2`});let a=new g(this.connectorSDK,this.#e);this.callbackFunction=a.callbackFunctionChain}#e};0&&(module.exports={ConnectorRunnerOttoFleetManagerV2});
1
+ "use strict";var h=Object.create;var m=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty;var P=(r,t)=>{for(var e in t)m(r,e,{get:t[e],enumerable:!0})},I=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of y(t))!A.call(r,o)&&o!==e&&m(r,o,{get:()=>t[o],enumerable:!(n=b(t,o))||n.enumerable});return r};var k=(r,t,e)=>(e=r!=null?h(x(r)):{},I(t||!r||!r.__esModule?m(e,"default",{value:r,enumerable:!0}):e,r)),O=r=>I(m({},"__esModule",{value:!0}),r);var K={};P(K,{ConnectorRunnerOttoFleetManagerV2:()=>u});module.exports=O(K);var i=k(require("node:process")),f=class{constructor(t,e){this.#e="connector-runtime";this.init=()=>Promise.resolve();this.start=()=>Promise.resolve();this.stop=()=>Promise.resolve();this.#t=e,i.default.on?i.default.on("message",n=>{n.cmd===this.#e&&e.logger.verbose(`${i.default.pid} Received message from parent process:`,n)}):e.logger.warn("IPC channel is not available. process.on is undefined."),i.default.send||e.logger.warn("IPC channel is not available. process.send is undefined."),t.actions?.forEach(n=>{if(n.config.templates===void 0)return;let o={};Object.entries(n.config.templates).forEach(([a,p])=>{try{o[a]=e.templating.compile(p)}catch(d){e.logger.error(`Error compiling template ${a} for action ${n.identifier}`,d)}}),n.config.parsedTemplates=o})}#e;#t;set callbackFunction(t){this.connectorSDK.receiver.registerCallback(this.#r(t))}get connectorSDK(){return this.#t}#r(t){return async e=>{let n=await this.#t.receiver.getActionConfig(e);return n?t(e,n):this.#t.receiver.responses.badRequest("Action not found")(e)}}};var l=class{#e;constructor(t){this.#e=t}get jsonrpc(){return"2.0"}async execute(t){let e=Math.floor(1e7+Math.random()*9e7);return(await this.#e.post("/operations",{id:e,jsonrpc:this.jsonrpc,method:this.method,params:t})).data.result.id}};var s=class extends l{static{this.TYPE="create-mission"}get method(){return"createMission"}};var g=class{#e;#t;constructor(t,e){this.#e=t,this.#t={[s.TYPE]:new s(e)}}get callbackFunctionChain(){return this.#r(this.#e.receiver.emitEventType(this.#e.receiver.responses.created()))}#r(t){return async(e,n)=>{let o=n.config.parsedTemplates,a=o.action({inputs:e.payload}).trim(),p=this.#t[a];if(!p)return this.#e.receiver.responses.badRequest(`Action ${a} does not exist.`)(e);let d=o.params({inputs:e.payload}).trim(),C=await p.execute(JSON.parse(d));return this.#e.logger.info(`Action ${a} executed successfully with id: ${C}`),t(e)}}};var c=class r{static{this.NAME="otto-fleet-manager-v2-extractor-missions"}static{this.INTERVAL=60}#e;#t;constructor(t,e){this.#e=t,this.#t=e}get name(){return r.NAME}async onRun(){let t=new URLSearchParams({limit:"100",offset:"0"});for(;;){let e=await this.#t.get(`/missions?${t.toString()}`);if(await this.#e.sender.documents(e.data.results,{collection:"missions",keyField:"id"}),!e.data.next)break;let n=new URL(e.data.next);if(!n.searchParams.get("offset"))break;t.set("offset",n.searchParams.get("offset")||"0")}}};var u=class extends f{constructor(e,n){super(e,n);this.init=async()=>{await Promise.all([this.connectorSDK.processing.registerInterval(c.INTERVAL,new c(this.connectorSDK,this.#e))])};let{config:o}=this.connectorSDK;this.#e=this.connectorSDK.httpClient({baseUrl:`https://${o.hostname}/api/fleet/v2`});let a=new g(this.connectorSDK,this.#e);this.callbackFunction=a.callbackFunctionChain}#e};0&&(module.exports={ConnectorRunnerOttoFleetManagerV2});
2
2
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../libs/connector-runner-otto-fleet-manager-v2/src/index.ts", "../../../libs/connector-runtime-sdk/src/lib/connector-runtime.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/actions/base-action.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/actions/create-mission.action.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/actions/actions-handler.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/extractors/missions.extractor.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/connector-runner-otto-fleet-manager-v2.ts"],
4
- "sourcesContent": ["export * from './lib/connector-runner-otto-fleet-manager-v2';\n", "import process from 'node:process';\n\nimport {\n KafkaCallbackResponse,\n BaseConnectorConfig,\n ActionInterface,\n ConnectorInterface,\n XodJobType,\n} from '@xip-online-data/types';\n\nimport { ConnectorRuntimeInterface } from './connector-runtime.interface';\nimport { CompileDelegate, ConnectorSDKInterface } from './sdk';\n\nexport interface IpcMessage {\n cmd: string;\n message: string;\n}\n\nexport abstract class ConnectorRuntimeSDK<\n T extends BaseConnectorConfig = BaseConnectorConfig,\n> implements ConnectorRuntimeInterface {\n readonly #IPC_CHANNEL = 'connector-runtime';\n\n readonly #connectorSDK: ConnectorSDKInterface<T>;\n\n constructor(\n connector: ConnectorInterface,\n connectorSDK: ConnectorSDKInterface,\n ) {\n this.#connectorSDK = connectorSDK as ConnectorSDKInterface<T>;\n\n if (process.on) {\n process.on('message', (message: IpcMessage) => {\n if (message.cmd === this.#IPC_CHANNEL) {\n connectorSDK.logger.verbose(\n `${process.pid} Received message from parent process:`,\n message,\n );\n }\n });\n } else {\n connectorSDK.logger.warn(\n 'IPC channel is not available. process.on is undefined.',\n );\n }\n\n if (!process.send) {\n // Check if process.send is available\n connectorSDK.logger.warn(\n 'IPC channel is not available. process.send is undefined.',\n );\n }\n\n // eslint-disable-next-line no-restricted-syntax\n connector.actions?.forEach((action: ActionInterface) => {\n if (action.config['templates'] === undefined) {\n return;\n }\n\n const containers: {\n [key: string]: CompileDelegate;\n } = {};\n\n Object.entries(action.config['templates']).forEach(([key, value]) => {\n try {\n // eslint-disable-next-line security/detect-object-injection\n containers[key] = connectorSDK.templating.compile(value);\n } catch (error: unknown) {\n connectorSDK.logger.error(\n `Error compiling template ${key} for action ${action.identifier}`,\n error,\n );\n }\n });\n\n // eslint-disable-next-line no-param-reassign\n action.config['parsedTemplates'] = containers;\n });\n }\n\n public init: () => Promise<void> = () => Promise.resolve();\n\n public start: () => Promise<void> = () => Promise.resolve();\n\n public stop: () => Promise<void> = () => Promise.resolve();\n\n set callbackFunction(\n callback: (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse>,\n ) {\n this.connectorSDK.receiver.registerCallback(\n this.#enrichWithActionConfig(callback),\n );\n }\n\n protected get connectorSDK(): ConnectorSDKInterface<T> {\n return this.#connectorSDK;\n }\n\n #enrichWithActionConfig(\n callbackFunction: (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse>,\n ): (message: XodJobType) => Promise<KafkaCallbackResponse> {\n return async (message: XodJobType) => {\n const action = await this.#connectorSDK.receiver.getActionConfig(message);\n if (!action) {\n return this.#connectorSDK.receiver.responses.badRequest(\n 'Action not found',\n )(message);\n }\n return callbackFunction(message, action);\n };\n }\n}\n", "import { HttpClientSDKInterface } from '@transai/connector-runtime-sdk';\n\nimport { OttoFleetManagerApiAction } from '../types';\n\nexport abstract class BaseAction<\n T = Record<string, string | number | unknown>,\n R = string,\n> implements OttoFleetManagerApiAction<T, R>\n{\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(httpClient: HttpClientSDKInterface) {\n this.#httpClient = httpClient;\n }\n\n get jsonrpc(): string {\n return '2.0';\n }\n\n abstract get method(): string;\n\n async execute(params: T): Promise<R> {\n // 8 digits random id\n const id = Math.floor(10000000 + Math.random() * 90000000);\n\n const response = await this.#httpClient.post<\n { id: number; result: { id: string } },\n {\n id: number;\n jsonrpc: string;\n method: string;\n params: T;\n }\n >('/operations', {\n id,\n jsonrpc: this.jsonrpc,\n method: this.method,\n params,\n });\n\n return response.data.result.id as R;\n }\n}\n", "import { OttoFleetManagerApiMission, OttoFleetManagerApiTask } from '../types';\n\nimport { BaseAction } from './base-action';\n\ntype CreateMissionParams = {\n mission: OttoFleetManagerApiMission;\n tasks?: Array<OttoFleetManagerApiTask>;\n};\n\nexport class CreateMissionAction extends BaseAction<CreateMissionParams> {\n static readonly TYPE = 'create-mission';\n\n get method(): string {\n return 'createMission';\n }\n}\n", "import {\n CompileDelegate,\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n} from '@transai/connector-runtime-sdk';\nimport {\n ActionInterface,\n KafkaCallbackResponse,\n XodJobType,\n} from '@xip-online-data/types';\n\nimport { OttoFleetManagerApiAction, OttoFleetManagerV2Config } from '../types';\n\nimport { CreateMissionAction } from './create-mission.action';\n\nexport class ActionsHandler {\n readonly #sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>;\n\n readonly #actionsMap: Record<string, OttoFleetManagerApiAction>;\n\n constructor(\n sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>,\n httpClient: HttpClientSDKInterface,\n ) {\n this.#sdk = sdk;\n this.#actionsMap = {\n [CreateMissionAction.TYPE]: new CreateMissionAction(httpClient),\n };\n }\n\n get callbackFunctionChain(): (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse> {\n return this.#actionCallbackFunction(\n this.#sdk.receiver.emitEventType(this.#sdk.receiver.responses.created()),\n );\n }\n\n #actionCallbackFunction(\n callbackFunction: (message: XodJobType) => Promise<KafkaCallbackResponse>,\n ) {\n return async (\n message: XodJobType,\n action: ActionInterface,\n ): Promise<KafkaCallbackResponse> => {\n const handleBars = action.config['parsedTemplates'] as {\n action: CompileDelegate;\n params: CompileDelegate;\n };\n\n const parsedAction = handleBars\n .action({\n inputs: message.payload,\n })\n .trim();\n\n const actionInstance = this.#actionsMap[parsedAction];\n if (!actionInstance) {\n return this.#sdk.receiver.responses.badRequest(\n `Action ${parsedAction} does not exist.`,\n )(message);\n }\n\n const parsedParams = handleBars\n .params({\n inputs: message.payload,\n })\n .trim();\n\n const id = await actionInstance.execute(JSON.parse(parsedParams));\n this.#sdk.logger.info(\n `Action ${parsedAction} executed successfully with id: ${id}`,\n );\n\n return callbackFunction(message);\n };\n }\n}\n", "import {\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n IntervalHandler,\n} from '@transai/connector-runtime-sdk';\n\nimport {\n OttoFleetManagerApiMission,\n OttoFleetManagerApiResponse,\n OttoFleetManagerV2Config,\n} from '../types';\n\nexport class MissionsExtractor implements IntervalHandler {\n static readonly NAME = 'otto-fleet-manager-v2-extractor-missions';\n\n static readonly INTERVAL = 60;\n\n readonly #sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>;\n\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(\n sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>,\n httpClient: HttpClientSDKInterface,\n ) {\n this.#sdk = sdk;\n this.#httpClient = httpClient;\n }\n\n get name(): string {\n return MissionsExtractor.NAME;\n }\n\n async onRun(): Promise<void> {\n const searchParams = new URLSearchParams({\n limit: '100',\n offset: '0',\n });\n\n while (true) {\n const missions =\n // eslint-disable-next-line no-await-in-loop\n await this.#httpClient.get<\n OttoFleetManagerApiResponse<OttoFleetManagerApiMission>\n >(`/missions?${searchParams.toString()}`);\n\n // eslint-disable-next-line no-await-in-loop\n await this.#sdk.sender.documents<OttoFleetManagerApiMission>(\n missions.data.results,\n {\n collection: 'missions',\n keyField: 'id',\n },\n );\n\n if (!missions.data.next) {\n break;\n }\n\n const url = new URL(missions.data.next);\n if (!url.searchParams.get('offset')) {\n break;\n }\n\n searchParams.set('offset', url.searchParams.get('offset') || '0');\n }\n }\n}\n", "import {\n ConnectorRuntimeSDK,\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n} from '@transai/connector-runtime-sdk';\nimport { ConnectorInterface } from '@xip-online-data/types';\n\nimport { ActionsHandler } from './actions/actions-handler';\nimport { MissionsExtractor } from './extractors/missions.extractor';\nimport { OttoFleetManagerV2Config } from './types';\n\nexport class ConnectorRunnerOttoFleetManagerV2 extends ConnectorRuntimeSDK<OttoFleetManagerV2Config> {\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(\n connector: ConnectorInterface,\n connectorSDK: ConnectorSDKInterface,\n ) {\n super(connector, connectorSDK);\n\n const { config } = this.connectorSDK;\n this.#httpClient = this.connectorSDK.httpClient({\n baseUrl: `https://${config.hostname}/api/fleet/v2`,\n });\n\n const actionsHandler = new ActionsHandler(\n this.connectorSDK,\n this.#httpClient,\n );\n\n this.callbackFunction = actionsHandler.callbackFunctionChain;\n }\n\n override init = async (): Promise<void> => {\n await Promise.all([\n this.connectorSDK.processing.registerInterval(\n MissionsExtractor.INTERVAL,\n new MissionsExtractor(this.connectorSDK, this.#httpClient),\n ),\n ]);\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export * from './lib/connector-runner-otto-fleet-manager-v2';\n", "import process from 'node:process';\n\nimport { ConnectorRuntimeInterface } from './connector-runtime.interface';\nimport { CompileDelegate, ConnectorSDKInterface } from './sdk';\nimport {\n ActionInterface,\n BaseConnectorConfig,\n ConnectorInterface,\n KafkaCallbackResponse,\n XodJobType,\n} from './types';\n\nexport interface IpcMessage {\n cmd: string;\n message: string;\n}\n\nexport abstract class ConnectorRuntimeSDK<\n T extends BaseConnectorConfig = BaseConnectorConfig,\n> implements ConnectorRuntimeInterface {\n readonly #IPC_CHANNEL = 'connector-runtime';\n\n readonly #connectorSDK: ConnectorSDKInterface<T>;\n\n constructor(\n connector: ConnectorInterface,\n connectorSDK: ConnectorSDKInterface,\n ) {\n this.#connectorSDK = connectorSDK as ConnectorSDKInterface<T>;\n\n if (process.on) {\n process.on('message', (message: IpcMessage) => {\n if (message.cmd === this.#IPC_CHANNEL) {\n connectorSDK.logger.verbose(\n `${process.pid} Received message from parent process:`,\n message,\n );\n }\n });\n } else {\n connectorSDK.logger.warn(\n 'IPC channel is not available. process.on is undefined.',\n );\n }\n\n if (!process.send) {\n // Check if process.send is available\n connectorSDK.logger.warn(\n 'IPC channel is not available. process.send is undefined.',\n );\n }\n\n // eslint-disable-next-line no-restricted-syntax\n connector.actions?.forEach((action: ActionInterface) => {\n if (action.config['templates'] === undefined) {\n return;\n }\n\n const containers: {\n [key: string]: CompileDelegate;\n } = {};\n\n Object.entries(action.config['templates']).forEach(([key, value]) => {\n try {\n // eslint-disable-next-line security/detect-object-injection\n containers[key] = connectorSDK.templating.compile(value);\n } catch (error: unknown) {\n connectorSDK.logger.error(\n `Error compiling template ${key} for action ${action.identifier}`,\n error,\n );\n }\n });\n\n // eslint-disable-next-line no-param-reassign\n action.config['parsedTemplates'] = containers;\n });\n }\n\n public init: () => Promise<void> = () => Promise.resolve();\n\n public start: () => Promise<void> = () => Promise.resolve();\n\n public stop: () => Promise<void> = () => Promise.resolve();\n\n set callbackFunction(\n callback: (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse>,\n ) {\n this.connectorSDK.receiver.registerCallback(\n this.#enrichWithActionConfig(callback),\n );\n }\n\n protected get connectorSDK(): ConnectorSDKInterface<T> {\n return this.#connectorSDK;\n }\n\n #enrichWithActionConfig(\n callbackFunction: (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse>,\n ): (message: XodJobType) => Promise<KafkaCallbackResponse> {\n return async (message: XodJobType) => {\n const action = await this.#connectorSDK.receiver.getActionConfig(message);\n if (!action) {\n return this.#connectorSDK.receiver.responses.badRequest(\n 'Action not found',\n )(message);\n }\n return callbackFunction(message, action);\n };\n }\n}\n", "import { HttpClientSDKInterface } from '@transai/connector-runtime-sdk';\n\nimport { OttoFleetManagerApiAction } from '../types';\n\nexport abstract class BaseAction<\n T = Record<string, string | number | unknown>,\n R = string,\n> implements OttoFleetManagerApiAction<T, R>\n{\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(httpClient: HttpClientSDKInterface) {\n this.#httpClient = httpClient;\n }\n\n get jsonrpc(): string {\n return '2.0';\n }\n\n abstract get method(): string;\n\n async execute(params: T): Promise<R> {\n // 8 digits random id\n const id = Math.floor(10000000 + Math.random() * 90000000);\n\n const response = await this.#httpClient.post<\n { id: number; result: { id: string } },\n {\n id: number;\n jsonrpc: string;\n method: string;\n params: T;\n }\n >('/operations', {\n id,\n jsonrpc: this.jsonrpc,\n method: this.method,\n params,\n });\n\n return response.data.result.id as R;\n }\n}\n", "import { OttoFleetManagerApiMission, OttoFleetManagerApiTask } from '../types';\n\nimport { BaseAction } from './base-action';\n\ntype CreateMissionParams = {\n mission: OttoFleetManagerApiMission;\n tasks?: Array<OttoFleetManagerApiTask>;\n};\n\nexport class CreateMissionAction extends BaseAction<CreateMissionParams> {\n static readonly TYPE = 'create-mission';\n\n get method(): string {\n return 'createMission';\n }\n}\n", "import {\n CompileDelegate,\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n} from '@transai/connector-runtime-sdk';\nimport {\n ActionInterface,\n KafkaCallbackResponse,\n XodJobType,\n} from '@xip-online-data/types';\n\nimport { OttoFleetManagerApiAction, OttoFleetManagerV2Config } from '../types';\n\nimport { CreateMissionAction } from './create-mission.action';\n\nexport class ActionsHandler {\n readonly #sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>;\n\n readonly #actionsMap: Record<string, OttoFleetManagerApiAction>;\n\n constructor(\n sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>,\n httpClient: HttpClientSDKInterface,\n ) {\n this.#sdk = sdk;\n this.#actionsMap = {\n [CreateMissionAction.TYPE]: new CreateMissionAction(httpClient),\n };\n }\n\n get callbackFunctionChain(): (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse> {\n return this.#actionCallbackFunction(\n this.#sdk.receiver.emitEventType(this.#sdk.receiver.responses.created()),\n );\n }\n\n #actionCallbackFunction(\n callbackFunction: (message: XodJobType) => Promise<KafkaCallbackResponse>,\n ) {\n return async (\n message: XodJobType,\n action: ActionInterface,\n ): Promise<KafkaCallbackResponse> => {\n const handleBars = action.config['parsedTemplates'] as {\n action: CompileDelegate;\n params: CompileDelegate;\n };\n\n const parsedAction = handleBars\n .action({\n inputs: message.payload,\n })\n .trim();\n\n const actionInstance = this.#actionsMap[parsedAction];\n if (!actionInstance) {\n return this.#sdk.receiver.responses.badRequest(\n `Action ${parsedAction} does not exist.`,\n )(message);\n }\n\n const parsedParams = handleBars\n .params({\n inputs: message.payload,\n })\n .trim();\n\n const id = await actionInstance.execute(JSON.parse(parsedParams));\n this.#sdk.logger.info(\n `Action ${parsedAction} executed successfully with id: ${id}`,\n );\n\n return callbackFunction(message);\n };\n }\n}\n", "import {\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n IntervalHandler,\n} from '@transai/connector-runtime-sdk';\n\nimport {\n OttoFleetManagerApiMission,\n OttoFleetManagerApiResponse,\n OttoFleetManagerV2Config,\n} from '../types';\n\nexport class MissionsExtractor implements IntervalHandler {\n static readonly NAME = 'otto-fleet-manager-v2-extractor-missions';\n\n static readonly INTERVAL = 60;\n\n readonly #sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>;\n\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(\n sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>,\n httpClient: HttpClientSDKInterface,\n ) {\n this.#sdk = sdk;\n this.#httpClient = httpClient;\n }\n\n get name(): string {\n return MissionsExtractor.NAME;\n }\n\n async onRun(): Promise<void> {\n const searchParams = new URLSearchParams({\n limit: '100',\n offset: '0',\n });\n\n while (true) {\n const missions =\n // eslint-disable-next-line no-await-in-loop\n await this.#httpClient.get<\n OttoFleetManagerApiResponse<OttoFleetManagerApiMission>\n >(`/missions?${searchParams.toString()}`);\n\n // eslint-disable-next-line no-await-in-loop\n await this.#sdk.sender.documents<OttoFleetManagerApiMission>(\n missions.data.results,\n {\n collection: 'missions',\n keyField: 'id',\n },\n );\n\n if (!missions.data.next) {\n break;\n }\n\n const url = new URL(missions.data.next);\n if (!url.searchParams.get('offset')) {\n break;\n }\n\n searchParams.set('offset', url.searchParams.get('offset') || '0');\n }\n }\n}\n", "import {\n ConnectorRuntimeSDK,\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n} from '@transai/connector-runtime-sdk';\nimport { ConnectorInterface } from '@xip-online-data/types';\n\nimport { ActionsHandler } from './actions/actions-handler';\nimport { MissionsExtractor } from './extractors/missions.extractor';\nimport { OttoFleetManagerV2Config } from './types';\n\nexport class ConnectorRunnerOttoFleetManagerV2 extends ConnectorRuntimeSDK<OttoFleetManagerV2Config> {\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(\n connector: ConnectorInterface,\n connectorSDK: ConnectorSDKInterface,\n ) {\n super(connector, connectorSDK);\n\n const { config } = this.connectorSDK;\n this.#httpClient = this.connectorSDK.httpClient({\n baseUrl: `https://${config.hostname}/api/fleet/v2`,\n });\n\n const actionsHandler = new ActionsHandler(\n this.connectorSDK,\n this.#httpClient,\n );\n\n this.callbackFunction = actionsHandler.callbackFunctionChain;\n }\n\n override init = async (): Promise<void> => {\n await Promise.all([\n this.connectorSDK.processing.registerInterval(\n MissionsExtractor.INTERVAL,\n new MissionsExtractor(this.connectorSDK, this.#httpClient),\n ),\n ]);\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["index_exports", "__export", "ConnectorRunnerOttoFleetManagerV2", "__toCommonJS", "import_node_process", "ConnectorRuntimeSDK", "connector", "connectorSDK", "#IPC_CHANNEL", "#connectorSDK", "process", "message", "action", "containers", "key", "value", "error", "callback", "#enrichWithActionConfig", "callbackFunction", "BaseAction", "#httpClient", "httpClient", "params", "id", "CreateMissionAction", "BaseAction", "ActionsHandler", "#sdk", "#actionsMap", "sdk", "httpClient", "CreateMissionAction", "#actionCallbackFunction", "callbackFunction", "message", "action", "handleBars", "parsedAction", "actionInstance", "parsedParams", "id", "MissionsExtractor", "_MissionsExtractor", "#sdk", "#httpClient", "sdk", "httpClient", "searchParams", "missions", "url", "ConnectorRunnerOttoFleetManagerV2", "ConnectorRuntimeSDK", "connector", "connectorSDK", "MissionsExtractor", "#httpClient", "config", "actionsHandler", "ActionsHandler"]
7
7
  }
package/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import p from"node:process";var l=class{constructor(t,e){this.#e="connector-runtime";this.init=()=>Promise.resolve();this.start=()=>Promise.resolve();this.stop=()=>Promise.resolve();this.#t=e,p.on?p.on("message",o=>{o.cmd===this.#e&&e.logger.verbose(`${p.pid} Received message from parent process:`,o)}):e.logger.warn("IPC channel is not available. process.on is undefined."),p.send||e.logger.warn("IPC channel is not available. process.send is undefined."),t.actions?.forEach(o=>{if(o.config.templates===void 0)return;let n={};Object.entries(o.config.templates).forEach(([r,c])=>{try{n[r]=e.templating.compile(c)}catch(g){e.logger.error(`Error compiling template ${r} for action ${o.identifier}`,g)}}),o.config.parsedTemplates=n})}#e;#t;set callbackFunction(t){this.connectorSDK.receiver.registerCallback(this.#o(t))}get connectorSDK(){return this.#t}#o(t){return async e=>{let o=await this.#t.receiver.getActionConfig(e);return o?t(e,o):this.#t.receiver.responses.badRequest("Action not found")(e)}}};var m=class{#e;constructor(t){this.#e=t}get jsonrpc(){return"2.0"}async execute(t){let e=Math.floor(1e7+Math.random()*9e7);return(await this.#e.post("/operations",{id:e,jsonrpc:this.jsonrpc,method:this.method,params:t})).data.result.id}};var i=class extends m{static{this.TYPE="create-mission"}get method(){return"createMission"}};var f=class{#e;#t;constructor(t,e){this.#e=t,this.#t={[i.TYPE]:new i(e)}}get callbackFunctionChain(){return this.#o(this.#e.receiver.emitEventType(this.#e.receiver.responses.created()))}#o(t){return async(e,o)=>{let n=o.config.parsedTemplates,r=n.action({inputs:e.payload}).trim(),c=this.#t[r];if(!c)return this.#e.receiver.responses.badRequest(`Action ${r} does not exist.`)(e);let g=n.params({inputs:e.payload}).trim(),C=await c.execute(JSON.parse(g));return this.#e.logger.info(`Action ${r} executed successfully with id: ${C}`),t(e)}}};var s=class a{static{this.NAME="otto-fleet-manager-v2-extractor-missions"}static{this.INTERVAL=60}#e;#t;constructor(t,e){this.#e=t,this.#t=e}get name(){return a.NAME}async onRun(){let t=new URLSearchParams({limit:"100",offset:"0"});for(;;){let e=await this.#t.get(`/missions?${t.toString()}`);if(await this.#e.sender.documents(e.data.results,{collection:"missions",keyField:"id"}),!e.data.next)break;let o=new URL(e.data.next);if(!o.searchParams.get("offset"))break;t.set("offset",o.searchParams.get("offset")||"0")}}};var d=class extends l{constructor(e,o){super(e,o);this.init=async()=>{await Promise.all([this.connectorSDK.processing.registerInterval(s.INTERVAL,new s(this.connectorSDK,this.#e))])};let{config:n}=this.connectorSDK;this.#e=this.connectorSDK.httpClient({baseUrl:`https://${n.hostname}/api/fleet/v2`});let r=new f(this.connectorSDK,this.#e);this.callbackFunction=r.callbackFunctionChain}#e};export{d as ConnectorRunnerOttoFleetManagerV2};
1
+ import p from"node:process";var m=class{constructor(t,e){this.#e="connector-runtime";this.init=()=>Promise.resolve();this.start=()=>Promise.resolve();this.stop=()=>Promise.resolve();this.#t=e,p.on?p.on("message",r=>{r.cmd===this.#e&&e.logger.verbose(`${p.pid} Received message from parent process:`,r)}):e.logger.warn("IPC channel is not available. process.on is undefined."),p.send||e.logger.warn("IPC channel is not available. process.send is undefined."),t.actions?.forEach(r=>{if(r.config.templates===void 0)return;let o={};Object.entries(r.config.templates).forEach(([n,c])=>{try{o[n]=e.templating.compile(c)}catch(g){e.logger.error(`Error compiling template ${n} for action ${r.identifier}`,g)}}),r.config.parsedTemplates=o})}#e;#t;set callbackFunction(t){this.connectorSDK.receiver.registerCallback(this.#r(t))}get connectorSDK(){return this.#t}#r(t){return async e=>{let r=await this.#t.receiver.getActionConfig(e);return r?t(e,r):this.#t.receiver.responses.badRequest("Action not found")(e)}}};var f=class{#e;constructor(t){this.#e=t}get jsonrpc(){return"2.0"}async execute(t){let e=Math.floor(1e7+Math.random()*9e7);return(await this.#e.post("/operations",{id:e,jsonrpc:this.jsonrpc,method:this.method,params:t})).data.result.id}};var i=class extends f{static{this.TYPE="create-mission"}get method(){return"createMission"}};var l=class{#e;#t;constructor(t,e){this.#e=t,this.#t={[i.TYPE]:new i(e)}}get callbackFunctionChain(){return this.#r(this.#e.receiver.emitEventType(this.#e.receiver.responses.created()))}#r(t){return async(e,r)=>{let o=r.config.parsedTemplates,n=o.action({inputs:e.payload}).trim(),c=this.#t[n];if(!c)return this.#e.receiver.responses.badRequest(`Action ${n} does not exist.`)(e);let g=o.params({inputs:e.payload}).trim(),u=await c.execute(JSON.parse(g));return this.#e.logger.info(`Action ${n} executed successfully with id: ${u}`),t(e)}}};var s=class a{static{this.NAME="otto-fleet-manager-v2-extractor-missions"}static{this.INTERVAL=60}#e;#t;constructor(t,e){this.#e=t,this.#t=e}get name(){return a.NAME}async onRun(){let t=new URLSearchParams({limit:"100",offset:"0"});for(;;){let e=await this.#t.get(`/missions?${t.toString()}`);if(await this.#e.sender.documents(e.data.results,{collection:"missions",keyField:"id"}),!e.data.next)break;let r=new URL(e.data.next);if(!r.searchParams.get("offset"))break;t.set("offset",r.searchParams.get("offset")||"0")}}};var d=class extends m{constructor(e,r){super(e,r);this.init=async()=>{await Promise.all([this.connectorSDK.processing.registerInterval(s.INTERVAL,new s(this.connectorSDK,this.#e))])};let{config:o}=this.connectorSDK;this.#e=this.connectorSDK.httpClient({baseUrl:`https://${o.hostname}/api/fleet/v2`});let n=new l(this.connectorSDK,this.#e);this.callbackFunction=n.callbackFunctionChain}#e};export{d as ConnectorRunnerOttoFleetManagerV2};
2
2
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../libs/connector-runtime-sdk/src/lib/connector-runtime.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/actions/base-action.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/actions/create-mission.action.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/actions/actions-handler.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/extractors/missions.extractor.ts", "../../../libs/connector-runner-otto-fleet-manager-v2/src/lib/connector-runner-otto-fleet-manager-v2.ts"],
4
- "sourcesContent": ["import process from 'node:process';\n\nimport {\n KafkaCallbackResponse,\n BaseConnectorConfig,\n ActionInterface,\n ConnectorInterface,\n XodJobType,\n} from '@xip-online-data/types';\n\nimport { ConnectorRuntimeInterface } from './connector-runtime.interface';\nimport { CompileDelegate, ConnectorSDKInterface } from './sdk';\n\nexport interface IpcMessage {\n cmd: string;\n message: string;\n}\n\nexport abstract class ConnectorRuntimeSDK<\n T extends BaseConnectorConfig = BaseConnectorConfig,\n> implements ConnectorRuntimeInterface {\n readonly #IPC_CHANNEL = 'connector-runtime';\n\n readonly #connectorSDK: ConnectorSDKInterface<T>;\n\n constructor(\n connector: ConnectorInterface,\n connectorSDK: ConnectorSDKInterface,\n ) {\n this.#connectorSDK = connectorSDK as ConnectorSDKInterface<T>;\n\n if (process.on) {\n process.on('message', (message: IpcMessage) => {\n if (message.cmd === this.#IPC_CHANNEL) {\n connectorSDK.logger.verbose(\n `${process.pid} Received message from parent process:`,\n message,\n );\n }\n });\n } else {\n connectorSDK.logger.warn(\n 'IPC channel is not available. process.on is undefined.',\n );\n }\n\n if (!process.send) {\n // Check if process.send is available\n connectorSDK.logger.warn(\n 'IPC channel is not available. process.send is undefined.',\n );\n }\n\n // eslint-disable-next-line no-restricted-syntax\n connector.actions?.forEach((action: ActionInterface) => {\n if (action.config['templates'] === undefined) {\n return;\n }\n\n const containers: {\n [key: string]: CompileDelegate;\n } = {};\n\n Object.entries(action.config['templates']).forEach(([key, value]) => {\n try {\n // eslint-disable-next-line security/detect-object-injection\n containers[key] = connectorSDK.templating.compile(value);\n } catch (error: unknown) {\n connectorSDK.logger.error(\n `Error compiling template ${key} for action ${action.identifier}`,\n error,\n );\n }\n });\n\n // eslint-disable-next-line no-param-reassign\n action.config['parsedTemplates'] = containers;\n });\n }\n\n public init: () => Promise<void> = () => Promise.resolve();\n\n public start: () => Promise<void> = () => Promise.resolve();\n\n public stop: () => Promise<void> = () => Promise.resolve();\n\n set callbackFunction(\n callback: (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse>,\n ) {\n this.connectorSDK.receiver.registerCallback(\n this.#enrichWithActionConfig(callback),\n );\n }\n\n protected get connectorSDK(): ConnectorSDKInterface<T> {\n return this.#connectorSDK;\n }\n\n #enrichWithActionConfig(\n callbackFunction: (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse>,\n ): (message: XodJobType) => Promise<KafkaCallbackResponse> {\n return async (message: XodJobType) => {\n const action = await this.#connectorSDK.receiver.getActionConfig(message);\n if (!action) {\n return this.#connectorSDK.receiver.responses.badRequest(\n 'Action not found',\n )(message);\n }\n return callbackFunction(message, action);\n };\n }\n}\n", "import { HttpClientSDKInterface } from '@transai/connector-runtime-sdk';\n\nimport { OttoFleetManagerApiAction } from '../types';\n\nexport abstract class BaseAction<\n T = Record<string, string | number | unknown>,\n R = string,\n> implements OttoFleetManagerApiAction<T, R>\n{\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(httpClient: HttpClientSDKInterface) {\n this.#httpClient = httpClient;\n }\n\n get jsonrpc(): string {\n return '2.0';\n }\n\n abstract get method(): string;\n\n async execute(params: T): Promise<R> {\n // 8 digits random id\n const id = Math.floor(10000000 + Math.random() * 90000000);\n\n const response = await this.#httpClient.post<\n { id: number; result: { id: string } },\n {\n id: number;\n jsonrpc: string;\n method: string;\n params: T;\n }\n >('/operations', {\n id,\n jsonrpc: this.jsonrpc,\n method: this.method,\n params,\n });\n\n return response.data.result.id as R;\n }\n}\n", "import { OttoFleetManagerApiMission, OttoFleetManagerApiTask } from '../types';\n\nimport { BaseAction } from './base-action';\n\ntype CreateMissionParams = {\n mission: OttoFleetManagerApiMission;\n tasks?: Array<OttoFleetManagerApiTask>;\n};\n\nexport class CreateMissionAction extends BaseAction<CreateMissionParams> {\n static readonly TYPE = 'create-mission';\n\n get method(): string {\n return 'createMission';\n }\n}\n", "import {\n CompileDelegate,\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n} from '@transai/connector-runtime-sdk';\nimport {\n ActionInterface,\n KafkaCallbackResponse,\n XodJobType,\n} from '@xip-online-data/types';\n\nimport { OttoFleetManagerApiAction, OttoFleetManagerV2Config } from '../types';\n\nimport { CreateMissionAction } from './create-mission.action';\n\nexport class ActionsHandler {\n readonly #sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>;\n\n readonly #actionsMap: Record<string, OttoFleetManagerApiAction>;\n\n constructor(\n sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>,\n httpClient: HttpClientSDKInterface,\n ) {\n this.#sdk = sdk;\n this.#actionsMap = {\n [CreateMissionAction.TYPE]: new CreateMissionAction(httpClient),\n };\n }\n\n get callbackFunctionChain(): (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse> {\n return this.#actionCallbackFunction(\n this.#sdk.receiver.emitEventType(this.#sdk.receiver.responses.created()),\n );\n }\n\n #actionCallbackFunction(\n callbackFunction: (message: XodJobType) => Promise<KafkaCallbackResponse>,\n ) {\n return async (\n message: XodJobType,\n action: ActionInterface,\n ): Promise<KafkaCallbackResponse> => {\n const handleBars = action.config['parsedTemplates'] as {\n action: CompileDelegate;\n params: CompileDelegate;\n };\n\n const parsedAction = handleBars\n .action({\n inputs: message.payload,\n })\n .trim();\n\n const actionInstance = this.#actionsMap[parsedAction];\n if (!actionInstance) {\n return this.#sdk.receiver.responses.badRequest(\n `Action ${parsedAction} does not exist.`,\n )(message);\n }\n\n const parsedParams = handleBars\n .params({\n inputs: message.payload,\n })\n .trim();\n\n const id = await actionInstance.execute(JSON.parse(parsedParams));\n this.#sdk.logger.info(\n `Action ${parsedAction} executed successfully with id: ${id}`,\n );\n\n return callbackFunction(message);\n };\n }\n}\n", "import {\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n IntervalHandler,\n} from '@transai/connector-runtime-sdk';\n\nimport {\n OttoFleetManagerApiMission,\n OttoFleetManagerApiResponse,\n OttoFleetManagerV2Config,\n} from '../types';\n\nexport class MissionsExtractor implements IntervalHandler {\n static readonly NAME = 'otto-fleet-manager-v2-extractor-missions';\n\n static readonly INTERVAL = 60;\n\n readonly #sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>;\n\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(\n sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>,\n httpClient: HttpClientSDKInterface,\n ) {\n this.#sdk = sdk;\n this.#httpClient = httpClient;\n }\n\n get name(): string {\n return MissionsExtractor.NAME;\n }\n\n async onRun(): Promise<void> {\n const searchParams = new URLSearchParams({\n limit: '100',\n offset: '0',\n });\n\n while (true) {\n const missions =\n // eslint-disable-next-line no-await-in-loop\n await this.#httpClient.get<\n OttoFleetManagerApiResponse<OttoFleetManagerApiMission>\n >(`/missions?${searchParams.toString()}`);\n\n // eslint-disable-next-line no-await-in-loop\n await this.#sdk.sender.documents<OttoFleetManagerApiMission>(\n missions.data.results,\n {\n collection: 'missions',\n keyField: 'id',\n },\n );\n\n if (!missions.data.next) {\n break;\n }\n\n const url = new URL(missions.data.next);\n if (!url.searchParams.get('offset')) {\n break;\n }\n\n searchParams.set('offset', url.searchParams.get('offset') || '0');\n }\n }\n}\n", "import {\n ConnectorRuntimeSDK,\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n} from '@transai/connector-runtime-sdk';\nimport { ConnectorInterface } from '@xip-online-data/types';\n\nimport { ActionsHandler } from './actions/actions-handler';\nimport { MissionsExtractor } from './extractors/missions.extractor';\nimport { OttoFleetManagerV2Config } from './types';\n\nexport class ConnectorRunnerOttoFleetManagerV2 extends ConnectorRuntimeSDK<OttoFleetManagerV2Config> {\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(\n connector: ConnectorInterface,\n connectorSDK: ConnectorSDKInterface,\n ) {\n super(connector, connectorSDK);\n\n const { config } = this.connectorSDK;\n this.#httpClient = this.connectorSDK.httpClient({\n baseUrl: `https://${config.hostname}/api/fleet/v2`,\n });\n\n const actionsHandler = new ActionsHandler(\n this.connectorSDK,\n this.#httpClient,\n );\n\n this.callbackFunction = actionsHandler.callbackFunctionChain;\n }\n\n override init = async (): Promise<void> => {\n await Promise.all([\n this.connectorSDK.processing.registerInterval(\n MissionsExtractor.INTERVAL,\n new MissionsExtractor(this.connectorSDK, this.#httpClient),\n ),\n ]);\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import process from 'node:process';\n\nimport { ConnectorRuntimeInterface } from './connector-runtime.interface';\nimport { CompileDelegate, ConnectorSDKInterface } from './sdk';\nimport {\n ActionInterface,\n BaseConnectorConfig,\n ConnectorInterface,\n KafkaCallbackResponse,\n XodJobType,\n} from './types';\n\nexport interface IpcMessage {\n cmd: string;\n message: string;\n}\n\nexport abstract class ConnectorRuntimeSDK<\n T extends BaseConnectorConfig = BaseConnectorConfig,\n> implements ConnectorRuntimeInterface {\n readonly #IPC_CHANNEL = 'connector-runtime';\n\n readonly #connectorSDK: ConnectorSDKInterface<T>;\n\n constructor(\n connector: ConnectorInterface,\n connectorSDK: ConnectorSDKInterface,\n ) {\n this.#connectorSDK = connectorSDK as ConnectorSDKInterface<T>;\n\n if (process.on) {\n process.on('message', (message: IpcMessage) => {\n if (message.cmd === this.#IPC_CHANNEL) {\n connectorSDK.logger.verbose(\n `${process.pid} Received message from parent process:`,\n message,\n );\n }\n });\n } else {\n connectorSDK.logger.warn(\n 'IPC channel is not available. process.on is undefined.',\n );\n }\n\n if (!process.send) {\n // Check if process.send is available\n connectorSDK.logger.warn(\n 'IPC channel is not available. process.send is undefined.',\n );\n }\n\n // eslint-disable-next-line no-restricted-syntax\n connector.actions?.forEach((action: ActionInterface) => {\n if (action.config['templates'] === undefined) {\n return;\n }\n\n const containers: {\n [key: string]: CompileDelegate;\n } = {};\n\n Object.entries(action.config['templates']).forEach(([key, value]) => {\n try {\n // eslint-disable-next-line security/detect-object-injection\n containers[key] = connectorSDK.templating.compile(value);\n } catch (error: unknown) {\n connectorSDK.logger.error(\n `Error compiling template ${key} for action ${action.identifier}`,\n error,\n );\n }\n });\n\n // eslint-disable-next-line no-param-reassign\n action.config['parsedTemplates'] = containers;\n });\n }\n\n public init: () => Promise<void> = () => Promise.resolve();\n\n public start: () => Promise<void> = () => Promise.resolve();\n\n public stop: () => Promise<void> = () => Promise.resolve();\n\n set callbackFunction(\n callback: (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse>,\n ) {\n this.connectorSDK.receiver.registerCallback(\n this.#enrichWithActionConfig(callback),\n );\n }\n\n protected get connectorSDK(): ConnectorSDKInterface<T> {\n return this.#connectorSDK;\n }\n\n #enrichWithActionConfig(\n callbackFunction: (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse>,\n ): (message: XodJobType) => Promise<KafkaCallbackResponse> {\n return async (message: XodJobType) => {\n const action = await this.#connectorSDK.receiver.getActionConfig(message);\n if (!action) {\n return this.#connectorSDK.receiver.responses.badRequest(\n 'Action not found',\n )(message);\n }\n return callbackFunction(message, action);\n };\n }\n}\n", "import { HttpClientSDKInterface } from '@transai/connector-runtime-sdk';\n\nimport { OttoFleetManagerApiAction } from '../types';\n\nexport abstract class BaseAction<\n T = Record<string, string | number | unknown>,\n R = string,\n> implements OttoFleetManagerApiAction<T, R>\n{\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(httpClient: HttpClientSDKInterface) {\n this.#httpClient = httpClient;\n }\n\n get jsonrpc(): string {\n return '2.0';\n }\n\n abstract get method(): string;\n\n async execute(params: T): Promise<R> {\n // 8 digits random id\n const id = Math.floor(10000000 + Math.random() * 90000000);\n\n const response = await this.#httpClient.post<\n { id: number; result: { id: string } },\n {\n id: number;\n jsonrpc: string;\n method: string;\n params: T;\n }\n >('/operations', {\n id,\n jsonrpc: this.jsonrpc,\n method: this.method,\n params,\n });\n\n return response.data.result.id as R;\n }\n}\n", "import { OttoFleetManagerApiMission, OttoFleetManagerApiTask } from '../types';\n\nimport { BaseAction } from './base-action';\n\ntype CreateMissionParams = {\n mission: OttoFleetManagerApiMission;\n tasks?: Array<OttoFleetManagerApiTask>;\n};\n\nexport class CreateMissionAction extends BaseAction<CreateMissionParams> {\n static readonly TYPE = 'create-mission';\n\n get method(): string {\n return 'createMission';\n }\n}\n", "import {\n CompileDelegate,\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n} from '@transai/connector-runtime-sdk';\nimport {\n ActionInterface,\n KafkaCallbackResponse,\n XodJobType,\n} from '@xip-online-data/types';\n\nimport { OttoFleetManagerApiAction, OttoFleetManagerV2Config } from '../types';\n\nimport { CreateMissionAction } from './create-mission.action';\n\nexport class ActionsHandler {\n readonly #sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>;\n\n readonly #actionsMap: Record<string, OttoFleetManagerApiAction>;\n\n constructor(\n sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>,\n httpClient: HttpClientSDKInterface,\n ) {\n this.#sdk = sdk;\n this.#actionsMap = {\n [CreateMissionAction.TYPE]: new CreateMissionAction(httpClient),\n };\n }\n\n get callbackFunctionChain(): (\n message: XodJobType,\n action: ActionInterface,\n ) => Promise<KafkaCallbackResponse> {\n return this.#actionCallbackFunction(\n this.#sdk.receiver.emitEventType(this.#sdk.receiver.responses.created()),\n );\n }\n\n #actionCallbackFunction(\n callbackFunction: (message: XodJobType) => Promise<KafkaCallbackResponse>,\n ) {\n return async (\n message: XodJobType,\n action: ActionInterface,\n ): Promise<KafkaCallbackResponse> => {\n const handleBars = action.config['parsedTemplates'] as {\n action: CompileDelegate;\n params: CompileDelegate;\n };\n\n const parsedAction = handleBars\n .action({\n inputs: message.payload,\n })\n .trim();\n\n const actionInstance = this.#actionsMap[parsedAction];\n if (!actionInstance) {\n return this.#sdk.receiver.responses.badRequest(\n `Action ${parsedAction} does not exist.`,\n )(message);\n }\n\n const parsedParams = handleBars\n .params({\n inputs: message.payload,\n })\n .trim();\n\n const id = await actionInstance.execute(JSON.parse(parsedParams));\n this.#sdk.logger.info(\n `Action ${parsedAction} executed successfully with id: ${id}`,\n );\n\n return callbackFunction(message);\n };\n }\n}\n", "import {\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n IntervalHandler,\n} from '@transai/connector-runtime-sdk';\n\nimport {\n OttoFleetManagerApiMission,\n OttoFleetManagerApiResponse,\n OttoFleetManagerV2Config,\n} from '../types';\n\nexport class MissionsExtractor implements IntervalHandler {\n static readonly NAME = 'otto-fleet-manager-v2-extractor-missions';\n\n static readonly INTERVAL = 60;\n\n readonly #sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>;\n\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(\n sdk: ConnectorSDKInterface<OttoFleetManagerV2Config>,\n httpClient: HttpClientSDKInterface,\n ) {\n this.#sdk = sdk;\n this.#httpClient = httpClient;\n }\n\n get name(): string {\n return MissionsExtractor.NAME;\n }\n\n async onRun(): Promise<void> {\n const searchParams = new URLSearchParams({\n limit: '100',\n offset: '0',\n });\n\n while (true) {\n const missions =\n // eslint-disable-next-line no-await-in-loop\n await this.#httpClient.get<\n OttoFleetManagerApiResponse<OttoFleetManagerApiMission>\n >(`/missions?${searchParams.toString()}`);\n\n // eslint-disable-next-line no-await-in-loop\n await this.#sdk.sender.documents<OttoFleetManagerApiMission>(\n missions.data.results,\n {\n collection: 'missions',\n keyField: 'id',\n },\n );\n\n if (!missions.data.next) {\n break;\n }\n\n const url = new URL(missions.data.next);\n if (!url.searchParams.get('offset')) {\n break;\n }\n\n searchParams.set('offset', url.searchParams.get('offset') || '0');\n }\n }\n}\n", "import {\n ConnectorRuntimeSDK,\n ConnectorSDKInterface,\n HttpClientSDKInterface,\n} from '@transai/connector-runtime-sdk';\nimport { ConnectorInterface } from '@xip-online-data/types';\n\nimport { ActionsHandler } from './actions/actions-handler';\nimport { MissionsExtractor } from './extractors/missions.extractor';\nimport { OttoFleetManagerV2Config } from './types';\n\nexport class ConnectorRunnerOttoFleetManagerV2 extends ConnectorRuntimeSDK<OttoFleetManagerV2Config> {\n readonly #httpClient: HttpClientSDKInterface;\n\n constructor(\n connector: ConnectorInterface,\n connectorSDK: ConnectorSDKInterface,\n ) {\n super(connector, connectorSDK);\n\n const { config } = this.connectorSDK;\n this.#httpClient = this.connectorSDK.httpClient({\n baseUrl: `https://${config.hostname}/api/fleet/v2`,\n });\n\n const actionsHandler = new ActionsHandler(\n this.connectorSDK,\n this.#httpClient,\n );\n\n this.callbackFunction = actionsHandler.callbackFunctionChain;\n }\n\n override init = async (): Promise<void> => {\n await Promise.all([\n this.connectorSDK.processing.registerInterval(\n MissionsExtractor.INTERVAL,\n new MissionsExtractor(this.connectorSDK, this.#httpClient),\n ),\n ]);\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["process", "ConnectorRuntimeSDK", "connector", "connectorSDK", "#IPC_CHANNEL", "#connectorSDK", "message", "action", "containers", "key", "value", "error", "callback", "#enrichWithActionConfig", "callbackFunction", "BaseAction", "#httpClient", "httpClient", "params", "id", "CreateMissionAction", "BaseAction", "ActionsHandler", "#sdk", "#actionsMap", "sdk", "httpClient", "CreateMissionAction", "#actionCallbackFunction", "callbackFunction", "message", "action", "handleBars", "parsedAction", "actionInstance", "parsedParams", "id", "MissionsExtractor", "_MissionsExtractor", "#sdk", "#httpClient", "sdk", "httpClient", "searchParams", "missions", "url", "ConnectorRunnerOttoFleetManagerV2", "ConnectorRuntimeSDK", "connector", "connectorSDK", "MissionsExtractor", "#httpClient", "config", "actionsHandler", "ActionsHandler"]
7
7
  }
@@ -1,3 +1,4 @@
1
+ export * from './lib/types';
1
2
  export * from './lib/connector-runtime';
2
3
  export * from './lib/connector-runtime.interface';
3
4
  export * from './lib/sdk';
@@ -1,6 +1,6 @@
1
- import { KafkaCallbackResponse, BaseConnectorConfig, ActionInterface, ConnectorInterface, XodJobType } from '@xip-online-data/types';
2
1
  import { ConnectorRuntimeInterface } from './connector-runtime.interface';
3
2
  import { ConnectorSDKInterface } from './sdk';
3
+ import { ActionInterface, BaseConnectorConfig, ConnectorInterface, KafkaCallbackResponse, XodJobType } from './types';
4
4
  export interface IpcMessage {
5
5
  cmd: string;
6
6
  message: string;
@@ -1,4 +1,4 @@
1
- import { ActionInterface, KafkaCallbackResponse, KafkaCallbackResponseType, XodJobType } from '@xip-online-data/types';
1
+ import { ActionInterface, KafkaCallbackResponse, KafkaCallbackResponseType, XodJobType } from '../types';
2
2
  export interface ReceiverSDKInterface {
3
3
  readonly responses: {
4
4
  readonly ok: KafkaCallbackResponseType;
@@ -1,4 +1,4 @@
1
- import { BaseConnectorConfig } from '@xip-online-data/types';
1
+ import { BaseConnectorConfig } from '../types';
2
2
  import { FilesSDKInterface } from './files.sdk.interface';
3
3
  import { HttpClientSDKInterface, HttpConfig } from './http-client.interface';
4
4
  import { LoggerSDKInterface } from './logger.sdk.interface';
@@ -0,0 +1,49 @@
1
+ export declare enum ConnectorOrigin {
2
+ from_template = "from_template",
3
+ manual = "manual"
4
+ }
5
+ export interface LegacyOutputParameterInterface {
6
+ [key: string]: string;
7
+ }
8
+ export type SupportedOutputTypes = 'string' | 'number' | 'boolean' | 'array' | 'null';
9
+ export interface OutputItemParameterInterface {
10
+ type: SupportedOutputTypes | Array<SupportedOutputTypes>;
11
+ description?: string;
12
+ required?: boolean;
13
+ }
14
+ export interface ArrayOutputParameterInterface extends OutputItemParameterInterface {
15
+ type: 'array';
16
+ items: OutputParameterInterface;
17
+ }
18
+ export interface NumberOutputParameterInterface extends OutputItemParameterInterface {
19
+ type: 'number' | Array<'number' | 'null'>;
20
+ minimum?: number;
21
+ maximum?: number;
22
+ }
23
+ export interface OutputParameterInterface {
24
+ [key: string]: OutputItemParameterInterface | ArrayOutputParameterInterface | NumberOutputParameterInterface;
25
+ }
26
+ export interface InputParameterInterface {
27
+ name: string;
28
+ description?: string;
29
+ type: 'string' | 'number' | 'boolean' | 'array';
30
+ required?: boolean;
31
+ items?: Array<InputParameterInterface>;
32
+ }
33
+ export interface ActionInterface {
34
+ identifier: string;
35
+ version: string;
36
+ tenantIdentifier: string;
37
+ name: string;
38
+ description?: string;
39
+ connectorIdentifier: string;
40
+ config: {
41
+ [key: string]: {
42
+ [key: string]: string | object;
43
+ } | string | object;
44
+ };
45
+ inputParameters: Array<InputParameterInterface>;
46
+ outputParameters: LegacyOutputParameterInterface | OutputParameterInterface;
47
+ mode?: ConnectorOrigin;
48
+ createdAt: Date;
49
+ }
@@ -0,0 +1,40 @@
1
+ export interface KafkaBrokerConfig {
2
+ groupId: string;
3
+ clientId: string;
4
+ brokers: Array<string>;
5
+ sasl?: object;
6
+ intervalCheckForNewTopics?: number;
7
+ disableLogs?: boolean;
8
+ autoCommitThreshold?: number;
9
+ autoCommitInterval?: number;
10
+ partitionsConsumedConcurrently?: number;
11
+ useConfluentLibrary?: boolean;
12
+ newConsumerProtocol?: boolean;
13
+ }
14
+ export interface KafkaCallbackResponse<T = unknown> {
15
+ success: boolean;
16
+ statusCode: number;
17
+ message: string;
18
+ payload?: T;
19
+ }
20
+ export type KafkaCallbackResponseType<T = string> = (additionalMessage?: T) => (message: XodBaseMessageType) => Promise<KafkaCallbackResponse>;
21
+ export interface XodBaseMessageType {
22
+ type: 'ACTION' | 'EVENT' | 'SOURCE' | 'JOB';
23
+ eventId: string;
24
+ eventType: string;
25
+ eventTopic?: string;
26
+ created: number;
27
+ payload: object;
28
+ ttl: number;
29
+ tenantIdentifier: string;
30
+ testRun?: boolean;
31
+ meta?: {
32
+ [key: string]: unknown;
33
+ };
34
+ }
35
+ export interface XodJobType extends XodBaseMessageType {
36
+ type: 'JOB';
37
+ actionIdentifier: string;
38
+ actionVersion: string;
39
+ payload: Record<string, unknown>;
40
+ }
@@ -0,0 +1,26 @@
1
+ import { ActionInterface, ConnectorOrigin } from './types/action';
2
+ import { KafkaBrokerConfig } from './types/kafka';
3
+ export * from './types/action';
4
+ export * from './types/kafka';
5
+ export interface BaseConnectorConfig {
6
+ processIdentifier: string;
7
+ tenantIdentifier: string;
8
+ datasourceIdentifier: string;
9
+ kafka: KafkaBrokerConfig;
10
+ action?: {
11
+ timeSensitive: boolean;
12
+ };
13
+ }
14
+ export interface ConnectorInterface<T = Partial<BaseConnectorConfig>> {
15
+ identifier: string;
16
+ connectorType: string;
17
+ tenantIdentifier: string;
18
+ name: string;
19
+ location: string;
20
+ config?: T;
21
+ enabled: boolean;
22
+ actions?: Array<ActionInterface>;
23
+ mode?: ConnectorOrigin;
24
+ createdAt?: Date;
25
+ updatedAt?: Date;
26
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transai/connector-runner-otto-fleet-manager-v2",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },