{"version":3,"file":"eval.mjs","sourceRoot":"","sources":["../src/eval.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,wBAAwB;AACzC,OAAO,EAAE,IAAI,EAAE,sBAAsB;AACrC,OAAO,EAAE,IAAI,EAAE,aAAa;AAE5B,OAAO,EAAE,gBAAgB,EAAE,iBAAa;AAexC,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,MAAM,CAAa;IAE5B,YAAY,OAAe,EAAE,MAAkB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAEnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,8BAAY,iBAAiB,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;YACpE,oEAAoE;YACpE,qDAAqD;YACrD,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAa,EAAE,CAAC;QAE3B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;QAErD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAA0B,EAAE,EAAE;YAClD,MAAM,CACJ,OAAO,CAAC,IAAI,KAAK,cAAc,EAC/B,0CAA0C,OAAO,CAAC,IAAI,IAAI,CAC3D,CAAC;YAEF,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,QAAgB,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG;gBACb,MAAM;gBACN,MAAM;gBACN,OAAO;aACR,CAAC;YAEF,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;YAED,OAAO,MAAM,CACX,IAAI,aAAa,CACf,2CAA2C,QAAQ,GAAG,EACtD,MAAM,CACP,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { assert } from '@metamask/utils';\nimport { fork } from 'child_process';\nimport { join } from 'path';\n\nimport { validateFilePath } from './fs';\n\nexport type EvalWorkerMessage = {\n  type: 'snap-exports';\n  data: {\n    exports: string[];\n  };\n};\n\nexport type EvalOutput = {\n  stdout: string;\n  stderr: string;\n  exports: string[];\n};\n\nexport class SnapEvalError extends Error {\n  readonly output: EvalOutput;\n\n  constructor(message: string, output: EvalOutput) {\n    super(message);\n\n    this.name = 'SnapEvalError';\n    this.output = output;\n  }\n}\n\n/**\n * Spawn a new process to run the provided bundle in.\n *\n * @param bundlePath - The path to the bundle to run.\n * @returns `null` if the worker ran successfully.\n * @throws If the worker failed to run successfully.\n */\nexport async function evalBundle(bundlePath: string): Promise<EvalOutput> {\n  await validateFilePath(bundlePath);\n\n  return new Promise((resolve, reject) => {\n    const worker = fork(join(__dirname, 'eval-worker.cjs'), [bundlePath], {\n      // To avoid printing the output of the worker to the console, we set\n      // `stdio` to `pipe` and handle the output ourselves.\n      stdio: 'pipe',\n    });\n\n    let stdout = '';\n    let stderr = '';\n    let exports: string[] = [];\n\n    assert(worker.stdout, '`stdout` should be defined.');\n    assert(worker.stderr, '`stderr` should be defined.');\n\n    worker.on('message', (message: EvalWorkerMessage) => {\n      assert(\n        message.type === 'snap-exports',\n        `Received unexpected message with type \"${message.type}\".`,\n      );\n\n      exports = message.data.exports;\n    });\n\n    worker.stdout.on('data', (data: Buffer) => {\n      stdout += data.toString();\n    });\n\n    worker.stderr.on('data', (data: Buffer) => {\n      stderr += data.toString();\n    });\n\n    worker.on('exit', (exitCode: number) => {\n      const output = {\n        stdout,\n        stderr,\n        exports,\n      };\n\n      if (exitCode === 0) {\n        return resolve(output);\n      }\n\n      return reject(\n        new SnapEvalError(\n          `Process exited with non-zero exit code: ${exitCode}.`,\n          output,\n        ),\n      );\n    });\n  });\n}\n"]}