Comparing version 0.21.0-dev.3 to 0.21.0-dev.4
124
bin/index.js
@@ -7,65 +7,67 @@ #!/usr/bin/env node | ||
var a=require("../library/common/string") | ||
var o=require("../library/common/check") | ||
var i=require("../library/node/data/Stream") | ||
var n=require("../library/node/file/File") | ||
var c=require("../library/node/file/Modify") | ||
var u=require("../library/node/server/function") | ||
var l=require("../library/node/server/TCPProxyServer") | ||
var p=require("../library/node/system/DefaultOpen") | ||
var m=require("../library/node/system/Run") | ||
var d=require("../library/node/system/Status") | ||
var f=require("./server/serveStatic") | ||
var y=require("./server/websocketGroup") | ||
var v=require("./server/testConnection") | ||
var S=require("./function") | ||
var g=require("./option") | ||
const h=e=>console.log((0,o.isBasicObject)(e)?JSON.stringify(e,null,2):e) | ||
const w=async(g,w)=>{const{tryGet:b,tryGetFirst:$,getFirst:q}=w | ||
const T=b("quiet")?()=>{}:console.log | ||
const O=(e,r)=>e(r).then(()=>T(`[${g}] done: ${r}`),e=>T(`[${g}] error: ${r}\n${e.stack||e}`)) | ||
const N=Boolean(b("help")) | ||
const k=b(g)||[] | ||
const x=$("input-file") | ||
const P=$("output-file") | ||
const A=async()=>{const e=($("host")||"").split(":") | ||
var o=require("../library/common/time") | ||
var i=require("../library/common/check") | ||
var n=require("../library/node/data/Stream") | ||
var c=require("../library/node/file/File") | ||
var u=require("../library/node/file/Modify") | ||
var l=require("../library/node/server/function") | ||
var p=require("../library/node/server/TCPProxyServer") | ||
var m=require("../library/node/system/DefaultOpen") | ||
var d=require("../library/node/system/Run") | ||
var f=require("../library/node/system/Status") | ||
var y=require("./server/serveStatic") | ||
var v=require("./server/websocketGroup") | ||
var S=require("./server/testConnection") | ||
var g=require("./function") | ||
var w=require("./option") | ||
const h=e=>console.log((0,i.isBasicObject)(e)?JSON.stringify(e,null,2):e) | ||
const b=async(w,b)=>{const{tryGet:$,tryGetFirst:q,getFirst:T}=b | ||
const O=$("quiet")?()=>{}:console.log | ||
const N=(e,r)=>e(r).then(()=>O(`[${w}] done: ${r}`),e=>O(`[${w}] error: ${r}\n${e.stack||e}`)) | ||
const k=Boolean($("help")) | ||
const x=$(w)||[] | ||
const A=q("input-file") | ||
const P=q("output-file") | ||
const G=async()=>{const e=(q("host")||"").split(":") | ||
const r=e[0]||"0.0.0.0" | ||
return{hostname:r,port:Number(e[1]||await(0,u.autoTestServerPort)([80,8080,8888,8800,8e3],r))}} | ||
switch(g){case"eval":case"eval-readline":{let t=await(0,S.evalScript)(x?(0,r.readFileSync)(x).toString():k[0],x?k:k.slice(1),x?(0,e.dirname)(x):process.cwd(),w) | ||
"eval-readline"===g&&(t=await(0,S.evalReadlineExtend)(t,q("root"),T)) | ||
return void 0!==t&&(e=>P?(0,r.writeFileSync)(P,e):(0,i.pipeStreamAsync)(process.stdout,(0,i.bufferToStream)(e)))(t instanceof Buffer?t:Buffer.from(String(t)))}case"repl":return(0,t.start)({prompt:"> ",input:process.stdin,output:process.stdout,useGlobal:!0}).context.require=require | ||
case"echo":return h(k) | ||
case"cat":if(k.length)for(const e of k)await(0,i.pipeStreamAsync)(process.stdout,(0,r.createReadStream)(e)) | ||
else process.stdin.isTTY||await(0,i.pipeStreamAsync)(process.stdout,process.stdin) | ||
return{hostname:r,port:Number(e[1]||await(0,l.autoTestServerPort)([80,8080,8888,8800,8e3],r))}} | ||
switch(w){case"eval":case"eval-readline":{let t=await(0,g.evalScript)(A?(0,r.readFileSync)(A).toString():x[0],A?x:x.slice(1),A?(0,e.dirname)(A):process.cwd(),b) | ||
"eval-readline"===w&&(t=await(0,g.evalReadlineExtend)(t,T("root"),O)) | ||
return void 0!==t&&(e=>P?(0,r.writeFileSync)(P,e):(0,n.pipeStreamAsync)(process.stdout,(0,n.bufferToStream)(e)))(t instanceof Buffer?t:Buffer.from(String(t)))}case"repl":return(0,t.start)({prompt:"> ",input:process.stdin,output:process.stdout,useGlobal:!0}).context.require=require | ||
case"wait":{const e=x[0]||2e3 | ||
return(0,o.setTimeoutAsync)(e)}case"echo":return h(x) | ||
case"cat":if(x.length)for(const e of x)await(0,n.pipeStreamAsync)(process.stdout,(0,r.createReadStream)(e)) | ||
else process.stdin.isTTY||await(0,n.pipeStreamAsync)(process.stdout,process.stdin) | ||
return | ||
case"write":case"append":if(process.stdin.isTTY)throw new Error("[pipe] stdin should not be TTY mode") | ||
const u="write"===g?"w":"a" | ||
return(0,i.pipeStreamAsync)((0,r.createWriteStream)(k[0],{flags:u}),process.stdin) | ||
case"open":{const r=k[0]||"." | ||
return(0,m.runSync)({command:(0,p.getDefaultOpen)(),argList:[r.includes("://")?r:(0,e.normalize)(r)]})}case"status":return h(N?(0,d.describeSystemStatus)():{system:(0,d.getSystemStatus)(),process:(0,d.getProcessStatus)()}) | ||
case"file-list":case"file-list-all":case"file-tree":return h(await(0,S.collectFile)(g,k[0]||process.cwd())) | ||
case"file-create-directory":for(const e of k)await O(n.createDirectory,e) | ||
const l="write"===w?"w":"a" | ||
return(0,n.pipeStreamAsync)((0,r.createWriteStream)(x[0],{flags:l}),process.stdin) | ||
case"open":{const r=x[0]||"." | ||
return(0,d.runSync)({command:(0,m.getDefaultOpen)(),argList:[r.includes("://")?r:(0,e.normalize)(r)]})}case"status":return h(k?(0,f.describeSystemStatus)():{system:(0,f.getSystemStatus)(),process:(0,f.getProcessStatus)()}) | ||
case"file-list":case"file-list-all":case"file-tree":return h(await(0,g.collectFile)(w,x[0]||process.cwd())) | ||
case"file-create-directory":for(const e of x)await N(c.createDirectory,e) | ||
return | ||
case"file-modify-copy":return c.modify.copy(k[0],k[1]) | ||
case"file-modify-move":return c.modify.move(k[0],k[1]) | ||
case"file-modify-delete":for(const e of k)await O(c.modify.delete,e) | ||
case"file-modify-copy":return u.modify.copy(x[0],x[1]) | ||
case"file-modify-move":return u.modify.move(x[0],x[1]) | ||
case"file-modify-delete":for(const e of x)await N(u.modify.delete,e) | ||
return | ||
case"file-merge":{const[e,...t]=k | ||
for(const s of t)await(0,i.pipeStreamAsync)((0,r.createWriteStream)(e,{flags:"a"}),(0,r.createReadStream)(s)) | ||
return}case"fetch":{let[e,t=4,a=0]=k | ||
case"file-merge":{const[e,...t]=x | ||
for(const s of t)await(0,n.pipeStreamAsync)((0,r.createWriteStream)(e,{flags:"a"}),(0,r.createReadStream)(s)) | ||
return}case"fetch":{let[e,t=4,a=0]=x | ||
t=Number(t)||0 | ||
a=Number(a)||0 | ||
const o=await(0,S.fetchWithJump)(e,{headers:{accept:"*/*","user-agent":`${S.packageName}/${S.packageVersion}`},timeout:a},t,(e,r,o)=>T(`[fetch] url: ${e}, jump: ${r}/${t}, timeout: ${a?(0,s.time)(a):"none"}, cookie: ${o.length}`)) | ||
const n=Number(o.headers["content-length"]) | ||
T(`[fetch] get status: ${o.status}, fetch response content${n?` (${(0,s.binary)(n)}B)`:""}...`) | ||
await(e=>(0,i.pipeStreamAsync)(P?(0,r.createWriteStream)(P):process.stdout,e))(o.stream()) | ||
return T("\n[fetch] done")}case"process-status":{const[e="pid--"]=k | ||
return h(await(0,S.collectAllProcessStatus)(e,N))}case"server-serve-static":case"server-serve-static-simple":{const[e=3e5]=k | ||
const r="server-serve-static-simple"===g | ||
const t=$("root")||process.cwd() | ||
return(0,f.startServerServeStatic)(Object.assign({isSimpleServe:r,expireTime:Number(e),staticRoot:t,log:T},await A()))}case"server-websocket-group":return(0,y.startServerWebSocketGroup)(Object.assign({log:T},await A())) | ||
case"server-test-connection":return(0,v.startServerTestConnection)(Object.assign({log:T},await A())) | ||
const o=await(0,g.fetchWithJump)(e,{headers:{accept:"*/*","user-agent":`${g.packageName}/${g.packageVersion}`},timeout:a},t,(e,r,o)=>O(`[fetch] url: ${e}, jump: ${r}/${t}, timeout: ${a?(0,s.time)(a):"none"}, cookie: ${o.length}`)) | ||
const i=Number(o.headers["content-length"]) | ||
O(`[fetch] get status: ${o.status}, fetch response content${i?` (${(0,s.binary)(i)}B)`:""}...`) | ||
await(e=>(0,n.pipeStreamAsync)(P?(0,r.createWriteStream)(P):process.stdout,e))(o.stream()) | ||
return O("\n[fetch] done")}case"process-status":{const[e="pid--"]=x | ||
return h(await(0,g.collectAllProcessStatus)(e,k))}case"server-serve-static":case"server-serve-static-simple":{const[e=3e5]=x | ||
const r="server-serve-static-simple"===w | ||
const t=q("root")||process.cwd() | ||
return(0,y.startServerServeStatic)(Object.assign({isSimpleServe:r,expireTime:Number(e),staticRoot:t,log:O},await G()))}case"server-websocket-group":return(0,v.startServerWebSocketGroup)(Object.assign({log:O},await G())) | ||
case"server-test-connection":return(0,S.startServerTestConnection)(Object.assign({log:O},await G())) | ||
case"server-tcp-proxy":{let e | ||
let r | ||
if((0,o.isBasicFunction)(k[0])){e=[{hostname:"custom-hostname",port:"custom-port"}] | ||
r=k[0]}else{e=k.map(e=>{const[r,t]=e.split(":") | ||
if((0,i.isBasicFunction)(x[0])){e=[{hostname:"custom-hostname",port:"custom-port"}] | ||
r=x[0]}else{e=x.map(e=>{const[r,t]=e.split(":") | ||
return{hostname:r||"localhost",port:Number(t)}}) | ||
@@ -75,10 +77,10 @@ let t=0 | ||
const s=e[t] | ||
T(`[CONNECT] ${r.remoteAddress}:${r.remotePort} => ${s.hostname}:${s.port}`) | ||
return s})}const{option:t,start:s}=(0,l.createTCPProxyServer)(Object.assign({getTargetOption:r},await A())) | ||
O(`[CONNECT] ${r.remoteAddress}:${r.remotePort} => ${s.hostname}:${s.port}`) | ||
return s})}const{option:t,start:s}=(0,p.createTCPProxyServer)(Object.assign({getTargetOption:r},await G())) | ||
await s() | ||
return T((0,a.indentList)("[TCPProxy]",[`pid: ${process.pid}`,`at: ${t.hostname}:${t.port}`,...e.map(e=>`proxy to: ${e.hostname}:${e.port}`)]))}}};(async()=>{const e=await(0,g.parseOption)() | ||
const r=g.MODE_NAME_LIST.find(r=>e.tryGet(r)) | ||
if(!r)return h(e.tryGet("version")?(0,S.getVersion)():(0,g.formatUsage)(null,e.tryGet("help")?null:"simple")) | ||
await w(r,e).catch(e=>{console.warn(`[Error] in mode: ${r}:`,e.stack||e) | ||
process.exit(2)})})().catch(e=>{console.warn((0,g.formatUsage)(e.stack||e,"simple")) | ||
return O((0,a.indentList)("[TCPProxy]",[`pid: ${process.pid}`,`at: ${t.hostname}:${t.port}`,...e.map(e=>`proxy to: ${e.hostname}:${e.port}`)]))}}};(async()=>{const e=await(0,w.parseOption)() | ||
const r=w.MODE_NAME_LIST.find(r=>e.tryGet(r)) | ||
if(!r)return h(e.tryGet("version")?(0,g.getVersion)():(0,w.formatUsage)(null,e.tryGet("help")?null:"simple")) | ||
await b(r,e).catch(e=>{console.warn(`[Error] in mode: ${r}:`,e.stack||e) | ||
process.exit(2)})})().catch(e=>{console.warn((0,w.formatUsage)(e.stack||e,"simple")) | ||
process.exit(1)}) |
var e=require("../library/node/module/Option/preset") | ||
const t=(...t)=>t.map(t=>e.Preset.parseCompact(t,{optional:!0})) | ||
const o=t("help,h/T|show full help, or human readable output","quiet,q/T|less log","version,v/T|show version","host,H/SS|common option: $0=hostname:port (hostname default to 0.0.0.0)","root,R/SP|common option: $0=path/cwd","input-file,I/SP|common option","output-file,O/SP|common option") | ||
const s=t("eval,e/A|eval file or string: -O=outputFile, -I/$0=scriptFile/scriptString, $@=...evalArgv","eval-readline,erl/A|eval with readline: -R=readlineFile, ...eval","repl,i/T|start node REPL","echo/A|show args: $@=...args","cat/AP/0-|with 0 args pipe stdin to stdout, else read $@ as file and pipe to stdout",'write/SP|for use like ">": `dr-js --cat sourceFile | dr-js --write outputFile`','append/SP|for use like ">>": `dr-js --cat sourceFile | dr-js --append outputFile`',"open,o//0-1|use system default app to open uri or path: $0=uriOrPath/cwd","status,s/T|basic system status: -h=isHumanReadableOutput","file-list,ls/AP/0-1|list file: $0=path/cwd","file-list-all,ls-R,lla/AP/0-1|list all file: $0=path/cwd","file-tree,tree/AP/0-1|list all file in tree: $0=path/cwd","file-create-directory,mkdir/AP/0-|create directory: $@=...pathList","file-modify-copy,cp/AP/2|copy path: $@=pathFrom,pathTo","file-modify-move,mv/AP/2|move path: $@=pathFrom,pathTo","file-modify-delete,rm/AP/0-|delete path: $@=...pathList","file-merge,merge/AP/2-|merge to one file: $@=mergedFile,...inputFileList","fetch,f//1-3|fetch uri: -O=outputFile/stdout, $@=initialUrl,jumpMax/4,timeout/0",'process-status,ps//0-1|show system process status: -h=isHumanReadableOutput, $0=outputMode/"pid--"',"server-serve-static,sss//0-1|static file server: -H=hostname:port, -R=staticRoot/cwd, $0=expireTime/5*60*1000","server-serve-static-simple,ssss//0-1|static file server, no HTML: -H=hostname:port, -R=staticRoot/cwd, $0=expireTime/5*60*1000","server-websocket-group,swg|websocket chat server: -H=hostname:port","server-test-connection,stc|connection test server: -H=hostname:port","server-tcp-proxy,stp//1-|tcp proxy server: -H=hostname:port, $@=toHostname:toPort,toHostname:toPort,...") | ||
const s=t("eval,e/A|eval file or string: -O=outputFile, -I/$0=scriptFile/scriptString, $@=...evalArgv","eval-readline,erl/A|eval with readline: -R=readlineFile, ...eval","repl,i/T|start node REPL","wait/AI/0-1|wait specified time, in msec: $0=waitTime/2*1000","echo/A|show args: $@=...args","cat/AP/0-|with 0 args pipe stdin to stdout, else read $@ as file and pipe to stdout",'write/SP|for use like ">": `dr-js --cat sourceFile | dr-js --write outputFile`','append/SP|for use like ">>": `dr-js --cat sourceFile | dr-js --append outputFile`',"open,o//0-1|use system default app to open uri or path: $0=uriOrPath/cwd","status,s/T|basic system status: -h=isHumanReadableOutput","file-list,ls/AP/0-1|list file: $0=path/cwd","file-list-all,ls-R,lla/AP/0-1|list all file: $0=path/cwd","file-tree,tree/AP/0-1|list all file in tree: $0=path/cwd","file-create-directory,mkdir/AP/0-|create directory: $@=...pathList","file-modify-copy,cp/AP/2|copy path: $@=pathFrom,pathTo","file-modify-move,mv/AP/2|move path: $@=pathFrom,pathTo","file-modify-delete,rm/AP/0-|delete path: $@=...pathList","file-merge,merge/AP/2-|merge to one file: $@=mergedFile,...inputFileList","fetch,f//1-3|fetch uri: -O=outputFile/stdout, $@=initialUrl,jumpMax/4,timeout/0",'process-status,ps//0-1|show system process status: -h=isHumanReadableOutput, $0=outputMode/"pid--"',"server-serve-static,sss//0-1|static file server: -H=hostname:port, -R=staticRoot/cwd, $0=expireTime/5*60*1000","server-serve-static-simple,ssss//0-1|static file server, no HTML: -H=hostname:port, -R=staticRoot/cwd, $0=expireTime/5*60*1000","server-websocket-group,swg|websocket chat server: -H=hostname:port","server-test-connection,stc|connection test server: -H=hostname:port","server-tcp-proxy,stp//1-|tcp proxy server: -H=hostname:port, $@=toHostname:toPort,toHostname:toPort,...") | ||
const r=s.map(({name:e})=>e) | ||
@@ -6,0 +6,0 @@ exports.MODE_NAME_LIST=r |
@@ -14,3 +14,3 @@ exports.isEqualArrayBuffer=((t,e)=>{if(t===e)return!0 | ||
exports.concatArrayBuffer=t | ||
exports.decatArrayBuffer=((t,e,r=0)=>e.map(e=>{const n=t.slice(r,r+e) | ||
exports.deconcatArrayBuffer=((t,e,r=0)=>e.map(e=>{const n=t.slice(r,r+e) | ||
r+=e | ||
@@ -17,0 +17,0 @@ return n})) |
@@ -14,12 +14,12 @@ var r=require("./ArrayBuffer") | ||
exports.parseArrayBufferHeader=a | ||
exports.packArrayBufferPacket=((a,f=e)=>(0,r.concatArrayBuffer)([...t((0,r.fromString)(a)),f])) | ||
exports.parseArrayBufferPacket=(e=>{const[t,f]=a(e) | ||
return[(0,r.toString)(t),e.slice(f)]}) | ||
exports.packArrayBufferPacket=((a,n=e)=>(0,r.concatArrayBuffer)([...t((0,r.fromString)(a)),n])) | ||
exports.parseArrayBufferPacket=(e=>{const[t,n]=a(e) | ||
return[(0,r.toString)(t),e.slice(n)]}) | ||
exports.packChainArrayBufferPacket=((e=[])=>{const a=new DataView(new ArrayBuffer(4*e.length)) | ||
e.forEach(({byteLength:r},e)=>a.setUint32(4*e,r,!1)) | ||
return(0,r.concatArrayBuffer)([...t(a.buffer),...e])}) | ||
exports.parseChainArrayBufferPacket=(e=>{const[t,f]=a(e) | ||
const n=new DataView(t) | ||
exports.parseChainArrayBufferPacket=(e=>{const[t,n]=a(e) | ||
const f=new DataView(t) | ||
const s=[] | ||
for(let r=0,e=n.byteLength/4;r<e;r++)s.push(n.getUint32(4*r,!1)) | ||
return(0,r.decatArrayBuffer)(e,s,f)}) | ||
for(let r=0,e=f.byteLength/4;r<e;r++)s.push(f.getUint32(4*r,!1)) | ||
return(0,r.deconcatArrayBuffer)(e,s,n)}) |
@@ -75,3 +75,3 @@ root=window,factory=function(){return function(t){var e={} | ||
n.d(o,"concatArrayBuffer",()=>yt) | ||
n.d(o,"decatArrayBuffer",()=>gt) | ||
n.d(o,"deconcatArrayBuffer",()=>gt) | ||
n.d(o,"fromString",()=>xt) | ||
@@ -1502,3 +1502,3 @@ n.d(o,"toString",()=>wt) | ||
const La=async t=>{const e=new DataView(await Aa(t.slice(0,Et))).getUint32(0,!1) | ||
return[await wt(await Aa(t.slice(Et,Et+e))),t.slice(Et+e)]} | ||
return[wt(await Aa(t.slice(Et,Et+e))),t.slice(Et+e)]} | ||
const Oa=({eventSource:t=window.document,isSkipPreventDefault:e=!1})=>{const n=new Map | ||
@@ -1505,0 +1505,0 @@ const r=t=>n.forEach(n=>{const{target:r,checkMap:o,callback:s}=n |
var e=require("http") | ||
var t=require("https") | ||
var r=require("url") | ||
var o=require("zlib") | ||
var n=require("../common/function") | ||
var s=require("./data/Buffer") | ||
const a=({protocol:e,hostname:t,hash:r,search:o,pathname:n,href:s,port:a,username:c,password:i})=>{const u={protocol:e,hostname:t,hash:r,search:o,pathname:n,href:s,path:`${n}${o}`} | ||
""!==a&&(u.port=Number(a));(c||i)&&(u.auth=`${c}:${i}`) | ||
return u} | ||
exports.urlToOption=a | ||
const c=(r,o=null)=>new Promise((n,s)=>{const a=("https:"===r.protocol?t.request:e.request)(r,n) | ||
const c=e=>{a.destroy() | ||
e.option=r | ||
s(e)} | ||
a.on("timeout",()=>c(new Error("NETWORK_TIMEOUT"))) | ||
a.on("error",c) | ||
a.end(o)}) | ||
exports.requestAsync=c | ||
exports.ping=(async e=>{let{url:t,body:o,wait:s=5e3,maxRetry:i=0}=e,u=function(e,t){if(null==e)return{} | ||
var r={} | ||
var o=Object.keys(e) | ||
var n,s | ||
for(s=0;s<o.length;s++){n=o[s] | ||
t.indexOf(n)>=0||(r[n]=e[n])}return r}(e,["url","body","wait","maxRetry"]) | ||
u=Object.assign({},u,a(new r.URL(t)),{timeout:s}) | ||
await(0,n.withRetryAsync)(async()=>{(await c(u,o)).destroy()},i,s)}) | ||
exports.fetchLikeRequest=(async(e,{method:t="GET",headers:o,body:n,timeout:s=1e4}={})=>{const u=Object.assign({},a(new r.URL(e)),{method:t,headers:Object.assign({"accept-encoding":"gzip"},o),timeout:s}) | ||
const h=await c(u,n) | ||
const p=h.statusCode | ||
return Object.assign({status:p,ok:p>=200&&p<300,headers:h.headers},i(h,s))}) | ||
const i=(e,t)=>{let r | ||
let n | ||
process.nextTick(()=>{if(!r){e.destroy() | ||
n=!0}}) | ||
const a=()=>{if(r)throw new Error("PAYLOAD_ALREADY_USED") | ||
if(n)throw new Error("PAYLOAD_ALREADY_DROPPED") | ||
r=!0 | ||
const s=t&&setTimeout(()=>{e.destroy() | ||
var r=require("zlib") | ||
var o=require("../common/function") | ||
var n=require("./data/Buffer") | ||
const s=(r,o,n)=>new Promise((s,c)=>{const a=(e=>e instanceof URL?e:new URL(e))(r) | ||
const i=("https:"===a.protocol?t.request:e.request)(a,o,s) | ||
const u=e=>{i.destroy() | ||
e.urlObject=a | ||
e.option=o | ||
c(e)} | ||
i.on("timeout",()=>u(new Error("NETWORK_TIMEOUT"))) | ||
i.on("error",u) | ||
i.end(n)}) | ||
exports.requestAsync=s | ||
exports.ping=(async(e,{method:t="GET",headers:r,body:n,wait:c=5e3,maxRetry:a=0}={})=>(0,o.withRetryAsync)(async()=>{(await s(e,{method:t,headers:r,timeout:c},n)).destroy()},a,c)) | ||
exports.fetchLikeRequest=(async(e,{method:t="GET",headers:r,body:o,timeout:n=1e4}={})=>{const a={method:t,headers:Object.assign({"accept-encoding":"gzip"},r),timeout:n} | ||
const i=await s(e,a,o) | ||
const u=i.statusCode | ||
return Object.assign({status:u,ok:u>=200&&u<300,headers:i.headers},c(i,n))}) | ||
const c=(e,t)=>{let o | ||
let s | ||
process.nextTick(()=>{if(!o){e.destroy() | ||
s=!0}}) | ||
const c=()=>{if(o)throw new Error("PAYLOAD_ALREADY_USED") | ||
if(s)throw new Error("PAYLOAD_ALREADY_DROPPED") | ||
o=!0 | ||
const n=t&&setTimeout(()=>{e.destroy() | ||
e.emit("error",new Error("PAYLOAD_TIMEOUT"))},t) | ||
e.on("end",()=>s&&clearTimeout(s)) | ||
return"gzip"===e.headers["content-encoding"]?e.pipe((0,o.createGunzip)()):e} | ||
const c=async()=>(0,s.receiveBufferAsync)(a()) | ||
const i=()=>c().then(u) | ||
return{stream:a,buffer:c,arrayBuffer:()=>c().then(s.toArrayBuffer),text:i,json:()=>i().then(h)}} | ||
const u=e=>e.toString() | ||
const h=e=>JSON.parse(e) | ||
e.on("end",()=>n&&clearTimeout(n)) | ||
return"gzip"===e.headers["content-encoding"]?e.pipe((0,r.createGunzip)()):e} | ||
const u=async()=>(0,n.receiveBufferAsync)(c()) | ||
const d=()=>u().then(a) | ||
return{stream:c,buffer:u,arrayBuffer:()=>u().then(n.toArrayBuffer),text:d,json:()=>d().then(i)}} | ||
const a=e=>e.toString() | ||
const i=e=>JSON.parse(e) |
@@ -1,45 +0,44 @@ | ||
var e=require("url") | ||
var r=require("../../../common/check") | ||
var t=require("../../../common/data/Tree") | ||
var o=require("../../../common/module/RouteMap") | ||
var a=require("../../../common/module/MIME") | ||
var u=require("../commonHTML") | ||
var n=require("./Send") | ||
const s={GET:"/GET",POST:"/POST",PUT:"/PUT",PATCH:"/PATCH",DELETE:"/DELETE",HEAD:"/HEAD",OPTIONS:"/OPTIONS",CONNECT:"/CONNECT",TRACE:"/TRACE"} | ||
exports.METHOD_MAP=s | ||
const i=(e,r="/",t="GET",a)=>{if(Array.isArray(r))return r.reduce((r,o)=>i(e,o,t,a),e) | ||
if(Array.isArray(t))return t.reduce((t,o)=>i(e,r,o,a),e) | ||
const{routeNode:u,paramNameList:n}=(0,o.parseRouteToMap)(e,r) | ||
const c=s[t] | ||
if(!c)throw new Error(`invalid method [${t}] for: ${r}`) | ||
if(u[c])throw new Error(`duplicate method [${t}] for: ${r}`) | ||
var e=require("../../../common/check") | ||
var r=require("../../../common/data/Tree") | ||
var t=require("../../../common/module/RouteMap") | ||
var o=require("../../../common/module/MIME") | ||
var a=require("../commonHTML") | ||
var u=require("./Send") | ||
const n={GET:"/GET",POST:"/POST",PUT:"/PUT",PATCH:"/PATCH",DELETE:"/DELETE",HEAD:"/HEAD",OPTIONS:"/OPTIONS",CONNECT:"/CONNECT",TRACE:"/TRACE"} | ||
exports.METHOD_MAP=n | ||
const s=(e,r="/",o="GET",a)=>{if(Array.isArray(r))return r.reduce((r,t)=>s(e,t,o,a),e) | ||
if(Array.isArray(o))return o.reduce((t,o)=>s(e,r,o,a),e) | ||
const{routeNode:u,paramNameList:c}=(0,t.parseRouteToMap)(e,r) | ||
const d=n[o] | ||
if(!d)throw new Error(`invalid method [${o}] for: ${r}`) | ||
if(u[d])throw new Error(`duplicate method [${o}] for: ${r}`) | ||
if("function"!=typeof a)throw new Error(`invalid responder for: ${r}`) | ||
u[c]={route:r,paramNameList:n,routeResponder:a} | ||
u[d]={route:r,paramNameList:c,routeResponder:a} | ||
return e} | ||
exports.appendRouteMap=i | ||
exports.createRouteMap=(e=>e.reduce((e,[r,t,o])=>i(e,r,t,o),{})) | ||
exports.createResponderRouter=(({routeMap:r,baseUrl:t="",getMethodUrl:a=c(new e.URL(t))})=>e=>{const{method:t,url:u}=a(e) | ||
const n=s[t] | ||
if(void 0===n)return | ||
const i=(0,o.findRouteFromMap)(r,u.pathname) | ||
if(void 0===i)return | ||
const{routeNode:c,paramValueList:d}=i | ||
if(void 0===c[n])return | ||
const{route:p,paramNameList:m,routeResponder:T}=c[n] | ||
const E=m.reduce((e,r,t)=>{e[r]=d[t] | ||
exports.appendRouteMap=s | ||
exports.createRouteMap=(e=>e.reduce((e,[r,t,o])=>s(e,r,t,o),{})) | ||
exports.createResponderRouter=(({routeMap:e,baseUrl:r="",getMethodUrl:o=c(new URL(r))})=>r=>{const{method:a,url:u}=o(r) | ||
const s=n[a] | ||
if(void 0===s)return | ||
const c=(0,t.findRouteFromMap)(e,u.pathname) | ||
if(void 0===c)return | ||
const{routeNode:d,paramValueList:i}=c | ||
if(void 0===d[s])return | ||
const{route:p,paramNameList:m,routeResponder:T}=d[s] | ||
const E=m.reduce((e,r,t)=>{e[r]=i[t] | ||
return e},{}) | ||
return T(e,e.setState({method:t,url:u,route:p,paramMap:E}))}) | ||
const c=r=>({request:{method:t,url:o}})=>({method:t,url:new e.URL(o.replace(d,"/"),r)}) | ||
return T(r,r.setState({method:a,url:u,route:p,paramMap:E}))}) | ||
const c=e=>({request:{method:r,url:t}})=>({method:r,url:new URL(t.replace(d,"/"),e)}) | ||
const d=/\/\//g | ||
exports.getRouteParamAny=(e=>(0,o.getRouteParamAny)(e.getState())) | ||
exports.getRouteParam=((e,r)=>(0,o.getRouteParam)(e.getState(),r)) | ||
const p=e=>{const r=[] | ||
const t=new Set(Object.values(s)) | ||
m(["ROOT",e],([e,{route:o}])=>{t.has(e)&&r.push({method:e,route:o})}) | ||
exports.getRouteParamAny=(e=>(0,t.getRouteParamAny)(e.getState())) | ||
exports.getRouteParam=((e,r)=>(0,t.getRouteParam)(e.getState(),r)) | ||
const i=e=>{const r=[] | ||
const t=new Set(Object.values(n)) | ||
p(["ROOT",e],([e,{route:o}])=>{t.has(e)&&r.push({method:e,route:o})}) | ||
return r} | ||
exports.describeRouteMap=p | ||
const m=(0,t.createTreeDepthFirstSearch)(([e,t])=>(0,r.isBasicObject)(t)&&Object.entries(t)) | ||
exports.describeRouteMap=i | ||
const p=(0,r.createTreeDepthFirstSearch)(([r,t])=>(0,e.isBasicObject)(t)&&Object.entries(t)) | ||
exports.createResponderRouteList=(({getRouteMap:e,extraBodyList:r})=>{let t | ||
return async o=>{void 0===t&&(t=await(0,n.prepareBufferData)(Buffer.from(T(e(),r)),a.BASIC_EXTENSION_MAP.html)) | ||
return(0,n.responderSendBufferCompress)(o,t)}}) | ||
const T=(e,r=[])=>(0,u.COMMON_LAYOUT)([(0,u.COMMON_STYLE)(),"<style>body { align-items: start; }</style>"],["<h2>Route List</h2>","<table>",...p(e).map(({method:e,route:r})=>`<tr><td><b>${e}</b></td><td>${"/GET"===e?`<a href="${r}">${r}</a>`:r}</td></tr>`),"</table>",...r]) | ||
return async a=>{void 0===t&&(t=await(0,u.prepareBufferData)(Buffer.from(m(e(),r)),o.BASIC_EXTENSION_MAP.html)) | ||
return(0,u.responderSendBufferCompress)(a,t)}}) | ||
const m=(e,r=[])=>(0,a.COMMON_LAYOUT)([(0,a.COMMON_STYLE)(),"<style>body { align-items: start; }</style>"],["<h2>Route List</h2>","<table>",...i(e).map(({method:e,route:r})=>`<tr><td><b>${e}</b></td><td>${"/GET"===e?`<a href="${r}">${r}</a>`:r}</td></tr>`),"</table>",...r]) |
@@ -1,27 +0,25 @@ | ||
var e=require("url") | ||
var o=require("http") | ||
var t=require("https") | ||
var r=require("../../net") | ||
var s=require("./function") | ||
var c=require("./WebSocket") | ||
const n=new Set(["wss:","ws:","https:","http:"]) | ||
const i=new Set(["wss:","https:"]) | ||
const a=(e,o,t)=>e.doCloseSocket() | ||
exports.createWebSocketClient=(({urlString:p,option:l={},onError:u,onUpgradeResponse:S=a,frameLengthLimit:d})=>{const g=new e.URL(p) | ||
if(!n.has(g.protocol))throw new Error(`[WebSocketClient] invalid url protocol: ${g.protocol}`) | ||
if(!g.host)throw new Error(`[WebSocketClient] invalid url host: ${g.host}`) | ||
l.isSecure=i.has(g.protocol) | ||
const{requestOption:w,requestProtocolString:k,responseKey:b}=((e,{key:o,isSecure:t,headers:c,origin:n="",requestProtocolString:i=""})=>{const a=o||(0,s.getRequestKey)() | ||
const p=(0,s.getRespondKey)(a) | ||
return{requestOption:Object.assign({},(0,r.urlToOption)(e),{protocol:void 0,port:""!==e.port?e.port:t?443:80,headers:Object.assign({},c,{origin:n,upgrade:"websocket",connection:"upgrade","sec-websocket-version":s.WEBSOCKET_VERSION,"sec-websocket-key":a,"sec-websocket-protocol":i})}),requestProtocolString:i,responseKey:p}})(g,l) | ||
const h=(l.isSecure?t.get:o.get)(w) | ||
h.on("error",e=>{if(!h.aborted){h.abort() | ||
u(e)}}) | ||
h.on("response",e=>{h.abort() | ||
u(new Error("[WebSocketClient] unexpected response"))}) | ||
h.on("upgrade",async(e,o,t)=>{const r=(0,c.createWebSocket)({socket:o,frameLengthLimit:d,isMask:!0}) | ||
r.origin=l.origin | ||
r.isSecure=l.isSecure | ||
await S(r,e,t) | ||
r.isClosed()||((e,o,t,r)=>{if(e.getReadyState()!==e.CONNECTING)throw new Error(`[WebSocketClient][doUpgradeSocket] error readyState ${e.getReadyState()}`) | ||
var e=require("http") | ||
var o=require("https") | ||
var t=require("./function") | ||
var r=require("./WebSocket") | ||
const s=new Set(["wss:","ws:","https:","http:"]) | ||
const c=new Set(["wss:","https:"]) | ||
const n=(e,o,t)=>e.doCloseSocket() | ||
exports.createWebSocketClient=(({urlString:i,option:{key:a,headers:p,origin:d="",requestProtocolString:l=""}={},onError:w,onUpgradeResponse:k=n,frameLengthLimit:h})=>{const S=new URL(i) | ||
if(!s.has(S.protocol))throw new Error(`[WebSocketClient] invalid url protocol: ${S.protocol}`) | ||
if(!S.host)throw new Error(`[WebSocketClient] invalid url host: ${S.host}`) | ||
const g=c.has(S.protocol) | ||
const b=a||(0,t.getRequestKey)() | ||
const u=(0,t.getRespondKey)(b) | ||
S.protocol=g?"https:":"http:" | ||
const C=(g?o.get:e.get)(S,{headers:Object.assign({origin:d,upgrade:"websocket",connection:"upgrade","sec-websocket-version":t.WEBSOCKET_VERSION,"sec-websocket-key":b,"sec-websocket-protocol":l},p)}) | ||
C.on("error",e=>{if(!C.aborted){C.abort() | ||
w(e)}}) | ||
C.on("response",e=>{C.abort() | ||
w(new Error("[WebSocketClient] unexpected response"))}) | ||
C.on("upgrade",async(e,o,t)=>{const s=(0,r.createWebSocket)({socket:o,frameLengthLimit:h,isMask:!0}) | ||
s.origin=d | ||
s.isSecure=g | ||
await k(s,e,t) | ||
s.isClosed()||((e,o,t,r)=>{if(e.getReadyState()!==e.CONNECTING)throw new Error(`[WebSocketClient][doUpgradeSocket] error readyState ${e.getReadyState()}`) | ||
if(t!==o.headers["sec-websocket-accept"])throw new Error("[WebSocketClient][doUpgradeSocket] wrong sec-websocket-accept") | ||
@@ -31,2 +29,2 @@ const s=o.headers["sec-websocket-protocol"] | ||
e.protocol=s | ||
e.open()})(r,e,b,k)})}) | ||
e.open()})(s,e,u,l)})}) |
@@ -8,4 +8,4 @@ import { fromString, toString } from "../../common/data/ArrayBuffer"; | ||
const headerSize = new DataView(await parseBlobAsArrayBuffer(blobPacket.slice(0, HEADER_BYTE_SIZE))).getUint32(0, !1); | ||
return [ await toString(await parseBlobAsArrayBuffer(blobPacket.slice(HEADER_BYTE_SIZE, HEADER_BYTE_SIZE + headerSize))), blobPacket.slice(HEADER_BYTE_SIZE + headerSize) ]; | ||
return [ toString(await parseBlobAsArrayBuffer(blobPacket.slice(HEADER_BYTE_SIZE, HEADER_BYTE_SIZE + headerSize))), blobPacket.slice(HEADER_BYTE_SIZE + headerSize) ]; | ||
}; | ||
export { packBlobPacket, parseBlobPacket }; |
@@ -19,3 +19,3 @@ const isEqualArrayBuffer = (a, b) => { | ||
}; | ||
const decatArrayBuffer = (concatedArrayBuffer, byteLengthList, byteOffset = 0) => byteLengthList.map(byteLength => { | ||
const deconcatArrayBuffer = (concatedArrayBuffer, byteLengthList, byteOffset = 0) => byteLengthList.map(byteLength => { | ||
const arrayBuffer = concatedArrayBuffer.slice(byteOffset, byteOffset + byteLength); | ||
@@ -39,2 +39,2 @@ byteOffset += byteLength; | ||
}; | ||
export { isEqualArrayBuffer, concatArrayBuffer, decatArrayBuffer, fromString, toString }; | ||
export { isEqualArrayBuffer, concatArrayBuffer, deconcatArrayBuffer, fromString, toString }; |
@@ -1,2 +0,2 @@ | ||
import { concatArrayBuffer, decatArrayBuffer, fromString, toString } from "./ArrayBuffer"; | ||
import { concatArrayBuffer, deconcatArrayBuffer, fromString, toString } from "./ArrayBuffer"; | ||
const MAX_PACKET_HEADER_SIZE = 4294967295; | ||
@@ -31,4 +31,4 @@ const HEADER_BYTE_SIZE = 4; | ||
for (let index = 0, indexMax = headerDataView.byteLength / 4; index < indexMax; index++) byteLengthList.push(headerDataView.getUint32(4 * index, !1)); | ||
return decatArrayBuffer(chainArrayBufferPacket, byteLengthList, payloadOffset); | ||
return deconcatArrayBuffer(chainArrayBufferPacket, byteLengthList, payloadOffset); | ||
}; | ||
export { MAX_PACKET_HEADER_SIZE, HEADER_BYTE_SIZE, packArrayBufferHeader, parseArrayBufferHeader, packArrayBufferPacket, parseArrayBufferPacket, packChainArrayBufferPacket, parseChainArrayBufferPacket }; |
import { request as httpRequest } from "http"; | ||
import { request as httpsRequest } from "https"; | ||
import { URL } from "url"; | ||
import { createGunzip } from "zlib"; | ||
import { withRetryAsync } from "../common/function"; | ||
import { receiveBufferAsync, toArrayBuffer } from "./data/Buffer"; | ||
const urlToOption = ({protocol, hostname, hash, search, pathname, href, port, username, password}) => { | ||
const option = { | ||
protocol, | ||
hostname, | ||
hash, | ||
search, | ||
pathname, | ||
href, | ||
path: `${pathname}${search}` | ||
}; | ||
"" !== port && (option.port = Number(port)); | ||
(username || password) && (option.auth = `${username}:${password}`); | ||
return option; | ||
}; | ||
const requestAsync = (option, body = null) => new Promise((resolve, reject) => { | ||
const request = ("https:" === option.protocol ? httpsRequest : httpRequest)(option, resolve); | ||
const requestAsync = (url, option, body) => new Promise((resolve, reject) => { | ||
const urlObject = (url => url instanceof URL ? url : new URL(url))(url); | ||
const request = ("https:" === urlObject.protocol ? httpsRequest : httpRequest)(urlObject, option, resolve); | ||
const endWithError = error => { | ||
request.destroy(); | ||
error.urlObject = urlObject; | ||
error.option = option; | ||
@@ -32,15 +19,11 @@ reject(error); | ||
}); | ||
const ping = async ({url, body, wait = 5e3, maxRetry = 0, ...option}) => { | ||
option = { | ||
...option, | ||
...urlToOption(new URL(url)), | ||
const ping = async (url, {method = "GET", headers, body, wait = 5e3, maxRetry = 0} = {}) => withRetryAsync(async () => { | ||
(await requestAsync(url, { | ||
method, | ||
headers, | ||
timeout: wait | ||
}; | ||
await withRetryAsync(async () => { | ||
(await requestAsync(option, body)).destroy(); | ||
}, maxRetry, wait); | ||
}; | ||
}, body)).destroy(); | ||
}, maxRetry, wait); | ||
const fetchLikeRequest = async (url, {method = "GET", headers: requestHeaders, body, timeout = 1e4} = {}) => { | ||
const option = { | ||
...urlToOption(new URL(url)), | ||
method, | ||
@@ -53,3 +36,3 @@ headers: { | ||
}; | ||
const response = await requestAsync(option, body); | ||
const response = await requestAsync(url, option, body); | ||
const status = response.statusCode; | ||
@@ -60,6 +43,6 @@ return { | ||
headers: response.headers, | ||
...wrapPayload(response, timeout) | ||
...wrapResponse(response, timeout) | ||
}; | ||
}; | ||
const wrapPayload = (response, timeout) => { | ||
const wrapResponse = (response, timeout) => { | ||
let isKeep; | ||
@@ -96,2 +79,2 @@ let isDropped; | ||
const parseJSON = text => JSON.parse(text); | ||
export { urlToOption, requestAsync, ping, fetchLikeRequest }; | ||
export { requestAsync, ping, fetchLikeRequest }; |
@@ -1,2 +0,1 @@ | ||
import { URL } from "url"; | ||
import { isBasicObject } from "../../../common/check"; | ||
@@ -3,0 +2,0 @@ import { createTreeDepthFirstSearch } from "../../../common/data/Tree"; |
@@ -1,6 +0,4 @@ | ||
import { URL } from "url"; | ||
import { get as httpGet } from "http"; | ||
import { get as httpsGet } from "https"; | ||
import { urlToOption } from "../../net"; | ||
import { WEBSOCKET_VERSION, WEBSOCKET_EVENT, getRequestKey, getRespondKey } from "./function"; | ||
import { WEBSOCKET_VERSION, getRequestKey, getRespondKey } from "./function"; | ||
import { createWebSocket } from "./WebSocket"; | ||
@@ -10,30 +8,21 @@ const VALID_WEBSOCKET_PROTOCOL_SET = new Set([ "wss:", "ws:", "https:", "http:" ]); | ||
const DEFAULT_ON_UPGRADE_RESPONSE = (webSocket, response, bodyHeadBuffer) => webSocket.doCloseSocket(); | ||
const createWebSocketClient = ({urlString, option = {}, onError, onUpgradeResponse = DEFAULT_ON_UPGRADE_RESPONSE, frameLengthLimit}) => { | ||
const url = new URL(urlString); | ||
if (!VALID_WEBSOCKET_PROTOCOL_SET.has(url.protocol)) throw new Error(`[WebSocketClient] invalid url protocol: ${url.protocol}`); | ||
if (!url.host) throw new Error(`[WebSocketClient] invalid url host: ${url.host}`); | ||
option.isSecure = SECURE_WEBSOCKET_PROTOCOL_SET.has(url.protocol); | ||
const {requestOption, requestProtocolString, responseKey} = ((url, {key, isSecure, headers, origin = "", requestProtocolString = ""}) => { | ||
const requestKey = key || getRequestKey(); | ||
const responseKey = getRespondKey(requestKey); | ||
return { | ||
requestOption: { | ||
...urlToOption(url), | ||
protocol: void 0, | ||
port: "" !== url.port ? url.port : isSecure ? 443 : 80, | ||
headers: { | ||
...headers, | ||
origin, | ||
upgrade: "websocket", | ||
connection: "upgrade", | ||
"sec-websocket-version": WEBSOCKET_VERSION, | ||
"sec-websocket-key": requestKey, | ||
"sec-websocket-protocol": requestProtocolString | ||
} | ||
}, | ||
requestProtocolString, | ||
responseKey | ||
}; | ||
})(url, option); | ||
const request = (option.isSecure ? httpsGet : httpGet)(requestOption); | ||
const createWebSocketClient = ({urlString, option: {key, headers, origin = "", requestProtocolString = ""} = {}, onError, onUpgradeResponse = DEFAULT_ON_UPGRADE_RESPONSE, frameLengthLimit}) => { | ||
const urlObject = new URL(urlString); | ||
if (!VALID_WEBSOCKET_PROTOCOL_SET.has(urlObject.protocol)) throw new Error(`[WebSocketClient] invalid url protocol: ${urlObject.protocol}`); | ||
if (!urlObject.host) throw new Error(`[WebSocketClient] invalid url host: ${urlObject.host}`); | ||
const isSecure = SECURE_WEBSOCKET_PROTOCOL_SET.has(urlObject.protocol); | ||
const requestKey = key || getRequestKey(); | ||
const responseKey = getRespondKey(requestKey); | ||
urlObject.protocol = isSecure ? "https:" : "http:"; | ||
const request = (isSecure ? httpsGet : httpGet)(urlObject, { | ||
headers: { | ||
origin, | ||
upgrade: "websocket", | ||
connection: "upgrade", | ||
"sec-websocket-version": WEBSOCKET_VERSION, | ||
"sec-websocket-key": requestKey, | ||
"sec-websocket-protocol": requestProtocolString, | ||
...headers | ||
} | ||
}); | ||
request.on("error", error => { | ||
@@ -55,4 +44,4 @@ if (!request.aborted) { | ||
}); | ||
webSocket.origin = option.origin; | ||
webSocket.isSecure = option.isSecure; | ||
webSocket.origin = origin; | ||
webSocket.isSecure = isSecure; | ||
await onUpgradeResponse(webSocket, response, bodyHeadBuffer); | ||
@@ -59,0 +48,0 @@ webSocket.isClosed() || ((webSocket, response, responseKey, requestProtocolString) => { |
@@ -1,1 +0,1 @@ | ||
{"name":"dr-js","version":"0.21.0-dev.3","description":"A collection of strange functions","author":"dr-js","license":"MIT","keywords":["Dr","Dr-js","JavaScript"],"repository":"github:dr-js/dr-js","bin":"bin/index.js","browser":"library/Dr.browser.js","engines":{"node":">=10.15","npm":">=6"},"sideEffects":false} | ||
{"name":"dr-js","version":"0.21.0-dev.4","description":"A collection of strange functions","author":"dr-js","license":"MIT","keywords":["Dr","Dr-js","JavaScript"],"repository":"github:dr-js/dr-js","bin":"bin/index.js","browser":"library/Dr.browser.js","engines":{"node":">=10.15","npm":">=6"},"sideEffects":false} |
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 2 instances in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
412636
9518
26