{"version":3,"sources":["../src/serverSimulator.ts"],"sourcesContent":["import {\n  QuickJSContextLike,\n  QuickJSHandleLike,\n  QuickJSModuleFactory,\n  QuickJSModuleLike,\n  QuickJSRuntimeLike,\n} from \"./serverScripts\";\n\nclass UnsafeHandle implements QuickJSHandleLike {\n  constructor(\n    public value: any,\n    public isError = false\n  ) {}\n\n  consume<T>(fn: (handle: QuickJSHandleLike) => T): T {\n    return fn(this);\n  }\n\n  dispose(): void {\n    // no-op\n  }\n}\n\nclass UnsafeQuickJSRuntime implements QuickJSRuntimeLike {\n  private moduleLoader:\n    | ((moduleName: string) => string | { error: Error })\n    | undefined;\n  private moduleCache = new Map<string, any>();\n\n  setModuleLoader(\n    loader: (\n      moduleName: string\n    ) => string | { error: Error } | Promise<string | { error: Error }>\n  ): void {\n    this.moduleLoader = (moduleName) => {\n      const result = loader(moduleName);\n\n      if (result && typeof (result as PromiseLike<any>).then === \"function\") {\n        throw new Error(\n          \"Async module loaders are not supported in unsafe QuickJS runtime\"\n        );\n      }\n\n      return result as string | { error: Error };\n    };\n  }\n\n  newContext(): QuickJSContextLike {\n    return new UnsafeQuickJSContext(this);\n  }\n\n  dispose(): void {\n    this.moduleCache.clear();\n    this.moduleLoader = undefined;\n  }\n\n  importModule(specifier: string, context: UnsafeQuickJSContext) {\n    const cached = this.moduleCache.get(specifier);\n    if (cached) {\n      return cached;\n    }\n\n    if (!this.moduleLoader) {\n      throw new Error(`No module loader configured for ${specifier}`);\n    }\n\n    const loaded = this.moduleLoader(specifier);\n\n    if (typeof loaded !== \"string\") {\n      throw loaded?.error ?? new Error(`Failed to load module ${specifier}`);\n    }\n\n    const moduleSource = compileModule(loaded, specifier);\n    const exports = this.evaluateModuleSource(moduleSource, context);\n    this.moduleCache.set(specifier, exports);\n    return exports;\n  }\n\n  executeModule(code: string, context: UnsafeQuickJSContext) {\n    const moduleSource = compileModule(code);\n    this.evaluateModuleSource(moduleSource, context);\n  }\n\n  private evaluateModuleSource(\n    source: string,\n    context: UnsafeQuickJSContext\n  ) {\n    const globalObject = context.getGlobalObject();\n    const consoleObject = globalObject?.console ?? globalThis.console;\n\n    // eslint-disable-next-line no-new-func\n    const evaluator = new Function(\n      \"runtimeParam\",\n      \"contextParam\",\n      \"globalParam\",\n      \"consoleParam\",\n      `\"use strict\";\nconst globalThis = globalParam;\nconst console = consoleParam ?? globalThis.console;\nconst __runtime = runtimeParam;\nconst __context = contextParam;\nreturn (${source});`\n    );\n\n    return evaluator(this, context, globalObject, consoleObject);\n  }\n}\n\nfunction createGlobalObject() {\n  const global = Object.create(null);\n  global.globalThis = global;\n  return global;\n}\n\nclass UnsafeQuickJSContext implements QuickJSContextLike {\n  private globalObject = createGlobalObject();\n  private globalHandle = new UnsafeHandle(this.globalObject);\n  private undefinedHandle = new UnsafeHandle(undefined);\n\n  constructor(private runtime: UnsafeQuickJSRuntime) {}\n\n  get global(): QuickJSHandleLike {\n    return this.globalHandle;\n  }\n\n  get undefined(): QuickJSHandleLike {\n    return this.undefinedHandle;\n  }\n\n  evalCode(\n    code: string,\n    _filename?: string,\n    options?: { type?: \"global\" | \"module\" }\n  ): QuickJSHandleLike {\n    try {\n      if (options?.type === \"module\") {\n        this.runtime.executeModule(code, this);\n        return new UnsafeHandle(undefined);\n      }\n\n      const result = executeScript(code, this.globalObject);\n      return new UnsafeHandle(result);\n    } catch (error) {\n      return new UnsafeHandle(error, true);\n    }\n  }\n\n  getGlobalObject() {\n    return this.globalObject;\n  }\n\n  unwrapResult(handle: QuickJSHandleLike): QuickJSHandleLike {\n    const unsafeHandle = handle as UnsafeHandle;\n    if (unsafeHandle.isError) {\n      throw unsafeHandle.value;\n    }\n\n    return unsafeHandle;\n  }\n\n  newFunction(\n    name: string,\n    fn: (...args: QuickJSHandleLike[]) => QuickJSHandleLike\n  ): QuickJSHandleLike {\n    const wrapped = (...args: any[]) => {\n      const handles = args.map((value) => new UnsafeHandle(value));\n      const result = fn(...handles) as UnsafeHandle;\n      return result?.value;\n    };\n\n    Object.defineProperty(wrapped, \"name\", { value: name, configurable: true });\n\n    return new UnsafeHandle(wrapped);\n  }\n\n  newObject(): QuickJSHandleLike {\n    return new UnsafeHandle({});\n  }\n\n  newString(value: string): QuickJSHandleLike {\n    return new UnsafeHandle(value);\n  }\n\n  setProp(\n    object: QuickJSHandleLike,\n    prop: string,\n    value: QuickJSHandleLike\n  ): void {\n    const target = (object as UnsafeHandle).value;\n    target[prop] = (value as UnsafeHandle).value;\n  }\n\n  dump<T>(handle: QuickJSHandleLike): T {\n    return (handle as UnsafeHandle).value as T;\n  }\n\n  dispose(): void {\n    // no-op\n  }\n}\n\nfunction executeScript(code: string, globalObject: any) {\n  const consoleObject = globalObject?.console ?? globalThis.console;\n\n  // eslint-disable-next-line no-new-func\n  const wrapped = new Function(\n    \"script\",\n    \"globalObject\",\n    \"consoleObject\",\n    `\"use strict\";\nconst globalThis = globalObject;\nconst console = consoleObject ?? globalObject.console;\nreturn eval(script);`\n  );\n\n  return wrapped(code, globalObject, consoleObject);\n}\n\nfunction compileModule(source: string, specifier?: string): string {\n  let transformed = source;\n  transformed = transformed.replace(\n    /import\\s+([A-Za-z0-9_$]+)\\s+from\\s+[\"']([^\"']+)[\"'];?/g,\n    (_match, identifier, moduleName) =>\n      `const ${identifier} = __runtime.importModule(${JSON.stringify(\n        moduleName\n      )}, __context).default;`\n  );\n\n  transformed = transformed.replace(\n    /export\\s+default\\s+function\\s+([A-Za-z0-9_$]*)\\s*\\(/g,\n    (_match, maybeName) => `__default = function ${maybeName || \"\"}(`\n  );\n\n  transformed = transformed.replace(/export\\s+default\\s+/g, \"__default = \");\n\n  const moduleSource = `\n(() => {\n  let __default;\n  const exports = {};\n  ${transformed}\n  if (__default !== undefined) {\n    exports.default = __default;\n  }\n  return exports;\n})()\n`;\n\n  try {\n    // Validate syntax\n    // eslint-disable-next-line no-new-func\n    new Function(moduleSource);\n    return moduleSource;\n  } catch (error) {\n    throw new Error(\n      `Failed to compile module${specifier ? ` ${specifier}` : \"\"}: ${\n        (error as Error)?.message ?? error\n      }`\n    );\n  }\n}\n\nclass UnsafeQuickJSModule implements QuickJSModuleLike {\n  newRuntime(): QuickJSRuntimeLike {\n    return new UnsafeQuickJSRuntime();\n  }\n}\n\nexport function createUnsafeQuickJSModule(): QuickJSModuleLike {\n  return new UnsafeQuickJSModule();\n}\n\nexport function createUnsafeQuickJSModuleFactory(): QuickJSModuleFactory {\n  return () => createUnsafeQuickJSModule();\n}\n"],"mappings":"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","names":[]}