directus
1import { useEnv } from '@directus/env';
2import type { Reference } from 'isolated-vm';
3import { useLogger } from '../../../../logger.js';
4
5type Args<T> = T extends (...args: infer Args) => unknown ? Args : any[];
6type Result<T> = T extends (...args: any) => infer Result ? Result : unknown;
7
8export async function callReference<T extends (...args: any[]) => unknown | Promise<unknown>>(
9fn: Reference<T>,
10args: Args<T>,
11): Promise<Reference<Result<T>>> {
12const env = useEnv();
13const logger = useLogger();
14
15const sandboxTimeout = Number(env['EXTENSIONS_SANDBOX_TIMEOUT']);
16
17try {
18return await fn.apply(undefined, args, {
19arguments: { copy: true },
20result: { reference: true, promise: true },
21timeout: sandboxTimeout,
22});
23} catch (e) {
24if (e instanceof RangeError) {
25logger.error(`Extension sandbox has reached the memory limit`);
26logger.error(e);
27
28process.abort();
29}
30
31throw e;
32}
33}
34