UNPKG

46.4 kBJavaScriptView Raw
1!function(e){var t={}
2function n(r){if(t[r])return t[r].exports
3var o=t[r]={i:r,l:!1,exports:{}}
4e[r].call(o.exports,o,o.exports,n)
5o.l=!0
6return o.exports}n.m=e
7n.c=t
8n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})}
9n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})
10Object.defineProperty(e,"__esModule",{value:!0})}
11n.t=function(e,t){1&t&&(e=n(e))
12if(8&t)return e
13if(4&t&&"object"==typeof e&&e&&e.__esModule)return e
14var r=Object.create(null)
15n.r(r)
16Object.defineProperty(r,"default",{enumerable:!0,value:e})
17if(2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o))
18return r}
19n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e}
20n.d(t,"a",t)
21return t}
22n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
23n.p=""
24n(n.s=12)}([function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("path")},function(e,t){e.exports=require("util")},function(e,t){e.exports=require("crypto")},function(e,t){e.exports=require("url")},function(e,t){e.exports=require("zlib")},function(e,t){e.exports=require("http")},function(e,t){e.exports=require("https")},function(module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,"a",function(){return tryRequire})
25const tryRequire=(name="")=>{try{return eval("require")(name)}catch(e){}}},function(e){e.exports={a:"imock-snapshot",b:"0.7.0"}},function(e,t){e.exports=require("readline")},function(e,t){e.exports=require("stream")},function(e,t,n){n.r(t)
26var r=n(1)
27var o=n(0)
28var s=n(2)
29n(10)
30Object(s.promisify)(o.stat)
31const a=Object(s.promisify)(o.lstat)
32Object(s.promisify)(o.rename)
33Object(s.promisify)(o.unlink)
34Object(s.promisify)(o.access)
35const i=Object(s.promisify)(o.mkdir)
36Object(s.promisify)(o.rmdir)
37const c=Object(s.promisify)(o.readdir)
38const u=Object(s.promisify)(o.readFile)
39const p=Object(s.promisify)(o.writeFile)
40o.copyFile?Object(s.promisify)(o.copyFile):(()=>{const e=Object(s.promisify)(o.open)
41const t=Object(s.promisify)(o.fstat)})()
42r.sep
43const l=new o.Stats(-1,-1,0,-1,-1,-1,0,0,0,0,0,0,0,0)
44const d="File",g="Directory",h="SymbolicLink",m="Other",f="Error"
45const S=e=>l
46const w=e=>a(e).catch(S)
47const y=e=>e.isDirectory()?g:e.isFile()?d:e.isSymbolicLink()?h:e!==l?m:f
48const b=async(e,t)=>{void 0===t&&(t=await w(e))
49if(t.isDirectory())return
50if(t!==l)throw new Error("[createDirectory] path already taken by non-directory")
51const n=Object(r.dirname)(e)
52const o=await w(n)
53!o.isDirectory()&&await b(n,o)
54await i(e)}
55const v=e=>{console.warn(e)
56throw e}
57const k=(e,...t)=>{let n,r
58try{n=e(...t)}catch(e){r=e}return{result:n,error:r}}
59const x=async(e,...t)=>{let n,r
60try{n=await e(...t)}catch(e){r=e}return{result:n,error:r}}
61const T=({queueLengthThreshold:e,...t})=>(({outputStream:e,queueLengthThreshold:t=1024})=>{const n=[]
62const r=()=>{n.push("")
63const e=n.join("\n")
64n.length=0
65return e}
66const o=()=>{0!==n.length&&e.write(r())}
67return{add:e=>{n.push(e)
68n.length>t&&o()},save:o,end:()=>{0!==n.length&&e.write(r())
69e.end()}}})({outputStream:(({pathOutputFile:e,flag:t="w",mode:n=438,onError:r=v})=>{let s=Object(o.openSync)(e,t,n)
70let a=[]
71let i=[]
72const c=e=>e?r(e):a.length=0
73const u=e=>s&&Object(o.write)(s,e,c)
74return{write:e=>{if(e){i.push(e)
75if(0===a.length){[a,i]=[i,[]]
76process.nextTick(u,a.join(""))}}},end:()=>{const e=[...a,...i]
770!==e.length&&Object(o.writeSync)(s,e.join(""))
78Object(o.closeSync)(s)
79s=null
80i.length=a.length=0}}})(t),queueLengthThreshold:e})
81const O=[{event:"exit",listener:e=>E({eventType:"exit",code:e})},{event:"uncaughtException",listener:e=>N({eventType:"uncaughtException",error:e})},{event:"unhandledRejection",listener:(e,t)=>N({eventType:"unhandledRejection",error:e,promise:t})},...["SIGINT","SIGHUP","SIGQUIT","SIGTERM"].map(e=>({event:e,listener:()=>N({eventType:"signal",signalEventType:e})}))]
82const $=new Set
83const L=new Set
84const E=e=>{for(const t of Array.from($))k(t,e)}
85const N=async e=>{R()
86for(const t of Array.from(L))await x(t,e)
87E(e)
88process.exit(e.code||(e.error?-1:0))}
89let A=!1
90const P=()=>{A=!0
91O.forEach(({event:e,listener:t})=>process.on(e,t))}
92const R=()=>{A=!1
93O.forEach(({event:e,listener:t})=>process.removeListener(e,t))}
94const j=(...e)=>{e.forEach(e=>$.add(e))
95!A&&P()}
96const C=(...e)=>{e.forEach(e=>L.add(e))
97!A&&P()}
98const D=()=>{}
99const I=async({pathLogDirectory:e,logFilePrefix:t})=>{const n=(({add:e,...t})=>({...t,add:(...t)=>e((new Date).toISOString(),...t)}))(e?await(async({pathLogDirectory:e,prefixLogFile:t="",getLogFileName:n=(()=>`${t}${(new Date).toISOString().replace(/\W/g,"-")}.log`),saveInterval:o=3e4,splitInterval:s=864e5,...a})=>{let i
100let c
101let u
102const p=()=>{g()
103const t=Object(r.resolve)(e,n())
104i=T({...a,pathOutputFile:t})
105c=o&&setInterval(l,o)
106u=s&&setTimeout(d,s)}
107const l=()=>{i&&i.save()}
108const d=()=>{i&&p()}
109const g=()=>{i&&i.end()
110c&&clearInterval(c)
111u&&clearTimeout(u)
112i=null
113c=null
114u=null}
115await b(e)
116p()
117return{add:(...e)=>{i&&i.add(e.join(" "))},save:l,split:d,end:g}})({flags:"a",pathLogDirectory:e,getLogFileName:()=>`${t}${(new Date).toISOString().replace(/\W/g,"-")}.log`}):{add:console.log,save:D,split:D,end:D})
118C(e=>{n.add(`[EXITING] ${JSON.stringify(e)}`)})
119j(e=>{n.add(`[EXIT] ${JSON.stringify(e)}`)
120e.error&&n.add(`[EXIT][ERROR] ${e.error.stack||e.error}`)
121n.end()})
122return n}
123var M=n(3)
124var F=n(6)
125var _=n(7)
126const z=()=>"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0
127const U=z()
128const q=(()=>{try{const{performance:e}=U
129const t=e.now.bind(e)
130if(t()<=t())return t}catch(e){}try{const{process:e}=U
131const t=()=>{const[t,n]=e.hrtime()
132return 1e3*t+1e-6*n}
133if(t()<=t())return t}catch(e){}return Date.now})()
134const J=()=>Math.floor(.001*Date.now())
135const G=(e=0)=>new Promise(t=>setTimeout(t,e))
136const[H,B]=U.requestAnimationFrame?[U.requestAnimationFrame,U.cancelAnimationFrame]:[e=>setTimeout(e,1e3/60),clearTimeout]
137const V=(e,t=null,n=null)=>({value:e,prev:t,next:n})
138const Q=(e,t,n,r)=>({...V(t),key:e,size:n,expireAt:r})
139const W=({valueSizeSumMax:e,valueSizeSingleMax:t=Math.max(.05*e,1)})=>{const{clear:n,subscribe:r,unsubscribe:o,send:s}=(()=>{let e=new Set
140return{clear:()=>e.clear(),subscribe:t=>{e.add(t)},unsubscribe:t=>{e.delete(t)},send:t=>e.forEach(e=>e(t))}})()
141const a=new Map
142const i=(()=>{let e,t,n
143const r=()=>{e=new Set
144t=V(null)
145n=V(null)
146t.next=n
147n.prev=t}
148r()
149const o=(t,n)=>{const{next:r}=n
150n.next=r.prev=t
151t.prev=n
152t.next=r
153e.add(t)}
154const s=(t,n)=>{const{prev:r}=n
155n.prev=r.next=t
156t.prev=r
157t.next=n
158e.add(t)}
159const a=t=>{const{prev:n,next:r}=t
160n.next=r
161r.prev=n
162t.prev=t.next=null
163e.delete(t)}
164return{clear:r,getHead:()=>t,getTail:()=>n,getLength:()=>e.size,insertAfter:o,insertBefore:s,remove:a,removeBetween:(t,n)=>{const{prev:r}=t
165const{next:o}=n
166r.next=o
167o.prev=r
168t.prev=n.next=null
169let s=t
170for(;s;){e.delete(s)
171s=s.next}},forEach:e=>{let r=t.next
172let o=0
173for(;r!==n;){e(r,o)
174r=r.next
175o++}},forEachReverse:r=>{let o=n.prev
176let s=e.size-1
177for(;o!==t;){r(o,s)
178o=o.prev
179s--}},reverse:()=>{let e=t.next
180for(;e!==n;){const{prev:t,next:n}=e
181e.prev=n
182e.next=t
183e=n}const{next:r}=t
184const{prev:o}=n
185t.next=o
186n.prev=r
187o.prev=t
188r.next=n},setFirst:e=>{if(e===t.next)return
189const{prev:n,next:r}=e
190n.next=r
191r.prev=n
192e.prev=t
193e.next=t.next
194t.next=e},setLast:e=>{if(e===n.prev)return
195const{prev:t,next:r}=e
196t.next=r
197r.prev=t
198e.prev=n.prev
199e.next=n
200n.prev=e},push:e=>s(e,n),pop:()=>a(n.prev),unshift:e=>o(e,t),shift:()=>a(t.next)}})()
201let c=0
202const u=e=>{a.set(e.key,e)
203i.unshift(e)
204c+=e.size
205s({type:"add",key:e.key,payload:e.value})}
206const p=e=>{a.delete(e.key)
207i.remove(e)
208c-=e.size
209s({type:"delete",key:e.key,payload:e.value})}
210return{clearHub:n,subscribe:r,unsubscribe:o,getSize:()=>a.size,clear:()=>a.forEach(p),set:(n,r,o=1,s=Date.now()+6e4)=>{const l=a.get(n)
211l&&p(l)
212if(!(o>t)){for(;o+c>e;)p(i.getTail().prev)
213u(Q(n,r,o,s))}},get:(e,t=Date.now())=>{const n=a.get(e)
214if(n){if(n.expireAt<=t)return p(n)
215i.setFirst(n)
216return n.value}},touch:(e,t=Date.now()+6e4)=>{const n=a.get(e)
217if(n){n.expireAt=t
218i.setFirst(n)
219return n.value}},delete:e=>{const t=a.get(e)
220t&&p(t)
221return t&&t.value},packList:()=>{const e=[]
222i.forEachReverse(({key:t,value:n,size:r,expireAt:o})=>e.push({key:t,value:n,size:r,expireAt:o}))
223return e},parseList:(e,t=Date.now())=>e.forEach(({key:e,value:n,size:r,expireAt:o})=>{const s=Q(e,n,r,o)
224s.expireAt<=t?p(s):u(s)})}}
225const Z=Number.isInteger
226const K=e=>"object"==typeof e&&null!==e&&!Array.isArray(e)
227const Y=Array.isArray
228const X=e=>{const t=typeof e
229let n
230if("function"===t)n="()=>{...}"
231else try{n=JSON.stringify(e)}catch(e){n="{...}"}return`<${t}> ${n}`}
232const ee=(e,t,n)=>{throw new Error(`[verify|${e}]${t?` ${t};`:""} ${n}`)}
233const te=(e,t)=>(n,r)=>t(n)||ee(e,r,`get: ${X(n)}`)
234const ne=te("String",e=>"string"==typeof e)
235const re=te("Number",e=>"number"==typeof e)
236const oe=te("Integer",Z)
237te("BasicObject",K)
238te("Array",Y)
239const se=(e,t,n)=>((e,t)=>Y(e)&&e.length===t)(e,t)||ee("ArrayLength",n,`expect length: ${t}, get: ${e.length}`)
240const ae=te("Function",e=>"function"==typeof e)
241var ie=n(4)
242const ce=e=>{if(e.response.finished)return e
243const{error:t}=e.getState()
244!e.response.headersSent&&e.response.writeHead(t?500:400)
245e.response.end()}
246const ue=({url:e,method:t,headers:{host:n=""},socket:{remoteAddress:r,remotePort:o}})=>`[${t}] ${n}${e} (${r}:${o})`
247const pe=e=>t=>{const{time:n,error:r}=t.getState()
248e(ue(t.request),"|",r?"[ERROR]":"[END]",(e=>{const t=.75*Math.abs(e)
249return t<1e3?`${Math.floor(e)}ms`:t<6e4?`${(e/1e3).toFixed(2)}s`:t<36e5?`${(e/6e4).toFixed(2)}m`:t<864e5?`${(e/36e5).toFixed(2)}h`:`${(e/864e5).toFixed(2)}d`})(q()-n),t.response.statusCode,r?r.stack||r:"")}
250const le={protocol:"https:",hostname:"localhost",port:443,isSecure:!0,secureOptions:M.constants.SSL_OP_NO_SSLv3|M.constants.SSL_OP_NO_SSLv2}
251const de={protocol:"http:",hostname:"localhost",port:80,isSecure:!1}
252const ge=new Set([le.protocol,de.protocol])
253const he=ce
254const me=async({protocol:e="http:",hostname:t="localhost",port:n,fileSSLKey:r,fileSSLCert:o,fileSSLChain:s,fileSSLDHParam:a})=>{const i="https:"===e
255return(({protocol:e,...t})=>{if(!ge.has(e))throw new Error(`[createServer] invalid protocol: ${e}`);(t={..."https:"===e?le:de,...t}).baseUrl=`${e}//${t.hostname}:${t.port}`
256const n=t.isSecure?Object(_.createServer)(t):Object(F.createServer)()
257t.isSecure&&(e=>{const t=W({valueSizeSumMax:4096})
258e.on("newSession",(e,n,r)=>{t.set(e.toString("hex"),n,1,Date.now()+6e5)
259r()})
260e.on("resumeSession",(e,n)=>{n(null,t.get(e.toString("hex"))||null)})})(n)
261return{server:n,option:t,start:()=>{!n.listening&&n.listen(t.port,t.hostname)},stop:()=>{n.listening&&n.close()}}})({protocol:e,hostname:t,port:n,key:i&&r?await u(r):null,cert:i&&o?await u(o):null,ca:i&&s?await u(s):null,dhparam:i&&a?await u(a):null})}
262var fe=n(5)
263const Se="application/octet-stream"
264const we=["application/javascript;js;mjs","application/json","application/pdf","application/xml","audio/midi;mid","audio/mpeg;mp3","audio/ogg","audio/wav","audio/webm;weba","audio/x-flac;flac","font/ttf","font/otf","font/woff","font/woff2","image/bmp","image/gif","image/jpeg;jpg","image/png","image/svg+xml;svg","image/webp","image/x-icon;ico","text/css","text/csv","text/html;htm","text/plain;txt;text;conf;log;ini","text/rtf","text/xml","video/mp4;mp4v;mpg4","video/mpeg;mpg","video/webm","video/x-flv;flv","video/x-ms-wmv;wmv","video/x-msvideo;avi"].reduce((e,t)=>{const[n]=t.split(";")
265t.split("/")[1].split(";").forEach(t=>e[t]=n)
266return e},{})
267const ye=e=>new Promise((t,n)=>{const r=[]
268e.on("error",n)
269e.on("data",e=>r.push(e))
270e.on("end",()=>{e.removeListener("error",n)
271t(Buffer.concat(r))})})
272const be=(e,t)=>new Promise((n,r)=>{e.on("error",r)
273e.write(t,()=>{e.removeListener("error",r)
274n()})})
275n(11)
276const ve=Object(s.promisify)(fe.gzip)
277const ke=(e,t,n,r)=>{t&&e.response.setHeader("etag",t)
278const o=!t||!e.request.headers["if-none-match"]||!e.request.headers["if-none-match"].includes(t)
279o?e.response.writeHead(200,{"content-type":n,"content-length":r}):e.response.writeHead(304,{"content-type":n})
280return o}
281const xe=async(e,{buffer:t,bufferGzip:n,entityTag:r,type:o=Se,length:s=t.length})=>{r&&e.response.setHeader("etag",r)
282const a=!r||!e.request.headers["if-none-match"]||!e.request.headers["if-none-match"].includes(r)
283const i=a&&s&&e.request.headers["accept-encoding"]&&e.request.headers["accept-encoding"].includes("gzip")
284const c=i?n||await ve(t):t
285a?e.response.writeHead(200,i?{"content-type":o,"content-length":c.length,"content-encoding":"gzip"}:{"content-type":o,"content-length":s}):e.response.writeHead(304,{"content-type":o})
286return a&&s&&be(e.response,c)}
287const Te=(e,{object:t,entityTag:n})=>xe(e,{buffer:Buffer.from(JSON.stringify(t)),type:we.json,entityTag:n})
288const Oe=(e,t)=>({type:t,buffer:e,bufferGzip:Object(fe.gzipSync)(e),entityTag:(e=>`"${e.length.toString(16)}-${Object(M.createHash)("sha1").update(e).digest("base64")}"`)(e),length:e.length})
289const $e=(e,t,n)=>K(t)&&e.unshift(...Object.entries(t).map(([e,t],r)=>[e,t,r,n]))
290const Le=(e,t)=>void 0===e[t]?e[t]={}:e[t]
291const Ee=(e,t)=>{const n=[]
292return{routeNode:e=t.split("/").reduce((e,r)=>{if("*"===r){n.push("/*")
293return Le(e,"/*")}if(":"===r[0]){const o=r.slice(1)
294if(!o||n.includes(o))throw new Error(`[parseRouteToMap] invalid frag [${r}] for route: ${t}`)
295n.push(o)
296return Le(e,"/:PARAM")}return Le(e,r)},e),paramNameList:n}}
297const Ne=(e,t)=>{const n=[]
298const r=t.split("/")
299for(let o=0,s=r.length;o<s;o++){const s=r[o]
300if(e[s])e=e[s]
301else{if(!e["/:PARAM"]){if(e["/*"]){n.push(r.slice(o).join("/"))
302e=e["/*"]
303break}throw new Error(`[findRouteFromMap] stuck at [${s}] for route: ${t}`)}n.push(s)
304e=e["/:PARAM"]}}return{routeNode:e,paramValueList:n}}
305const Ae=(e=[],t=[])=>["<!DOCTYPE html>","<html>","<head>",'<meta charset="utf-8">','<meta name="viewport" content="minimum-scale=1, width=device-width">',...e,"</head>","<body>",...t,"</body>","</html>"].join("\n")
306const Pe=(e,t)=>{const n=document.querySelector(e)
307n&&"string"==typeof t&&(n.innerHTML=t)
308return n}
309const Re=e=>[...document.querySelectorAll(e)]
310const je=(e,t={},n=[])=>{const r=Object.assign(document.createElement(e),t)
311n.forEach(e=>e&&r.appendChild(e))
312return r}
313const Ce=(e,t=[])=>t.forEach(t=>t&&e.appendChild(t))
314const De=(e,t,...n)=>e.classList[t?"add":"remove"](...n)
315const Ie=(e,t,n,r="")=>e[t?"setAttribute":"removeAttribute"](n,r)
316const Me=()=>"complete"===document.readyState
317const Fe=e=>{if(window.iDR())return e()
318const t=()=>{if(window.iDR()){document.removeEventListener("readystatechange",t)
319e()}}
320document.addEventListener("readystatechange",t)}
321const _e={GET:"/GET",POST:"/POST",PUT:"/PUT",PATCH:"/PATCH",DELETE:"/DELETE",HEAD:"/HEAD",OPTIONS:"/OPTIONS",CONNECT:"/CONNECT",TRACE:"/TRACE"}
322const ze=(e,t="/",n="GET",r)=>{if(Array.isArray(t))return t.reduce((t,o)=>ze(e,o,n,r),e)
323if(Array.isArray(n))return n.reduce((n,o)=>ze(e,t,o,r),e)
324const{routeNode:o,paramNameList:s}=Ee(e,t)
325if(!_e[n])throw new Error(`[appendRouteMap] invalid method [${n}] for route: ${t}`)
326if(o[_e[n]])throw new Error(`[appendRouteMap] duplicate method [${n}] for route: ${t}`)
327if("function"!=typeof r)throw new Error(`[appendRouteMap] invalid routeResponder for route: ${t}`)
328o[_e[n]]={route:t,paramNameList:s,routeResponder:r}
329return e}
330const Ue=(e,t)=>(({paramMap:e},t)=>e[t])(e.getState(),t)
331const qe=e=>{const t=[]
332const n=new Set(Object.values(_e));((e,t)=>{const n=[]
333$e(n,e,0)
334for(;n.length;){const[e,r,o,s]=n.shift()
335if(t(r,e,o,s))return{value:r,key:e,index:o,level:s}
336$e(n,r,s+1)}})(e,(e,r)=>{n.has(r)&&t.push({method:r,route:e.route})})
337return t}
338const Je=(e,t=[])=>Ae(["<style>\n*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; outline-color: #f00; }\n::-webkit-scrollbar-thumb { background: #0004; }\n::-webkit-scrollbar-thumb:hover { background: #0006; }\nbody { overflow: hidden; display: flex; flex-flow: column; width: 100vw; height: 100vh; font-family: monospace; font-size: 16px; }\nbutton, .button { text-decoration: none; cursor: pointer; margin: 4px; padding: 4px; min-width: 32px; border: 0; border-radius: 4px; background: hsla(0, 0%, 70%, 0.4); box-shadow: inset 0 0 0 1px #888; }\nbutton:hover, .button:hover { background: hsla(0, 0%, 80%, 0.4); box-shadow: inset 0 0 0 1px #aaa; }\nbutton.select, button:hover.select, .button.select, .button:hover.select { color: #e00; box-shadow: inset 0 0 0 1px #e00; }\nbutton:disabled, button:disabled:hover, .button:disabled, .button:disabled:hover { cursor: default; background: hsla(0, 0%, 100%, 0.4); box-shadow: unset; }\n@media (pointer: fine) {\n ::-webkit-scrollbar { width: 14px; height: 14px; }\n button, .button, .auto-height { min-height: 20px; font-size: 14px; } \n}\n@media (pointer: coarse) {\n ::-webkit-scrollbar { width: 6px; height: 6px; }\n button, .button, .auto-height { min-height: 32px; font-size: 18px; } \n}\n</style>","<style>body { overflow: auto; align-items: start; }</style>"],["<h2>Route List</h2>","<table>",...qe(e).map(({method:e,route:t})=>`<tr><td><b>${e}</b></td><td>${"/GET"===e?`<a href="${t}">${t}</a>`:t}</td></tr>`),"</table>",...t])
339const Ge=(e,t)=>{const n=[]
340for(let r=0;r<t;r++)n.push(e(r))
341return n}
342const He=(e=0,t=!0)=>({A:()=>e,B:()=>++e,C:()=>--e,D:()=>t,E:()=>t=!1})
343const Be=(e=(e=>{}))=>{let t=He()
344let n=Promise.resolve("QUEUE_HEAD")
345return{reset:()=>{t.E()
346t=He()
347n=Promise.resolve("QUEUE_HEAD")},getLength:()=>t.A(),pushTask:r=>{const{promise:o,resolve:s}=(()=>{let e,t
348return{promise:new Promise((n,r)=>{e=n
349t=r}),resolve:n=>{const r=e
350e=t=void 0
351r&&r(n)},reject:n=>{const r=t
352e=t=void 0
353r&&r(n)}}})()
354const a=n.then(r)
355a.catch(e).then(()=>{t.C()
356t.D()&&s()})
357t.B()
358n=o
359return a}}}
360const Ve=({clearRunner:e=(()=>{}),resetRunner:t=((e,t)=>{}),getTaskId:n,getTaskInitialState:r=(e=>e),runTask:o})=>{const{reset:s,getLength:a,pushTask:i}=Be()
361const c=new Map
362const u=e=>c.get(e)
363const p=(e,t)=>{const n=u(e)
364n&&c.set(e,{...n,...t})}
365const l=e=>c.delete(e)
366return{clear:()=>{s()
367c.clear()
368return e()},getStatus:e=>({taskQueue:a(),taskStateMap:c.size,taskStateList:e?Array.from(c.entries()):void 0}),getQueueLength:a,getTaskState:u,startTask:e=>{const s=n(e)
369return c.get(s)||((e,n)=>{const s=i(()=>o(e,{getTaskState:u,updateTaskState:p})).then(t=>p(e,{result:t,promise:null,endAt:J()})).catch(n=>{p(e,{error:n,promise:null,endAt:J()})
370return t(n,e)})
371const a=r({id:e,option:n,promise:s,error:null,result:null,startAt:J(),endAt:null})
372c.set(e,a)
373return a})(s,e)},endTask:l,autoEndTask:e=>{const t=J()-Math.abs(e)
374c.forEach((e,n)=>{e.endAt&&e.endAt<=t&&l(n)})}}}
375const Qe=({runnerList:e=[],getRunnerByTaskId:t,selectRunner:n=We})=>({clear:()=>e.map(e=>e.clear()),getStatus:t=>e.map(e=>e.getStatus(t)),getQueueLength:()=>e.map(e=>e.getQueueLength()),getTaskState:n=>{const r=t(e,n)
376return r&&r.getTaskState(n)},startTask:t=>n(e,t).startTask(t),endTask:n=>{const r=t(e,n)
377return r&&r.endTask(n)},autoEndTask:t=>e.forEach(e=>e.autoEndTask(t))})
378const We=e=>e.reduce((e,t)=>e.getQueueLength()>t.getQueueLength()?t:e,e[0])
379const Ze=({protocol:e,hostname:t,hash:n,search:r,pathname:o,href:s,port:a,username:i,password:c})=>{const u={protocol:e,hostname:t,hash:n,search:r,pathname:o,href:s,path:`${o}${r}`}
380""!==a&&(u.port=Number(a));(i||c)&&(u.auth=`${i}:${c}`)
381return u}
382const Ke=(e,t=null)=>new Promise((n,r)=>{const o=("https:"===e.protocol?_.request:F.request)(e,n)
383const s=t=>{o.destroy()
384t.option=e
385r(t)}
386o.on("timeout",()=>s(new Error("NETWORK_TIMEOUT")))
387o.on("error",s)
388o.end(t)})
389const Ye=async({url:e,body:t,wait:n=5e3,maxRetry:r=0,...o})=>{o={...o,...Ze(new ie.URL(e)),timeout:n}
390await(async(e,t=1/0,n=0)=>{let r=0
391for(;;){const o=q()
392try{return await e(r,t)}catch(e){if(t<++r)throw e
393const s=n-(q()-o)
394s>0&&await G(s)}}})(async()=>{(await Ke(o,t)).destroy()},r,n)}
395const Xe=async(e,{method:t="GET",headers:n,body:r,timeout:o=1e4}={})=>{const s={...Ze(new ie.URL(e)),method:t,headers:{"accept-encoding":"gzip",...n},timeout:o}
396const a=await Ke(s,r)
397const i=a.headers
398const c=a.statusCode
399const u=c>=200&&c<300
400let p=!1
401let l
402process.nextTick(()=>{if(!l){a.destroy()
403p=!0}})
404const d=async()=>{if(void 0===l){if(p)throw new Error("PAYLOAD_ALREADY_DROPPED")
405let e=!1
406let t=!1
407o&&setTimeout(()=>{if(!t){a.destroy()
408e=!0}},o)
409l=ye("gzip"===a.headers["content-encoding"]?a.pipe(Object(fe.createGunzip)()):a).then(n=>{if(e)throw new Error("PAYLOAD_TIMEOUT")
410t=!0
411return n})}return l}
412const g=()=>d().then(e=>e.toString())
413return{headers:i,status:c,ok:u,buffer:d,text:g,json:()=>g().then(e=>JSON.parse(e))}}
414var et=n(8)
415const tt=Object.entries({addSnapShotTask:"({ projectCid, canvasZoom, canvasClip, taskList }) => {\n window.SNAPSHOT_CONTROL.addSnapShotTask({ projectCid, canvasZoom, canvasClip, taskList })\n}",checkReady:"() => {\n const { isReady } = window.SNAPSHOT_CONTROL.getState()\n return isReady\n}",checkWait:"() => {\n const { isReady, isWait } = window.SNAPSHOT_CONTROL.getState()\n return isReady && isWait\n}",getTaskResult:"() => {\n const { state } = window.SNAPSHOT_CONTROL.getState()\n return state\n}",sendResume:"() => {\n window.SNAPSHOT_CONTROL.resume()\n}",sendReset:"() => {\n window.SNAPSHOT_CONTROL.resetTaskQueue()\n window.SNAPSHOT_CONTROL.resume()\n}"}).reduce((e,[t,n])=>{e[t]=Object.assign(()=>{},{toString:()=>n})
416return e},{})
417const nt={timeout:1e4}
418const rt=()=>{process.exit(-1)}
419const ot={timeout:1e4}
420const st=e=>Object(M.createHash)("sha1").update(JSON.stringify(e),"utf8").digest("base64").replace(/\W/g,"")
421const at=async({clusterSize:e,logger:t,urlSnapshotApp:n,urlServerPingTest:o})=>{const s=await(async({logger:e})=>{e.add("[Puppeteer|Browser] init")
422const t=Object(et.a)("puppeteer")
423if(!t){const t=new Error("[Puppeteer] failed to load package puppeteer, check peerDependency")
424e.add(t)
425throw t}const n=await t.launch({args:["--no-sandbox"],headless:!0,handleSIGHUP:!1,handleSIGINT:!1,handleSIGTERM:!1})
426n.addListener("disconnected",rt)
427e.add("[Puppeteer|Browser] init complete")
428return n})({logger:t})
429C(async()=>s&&(({puppeteerBrowser:e})=>{e.removeListener("disconnected",rt)
430return e.close().catch(e=>{})})({puppeteerBrowser:s}))
431const a=Ge(e=>{let a=null
432const i=(e,n)=>{e&&t.add(`[Puppeteer|${n}] error: ${e.stack||e.toString()}`)
433return a&&(({puppeteerPage:e})=>e.close().catch(e=>{}))({puppeteerPage:a}).then(()=>{a=null})}
434return Ve({clearRunner:i,resetRunner:i,getTaskInitialState:e=>({...e,progress:0}),runTask:async(e,{getTaskState:i,updateTaskState:c})=>{a||(a=await(async({puppeteerBrowser:e,logger:t})=>{t.add("[Puppeteer|Page] init start")
435const n=await e.newPage()
436n.on("error",e=>t.add("[Puppeteer|Page] error:",e))
437n.on("pageerror",e=>t.add("[Puppeteer|Page] pageerror:",e))
438n.on("requestfailed",e=>t.add("[Puppeteer|Page] requestfailed:",{url:e.url(),method:e.method()}))
439n.on("console",e=>t.add("[Puppeteer|Page] console:",e.type(),e.text()))
440t.add("[Puppeteer|Page] init complete")
441return n})({puppeteerBrowser:s,logger:t}))
442t.add(`[Puppeteer|${e}] start`)
443await Ye({url:o,wait:2e3,maxRetry:4})
444a.url().includes(n)||await(async({urlSnapshotApp:e,puppeteerPage:t,logger:n})=>{n.add("[Puppeteer|Page] setup start")
445await t.goto(e,{waitUntil:"networkidle2",...nt})
446await t.setUserAgent("Phantom WebKit")
447await t.setViewport({width:0,height:0})
448await t.waitForFunction(tt.checkReady,nt)
449n.add("[Puppeteer|Page] setup ready")})({urlSnapshotApp:n,puppeteerPage:a,logger:t})
450const{option:u}=i(e)
451const p=await(async({option:e,puppeteerPage:t,stepCallback:n,logger:o})=>{const{projectCid:s,canvasZoom:a,canvasClip:i,taskList:c,pathOutput:u}=e
452c.forEach(e=>e.screenStateCid=e.screenStateCid||"default")
453await t.waitForFunction(tt.checkReady,ot)
454await t.evaluate(tt.addSnapShotTask,{projectCid:s,canvasZoom:a,canvasClip:i,taskList:c})
455const p=[]
456const l=c.length
457for(let e=0;e<l;e++){const s=async()=>{o.add(`[snapshot|${e+1}/${l}] wait for puppeteerPage render`)
458await t.waitForFunction(tt.checkWait,ot)
459const{canvasData:s,error:d}=await t.evaluate(tt.getTaskResult)
460if(d||!s){o.add(`[snapshot|${e+1}/${l}] error: ${d}, canvasData: ${JSON.stringify(s)}`)
461await t.evaluate(tt.sendReset)
462throw d}const{screenCid:g,screenStateCid:h,canvasWidth:m,canvasHeight:f}=s
463const S=c.find(e=>e.screenCid===g&&e.screenStateCid===h)
464if(!S)throw new Error(`[snapshot] error getting task: ${JSON.stringify({taskList:c,canvasData:s})}`)
465const{fileName:w}=S
466const y={x:0,y:0,width:m,height:f,...i}
467const b=Object(r.join)(u,w||`${g}-${h}_${a}_${y.width}_${y.height}.png`)
468await t.screenshot({path:b,clip:y,omitBackground:!0,type:"png"})
469await t.evaluate(tt.sendResume)
470p.push({screenCid:g,screenStateCid:h,canvasZoom:a,canvasClip:i,fileName:w,filePath:b})
471n({progress:Math.round(100*(e+1)/l)})
472o.add(`[snapshot|${e+1}/${l}] file ready: ${b}`)}
473await Promise.race([s(),new Promise((e,t)=>setTimeout(()=>t(new Error("[TIMEOUT] snapshot task timeout after 20000")),2e4))])}return p})({option:u,puppeteerPage:a,stepCallback:({progress:t})=>c(e,{progress:t}),logger:{...t,add:(e=>{let t=Date.now()
474return(...n)=>{const r=Date.now()
475e(`[+${r-t}ms]`,...n)
476t=r}})(t.add)}})
477t.add(`[Puppeteer|${e}] complete`)
478return p},getTaskId:t=>`TSS-${e.toString(36)}-${st(t)}`})},e)
479return Qe({runnerList:a,getRunnerByTaskId:(e,t)=>{const n=t&&/^TSS-(\d+)-/.exec(t)
480return n&&e[parseInt(n[1],36)]}})}
481const it=(e,t)=>Math.floor(Math.random()*(t-e+1)+e);(()=>{try{const{crypto:e}=global
482const t=t=>{const n=new ArrayBuffer(t)
483for(let r=0;r<t;r+=65536)e.getRandomValues(new Uint8Array(n,r,Math.min(65536,t-r)))
484return n}
485if(32===t(32).byteLength)return t}catch(e){}try{const{randomFillSync:e}=Object(et.a)("crypto")
486const t=t=>{const n=new DataView(new ArrayBuffer(t))
487e(n)
488return n.buffer}
489if(32===t(32).byteLength)return t}catch(e){}})()
490const ct=({clusterSize:e,logger:t})=>{const n=(e,n)=>e&&t.add(`[DebugTaskRunner|${n}] error: ${e.stack||e.toString()}`)
491const r=async(e,{getTaskState:n,updateTaskState:r})=>{t.add(`[DebugTaskRunner|${e}] start`,JSON.stringify(n(e).option))
492for(let n=0,o=((e,t=0)=>it(Math.min(e,t),Math.max(e,t)))(5,10);n<o;n++){await G(500)
493t.add(`[DebugTaskRunner|${e}] step [${n}/${o}]`)
494if(8===o&&4===n)throw new Error("[DebugError] predefined error at 4 of 8")
495r(e,{progress:Math.round(100*(n+1)/o)})}t.add(`[DebugTaskRunner|${e}] complete`)
496return{output:"DebugTaskRunner"}}
497const o=Ge(e=>Ve({resetRunner:n,runTask:r,getTaskId:t=>`TASK-DEBUG-${e.toString(36)}-${st(t)}`}),e)
498return Qe({runnerList:o,getRunnerByTaskId:(e,t)=>{const n=t&&/^TASK-DEBUG-(\d+)-/.exec(t)
499return n&&e[parseInt(n[1],36)]}})}
500const ut=async(e,t)=>{void 0===t&&(t=await w(e))
501if(!t.isDirectory())throw new Error(`[getDirectorySubInfoList] error pathType: ${y(t)} for ${e}`)
502const n=[]
503for(const t of await c(e)){const o=Object(r.join)(e,t)
504const s=await w(o)
505const a=y(s)
506n.push({path:o,name:t,stat:s,type:a})}return n}
507const pt=Object(s.promisify)(o.utimes)
508const lt=Object(s.promisify)(o.unlink)
509const dt=["thumbnail","zoom-0.50","zoom-1.00","zoom-2.00"]
510const gt=async(e,t)=>{for(const{path:n,name:r}of await ut(e))r.startsWith(t)&&await lt(n)}
511const ht=async(e,t,n,o)=>(async({option:e,taskRunnerCluster:t,logger:n})=>{const{taskList:[{fileName:o,fileNamePrefix:s}],pathOutput:a,routeOutput:i}=e
512const c=await w(a)
513const u=Object(r.join)(a,o)
514if(c.isDirectory()&&(await w(u)).isFile()){n.add(`[Task|sync] exist: ${o}`)
515const e=J()
516await pt(u,e,e)}else{c.isDirectory()?await gt(a,s).catch(e=>n.add(`[ERROR|Task|sync] delete expired file error: ${e.stack}`)):await b(a,c)
517n.add(`[Task|sync] start: ${JSON.stringify(e)}`)
518const{id:r,promise:o}=t.startTask(e)
519o&&await o
520const{error:i}=t.getTaskState(r)
521if(i)throw i}n.add(`[Task|sync] end: ${o}`)
522return{pathFile:u,routeFile:Object(r.join)("/",i,o)}})({option:await(async(e,t,n)=>{const r=e.get("mode")||"thumbnail"
523if(!dt.includes(r))throw new Error(`[fetchSyncTaskConfig] invalid mode: ${r}`)
524const o=`${n}?${new ie.URLSearchParams({mode:r,access_token:e.get("access-token"),screen_cid:e.get("screen-cid"),screenstate_cid:e.get("screenstate-cid")||"default"})}`
525const s=await Xe(o,{method:"GET",headers:{cookie:t.cookie||""}})
526if(!s.ok)throw new Error(`[fetchSyncTaskConfig] fetch failed, url: ${o}, status: ${s.status}`)
527const a=await s.json()
528if(a.taskList&&1!==a.taskList.length)throw new Error("expect to get single task taskList")
529return a})(e.getState().url.searchParams,e.request.headers,t),taskRunnerCluster:n,logger:o})
530const mt=({logger:e,urlSnapshotTask:t,taskRunnerCluster:n})=>{return{responderStartTask:(t,r)=>{const o=n.startTask(r)
531e.add(`[Task|start] ${o.id}`)
532return Te(t,{object:{taskId:o.id}})},responderDeleteTask:(t,r)=>{n.endTask(r)
533e.add(`[Task|delete] ${r}`)
534return ce(t)},responderGetTaskStatus:(t,r)=>{const o=n.getTaskState(r)
535if(!o)return Te(t,{object:{}})
536const{error:s,progress:a=1}=o
537const i={taskId:r,error:s&&s.toString(),progress:a}
538e.add(`[Task|status] ${JSON.stringify(i)}`)
539return Te(t,{object:i})},responderSyncSnapshotTaskNginx:async r=>{const{routeFile:o}=await ht(r,t,n,e)
540return((e,{statusCode:t=500,headerMap:n})=>{if(e.response.finished)return e
541!e.response.headersSent&&e.response.writeHead(t,n)
542e.response.end()})(r,{statusCode:200,headerMap:{"x-accel-redirect":encodeURI(o)}})},responderSyncSnapshotTaskServe:async r=>{const{pathFile:o}=await ht(r,t,n,e)
543r.response.setHeader("access-control-allow-origin","*")
544return((e,{buffer:t,entityTag:n,type:r=Se,length:o=t.length})=>ke(e,n,r,o)&&o&&be(e.response,t))(r,{buffer:await u(o),type:we.png})}}}
545const ft=()=>{const e=Oe(Buffer.from(Ae(["<style>\n*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; outline-color: #f00; }\n::-webkit-scrollbar-thumb { background: #0004; }\n::-webkit-scrollbar-thumb:hover { background: #0006; }\nbody { overflow: hidden; display: flex; flex-flow: column; width: 100vw; height: 100vh; font-family: monospace; font-size: 16px; }\nbutton, .button { text-decoration: none; cursor: pointer; margin: 4px; padding: 4px; min-width: 32px; border: 0; border-radius: 4px; background: hsla(0, 0%, 70%, 0.4); box-shadow: inset 0 0 0 1px #888; }\nbutton:hover, .button:hover { background: hsla(0, 0%, 80%, 0.4); box-shadow: inset 0 0 0 1px #aaa; }\nbutton.select, button:hover.select, .button.select, .button:hover.select { color: #e00; box-shadow: inset 0 0 0 1px #e00; }\nbutton:disabled, button:disabled:hover, .button:disabled, .button:disabled:hover { cursor: default; background: hsla(0, 0%, 100%, 0.4); box-shadow: unset; }\n@media (pointer: fine) {\n ::-webkit-scrollbar { width: 14px; height: 14px; }\n button, .button, .auto-height { min-height: 20px; font-size: 14px; } \n}\n@media (pointer: coarse) {\n ::-webkit-scrollbar { width: 6px; height: 6px; }\n button, .button, .auto-height { min-height: 32px; font-size: 18px; } \n}\n</style>",(e=>{const t={}
546const n=[]
547Object.entries({qS:Pe,qSA:Re,cE:je,aCL:Ce,mECN:De,mEA:Ie,iDR:Me,tDR:Fe,...e}).forEach(([e,r])=>{"function"==typeof r?n.push(`<script>window[${JSON.stringify(e)}] = ${r.toString()}<\/script>`):t[e]=r})
548return[`<script>Object.assign(window, ${JSON.stringify(t)})<\/script>`,...n].join("\n")})({onload:wt})],[St])),we.html)
549return t=>xe(t,e)}
550const St='\n<div style="flex-flow: row;">\n <button onclick="getStatus()">getStatus</button>\n <button onclick="getStatusDetail()">getStatusDetail</button>\n <button onclick="startDebugTask()">startDebugTask</button>\n <button onclick="startDebugTask10()">startDebugTask10</button>\n <button onclick="startDebugSyncTask()">startDebugSyncTask</button>\n <button onclick="resetLog()">resetLog</button>\n</div>\n<pre style="display: flex; flex-flow: row; font-size: 12px;">\n <div id="status" style="overflow: auto; border-right: 2px solid #eee; font-size: 8px;">STATUS</div>\n <div id="log" style="overflow: auto;">LOG</div>\n</pre>\n'
551const wt=()=>{const{fetch:e,performance:t,qS:n}=window
552const r=e=>{console.log("[STATUS]",e)
553n("#status",JSON.stringify(e,null," "))}
554const o=e=>{console.log("[LOG]",e)
555n("#log").innerHTML+=`\n${e}`}
556const s=async()=>{const n=await(await e("/task",{method:"POST",body:JSON.stringify(t.now().toString(36))})).text()
557o(` - [Task] ${n}`)}
558Object.assign(window,{resetLog:()=>{n("#log","LOG")},getStatus:async()=>{r(await(await e("/status",{method:"GET"})).json())},getStatusDetail:async()=>{r(await(await e("/status?verbose",{method:"GET"})).json())},startDebugTask:s,startDebugTask10:()=>{for(let e=0;e<10;e++)s().catch(console.warn)},startDebugSyncTask:async()=>{const n=`[SYNC]${t.now().toString(36)}`
559o(`[SyncTask|${n}] start`)
560const r=await(await e("/debug-sync-task",{method:"POST",body:JSON.stringify(n)})).text()
561o(`[SyncTask|${n}] end: ${r}`)}})}
562const yt=async({option:e,logger:t,routePrefix:n="",clusterSize:r,urlSnapshotApp:o,urlServerPingTest:s,urlSnapshotTask:a,isTaskRunnerDebugOnly:i})=>{const c=`${n}/task`
563const u=`${n}/nginx-sync-snapshot`
564const p=`${n}/debug-sync-snapshot`
565const l=await(i?ct:at)({clusterSize:r,logger:t,urlSnapshotApp:o,urlServerPingTest:s})
566const d=setInterval(()=>l.autoEndTask(30),3e4)
567j(()=>clearInterval(d))
568C(async()=>Promise.all([].concat(l.clear())))
569const{responderStartTask:g,responderDeleteTask:h,responderGetTaskStatus:m,responderSyncSnapshotTaskNginx:f,responderSyncSnapshotTaskServe:S}=mt({logger:t,urlSnapshotTask:a,taskRunnerCluster:l})
570const w=[[c,"POST",async e=>g(e,JSON.parse(await ye(e.request)))],[`${c}/:task-id`,"GET",e=>m(e,Ue(e,"task-id"))],[`${c}/:task-id`,"DELETE",e=>h(e,Ue(e,"task-id"))],[[u,`${u}.png`],"GET",f],[[p,`${p}.png`],"GET",S]]
571if(i){const e=`${n}/debug`
572const r=`${n}/debug-sync-task`
573const o=((e,t)=>async(n,r)=>{t.add(`[Task|sync] start: ${JSON.stringify(r)}`)
574const{id:o,promise:s}=e.startTask(r)
575s&&await s
576const{error:a,progress:i=1}=e.getTaskState(o)
577const c={taskId:o,error:a&&a.toString(),progress:i}
578t.add(`[Task|sync] end: ${JSON.stringify(c)}`)
579return Te(n,{object:c})})(l,t)
580w.push([e,"GET",ft()],[r,"POST",async e=>o(e,JSON.parse(await ye(e.request)))])}return{URL_TASK:c,URL_SYNC_SNAPSHOT_NGINX:u,URL_SYNC_SNAPSHOT_SERVE:p,routeList:w,taskRunnerCluster:l,getTaskRunnerClusterStatus:({isVerbose:e,isRaw:t})=>{const n=l.getStatus(e)
581return t?n:e?n.map(({taskQueue:e,taskStateMap:t,taskStateList:n})=>({taskQueue:e,taskStateMap:t,taskStateList:n.map(([e,t])=>`[${t.error||`${t.progress||0}%`}] ${e}`)})):n.map(({taskQueue:e,taskStateMap:t})=>`${e}|${t}`)}}}
582const bt=async({urlServerPingTest:e,urlSnapshotApp:t,urlSnapshotTask:n,taskRunnerCount:r,isTaskRunnerDebugOnly:o},{server:s,option:a,logger:i})=>{const{routeList:c,getTaskRunnerClusterStatus:u}=await yt({option:a,logger:i,routePrefix:"",clusterSize:r,urlSnapshotApp:t,urlServerPingTest:e,urlSnapshotTask:n,isTaskRunnerDebugOnly:o})
583const p=pe(i.add)
584const l=e=>{const{url:{searchParams:t}}=e.getState()
585const n=t.has("verbose")
586const r=t.has("raw")
587i.add(`[Status] isVerbose: ${n}, isRaw: ${r}`)
588return Te(e,{object:{taskRunnerCluster:u({isVerbose:n,isRaw:r})}})}
589const d=(e=>e.reduce((e,[t,n,r])=>ze(e,t,n,r),{}))([...c,["/status","GET",l],["/","GET",o?((e,t)=>{let n
590return async r=>{void 0===n&&(n=await Oe(Buffer.from(Je(e(),t)),we.html))
591return xe(r,n)}})(()=>d):l],[["/favicon","/favicon.ico"],"GET",(()=>{const e=Oe(Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNMXvf/PwAGnQMR4CJUOAAAAABJRU5ErkJggg==","base64"),we.png)
592return t=>xe(t,e)})()]])
593s.on("request",(({responderList:e=[],responderEnd:t=he,responderError:n=((e,t)=>e.setState({error:t}))})=>async(r,o)=>{const s=(e=>({getState:()=>e,setState:t=>e={...e,...t}}))({time:q(),error:null})
594s.request=r
595s.response=o
596try{for(const t of e)await t(s)}catch(e){await n(s,e)}await t(s)})({responderList:[(e=>t=>{e(ue(t.request),"|",t.request.headers["user-agent"]||"no-user-agent")})(i.add),(({baseUrl:e="",baseUrlObject:t=new ie.URL(e)})=>e=>{const{url:n,method:r}=e.request
597e.setState({url:new ie.URL(n,t),method:r})})(a),(e=>t=>{const{url:n,method:r}=t.getState()
598if(!n||!r)throw new Error(`[responderRouter] missing state: ${JSON.stringify({url:n,method:r})}`)
599if(!_e[r])throw new Error(`[responderRouter] invalid method [${r}] from route: ${n.pathname}`)
600const{routeNode:o,paramValueList:s}=Ne(e,n.pathname)
601if(!o[_e[r]])throw new Error(`[responderRouter] invalid method [${r}] for route: ${n.pathname}`)
602const{route:a,paramNameList:i,routeResponder:c}=o[_e[r]]
603const u=i.reduce((e,t,n)=>{e[t]=s[n]
604return e},{})
605return c(t,t.setState({route:a,paramMap:u}))})(d)],responderEnd:e=>{ce(e)
606p(e)}}))}
607const vt={name:"",nameENV:"",nameJSON:"",shortName:"",aliasNameList:[],optional:!1,argumentCount:"0",argumentLengthMin:0,argumentLengthMax:0,argumentListNormalize:e=>e,argumentListVerify:e=>{},description:"",extendFormatList:[]}
608const kt=/^(\d+)(-)?(\d+)?$/
609const xt=(e,t)=>{"function"!=typeof e&&(e=!!e&&Tt)
610return t?(n,r,o)=>e&&e(n,r,o)||!r.has(t):e}
611const Tt=()=>!0
612const Ot=(e,t,n)=>{e={...vt,...e}
613!$t.test(e.name)&&Et(`name '${e.name}'`,e,t,n)
614e.shortName&&!Lt.test(e.shortName)&&Et(`shortName '${e.shortName}'`,e,t,n)
615{const r=e.aliasNameList.findIndex(e=>!$t.test(e));-1!==r&&Et(`aliasNameList #${r} '${e.aliasNameList[r]}'`,e,t,n)}{!kt.test(e.argumentCount)&&Et(`argumentCount '${e.argumentCount}'`,e,t,n)
616const[,r,,o]=kt.exec(e.argumentCount)
617o&&parseInt(o)<parseInt(r)&&Et(`argumentCount '${e.argumentCount}'`,e,t,n)}e.extendFormatList.length&&(e.extendFormatList=e.extendFormatList.map((t,n)=>Ot(t,n,e)))
618return e}
619const $t=/^[A-Za-z][A-Za-z0-9-]*$/
620const Lt=/^[A-Za-z]$/
621const Et=(e,t,n,r)=>{throw new Error(`[Format] ${Ft(t)} #${n}${r?` of ${Ft(r)}`:""} | ${e}`)}
622const Nt=(e,t)=>n=>{const r=[]
623const o=()=>r[r.length-1].argumentList
624for(let s=0,a=n.length;s<a;s++){const a=n[s]
625if(At.test(a)){const[,t,,n]=At.exec(a)
626const s=e.get(t)
627!s&&Rt(t)
628r.push({format:s,argumentList:[]})
629n&&o().push(n)}else if(Pt.test(a)){const[,e,,n]=Pt.exec(a)
630e.split("").forEach(n=>{const o=t.get(n)
631!o&&Rt(n,`from '${e}'`)
632r.push({format:o,argumentList:[]})})
633n&&o().push(n)}else{!r.length&&Rt(a,"no leading option found")
634"--"===a?o().push(...n.slice(s)):o().push(a)}}return r}
635const At=/^--([A-Za-z][A-Za-z0-9-]*)(=(.*))?$/
636const Pt=/^-([A-Za-z]+)(=(.*))?$/
637const Rt=(e,t="invalid option")=>{throw new Error(`[ParseArgv] unexpected '${e}', ${t}`)}
638const jt=e=>(t,n={})=>e(t).reduce((e,{format:t,argumentList:n})=>{e[t.name]?e[t.name].argumentList.push(...n):e[t.name]={format:t,argumentList:n,source:"CLI"}
639return e},n)
640const Ct=e=>(t,n={})=>{e.forEach((e,r)=>{let o=t[r]
641if(o){try{o=JSON.parse(o)}catch(e){}n[e.name]={format:e,argumentList:Array.isArray(o)?o:[o],source:"ENV"}}})
642return n}
643const Dt=e=>(t,n={})=>{e.forEach((e,r)=>{const o=t[r]
644o&&(n[e.name]={format:e,argumentList:Array.isArray(o)?o:[o],source:"JSON"})})
645return n}
646const It=(e,t)=>(n,r)=>{const o=new Set
647Object.entries(n).forEach(([e,t])=>{const{format:n,argumentList:s}=t
648n.argumentLengthMin>s.length&&Mt(`expected ${n.argumentLengthMin-s.length} more argument`,n)
649n.argumentLengthMax<s.length&&Mt(`expected ${s.length-n.argumentLengthMax} less argument`,n)
650t.argumentList=n.argumentListNormalize(s,r)
651n.argumentListVerify(t.argumentList,r)
652o.add(n)})
653e.forEach(e=>!o.has(e)&&Mt("non-optional option",e))
654t.forEach(({format:e,checkOptional:t})=>!t(n,o,e)&&!o.has(e)&&Mt("non-optional option",e))
655return n}
656const Mt=(e,t)=>{throw new Error(`[Process] ${Ft(t)} | ${e}`)}
657const Ft=({name:e,shortName:t,aliasNameList:n})=>`${e}${n.length?`|${n.join("|")}`:""}${t?` [-${t}]`:""}`
658const _t=e=>Qt(e,zt)
659const zt=e=>Wt(Ht(e,`--${e.name}${e.aliasNameList.length?` --${e.aliasNameList.join(" --")}`:""}`,e.shortName&&`-${e.shortName}`),e.description&&Zt(e.description,4),Bt(e.extendFormatList,zt,2))
660const Ut=e=>Wt('"',Zt(`#!/usr/bin/env bash\n${Qt(e,qt)}`),'"')
661const qt=e=>Wt(`export ${e.nameENV}="${Ht(e)}"`,Bt(e.extendFormatList,qt,0))
662const Jt=e=>Wt("{",Zt(Qt(e,Gt)),"}")
663const Gt=e=>Wt(`"${e.nameJSON}": [ "${Ht(e)}" ],`,Bt(e.extendFormatList,Gt,0))
664const Ht=({optional:e,argumentLengthMin:t,argumentLengthMax:n},...r)=>[...r,e&&(e===Tt?"[OPTIONAL]":"[OPTIONAL-CHECK]"),(t||n)&&`[ARGUMENT=${Vt(t,n)}]`].filter(Boolean).join(" ")
665const Bt=(e,t,n)=>e.length&&Zt(Qt(e,t),n)
666const Vt=(e,t)=>`${e}${t===1/0?"+":t>e?`-${t}`:""}`
667const Qt=(e,t)=>Wt(...e.map(t))
668const Wt=(...e)=>e.filter(Boolean).join("\n")
669const Zt=(e,t=2)=>t?((e,t=" ")=>`${t}${e.replace(/\n/g,`\n${t}`)}`)(e," ".repeat(t)):e
670const Kt=e=>se(e,1,"single argument expected")
671const Yt=(e,t)=>n=>{Kt(n)
672e(n[0],`single ${t} argument expected`)}
673const Xt=(e,t)=>n=>{n.forEach((n,r)=>e(n,`${t} expected at #${r}`))}
674const en=Xt(ne,"String")
675const tn=Xt(re,"Number")
676const nn=Xt(oe,"Integer")
677const rn=Xt(ae,"Function")
678const on=e=>e.map(String)
679const sn=e=>e.map(Number)
680const an=e=>e.map(parseInt)
681const cn=(e,t=(()=>{}),n=(e=>e),r="",o=!1)=>({argumentCount:e,argumentListNormalize:n,argumentListVerify:t,description:r,optional:o})
682const un=(e,t)=>n=>{e(n)
683return cn(1,(e=>t=>{Kt(t);((e,t,n)=>((e,t)=>t.includes(e))(e,t)||ee("OneOf",n,`expect one of: [${t}], get: ${X(e)}`))(t[0],e)})(n),t,`one of:\n ${((e,t)=>{const n=[]
684for(let r=0,o=e.length;r<o;r+=t)n.push(e.slice(r,r+t))
685return n})(n,4).map(e=>e.join(" ")).join("\n ")}`)}
686const pn={SingleString:cn(1,Yt(ne,"String"),on),SingleNumber:cn(1,Yt(re,"Number"),sn),SingleInteger:cn(1,Yt(oe,"Integer"),an),SingleFunction:cn(1,Yt(ae,"Function"),void 0),AllString:cn("1-",en,on),AllNumber:cn("1-",tn,sn),AllInteger:cn("1-",nn,an),AllFunction:cn("1-",rn,void 0),OneOfString:un(on,en),OneOfNumber:un(sn,tn),OneOfInteger:un(an,nn),BooleanFlag:cn("0-",void 0,()=>[!0],"set to enable",!0),Any:cn("0-",void 0,void 0,"optional",!0)}
687const ln={...pn,SinglePath:{...pn.SingleString,isPath:!0},AllPath:{...pn.AllString,isPath:!0},Config:{...pn.SingleString,description:"# from JSON: set to 'path/to/config.json'\n# from ENV: set to 'env'",optional:!0,name:"config",shortName:"c"}}
688const dn=(e,t)=>{Object.values(e).forEach(({format:{isPath:e},argumentList:n})=>e&&n.forEach((e,o)=>n[o]=Object(r.resolve)(t,e)))
689return e}
690const{SingleString:gn,SingleInteger:hn,SinglePath:mn,BooleanFlag:fn}=ln
691const{SingleString:Sn,SingleInteger:wn,BooleanFlag:yn,Config:bn}=ln
692const vn={prefixENV:"imock-snapshot",formatList:[bn,{...yn,name:"help",shortName:"h"},{...yn,name:"version",shortName:"v"},((e=[])=>({...gn,optional:!0,name:"hostname",shortName:"H",extendFormatList:[{...hn,name:"port",shortName:"P"},{...fn,name:"https",shortName:"S",extendFormatList:[{...mn,name:"file-SSL-key"},{...mn,name:"file-SSL-cert"},{...mn,name:"file-SSL-chain"},{...mn,name:"file-SSL-dhparam"}]},{...mn,optional:!0,name:"log-path",extendFormatList:[{...gn,optional:!0,name:"log-file-prefix"}]},{...mn,optional:!0,name:"pid-file",extendFormatList:[{...fn,name:"pid-ignore-exist"}]},...e]}))([{...Sn,name:"url-server-ping-test"},{...Sn,name:"url-snapshot-app"},{...Sn,name:"url-snapshot-task"},{...wn,name:"task-runner-count"},{...yn,name:"task-runner-debug-only",shortName:"D"}])]}
693const{parseOption:kn,formatUsage:xn}=(e=>{const{parseCLI:t,parseENV:n,parseJSON:o,processOptionMap:s,formatUsage:a}=(({formatList:e,prefixENV:t="",prefixJSON:n=""})=>{const r=new Map
694const o=new Map
695const s=new Map
696const a=new Map
697const i=new Set
698const c=new Set
699const u=(e,p,l)=>{const{name:d,shortName:g,aliasNameList:h,argumentCount:m}=e
700const[,f,S,w]=kt.exec(m.toString())
701e.nameENV=(t?`${t}-${d}`:d).split("-").join("_").toUpperCase()
702e.nameJSON=((e,t=1)=>e.reduce((e,n,r)=>r>=t?e+n[0].toUpperCase()+n.slice(1):e+n,""))((n?`${n}-${d}`:d).split("-"))
703e.optional=xt(e.optional,l)
704e.argumentLengthMin=parseInt(f)
705e.argumentLengthMax=S?w?parseInt(w):1/0:e.argumentLengthMin
706r.has(d)&&Et(`duplicate name '${d}'`,e,p,l)
707r.set(d,e)
708g&&o.has(g)&&Et(`duplicate shortName '${g}'`,e,p,l)
709g&&o.set(g,e)
710{const t=h.find(e=>r.has(e))
711t&&Et(`duplicate aliasName '${t}'`,e,p,l)
712h.forEach(t=>r.set(t,e))}s.set(e.nameENV,e)
713a.set(e.nameJSON,e)
714e.optional?e.optional!==Tt&&c.add({format:e,checkOptional:e.optional}):i.add(e)
715e.extendFormatList.forEach((t,n)=>u(t,n,e))};(e=e.map((e,t)=>Ot(e,t,null))).forEach((e,t)=>u(e,t,null))
716return{parseCLI:jt(Nt(r,o)),parseENV:Ct(s),parseJSON:Dt(a),processOptionMap:It(i,c),formatUsage:(t,n=!1)=>Wt(t&&`Message:\n${Zt(t.toString())}`,`CLI Usage:\n${Zt(_t(e))}`,!n&&`ENV Usage:\n${Zt(Ut(e))}`,!n&&`JSON Usage:\n${Zt(Jt(e))}`)}})(e)
717return{parseOption:async()=>(e=>{const t=t=>e[t]?e[t].argumentList:void 0
718const n=(e,n)=>{const r=t(e)
719if(!r)throw new Error(`[getOption] expecting option ${e}`)
720if(void 0!==n&&r.length!==n)throw new Error(`[getOption] expecting option ${e} has ${n} value instead of ${r.length}`)
721return r}
722return{optionMap:e,getOptionOptional:t,getOption:n,getSingleOptionOptional:t=>e[t]?e[t].argumentList[0]:void 0,getSingleOption:e=>n(e,1)[0]}})(await(async({parseCLI:e,parseENV:t,parseJSON:n,processOptionMap:o})=>{const s=dn(e(process.argv.slice(2)),process.cwd())
723const a=s.config&&s.config.argumentList.length&&s.config.argumentList[0]
724return o({...a?"env"===a?dn(t(process.env),process.cwd()):dn(n(JSON.parse(await u(a,"utf8"))),Object(r.dirname)(a)):null,...s})})({parseCLI:t,parseENV:n,parseJSON:o,processOptionMap:s})),formatUsage:a}})(vn)
725var Tn=n(9)
726const On=async(e,{getOptionOptional:t,getSingleOption:n,getSingleOptionOptional:s})=>{await(async({filePid:e,shouldIgnoreExistPid:t=!1})=>{if(e){!t&&k(()=>{const t=Object(o.readFileSync)(e,{encoding:"utf8"})
727if(t){console.warn(`[FilePid] get existing pid: ${t}, exit process...`)
728return process.exit(-1)}})
729await b(Object(r.dirname)(e))
730await p(e,`${process.pid}`)
731j(t=>{k(o.unlinkSync,e)})}})({filePid:s("pid-file"),shouldIgnoreExistPid:s("pid-ignore-exist")})
732const{server:a,start:i,option:c}=await me({protocol:t("https")?"https:":"http:",hostname:n("hostname"),port:n("port"),fileSSLKey:s("file-SSL-key"),fileSSLCert:s("file-SSL-cert"),fileSSLChain:s("file-SSL-chain"),fileSSLDHParam:s("file-SSL-dhparam")})
733const u=await I({pathLogDirectory:s("log-path"),logFilePrefix:s("log-file-prefix")})
734await bt({urlServerPingTest:n("url-server-ping-test"),urlSnapshotApp:n("url-snapshot-app"),urlSnapshotTask:n("url-snapshot-task"),taskRunnerCount:n("task-runner-count"),isTaskRunnerDebugOnly:Boolean(t("task-runner-debug-only"))},{server:a,option:c,logger:u})
735i()
736u.add(`[SERVER UP] version: ${Tn.b}, pid: ${process.pid}, at: ${c.baseUrl}`)};(async()=>{const e=await kn()
737const t=e.getSingleOptionOptional("hostname")
738if(!t)return e.getOptionOptional("version")?console.log(JSON.stringify({packageName:Tn.a,packageVersion:Tn.b},null," ")):console.log(xn(null,e.getOptionOptional("help")?null:"simple"))
739await On(0,e).catch(e=>{console.warn("[Error] server:",e.stack||e)
740process.exit(2)})})().catch(e=>{console.warn(xn(e.stack||e,"simple"))
741process.exit(1)})}])