{"version":3,"file":"binaryExecution-CW1lsgwV.mjs","names":[],"sources":["../../src/errors.ts","../../node_modules/.pnpm/tsdown@0.21.10_typescript@5.4.5/node_modules/tsdown/esm-shims.js","../../src/constants.ts","../../src/binary/binaryUtils.ts","../../src/binary/binary.ts","../../src/binary/binaryExecution.ts"],"sourcesContent":["export enum SandboxErrors {\n  InitializationFailed = 'InitializationFailed',\n  RunFailed = 'RunFailed',\n  TearDownFailed = 'TearDownFailed',\n  InvalidConfig = 'InvalidConfig',\n}\n\nexport enum BinaryErrors {\n  RunningFailed = 'RunningFailed',\n  DownloadFailed = 'DownloadFailed',\n  BinaryNotFound = 'BinaryNotFound',\n  InstallationFailed = 'InstallationFailed',\n}\n\nexport enum TcpAndLockErrors {\n  PortNotAvailable = 'PortNotAvailable',\n  LockFailed = 'LockFailed',\n  PortAcquisitionFailed = 'PortAcquisitionFailed',\n}\n\nexport class TypedError extends Error {\n  type: SandboxErrors | BinaryErrors | TcpAndLockErrors | 'UntypedError';\n  cause?: Error;\n\n  constructor(\n    message?: string,\n    type?: SandboxErrors | BinaryErrors | TcpAndLockErrors | 'UntypedError',\n    cause?: Error,\n  ) {\n    super(message);\n    this.type = type || 'UntypedError';\n    this.cause = cause;\n  }\n}\n","// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Default version of NEAR Sandbox binary to download and use\n */\nexport const DEFAULT_NEAR_SANDBOX_VERSION = '2.11.1';\n","import { stat } from 'fs/promises';\nimport * as os from 'os';\nimport { DEFAULT_NEAR_SANDBOX_VERSION } from '../constants';\n\nfunction getPlatform() {\n  const type = os.type();\n  const arch = os.arch();\n  if (type === 'Linux' && arch === 'x64') {\n    return ['Linux', 'x86_64'];\n  }\n  if (type === 'Linux' && arch === 'arm64') {\n    return ['Linux', 'aarch64'];\n  }\n  // Darwind x86_64 is not supported for quite some time :(\n  if (type === 'Darwin' && arch === 'x64') {\n    throw new Error('Darwin x86_64 is not supported');\n  }\n  if (type === 'Darwin' && arch === 'arm64') {\n    return ['Darwin', 'arm64'];\n  }\n  throw new Error(`Unsupported platform: ${type}-${arch}`);\n}\nexport function AWSUrl(version: string = DEFAULT_NEAR_SANDBOX_VERSION): string {\n  const [platform, arch] = getPlatform();\n  return `https://s3-us-west-1.amazonaws.com/build.nearprotocol.com/nearcore/${platform}-${arch}/${version}/near-sandbox.tar.gz`;\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n  try {\n    const f = await stat(filePath);\n    return f.isFile();\n  } catch {\n    return false;\n  }\n}\n","import { spawn } from 'child_process';\nimport { existsSync } from 'fs';\nimport * as fs from 'fs/promises';\nimport got from 'got';\nimport { join } from 'path';\nimport { lock } from 'proper-lockfile';\nimport * as stream from 'stream';\nimport * as tar from 'tar';\nimport { dir } from 'tmp-promise';\nimport { promisify } from 'util';\nimport { BinaryErrors, TcpAndLockErrors, TypedError } from '../errors';\nimport { AWSUrl, fileExists } from './binaryUtils';\n\nconst pipeline = promisify(stream.pipeline);\n\nexport async function downloadBin(version: string): Promise<string> {\n  const existingFile = await checkForVersion(version);\n  if (existingFile) {\n    return existingFile;\n  }\n  let url: string;\n  const fromEnv = process.env['SANDBOX_ARTIFACT_URL'];\n  if (fromEnv) {\n    url = fromEnv;\n  } else {\n    url = AWSUrl(version);\n  }\n  const dirToDownload = await dir();\n  try {\n    await pipeline(\n      got.stream(url),\n      new stream.PassThrough(),\n      tar.x({ strip: 1, C: dirToDownload.path }),\n    );\n\n    const pathToDownloadedFile = join(dirToDownload.path, 'near-sandbox');\n    const destinationFilePath = join(await getDownloadPath(version), 'near-sandbox');\n    await fs.rename(pathToDownloadedFile, destinationFilePath);\n  } catch (error) {\n    throw new TypedError(\n      `Failed to download binary. Check Url and version`,\n      BinaryErrors.DownloadFailed,\n      error instanceof Error ? error : new Error(String(error)),\n    );\n  }\n\n  const binPath = join(await getDownloadPath(version), 'near-sandbox');\n  return binPath;\n}\n\n// Returns a path to the directory where the binary will be downloaded\n// If the arg DIR_TO_DOWNLOAD_BINARY is not undefined directory will be created in the specified path\n// otherwise it will be created in the bin directory of the project\nasync function getDownloadPath(version: string): Promise<string> {\n  const baseDir = process.env['DIR_TO_DOWNLOAD_BINARY'] ?? join(__dirname, '..', '..', 'bin');\n  const dirToDownloadBin = join(baseDir, `near-sandbox-${version}`);\n\n  await fs.mkdir(dirToDownloadBin, { recursive: true });\n  return dirToDownloadBin;\n}\n\nexport async function binPath(version: string): Promise<string> {\n  const pathFromEnv = process.env['NEAR_SANDBOX_BIN_PATH'];\n\n  if (pathFromEnv) {\n    if (!existsSync(pathFromEnv)) {\n      throw new TypedError(\n        `NEAR_SANDBOX_BIN_PATH does not exist.`,\n        BinaryErrors.BinaryNotFound,\n        new Error(`${pathFromEnv} does not exist`),\n      );\n    }\n    return pathFromEnv;\n  }\n\n  const binPath = getDownloadPath(version).then((dir) => join(dir, 'near-sandbox'));\n  return binPath;\n}\n\nexport async function checkForVersion(version: string): Promise<string | undefined> {\n  const fromEnv = process.env['NEAR_SANDBOX_BIN_PATH'];\n  if (fromEnv) {\n    return fromEnv;\n  }\n\n  const downloadPath = await getDownloadPath(version);\n  const binPath = join(downloadPath, 'near-sandbox');\n\n  if (await fileExists(binPath)) {\n    return binPath;\n  }\n  return undefined;\n}\n\nexport async function installable(binPath: string): Promise<(() => Promise<void>) | null> {\n  if (existsSync(binPath)) {\n    return null;\n  }\n\n  const lockPath = `${binPath}.lock`;\n\n  let release: () => Promise<void>;\n\n  try {\n    if (!existsSync(lockPath)) {\n      await fs.writeFile(lockPath, '');\n    }\n    release = await lock(lockPath, {\n      retries: {\n        retries: 100,\n        factor: 3,\n        minTimeout: 200,\n        maxTimeout: 2 * 1000,\n        randomize: true,\n      },\n    });\n  } catch (error) {\n    throw new TypedError(\n      `Failed to acquire lock for downloading the binary.`,\n      TcpAndLockErrors.LockFailed,\n      error instanceof Error ? error : new Error(String(error)),\n    );\n  }\n\n  if (existsSync(binPath)) {\n    await release();\n    return null;\n  }\n\n  return release;\n}\n\nasync function pingBin(binPath: string): Promise<void> {\n  return new Promise((resolve, reject) => {\n    const proc = spawn(binPath, ['--version']);\n\n    let errorOutput = '';\n    proc.stderr.on('data', (chunk) => (errorOutput += chunk.toString()));\n\n    proc.on('error', (err) => {\n      reject(err);\n    });\n\n    proc.on('exit', (code, signal) => {\n      if (code === 0) {\n        resolve();\n      } else if (signal) {\n        reject(new Error(`Binary was terminated by signal: ${signal}`));\n      } else {\n        reject(new Error(`Binary exited with code ${code}. Stderr: ${errorOutput}`));\n      }\n    });\n  });\n}\n\nexport async function ensureBinWithVersion(version: string): Promise<string> {\n  let _binPath = await binPath(version);\n  const release = await installable(_binPath);\n\n  if (release) {\n    _binPath = await downloadBin(version);\n    process.env['NEAR_SANDBOX_BIN_PATH'] = _binPath;\n\n    await release();\n  }\n  try {\n    await pingBin(_binPath);\n  } catch (error) {\n    throw new TypedError(\n      `Binary doesn't respond, probably is corrupted. Try re-downloading`,\n      BinaryErrors.RunningFailed,\n      error instanceof Error ? error : new Error(String(error)),\n    );\n  }\n  return _binPath;\n}\n","import { ChildProcess, StdioOptions, spawn } from 'child_process';\nimport { join } from 'path';\nimport { TypedError } from '../errors';\nimport { ensureBinWithVersion } from './binary';\nimport { fileExists } from './binaryUtils';\n\n// initializes a sandbox with the specified version in the provided directory path\nexport async function initConfigsWithVersion(version: string, dirPath: string): Promise<void> {\n  const bin = await ensureBinWithVersion(version);\n\n  const result = spawn(bin, ['--home', dirPath, 'init', '--fast'], { stdio: [null, null, 'pipe'] });\n  await new Promise<void>((resolve, reject) => {\n    result.on('close', (code) => {\n      if (code === 0) resolve();\n      else reject();\n    });\n\n    result.on('error', (error) => {\n      reject(error);\n    });\n  });\n  const expectedFiles = ['config.json', 'genesis.json'];\n\n  for (const filename of expectedFiles) {\n    const filePath = join(dirPath, filename);\n    if (await fileExists(filePath)) continue;\n    throw new Error(`Expected file \"${filename}\" was not created in ${dirPath}`);\n  }\n}\n\nexport async function spawnWithArgsAndVersion(\n  version: string,\n  args: string[],\n  stdio: StdioOptions = ['ignore', 'ignore', 'pipe'],\n): Promise<ChildProcess> {\n  const binPath = await ensureBinWithVersion(version);\n\n  const isDebug = process.env['NEAR_ENABLE_SANDBOX_LOG'] === '1';\n  const child = spawn(binPath, args, {\n    stdio: isDebug ? 'inherit' : stdio,\n  });\n\n  if (!isDebug) {\n    child.stderr?.on('error', (chunk) => {\n      console.error(`Sandbox stderr: ${chunk.toString()}`);\n    });\n  }\n  child.on('error', (err) => {\n    throw new TypedError(\n      `Failed to spawn sandbox process: ${err}`,\n      'UntypedError',\n      err instanceof Error ? err : new Error(String(err)),\n    );\n  });\n  return child;\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}