{"version":3,"sources":["js-function.ts"],"sourcesContent":["/**\n * Represents a JS function with source code that can be transferred between endpoints\n */\n\nimport { Pointer } from \"../runtime/pointers.ts\";\nimport { Runtime } from \"../runtime/runtime.ts\";\nimport { ExtensibleFunction, getDeclaredExternalVariables, getDeclaredExternalVariablesAsync, getSourceWithoutUsingDeclaration, Callable, createFunctionWithDependencyInjectionsResolveLazyPointers, hasUnresolvedLazyDependencies, getSourceWithResolvedPaths } from \"./function-utils.ts\";\n\n\nexport type JSTransferableFunctionOptions = {\n\terrorOnOriginContext?: Error,\n\tisLocal?: boolean,\n\t// when set, all relative import paths in the function body will be resolved relative to this URL\n\tcontextURL?: URL\n}\n\nexport class JSTransferableFunction extends ExtensibleFunction {\n\t\n\t#fn: (...args:unknown[])=>unknown\n\n\t// promise that resolves when all lazy dependencies are resolved\n\tpublic lazyResolved: Promise<void>\n\n\t// deno-lint-ignore constructor-super\n\tprivate constructor(intermediateFn: (...args:unknown[])=>unknown, lazyResolved: Promise<void>, public deps: Record<string,unknown>, public source: string, public flags?: string[], options?: JSTransferableFunctionOptions) {\n\t\tif (options?.errorOnOriginContext) {\n\t\t\tconst invalidIntermediateFunction = () => {throw options.errorOnOriginContext};\n\t\t\tsuper(invalidIntermediateFunction);\n\t\t\tthis.#fn = invalidIntermediateFunction;\n\t\t}\n\t\telse {\n\t\t\tlet ptr: Pointer|undefined;\n\t\t\tconst fn = (...args:any[]) => {\n\t\t\t\tif (!options?.isLocal) {\n\t\t\t\t\tif (!ptr) ptr = Pointer.getByValue(this);\n\t\t\t\t\tif (!ptr) throw new Error(\"Cannot execute js:Function, must be bound to a pointer\");\n\t\t\t\t\tconst origin = ptr.origin.main;\n\t\t\t\t\tif (origin !== Runtime.endpoint.main && !(Runtime.trustedEndpoints.get(origin)?.includes(\"remote-js-execution\")) && !Runtime.trustedEndpoints.get(ptr.origin)?.includes(\"remote-js-execution\")) {\n\t\t\t\t\t\tthrow new Error(\"Cannot execute js:Function, origin \"+ptr.origin+\" has no permission to execute js source code on this endpoint\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn intermediateFn(...args)\n\t\t\t}\n\t\t\tsuper(fn);\n\t\t\tthis.#fn = fn;\n\t\t}\n\n\t\tthis.lazyResolved = lazyResolved;\n\n\t\tthis.source = source;\n\t}\n\n\n\thandleCall(...args:any[]) {\n\t\treturn this.#fn(...args)\n\t}\n\n\t// waits until all lazy dependencies are resolved and then calls the function\n\tasync callLazy() {\n\t\tawait this.lazyResolved;\n\t\treturn this.handleCall()\n\t}\n\n\tpublic get hasUnresolvedLazyDependencies() {\n\t\treturn hasUnresolvedLazyDependencies(this.deps)\n\t}\n\n\t/**\n\t * Returns JS source\n\t */\n\toverride toString() {\n\t\treturn this.source\n\t}\n\n\t/**\n\t * @returns true if the provided function is an async function\n\t */\n\tstatic functionIsAsync(fn: (...args:unknown[])=>unknown): fn is (...args:unknown[])=>Promise<unknown> {\n\t\treturn fn.constructor.name == \"AsyncFunction\"\n\t}\n\n\n\t/**\n\t * Create a new JSTransferableFunction from a regular function.\n\t * Automatically determines dependency variables declared with use()\n\t * \n\t * Important: use createAsync for async functions instead\n\t * @param fn \n\t */\n\tstatic create<T extends (...args:unknown[])=>unknown>(fn: T, options:JSTransferableFunctionOptions = {}, useDeclaration?: {vars:{[k:string]:unknown}, flags?:string[]}): JSTransferableFunction & Callable<Parameters<T>, ReturnType<T>> {\n        const {vars, flags} = useDeclaration ?? getDeclaredExternalVariables(fn);\n\t\toptions.isLocal ??= true;\n\t\tlet source = getSourceWithoutUsingDeclaration(fn);\n\t\tif (options.contextURL) source = getSourceWithResolvedPaths(source, options.contextURL);\n\t\treturn this.#createTransferableFunction(source, vars, flags, options) as any;\n\t}\n\n\t/**\n\t * Create a new JSTransferableFunction from a regular async function.\n\t * Automatically determines dependency variables declared with use()\n\t * @param fn \n\t */\n\tstatic async createAsync<T extends (...args:unknown[])=>Promise<unknown>>(fn: T, options:JSTransferableFunctionOptions = {}): Promise<JSTransferableFunction & Callable<Parameters<T>, ReturnType<T>>> {\n\t\tconst {vars, flags} = await getDeclaredExternalVariablesAsync(fn)\t\n\t\toptions.isLocal ??= true;\n\t\tlet source = getSourceWithoutUsingDeclaration(fn);\n\t\tif (options.contextURL) source = getSourceWithResolvedPaths(source, options.contextURL);\n\t\treturn this.#createTransferableFunction(source, vars, flags, options) as any;\n\t}\n\n\t/**\n\t * Recreate a JSTransferableFunction with existing source code and dependencies\n\t * @param source \n\t * @param dependencies \n\t */\n\tstatic recreate(source: string, dependencies: Record<string, unknown>){\n\t\treturn this.#createTransferableFunction(source, dependencies)\n\t}\n\n\tstatic #createTransferableFunction(source: string, dependencies: Record<string, unknown>, flags?: string[], options?:JSTransferableFunctionOptions) {\n        const {intermediateFn, lazyResolved} = createFunctionWithDependencyInjectionsResolveLazyPointers(source, dependencies, !options?.isLocal);\n\t\treturn new JSTransferableFunction(intermediateFn, lazyResolved, dependencies, source, flags, options);\n\t}\n\n}\n\nexport function transferable<T extends (...args:unknown[])=>unknown>(fn: T): JSTransferableFunction & Callable<Parameters<T>, ReturnType<T>>\nexport function transferable<T extends (...args:unknown[])=>Promise<unknown>>(fn: T): Promise<JSTransferableFunction & Callable<Parameters<T>, ReturnType<T>>>\n\nexport function transferable(fn: (...args:unknown[])=>unknown) {\n\treturn JSTransferableFunction.functionIsAsync(fn) ? \n\t\tJSTransferableFunction.createAsync(fn) :\n\t\tJSTransferableFunction.create(fn)\n}"],"names":["Pointer","Runtime","ExtensibleFunction","getDeclaredExternalVariables","getDeclaredExternalVariablesAsync","getSourceWithoutUsingDeclaration","createFunctionWithDependencyInjectionsResolveLazyPointers","hasUnresolvedLazyDependencies","getSourceWithResolvedPaths","JSTransferableFunction","lazyResolved","intermediateFn","deps","source","flags","options","errorOnOriginContext","invalidIntermediateFunction","ptr","fn","args","isLocal","getByValue","Error","origin","main","endpoint","trustedEndpoints","get","includes","handleCall","callLazy","toString","functionIsAsync","constructor","name","create","useDeclaration","vars","contextURL","createAsync","recreate","dependencies","transferable"],"mappings":"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","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/types/","file":"js-function.ts"}