directus
1import type { ActionHandler, PromiseCallback } from '@directus/types';
2import type { Reference } from 'isolated-vm';
3import emitter from '../../../../emitter.js';
4import { callReference } from './call-reference.js';
5
6export function registerActionGenerator() {
7const unregisterFunctions: PromiseCallback[] = [];
8
9const registerAction = (event: Reference<string>, cb: Reference<(payload: unknown) => void | Promise<void>>) => {
10if (event.typeof !== 'string') throw new TypeError('Action event has to be of type string');
11if (cb.typeof !== 'function') throw new TypeError('Action handler has to be of type function');
12
13const eventCopied = event.copySync();
14
15const handler: ActionHandler = (payload) => callReference(cb, [payload]);
16
17emitter.onAction(eventCopied, handler);
18
19unregisterFunctions.push(() => {
20emitter.offAction(eventCopied, handler);
21});
22};
23
24return { register: registerAction, unregisterFunctions };
25}
26