File: /volume1/@appstore/Spreadsheet/server/task-daemon/handler.js
"use strict";const{logger:e}=require("@synology-office/logger");const{default:s}=require("./base-handler");const t={spreadsheet_snapshot:require("./tasks/spreadsheet_snapshot"),document_snapshot:require("./tasks/document_snapshot"),presentation_snapshot:require("./tasks/presentation_snapshot"),generate_ofile:require("./tasks/generate_ofile"),touch:require("./tasks/touch")};const r=new Set(["spreadsheet_snapshot","document_snapshot","presentation_snapshot"]);class o extends s{constructor(e,s,t,r){super(r);this.taskQueue=e;this.threadWorkerPool=s;this.processWorkerPool=t}onRequest(s,o){switch(s){case"thread_worker":return this.onThreadWorkerReq(o);case"process_worker":return this.onProcessWorkerReq(o);case"stat":return this.onStat()}if(!Object.prototype.hasOwnProperty.call(t,s)){this.transport.send({success:false,error:"unknown event: "+s});return}const a=r.has(s)?1:0;const n=this.taskQueue.enqueue(t[s],{arg:o,priority:a});n.then((e=>{const s={success:true};if(e){s.data=e}this.transport.send(s)})).catch((s=>{const t={success:false};if(s&&!(s instanceof Error)){t.error=s}this.transport.send(t);e.error("task execute failed:",s)})).then((()=>{this.transport.end()}))}onStat(){const e=new WeakMap;Object.keys(t).forEach((s=>e.set(t[s],s)));this.transport.end({success:true,data:{...this.taskQueue.stat(((s,t)=>`${e.get(s)}/${t&&t.object_id}`)),threadWorkers:this.threadWorkerPool.stat(),processWorkers:this.processWorkerPool.stat()}})}async onThreadWorkerReq(s){const t={success:false};try{const{method:e,args:r,description:o,timeout:a}=s;await this.threadWorkerPool.callFunction(e,r,{description:o,timeout:a});t.success=true}catch(s){e.error("thread worker execute failed:",s)}this.transport.end(t)}async onProcessWorkerReq(s){const t={success:false};try{const{method:e,args:r,description:o,timeout:a}=s;await this.processWorkerPool.callFunction(e,r,{description:o,timeout:a});t.success=true}catch(s){e.error("process worker execute failed:",s)}this.transport.end(t)}}module.exports=o;