directus
1import type { OperationHandler } from '@directus/extensions';
2import type { PromiseCallback } from '@directus/types';
3import type { Reference } from 'isolated-vm';
4import { getFlowManager } from '../../../../flows.js';
5import { callReference } from './call-reference.js';
6
7export function registerOperationGenerator() {
8const flowManager = getFlowManager();
9
10const unregisterFunctions: PromiseCallback[] = [];
11
12const registerOperation = (
13id: Reference<string>,
14cb: Reference<(options: Record<string, unknown>) => unknown | Promise<unknown> | void>,
15) => {
16if (id.typeof !== 'string') throw new TypeError('Operation config id has to be of type string');
17if (cb.typeof !== 'function') throw new TypeError('Operation config handler has to be of type function');
18
19const idCopied = id.copySync();
20
21const handler: OperationHandler = async (options) => {
22const response = await callReference(cb, [options]);
23
24return response.copy();
25};
26
27flowManager.addOperation(idCopied, handler);
28
29unregisterFunctions.push(() => {
30flowManager.removeOperation(idCopied);
31});
32};
33
34return { register: registerOperation, unregisterFunctions };
35}
36