insite-ws-transfers 2.3.1 → 2.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +4 -4
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +4 -4
- package/package.json +7 -7
- package/bun.lock +0 -959
package/dist/browser/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var Ae=Object.defineProperty;var Te=o=>{throw TypeError(o)};var Pe=(o,e,t)=>e in o?Ae(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var i=(o,e,t)=>Pe(o,typeof e!="symbol"?e+"":e,t),oe=(o,e,t)=>e.has(o)||Te("Cannot "+t);var s=(o,e,t)=>(oe(o,e,"read from private field"),t?t.call(o):e.get(o)),n=(o,e,t)=>e.has(o)?Te("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(o):e.set(o,t),h=(o,e,t,r)=>(oe(o,e,"write to private field"),r?r.call(o,t):e.set(o,t),t),d=(o,e,t)=>(oe(o,e,"access private method"),t);var l={request:"~t-request",confirm:"~t-confirm",chunk:"~t-c",progress:"~t-p",sent:"~t-sent",completed:"~t-completed",abort:"~t-abort",error:"~t-error"},Ce=10*1024*1024*1024,Oe=1024*256,be=250;var T,C,O,D,S,P,x,z,I,U,c,Re,he,le,b=class{constructor(e,t,r,{type:a,collect:f,encoding:g,size:j,metadata:A},ne,ae){n(this,c);i(this,"ws");n(this,T);i(this,"kind");i(this,"id");i(this,"type");i(this,"collect");i(this,"encoding");i(this,"size");i(this,"metadata");n(this,C);n(this,O);n(this,D);i(this,"data");n(this,S);i(this,"isAborted",!1);i(this,"isAbortedBySender",!1);i(this,"isAbortedByReceiver",!1);i(this,"isTransfered",!1);i(this,"confirmResponse");i(this,"beginAt",null);n(this,P,null);n(this,x,[]);n(this,z,!1);i(this,"duration",null);i(this,"transferedSize",0);i(this,"processedSize",0);i(this,"bytesPerMs",null);i(this,"progress",0);i(this,"endAt",null);i(this,"error",null);n(this,I);n(this,U,0);this.ws=e,h(this,T,e.isWebSocket?[e]:[e.wss,e]),this.kind=t,this.id=r,this.type=a,this.collect=!!f,this.encoding=g,this.size=j,this.metadata=A,h(this,C,ne),h(this,O,ae),h(this,D,d(this,c,Re).call(this))}whenSetUp(){return s(this,D)}async confirm(){for(let{begin:e}of s(this,O))if(await e?.call(...s(this,T),this)===!1)return this.throw("Transfer was rejected by receiver");this.beginAt=h(this,P,Date.now()),this.ws.sendMessage(l.confirm,this.id,this.confirmResponse),h(this,I,setInterval(()=>{s(this,U)!==this.progress&&(h(this,U,this.progress),this.ws.sendMessage(l.progress,this.id,this.progress))},be))}async handleChunk(e,t=e.length){let r=Date.now();this.bytesPerMs=t/(r-s(this,P)),h(this,P,r),this.transferedSize+=t,s(this,x).push([e,t]),s(this,z)||(h(this,z,!0),await d(this,c,he).call(this))}async handleSent(){this.isTransfered=!0,this.size||(this.size=this.transferedSize),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,s(this,z)||await d(this,c,le).call(this)}abort(e=!1){return this.isAborted=!0,this.isAbortedBySender=e,this.isAbortedByReceiver=!e,this.throw(`Transfer is aborted by ${e?"sender":"receiver"}`,!e)}throw(e,t=!0){s(this,C).delete(this.id),clearInterval(s(this,I)),this.error=new Error(e);for(let r of s(this,O))r.once&&s(this,C).removeListener(this.kind,r),r.error?.call(...s(this,T),this,this.error);t&&this.ws.sendMessage(l.error,this.id,e)}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isAbortedBySender:this.isAbortedBySender,isAbortedByReceiver:this.isAbortedByReceiver,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,processedSize:this.processedSize,bytesPerMs:this.bytesPerMs,progress:this.progress,endAt:this.endAt,error:this.error}}};T=new WeakMap,C=new WeakMap,O=new WeakMap,D=new WeakMap,S=new WeakMap,P=new WeakMap,x=new WeakMap,z=new WeakMap,I=new WeakMap,U=new WeakMap,c=new WeakSet,Re=async function(){if(h(this,S,this.constructor.types[this.type]),s(this,S))await s(this,S).setup.call(this);else throw new Error(`Unknown type of transfer "${String(this.type)}"`);await this.confirm()},he=async function(){let[e,t]=s(this,x).shift();s(this,S).transformChunk&&(e=await s(this,S).transformChunk.call(this,e)),this.collect&&await s(this,S).collect.call(this,e);for(let{chunk:r,progress:a}of s(this,O))await(r??a)?.call(...s(this,T),this,e);this.processedSize+=t,this.size&&(this.progress=this.processedSize/this.size),s(this,x).length?d(this,c,he).call(this):(h(this,z,!1),this.isTransfered&&d(this,c,le).call(this))},le=async function(){this.progress=1,await s(this,S).done?.call(this);for(let e of s(this,O))e.once&&s(this,C).removeListener(this.kind,e),await e.end?.call(...s(this,T),this);clearInterval(s(this,I)),s(this,C).delete(this.id),this.ws.sendMessage(l.completed,this.id)},i(b,"types",{object:{setup(){this.data=""},collect(e){this.data+=e},done(){this.data=JSON.parse(this.data)}},datauri:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&(this.data=`data:${this.metadata.type};base64,${this.data}`)}},string:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e}}});var p,u,_,J=class{constructor(e,t={}){i(this,"sizeLimit");n(this,p,new Map);i(this,"on",this.addTransferListener);i(this,"off",this.removeTransferListener);n(this,u,new Map);n(this,_,{delete:e=>s(this,u).delete(e),removeListener:(e,t)=>this.removeTransferListener(e,t)});let{sizeLimit:r=Ce}=t;this.sizeLimit=r,e.isWebSocketServer?(e.on(`client-message:${l.request}`,(a,...f)=>this.handleRequest(a,...f)),e.on(`client-message:${l.chunk}`,(a,...f)=>this.handleChunk(a,...f)),e.on(`client-message:${l.sent}`,(a,...f)=>this.handleSent(a,...f)),e.on(`client-message:${l.abort}`,(a,...f)=>this.handleAbort(a,...f))):(e.on(`message:${l.request}`,(...a)=>this.handleRequest(e,...a)),e.on(`message:${l.chunk}`,(...a)=>this.handleChunk(e,...a)),e.on(`message:${l.sent}`,(...a)=>this.handleSent(e,...a)),e.on(`message:${l.abort}`,(...a)=>this.handleAbort(e,...a))),Object.assign(e,{onTransfer:(a,f,g)=>this.on(a,f,g),onceTransfer:(a,f,g)=>this.once(a,f,g)})}addTransferListener(e,t,r){return r?.once&&(t.once=!0),s(this,p).get(e)?.add(t)??s(this,p).set(e,new Set([t])),this}once(e,t,r){return this.addTransferListener(e,t,{...r,once:!0})}removeTransferListener(e,t){if(t){let r=s(this,p).get(e);r&&(r.delete(t),r.size||s(this,p).delete(e))}else s(this,p).delete(e);return this}handleRequest(e,t,r,{type:a,size:f,metadata:g,...j}){let{Transfer:A}=this.constructor;s(this,p).has(t)?s(this,u).has(r)?e.sendMessage(l.error,r,"Transfer already exists"):a in A.types?f>this.sizeLimit?e.sendMessage(l.error,r,`Transfer size (${f} bytes) exeeds limit of ${this.sizeLimit} bytes`):s(this,u).set(r,new A(e,t,r,{type:a,size:f,metadata:g,...j},s(this,_),s(this,p).get(t))):e.sendMessage(l.error,r,"Unknown type of transfer"):e.sendMessage(l.error,r,`Unknown kind of file "${t}"`)}async handleChunk(e,t,r,a=r.length){await s(this,u).get(t)?.handleChunk(r,a)}async handleSent(e,t){await s(this,u).get(t)?.handleSent()}handleAbort(e,t){s(this,u).get(t)?.abort(!0)}};p=new WeakMap,u=new WeakMap,_=new WeakMap,i(J,"Transfer",b);var ee=class extends b{};i(ee,"types",{file:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&this.encoding==="utf8"&&(this.data=atob(this.data))}},...b.types});var fe=class extends J{};i(fe,"Transfer",ee);import{uid as xe}from"@nesvet/n";var L,k,N,de,M=class{constructor(e,t={}){n(this,N);i(this,"string");i(this,"size");i(this,"chunkSize");i(this,"listener");n(this,L,0);n(this,k,0);i(this,"isAborted",!1);this.string=e,this.size=this.string.length;let{chunkSize:r=1024*256}=t;this.chunkSize=r}start(e){this.listener=e,d(this,N,de).call(this)}abort(){this.isAborted=!0}};L=new WeakMap,k=new WeakMap,N=new WeakSet,de=async function(){if(!this.isAborted){h(this,k,Math.min(s(this,L)+this.chunkSize,this.size));let e=await new Promise(t=>{t(this.string.slice(s(this,L),s(this,k)))});this.isAborted||(await this.listener(e),s(this,k)<this.size&&(h(this,L,s(this,k)),d(this,N,de).call(this)))}};var m,F,Q,G,B,K,V,X,R,E,$,q,v,ze,Se,W=class{constructor(e,t,{data:r,type:a,incomingType:f,collect:g,metadata:j,size:A,chunkSize:ne,encoding:ae,incomingEncoding:ve,onBegin:me,onSenderProgress:ge,onProgress:ue,onEnd:We,onError:ye},we){n(this,v);i(this,"ws");n(this,m);i(this,"kind");i(this,"data");i(this,"type");i(this,"collect");i(this,"metadata");i(this,"size");i(this,"encoding");i(this,"chunkSize");n(this,F);n(this,Q);n(this,G);n(this,B);n(this,K);n(this,V);n(this,X);i(this,"id",xe());n(this,R);i(this,"isAborted",!1);i(this,"isTransfered",!1);i(this,"confirmResponse");i(this,"beginAt",null);n(this,E,null);n(this,$,[]);n(this,q,!1);i(this,"duration",null);i(this,"transferedSize",0);i(this,"bytesPerMs",null);i(this,"senderProgress",0);i(this,"progress",0);i(this,"endAt",null);i(this,"error",null);i(this,"stringStreamer");i(this,"fileStreamer");i(this,"handleChunk",e=>{s(this,$).push(e),s(this,q)||(h(this,q,!0),d(this,v,Se).call(this))});i(this,"sent",()=>this.ws.sendMessage(l.sent,this.id));this.ws=e,h(this,m,e.isWebSocket?[e]:[e.wss,e]),this.kind=t,this.data=r,this.type=a,this.collect=g??!1,this.metadata=j,this.size=A??null,this.encoding=ae,this.chunkSize=ne??this.constructor.chunkSize,h(this,F,we),me&&h(this,Q,me),ge&&h(this,G,ge),ue&&h(this,B,ue),We&&h(this,K,We),ye&&h(this,V,ye),h(this,X,d(this,v,ze).call(this,f,ve))}whenSetUp(){return s(this,X)}async handleConfirm(e){this.confirmResponse=e,this.beginAt=h(this,E,Date.now()),await s(this,Q)?.call(...s(this,m),this),await s(this,R).confirm.call(this)}handleProgress(e){this.progress=e,s(this,B)?.call(...s(this,m),this)}async handleCompleted(){this.isTransfered=!0,this.size||(this.size=this.transferedSize,this.senderProgress=1),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,s(this,F).delete(this.id),this.progress!==1&&(this.progress=1,await s(this,B)?.call(...s(this,m),this)),s(this,K)?.call(...s(this,m),this)}throw(e){s(this,F).delete(this.id),this.error=new Error(e),s(this,V)?.call(...s(this,m),this,this.error)}abort(){return this.isAborted=!0,this.ws.sendMessage(l.abort,this.id),this.throw("Transfer is aborted by sender")}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,bytesPerMs:this.bytesPerMs,senderProgress:this.senderProgress,progress:this.progress,endAt:this.endAt,error:this.error}}};m=new WeakMap,F=new WeakMap,Q=new WeakMap,G=new WeakMap,B=new WeakMap,K=new WeakMap,V=new WeakMap,X=new WeakMap,R=new WeakMap,E=new WeakMap,$=new WeakMap,q=new WeakMap,v=new WeakSet,ze=async function(e,t){for(let[r,a,f]of this.constructor.types)if(this.type===r||a(this.data)){this.type=r,h(this,R,f);break}if(this.type)await s(this,R).setup.call(this),delete this.data;else throw new Error("Unknown type of transfer");this.ws.sendMessage(l.request,this.kind,this.id,{type:e??this.type,collect:this.collect,encoding:t??this.encoding,size:this.size,metadata:this.metadata})},Se=async function(){let e=s(this,$).shift(),t=e.length;s(this,R).transformChunk&&(e=await s(this,R).transformChunk.call(this,e)),this.ws.sendMessage(l.chunk,this.id,e,t);let r=Date.now();this.bytesPerMs=t/(r-s(this,E)),h(this,E,r),this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size),await s(this,G)?.call(...s(this,m),this),s(this,$).length?d(this,v,Se).call(this):(h(this,q,!1),this.senderProgress===1&&this.sent())},i(W,"types",[["object",e=>typeof e=="object",{setup(){this.stringStreamer=new M(JSON.stringify(this.data),{chunkSize:this.chunkSize}),this.collect=!0,this.size=this.stringStreamer.size,this.encoding="utf8"},confirm(){this.stringStreamer.start(this.handleChunk)}}],["datauri",e=>typeof e=="string"&&/^data:[\w-.]+\/[\w-.+,]+(?:;base64)?,/.test(e),{setup(){let[e,t]=this.data.split(/^data:|;base64,|,/).slice(1);this.stringStreamer=new M(t,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding="base64",this.metadata={...this.metadata,type:e}},confirm(){this.stringStreamer.start(this.handleChunk)}}],["string",e=>typeof e=="string",{setup(){this.stringStreamer=new M(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]]),i(W,"chunkSize",Oe);var y,te,Y=class{constructor(e){n(this,y,new Map);n(this,te,{delete:e=>s(this,y).delete(e)});e.isWebSocketServer?(e.on(`client-message:${l.confirm}`,(t,...r)=>this.handleConfirm(t,...r)),e.on(`client-message:${l.progress}`,(t,...r)=>this.handleProgress(t,...r)),e.on(`client-message:${l.completed}`,(t,...r)=>this.handleCompleted(t,...r)),e.on(`client-message:${l.error}`,(t,...r)=>this.handleError(t,...r)),Object.assign(e,{transfer:(t,r,a)=>this.transfer(t,r,a)})):(e.on(`message:${l.confirm}`,(...t)=>this.handleConfirm(e,...t)),e.on(`message:${l.progress}`,(...t)=>this.handleProgress(e,...t)),e.on(`message:${l.completed}`,(...t)=>this.handleCompleted(e,...t)),e.on(`message:${l.error}`,(...t)=>this.handleError(e,...t)),Object.assign(e,{transfer:(t,r)=>this.transfer(e,t,r)}))}transfer(e,t,r){let{Transfer:a}=this.constructor,f=new a(e,t,r,s(this,te));return s(this,y).set(f.id,f),f}async handleConfirm(e,t,r){await s(this,y).get(t)?.handleConfirm(r)}handleProgress(e,t,r){s(this,y).get(t)?.handleProgress(r)}async handleCompleted(e,t){await s(this,y).get(t)?.handleCompleted()}handleError(e,t,r){s(this,y).get(t)?.throw(r)}};y=new WeakMap,te=new WeakMap,i(Y,"Transfer",W);function ke(o){return new Promise(e=>{let t=new FileReader;t.onload=()=>e(typeof t?.result=="string"?t.result.slice(Math.max(0,t.result.indexOf(",")+1)):""),t.readAsDataURL(new Blob([o]))})}var H,w,Z,ce,ie,se=class{constructor(e,t={}){n(this,Z);i(this,"file");i(this,"size");i(this,"chunkSize");i(this,"fileReader");i(this,"listener");n(this,H,0);n(this,w,0);i(this,"isAborted",!1);n(this,ie,async()=>{if(!this.isAborted){let e=this.fileReader.result;e.length=e.byteLength,await this.listener(e),s(this,w)<this.size&&(h(this,H,s(this,w)),d(this,Z,ce).call(this))}});this.file=e,this.size=this.file.size;let{chunkSize:r=1024*256}=t;this.chunkSize=r,this.fileReader=new FileReader,this.fileReader.onload=s(this,ie)}start(e){this.listener=e,d(this,Z,ce).call(this)}abort(){this.isAborted=!0}};H=new WeakMap,w=new WeakMap,Z=new WeakSet,ce=function(){this.isAborted||(h(this,w,Math.min(s(this,H)+this.chunkSize,this.size)),this.fileReader.readAsArrayBuffer(this.file.slice(s(this,H),s(this,w))))},ie=new WeakMap;var re=class extends W{};i(re,"types",[["file",e=>typeof e=="object"&&e instanceof File,{setup(){let e=this.data;this.fileStreamer=new se(e,{chunkSize:this.chunkSize});let t={name:e.name,type:e.type,size:e.size,modifiedAt:e.lastModified};this.metadata?Object.assign(this.metadata,t):this.metadata=t,this.size=this.fileStreamer.size,this.encoding="buffer"},confirm(){this.fileStreamer.start(this.handleChunk)},transformChunk(e){return ke(e)}}],...W.types]);var pe=class extends Y{};i(pe,"Transfer",re);export{ee as IncomingTransfer,fe as IncomingTransport,re as OutgoingTransfer,pe as OutgoingTransport};
|
|
1
|
+
var Le=Object.defineProperty;var ke=n=>{throw TypeError(n)};var Be=(n,e,t)=>e in n?Le(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var i=(n,e,t)=>Be(n,typeof e!="symbol"?e+"":e,t),ye=(n,e,t)=>e.has(n)||ke("Cannot "+t);var s=(n,e,t)=>(ye(n,e,"read from private field"),t?t.call(n):e.get(n)),a=(n,e,t)=>e.has(n)?ke("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,t),f=(n,e,t,r)=>(ye(n,e,"write to private field"),r?r.call(n,t):e.set(n,t),t),u=(n,e,t)=>(ye(n,e,"access private method"),t);var l={request:"~t-request",confirm:"~t-confirm",chunk:"~t-c",progress:"~t-p",sent:"~t-sent",completed:"~t-completed",abort:"~t-abort",error:"~t-error"},ve=10*1024*1024*1024,Re=1024*256,ze=250;var k,v,R,ee,y,N,q,I,H,te,x,Ae,xe,We,z=class{constructor(e,t,r,{type:o,collect:h,encoding:c,size:d,metadata:p},B,F){a(this,x);i(this,"ws");a(this,k);i(this,"kind");i(this,"id");i(this,"type");i(this,"collect");i(this,"encoding");i(this,"size");i(this,"metadata");a(this,v);a(this,R);a(this,ee);i(this,"data");a(this,y);i(this,"isAborted",!1);i(this,"isAbortedBySender",!1);i(this,"isAbortedByReceiver",!1);i(this,"isTransfered",!1);i(this,"confirmResponse");i(this,"beginAt",null);a(this,N,null);a(this,q,[]);a(this,I,!1);i(this,"duration",null);i(this,"transferedSize",0);i(this,"processedSize",0);i(this,"bytesPerMs",null);i(this,"progress",0);i(this,"endAt",null);i(this,"error",null);a(this,H);a(this,te,0);this.ws=e,f(this,k,e.isWebSocket?[e]:[e.wss,e]),this.kind=t,this.id=r,this.type=o,this.collect=!!h,this.encoding=c,this.size=d,this.metadata=p,f(this,v,B),f(this,R,F),f(this,ee,u(this,x,Ae).call(this))}whenSetUp(){return s(this,ee)}async confirm(){for(let{begin:e}of s(this,R))if(await e?.call(...s(this,k),this)===!1)return this.throw("Transfer was rejected by receiver");this.beginAt=f(this,N,Date.now()),this.ws.sendMessage(l.confirm,this.id,this.confirmResponse),f(this,H,setInterval(()=>{s(this,te)!==this.progress&&(f(this,te,this.progress),this.ws.sendMessage(l.progress,this.id,this.progress))},ze))}async handleChunk(e,t=e.length){let r=Date.now();this.bytesPerMs=t/(r-s(this,N)),f(this,N,r),this.transferedSize+=t,s(this,q).push([e,t]),s(this,I)||(f(this,I,!0),await u(this,x,xe).call(this))}async handleSent(){this.isTransfered=!0,this.size||(this.size=this.transferedSize),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,s(this,I)||await u(this,x,We).call(this)}abort(e=!1){return this.isAborted=!0,this.isAbortedBySender=e,this.isAbortedByReceiver=!e,this.throw(`Transfer is aborted by ${e?"sender":"receiver"}`,!e)}throw(e,t=!0){s(this,v).delete(this.id),clearInterval(s(this,H)),this.error=new Error(e);for(let r of s(this,R))r.once&&s(this,v).removeListener(this.kind,r),r.error?.call(...s(this,k),this,this.error);t&&this.ws.sendMessage(l.error,this.id,e)}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isAbortedBySender:this.isAbortedBySender,isAbortedByReceiver:this.isAbortedByReceiver,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,processedSize:this.processedSize,bytesPerMs:this.bytesPerMs,progress:this.progress,endAt:this.endAt,error:this.error}}};k=new WeakMap,v=new WeakMap,R=new WeakMap,ee=new WeakMap,y=new WeakMap,N=new WeakMap,q=new WeakMap,I=new WeakMap,H=new WeakMap,te=new WeakMap,x=new WeakSet,Ae=async function(){if(f(this,y,this.constructor.types[this.type]),s(this,y))await s(this,y).setup.call(this);else throw new Error(`Unknown type of transfer "${String(this.type)}"`);await this.confirm()},xe=async function(){let[e,t]=s(this,q).shift();s(this,y).transformChunk&&(e=await s(this,y).transformChunk.call(this,e)),this.collect&&await s(this,y).collect.call(this,e);for(let{chunk:r,progress:o}of s(this,R))await(r??o)?.call(...s(this,k),this,e);this.processedSize+=t,this.size&&(this.progress=this.processedSize/this.size),s(this,q).length?u(this,x,xe).call(this):(f(this,I,!1),this.isTransfered&&u(this,x,We).call(this))},We=async function(){this.progress=1,await s(this,y).done?.call(this);for(let e of s(this,R))e.once&&s(this,v).removeListener(this.kind,e),await e.end?.call(...s(this,k),this);clearInterval(s(this,H)),s(this,v).delete(this.id),this.ws.sendMessage(l.completed,this.id)},i(z,"types",{object:{setup(){this.data=""},collect(e){this.data+=e},done(){this.data=JSON.parse(this.data)}},datauri:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&(this.data=`data:${this.metadata.type};base64,${this.data}`)}},string:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e}}});var W,b,ue,re=class{constructor(e,t={}){i(this,"sizeLimit");a(this,W,new Map);i(this,"on",this.addTransferListener);i(this,"off",this.removeTransferListener);a(this,b,new Map);a(this,ue,{delete:e=>s(this,b).delete(e),removeListener:(e,t)=>this.removeTransferListener(e,t)});let{sizeLimit:r=ve}=t;this.sizeLimit=r,e.isWebSocketServer?(e.on(`client-message:${l.request}`,(o,...h)=>this.handleRequest(o,...h)),e.on(`client-message:${l.chunk}`,(o,...h)=>this.handleChunk(o,...h)),e.on(`client-message:${l.sent}`,(o,...h)=>this.handleSent(o,...h)),e.on(`client-message:${l.abort}`,(o,...h)=>this.handleAbort(o,...h))):(e.on(`message:${l.request}`,(...o)=>this.handleRequest(e,...o)),e.on(`message:${l.chunk}`,(...o)=>this.handleChunk(e,...o)),e.on(`message:${l.sent}`,(...o)=>this.handleSent(e,...o)),e.on(`message:${l.abort}`,(...o)=>this.handleAbort(e,...o))),Object.assign(e,{onTransfer:(o,h,c)=>this.on(o,h,c),onceTransfer:(o,h,c)=>this.once(o,h,c)})}addTransferListener(e,t,r){return r?.once&&(t.once=!0),s(this,W).get(e)?.add(t)??s(this,W).set(e,new Set([t])),this}once(e,t,r){return this.addTransferListener(e,t,{...r,once:!0})}removeTransferListener(e,t){if(t){let r=s(this,W).get(e);r&&(r.delete(t),r.size||s(this,W).delete(e))}else s(this,W).delete(e);return this}handleRequest(e,t,r,{type:o,size:h,metadata:c,...d}){let{Transfer:p}=this.constructor;s(this,W).has(t)?s(this,b).has(r)?e.sendMessage(l.error,r,"Transfer already exists"):o in p.types?h>this.sizeLimit?e.sendMessage(l.error,r,`Transfer size (${h} bytes) exeeds limit of ${this.sizeLimit} bytes`):s(this,b).set(r,new p(e,t,r,{type:o,size:h,metadata:c,...d},s(this,ue),s(this,W).get(t))):e.sendMessage(l.error,r,"Unknown type of transfer"):e.sendMessage(l.error,r,`Unknown kind of file "${t}"`)}async handleChunk(e,t,r,o=r.length){await s(this,b).get(t)?.handleChunk(r,o)}async handleSent(e,t){await s(this,b).get(t)?.handleSent()}handleAbort(e,t){s(this,b).get(t)?.abort(!0)}};W=new WeakMap,b=new WeakMap,ue=new WeakMap,i(re,"Transfer",z);var de=class extends z{};i(de,"types",{file:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&this.encoding==="utf8"&&(this.data=atob(this.data))}},...z.types});var Te=class extends re{};i(Te,"Transfer",de);function A(){}var se=new WeakMap,_=class n extends Promise{constructor(t,r){let o,h;super((c,d)=>{o=c,h=d});i(this,"isPending",!0);i(this,"isFulfilled",!1);i(this,"isRejected",!1);i(this,"state","pending");i(this,"result");i(this,"resolve",t=>{if(this.isPending){this.isPending=!1,this.isFulfilled=!0,this.state="fulfilled",this.result=t;let r=se.get(this);r&&(r.resolve.call(this,t),se.delete(this))}});i(this,"reject",t=>{if(this.isPending){this.isPending=!1,this.isRejected=!0,this.state="rejected",this.result=t;let r=se.get(this);r&&(r.reject.call(this,t),se.delete(this))}});if(se.set(this,{resolve:o,reject:h}),r?.signal)if(r.signal.aborted)this.reject(new DOMException("Aborted","AbortError"));else{let c=()=>this.reject(new DOMException("Aborted","AbortError"));r.signal.addEventListener("abort",c),this.finally(()=>r.signal?.removeEventListener("abort",c))}if(typeof r?.timeout=="number"&&Number.isFinite(r.timeout)){let c=setTimeout(()=>this.reject(new DOMException("Timeout exceeded","TimeoutError")),r.timeout);this.finally(()=>clearTimeout(c))}t?.(this.resolve,this.reject)}static resolved(t){return new n(r=>r(t))}static rejected(t){return new n((r,o)=>o(t))}};function Fe(n,e=0,t={}){let{leading:r=!1,trailing:o=!0}=t,{maxWait:h=1/0}=t,c,d,p,B,F,$,m,E,Z=async()=>{let O=Date.now();O>=p?(c=void 0,p=void 0,clearTimeout(d),d=void 0,typeof m=="function"&&await m(),S.resolve(E),$=r):(clearTimeout(c),c=setTimeout(Z,p-O))},D=Number.isFinite(h)?()=>{m===g&&(m=!1),g(),d=setTimeout(D,h)}:null;async function g(){try{return E=await n.apply(B,F),E}catch(O){throw S.reject(O),O}}r&&typeof r=="boolean"&&(r=g),$=r,o&&typeof o=="boolean"&&(o=g),m=o;let S=Object.assign(function(...O){return F=O,B=this,p=Date.now()+e,m=o,S.promise.isPending||(S.promise=new _((Me,je)=>{S.resolve=Me,S.reject=je,typeof $=="function"&&($(),$=!1,m===g&&(m=!1)),c||(c=setTimeout(Z,e),D&&(d=setTimeout(D,h)))})),S.promise},{callback:n,promise:_.resolved(void 0),resolve:A,reject:A,run:g,clear:async O=>{clearTimeout(c),c=void 0,clearTimeout(d),d=void 0,S.resolve(O?await g():E)}});return S}Fe.noop=Object.assign(()=>{},{callback:A,promise:_.resolved(void 0),resolve:A,reject:A,run:A,clear:A});function Pe(n,e,t,r,o=!0){return Array.isArray(n)&&(n=n.length),typeof r!="string"&&(o=r??!0,r=t),(o?`${n}\xA0`:"")+Pe.raw(n,e,t,r)}Pe.raw=(n,e,t,r=t)=>{n=Math.abs(n);let o=n%10,h=n%100;return o===1&&h!==11?e:o>=2&&o<=4&&!(h>=12&&h<=15)?t:r};function $e(n="",e=""){return`${n}${Date.now().toString(36)}${Math.round(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}${e}`}var J,M,ie,Oe,U=class{constructor(e,t={}){a(this,ie);i(this,"string");i(this,"size");i(this,"chunkSize");i(this,"listener");a(this,J,0);a(this,M,0);i(this,"isAborted",!1);this.string=e,this.size=this.string.length;let{chunkSize:r=1024*256}=t;this.chunkSize=r}start(e){this.listener=e,u(this,ie,Oe).call(this)}abort(){this.isAborted=!0}};J=new WeakMap,M=new WeakMap,ie=new WeakSet,Oe=async function(){if(!this.isAborted){f(this,M,Math.min(s(this,J)+this.chunkSize,this.size));let e=await new Promise(t=>{t(this.string.slice(s(this,J),s(this,M)))});this.isAborted||(await this.listener(e),s(this,M)<this.size&&(f(this,J,s(this,M)),u(this,ie,Oe).call(this)))}};var T,V,ne,oe,K,ae,he,fe,P,Q,G,X,j,Ee,be,w=class{constructor(e,t,{data:r,type:o,incomingType:h,collect:c,metadata:d,size:p,chunkSize:B,encoding:F,incomingEncoding:$,onBegin:m,onSenderProgress:E,onProgress:Z,onEnd:D,onError:g},S){a(this,j);i(this,"ws");a(this,T);i(this,"kind");i(this,"data");i(this,"type");i(this,"collect");i(this,"metadata");i(this,"size");i(this,"encoding");i(this,"chunkSize");a(this,V);a(this,ne);a(this,oe);a(this,K);a(this,ae);a(this,he);a(this,fe);i(this,"id",$e());a(this,P);i(this,"isAborted",!1);i(this,"isTransfered",!1);i(this,"confirmResponse");i(this,"beginAt",null);a(this,Q,null);a(this,G,[]);a(this,X,!1);i(this,"duration",null);i(this,"transferedSize",0);i(this,"bytesPerMs",null);i(this,"senderProgress",0);i(this,"progress",0);i(this,"endAt",null);i(this,"error",null);i(this,"stringStreamer");i(this,"fileStreamer");i(this,"handleChunk",e=>{s(this,G).push(e),s(this,X)||(f(this,X,!0),u(this,j,be).call(this))});i(this,"sent",()=>this.ws.sendMessage(l.sent,this.id));this.ws=e,f(this,T,e.isWebSocket?[e]:[e.wss,e]),this.kind=t,this.data=r,this.type=o,this.collect=c??!1,this.metadata=d,this.size=p??null,this.encoding=F,this.chunkSize=B??this.constructor.chunkSize,f(this,V,S),m&&f(this,ne,m),E&&f(this,oe,E),Z&&f(this,K,Z),D&&f(this,ae,D),g&&f(this,he,g),f(this,fe,u(this,j,Ee).call(this,h,$))}whenSetUp(){return s(this,fe)}async handleConfirm(e){this.confirmResponse=e,this.beginAt=f(this,Q,Date.now()),await s(this,ne)?.call(...s(this,T),this),await s(this,P).confirm.call(this)}handleProgress(e){this.progress=e,s(this,K)?.call(...s(this,T),this)}async handleCompleted(){this.isTransfered=!0,this.size||(this.size=this.transferedSize,this.senderProgress=1),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,s(this,V).delete(this.id),this.progress!==1&&(this.progress=1,await s(this,K)?.call(...s(this,T),this)),s(this,ae)?.call(...s(this,T),this)}throw(e){s(this,V).delete(this.id),this.error=new Error(e),s(this,he)?.call(...s(this,T),this,this.error)}abort(){return this.isAborted=!0,this.ws.sendMessage(l.abort,this.id),this.throw("Transfer is aborted by sender")}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,bytesPerMs:this.bytesPerMs,senderProgress:this.senderProgress,progress:this.progress,endAt:this.endAt,error:this.error}}};T=new WeakMap,V=new WeakMap,ne=new WeakMap,oe=new WeakMap,K=new WeakMap,ae=new WeakMap,he=new WeakMap,fe=new WeakMap,P=new WeakMap,Q=new WeakMap,G=new WeakMap,X=new WeakMap,j=new WeakSet,Ee=async function(e,t){for(let[r,o,h]of this.constructor.types)if(this.type===r||o(this.data)){this.type=r,f(this,P,h);break}if(this.type)await s(this,P).setup.call(this),delete this.data;else throw new Error("Unknown type of transfer");this.ws.sendMessage(l.request,this.kind,this.id,{type:e??this.type,collect:this.collect,encoding:t??this.encoding,size:this.size,metadata:this.metadata})},be=async function(){let e=s(this,G).shift(),t=e.length;s(this,P).transformChunk&&(e=await s(this,P).transformChunk.call(this,e)),this.ws.sendMessage(l.chunk,this.id,e,t);let r=Date.now();this.bytesPerMs=t/(r-s(this,Q)),f(this,Q,r),this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size),await s(this,oe)?.call(...s(this,T),this),s(this,G).length?u(this,j,be).call(this):(f(this,X,!1),this.senderProgress===1&&this.sent())},i(w,"types",[["object",e=>typeof e=="object",{setup(){this.stringStreamer=new U(JSON.stringify(this.data),{chunkSize:this.chunkSize}),this.collect=!0,this.size=this.stringStreamer.size,this.encoding="utf8"},confirm(){this.stringStreamer.start(this.handleChunk)}}],["datauri",e=>typeof e=="string"&&/^data:[\w-.]+\/[\w-.+,]+(?:;base64)?,/.test(e),{setup(){let[e,t]=this.data.split(/^data:|;base64,|,/).slice(1);this.stringStreamer=new U(t,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding="base64",this.metadata={...this.metadata,type:e}},confirm(){this.stringStreamer.start(this.handleChunk)}}],["string",e=>typeof e=="string",{setup(){this.stringStreamer=new U(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]]),i(w,"chunkSize",Re);var C,pe,le=class{constructor(e){a(this,C,new Map);a(this,pe,{delete:e=>s(this,C).delete(e)});e.isWebSocketServer?(e.on(`client-message:${l.confirm}`,(t,...r)=>this.handleConfirm(t,...r)),e.on(`client-message:${l.progress}`,(t,...r)=>this.handleProgress(t,...r)),e.on(`client-message:${l.completed}`,(t,...r)=>this.handleCompleted(t,...r)),e.on(`client-message:${l.error}`,(t,...r)=>this.handleError(t,...r)),Object.assign(e,{transfer:(t,r,o)=>this.transfer(t,r,o)})):(e.on(`message:${l.confirm}`,(...t)=>this.handleConfirm(e,...t)),e.on(`message:${l.progress}`,(...t)=>this.handleProgress(e,...t)),e.on(`message:${l.completed}`,(...t)=>this.handleCompleted(e,...t)),e.on(`message:${l.error}`,(...t)=>this.handleError(e,...t)),Object.assign(e,{transfer:(t,r)=>this.transfer(e,t,r)}))}transfer(e,t,r){let{Transfer:o}=this.constructor,h=new o(e,t,r,s(this,pe));return s(this,C).set(h.id,h),h}async handleConfirm(e,t,r){await s(this,C).get(t)?.handleConfirm(r)}handleProgress(e,t,r){s(this,C).get(t)?.handleProgress(r)}async handleCompleted(e,t){await s(this,C).get(t)?.handleCompleted()}handleError(e,t,r){s(this,C).get(t)?.throw(r)}};C=new WeakMap,pe=new WeakMap,i(le,"Transfer",w);function Ie(n){return new Promise(e=>{let t=new FileReader;t.onload=()=>e(typeof t?.result=="string"?t.result.slice(Math.max(0,t.result.indexOf(",")+1)):""),t.readAsDataURL(new Blob([n]))})}var Y,L,ce,we,Se,me=class{constructor(e,t={}){a(this,ce);i(this,"file");i(this,"size");i(this,"chunkSize");i(this,"fileReader");i(this,"listener");a(this,Y,0);a(this,L,0);i(this,"isAborted",!1);a(this,Se,async()=>{if(!this.isAborted){let e=this.fileReader.result;e.length=e.byteLength,await this.listener(e),s(this,L)<this.size&&(f(this,Y,s(this,L)),u(this,ce,we).call(this))}});this.file=e,this.size=this.file.size;let{chunkSize:r=1024*256}=t;this.chunkSize=r,this.fileReader=new FileReader,this.fileReader.onload=s(this,Se)}start(e){this.listener=e,u(this,ce,we).call(this)}abort(){this.isAborted=!0}};Y=new WeakMap,L=new WeakMap,ce=new WeakSet,we=function(){this.isAborted||(f(this,L,Math.min(s(this,Y)+this.chunkSize,this.size)),this.fileReader.readAsArrayBuffer(this.file.slice(s(this,Y),s(this,L))))},Se=new WeakMap;var ge=class extends w{};i(ge,"types",[["file",e=>typeof e=="object"&&e instanceof File,{setup(){let e=this.data;this.fileStreamer=new me(e,{chunkSize:this.chunkSize});let t={name:e.name,type:e.type,size:e.size,modifiedAt:e.lastModified};this.metadata?Object.assign(this.metadata,t):this.metadata=t,this.size=this.fileStreamer.size,this.encoding="buffer"},confirm(){this.fileStreamer.start(this.handleChunk)},transformChunk(e){return Ie(e)}}],...w.types]);var Ce=class extends le{};i(Ce,"Transfer",ge);export{de as IncomingTransfer,Te as IncomingTransport,ge as OutgoingTransfer,Ce as OutgoingTransport};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/common.ts", "../../src/IncomingTransfer.ts", "../../src/IncomingTransport.ts", "../../src/browser/incoming.ts", "
|
|
4
|
-
"sourcesContent": ["export const headers = {\n\trequest: \"~t-request\",\n\tconfirm: \"~t-confirm\",\n\tchunk: \"~t-c\",\n\tprogress: \"~t-p\",\n\tsent: \"~t-sent\",\n\tcompleted: \"~t-completed\",\n\tabort: \"~t-abort\",\n\terror: \"~t-error\"\n};\n\nexport const sizeLimit = 10 * 1024 * 1024 * 1024;\n\nexport const chunkSize = 1024 * 256;\n\nexport const progressInterval = 250;\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServerClient } from \"insite-ws/server\";\nimport { headers, progressInterval } from \"./common\";\nimport type {\n\tIncomingChunk,\n\tIncomingData,\n\tIncomingTransferHandles,\n\tIncomingTransferListener,\n\tIncomingTransferMethods,\n\tIncomingTransferProps,\n\tIncomingTransferTypes,\n\tTransferTypes\n} from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nexport class IncomingTransfer<WSORWSSC extends WS | WSServerClient> {\n\tconstructor(\n\t\tws: WSORWSSC,\n\t\tkind: string,\n\t\tid: string,\n\t\t{\n\t\t\ttype,\n\t\t\tcollect,\n\t\t\tencoding,\n\t\t\tsize,\n\t\t\tmetadata\n\t\t}: IncomingTransferProps<TransferTypes>,\n\t\thandles: IncomingTransferHandles,\n\t\tlisteners: Set<IncomingTransferListener<WSORWSSC, any>>\n\t) {\n\t\t\n\t\tthis.ws = ws;\n\t\tthis.#callArgs = ws.isWebSocket ? [ ws ] as const : [ ws.wss, ws ] as const;\n\t\tthis.kind = kind;\n\t\tthis.id = id;\n\t\tthis.type = type;\n\t\tthis.collect = !!collect;\n\t\tthis.encoding = encoding;\n\t\tthis.size = size;\n\t\tthis.metadata = metadata;\n\t\t\n\t\tthis.#handles = handles;\n\t\tthis.#listeners = listeners;\n\t\t\n\t\tthis.#setupPromise = this.#setup();\n\t\t\n\t}\n\t\n\tws;\n\t#callArgs;\n\tkind;\n\tid;\n\ttype;\n\tcollect;\n\tencoding;\n\tsize;\n\tmetadata;\n\t\n\t#handles;\n\t#listeners;\n\t\n\t#setupPromise;\n\t\n\tdata?: IncomingData;\n\t#methods?: IncomingTransferMethods<IncomingTransfer<WSORWSSC>>;\n\tisAborted = false;\n\tisAbortedBySender = false;\n\tisAbortedByReceiver = false;\n\tisTransfered = false;\n\tconfirmResponse?: string;\n\tbeginAt: number | null = null;\n\t#prevChunkAt: number | null = null;\n\t#chunksQueue: [ chunk: IncomingChunk, length: number ][] = [];\n\t#isProcessing = false;\n\tduration: number | null = null;\n\ttransferedSize = 0;\n\tprocessedSize = 0;\n\tbytesPerMs: number | null = null;\n\tprogress = 0;\n\tendAt: number | null = null;\n\terror: Error | null = null;\n\t\n\t[key: number | string | symbol]: unknown;\n\t\n\t#progressInterval?: ReturnType<typeof setTimeout>;\n\t#lastProgress = 0;\n\t\n\tasync #setup() {\n\t\t\n\t\tthis.#methods = (this.constructor as typeof IncomingTransfer<WSORWSSC>).types[this.type];\n\t\t\n\t\tif (this.#methods)\n\t\t\tawait this.#methods.setup.call(this);\n\t\telse\n\t\t\tthrow new Error(`Unknown type of transfer \"${String(this.type)}\"`);\n\t\t\n\t\tawait this.confirm();\n\t\t\n\t}\n\t\n\twhenSetUp() {\n\t\treturn this.#setupPromise;\n\t}\n\t\n\tasync confirm() {\n\t\t\n\t\tfor (const { begin } of this.#listeners)\n\t\t\tif (await (begin as any)?.call(...this.#callArgs, this) === false)\n\t\t\t\treturn this.throw(\"Transfer was rejected by receiver\");\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tthis.ws.sendMessage(headers.confirm, this.id, this.confirmResponse);\n\t\t\n\t\tthis.#progressInterval = setInterval(() => {\n\t\t\t\n\t\t\tif (this.#lastProgress !== this.progress) {\n\t\t\t\tthis.#lastProgress = this.progress;\n\t\t\t\tthis.ws.sendMessage(headers.progress, this.id, this.progress);\n\t\t\t}\n\t\t\t\n\t\t}, progressInterval);\n\t\t\n\t}\n\t\n\tasync handleChunk(chunk: IncomingChunk, length = chunk.length) {\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = length / (ts - this.#prevChunkAt!);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += length;\n\t\t\n\t\tthis.#chunksQueue.push([ chunk, length ]);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tawait this.#process();\n\t\t}\n\t\t\n\t}\n\t\n\tasync #process() {\n\t\t\n\t\tlet [ chunk, length ] = this.#chunksQueue.shift()!;\n\t\t\n\t\tif (this.#methods!.transformChunk)\n\t\t\tchunk = await this.#methods!.transformChunk.call(this, chunk);\n\t\t\n\t\tif (this.collect)\n\t\t\tawait this.#methods!.collect.call(this, chunk);\n\t\t\n\t\tfor (const { chunk: chunkListener, progress: progressListener } of this.#listeners)\n\t\t\tawait ((chunkListener ?? progressListener) as any)?.call(...this.#callArgs, this, chunk);\n\t\t\n\t\tthis.processedSize += length;\n\t\tif (this.size)\n\t\t\tthis.progress = this.processedSize / this.size;\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tvoid this.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.isTransfered)\n\t\t\t\tvoid this.#complete();\n\t\t}\n\t\t\n\t}\n\t\n\tasync handleSent() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size)\n\t\t\tthis.size = this.transferedSize;\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt!;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tif (!this.#isProcessing)\n\t\t\tawait this.#complete();\n\t\t\n\t}\n\t\n\tasync #complete() {\n\t\t\n\t\tthis.progress = 1;\n\t\t\n\t\tawait this.#methods!.done?.call(this);\n\t\t\n\t\tfor (const listener of this.#listeners) {\n\t\t\tif (listener.once)\n\t\t\t\tthis.#handles.removeListener(this.kind, listener);\n\t\t\t\n\t\t\tawait (listener.end as any)?.call(...this.#callArgs, this);\n\t\t}\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.#handles.delete(this.id);\n\t\t\n\t\tthis.ws.sendMessage(headers.completed, this.id);\n\t\t\n\t}\n\t\n\tabort(bySender = false) {\n\t\t\n\t\tthis.isAborted = true;\n\t\tthis.isAbortedBySender = bySender;\n\t\tthis.isAbortedByReceiver = !bySender;\n\t\t\n\t\treturn this.throw(`Transfer is aborted by ${bySender ? \"sender\" : \"receiver\"}`, !bySender);\n\t}\n\t\n\tthrow(errorMessage: string, sendToSender = true) {\n\t\t\n\t\tthis.#handles.delete(this.id);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tfor (const listener of this.#listeners) {\n\t\t\tif (listener.once)\n\t\t\t\tthis.#handles.removeListener(this.kind, listener);\n\t\t\t\n\t\t\t(listener.error as any)?.call(...this.#callArgs, this, this.error);\n\t\t}\n\t\t\n\t\tif (sendToSender)\n\t\t\tthis.ws.sendMessage(headers.error, this.id, errorMessage);\n\t\t\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisAbortedBySender: this.isAbortedBySender,\n\t\t\tisAbortedByReceiver: this.isAbortedByReceiver,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tprocessedSize: this.processedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic types: IncomingTransferTypes<IncomingTransfer<WS | WSServerClient>, TransferTypes> = {\n\t\t\n\t\tobject: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;// eslint-disable-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\tthis.data = JSON.parse(this.data as string);\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tdatauri: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;// eslint-disable-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = `data:${this.metadata.type as string};base64,${this.data as string}`;\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tstring: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;// eslint-disable-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n}\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServer, WSServerClient } from \"insite-ws/server\";\nimport { headers, sizeLimit as defaultSizeLimit } from \"./common\";\nimport { IncomingTransfer } from \"./IncomingTransfer\";\nimport type {\n\tIncomingChunk,\n\tIncomingTransferHandles,\n\tIncomingTransferListener,\n\tIncomingTransferListenerOptions,\n\tIncomingTransferProps,\n\tIncomingTransportOptions,\n\tParametersWithoutFirst,\n\tTransferTypes\n} from \"./types\";\n\n\nexport class IncomingTransport<\n\tWSORWSSC extends WS | WSServerClient,\n\tT extends IncomingTransfer<WSORWSSC>,\n\tTypes extends TransferTypes = TransferTypes\n> {\n\tconstructor(ws: WS | WSServer<Exclude<WSORWSSC, WS>>, options: IncomingTransportOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tsizeLimit = defaultSizeLimit\n\t\t} = options;\n\t\t\n\t\tthis.sizeLimit = sizeLimit;\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(`client-message:${headers.request}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleRequest>) => this.handleRequest(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.chunk}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleChunk>) => this.handleChunk(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.sent}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleSent>) => this.handleSent(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.abort}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleAbort>) => this.handleAbort(wssc, ...args));\n\t\t} else {\n\t\t\tws.on(`message:${headers.request}`, (...args: ParametersWithoutFirst<typeof this.handleRequest>) => this.handleRequest(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.chunk}`, (...args: ParametersWithoutFirst<typeof this.handleChunk>) => this.handleChunk(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.sent}`, (...args: ParametersWithoutFirst<typeof this.handleSent>) => this.handleSent(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.abort}`, (...args: ParametersWithoutFirst<typeof this.handleAbort>) => this.handleAbort(ws as WSORWSSC, ...args));\n\t\t}\n\t\t\n\t\tObject.assign(ws, {\n\t\t\tonTransfer: (kind: string, listener: IncomingTransferListener<WSORWSSC, T>, listenerOptions?: IncomingTransferListenerOptions) => this.on(kind, listener, listenerOptions),\n\t\t\tonceTransfer: (kind: string, listener: IncomingTransferListener<WSORWSSC, T>, listenerOptions?: Omit<IncomingTransferListenerOptions, \"once\">) => this.once(kind, listener, listenerOptions)\n\t\t});\n\t\t\n\t}\n\t\n\tsizeLimit;\n\t\n\t#listeners = new Map<string, Set<IncomingTransferListener<WSORWSSC, T>>>();\n\t\n\taddTransferListener(kind: string, listener: IncomingTransferListener<WSORWSSC, T>, options?: IncomingTransferListenerOptions) {\n\t\tif (options?.once)\n\t\t\tlistener.once = true;\n\t\t\n\t\tthis.#listeners.get(kind)?.add(listener) ??\n\t\tthis.#listeners.set(kind, new Set([ listener ]));\n\t\t\n\t\treturn this;\n\t}\n\t\n\ton = this.addTransferListener;\n\t\n\tonce(kind: string, listener: IncomingTransferListener<WSORWSSC, T>, options?: Omit<IncomingTransferListenerOptions, \"once\">) {\n\t\treturn this.addTransferListener(kind, listener, { ...options, once: true });\n\t}\n\t\n\tremoveTransferListener(kind: string, listener?: IncomingTransferListener<WSORWSSC, T>) {\n\t\tif (listener) {\n\t\t\tconst listeners = this.#listeners.get(kind);\n\t\t\t\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t\t\n\t\t\t\tif (!listeners.size)\n\t\t\t\t\tthis.#listeners.delete(kind);\n\t\t\t}\n\t\t} else\n\t\t\tthis.#listeners.delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toff = this.removeTransferListener;\n\t\n\t#transfers = new Map<string, T>();\n\t\n\t#transferHandles: IncomingTransferHandles = {\n\t\t\n\t\tdelete: (id: string) => this.#transfers.delete(id),\n\t\t\n\t\tremoveListener: (kind: string, listener: IncomingTransferListener<WSORWSSC, T>) => this.removeTransferListener(kind, listener)\n\t\t\n\t};\n\t\n\tprivate handleRequest(\n\t\tws: WSORWSSC,\n\t\tkind: string,\n\t\tid: string,\n\t\t{ type, size, metadata, ...restProps }: IncomingTransferProps<Types>\n\t) {\n\t\t\n\t\tconst { Transfer } = this.constructor as typeof IncomingTransport;// eslint-disable-line @typescript-eslint/naming-convention\n\t\t\n\t\tif (!this.#listeners.has(kind))\n\t\t\tws.sendMessage(headers.error, id, `Unknown kind of file \"${kind}\"`);\n\t\telse if (this.#transfers.has(id))\n\t\t\tws.sendMessage(headers.error, id, \"Transfer already exists\");\n\t\telse if (!(type in Transfer.types))\n\t\t\tws.sendMessage(headers.error, id, \"Unknown type of transfer\");\n\t\telse if (size > this.sizeLimit)\n\t\t\tws.sendMessage(headers.error, id, `Transfer size (${size} bytes) exeeds limit of ${this.sizeLimit} bytes`);\n\t\telse\n\t\t\tthis.#transfers.set(id, new Transfer(\n\t\t\t\tws,\n\t\t\t\tkind,\n\t\t\t\tid,\n\t\t\t\t{\n\t\t\t\t\ttype: type as Exclude<TransferTypes, string>,\n\t\t\t\t\tsize,\n\t\t\t\t\tmetadata,\n\t\t\t\t\t...restProps\n\t\t\t\t},\n\t\t\t\tthis.#transferHandles,\n\t\t\t\tthis.#listeners.get(kind)!\n\t\t\t) as T);\n\t\t\n\t}\n\t\n\tprivate async handleChunk(ws: WSORWSSC, id: string, chunk: IncomingChunk, length = chunk.length) {\n\t\tawait this.#transfers.get(id)?.handleChunk(chunk, length);\n\t\t\n\t}\n\t\n\tprivate async handleSent(ws: WSORWSSC, id: string) {\n\t\tawait this.#transfers.get(id)?.handleSent();\n\t\t\n\t}\n\t\n\tprivate handleAbort(ws: WSORWSSC, id: string) {\n\t\tthis.#transfers.get(id)?.abort(true);\n\t\t\n\t}\n\t\n\t\n\tstatic Transfer = IncomingTransfer;\n\t\n}\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServerClient } from \"insite-ws/server\";\nimport { IncomingTransfer } from \"../IncomingTransfer\";\nimport { IncomingTransport } from \"../IncomingTransport\";\nimport type { IncomingTransferTypes } from \"../types\";\nimport type { BrowserTransferTypes } from \"./types\";\n\n\nexport type { IncomingTransportOptions } from \"../types\";\n\n\nclass BrowserIncomingTransfer<\n\tWSORWSSC extends WS | WSServerClient = WS\n> extends IncomingTransfer<WSORWSSC> {\n\t\n\tstatic types: IncomingTransferTypes<BrowserIncomingTransfer<WS>, BrowserTransferTypes> = {\n\t\t\n\t\tfile: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;// eslint-disable-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\t\n\t\t\t\tif (this.collect && this.encoding === \"utf8\")\n\t\t\t\t\tthis.data = atob(this.data as string);\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\t...IncomingTransfer.types\n\t\t\n\t};\n\t\n}\n\nclass BrowserIncomingTransport<\n\tWSORWSSC extends WS = WS\n> extends IncomingTransport<WSORWSSC, BrowserIncomingTransfer<WSORWSSC>, BrowserTransferTypes> {\n\t\n\tstatic Transfer = BrowserIncomingTransfer;\n\t\n}\n\n\nexport {\n\tBrowserIncomingTransfer as IncomingTransfer,\n\tBrowserIncomingTransport as IncomingTransport\n};\n", "import { uid } from \"@nesvet/n\";\nimport type { WS } from \"insite-ws/client\";\nimport type { WSServerClient } from \"insite-ws/server\";\nimport { chunkSize as defaultChunkSize, headers } from \"./common\";\nimport { StringStreamer } from \"./StringStreamer\";\nimport type { FileStreamer } from \"./browser/FileStreamer\";\nimport type {\n\tOutgoingChunk,\n\tOutgoingTransferHandles,\n\tOutgoingTransferMethods,\n\tOutgoingTransferProps,\n\tOutgoingTransferTypes,\n\tTransferTypes\n} from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\n// FIXME\n\n\nexport class OutgoingTransfer<WSORWSSC extends WS | WSServerClient> {\n\tconstructor(\n\t\tws: WSORWSSC,\n\t\tkind: string,\n\t\t{\n\t\t\tdata,\n\t\t\ttype,\n\t\t\tincomingType,\n\t\t\tcollect,\n\t\t\tmetadata,\n\t\t\tsize,\n\t\t\tchunkSize,\n\t\t\tencoding,\n\t\t\tincomingEncoding,\n\t\t\tonBegin,\n\t\t\tonSenderProgress,\n\t\t\tonProgress,\n\t\t\tonEnd,\n\t\t\tonError\n\t\t}: OutgoingTransferProps<WSORWSSC, any, any>,\n\t\thandles: OutgoingTransferHandles\n\t) {\n\t\t\n\t\tthis.ws = ws;\n\t\tthis.#callArgs = ws.isWebSocket ? [ ws ] as const : [ ws.wss, ws ] as const;\n\t\tthis.kind = kind;\n\t\tthis.data = data;\n\t\tthis.type = type;\n\t\tthis.collect = collect ?? false;\n\t\tthis.metadata = metadata;\n\t\tthis.size = size ?? null;\n\t\tthis.encoding = encoding;\n\t\tthis.chunkSize = chunkSize ?? (this.constructor as typeof OutgoingTransfer).chunkSize;\n\t\t\n\t\tthis.#handles = handles;\n\t\t\n\t\tif (onBegin)\n\t\t\tthis.#onBegin = onBegin;\n\t\tif (onSenderProgress)\n\t\t\tthis.#onSenderProgress = onSenderProgress;\n\t\tif (onProgress)\n\t\t\tthis.#onProgress = onProgress;\n\t\tif (onEnd)\n\t\t\tthis.#onEnd = onEnd;\n\t\tif (onError)\n\t\t\tthis.#onError = onError;\n\t\t\n\t\tthis.#setupPromise = this.#setup(incomingType, incomingEncoding);\n\t\t\n\t}\n\t\n\tws;\n\t#callArgs;\n\tkind;\n\tdata?;\n\ttype?: string;\n\tcollect;\n\tmetadata;\n\tsize;\n\tencoding;\n\tchunkSize;\n\t\n\t#handles;\n\t\n\t#onBegin?;\n\t#onSenderProgress?;\n\t#onProgress?;\n\t#onEnd?;\n\t#onError?;\n\t\n\t#setupPromise;\n\t\n\tid = uid();\n\t#methods?: OutgoingTransferMethods<OutgoingTransfer<WSORWSSC>>;\n\tisAborted = false;\n\tisTransfered = false;\n\tconfirmResponse?: string;\n\tbeginAt: number | null = null;\n\t#prevChunkAt: number | null = null;\n\t#chunksQueue: OutgoingChunk[] = [];\n\t#isProcessing = false;\n\tduration: number | null = null;\n\ttransferedSize = 0;\n\tbytesPerMs: number | null = null;\n\tsenderProgress = 0;\n\tprogress: number = 0;\n\tendAt: number | null = null;\n\terror: Error | null = null;\n\tstringStreamer?: StringStreamer;\n\tfileStreamer?: FileStreamer;\n\t\n\t[key: number | string | symbol]: unknown;\n\t\n\tasync #setup(incomingType?: string, incomingEncoding?: string) {\n\t\t\n\t\tfor (const [ availableType, test, methods ] of (this.constructor as typeof OutgoingTransfer).types)\n\t\t\tif (this.type === availableType || test(this.data as string)) {\n\t\t\t\tthis.type = availableType;\n\t\t\t\tthis.#methods = methods;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\tif (this.type) {\n\t\t\tawait this.#methods!.setup.call(this);\n\t\t\tdelete this.data;\n\t\t} else\n\t\t\tthrow new Error(\"Unknown type of transfer\");\n\t\t\n\t\tthis.ws.sendMessage(headers.request, this.kind, this.id, {\n\t\t\ttype: incomingType ?? this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: incomingEncoding ?? this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata\n\t\t});\n\t\t\n\t}\n\t\n\twhenSetUp() {\n\t\treturn this.#setupPromise;\n\t}\n\t\n\tasync handleConfirm(confirmResponse: string) {\n\t\tthis.confirmResponse = confirmResponse;\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tawait (this.#onBegin as any)?.call(...this.#callArgs, this);\n\t\t\n\t\tawait this.#methods!.confirm.call(this);\n\t\t\n\t}\n\t\n\thandleChunk = (chunk: OutgoingChunk) => {\n\t\tthis.#chunksQueue.push(chunk);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tvoid this.#process();\n\t\t}\n\t\t\n\t};\n\t\n\tasync #process() {\n\t\t\n\t\tlet chunk = this.#chunksQueue.shift()!;\n\t\t\n\t\tconst chunkLength = chunk.length!;\n\t\t\n\t\tif (this.#methods!.transformChunk)\n\t\t\tchunk = await this.#methods!.transformChunk.call(this, chunk);\n\t\t\n\t\tthis.ws.sendMessage(headers.chunk, this.id, chunk, chunkLength);\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = chunkLength / (ts - this.#prevChunkAt!);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += chunkLength;\n\t\t\n\t\tif (this.size)\n\t\t\tthis.senderProgress = this.transferedSize / this.size;\n\t\t\n\t\tawait (this.#onSenderProgress as any)?.call(...this.#callArgs, this);\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tvoid this.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.senderProgress === 1)\n\t\t\t\tthis.sent();\n\t\t}\n\t\t\n\t}\n\t\n\tsent = () => this.ws.sendMessage(headers.sent, this.id);\n\t\n\thandleProgress(progress: number) {\n\t\tthis.progress = progress;\n\t\t\n\t\t(this.#onProgress as any)?.call(...this.#callArgs, this);\n\t\t\n\t}\n\t\n\tasync handleCompleted() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size) {\n\t\t\tthis.size = this.transferedSize;\n\t\t\tthis.senderProgress = 1;\n\t\t}\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt!;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tthis.#handles.delete(this.id);\n\t\t\n\t\tif (this.progress !== 1) {\n\t\t\tthis.progress = 1;\n\t\t\tawait (this.#onProgress as any)?.call(...this.#callArgs, this);\n\t\t}\n\t\t\n\t\t(this.#onEnd as any)?.call(...this.#callArgs, this);\n\t\t\n\t}\n\t\n\tthrow(errorMessage: string) {\n\t\t\n\t\tthis.#handles.delete(this.id);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\t(this.#onError as any)?.call(...this.#callArgs, this, this.error);\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t\tthis.ws.sendMessage(headers.abort, this.id);\n\t\t\n\t\treturn this.throw(\"Transfer is aborted by sender\");\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tsenderProgress: this.senderProgress,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic types: OutgoingTransferTypes<OutgoingTransfer<WS | WSServerClient>, TransferTypes> = [\n\t\t\n\t\t[ \"object\", data => typeof data == \"object\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(JSON.stringify(this.data), { chunkSize: this.chunkSize });\n\t\t\t\tthis.collect = true;\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"datauri\", data => typeof data == \"string\" && /^data:[\\w-.]+\\/[\\w-.+,]+(?:;base64)?,/.test(data), {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst [ type, data ] = (this.data as string).split(/^data:|;base64,|,/).slice(1);\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(data, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"base64\";\n\t\t\t\tthis.metadata = { ...this.metadata, type };\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"string\", data => typeof data == \"string\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(this.data as string, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tif (!this.encoding)\n\t\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ]\n\t\t\n\t];\n\t\n\tstatic chunkSize = defaultChunkSize;\n\t\n}\n", "import type { StreamerOptions } from \"./types\";\n\n\ntype Listener = {\n\t(chunk: string): Promise<void> | void;\n};\n\n\nexport class StringStreamer {\n\tconstructor(string: string, options: StreamerOptions = {}) {\n\t\tthis.string = string;\n\t\tthis.size = this.string.length;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t}\n\t\n\tstring;\n\tsize;\n\tchunkSize;\n\tlistener?: Listener;\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener: Listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tvoid this.#next();\n\t\t\n\t}\n\t\n\tasync #next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\tconst chunk = await new Promise<string>(resolve => { resolve(this.string.slice(this.#start, this.#end)); });\n\t\t\t\n\t\t\tif (!this.isAborted) {\n\t\t\t\tawait this.listener!(chunk);\n\t\t\t\t\n\t\t\t\tif (this.#end < this.size) {\n\t\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\t\n\t\t\t\t\tvoid this.#next();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServer, WSServerClient } from \"insite-ws/server\";\nimport { headers } from \"./common\";\nimport { OutgoingTransfer } from \"./OutgoingTransfer\";\nimport type {\n\tOutgoingTransferHandles,\n\tOutgoingTransferProps,\n\tParametersWithoutFirst,\n\tTransferTypes\n} from \"./types\";\n\n\nexport class OutgoingTransport<\n\tWSORWSSC extends WS | WSServerClient,\n\tT extends OutgoingTransfer<WSORWSSC>,\n\tTypes extends TransferTypes = TransferTypes\n> {\n\tconstructor(ws: WS | WSServer<Exclude<WSORWSSC, WS>>) {\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(`client-message:${headers.confirm}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleConfirm>) => this.handleConfirm(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.progress}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleProgress>) => this.handleProgress(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.completed}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleCompleted>) => this.handleCompleted(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.error}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleError>) => this.handleError(wssc, ...args));\n\t\t\t\n\t\t\tObject.assign(ws, {\n\t\t\t\ttransfer: (wssc: Exclude<WSORWSSC, WS>, kind: string, props: OutgoingTransferProps<WSORWSSC, T, Types>) =>\n\t\t\t\t\tthis.transfer(wssc, kind, props)\n\t\t\t});\n\t\t} else {\n\t\t\tws.on(`message:${headers.confirm}`, (...args: ParametersWithoutFirst<typeof this.handleConfirm>) => this.handleConfirm(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.progress}`, (...args: ParametersWithoutFirst<typeof this.handleProgress>) => this.handleProgress(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.completed}`, (...args: ParametersWithoutFirst<typeof this.handleCompleted>) => this.handleCompleted(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.error}`, (...args: ParametersWithoutFirst<typeof this.handleError>) => this.handleError(ws as WSORWSSC, ...args));\n\t\t\t\n\t\t\tObject.assign(ws, {\n\t\t\t\ttransfer: (kind: string, props: OutgoingTransferProps<WSORWSSC, T, Types>) =>\n\t\t\t\t\tthis.transfer(ws as WSORWSSC, kind, props)\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\t\n\t#transfers = new Map<string, T>();\n\t\n\t#transferHandles: OutgoingTransferHandles = {\n\t\tdelete: (id: string) => this.#transfers.delete(id)\n\t};\n\t\n\ttransfer(ws: WSORWSSC, kind: string, props: OutgoingTransferProps<WSORWSSC, T, Types>) {\n\t\t\n\t\tconst { Transfer } = this.constructor as typeof OutgoingTransport;// eslint-disable-line @typescript-eslint/naming-convention\n\t\t\n\t\tconst transfer = new Transfer(ws, kind, props, this.#transferHandles);\n\t\t\n\t\tthis.#transfers.set(transfer.id, transfer as T);\n\t\t\n\t\treturn transfer;\n\t}\n\t\n\tprivate async handleConfirm(ws: WSORWSSC, id: string, confirmResponse: string) {\n\t\tawait this.#transfers.get(id)?.handleConfirm(confirmResponse);\n\t\t\n\t}\n\t\n\tprivate handleProgress(ws: WSORWSSC, id: string, progress: number) {\n\t\tthis.#transfers.get(id)?.handleProgress(progress);\n\t\t\n\t}\n\t\n\tprivate async handleCompleted(ws: WSORWSSC, id: string) {\n\t\tawait this.#transfers.get(id)?.handleCompleted();\n\t\t\n\t}\n\t\n\tprivate handleError(ws: WSORWSSC, id: string, errorMessage: string) {\n\t\tthis.#transfers.get(id)?.throw(errorMessage);\n\t\t\n\t}\n\t\n\t\n\tstatic Transfer = OutgoingTransfer;\n\t\n}\n", "export function arrayBufferToBase64(arrayBuffer: ArrayBuffer): Promise<string> {\n\treturn new Promise(resolve => {\n\t\t\n\t\tconst fileReader = new FileReader();\n\t\t\n\t\t// eslint-disable-next-line unicorn/prefer-add-event-listener\n\t\tfileReader.onload = () =>\n\t\t\tresolve(typeof fileReader?.result == \"string\" ? fileReader.result.slice(Math.max(0, fileReader.result.indexOf(\",\") + 1)) : \"\");\n\t\t\n\t\tfileReader.readAsDataURL(new Blob([ arrayBuffer ]));\n\t\t\n\t});\n}\n", "import type { ArrayBufferWithLength, StreamerOptions } from \"../types\";\n\n\ntype Listener = {\n\t(arrayBuffer: ArrayBufferWithLength): Promise<void> | void;\n};\n\n\nexport class FileStreamer {\n\tconstructor(file: File, options: StreamerOptions = {}) {\n\t\tthis.file = file;\n\t\tthis.size = this.file.size;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t\tthis.fileReader = new FileReader();\n\t\t\n\t\t// eslint-disable-next-line unicorn/prefer-add-event-listener\n\t\tthis.fileReader.onload = this.#handleFileReaderLoad;\n\t\t\n\t}\n\t\n\tfile;\n\tsize;\n\tchunkSize;\n\tfileReader;\n\tlistener?: Listener;\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener: Listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tthis.#next();\n\t\t\n\t}\n\t\n\t#next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\t// eslint-disable-next-line unicorn/prefer-blob-reading-methods\n\t\t\tthis.fileReader.readAsArrayBuffer(this.file.slice(this.#start, this.#end));\n\t\t}\n\t\t\n\t}\n\t\n\t#handleFileReaderLoad = async () => {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tconst arrayBuffer = this.fileReader.result as ArrayBufferWithLength;\n\t\t\tarrayBuffer.length = arrayBuffer.byteLength;\n\t\t\t\n\t\t\tawait this.listener!(arrayBuffer);\n\t\t\t\n\t\t\tif (this.#end < this.size) {\n\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\n\t\t\t\tthis.#next();\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServerClient } from \"insite-ws/server\";\nimport { OutgoingTransfer } from \"../OutgoingTransfer\";\nimport { OutgoingTransport } from \"../OutgoingTransport\";\nimport type { OutgoingTransferTypes } from \"../types\";\nimport { arrayBufferToBase64 } from \"./arrayBufferToBase64\";\nimport { FileStreamer } from \"./FileStreamer\";\nimport type { BrowserTransferTypes } from \"./types\";\n\n\nclass BrowserOutgoingTransfer<\n\tWSORWSSC extends WS | WSServerClient = WS\n> extends OutgoingTransfer<WSORWSSC> {\n\t\n\tstatic types: OutgoingTransferTypes<BrowserOutgoingTransfer<WS>, BrowserTransferTypes> = [\n\t\t\n\t\t[ \"file\", data => typeof data == \"object\" && data instanceof File, {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst file = this.data as File;\n\t\t\t\t\n\t\t\t\tthis.fileStreamer = new FileStreamer(file, { chunkSize: this.chunkSize });\n\t\t\t\t\n\t\t\t\tconst metadata = {\n\t\t\t\t\tname: file.name,\n\t\t\t\t\ttype: file.type,\n\t\t\t\t\tsize: file.size,\n\t\t\t\t\tmodifiedAt: file.lastModified\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tif (this.metadata)\n\t\t\t\t\tObject.assign(this.metadata, metadata);\n\t\t\t\telse\n\t\t\t\t\tthis.metadata = metadata;\n\t\t\t\t\n\t\t\t\tthis.size = this.fileStreamer.size;\n\t\t\t\tthis.encoding = \"buffer\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.fileStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\ttransformChunk(chunk) {\n\t\t\t\treturn arrayBufferToBase64(chunk as ArrayBuffer);\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t...OutgoingTransfer.types as OutgoingTransferTypes<OutgoingTransfer<WS>, BrowserTransferTypes>\n\t\t\n\t];\n\t\n}\n\nclass BrowserOutgoingTransport<\n\tWSORWSSC extends WS = WS\n> extends OutgoingTransport<WSORWSSC, BrowserOutgoingTransfer<WSORWSSC>, BrowserTransferTypes> {\n\t\n\tstatic Transfer = BrowserOutgoingTransfer;\n\t\n}\n\n\nexport {\n\tBrowserOutgoingTransfer as OutgoingTransfer,\n\tBrowserOutgoingTransport as OutgoingTransport\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["headers", "sizeLimit", "chunkSize", "progressInterval", "_callArgs", "_handles", "_listeners", "_setupPromise", "_methods", "_prevChunkAt", "_chunksQueue", "_isProcessing", "_progressInterval", "_lastProgress", "_IncomingTransfer_instances", "setup_fn", "process_fn", "complete_fn", "IncomingTransfer", "ws", "kind", "id", "type", "collect", "encoding", "size", "metadata", "handles", "listeners", "__privateAdd", "__publicField", "__privateSet", "__privateMethod", "__privateGet", "begin", "headers", "progressInterval", "chunk", "length", "ts", "bySender", "errorMessage", "sendToSender", "listener", "chunkListener", "progressListener", "_listeners", "_transfers", "_transferHandles", "IncomingTransport", "ws", "options", "__publicField", "__privateAdd", "id", "__privateGet", "kind", "listener", "sizeLimit", "headers", "wssc", "args", "listenerOptions", "listeners", "type", "size", "metadata", "restProps", "Transfer", "chunk", "length", "IncomingTransfer", "BrowserIncomingTransfer", "IncomingTransfer", "__publicField", "chunk", "BrowserIncomingTransport", "IncomingTransport", "uid", "_start", "_end", "_StringStreamer_instances", "next_fn", "StringStreamer", "string", "options", "__privateAdd", "__publicField", "chunkSize", "listener", "__privateMethod", "__privateSet", "__privateGet", "chunk", "resolve", "_callArgs", "_handles", "_onBegin", "_onSenderProgress", "_onProgress", "_onEnd", "_onError", "_setupPromise", "_methods", "_prevChunkAt", "_chunksQueue", "_isProcessing", "_OutgoingTransfer_instances", "setup_fn", "process_fn", "OutgoingTransfer", "ws", "kind", "data", "type", "incomingType", "collect", "metadata", "size", "chunkSize", "encoding", "incomingEncoding", "onBegin", "onSenderProgress", "onProgress", "onEnd", "onError", "handles", "__privateAdd", "__publicField", "uid", "chunk", "__privateGet", "__privateSet", "__privateMethod", "headers", "confirmResponse", "progress", "errorMessage", "availableType", "test", "methods", "chunkLength", "ts", "StringStreamer", "_transfers", "_transferHandles", "OutgoingTransport", "ws", "__privateAdd", "id", "__privateGet", "headers", "wssc", "args", "kind", "props", "Transfer", "transfer", "confirmResponse", "progress", "errorMessage", "__publicField", "OutgoingTransfer", "arrayBufferToBase64", "arrayBuffer", "resolve", "fileReader", "_start", "_end", "_FileStreamer_instances", "next_fn", "_handleFileReaderLoad", "FileStreamer", "file", "options", "__privateAdd", "__publicField", "arrayBuffer", "__privateGet", "__privateSet", "__privateMethod", "chunkSize", "listener", "BrowserOutgoingTransfer", "OutgoingTransfer", "__publicField", "data", "file", "FileStreamer", "metadata", "chunk", "arrayBufferToBase64", "BrowserOutgoingTransport", "OutgoingTransport"]
|
|
3
|
+
"sources": ["../../src/common.ts", "../../src/IncomingTransfer.ts", "../../src/IncomingTransport.ts", "../../src/browser/incoming.ts", "../../../../../@nesvet/npm/n/src/noop.ts", "../../../../../@nesvet/npm/n/src/StatefulPromise.ts", "../../../../../@nesvet/npm/n/src/debounce.ts", "../../../../../@nesvet/npm/n/src/howmuch.ts", "../../../../../@nesvet/npm/n/src/uid.ts", "../../src/StringStreamer.ts", "../../src/OutgoingTransfer.ts", "../../src/OutgoingTransport.ts", "../../src/browser/arrayBufferToBase64.ts", "../../src/browser/FileStreamer.ts", "../../src/browser/outgoing.ts"],
|
|
4
|
+
"sourcesContent": ["export const headers = {\n\trequest: \"~t-request\",\n\tconfirm: \"~t-confirm\",\n\tchunk: \"~t-c\",\n\tprogress: \"~t-p\",\n\tsent: \"~t-sent\",\n\tcompleted: \"~t-completed\",\n\tabort: \"~t-abort\",\n\terror: \"~t-error\"\n};\n\nexport const sizeLimit = 10 * 1024 * 1024 * 1024;\n\nexport const chunkSize = 1024 * 256;\n\nexport const progressInterval = 250;\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServerClient } from \"insite-ws/server\";\nimport { headers, progressInterval } from \"./common\";\nimport type {\n\tIncomingChunk,\n\tIncomingData,\n\tIncomingTransferHandles,\n\tIncomingTransferListener,\n\tIncomingTransferMethods,\n\tIncomingTransferProps,\n\tIncomingTransferTypes,\n\tTransferTypes\n} from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nexport class IncomingTransfer<WSORWSSC extends WS | WSServerClient> {\n\tconstructor(\n\t\tws: WSORWSSC,\n\t\tkind: string,\n\t\tid: string,\n\t\t{\n\t\t\ttype,\n\t\t\tcollect,\n\t\t\tencoding,\n\t\t\tsize,\n\t\t\tmetadata\n\t\t}: IncomingTransferProps<TransferTypes>,\n\t\thandles: IncomingTransferHandles,\n\t\tlisteners: Set<IncomingTransferListener<WSORWSSC, any>>\n\t) {\n\t\t\n\t\tthis.ws = ws;\n\t\tthis.#callArgs = ws.isWebSocket ? [ ws ] as const : [ ws.wss, ws ] as const;\n\t\tthis.kind = kind;\n\t\tthis.id = id;\n\t\tthis.type = type;\n\t\tthis.collect = !!collect;\n\t\tthis.encoding = encoding;\n\t\tthis.size = size;\n\t\tthis.metadata = metadata;\n\t\t\n\t\tthis.#handles = handles;\n\t\tthis.#listeners = listeners;\n\t\t\n\t\tthis.#setupPromise = this.#setup();\n\t\t\n\t}\n\t\n\tws;\n\t#callArgs;\n\tkind;\n\tid;\n\ttype;\n\tcollect;\n\tencoding;\n\tsize;\n\tmetadata;\n\t\n\t#handles;\n\t#listeners;\n\t\n\t#setupPromise;\n\t\n\tdata?: IncomingData;\n\t#methods?: IncomingTransferMethods<IncomingTransfer<WSORWSSC>>;\n\tisAborted = false;\n\tisAbortedBySender = false;\n\tisAbortedByReceiver = false;\n\tisTransfered = false;\n\tconfirmResponse?: string;\n\tbeginAt: number | null = null;\n\t#prevChunkAt: number | null = null;\n\t#chunksQueue: [ chunk: IncomingChunk, length: number ][] = [];\n\t#isProcessing = false;\n\tduration: number | null = null;\n\ttransferedSize = 0;\n\tprocessedSize = 0;\n\tbytesPerMs: number | null = null;\n\tprogress = 0;\n\tendAt: number | null = null;\n\terror: Error | null = null;\n\t\n\t[key: number | string | symbol]: unknown;\n\t\n\t#progressInterval?: ReturnType<typeof setTimeout>;\n\t#lastProgress = 0;\n\t\n\tasync #setup() {\n\t\t\n\t\tthis.#methods = (this.constructor as typeof IncomingTransfer<WSORWSSC>).types[this.type];\n\t\t\n\t\tif (this.#methods)\n\t\t\tawait this.#methods.setup.call(this);\n\t\telse\n\t\t\tthrow new Error(`Unknown type of transfer \"${String(this.type)}\"`);\n\t\t\n\t\tawait this.confirm();\n\t\t\n\t}\n\t\n\twhenSetUp() {\n\t\treturn this.#setupPromise;\n\t}\n\t\n\tasync confirm() {\n\t\t\n\t\tfor (const { begin } of this.#listeners)\n\t\t\tif (await (begin as any)?.call(...this.#callArgs, this) === false)\n\t\t\t\treturn this.throw(\"Transfer was rejected by receiver\");\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tthis.ws.sendMessage(headers.confirm, this.id, this.confirmResponse);\n\t\t\n\t\tthis.#progressInterval = setInterval(() => {\n\t\t\t\n\t\t\tif (this.#lastProgress !== this.progress) {\n\t\t\t\tthis.#lastProgress = this.progress;\n\t\t\t\tthis.ws.sendMessage(headers.progress, this.id, this.progress);\n\t\t\t}\n\t\t\t\n\t\t}, progressInterval);\n\t\t\n\t}\n\t\n\tasync handleChunk(chunk: IncomingChunk, length = chunk.length) {\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = length / (ts - this.#prevChunkAt!);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += length;\n\t\t\n\t\tthis.#chunksQueue.push([ chunk, length ]);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tawait this.#process();\n\t\t}\n\t\t\n\t}\n\t\n\tasync #process() {\n\t\t\n\t\tlet [ chunk, length ] = this.#chunksQueue.shift()!;\n\t\t\n\t\tif (this.#methods!.transformChunk)\n\t\t\tchunk = await this.#methods!.transformChunk.call(this, chunk);\n\t\t\n\t\tif (this.collect)\n\t\t\tawait this.#methods!.collect.call(this, chunk);\n\t\t\n\t\tfor (const { chunk: chunkListener, progress: progressListener } of this.#listeners)\n\t\t\tawait ((chunkListener ?? progressListener) as any)?.call(...this.#callArgs, this, chunk);\n\t\t\n\t\tthis.processedSize += length;\n\t\tif (this.size)\n\t\t\tthis.progress = this.processedSize / this.size;\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tvoid this.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.isTransfered)\n\t\t\t\tvoid this.#complete();\n\t\t}\n\t\t\n\t}\n\t\n\tasync handleSent() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size)\n\t\t\tthis.size = this.transferedSize;\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt!;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tif (!this.#isProcessing)\n\t\t\tawait this.#complete();\n\t\t\n\t}\n\t\n\tasync #complete() {\n\t\t\n\t\tthis.progress = 1;\n\t\t\n\t\tawait this.#methods!.done?.call(this);\n\t\t\n\t\tfor (const listener of this.#listeners) {\n\t\t\tif (listener.once)\n\t\t\t\tthis.#handles.removeListener(this.kind, listener);\n\t\t\t\n\t\t\tawait (listener.end as any)?.call(...this.#callArgs, this);\n\t\t}\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.#handles.delete(this.id);\n\t\t\n\t\tthis.ws.sendMessage(headers.completed, this.id);\n\t\t\n\t}\n\t\n\tabort(bySender = false) {\n\t\t\n\t\tthis.isAborted = true;\n\t\tthis.isAbortedBySender = bySender;\n\t\tthis.isAbortedByReceiver = !bySender;\n\t\t\n\t\treturn this.throw(`Transfer is aborted by ${bySender ? \"sender\" : \"receiver\"}`, !bySender);\n\t}\n\t\n\tthrow(errorMessage: string, sendToSender = true) {\n\t\t\n\t\tthis.#handles.delete(this.id);\n\t\t\n\t\tclearInterval(this.#progressInterval);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\tfor (const listener of this.#listeners) {\n\t\t\tif (listener.once)\n\t\t\t\tthis.#handles.removeListener(this.kind, listener);\n\t\t\t\n\t\t\t(listener.error as any)?.call(...this.#callArgs, this, this.error);\n\t\t}\n\t\t\n\t\tif (sendToSender)\n\t\t\tthis.ws.sendMessage(headers.error, this.id, errorMessage);\n\t\t\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisAbortedBySender: this.isAbortedBySender,\n\t\t\tisAbortedByReceiver: this.isAbortedByReceiver,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tprocessedSize: this.processedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic types: IncomingTransferTypes<IncomingTransfer<WS | WSServerClient>, TransferTypes> = {\n\t\t\n\t\tobject: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;// eslint-disable-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\tthis.data = JSON.parse(this.data as string);\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tdatauri: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;// eslint-disable-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = `data:${this.metadata.type as string};base64,${this.data as string}`;\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\tstring: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;// eslint-disable-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n}\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServer, WSServerClient } from \"insite-ws/server\";\nimport { headers, sizeLimit as defaultSizeLimit } from \"./common\";\nimport { IncomingTransfer } from \"./IncomingTransfer\";\nimport type {\n\tIncomingChunk,\n\tIncomingTransferHandles,\n\tIncomingTransferListener,\n\tIncomingTransferListenerOptions,\n\tIncomingTransferProps,\n\tIncomingTransportOptions,\n\tParametersWithoutFirst,\n\tTransferTypes\n} from \"./types\";\n\n\nexport class IncomingTransport<\n\tWSORWSSC extends WS | WSServerClient,\n\tT extends IncomingTransfer<WSORWSSC>,\n\tTypes extends TransferTypes = TransferTypes\n> {\n\tconstructor(ws: WS | WSServer<Exclude<WSORWSSC, WS>>, options: IncomingTransportOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tsizeLimit = defaultSizeLimit\n\t\t} = options;\n\t\t\n\t\tthis.sizeLimit = sizeLimit;\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(`client-message:${headers.request}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleRequest>) => this.handleRequest(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.chunk}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleChunk>) => this.handleChunk(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.sent}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleSent>) => this.handleSent(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.abort}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleAbort>) => this.handleAbort(wssc, ...args));\n\t\t} else {\n\t\t\tws.on(`message:${headers.request}`, (...args: ParametersWithoutFirst<typeof this.handleRequest>) => this.handleRequest(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.chunk}`, (...args: ParametersWithoutFirst<typeof this.handleChunk>) => this.handleChunk(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.sent}`, (...args: ParametersWithoutFirst<typeof this.handleSent>) => this.handleSent(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.abort}`, (...args: ParametersWithoutFirst<typeof this.handleAbort>) => this.handleAbort(ws as WSORWSSC, ...args));\n\t\t}\n\t\t\n\t\tObject.assign(ws, {\n\t\t\tonTransfer: (kind: string, listener: IncomingTransferListener<WSORWSSC, T>, listenerOptions?: IncomingTransferListenerOptions) => this.on(kind, listener, listenerOptions),\n\t\t\tonceTransfer: (kind: string, listener: IncomingTransferListener<WSORWSSC, T>, listenerOptions?: Omit<IncomingTransferListenerOptions, \"once\">) => this.once(kind, listener, listenerOptions)\n\t\t});\n\t\t\n\t}\n\t\n\tsizeLimit;\n\t\n\t#listeners = new Map<string, Set<IncomingTransferListener<WSORWSSC, T>>>();\n\t\n\taddTransferListener(kind: string, listener: IncomingTransferListener<WSORWSSC, T>, options?: IncomingTransferListenerOptions) {\n\t\tif (options?.once)\n\t\t\tlistener.once = true;\n\t\t\n\t\tthis.#listeners.get(kind)?.add(listener) ??\n\t\tthis.#listeners.set(kind, new Set([ listener ]));\n\t\t\n\t\treturn this;\n\t}\n\t\n\ton = this.addTransferListener;\n\t\n\tonce(kind: string, listener: IncomingTransferListener<WSORWSSC, T>, options?: Omit<IncomingTransferListenerOptions, \"once\">) {\n\t\treturn this.addTransferListener(kind, listener, { ...options, once: true });\n\t}\n\t\n\tremoveTransferListener(kind: string, listener?: IncomingTransferListener<WSORWSSC, T>) {\n\t\tif (listener) {\n\t\t\tconst listeners = this.#listeners.get(kind);\n\t\t\t\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(listener);\n\t\t\t\t\n\t\t\t\tif (!listeners.size)\n\t\t\t\t\tthis.#listeners.delete(kind);\n\t\t\t}\n\t\t} else\n\t\t\tthis.#listeners.delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toff = this.removeTransferListener;\n\t\n\t#transfers = new Map<string, T>();\n\t\n\t#transferHandles: IncomingTransferHandles = {\n\t\t\n\t\tdelete: (id: string) => this.#transfers.delete(id),\n\t\t\n\t\tremoveListener: (kind: string, listener: IncomingTransferListener<WSORWSSC, T>) => this.removeTransferListener(kind, listener)\n\t\t\n\t};\n\t\n\tprivate handleRequest(\n\t\tws: WSORWSSC,\n\t\tkind: string,\n\t\tid: string,\n\t\t{ type, size, metadata, ...restProps }: IncomingTransferProps<Types>\n\t) {\n\t\t\n\t\tconst { Transfer } = this.constructor as typeof IncomingTransport;// eslint-disable-line @typescript-eslint/naming-convention\n\t\t\n\t\tif (!this.#listeners.has(kind))\n\t\t\tws.sendMessage(headers.error, id, `Unknown kind of file \"${kind}\"`);\n\t\telse if (this.#transfers.has(id))\n\t\t\tws.sendMessage(headers.error, id, \"Transfer already exists\");\n\t\telse if (!(type in Transfer.types))\n\t\t\tws.sendMessage(headers.error, id, \"Unknown type of transfer\");\n\t\telse if (size > this.sizeLimit)\n\t\t\tws.sendMessage(headers.error, id, `Transfer size (${size} bytes) exeeds limit of ${this.sizeLimit} bytes`);\n\t\telse\n\t\t\tthis.#transfers.set(id, new Transfer(\n\t\t\t\tws,\n\t\t\t\tkind,\n\t\t\t\tid,\n\t\t\t\t{\n\t\t\t\t\ttype: type as Exclude<TransferTypes, string>,\n\t\t\t\t\tsize,\n\t\t\t\t\tmetadata,\n\t\t\t\t\t...restProps\n\t\t\t\t},\n\t\t\t\tthis.#transferHandles,\n\t\t\t\tthis.#listeners.get(kind)!\n\t\t\t) as T);\n\t\t\n\t}\n\t\n\tprivate async handleChunk(ws: WSORWSSC, id: string, chunk: IncomingChunk, length = chunk.length) {\n\t\tawait this.#transfers.get(id)?.handleChunk(chunk, length);\n\t\t\n\t}\n\t\n\tprivate async handleSent(ws: WSORWSSC, id: string) {\n\t\tawait this.#transfers.get(id)?.handleSent();\n\t\t\n\t}\n\t\n\tprivate handleAbort(ws: WSORWSSC, id: string) {\n\t\tthis.#transfers.get(id)?.abort(true);\n\t\t\n\t}\n\t\n\t\n\tstatic Transfer = IncomingTransfer;\n\t\n}\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServerClient } from \"insite-ws/server\";\nimport { IncomingTransfer } from \"../IncomingTransfer\";\nimport { IncomingTransport } from \"../IncomingTransport\";\nimport type { IncomingTransferTypes } from \"../types\";\nimport type { BrowserTransferTypes } from \"./types\";\n\n\nexport type { IncomingTransportOptions } from \"../types\";\n\n\nclass BrowserIncomingTransfer<\n\tWSORWSSC extends WS | WSServerClient = WS\n> extends IncomingTransfer<WSORWSSC> {\n\t\n\tstatic types: IncomingTransferTypes<BrowserIncomingTransfer<WS>, BrowserTransferTypes> = {\n\t\t\n\t\tfile: {\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tif (this.collect)\n\t\t\t\t\tthis.data = \"\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tcollect(chunk) {\n\t\t\t\tthis.data += chunk as string;// eslint-disable-line @typescript-eslint/restrict-plus-operands\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tdone() {\n\t\t\t\t\n\t\t\t\tif (this.collect && this.encoding === \"utf8\")\n\t\t\t\t\tthis.data = atob(this.data as string);\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\t...IncomingTransfer.types\n\t\t\n\t};\n\t\n}\n\nclass BrowserIncomingTransport<\n\tWSORWSSC extends WS = WS\n> extends IncomingTransport<WSORWSSC, BrowserIncomingTransfer<WSORWSSC>, BrowserTransferTypes> {\n\t\n\tstatic Transfer = BrowserIncomingTransfer;\n\t\n}\n\n\nexport {\n\tBrowserIncomingTransfer as IncomingTransfer,\n\tBrowserIncomingTransport as IncomingTransport\n};\n", "export function noop() { /**/ }\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype Value<T> = PromiseLike<T> | T;\ntype Resolve<T> = (value: Value<T>) => void;\ntype Reject = (reason?: any) => void;\n\ntype Options = {\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n};\n\nconst nativesMap = new WeakMap<StatefulPromise<any>, { resolve: Resolve<any>; reject: Reject }>();\n\n\nexport class StatefulPromise<T> extends Promise<T> {\n\tconstructor(\n\t\texecutor?: (resolve: Resolve<T>, reject: Reject) => void,\n\t\toptions?: Options\n\t) {\n\t\tlet nativeResolve: Resolve<T>;\n\t\tlet nativeReject: Reject;\n\t\t\n\t\tsuper((resolve, reject) => {\n\t\t\tnativeResolve = resolve;\n\t\t\tnativeReject = reject;\n\t\t\t\n\t\t});\n\t\t\n\t\tnativesMap.set(this, { resolve: nativeResolve!, reject: nativeReject! });\n\t\t\n\t\tif (options?.signal)\n\t\t\tif (options.signal.aborted)\n\t\t\t\tthis.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\telse {\n\t\t\t\tconst abortListener = () => this.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\t\t\n\t\t\t\toptions.signal.addEventListener(\"abort\", abortListener);\n\t\t\t\t\n\t\t\t\tthis.finally(() => options.signal?.removeEventListener(\"abort\", abortListener));\n\t\t\t}\n\t\t\n\t\tif (typeof options?.timeout === \"number\" && Number.isFinite(options.timeout)) {\n\t\t\tconst timeout = setTimeout(() => this.reject(new DOMException(\"Timeout exceeded\", \"TimeoutError\")), options.timeout);\n\t\t\t\n\t\t\tthis.finally(() => clearTimeout(timeout));\n\t\t}\n\t\t\n\t\texecutor?.(this.resolve, this.reject);\n\t\t\n\t}\n\t\n\tisPending = true;\n\tisFulfilled = false;\n\tisRejected = false;\n\t\n\tstate: \"fulfilled\" | \"pending\" | \"rejected\" = \"pending\";\n\t\n\tresult?: T | unknown;\n\t\n\treadonly resolve = (value: Value<T>) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isFulfilled = true;\n\t\t\tthis.state = \"fulfilled\";\n\t\t\tthis.result = value;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.resolve.call(this, value);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\treadonly reject = (reason?: any) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isRejected = true;\n\t\t\tthis.state = \"rejected\";\n\t\t\tthis.result = reason;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.reject.call(this, reason);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\t\n\tstatic resolved<U>(value: U): StatefulPromise<U> {\n\t\treturn new StatefulPromise<U>(resolve => resolve(value));\n\t}\n\t\n\tstatic rejected(reason: unknown): StatefulPromise<never> {\n\t\treturn new StatefulPromise((_, reject) => reject(reason));\n\t}\n\t\n}\n", "import { noop } from \"./noop.js\";\nimport { StatefulPromise } from \"./StatefulPromise.js\";\n\n\ntype Callback = (...args: any[]) => unknown;// eslint-disable-line @typescript-eslint/no-explicit-any\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\n\ntype DebouncedFunction<C extends Callback> = {\n\t(this: ThisParameterType<C>, ...args: Parameters<C>): Promise<Awaited<ReturnType<C>>>;\n};\n\nexport type Debounced<C extends Callback, R extends ReturnType<C>> = DebouncedFunction<C> & {\n\tcallback: C;\n\tpromise: StatefulPromise<R>;\n\tresolve: (value: R) => void;\n\treject: (reason?: unknown) => void;\n\trun(): Promise<R>;\n\tclear(shouldRun?: boolean): Promise<void>;\n};\n\n\nexport function debounce<C extends Callback, R extends ReturnType<C>>(callback: C, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet maxWaitTimeout: ReturnType<typeof setTimeout> | undefined;\n\tlet end: number | undefined;\n\tlet context: ThisParameterType<C>;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: R;\n\t\n\tconst expired = async () => {\n\t\t\n\t\tconst n = Date.now();\n\t\t\n\t\tif (n >= end!) {\n\t\t\ttimeout = undefined;\n\t\t\tend = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tmaxWaitTimeout = undefined;\n\t\t\t\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\t\n\t\t\tdebounced.resolve(result);\n\t\t\t\n\t\t\tinitial = leading;\n\t\t} else {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(expired, end! - n);\n\t\t}\n\t\t\n\t};\n\t\n\tconst maxWaitExpired = Number.isFinite(maxWait) ? () => {\n\t\t\n\t\tif (final === run)\n\t\t\tfinal = false;\n\t\t\n\t\trun();\n\t\t\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\ttry {\n\t\t\tresult = await callback.apply(context, args) as R;\n\t\t\t\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tdebounced.reject(error);\n\t\t\t\n\t\t\tthrow error;\n\t\t}\n\t}\n\t\n\tif (leading && typeof leading == \"boolean\")\n\t\tleading = run;\n\tinitial = leading;\n\t\n\tif (trailing && typeof trailing == \"boolean\")\n\t\ttrailing = run;\n\tfinal = trailing;\n\t\n\tconst debounced: Debounced<C, R> = Object.assign(function (..._args) {\n\t\targs = _args;\n\t\tcontext = this;// eslint-disable-line no-invalid-this\n\t\t\n\t\tend = Date.now() + limit;\n\t\tfinal = trailing;\n\t\t\n\t\tif (!debounced.promise.isPending)\n\t\t\tdebounced.promise = new StatefulPromise<R>((resolve, reject) => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\tdebounced.reject = reject;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\t\n\t\t\t\t\tinitial = false;\n\t\t\t\t\t\n\t\t\t\t\tif (final === run)\n\t\t\t\t\t\tfinal = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(expired, limit);\n\t\t\t\t\t\n\t\t\t\t\tif (maxWaitExpired)\n\t\t\t\t\t\tmaxWaitTimeout = setTimeout(maxWaitExpired, maxWait);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<C>, {\n\t\tcallback,\n\t\tpromise: StatefulPromise.resolved(undefined as unknown as R),\n\t\tresolve: noop,\n\t\treject: noop,\n\t\trun,\n\t\tclear: async (shouldRun?: boolean) => {\n\t\t\t\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tmaxWaitTimeout = undefined;\n\t\t\t\n\t\t\tdebounced.resolve(shouldRun ? await run() : result);\n\t\t\t\n\t\t}\n\t});\n\t\n\treturn debounced;\n}\n\n\ndebounce.noop = Object.assign(() => { /**/ }, {\n\tcallback: noop,\n\tpromise: StatefulPromise.resolved(undefined), // eslint-disable-line unicorn/no-useless-undefined\n\tresolve: noop,\n\treject: noop,\n\trun: noop,\n\tclear: noop\n}) as Debounced<() => void, void>;\n\n\nexport function throttle(callback: Callback, limit?: number, options?: Options) {\n\treturn debounce(callback, limit, {\n\t\tmaxWait: limit,\n\t\tleading: true,\n\t\ttrailing: true,\n\t\t...options\n\t});\n}\n", "export function howmuch(number: [] | number, one: string, two: string, five: boolean | string, shouldPrintNumber = true) {\n\tif (Array.isArray(number))\n\t\tnumber = number.length;\n\t\n\tif (typeof five != \"string\") {\n\t\tshouldPrintNumber = five ?? true;\n\t\tfive = two;\n\t}\n\t\n\t\n\treturn (shouldPrintNumber ? `${number}\u00A0` : \"\") + howmuch.raw(number, one, two, five);\n}\n\nhowmuch.raw = (number: number, one: string, two: string, five = two) => {\n\tnumber = Math.abs(number);\n\tconst u = number % 10;\n\tconst d = number % 100;\n\t\n\treturn (\n\t\t(u === 1 && d !== 11) ?\n\t\t\tone :\n\t\t\t((u >= 2 && u <= 4) && !(d >= 12 && d <= 15)) ?\n\t\t\t\ttwo :\n\t\t\t\tfive\n\t);\n};\n", "export function uid(prefix: string | undefined = \"\", postfix: string | undefined = \"\") {\n\treturn `${prefix}${Date.now().toString(36)}${Math.round(Math.random() * Number.MAX_SAFE_INTEGER).toString(36)}${postfix}`;\n}\n", "import type { StreamerOptions } from \"./types\";\n\n\ntype Listener = {\n\t(chunk: string): Promise<void> | void;\n};\n\n\nexport class StringStreamer {\n\tconstructor(string: string, options: StreamerOptions = {}) {\n\t\tthis.string = string;\n\t\tthis.size = this.string.length;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t}\n\t\n\tstring;\n\tsize;\n\tchunkSize;\n\tlistener?: Listener;\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener: Listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tvoid this.#next();\n\t\t\n\t}\n\t\n\tasync #next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\tconst chunk = await new Promise<string>(resolve => { resolve(this.string.slice(this.#start, this.#end)); });\n\t\t\t\n\t\t\tif (!this.isAborted) {\n\t\t\t\tawait this.listener!(chunk);\n\t\t\t\t\n\t\t\t\tif (this.#end < this.size) {\n\t\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\t\n\t\t\t\t\tvoid this.#next();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import { uid } from \"@nesvet/n\";\nimport type { WS } from \"insite-ws/client\";\nimport type { WSServerClient } from \"insite-ws/server\";\nimport { chunkSize as defaultChunkSize, headers } from \"./common\";\nimport { StringStreamer } from \"./StringStreamer\";\nimport type { FileStreamer } from \"./browser/FileStreamer\";\nimport type {\n\tOutgoingChunk,\n\tOutgoingTransferHandles,\n\tOutgoingTransferMethods,\n\tOutgoingTransferProps,\n\tOutgoingTransferTypes,\n\tTransferTypes\n} from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\n// FIXME\n\n\nexport class OutgoingTransfer<WSORWSSC extends WS | WSServerClient> {\n\tconstructor(\n\t\tws: WSORWSSC,\n\t\tkind: string,\n\t\t{\n\t\t\tdata,\n\t\t\ttype,\n\t\t\tincomingType,\n\t\t\tcollect,\n\t\t\tmetadata,\n\t\t\tsize,\n\t\t\tchunkSize,\n\t\t\tencoding,\n\t\t\tincomingEncoding,\n\t\t\tonBegin,\n\t\t\tonSenderProgress,\n\t\t\tonProgress,\n\t\t\tonEnd,\n\t\t\tonError\n\t\t}: OutgoingTransferProps<WSORWSSC, any, any>,\n\t\thandles: OutgoingTransferHandles\n\t) {\n\t\t\n\t\tthis.ws = ws;\n\t\tthis.#callArgs = ws.isWebSocket ? [ ws ] as const : [ ws.wss, ws ] as const;\n\t\tthis.kind = kind;\n\t\tthis.data = data;\n\t\tthis.type = type;\n\t\tthis.collect = collect ?? false;\n\t\tthis.metadata = metadata;\n\t\tthis.size = size ?? null;\n\t\tthis.encoding = encoding;\n\t\tthis.chunkSize = chunkSize ?? (this.constructor as typeof OutgoingTransfer).chunkSize;\n\t\t\n\t\tthis.#handles = handles;\n\t\t\n\t\tif (onBegin)\n\t\t\tthis.#onBegin = onBegin;\n\t\tif (onSenderProgress)\n\t\t\tthis.#onSenderProgress = onSenderProgress;\n\t\tif (onProgress)\n\t\t\tthis.#onProgress = onProgress;\n\t\tif (onEnd)\n\t\t\tthis.#onEnd = onEnd;\n\t\tif (onError)\n\t\t\tthis.#onError = onError;\n\t\t\n\t\tthis.#setupPromise = this.#setup(incomingType, incomingEncoding);\n\t\t\n\t}\n\t\n\tws;\n\t#callArgs;\n\tkind;\n\tdata?;\n\ttype?: string;\n\tcollect;\n\tmetadata;\n\tsize;\n\tencoding;\n\tchunkSize;\n\t\n\t#handles;\n\t\n\t#onBegin?;\n\t#onSenderProgress?;\n\t#onProgress?;\n\t#onEnd?;\n\t#onError?;\n\t\n\t#setupPromise;\n\t\n\tid = uid();\n\t#methods?: OutgoingTransferMethods<OutgoingTransfer<WSORWSSC>>;\n\tisAborted = false;\n\tisTransfered = false;\n\tconfirmResponse?: string;\n\tbeginAt: number | null = null;\n\t#prevChunkAt: number | null = null;\n\t#chunksQueue: OutgoingChunk[] = [];\n\t#isProcessing = false;\n\tduration: number | null = null;\n\ttransferedSize = 0;\n\tbytesPerMs: number | null = null;\n\tsenderProgress = 0;\n\tprogress: number = 0;\n\tendAt: number | null = null;\n\terror: Error | null = null;\n\tstringStreamer?: StringStreamer;\n\tfileStreamer?: FileStreamer;\n\t\n\t[key: number | string | symbol]: unknown;\n\t\n\tasync #setup(incomingType?: string, incomingEncoding?: string) {\n\t\t\n\t\tfor (const [ availableType, test, methods ] of (this.constructor as typeof OutgoingTransfer).types)\n\t\t\tif (this.type === availableType || test(this.data as string)) {\n\t\t\t\tthis.type = availableType;\n\t\t\t\tthis.#methods = methods;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\tif (this.type) {\n\t\t\tawait this.#methods!.setup.call(this);\n\t\t\tdelete this.data;\n\t\t} else\n\t\t\tthrow new Error(\"Unknown type of transfer\");\n\t\t\n\t\tthis.ws.sendMessage(headers.request, this.kind, this.id, {\n\t\t\ttype: incomingType ?? this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: incomingEncoding ?? this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata\n\t\t});\n\t\t\n\t}\n\t\n\twhenSetUp() {\n\t\treturn this.#setupPromise;\n\t}\n\t\n\tasync handleConfirm(confirmResponse: string) {\n\t\tthis.confirmResponse = confirmResponse;\n\t\t\n\t\tthis.beginAt =\n\t\t\tthis.#prevChunkAt =\n\t\t\t\tDate.now();\n\t\t\n\t\tawait (this.#onBegin as any)?.call(...this.#callArgs, this);\n\t\t\n\t\tawait this.#methods!.confirm.call(this);\n\t\t\n\t}\n\t\n\thandleChunk = (chunk: OutgoingChunk) => {\n\t\tthis.#chunksQueue.push(chunk);\n\t\t\n\t\tif (!this.#isProcessing) {\n\t\t\tthis.#isProcessing = true;\n\t\t\tvoid this.#process();\n\t\t}\n\t\t\n\t};\n\t\n\tasync #process() {\n\t\t\n\t\tlet chunk = this.#chunksQueue.shift()!;\n\t\t\n\t\tconst chunkLength = chunk.length!;\n\t\t\n\t\tif (this.#methods!.transformChunk)\n\t\t\tchunk = await this.#methods!.transformChunk.call(this, chunk);\n\t\t\n\t\tthis.ws.sendMessage(headers.chunk, this.id, chunk, chunkLength);\n\t\t\n\t\tconst ts = Date.now();\n\t\tthis.bytesPerMs = chunkLength / (ts - this.#prevChunkAt!);\n\t\tthis.#prevChunkAt = ts;\n\t\tthis.transferedSize += chunkLength;\n\t\t\n\t\tif (this.size)\n\t\t\tthis.senderProgress = this.transferedSize / this.size;\n\t\t\n\t\tawait (this.#onSenderProgress as any)?.call(...this.#callArgs, this);\n\t\t\n\t\tif (this.#chunksQueue.length)\n\t\t\tvoid this.#process();\n\t\telse {\n\t\t\tthis.#isProcessing = false;\n\t\t\t\n\t\t\tif (this.senderProgress === 1)\n\t\t\t\tthis.sent();\n\t\t}\n\t\t\n\t}\n\t\n\tsent = () => this.ws.sendMessage(headers.sent, this.id);\n\t\n\thandleProgress(progress: number) {\n\t\tthis.progress = progress;\n\t\t\n\t\t(this.#onProgress as any)?.call(...this.#callArgs, this);\n\t\t\n\t}\n\t\n\tasync handleCompleted() {\n\t\t\n\t\tthis.isTransfered = true;\n\t\t\n\t\tif (!this.size) {\n\t\t\tthis.size = this.transferedSize;\n\t\t\tthis.senderProgress = 1;\n\t\t}\n\t\t\n\t\tthis.endAt = Date.now();\n\t\tthis.duration = this.endAt - this.beginAt!;\n\t\tthis.bytesPerMs = this.size / this.duration;\n\t\t\n\t\tthis.#handles.delete(this.id);\n\t\t\n\t\tif (this.progress !== 1) {\n\t\t\tthis.progress = 1;\n\t\t\tawait (this.#onProgress as any)?.call(...this.#callArgs, this);\n\t\t}\n\t\t\n\t\t(this.#onEnd as any)?.call(...this.#callArgs, this);\n\t\t\n\t}\n\t\n\tthrow(errorMessage: string) {\n\t\t\n\t\tthis.#handles.delete(this.id);\n\t\t\n\t\tthis.error = new Error(errorMessage);\n\t\t\n\t\t(this.#onError as any)?.call(...this.#callArgs, this, this.error);\n\t\t\n\t}\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t\tthis.ws.sendMessage(headers.abort, this.id);\n\t\t\n\t\treturn this.throw(\"Transfer is aborted by sender\");\n\t}\n\t\n\tserialize() {\n\t\treturn {\n\t\t\tid: this.id,\n\t\t\tkind: this.kind,\n\t\t\ttype: this.type,\n\t\t\tcollect: this.collect,\n\t\t\tencoding: this.encoding,\n\t\t\tsize: this.size,\n\t\t\tmetadata: this.metadata,\n\t\t\tisAborted: this.isAborted,\n\t\t\tisTransfered: this.isTransfered,\n\t\t\tconfirmResponse: this.confirmResponse,\n\t\t\tbeginAt: this.beginAt,\n\t\t\tduration: this.duration,\n\t\t\ttransferedSize: this.transferedSize,\n\t\t\tbytesPerMs: this.bytesPerMs,\n\t\t\tsenderProgress: this.senderProgress,\n\t\t\tprogress: this.progress,\n\t\t\tendAt: this.endAt,\n\t\t\terror: this.error\n\t\t};\n\t}\n\t\n\t\n\tstatic types: OutgoingTransferTypes<OutgoingTransfer<WS | WSServerClient>, TransferTypes> = [\n\t\t\n\t\t[ \"object\", data => typeof data == \"object\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(JSON.stringify(this.data), { chunkSize: this.chunkSize });\n\t\t\t\tthis.collect = true;\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"datauri\", data => typeof data == \"string\" && /^data:[\\w-.]+\\/[\\w-.+,]+(?:;base64)?,/.test(data), {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst [ type, data ] = (this.data as string).split(/^data:|;base64,|,/).slice(1);\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(data, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tthis.encoding = \"base64\";\n\t\t\t\tthis.metadata = { ...this.metadata, type };\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t[ \"string\", data => typeof data == \"string\", {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer = new StringStreamer(this.data as string, { chunkSize: this.chunkSize });\n\t\t\t\tthis.size = this.stringStreamer.size;\n\t\t\t\tif (!this.encoding)\n\t\t\t\t\tthis.encoding = \"utf8\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.stringStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t}\n\t\t} ]\n\t\t\n\t];\n\t\n\tstatic chunkSize = defaultChunkSize;\n\t\n}\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServer, WSServerClient } from \"insite-ws/server\";\nimport { headers } from \"./common\";\nimport { OutgoingTransfer } from \"./OutgoingTransfer\";\nimport type {\n\tOutgoingTransferHandles,\n\tOutgoingTransferProps,\n\tParametersWithoutFirst,\n\tTransferTypes\n} from \"./types\";\n\n\nexport class OutgoingTransport<\n\tWSORWSSC extends WS | WSServerClient,\n\tT extends OutgoingTransfer<WSORWSSC>,\n\tTypes extends TransferTypes = TransferTypes\n> {\n\tconstructor(ws: WS | WSServer<Exclude<WSORWSSC, WS>>) {\n\t\t\n\t\tif (ws.isWebSocketServer) {\n\t\t\tws.on(`client-message:${headers.confirm}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleConfirm>) => this.handleConfirm(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.progress}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleProgress>) => this.handleProgress(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.completed}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleCompleted>) => this.handleCompleted(wssc, ...args));\n\t\t\tws.on(`client-message:${headers.error}`, (wssc: Exclude<WSORWSSC, WS>, ...args: ParametersWithoutFirst<typeof this.handleError>) => this.handleError(wssc, ...args));\n\t\t\t\n\t\t\tObject.assign(ws, {\n\t\t\t\ttransfer: (wssc: Exclude<WSORWSSC, WS>, kind: string, props: OutgoingTransferProps<WSORWSSC, T, Types>) =>\n\t\t\t\t\tthis.transfer(wssc, kind, props)\n\t\t\t});\n\t\t} else {\n\t\t\tws.on(`message:${headers.confirm}`, (...args: ParametersWithoutFirst<typeof this.handleConfirm>) => this.handleConfirm(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.progress}`, (...args: ParametersWithoutFirst<typeof this.handleProgress>) => this.handleProgress(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.completed}`, (...args: ParametersWithoutFirst<typeof this.handleCompleted>) => this.handleCompleted(ws as WSORWSSC, ...args));\n\t\t\tws.on(`message:${headers.error}`, (...args: ParametersWithoutFirst<typeof this.handleError>) => this.handleError(ws as WSORWSSC, ...args));\n\t\t\t\n\t\t\tObject.assign(ws, {\n\t\t\t\ttransfer: (kind: string, props: OutgoingTransferProps<WSORWSSC, T, Types>) =>\n\t\t\t\t\tthis.transfer(ws as WSORWSSC, kind, props)\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\t\n\t#transfers = new Map<string, T>();\n\t\n\t#transferHandles: OutgoingTransferHandles = {\n\t\tdelete: (id: string) => this.#transfers.delete(id)\n\t};\n\t\n\ttransfer(ws: WSORWSSC, kind: string, props: OutgoingTransferProps<WSORWSSC, T, Types>) {\n\t\t\n\t\tconst { Transfer } = this.constructor as typeof OutgoingTransport;// eslint-disable-line @typescript-eslint/naming-convention\n\t\t\n\t\tconst transfer = new Transfer(ws, kind, props, this.#transferHandles);\n\t\t\n\t\tthis.#transfers.set(transfer.id, transfer as T);\n\t\t\n\t\treturn transfer;\n\t}\n\t\n\tprivate async handleConfirm(ws: WSORWSSC, id: string, confirmResponse: string) {\n\t\tawait this.#transfers.get(id)?.handleConfirm(confirmResponse);\n\t\t\n\t}\n\t\n\tprivate handleProgress(ws: WSORWSSC, id: string, progress: number) {\n\t\tthis.#transfers.get(id)?.handleProgress(progress);\n\t\t\n\t}\n\t\n\tprivate async handleCompleted(ws: WSORWSSC, id: string) {\n\t\tawait this.#transfers.get(id)?.handleCompleted();\n\t\t\n\t}\n\t\n\tprivate handleError(ws: WSORWSSC, id: string, errorMessage: string) {\n\t\tthis.#transfers.get(id)?.throw(errorMessage);\n\t\t\n\t}\n\t\n\t\n\tstatic Transfer = OutgoingTransfer;\n\t\n}\n", "export function arrayBufferToBase64(arrayBuffer: ArrayBuffer): Promise<string> {\n\treturn new Promise(resolve => {\n\t\t\n\t\tconst fileReader = new FileReader();\n\t\t\n\t\t// eslint-disable-next-line unicorn/prefer-add-event-listener\n\t\tfileReader.onload = () =>\n\t\t\tresolve(typeof fileReader?.result == \"string\" ? fileReader.result.slice(Math.max(0, fileReader.result.indexOf(\",\") + 1)) : \"\");\n\t\t\n\t\tfileReader.readAsDataURL(new Blob([ arrayBuffer ]));\n\t\t\n\t});\n}\n", "import type { ArrayBufferWithLength, StreamerOptions } from \"../types\";\n\n\ntype Listener = {\n\t(arrayBuffer: ArrayBufferWithLength): Promise<void> | void;\n};\n\n\nexport class FileStreamer {\n\tconstructor(file: File, options: StreamerOptions = {}) {\n\t\tthis.file = file;\n\t\tthis.size = this.file.size;\n\t\t\n\t\tconst {\n\t\t\tchunkSize = 1024 * 256\n\t\t} = options;\n\t\t\n\t\tthis.chunkSize = chunkSize;\n\t\t\n\t\tthis.fileReader = new FileReader();\n\t\t\n\t\t// eslint-disable-next-line unicorn/prefer-add-event-listener\n\t\tthis.fileReader.onload = this.#handleFileReaderLoad;\n\t\t\n\t}\n\t\n\tfile;\n\tsize;\n\tchunkSize;\n\tfileReader;\n\tlistener?: Listener;\n\t\n\t#start = 0;\n\t#end = 0;\n\t\n\tisAborted = false;\n\t\n\tstart(listener: Listener) {\n\t\tthis.listener = listener;\n\t\t\n\t\tthis.#next();\n\t\t\n\t}\n\t\n\t#next() {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tthis.#end = Math.min(this.#start + this.chunkSize, this.size);\n\t\t\t\n\t\t\t// eslint-disable-next-line unicorn/prefer-blob-reading-methods\n\t\t\tthis.fileReader.readAsArrayBuffer(this.file.slice(this.#start, this.#end));\n\t\t}\n\t\t\n\t}\n\t\n\t#handleFileReaderLoad = async () => {\n\t\t\n\t\tif (!this.isAborted) {\n\t\t\tconst arrayBuffer = this.fileReader.result as ArrayBufferWithLength;\n\t\t\tarrayBuffer.length = arrayBuffer.byteLength;\n\t\t\t\n\t\t\tawait this.listener!(arrayBuffer);\n\t\t\t\n\t\t\tif (this.#end < this.size) {\n\t\t\t\tthis.#start = this.#end;\n\t\t\t\t\n\t\t\t\tthis.#next();\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\tabort() {\n\t\t\n\t\tthis.isAborted = true;\n\t\t\n\t}\n\t\n}\n", "import type { WS } from \"insite-ws/client\";\nimport type { WSServerClient } from \"insite-ws/server\";\nimport { OutgoingTransfer } from \"../OutgoingTransfer\";\nimport { OutgoingTransport } from \"../OutgoingTransport\";\nimport type { OutgoingTransferTypes } from \"../types\";\nimport { arrayBufferToBase64 } from \"./arrayBufferToBase64\";\nimport { FileStreamer } from \"./FileStreamer\";\nimport type { BrowserTransferTypes } from \"./types\";\n\n\nclass BrowserOutgoingTransfer<\n\tWSORWSSC extends WS | WSServerClient = WS\n> extends OutgoingTransfer<WSORWSSC> {\n\t\n\tstatic types: OutgoingTransferTypes<BrowserOutgoingTransfer<WS>, BrowserTransferTypes> = [\n\t\t\n\t\t[ \"file\", data => typeof data == \"object\" && data instanceof File, {\n\t\t\t\n\t\t\tsetup() {\n\t\t\t\t\n\t\t\t\tconst file = this.data as File;\n\t\t\t\t\n\t\t\t\tthis.fileStreamer = new FileStreamer(file, { chunkSize: this.chunkSize });\n\t\t\t\t\n\t\t\t\tconst metadata = {\n\t\t\t\t\tname: file.name,\n\t\t\t\t\ttype: file.type,\n\t\t\t\t\tsize: file.size,\n\t\t\t\t\tmodifiedAt: file.lastModified\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tif (this.metadata)\n\t\t\t\t\tObject.assign(this.metadata, metadata);\n\t\t\t\telse\n\t\t\t\t\tthis.metadata = metadata;\n\t\t\t\t\n\t\t\t\tthis.size = this.fileStreamer.size;\n\t\t\t\tthis.encoding = \"buffer\";\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tconfirm() {\n\t\t\t\t\n\t\t\t\tthis.fileStreamer!.start(this.handleChunk);\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\ttransformChunk(chunk) {\n\t\t\t\treturn arrayBufferToBase64(chunk as ArrayBuffer);\n\t\t\t}\n\t\t} ],\n\t\t\n\t\t...OutgoingTransfer.types as OutgoingTransferTypes<OutgoingTransfer<WS>, BrowserTransferTypes>\n\t\t\n\t];\n\t\n}\n\nclass BrowserOutgoingTransport<\n\tWSORWSSC extends WS = WS\n> extends OutgoingTransport<WSORWSSC, BrowserOutgoingTransfer<WSORWSSC>, BrowserTransferTypes> {\n\t\n\tstatic Transfer = BrowserOutgoingTransfer;\n\t\n}\n\n\nexport {\n\tBrowserOutgoingTransfer as OutgoingTransfer,\n\tBrowserOutgoingTransport as OutgoingTransport\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["headers", "sizeLimit", "chunkSize", "progressInterval", "_callArgs", "_handles", "_listeners", "_setupPromise", "_methods", "_prevChunkAt", "_chunksQueue", "_isProcessing", "_progressInterval", "_lastProgress", "_IncomingTransfer_instances", "setup_fn", "process_fn", "complete_fn", "IncomingTransfer", "ws", "kind", "id", "type", "collect", "encoding", "size", "metadata", "handles", "listeners", "__privateAdd", "__publicField", "__privateSet", "__privateMethod", "__privateGet", "begin", "headers", "progressInterval", "chunk", "length", "ts", "bySender", "errorMessage", "sendToSender", "listener", "chunkListener", "progressListener", "_listeners", "_transfers", "_transferHandles", "IncomingTransport", "ws", "options", "__publicField", "__privateAdd", "id", "__privateGet", "kind", "listener", "sizeLimit", "headers", "wssc", "args", "listenerOptions", "listeners", "type", "size", "metadata", "restProps", "Transfer", "chunk", "length", "IncomingTransfer", "BrowserIncomingTransfer", "IncomingTransfer", "__publicField", "chunk", "BrowserIncomingTransport", "IncomingTransport", "noop", "nativesMap", "StatefulPromise", "_StatefulPromise", "executor", "options", "nativeResolve", "nativeReject", "resolve", "reject", "__publicField", "value", "native", "reason", "abortListener", "timeout", "_", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "error", "_args", "StatefulPromise", "resolve", "reject", "noop", "shouldRun", "howmuch", "number", "one", "two", "five", "shouldPrintNumber", "u", "d", "uid", "prefix", "postfix", "_start", "_end", "_StringStreamer_instances", "next_fn", "StringStreamer", "string", "options", "__privateAdd", "__publicField", "chunkSize", "listener", "__privateMethod", "__privateSet", "__privateGet", "chunk", "resolve", "_callArgs", "_handles", "_onBegin", "_onSenderProgress", "_onProgress", "_onEnd", "_onError", "_setupPromise", "_methods", "_prevChunkAt", "_chunksQueue", "_isProcessing", "_OutgoingTransfer_instances", "setup_fn", "process_fn", "OutgoingTransfer", "ws", "kind", "data", "type", "incomingType", "collect", "metadata", "size", "chunkSize", "encoding", "incomingEncoding", "onBegin", "onSenderProgress", "onProgress", "onEnd", "onError", "handles", "__privateAdd", "__publicField", "uid", "chunk", "__privateGet", "__privateSet", "__privateMethod", "headers", "confirmResponse", "progress", "errorMessage", "availableType", "test", "methods", "chunkLength", "ts", "StringStreamer", "_transfers", "_transferHandles", "OutgoingTransport", "ws", "__privateAdd", "id", "__privateGet", "headers", "wssc", "args", "kind", "props", "Transfer", "transfer", "confirmResponse", "progress", "errorMessage", "__publicField", "OutgoingTransfer", "arrayBufferToBase64", "arrayBuffer", "resolve", "fileReader", "_start", "_end", "_FileStreamer_instances", "next_fn", "_handleFileReaderLoad", "FileStreamer", "file", "options", "__privateAdd", "__publicField", "arrayBuffer", "__privateGet", "__privateSet", "__privateMethod", "chunkSize", "listener", "BrowserOutgoingTransfer", "OutgoingTransfer", "__publicField", "data", "file", "FileStreamer", "metadata", "chunk", "arrayBufferToBase64", "BrowserOutgoingTransport", "OutgoingTransport"]
|
|
7
7
|
}
|
package/dist/node/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Readable as L}from"node:stream";var r={request:"~t-request",confirm:"~t-confirm",chunk:"~t-c",progress:"~t-p",sent:"~t-sent",completed:"~t-completed",abort:"~t-abort",error:"~t-error"},z=10*1024*1024*1024,k=1024*256,v=250;var h=class{constructor(e,s,t,{type:i,collect:n,encoding:o,size:c,metadata:l},p,g){this.ws=e,this.#e=e.isWebSocket?[e]:[e.wss,e],this.kind=s,this.id=t,this.type=i,this.collect=!!n,this.encoding=o,this.size=c,this.metadata=l,this.#s=p,this.#t=g,this.#l=this.#d()}ws;#e;kind;id;type;collect;encoding;size;metadata;#s;#t;#l;data;#i;isAborted=!1;isAbortedBySender=!1;isAbortedByReceiver=!1;isTransfered=!1;confirmResponse;beginAt=null;#a=null;#o=[];#n=!1;duration=null;transferedSize=0;processedSize=0;bytesPerMs=null;progress=0;endAt=null;error=null;#r;#h=0;async#d(){if(this.#i=this.constructor.types[this.type],this.#i)await this.#i.setup.call(this);else throw new Error(`Unknown type of transfer "${String(this.type)}"`);await this.confirm()}whenSetUp(){return this.#l}async confirm(){for(let{begin:e}of this.#t)if(await e?.call(...this.#e,this)===!1)return this.throw("Transfer was rejected by receiver");this.beginAt=this.#a=Date.now(),this.ws.sendMessage(r.confirm,this.id,this.confirmResponse),this.#r=setInterval(()=>{this.#h!==this.progress&&(this.#h=this.progress,this.ws.sendMessage(r.progress,this.id,this.progress))},v)}async handleChunk(e,s=e.length){let t=Date.now();this.bytesPerMs=s/(t-this.#a),this.#a=t,this.transferedSize+=s,this.#o.push([e,s]),this.#n||(this.#n=!0,await this.#f())}async#f(){let[e,s]=this.#o.shift();this.#i.transformChunk&&(e=await this.#i.transformChunk.call(this,e)),this.collect&&await this.#i.collect.call(this,e);for(let{chunk:t,progress:i}of this.#t)await(t??i)?.call(...this.#e,this,e);this.processedSize+=s,this.size&&(this.progress=this.processedSize/this.size),this.#o.length?this.#f():(this.#n=!1,this.isTransfered&&this.#c())}async handleSent(){this.isTransfered=!0,this.size||(this.size=this.transferedSize),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.#n||await this.#c()}async#c(){this.progress=1,await this.#i.done?.call(this);for(let e of this.#t)e.once&&this.#s.removeListener(this.kind,e),await e.end?.call(...this.#e,this);clearInterval(this.#r),this.#s.delete(this.id),this.ws.sendMessage(r.completed,this.id)}abort(e=!1){return this.isAborted=!0,this.isAbortedBySender=e,this.isAbortedByReceiver=!e,this.throw(`Transfer is aborted by ${e?"sender":"receiver"}`,!e)}throw(e,s=!0){this.#s.delete(this.id),clearInterval(this.#r),this.error=new Error(e);for(let t of this.#t)t.once&&this.#s.removeListener(this.kind,t),t.error?.call(...this.#e,this,this.error);s&&this.ws.sendMessage(r.error,this.id,e)}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isAbortedBySender:this.isAbortedBySender,isAbortedByReceiver:this.isAbortedByReceiver,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,processedSize:this.processedSize,bytesPerMs:this.bytesPerMs,progress:this.progress,endAt:this.endAt,error:this.error}}static types={object:{setup(){this.data=""},collect(e){this.data+=e},done(){this.data=JSON.parse(this.data)}},datauri:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&(this.data=`data:${this.metadata.type};base64,${this.data}`)}},string:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e}}}};var S=class{constructor(e,s={}){let{sizeLimit:t=z}=s;this.sizeLimit=t,e.isWebSocketServer?(e.on(`client-message:${r.request}`,(i,...n)=>this.handleRequest(i,...n)),e.on(`client-message:${r.chunk}`,(i,...n)=>this.handleChunk(i,...n)),e.on(`client-message:${r.sent}`,(i,...n)=>this.handleSent(i,...n)),e.on(`client-message:${r.abort}`,(i,...n)=>this.handleAbort(i,...n))):(e.on(`message:${r.request}`,(...i)=>this.handleRequest(e,...i)),e.on(`message:${r.chunk}`,(...i)=>this.handleChunk(e,...i)),e.on(`message:${r.sent}`,(...i)=>this.handleSent(e,...i)),e.on(`message:${r.abort}`,(...i)=>this.handleAbort(e,...i))),Object.assign(e,{onTransfer:(i,n,o)=>this.on(i,n,o),onceTransfer:(i,n,o)=>this.once(i,n,o)})}sizeLimit;#e=new Map;addTransferListener(e,s,t){return t?.once&&(s.once=!0),this.#e.get(e)?.add(s)??this.#e.set(e,new Set([s])),this}on=this.addTransferListener;once(e,s,t){return this.addTransferListener(e,s,{...t,once:!0})}removeTransferListener(e,s){if(s){let t=this.#e.get(e);t&&(t.delete(s),t.size||this.#e.delete(e))}else this.#e.delete(e);return this}off=this.removeTransferListener;#s=new Map;#t={delete:e=>this.#s.delete(e),removeListener:(e,s)=>this.removeTransferListener(e,s)};handleRequest(e,s,t,{type:i,size:n,metadata:o,...c}){let{Transfer:l}=this.constructor;this.#e.has(s)?this.#s.has(t)?e.sendMessage(r.error,t,"Transfer already exists"):i in l.types?n>this.sizeLimit?e.sendMessage(r.error,t,`Transfer size (${n} bytes) exeeds limit of ${this.sizeLimit} bytes`):this.#s.set(t,new l(e,s,t,{type:i,size:n,metadata:o,...c},this.#t,this.#e.get(s))):e.sendMessage(r.error,t,"Unknown type of transfer"):e.sendMessage(r.error,t,`Unknown kind of file "${s}"`)}async handleChunk(e,s,t,i=t.length){await this.#s.get(s)?.handleChunk(t,i)}async handleSent(e,s){await this.#s.get(s)?.handleSent()}handleAbort(e,s){this.#s.get(s)?.abort(!0)}static Transfer=h};var u=class extends L{constructor(e){super(),this.writable=e,this.promise=new Promise((s,t)=>{e.on("close",s),e.on("error",t)}),this.pipe(e)}writable;promise;_read(){}};function M(a){let e=new u(a);return this.streams?.push(e)??(this.streams=[e]),a}var P={setup(){this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0),this.collect&&(this.data=this.isBuffer?Buffer.from(""):""),this.pipeTo=M},transformChunk(a){if(a=this.isBuffer?Buffer.from(a,"base64"):Buffer.from(a,"base64").toString(this.encoding),this.streams)for(let e of this.streams)e.push(a);return a},collect(a){this.isBuffer?this.data=Buffer.concat([this.data,a]):this.data+=a},async done(){if(this.streams){let a=[];for(let e of this.streams)e.push(null),a.push(e.promise);await Promise.all(a)}}},W=class extends h{streams;isBuffer=this.isBuffer||!1;pipeTo=this.pipeTo;static types={stream:P,file:P,...h.types}},w=class extends S{static Transfer=W};import{createReadStream as E,existsSync as $}from"node:fs";import{stat as F}from"node:fs/promises";import{basename as N,extname as q}from"node:path";import{Readable as H}from"node:stream";import j from"mime";import{uid as B}from"@nesvet/n";var d=class{constructor(e,s={}){this.string=e,this.size=this.string.length;let{chunkSize:t=1024*256}=s;this.chunkSize=t}string;size;chunkSize;listener;#e=0;#s=0;isAborted=!1;start(e){this.listener=e,this.#t()}async#t(){if(!this.isAborted){this.#s=Math.min(this.#e+this.chunkSize,this.size);let e=await new Promise(s=>{s(this.string.slice(this.#e,this.#s))});this.isAborted||(await this.listener(e),this.#s<this.size&&(this.#e=this.#s,this.#t()))}}abort(){this.isAborted=!0}};var f=class{constructor(e,s,{data:t,type:i,incomingType:n,collect:o,metadata:c,size:l,chunkSize:p,encoding:g,incomingEncoding:x,onBegin:T,onSenderProgress:C,onProgress:b,onEnd:O,onError:R},A){this.ws=e,this.#e=e.isWebSocket?[e]:[e.wss,e],this.kind=s,this.data=t,this.type=i,this.collect=o??!1,this.metadata=c,this.size=l??null,this.encoding=g,this.chunkSize=p??this.constructor.chunkSize,this.#s=A,T&&(this.#t=T),C&&(this.#l=C),b&&(this.#i=b),O&&(this.#a=O),R&&(this.#o=R),this.#n=this.#c(n,x)}ws;#e;kind;data;type;collect;metadata;size;encoding;chunkSize;#s;#t;#l;#i;#a;#o;#n;id=B();#r;isAborted=!1;isTransfered=!1;confirmResponse;beginAt=null;#h=null;#d=[];#f=!1;duration=null;transferedSize=0;bytesPerMs=null;senderProgress=0;progress=0;endAt=null;error=null;stringStreamer;fileStreamer;async#c(e,s){for(let[t,i,n]of this.constructor.types)if(this.type===t||i(this.data)){this.type=t,this.#r=n;break}if(this.type)await this.#r.setup.call(this),delete this.data;else throw new Error("Unknown type of transfer");this.ws.sendMessage(r.request,this.kind,this.id,{type:e??this.type,collect:this.collect,encoding:s??this.encoding,size:this.size,metadata:this.metadata})}whenSetUp(){return this.#n}async handleConfirm(e){this.confirmResponse=e,this.beginAt=this.#h=Date.now(),await this.#t?.call(...this.#e,this),await this.#r.confirm.call(this)}handleChunk=e=>{this.#d.push(e),this.#f||(this.#f=!0,this.#S())};async#S(){let e=this.#d.shift(),s=e.length;this.#r.transformChunk&&(e=await this.#r.transformChunk.call(this,e)),this.ws.sendMessage(r.chunk,this.id,e,s);let t=Date.now();this.bytesPerMs=s/(t-this.#h),this.#h=t,this.transferedSize+=s,this.size&&(this.senderProgress=this.transferedSize/this.size),await this.#l?.call(...this.#e,this),this.#d.length?this.#S():(this.#f=!1,this.senderProgress===1&&this.sent())}sent=()=>this.ws.sendMessage(r.sent,this.id);handleProgress(e){this.progress=e,this.#i?.call(...this.#e,this)}async handleCompleted(){this.isTransfered=!0,this.size||(this.size=this.transferedSize,this.senderProgress=1),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.#s.delete(this.id),this.progress!==1&&(this.progress=1,await this.#i?.call(...this.#e,this)),this.#a?.call(...this.#e,this)}throw(e){this.#s.delete(this.id),this.error=new Error(e),this.#o?.call(...this.#e,this,this.error)}abort(){return this.isAborted=!0,this.ws.sendMessage(r.abort,this.id),this.throw("Transfer is aborted by sender")}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,bytesPerMs:this.bytesPerMs,senderProgress:this.senderProgress,progress:this.progress,endAt:this.endAt,error:this.error}}static types=[["object",e=>typeof e=="object",{setup(){this.stringStreamer=new d(JSON.stringify(this.data),{chunkSize:this.chunkSize}),this.collect=!0,this.size=this.stringStreamer.size,this.encoding="utf8"},confirm(){this.stringStreamer.start(this.handleChunk)}}],["datauri",e=>typeof e=="string"&&/^data:[\w-.]+\/[\w-.+,]+(?:;base64)?,/.test(e),{setup(){let[e,s]=this.data.split(/^data:|;base64,|,/).slice(1);this.stringStreamer=new d(s,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding="base64",this.metadata={...this.metadata,type:e}},confirm(){this.stringStreamer.start(this.handleChunk)}}],["string",e=>typeof e=="string",{setup(){this.stringStreamer=new d(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]];static chunkSize=k};var m=class{constructor(e){e.isWebSocketServer?(e.on(`client-message:${r.confirm}`,(s,...t)=>this.handleConfirm(s,...t)),e.on(`client-message:${r.progress}`,(s,...t)=>this.handleProgress(s,...t)),e.on(`client-message:${r.completed}`,(s,...t)=>this.handleCompleted(s,...t)),e.on(`client-message:${r.error}`,(s,...t)=>this.handleError(s,...t)),Object.assign(e,{transfer:(s,t,i)=>this.transfer(s,t,i)})):(e.on(`message:${r.confirm}`,(...s)=>this.handleConfirm(e,...s)),e.on(`message:${r.progress}`,(...s)=>this.handleProgress(e,...s)),e.on(`message:${r.completed}`,(...s)=>this.handleCompleted(e,...s)),e.on(`message:${r.error}`,(...s)=>this.handleError(e,...s)),Object.assign(e,{transfer:(s,t)=>this.transfer(e,s,t)}))}#e=new Map;#s={delete:e=>this.#e.delete(e)};transfer(e,s,t){let{Transfer:i}=this.constructor,n=new i(e,s,t,this.#s);return this.#e.set(n.id,n),n}async handleConfirm(e,s,t){await this.#e.get(s)?.handleConfirm(t)}handleProgress(e,s,t){this.#e.get(s)?.handleProgress(t)}async handleCompleted(e,s){await this.#e.get(s)?.handleCompleted()}handleError(e,s,t){this.#e.get(s)?.throw(t)}static Transfer=f};var y=class extends f{stream=this.stream;isBuffer=this.isBuffer||!1;static types=[["stream",e=>e instanceof H,{setup(){this.stream=this.data,this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0)},confirm(){this.stream.on("data",this.handleChunk),this.size||this.stream.on("end",this.sent)},transformChunk(e){return(this.isBuffer?e:Buffer.from(e,this.encoding)).toString("base64")}}],["file",e=>typeof e=="string"&&$(e),{async setup(){let e=this.data,s=N(e),{size:t,mtimeMs:i}=await F(e),n={name:s,type:j.getType(q(s).slice(1)),size:t,modifiedAt:i};this.stream=E(e),this.size=t,this.encoding="buffer",this.metadata?Object.assign(this.metadata,n):this.metadata=n},confirm(){this.stream.on("data",this.handleChunk)},transformChunk(e){return e.toString("base64")}}],...f.types]},I=class extends m{static Transfer=y};export{W as IncomingTransfer,w as IncomingTransport,W as NodeIncomingTransfer,y as OutgoingTransfer,I as OutgoingTransport};
|
|
1
|
+
import{Readable as D}from"node:stream";var o={request:"~t-request",confirm:"~t-confirm",chunk:"~t-c",progress:"~t-p",sent:"~t-sent",completed:"~t-completed",abort:"~t-abort",error:"~t-error"},z=10*1024*1024*1024,A=1024*256,E=250;var S=class{constructor(e,t,r,{type:s,collect:n,encoding:a,size:f,metadata:h},x,W){this.ws=e,this.#e=e.isWebSocket?[e]:[e.wss,e],this.kind=t,this.id=r,this.type=s,this.collect=!!n,this.encoding=a,this.size=f,this.metadata=h,this.#t=x,this.#r=W,this.#c=this.#l()}ws;#e;kind;id;type;collect;encoding;size;metadata;#t;#r;#c;data;#s;isAborted=!1;isAbortedBySender=!1;isAbortedByReceiver=!1;isTransfered=!1;confirmResponse;beginAt=null;#o=null;#a=[];#n=!1;duration=null;transferedSize=0;processedSize=0;bytesPerMs=null;progress=0;endAt=null;error=null;#i;#f=0;async#l(){if(this.#s=this.constructor.types[this.type],this.#s)await this.#s.setup.call(this);else throw new Error(`Unknown type of transfer "${String(this.type)}"`);await this.confirm()}whenSetUp(){return this.#c}async confirm(){for(let{begin:e}of this.#r)if(await e?.call(...this.#e,this)===!1)return this.throw("Transfer was rejected by receiver");this.beginAt=this.#o=Date.now(),this.ws.sendMessage(o.confirm,this.id,this.confirmResponse),this.#i=setInterval(()=>{this.#f!==this.progress&&(this.#f=this.progress,this.ws.sendMessage(o.progress,this.id,this.progress))},E)}async handleChunk(e,t=e.length){let r=Date.now();this.bytesPerMs=t/(r-this.#o),this.#o=r,this.transferedSize+=t,this.#a.push([e,t]),this.#n||(this.#n=!0,await this.#h())}async#h(){let[e,t]=this.#a.shift();this.#s.transformChunk&&(e=await this.#s.transformChunk.call(this,e)),this.collect&&await this.#s.collect.call(this,e);for(let{chunk:r,progress:s}of this.#r)await(r??s)?.call(...this.#e,this,e);this.processedSize+=t,this.size&&(this.progress=this.processedSize/this.size),this.#a.length?this.#h():(this.#n=!1,this.isTransfered&&this.#u())}async handleSent(){this.isTransfered=!0,this.size||(this.size=this.transferedSize),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.#n||await this.#u()}async#u(){this.progress=1,await this.#s.done?.call(this);for(let e of this.#r)e.once&&this.#t.removeListener(this.kind,e),await e.end?.call(...this.#e,this);clearInterval(this.#i),this.#t.delete(this.id),this.ws.sendMessage(o.completed,this.id)}abort(e=!1){return this.isAborted=!0,this.isAbortedBySender=e,this.isAbortedByReceiver=!e,this.throw(`Transfer is aborted by ${e?"sender":"receiver"}`,!e)}throw(e,t=!0){this.#t.delete(this.id),clearInterval(this.#i),this.error=new Error(e);for(let r of this.#r)r.once&&this.#t.removeListener(this.kind,r),r.error?.call(...this.#e,this,this.error);t&&this.ws.sendMessage(o.error,this.id,e)}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isAbortedBySender:this.isAbortedBySender,isAbortedByReceiver:this.isAbortedByReceiver,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,processedSize:this.processedSize,bytesPerMs:this.bytesPerMs,progress:this.progress,endAt:this.endAt,error:this.error}}static types={object:{setup(){this.data=""},collect(e){this.data+=e},done(){this.data=JSON.parse(this.data)}},datauri:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&(this.data=`data:${this.metadata.type};base64,${this.data}`)}},string:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e}}}};var k=class{constructor(e,t={}){let{sizeLimit:r=z}=t;this.sizeLimit=r,e.isWebSocketServer?(e.on(`client-message:${o.request}`,(s,...n)=>this.handleRequest(s,...n)),e.on(`client-message:${o.chunk}`,(s,...n)=>this.handleChunk(s,...n)),e.on(`client-message:${o.sent}`,(s,...n)=>this.handleSent(s,...n)),e.on(`client-message:${o.abort}`,(s,...n)=>this.handleAbort(s,...n))):(e.on(`message:${o.request}`,(...s)=>this.handleRequest(e,...s)),e.on(`message:${o.chunk}`,(...s)=>this.handleChunk(e,...s)),e.on(`message:${o.sent}`,(...s)=>this.handleSent(e,...s)),e.on(`message:${o.abort}`,(...s)=>this.handleAbort(e,...s))),Object.assign(e,{onTransfer:(s,n,a)=>this.on(s,n,a),onceTransfer:(s,n,a)=>this.once(s,n,a)})}sizeLimit;#e=new Map;addTransferListener(e,t,r){return r?.once&&(t.once=!0),this.#e.get(e)?.add(t)??this.#e.set(e,new Set([t])),this}on=this.addTransferListener;once(e,t,r){return this.addTransferListener(e,t,{...r,once:!0})}removeTransferListener(e,t){if(t){let r=this.#e.get(e);r&&(r.delete(t),r.size||this.#e.delete(e))}else this.#e.delete(e);return this}off=this.removeTransferListener;#t=new Map;#r={delete:e=>this.#t.delete(e),removeListener:(e,t)=>this.removeTransferListener(e,t)};handleRequest(e,t,r,{type:s,size:n,metadata:a,...f}){let{Transfer:h}=this.constructor;this.#e.has(t)?this.#t.has(r)?e.sendMessage(o.error,r,"Transfer already exists"):s in h.types?n>this.sizeLimit?e.sendMessage(o.error,r,`Transfer size (${n} bytes) exeeds limit of ${this.sizeLimit} bytes`):this.#t.set(r,new h(e,t,r,{type:s,size:n,metadata:a,...f},this.#r,this.#e.get(t))):e.sendMessage(o.error,r,"Unknown type of transfer"):e.sendMessage(o.error,r,`Unknown kind of file "${t}"`)}async handleChunk(e,t,r,s=r.length){await this.#t.get(t)?.handleChunk(r,s)}async handleSent(e,t){await this.#t.get(t)?.handleSent()}handleAbort(e,t){this.#t.get(t)?.abort(!0)}static Transfer=S};var R=class extends D{constructor(e){super(),this.writable=e,this.promise=new Promise((t,r)=>{e.on("close",t),e.on("error",r)}),this.pipe(e)}writable;promise;_read(){}};function q(i){let e=new R(i);return this.streams?.push(e)??(this.streams=[e]),i}var $={setup(){this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0),this.collect&&(this.data=this.isBuffer?Buffer.from(""):""),this.pipeTo=q},transformChunk(i){if(i=this.isBuffer?Buffer.from(i,"base64"):Buffer.from(i,"base64").toString(this.encoding),this.streams)for(let e of this.streams)e.push(i);return i},collect(i){this.isBuffer?this.data=Buffer.concat([this.data,i]):this.data+=i},async done(){if(this.streams){let i=[];for(let e of this.streams)e.push(null),i.push(e.promise);await Promise.all(i)}}},P=class extends S{streams;isBuffer=this.isBuffer||!1;pipeTo=this.pipeTo;static types={stream:$,file:$,...S.types}},M=class extends k{static Transfer=P};import{createReadStream as H,existsSync as J}from"node:fs";import{stat as U}from"node:fs/promises";import{basename as V,extname as K}from"node:path";import{Readable as Q}from"node:stream";import G from"mime";function p(){}var w=new WeakMap,b=class i extends Promise{constructor(e,t){let r,s;if(super((n,a)=>{r=n,s=a}),w.set(this,{resolve:r,reject:s}),t?.signal)if(t.signal.aborted)this.reject(new DOMException("Aborted","AbortError"));else{let n=()=>this.reject(new DOMException("Aborted","AbortError"));t.signal.addEventListener("abort",n),this.finally(()=>t.signal?.removeEventListener("abort",n))}if(typeof t?.timeout=="number"&&Number.isFinite(t.timeout)){let n=setTimeout(()=>this.reject(new DOMException("Timeout exceeded","TimeoutError")),t.timeout);this.finally(()=>clearTimeout(n))}e?.(this.resolve,this.reject)}isPending=!0;isFulfilled=!1;isRejected=!1;state="pending";result;resolve=e=>{if(this.isPending){this.isPending=!1,this.isFulfilled=!0,this.state="fulfilled",this.result=e;let t=w.get(this);t&&(t.resolve.call(this,e),w.delete(this))}};reject=e=>{if(this.isPending){this.isPending=!1,this.isRejected=!0,this.state="rejected",this.result=e;let t=w.get(this);t&&(t.reject.call(this,e),w.delete(this))}};static resolved(e){return new i(t=>t(e))}static rejected(e){return new i((t,r)=>r(e))}};function _(i,e=0,t={}){let{leading:r=!1,trailing:s=!0}=t,{maxWait:n=1/0}=t,a,f,h,x,W,m,c,g,C=async()=>{let d=Date.now();d>=h?(a=void 0,h=void 0,clearTimeout(f),f=void 0,typeof c=="function"&&await c(),l.resolve(g),m=r):(clearTimeout(a),a=setTimeout(C,h-d))},T=Number.isFinite(n)?()=>{c===u&&(c=!1),u(),f=setTimeout(T,n)}:null;async function u(){try{return g=await i.apply(x,W),g}catch(d){throw l.reject(d),d}}r&&typeof r=="boolean"&&(r=u),m=r,s&&typeof s=="boolean"&&(s=u),c=s;let l=Object.assign(function(...d){return W=d,x=this,h=Date.now()+e,c=s,l.promise.isPending||(l.promise=new b((F,N)=>{l.resolve=F,l.reject=N,typeof m=="function"&&(m(),m=!1,c===u&&(c=!1)),a||(a=setTimeout(C,e),T&&(f=setTimeout(T,n)))})),l.promise},{callback:i,promise:b.resolved(void 0),resolve:p,reject:p,run:u,clear:async d=>{clearTimeout(a),a=void 0,clearTimeout(f),f=void 0,l.resolve(d?await u():g)}});return l}_.noop=Object.assign(()=>{},{callback:p,promise:b.resolved(void 0),resolve:p,reject:p,run:p,clear:p});function j(i,e,t,r,s=!0){return Array.isArray(i)&&(i=i.length),typeof r!="string"&&(s=r??!0,r=t),(s?`${i}\xA0`:"")+j.raw(i,e,t,r)}j.raw=(i,e,t,r=t)=>{i=Math.abs(i);let s=i%10,n=i%100;return s===1&&n!==11?e:s>=2&&s<=4&&!(n>=12&&n<=15)?t:r};function L(i="",e=""){return`${i}${Date.now().toString(36)}${Math.round(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}${e}`}var O=class{constructor(e,t={}){this.string=e,this.size=this.string.length;let{chunkSize:r=1024*256}=t;this.chunkSize=r}string;size;chunkSize;listener;#e=0;#t=0;isAborted=!1;start(e){this.listener=e,this.#r()}async#r(){if(!this.isAborted){this.#t=Math.min(this.#e+this.chunkSize,this.size);let e=await new Promise(t=>{t(this.string.slice(this.#e,this.#t))});this.isAborted||(await this.listener(e),this.#t<this.size&&(this.#e=this.#t,this.#r()))}}abort(){this.isAborted=!0}};var y=class{constructor(e,t,{data:r,type:s,incomingType:n,collect:a,metadata:f,size:h,chunkSize:x,encoding:W,incomingEncoding:m,onBegin:c,onSenderProgress:g,onProgress:C,onEnd:T,onError:u},l){this.ws=e,this.#e=e.isWebSocket?[e]:[e.wss,e],this.kind=t,this.data=r,this.type=s,this.collect=a??!1,this.metadata=f,this.size=h??null,this.encoding=W,this.chunkSize=x??this.constructor.chunkSize,this.#t=l,c&&(this.#r=c),g&&(this.#c=g),C&&(this.#s=C),T&&(this.#o=T),u&&(this.#a=u),this.#n=this.#u(n,m)}ws;#e;kind;data;type;collect;metadata;size;encoding;chunkSize;#t;#r;#c;#s;#o;#a;#n;id=L();#i;isAborted=!1;isTransfered=!1;confirmResponse;beginAt=null;#f=null;#l=[];#h=!1;duration=null;transferedSize=0;bytesPerMs=null;senderProgress=0;progress=0;endAt=null;error=null;stringStreamer;fileStreamer;async#u(e,t){for(let[r,s,n]of this.constructor.types)if(this.type===r||s(this.data)){this.type=r,this.#i=n;break}if(this.type)await this.#i.setup.call(this),delete this.data;else throw new Error("Unknown type of transfer");this.ws.sendMessage(o.request,this.kind,this.id,{type:e??this.type,collect:this.collect,encoding:t??this.encoding,size:this.size,metadata:this.metadata})}whenSetUp(){return this.#n}async handleConfirm(e){this.confirmResponse=e,this.beginAt=this.#f=Date.now(),await this.#r?.call(...this.#e,this),await this.#i.confirm.call(this)}handleChunk=e=>{this.#l.push(e),this.#h||(this.#h=!0,this.#d())};async#d(){let e=this.#l.shift(),t=e.length;this.#i.transformChunk&&(e=await this.#i.transformChunk.call(this,e)),this.ws.sendMessage(o.chunk,this.id,e,t);let r=Date.now();this.bytesPerMs=t/(r-this.#f),this.#f=r,this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size),await this.#c?.call(...this.#e,this),this.#l.length?this.#d():(this.#h=!1,this.senderProgress===1&&this.sent())}sent=()=>this.ws.sendMessage(o.sent,this.id);handleProgress(e){this.progress=e,this.#s?.call(...this.#e,this)}async handleCompleted(){this.isTransfered=!0,this.size||(this.size=this.transferedSize,this.senderProgress=1),this.endAt=Date.now(),this.duration=this.endAt-this.beginAt,this.bytesPerMs=this.size/this.duration,this.#t.delete(this.id),this.progress!==1&&(this.progress=1,await this.#s?.call(...this.#e,this)),this.#o?.call(...this.#e,this)}throw(e){this.#t.delete(this.id),this.error=new Error(e),this.#a?.call(...this.#e,this,this.error)}abort(){return this.isAborted=!0,this.ws.sendMessage(o.abort,this.id),this.throw("Transfer is aborted by sender")}serialize(){return{id:this.id,kind:this.kind,type:this.type,collect:this.collect,encoding:this.encoding,size:this.size,metadata:this.metadata,isAborted:this.isAborted,isTransfered:this.isTransfered,confirmResponse:this.confirmResponse,beginAt:this.beginAt,duration:this.duration,transferedSize:this.transferedSize,bytesPerMs:this.bytesPerMs,senderProgress:this.senderProgress,progress:this.progress,endAt:this.endAt,error:this.error}}static types=[["object",e=>typeof e=="object",{setup(){this.stringStreamer=new O(JSON.stringify(this.data),{chunkSize:this.chunkSize}),this.collect=!0,this.size=this.stringStreamer.size,this.encoding="utf8"},confirm(){this.stringStreamer.start(this.handleChunk)}}],["datauri",e=>typeof e=="string"&&/^data:[\w-.]+\/[\w-.+,]+(?:;base64)?,/.test(e),{setup(){let[e,t]=this.data.split(/^data:|;base64,|,/).slice(1);this.stringStreamer=new O(t,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding="base64",this.metadata={...this.metadata,type:e}},confirm(){this.stringStreamer.start(this.handleChunk)}}],["string",e=>typeof e=="string",{setup(){this.stringStreamer=new O(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]];static chunkSize=A};var v=class{constructor(e){e.isWebSocketServer?(e.on(`client-message:${o.confirm}`,(t,...r)=>this.handleConfirm(t,...r)),e.on(`client-message:${o.progress}`,(t,...r)=>this.handleProgress(t,...r)),e.on(`client-message:${o.completed}`,(t,...r)=>this.handleCompleted(t,...r)),e.on(`client-message:${o.error}`,(t,...r)=>this.handleError(t,...r)),Object.assign(e,{transfer:(t,r,s)=>this.transfer(t,r,s)})):(e.on(`message:${o.confirm}`,(...t)=>this.handleConfirm(e,...t)),e.on(`message:${o.progress}`,(...t)=>this.handleProgress(e,...t)),e.on(`message:${o.completed}`,(...t)=>this.handleCompleted(e,...t)),e.on(`message:${o.error}`,(...t)=>this.handleError(e,...t)),Object.assign(e,{transfer:(t,r)=>this.transfer(e,t,r)}))}#e=new Map;#t={delete:e=>this.#e.delete(e)};transfer(e,t,r){let{Transfer:s}=this.constructor,n=new s(e,t,r,this.#t);return this.#e.set(n.id,n),n}async handleConfirm(e,t,r){await this.#e.get(t)?.handleConfirm(r)}handleProgress(e,t,r){this.#e.get(t)?.handleProgress(r)}async handleCompleted(e,t){await this.#e.get(t)?.handleCompleted()}handleError(e,t,r){this.#e.get(t)?.throw(r)}static Transfer=y};var I=class extends y{stream=this.stream;isBuffer=this.isBuffer||!1;static types=[["stream",e=>e instanceof Q,{setup(){this.stream=this.data,this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0)},confirm(){this.stream.on("data",this.handleChunk),this.size||this.stream.on("end",this.sent)},transformChunk(e){return(this.isBuffer?e:Buffer.from(e,this.encoding)).toString("base64")}}],["file",e=>typeof e=="string"&&J(e),{async setup(){let e=this.data,t=V(e),{size:r,mtimeMs:s}=await U(e),n={name:t,type:G.getType(K(t).slice(1)),size:r,modifiedAt:s};this.stream=H(e),this.size=r,this.encoding="buffer",this.metadata?Object.assign(this.metadata,n):this.metadata=n},confirm(){this.stream.on("data",this.handleChunk)},transformChunk(e){return e.toString("base64")}}],...y.types]},B=class extends v{static Transfer=I};export{P as IncomingTransfer,M as IncomingTransport,P as NodeIncomingTransfer,I as OutgoingTransfer,B as OutgoingTransport};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|