{"version":3,"file":"worker.mjs","names":[],"sources":["../../../../src/commands/admin/parquet-to-csv/worker.ts"],"sourcesContent":["import { extractErrorMessage, CHILD_FLAG, type ToWorker } from '@transcend-io/utils';\n\nimport { parquetToCsvOneFile } from '../../../lib/helpers/index.js';\nimport { logger } from '../../../logger.js';\n\nexport type ParquetTask = {\n  /** Absolute path of the Parquet file to convert. */\n  filePath: string;\n  options: {\n    /** Optional directory where CSV output files should be written. */\n    outputDir?: string;\n    /** Whether to clear any pre-existing output before writing new ones. */\n    clearOutputDir: boolean;\n  };\n};\n\nexport type ParquetProgress = {\n  /** File being processed by the worker. */\n  filePath: string;\n  /** Rows processed so far. */\n  processed: number;\n  /** Optional known total rows (not always available). */\n  total?: number;\n};\n\nexport type ParquetResult = {\n  ok: boolean;\n  filePath: string;\n  error?: string;\n};\n\n/**\n * Worker loop: convert a single Parquet file to one or more CSV files.\n */\nexport async function runChild(): Promise<void> {\n  const workerId = Number(process.env.WORKER_ID || '0');\n  logger.info(`[w${workerId}] ready pid=${process.pid}`);\n  process.send?.({ type: 'ready' });\n\n  process.on('message', async (msg: ToWorker<ParquetTask>) => {\n    if (!msg || typeof msg !== 'object') return;\n\n    if (msg.type === 'shutdown') {\n      process.exit(0);\n    }\n    if (msg.type !== 'task') return;\n\n    const { filePath, options } = msg.payload;\n    const { outputDir, clearOutputDir } = options;\n\n    try {\n      logger.info(`[w${workerId}] processing ${filePath}`);\n      const { DuckDBInstance } = await import('@duckdb/node-api');\n      await parquetToCsvOneFile(\n        {\n          filePath,\n          outputDir,\n          clearOutputDir,\n          onProgress: (processed, total) =>\n            process.send?.({\n              type: 'progress',\n              payload: { filePath, processed, total },\n            }),\n        },\n        DuckDBInstance,\n      );\n\n      process.send?.({\n        type: 'result',\n        payload: { ok: true, filePath },\n      });\n    } catch (err) {\n      const message = extractErrorMessage(err);\n      logger.error(`[w${workerId}] ERROR ${filePath}: ${err.stack || message}`);\n      process.send?.({\n        type: 'result',\n        payload: { ok: false, filePath, error: message },\n      });\n    }\n  });\n\n  // keep alive until shutdown\n  await new Promise<never>(() => {\n    // Do nothing\n  });\n}\n\nif (process.argv.includes(CHILD_FLAG)) {\n  runChild().catch((err) => {\n    logger.error(err);\n    process.exit(1);\n  });\n}\n"],"mappings":"oLAkCA,eAAsB,GAA0B,CAC9C,IAAM,EAAW,OAAO,QAAQ,IAAI,WAAa,IAAI,CACrD,EAAO,KAAK,KAAK,EAAS,cAAc,QAAQ,MAAM,CACtD,QAAQ,OAAO,CAAE,KAAM,QAAS,CAAC,CAEjC,QAAQ,GAAG,UAAW,KAAO,IAA+B,CAM1D,GALI,CAAC,GAAO,OAAO,GAAQ,WAEvB,EAAI,OAAS,YACf,QAAQ,KAAK,EAAE,CAEb,EAAI,OAAS,QAAQ,OAEzB,GAAM,CAAE,WAAU,WAAY,EAAI,QAC5B,CAAE,YAAW,kBAAmB,EAEtC,GAAI,CACF,EAAO,KAAK,KAAK,EAAS,eAAe,IAAW,CACpD,GAAM,CAAE,kBAAmB,MAAM,OAAO,oBACxC,MAAM,EACJ,CACE,WACA,YACA,iBACA,YAAa,EAAW,IACtB,QAAQ,OAAO,CACb,KAAM,WACN,QAAS,CAAE,WAAU,YAAW,QAAO,CACxC,CAAC,CACL,CACD,EACD,CAED,QAAQ,OAAO,CACb,KAAM,SACN,QAAS,CAAE,GAAI,GAAM,WAAU,CAChC,CAAC,OACK,EAAK,CACZ,IAAM,EAAU,EAAoB,EAAI,CACxC,EAAO,MAAM,KAAK,EAAS,UAAU,EAAS,IAAI,EAAI,OAAS,IAAU,CACzE,QAAQ,OAAO,CACb,KAAM,SACN,QAAS,CAAE,GAAI,GAAO,WAAU,MAAO,EAAS,CACjD,CAAC,GAEJ,CAGF,MAAM,IAAI,YAAqB,GAE7B,CAGA,QAAQ,KAAK,SAAS,EAAW,EACnC,GAAU,CAAC,MAAO,GAAQ,CACxB,EAAO,MAAM,EAAI,CACjB,QAAQ,KAAK,EAAE,EACf"}