{"version":3,"file":"worker.mjs","names":[],"sources":["../../src/utils.ts","../../src/test/worker.ts"],"sourcesContent":["import * as zlib from 'node:zlib'\n\nexport function toArrayBuffer(buffer: Buffer): ArrayBuffer {\n  if (buffer.byteOffset === 0 && buffer.byteLength === buffer.buffer.byteLength) {\n    return buffer.buffer as ArrayBuffer\n  } else {\n    return buffer.buffer.slice(\n      buffer.byteOffset,\n      buffer.byteOffset + buffer.byteLength\n    ) as ArrayBuffer\n  }\n}\n\nconst emptyPng = Buffer.from(\n  'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=',\n  'base64'\n)\nconst image = toArrayBuffer(emptyPng)\n\nexport async function makeFakeController() {\n  const ctrl = new maa.CustomController({\n    connect() {\n      return true\n    },\n    request_uuid() {\n      return '0'\n    },\n    screencap() {\n      return image\n    }\n  })\n  await ctrl.post_connection().wait()\n  return ctrl\n}\n\nexport function gzCompress(data: string) {\n  const buf = Buffer.from(data)\n  const compressed = zlib.gzipSync(buf)\n  return compressed.toString('base64')\n}\n\nexport function gzDecompress(data: string): string {\n  return zlib.gunzipSync(Buffer.from(data, 'base64')).toString()\n}\n","import * as fs from 'node:fs/promises'\nimport * as path from 'node:path'\nimport * as workerpool from 'workerpool'\n\nimport { makeFakeController, toArrayBuffer } from '../utils'\nimport { loadMaa } from '../utils/maa'\nimport type { RecoJob, RecoResult } from './types'\n\nawait loadMaa(\n  process.env.MAAFW_MODULE_PATH,\n  path.join(process.env.MAAFW_LOG_DIR, `maa-${process.env.MAATOOLS_POOL_ID}-${process.pid}`)\n)\n\nconst stdoutLevels = ['Off', 'Fatal', 'Error', 'Warn', 'Info', 'Debug', 'Trace', 'All'] as const\ntype MaaStdoutLevel = (typeof stdoutLevels)[number]\nif (\n  process.env.MAAFW_STDOUT_LEVEL &&\n  stdoutLevels.includes(process.env.MAAFW_STDOUT_LEVEL as MaaStdoutLevel)\n) {\n  maa.Global.stdout_level = process.env.MAAFW_STDOUT_LEVEL as MaaStdoutLevel\n}\n\nlet inst: maa.Tasker | undefined = undefined\nconst taskQueue: ((ctx: maa.Context) => Promise<void>)[] = []\nlet taskAddResolve: () => void = () => {}\n\nasync function setup() {\n  const ctrl = await makeFakeController()\n  const res = new maa.Resource()\n  for (const full of process.env.MAAFW_RESOURCE_PATHS.split(path.delimiter)) {\n    await res.post_bundle(full).wait()\n  }\n  inst = new maa.Tasker()\n  inst.resource = res\n  inst.controller = ctrl\n\n  res.register_custom_action('@mse/action', async self => {\n    while (true) {\n      while (taskQueue.length > 0) {\n        const task = taskQueue.shift()!\n        await task(self.context)\n      }\n      await new Promise<void>(resolve => {\n        taskAddResolve = resolve\n      })\n      if (taskQueue.length === 0) {\n        break\n      }\n    }\n    return true\n  })\n\n  inst!.post_task('@mse/action', {\n    '@mse/action': {\n      action: 'Custom',\n      custom_action: '@mse/action'\n    }\n  })\n}\n\nasync function performReco(job: RecoJob) {\n  if (!inst) {\n    await setup()\n  }\n\n  const image = toArrayBuffer(await fs.readFile(job.imagePath))\n  const result: RecoResult[] = []\n\n  const { promise, resolve } = Promise.withResolvers<void>()\n\n  taskQueue.push(async context => {\n    for (const node of job.nodes) {\n      const detail = await context.run_recognition(node, image)\n      result.push({\n        imagePath: job.imagePath,\n        imagePathRaw: job.imagePathRaw,\n        node: node,\n        hit: !!detail?.hit,\n        detail,\n        pid: process.pid\n      })\n    }\n    resolve()\n  })\n  taskAddResolve()\n  await promise\n\n  return result\n}\n\nworkerpool.worker(\n  {\n    performReco\n  },\n  {\n    onTerminate: () => {\n      taskAddResolve()\n    }\n  }\n)\n"],"mappings":";;;;;AAEA,SAAgB,cAAc,QAA6B;AACzD,KAAI,OAAO,eAAe,KAAK,OAAO,eAAe,OAAO,OAAO,WACjE,QAAO,OAAO;KAEd,QAAO,OAAO,OAAO,MACnB,OAAO,YACP,OAAO,aAAa,OAAO,WAC5B;;AAQL,MAAM,QAAQ,cAJG,OAAO,KACtB,oIACA,SACD,CACoC;AAErC,eAAsB,qBAAqB;CACzC,MAAM,OAAO,IAAI,IAAI,iBAAiB;EACpC,UAAU;AACR,UAAO;;EAET,eAAe;AACb,UAAO;;EAET,YAAY;AACV,UAAO;;EAEV,CAAC;AACF,OAAM,KAAK,iBAAiB,CAAC,MAAM;AACnC,QAAO;;;;ACxBT,MAAM,QACJ,QAAQ,IAAI,mBACZ,KAAK,KAAK,QAAQ,IAAI,eAAe,OAAO,QAAQ,IAAI,iBAAiB,GAAG,QAAQ,MAAM,CAC3F;AAID,IACE,QAAQ,IAAI,sBAHO;CAAC;CAAO;CAAS;CAAS;CAAQ;CAAQ;CAAS;CAAS;CAAM,CAIxE,SAAS,QAAQ,IAAI,mBAAqC,CAEvE,KAAI,OAAO,eAAe,QAAQ,IAAI;AAGxC,IAAI,OAA+B,KAAA;AACnC,MAAM,YAAqD,EAAE;AAC7D,IAAI,uBAAmC;AAEvC,eAAe,QAAQ;CACrB,MAAM,OAAO,MAAM,oBAAoB;CACvC,MAAM,MAAM,IAAI,IAAI,UAAU;AAC9B,MAAK,MAAM,QAAQ,QAAQ,IAAI,qBAAqB,MAAM,KAAK,UAAU,CACvE,OAAM,IAAI,YAAY,KAAK,CAAC,MAAM;AAEpC,QAAO,IAAI,IAAI,QAAQ;AACvB,MAAK,WAAW;AAChB,MAAK,aAAa;AAElB,KAAI,uBAAuB,eAAe,OAAM,SAAQ;AACtD,SAAO,MAAM;AACX,UAAO,UAAU,SAAS,EAExB,OADa,UAAU,OAAO,CACnB,KAAK,QAAQ;AAE1B,SAAM,IAAI,SAAc,YAAW;AACjC,qBAAiB;KACjB;AACF,OAAI,UAAU,WAAW,EACvB;;AAGJ,SAAO;GACP;AAEF,MAAM,UAAU,eAAe,EAC7B,eAAe;EACb,QAAQ;EACR,eAAe;EAChB,EACF,CAAC;;AAGJ,eAAe,YAAY,KAAc;AACvC,KAAI,CAAC,KACH,OAAM,OAAO;CAGf,MAAM,QAAQ,cAAc,MAAM,GAAG,SAAS,IAAI,UAAU,CAAC;CAC7D,MAAM,SAAuB,EAAE;CAE/B,MAAM,EAAE,SAAS,YAAY,QAAQ,eAAqB;AAE1D,WAAU,KAAK,OAAM,YAAW;AAC9B,OAAK,MAAM,QAAQ,IAAI,OAAO;GAC5B,MAAM,SAAS,MAAM,QAAQ,gBAAgB,MAAM,MAAM;AACzD,UAAO,KAAK;IACV,WAAW,IAAI;IACf,cAAc,IAAI;IACZ;IACN,KAAK,CAAC,CAAC,QAAQ;IACf;IACA,KAAK,QAAQ;IACd,CAAC;;AAEJ,WAAS;GACT;AACF,iBAAgB;AAChB,OAAM;AAEN,QAAO;;AAGT,WAAW,OACT,EACE,aACD,EACD,EACE,mBAAmB;AACjB,iBAAgB;GAEnB,CACF"}