insite-ws-transfers 2.2.2 → 2.2.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.
@@ -1,2 +1,2 @@
1
- var Me=Object.defineProperty;var Ce=n=>{throw TypeError(n)};var Ee=(n,e,t)=>e in n?Me(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var r=(n,e,t)=>Ee(n,typeof e!="symbol"?e+"":e,t),Se=(n,e,t)=>e.has(n)||Ce("Cannot "+t);var s=(n,e,t)=>(Se(n,e,"read from private field"),t?t.call(n):e.get(n)),a=(n,e,t)=>e.has(n)?Ce("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,t),f=(n,e,t,i)=>(Se(n,e,"write to private field"),i?i.call(n,t):e.set(n,t),t),u=(n,e,t)=>(Se(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"},Re=10*1024*1024*1024,ke=1024*256,ve=250;var R,k,v,Z,y,D,q,A,H,ee,x,we,ge,ye,w=class{constructor(e,t,i,{type:o,collect:h,encoding:c,size:S,metadata:p},E,L){a(this,x);r(this,"ws");a(this,R);r(this,"kind");r(this,"id");r(this,"type");r(this,"collect");r(this,"encoding");r(this,"size");r(this,"metadata");a(this,k);a(this,v);a(this,Z);r(this,"data");a(this,y);r(this,"isAborted",!1);r(this,"isAbortedBySender",!1);r(this,"isAbortedByReceiver",!1);r(this,"isTransfered",!1);r(this,"confirmResponse");r(this,"beginAt",null);a(this,D,null);a(this,q,[]);a(this,A,!1);r(this,"duration",null);r(this,"transferedSize",0);r(this,"processedSize",0);r(this,"bytesPerMs",null);r(this,"progress",0);r(this,"endAt",null);r(this,"error",null);a(this,H);a(this,ee,0);this.ws=e,f(this,R,e.isWebSocket?[e]:[e.wss,e]),this.kind=t,this.id=i,this.type=o,this.collect=!!h,this.encoding=c,this.size=S,this.metadata=p,f(this,k,E),f(this,v,L),f(this,Z,u(this,x,we).call(this))}whenSetUp(){return s(this,Z)}async confirm(){for(let{begin:e}of s(this,v))if(await e?.call(...s(this,R),this)===!1)return this.throw("Transfer was rejected by receiver");this.beginAt=f(this,D,Date.now()),this.ws.sendMessage(l.confirm,this.id,this.confirmResponse),f(this,H,setInterval(()=>{s(this,ee)!==this.progress&&(f(this,ee,this.progress),this.ws.sendMessage(l.progress,this.id,this.progress))},ve))}handleChunk(e,t=e.length){let i=Date.now();this.bytesPerMs=t/(i-s(this,D)),f(this,D,i),this.transferedSize+=t,s(this,q).push([e,t]),s(this,A)||(f(this,A,!0),u(this,x,ge).call(this))}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,A)||u(this,x,ye).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,k).delete(this.id),clearInterval(s(this,H)),this.error=new Error(e);for(let i of s(this,v))i.once&&s(this,k).removeListener(this.kind,i),i.error?.call(...s(this,R),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}}};R=new WeakMap,k=new WeakMap,v=new WeakMap,Z=new WeakMap,y=new WeakMap,D=new WeakMap,q=new WeakMap,A=new WeakMap,H=new WeakMap,ee=new WeakMap,x=new WeakSet,we=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)}"`);this.confirm()},ge=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:i,progress:o}of s(this,v))await(i??o)?.call(...s(this,R),this,e);this.processedSize+=t,this.size&&(this.progress=this.processedSize/this.size),s(this,q).length?u(this,x,ge).call(this):(f(this,A,!1),this.isTransfered&&u(this,x,ye).call(this))},ye=async function(){this.progress=1,await s(this,y).done?.call(this);for(let e of s(this,v))e.once&&s(this,k).removeListener(this.kind,e),await e.end?.call(...s(this,R),this);clearInterval(s(this,H)),s(this,k).delete(this.id),this.ws.sendMessage(l.completed,this.id)},r(w,"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,O,le,te=class{constructor(e,t={}){r(this,"sizeLimit");a(this,W,new Map);r(this,"on",this.addTransferListener);r(this,"off",this.removeTransferListener);a(this,O,new Map);a(this,le,{delete:e=>s(this,O).delete(e),removeListener:(e,t)=>this.removeTransferListener(e,t)});let{sizeLimit:i=Re}=t;this.sizeLimit=i,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,i){return i?.once&&(t.once=!0),s(this,W).get(e)?.add(t)??s(this,W).set(e,new Set([t])),this}once(e,t,i){return this.addTransferListener(e,t,{...i,once:!0})}removeTransferListener(e,t){if(t){let i=s(this,W).get(e);i&&(i.delete(t),i.size||s(this,W).delete(e))}else s(this,W).delete(e);return this}handleRequest(e,t,i,{type:o,size:h,metadata:c,...S}){let{Transfer:p}=this.constructor;s(this,W).has(t)?s(this,O).has(i)?e.sendMessage(l.error,i,"Transfer already exists"):o in p.types?h>this.sizeLimit?e.sendMessage(l.error,i,`Transfer size (${h} bytes) exeeds limit of ${this.sizeLimit} bytes`):s(this,O).set(i,new p(e,t,i,{type:o,size:h,metadata:c,...S},s(this,le),s(this,W).get(t))):e.sendMessage(l.error,i,"Unknown type of transfer"):e.sendMessage(l.error,i,`Unknown kind of file "${t}"`)}handleChunk(e,t,i,o=i.length){s(this,O).get(t)?.handleChunk(i,o)}handleSent(e,t){s(this,O).get(t)?.handleSent()}handleAbort(e,t){s(this,O).get(t)?.abort(!0)}};W=new WeakMap,O=new WeakMap,le=new WeakMap,r(te,"Transfer",w);var ce=class extends w{};r(ce,"types",{file:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&this.encoding==="utf8"&&(this.data=atob(this.data))}},...w.types});var xe=class extends te{};r(xe,"Transfer",ce);function N(){}function Le(n,e=0,t={}){let{leading:i=!1,trailing:o=!0}=t,{maxWait:h=1/0}=t,c,S,p,E,L,P,d,j,Y=async()=>{let F=Date.now();F>=p?(c=void 0,p=void 0,clearTimeout(S),typeof d=="function"&&await d(),m.resolve(j),m.promise.isResolved=!0,P=i):(clearTimeout(c),c=setTimeout(Y,p-F))},B=Number.isFinite(h)?()=>{d===g&&(d=!1),g(),S=setTimeout(B,h)}:null;async function g(){return j=await n.apply(E,L)}i&&typeof i=="boolean"&&(i=g),P=i,o&&typeof o=="boolean"&&(o=g),d=o;let m=Object.assign(function(...F){return L=F,E=this,p=Date.now()+e,d=o,m.promise.isResolved&&(m.promise=Object.assign(new Promise($e=>{m.resolve=$e,typeof P=="function"&&(P(),P=!1,d===g&&(d=!1)),c||(c=setTimeout(Y,e),B&&(S=setTimeout(B,h)))}),{isResolved:!1})),m.promise},{callback:n,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:N,run:g,clear:async F=>{clearTimeout(c),c=void 0,clearTimeout(S),m.promise.isResolved=!0,m.resolve(F?await g():j)}});return m}Le.noop=Object.assign(()=>{},{callback:N,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:N,run:N,clear:N});function ze(n,e,t,i,o=!0){return Array.isArray(n)&&(n=n.length),typeof i!="string"&&(o=i??!0,i=t),(o?`${n}\xA0`:"")+ze.raw(n,e,t,i)}ze.raw=(n,e,t,i=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:i};function Pe(n="",e=""){return`${n}${Date.now().toString(36)}${Math.round(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}${e}`}var U,I,se,We,_=class{constructor(e,t={}){a(this,se);r(this,"string");r(this,"size");r(this,"chunkSize");r(this,"listener");a(this,U,0);a(this,I,0);r(this,"isAborted",!1);this.string=e,this.size=this.string.length;let{chunkSize:i=1024*256}=t;this.chunkSize=i}start(e){this.listener=e,u(this,se,We).call(this)}abort(){this.isAborted=!0}};U=new WeakMap,I=new WeakMap,se=new WeakSet,We=async function(){if(!this.isAborted){f(this,I,Math.min(s(this,U)+this.chunkSize,this.size));let e=await new Promise(t=>{t(this.string.slice(s(this,U),s(this,I)))});this.isAborted||(await this.listener(e),s(this,I)<this.size&&(f(this,U,s(this,I)),u(this,se,We).call(this)))}};var T,J,re,ie,K,ne,oe,ae,z,Q,V,G,$,Ae,Te,b=class{constructor(e,t,{data:i,type:o,incomingType:h,collect:c,metadata:S,size:p,chunkSize:E,encoding:L,incomingEncoding:P,onBegin:d,onSenderProgress:j,onProgress:Y,onEnd:B,onError:g},m){a(this,$);r(this,"ws");a(this,T);r(this,"kind");r(this,"data");r(this,"type");r(this,"collect");r(this,"metadata");r(this,"size");r(this,"encoding");r(this,"chunkSize");a(this,J);a(this,re);a(this,ie);a(this,K);a(this,ne);a(this,oe);a(this,ae);r(this,"id",Pe());a(this,z);r(this,"isAborted",!1);r(this,"isTransfered",!1);r(this,"confirmResponse");r(this,"beginAt",null);a(this,Q,null);a(this,V,[]);a(this,G,!1);r(this,"duration",null);r(this,"transferedSize",0);r(this,"bytesPerMs",null);r(this,"senderProgress",0);r(this,"progress",0);r(this,"endAt",null);r(this,"error",null);r(this,"stringStreamer");r(this,"fileStreamer");r(this,"handleChunk",e=>{s(this,V).push(e),s(this,G)||(f(this,G,!0),u(this,$,Te).call(this))});r(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=i,this.type=o,this.collect=c??!1,this.metadata=S,this.size=p??null,this.encoding=L,this.chunkSize=E??this.constructor.chunkSize,f(this,J,m),d&&f(this,re,d),j&&f(this,ie,j),Y&&f(this,K,Y),B&&f(this,ne,B),g&&f(this,oe,g),f(this,ae,u(this,$,Ae).call(this,h,P))}whenSetUp(){return s(this,ae)}async handleConfirm(e){this.confirmResponse=e,this.beginAt=f(this,Q,Date.now()),await s(this,re)?.call(...s(this,T),this),s(this,z).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,J).delete(this.id),this.progress!==1&&(this.progress=1,await s(this,K)?.call(...s(this,T),this)),s(this,ne)?.call(...s(this,T),this)}throw(e){s(this,J).delete(this.id),this.error=new Error(e),s(this,oe)?.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,J=new WeakMap,re=new WeakMap,ie=new WeakMap,K=new WeakMap,ne=new WeakMap,oe=new WeakMap,ae=new WeakMap,z=new WeakMap,Q=new WeakMap,V=new WeakMap,G=new WeakMap,$=new WeakSet,Ae=async function(e,t){for(let[i,o,h]of this.constructor.types)if(this.type===i||o(this.data)){this.type=i,f(this,z,h);break}if(this.type)await s(this,z).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})},Te=async function(){let e=s(this,V).shift(),t=e.length;s(this,z).transformChunk&&(e=await s(this,z).transformChunk.call(this,e)),this.ws.sendMessage(l.chunk,this.id,e,t);let i=Date.now();this.bytesPerMs=t/(i-s(this,Q)),f(this,Q,i),this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size),await s(this,ie)?.call(...s(this,T),this),s(this,V).length?u(this,$,Te).call(this):(f(this,G,!1),this.senderProgress===1&&this.sent())},r(b,"types",[["object",e=>typeof e=="object",{setup(){this.stringStreamer=new _(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 _(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 _(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]]),r(b,"chunkSize",ke);var C,ue,he=class{constructor(e){a(this,C,new Map);a(this,ue,{delete:e=>s(this,C).delete(e)});e.isWebSocketServer?(e.on(`client-message:${l.confirm}`,(t,...i)=>this.handleConfirm(t,...i)),e.on(`client-message:${l.progress}`,(t,...i)=>this.handleProgress(t,...i)),e.on(`client-message:${l.completed}`,(t,...i)=>this.handleCompleted(t,...i)),e.on(`client-message:${l.error}`,(t,...i)=>this.handleError(t,...i)),Object.assign(e,{transfer:(t,i,o)=>this.transfer(t,i,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,i)=>this.transfer(e,t,i)}))}transfer(e,t,i){let{Transfer:o}=this.constructor,h=new o(e,t,i,s(this,ue));return s(this,C).set(h.id,h),h}handleConfirm(e,t,i){s(this,C).get(t)?.handleConfirm(i)}handleProgress(e,t,i){s(this,C).get(t)?.handleProgress(i)}handleCompleted(e,t){s(this,C).get(t)?.handleCompleted()}handleError(e,t,i){s(this,C).get(t)?.throw(i)}};C=new WeakMap,ue=new WeakMap,r(he,"Transfer",b);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 X,M,fe,Oe,de,pe=class{constructor(e,t={}){a(this,fe);r(this,"file");r(this,"size");r(this,"chunkSize");r(this,"fileReader");r(this,"listener");a(this,X,0);a(this,M,0);r(this,"isAborted",!1);a(this,de,async()=>{if(!this.isAborted){let e=this.fileReader.result;e.length=e.byteLength,await this.listener(e),s(this,M)<this.size&&(f(this,X,s(this,M)),u(this,fe,Oe).call(this))}});this.file=e,this.size=this.file.size;let{chunkSize:i=1024*256}=t;this.chunkSize=i,this.fileReader=new FileReader,this.fileReader.onload=s(this,de)}start(e){this.listener=e,u(this,fe,Oe).call(this)}abort(){this.isAborted=!0}};X=new WeakMap,M=new WeakMap,fe=new WeakSet,Oe=function(){this.isAborted||(f(this,M,Math.min(s(this,X)+this.chunkSize,this.size)),this.fileReader.readAsArrayBuffer(this.file.slice(s(this,X),s(this,M))))},de=new WeakMap;var me=class extends b{};r(me,"types",[["file",e=>typeof e=="object"&&e instanceof File,{setup(){let e=this.data;this.fileStreamer=new pe(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)}}],...b.types]);var be=class extends he{};r(be,"Transfer",me);export{ce as IncomingTransfer,xe as IncomingTransport,me as OutgoingTransfer,be as OutgoingTransport};
1
+ var Me=Object.defineProperty;var Ce=n=>{throw TypeError(n)};var Ee=(n,e,t)=>e in n?Me(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var r=(n,e,t)=>Ee(n,typeof e!="symbol"?e+"":e,t),Se=(n,e,t)=>e.has(n)||Ce("Cannot "+t);var s=(n,e,t)=>(Se(n,e,"read from private field"),t?t.call(n):e.get(n)),a=(n,e,t)=>e.has(n)?Ce("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,t),f=(n,e,t,i)=>(Se(n,e,"write to private field"),i?i.call(n,t):e.set(n,t),t),u=(n,e,t)=>(Se(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"},ke=10*1024*1024*1024,Re=1024*256,ve=250;var k,R,v,Z,y,D,q,A,H,ee,x,we,ge,ye,w=class{constructor(e,t,i,{type:o,collect:h,encoding:c,size:S,metadata:p},E,L){a(this,x);r(this,"ws");a(this,k);r(this,"kind");r(this,"id");r(this,"type");r(this,"collect");r(this,"encoding");r(this,"size");r(this,"metadata");a(this,R);a(this,v);a(this,Z);r(this,"data");a(this,y);r(this,"isAborted",!1);r(this,"isAbortedBySender",!1);r(this,"isAbortedByReceiver",!1);r(this,"isTransfered",!1);r(this,"confirmResponse");r(this,"beginAt",null);a(this,D,null);a(this,q,[]);a(this,A,!1);r(this,"duration",null);r(this,"transferedSize",0);r(this,"processedSize",0);r(this,"bytesPerMs",null);r(this,"progress",0);r(this,"endAt",null);r(this,"error",null);a(this,H);a(this,ee,0);this.ws=e,f(this,k,e.isWebSocket?[e]:[e.wss,e]),this.kind=t,this.id=i,this.type=o,this.collect=!!h,this.encoding=c,this.size=S,this.metadata=p,f(this,R,E),f(this,v,L),f(this,Z,u(this,x,we).call(this))}whenSetUp(){return s(this,Z)}async confirm(){for(let{begin:e}of s(this,v))if(await e?.call(...s(this,k),this)===!1)return this.throw("Transfer was rejected by receiver");this.beginAt=f(this,D,Date.now()),this.ws.sendMessage(l.confirm,this.id,this.confirmResponse),f(this,H,setInterval(()=>{s(this,ee)!==this.progress&&(f(this,ee,this.progress),this.ws.sendMessage(l.progress,this.id,this.progress))},ve))}handleChunk(e,t=e.length){let i=Date.now();this.bytesPerMs=t/(i-s(this,D)),f(this,D,i),this.transferedSize+=t,s(this,q).push([e,t]),s(this,A)||(f(this,A,!0),u(this,x,ge).call(this))}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,A)||u(this,x,ye).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,R).delete(this.id),clearInterval(s(this,H)),this.error=new Error(e);for(let i of s(this,v))i.once&&s(this,R).removeListener(this.kind,i),i.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,R=new WeakMap,v=new WeakMap,Z=new WeakMap,y=new WeakMap,D=new WeakMap,q=new WeakMap,A=new WeakMap,H=new WeakMap,ee=new WeakMap,x=new WeakSet,we=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)}"`);this.confirm()},ge=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:i,progress:o}of s(this,v))await(i??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,ge).call(this):(f(this,A,!1),this.isTransfered&&u(this,x,ye).call(this))},ye=async function(){this.progress=1,await s(this,y).done?.call(this);for(let e of s(this,v))e.once&&s(this,R).removeListener(this.kind,e),await e.end?.call(...s(this,k),this);clearInterval(s(this,H)),s(this,R).delete(this.id),this.ws.sendMessage(l.completed,this.id)},r(w,"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,O,le,te=class{constructor(e,t={}){r(this,"sizeLimit");a(this,W,new Map);r(this,"on",this.addTransferListener);r(this,"off",this.removeTransferListener);a(this,O,new Map);a(this,le,{delete:e=>s(this,O).delete(e),removeListener:(e,t)=>this.removeTransferListener(e,t)});let{sizeLimit:i=ke}=t;this.sizeLimit=i,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,i){return i?.once&&(t.once=!0),s(this,W).get(e)?.add(t)??s(this,W).set(e,new Set([t])),this}once(e,t,i){return this.addTransferListener(e,t,{...i,once:!0})}removeTransferListener(e,t){if(t){let i=s(this,W).get(e);i&&(i.delete(t),i.size||s(this,W).delete(e))}else s(this,W).delete(e);return this}handleRequest(e,t,i,{type:o,size:h,metadata:c,...S}){let{Transfer:p}=this.constructor;s(this,W).has(t)?s(this,O).has(i)?e.sendMessage(l.error,i,"Transfer already exists"):o in p.types?h>this.sizeLimit?e.sendMessage(l.error,i,`Transfer size (${h} bytes) exeeds limit of ${this.sizeLimit} bytes`):s(this,O).set(i,new p(e,t,i,{type:o,size:h,metadata:c,...S},s(this,le),s(this,W).get(t))):e.sendMessage(l.error,i,"Unknown type of transfer"):e.sendMessage(l.error,i,`Unknown kind of file "${t}"`)}handleChunk(e,t,i,o=i.length){s(this,O).get(t)?.handleChunk(i,o)}handleSent(e,t){s(this,O).get(t)?.handleSent()}handleAbort(e,t){s(this,O).get(t)?.abort(!0)}};W=new WeakMap,O=new WeakMap,le=new WeakMap,r(te,"Transfer",w);var ce=class extends w{};r(ce,"types",{file:{setup(){this.collect&&(this.data="")},collect(e){this.data+=e},done(){this.collect&&this.encoding==="utf8"&&(this.data=atob(this.data))}},...w.types});var xe=class extends te{};r(xe,"Transfer",ce);function N(){}function Le(n,e=0,t={}){let{leading:i=!1,trailing:o=!0}=t,{maxWait:h=1/0}=t,c,S,p,E,L,P,d,j,Y=async()=>{let F=Date.now();F>=p?(c=void 0,p=void 0,clearTimeout(S),typeof d=="function"&&await d(),m.resolve(j),m.promise.isResolved=!0,P=i):(clearTimeout(c),c=setTimeout(Y,p-F))},B=Number.isFinite(h)?()=>{d===g&&(d=!1),g(),S=setTimeout(B,h)}:null;async function g(){return j=await n.apply(E,L)}i&&typeof i=="boolean"&&(i=g),P=i,o&&typeof o=="boolean"&&(o=g),d=o;let m=Object.assign(function(...F){return L=F,E=this,p=Date.now()+e,d=o,m.promise.isResolved&&(m.promise=Object.assign(new Promise($e=>{m.resolve=$e,typeof P=="function"&&(P(),P=!1,d===g&&(d=!1)),c||(c=setTimeout(Y,e),B&&(S=setTimeout(B,h)))}),{isResolved:!1})),m.promise},{callback:n,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:N,run:g,clear:async F=>{clearTimeout(c),c=void 0,clearTimeout(S),m.promise.isResolved=!0,m.resolve(F?await g():j)}});return m}Le.noop=Object.assign(()=>{},{callback:N,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:N,run:N,clear:N});function ze(n,e,t,i,o=!0){return Array.isArray(n)&&(n=n.length),typeof i!="string"&&(o=i??!0,i=t),(o?`${n}\xA0`:"")+ze.raw(n,e,t,i)}ze.raw=(n,e,t,i=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:i};function Pe(n="",e=""){return`${n}${Date.now().toString(36)}${Math.round(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}${e}`}var U,I,se,We,_=class{constructor(e,t={}){a(this,se);r(this,"string");r(this,"size");r(this,"chunkSize");r(this,"listener");a(this,U,0);a(this,I,0);r(this,"isAborted",!1);this.string=e,this.size=this.string.length;let{chunkSize:i=1024*256}=t;this.chunkSize=i}start(e){this.listener=e,u(this,se,We).call(this)}abort(){this.isAborted=!0}};U=new WeakMap,I=new WeakMap,se=new WeakSet,We=async function(){if(!this.isAborted){f(this,I,Math.min(s(this,U)+this.chunkSize,this.size));let e=await new Promise(t=>{t(this.string.slice(s(this,U),s(this,I)))});this.isAborted||(await this.listener(e),s(this,I)<this.size&&(f(this,U,s(this,I)),u(this,se,We).call(this)))}};var T,J,re,ie,K,ne,oe,ae,z,Q,V,G,$,Ae,Te,b=class{constructor(e,t,{data:i,type:o,incomingType:h,collect:c,metadata:S,size:p,chunkSize:E,encoding:L,incomingEncoding:P,onBegin:d,onSenderProgress:j,onProgress:Y,onEnd:B,onError:g},m){a(this,$);r(this,"ws");a(this,T);r(this,"kind");r(this,"data");r(this,"type");r(this,"collect");r(this,"metadata");r(this,"size");r(this,"encoding");r(this,"chunkSize");a(this,J);a(this,re);a(this,ie);a(this,K);a(this,ne);a(this,oe);a(this,ae);r(this,"id",Pe());a(this,z);r(this,"isAborted",!1);r(this,"isTransfered",!1);r(this,"confirmResponse");r(this,"beginAt",null);a(this,Q,null);a(this,V,[]);a(this,G,!1);r(this,"duration",null);r(this,"transferedSize",0);r(this,"bytesPerMs",null);r(this,"senderProgress",0);r(this,"progress",0);r(this,"endAt",null);r(this,"error",null);r(this,"stringStreamer");r(this,"fileStreamer");r(this,"handleChunk",e=>{s(this,V).push(e),s(this,G)||(f(this,G,!0),u(this,$,Te).call(this))});r(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=i,this.type=o,this.collect=c??!1,this.metadata=S,this.size=p??null,this.encoding=L,this.chunkSize=E??this.constructor.chunkSize,f(this,J,m),d&&f(this,re,d),j&&f(this,ie,j),Y&&f(this,K,Y),B&&f(this,ne,B),g&&f(this,oe,g),f(this,ae,u(this,$,Ae).call(this,h,P))}whenSetUp(){return s(this,ae)}async handleConfirm(e){this.confirmResponse=e,this.beginAt=f(this,Q,Date.now()),await s(this,re)?.call(...s(this,T),this),s(this,z).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,J).delete(this.id),this.progress!==1&&(this.progress=1,await s(this,K)?.call(...s(this,T),this)),s(this,ne)?.call(...s(this,T),this)}throw(e){s(this,J).delete(this.id),this.error=new Error(e),s(this,oe)?.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,J=new WeakMap,re=new WeakMap,ie=new WeakMap,K=new WeakMap,ne=new WeakMap,oe=new WeakMap,ae=new WeakMap,z=new WeakMap,Q=new WeakMap,V=new WeakMap,G=new WeakMap,$=new WeakSet,Ae=async function(e,t){for(let[i,o,h]of this.constructor.types)if(this.type===i||o(this.data)){this.type=i,f(this,z,h);break}if(this.type)await s(this,z).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})},Te=async function(){let e=s(this,V).shift(),t=e.length;s(this,z).transformChunk&&(e=await s(this,z).transformChunk.call(this,e)),this.ws.sendMessage(l.chunk,this.id,e,t);let i=Date.now();this.bytesPerMs=t/(i-s(this,Q)),f(this,Q,i),this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size),await s(this,ie)?.call(...s(this,T),this),s(this,V).length?u(this,$,Te).call(this):(f(this,G,!1),this.senderProgress===1&&this.sent())},r(b,"types",[["object",e=>typeof e=="object",{setup(){this.stringStreamer=new _(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 _(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 _(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]]),r(b,"chunkSize",Re);var C,ue,he=class{constructor(e){a(this,C,new Map);a(this,ue,{delete:e=>s(this,C).delete(e)});e.isWebSocketServer?(e.on(`client-message:${l.confirm}`,(t,...i)=>this.handleConfirm(t,...i)),e.on(`client-message:${l.progress}`,(t,...i)=>this.handleProgress(t,...i)),e.on(`client-message:${l.completed}`,(t,...i)=>this.handleCompleted(t,...i)),e.on(`client-message:${l.error}`,(t,...i)=>this.handleError(t,...i)),Object.assign(e,{transfer:(t,i,o)=>this.transfer(t,i,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,i)=>this.transfer(e,t,i)}))}transfer(e,t,i){let{Transfer:o}=this.constructor,h=new o(e,t,i,s(this,ue));return s(this,C).set(h.id,h),h}handleConfirm(e,t,i){s(this,C).get(t)?.handleConfirm(i)}handleProgress(e,t,i){s(this,C).get(t)?.handleProgress(i)}handleCompleted(e,t){s(this,C).get(t)?.handleCompleted()}handleError(e,t,i){s(this,C).get(t)?.throw(i)}};C=new WeakMap,ue=new WeakMap,r(he,"Transfer",b);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 X,M,fe,Oe,de,pe=class{constructor(e,t={}){a(this,fe);r(this,"file");r(this,"size");r(this,"chunkSize");r(this,"fileReader");r(this,"listener");a(this,X,0);a(this,M,0);r(this,"isAborted",!1);a(this,de,async()=>{if(!this.isAborted){let e=this.fileReader.result;e.length=e.byteLength,await this.listener(e),s(this,M)<this.size&&(f(this,X,s(this,M)),u(this,fe,Oe).call(this))}});this.file=e,this.size=this.file.size;let{chunkSize:i=1024*256}=t;this.chunkSize=i,this.fileReader=new FileReader,this.fileReader.onload=s(this,de)}start(e){this.listener=e,u(this,fe,Oe).call(this)}abort(){this.isAborted=!0}};X=new WeakMap,M=new WeakMap,fe=new WeakSet,Oe=function(){this.isAborted||(f(this,M,Math.min(s(this,X)+this.chunkSize,this.size)),this.fileReader.readAsArrayBuffer(this.file.slice(s(this,X),s(this,M))))},de=new WeakMap;var me=class extends b{};r(me,"types",[["file",e=>typeof e=="object"&&e instanceof File,{setup(){let e=this.data;this.fileStreamer=new pe(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)}}],...b.types]);var be=class extends he{};r(be,"Transfer",me);export{ce as IncomingTransfer,xe as IncomingTransport,me as OutgoingTransfer,be as OutgoingTransport};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import{Readable as N}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"},P=10*1024*1024*1024,z=1024*256,I=250;var m=class{constructor(e,t,s,{type:r,collect:n,encoding:a,size:c,metadata:f},g,S){this.ws=e,this.#e=e.isWebSocket?[e]:[e.wss,e],this.kind=t,this.id=s,this.type=r,this.collect=!!n,this.encoding=a,this.size=c,this.metadata=f,this.#t=g,this.#s=S,this.#l=this.#c()}ws;#e;kind;id;type;collect;encoding;size;metadata;#t;#s;#l;data;#r;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#c(){if(this.#r=this.constructor.types[this.type],this.#r)await this.#r.setup.call(this);else throw new Error(`Unknown type of transfer "${String(this.type)}"`);this.confirm()}whenSetUp(){return this.#l}async confirm(){for(let{begin:e}of this.#s)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))},I)}handleChunk(e,t=e.length){let s=Date.now();this.bytesPerMs=t/(s-this.#o),this.#o=s,this.transferedSize+=t,this.#a.push([e,t]),this.#n||(this.#n=!0,this.#h())}async#h(){let[e,t]=this.#a.shift();this.#r.transformChunk&&(e=await this.#r.transformChunk.call(this,e)),this.collect&&await this.#r.collect.call(this,e);for(let{chunk:s,progress:r}of this.#s)await(s??r)?.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())}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||this.#u()}async#u(){this.progress=1,await this.#r.done?.call(this);for(let e of this.#s)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 s of this.#s)s.once&&this.#t.removeListener(this.kind,s),s.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 C=class{constructor(e,t={}){let{sizeLimit:s=P}=t;this.sizeLimit=s,e.isWebSocketServer?(e.on(`client-message:${o.request}`,(r,...n)=>this.handleRequest(r,...n)),e.on(`client-message:${o.chunk}`,(r,...n)=>this.handleChunk(r,...n)),e.on(`client-message:${o.sent}`,(r,...n)=>this.handleSent(r,...n)),e.on(`client-message:${o.abort}`,(r,...n)=>this.handleAbort(r,...n))):(e.on(`message:${o.request}`,(...r)=>this.handleRequest(e,...r)),e.on(`message:${o.chunk}`,(...r)=>this.handleChunk(e,...r)),e.on(`message:${o.sent}`,(...r)=>this.handleSent(e,...r)),e.on(`message:${o.abort}`,(...r)=>this.handleAbort(e,...r))),Object.assign(e,{onTransfer:(r,n,a)=>this.on(r,n,a),onceTransfer:(r,n,a)=>this.once(r,n,a)})}sizeLimit;#e=new Map;addTransferListener(e,t,s){return s?.once&&(t.once=!0),this.#e.get(e)?.add(t)??this.#e.set(e,new Set([t])),this}on=this.addTransferListener;once(e,t,s){return this.addTransferListener(e,t,{...s,once:!0})}removeTransferListener(e,t){if(t){let s=this.#e.get(e);s&&(s.delete(t),s.size||this.#e.delete(e))}else this.#e.delete(e);return this}off=this.removeTransferListener;#t=new Map;#s={delete:e=>this.#t.delete(e),removeListener:(e,t)=>this.removeTransferListener(e,t)};handleRequest(e,t,s,{type:r,size:n,metadata:a,...c}){let{Transfer:f}=this.constructor;this.#e.has(t)?this.#t.has(s)?e.sendMessage(o.error,s,"Transfer already exists"):r in f.types?n>this.sizeLimit?e.sendMessage(o.error,s,`Transfer size (${n} bytes) exeeds limit of ${this.sizeLimit} bytes`):this.#t.set(s,new f(e,t,s,{type:r,size:n,metadata:a,...c},this.#s,this.#e.get(t))):e.sendMessage(o.error,s,"Unknown type of transfer"):e.sendMessage(o.error,s,`Unknown kind of file "${t}"`)}handleChunk(e,t,s,r=s.length){this.#t.get(t)?.handleChunk(s,r)}handleSent(e,t){this.#t.get(t)?.handleSent()}handleAbort(e,t){this.#t.get(t)?.abort(!0)}static Transfer=m};var R=class extends N{constructor(e){super(),this.writable=e,this.promise=new Promise((t,s)=>{e.on("close",t),e.on("error",s)}),this.pipe(e)}writable;promise;_read(){}};function D(i){let e=new R(i);return this.streams?.push(e)??(this.streams=[e]),i}var A={setup(){this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0),this.collect&&(this.data=this.isBuffer?Buffer.from(""):""),this.pipeTo=D},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)}}},k=class extends m{streams;isBuffer=this.isBuffer||!1;pipeTo=this.pipeTo;static types={stream:A,file:A,...m.types}},$=class extends C{static Transfer=k};import L from"node:fs";import j from"node:path";import{Readable as H}from"node:stream";import _ from"mime";function T(){}function q(i,e=0,t={}){let{leading:s=!1,trailing:r=!0}=t,{maxWait:n=1/0}=t,a,c,f,g,S,p,h,W,O=async()=>{let y=Date.now();y>=f?(a=void 0,f=void 0,clearTimeout(c),typeof h=="function"&&await h(),l.resolve(W),l.promise.isResolved=!0,p=s):(clearTimeout(a),a=setTimeout(O,f-y))},x=Number.isFinite(n)?()=>{h===u&&(h=!1),u(),c=setTimeout(x,n)}:null;async function u(){return W=await i.apply(g,S)}s&&typeof s=="boolean"&&(s=u),p=s,r&&typeof r=="boolean"&&(r=u),h=r;let l=Object.assign(function(...y){return S=y,g=this,f=Date.now()+e,h=r,l.promise.isResolved&&(l.promise=Object.assign(new Promise(F=>{l.resolve=F,typeof p=="function"&&(p(),p=!1,h===u&&(h=!1)),a||(a=setTimeout(O,e),x&&(c=setTimeout(x,n)))}),{isResolved:!1})),l.promise},{callback:i,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:T,run:u,clear:async y=>{clearTimeout(a),a=void 0,clearTimeout(c),l.promise.isResolved=!0,l.resolve(y?await u():W)}});return l}q.noop=Object.assign(()=>{},{callback:T,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:T,run:T,clear:T});function M(i,e,t,s,r=!0){return Array.isArray(i)&&(i=i.length),typeof s!="string"&&(r=s??!0,s=t),(r?`${i}\xA0`:"")+M.raw(i,e,t,s)}M.raw=(i,e,t,s=t)=>{i=Math.abs(i);let r=i%10,n=i%100;return r===1&&n!==11?e:r>=2&&r<=4&&!(n>=12&&n<=15)?t:s};function E(i="",e=""){return`${i}${Date.now().toString(36)}${Math.round(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}${e}`}var b=class{constructor(e,t={}){this.string=e,this.size=this.string.length;let{chunkSize:s=1024*256}=t;this.chunkSize=s}string;size;chunkSize;listener;#e=0;#t=0;isAborted=!1;start(e){this.listener=e,this.#s()}async#s(){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.#s()))}}abort(){this.isAborted=!0}};var d=class{constructor(e,t,{data:s,type:r,incomingType:n,collect:a,metadata:c,size:f,chunkSize:g,encoding:S,incomingEncoding:p,onBegin:h,onSenderProgress:W,onProgress:O,onEnd:x,onError:u},l){this.ws=e,this.#e=e.isWebSocket?[e]:[e.wss,e],this.kind=t,this.data=s,this.type=r,this.collect=a??!1,this.metadata=c,this.size=f??null,this.encoding=S,this.chunkSize=g??this.constructor.chunkSize,this.#t=l,h&&(this.#s=h),W&&(this.#l=W),O&&(this.#r=O),x&&(this.#o=x),u&&(this.#a=u),this.#n=this.#u(n,p)}ws;#e;kind;data;type;collect;metadata;size;encoding;chunkSize;#t;#s;#l;#r;#o;#a;#n;id=E();#i;isAborted=!1;isTransfered=!1;confirmResponse;beginAt=null;#f=null;#c=[];#h=!1;duration=null;transferedSize=0;bytesPerMs=null;senderProgress=0;progress=0;endAt=null;error=null;stringStreamer;fileStreamer;async#u(e,t){for(let[s,r,n]of this.constructor.types)if(this.type===s||r(this.data)){this.type=s,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.#s?.call(...this.#e,this),this.#i.confirm.call(this)}handleChunk=e=>{this.#c.push(e),this.#h||(this.#h=!0,this.#p())};async#p(){let e=this.#c.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 s=Date.now();this.bytesPerMs=t/(s-this.#f),this.#f=s,this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size),await this.#l?.call(...this.#e,this),this.#c.length?this.#p():(this.#h=!1,this.senderProgress===1&&this.sent())}sent=()=>this.ws.sendMessage(o.sent,this.id);handleProgress(e){this.progress=e,this.#r?.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.#r?.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 b(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 b(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 b(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]];static chunkSize=z};var v=class{constructor(e){e.isWebSocketServer?(e.on(`client-message:${o.confirm}`,(t,...s)=>this.handleConfirm(t,...s)),e.on(`client-message:${o.progress}`,(t,...s)=>this.handleProgress(t,...s)),e.on(`client-message:${o.completed}`,(t,...s)=>this.handleCompleted(t,...s)),e.on(`client-message:${o.error}`,(t,...s)=>this.handleError(t,...s)),Object.assign(e,{transfer:(t,s,r)=>this.transfer(t,s,r)})):(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,s)=>this.transfer(e,t,s)}))}#e=new Map;#t={delete:e=>this.#e.delete(e)};transfer(e,t,s){let{Transfer:r}=this.constructor,n=new r(e,t,s,this.#t);return this.#e.set(n.id,n),n}handleConfirm(e,t,s){this.#e.get(t)?.handleConfirm(s)}handleProgress(e,t,s){this.#e.get(t)?.handleProgress(s)}handleCompleted(e,t){this.#e.get(t)?.handleCompleted()}handleError(e,t,s){this.#e.get(t)?.throw(s)}static Transfer=d};var w=class extends d{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"&&/^(\/|(\/[^/]+)+)$/.test(e),{async setup(){let e=this.data,t=j.basename(e),{size:s,mtimeMs:r}=await L.promises.stat(e),n={name:t,type:_.getType(j.extname(t).slice(1)),size:s,modifiedAt:r};this.stream=L.createReadStream(e),this.size=s,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")}}],...d.types]},B=class extends v{static Transfer=w};export{k as IncomingTransfer,$ as IncomingTransport,k as NodeIncomingTransfer,w as OutgoingTransfer,B as OutgoingTransport};
1
+ import{Readable as N}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"},P=10*1024*1024*1024,z=1024*256,I=250;var m=class{constructor(e,t,s,{type:r,collect:n,encoding:a,size:c,metadata:f},g,S){this.ws=e,this.#e=e.isWebSocket?[e]:[e.wss,e],this.kind=t,this.id=s,this.type=r,this.collect=!!n,this.encoding=a,this.size=c,this.metadata=f,this.#t=g,this.#s=S,this.#l=this.#c()}ws;#e;kind;id;type;collect;encoding;size;metadata;#t;#s;#l;data;#r;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#c(){if(this.#r=this.constructor.types[this.type],this.#r)await this.#r.setup.call(this);else throw new Error(`Unknown type of transfer "${String(this.type)}"`);this.confirm()}whenSetUp(){return this.#l}async confirm(){for(let{begin:e}of this.#s)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))},I)}handleChunk(e,t=e.length){let s=Date.now();this.bytesPerMs=t/(s-this.#o),this.#o=s,this.transferedSize+=t,this.#a.push([e,t]),this.#n||(this.#n=!0,this.#h())}async#h(){let[e,t]=this.#a.shift();this.#r.transformChunk&&(e=await this.#r.transformChunk.call(this,e)),this.collect&&await this.#r.collect.call(this,e);for(let{chunk:s,progress:r}of this.#s)await(s??r)?.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())}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||this.#u()}async#u(){this.progress=1,await this.#r.done?.call(this);for(let e of this.#s)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 s of this.#s)s.once&&this.#t.removeListener(this.kind,s),s.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 C=class{constructor(e,t={}){let{sizeLimit:s=P}=t;this.sizeLimit=s,e.isWebSocketServer?(e.on(`client-message:${o.request}`,(r,...n)=>this.handleRequest(r,...n)),e.on(`client-message:${o.chunk}`,(r,...n)=>this.handleChunk(r,...n)),e.on(`client-message:${o.sent}`,(r,...n)=>this.handleSent(r,...n)),e.on(`client-message:${o.abort}`,(r,...n)=>this.handleAbort(r,...n))):(e.on(`message:${o.request}`,(...r)=>this.handleRequest(e,...r)),e.on(`message:${o.chunk}`,(...r)=>this.handleChunk(e,...r)),e.on(`message:${o.sent}`,(...r)=>this.handleSent(e,...r)),e.on(`message:${o.abort}`,(...r)=>this.handleAbort(e,...r))),Object.assign(e,{onTransfer:(r,n,a)=>this.on(r,n,a),onceTransfer:(r,n,a)=>this.once(r,n,a)})}sizeLimit;#e=new Map;addTransferListener(e,t,s){return s?.once&&(t.once=!0),this.#e.get(e)?.add(t)??this.#e.set(e,new Set([t])),this}on=this.addTransferListener;once(e,t,s){return this.addTransferListener(e,t,{...s,once:!0})}removeTransferListener(e,t){if(t){let s=this.#e.get(e);s&&(s.delete(t),s.size||this.#e.delete(e))}else this.#e.delete(e);return this}off=this.removeTransferListener;#t=new Map;#s={delete:e=>this.#t.delete(e),removeListener:(e,t)=>this.removeTransferListener(e,t)};handleRequest(e,t,s,{type:r,size:n,metadata:a,...c}){let{Transfer:f}=this.constructor;this.#e.has(t)?this.#t.has(s)?e.sendMessage(o.error,s,"Transfer already exists"):r in f.types?n>this.sizeLimit?e.sendMessage(o.error,s,`Transfer size (${n} bytes) exeeds limit of ${this.sizeLimit} bytes`):this.#t.set(s,new f(e,t,s,{type:r,size:n,metadata:a,...c},this.#s,this.#e.get(t))):e.sendMessage(o.error,s,"Unknown type of transfer"):e.sendMessage(o.error,s,`Unknown kind of file "${t}"`)}handleChunk(e,t,s,r=s.length){this.#t.get(t)?.handleChunk(s,r)}handleSent(e,t){this.#t.get(t)?.handleSent()}handleAbort(e,t){this.#t.get(t)?.abort(!0)}static Transfer=m};var R=class extends N{constructor(e){super(),this.writable=e,this.promise=new Promise((t,s)=>{e.on("close",t),e.on("error",s)}),this.pipe(e)}writable;promise;_read(){}};function D(i){let e=new R(i);return this.streams?.push(e)??(this.streams=[e]),i}var A={setup(){this.encoding||(this.encoding="buffer"),this.encoding==="buffer"&&(this.isBuffer=!0),this.collect&&(this.data=this.isBuffer?Buffer.from(""):""),this.pipeTo=D},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)}}},k=class extends m{streams;isBuffer=this.isBuffer||!1;pipeTo=this.pipeTo;static types={stream:A,file:A,...m.types}},$=class extends C{static Transfer=k};import L from"node:fs";import j from"node:path";import{Readable as H}from"node:stream";import _ from"mime";function T(){}function q(i,e=0,t={}){let{leading:s=!1,trailing:r=!0}=t,{maxWait:n=1/0}=t,a,c,f,g,S,p,h,W,O=async()=>{let x=Date.now();x>=f?(a=void 0,f=void 0,clearTimeout(c),typeof h=="function"&&await h(),l.resolve(W),l.promise.isResolved=!0,p=s):(clearTimeout(a),a=setTimeout(O,f-x))},y=Number.isFinite(n)?()=>{h===u&&(h=!1),u(),c=setTimeout(y,n)}:null;async function u(){return W=await i.apply(g,S)}s&&typeof s=="boolean"&&(s=u),p=s,r&&typeof r=="boolean"&&(r=u),h=r;let l=Object.assign(function(...x){return S=x,g=this,f=Date.now()+e,h=r,l.promise.isResolved&&(l.promise=Object.assign(new Promise(F=>{l.resolve=F,typeof p=="function"&&(p(),p=!1,h===u&&(h=!1)),a||(a=setTimeout(O,e),y&&(c=setTimeout(y,n)))}),{isResolved:!1})),l.promise},{callback:i,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:T,run:u,clear:async x=>{clearTimeout(a),a=void 0,clearTimeout(c),l.promise.isResolved=!0,l.resolve(x?await u():W)}});return l}q.noop=Object.assign(()=>{},{callback:T,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:T,run:T,clear:T});function M(i,e,t,s,r=!0){return Array.isArray(i)&&(i=i.length),typeof s!="string"&&(r=s??!0,s=t),(r?`${i}\xA0`:"")+M.raw(i,e,t,s)}M.raw=(i,e,t,s=t)=>{i=Math.abs(i);let r=i%10,n=i%100;return r===1&&n!==11?e:r>=2&&r<=4&&!(n>=12&&n<=15)?t:s};function E(i="",e=""){return`${i}${Date.now().toString(36)}${Math.round(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}${e}`}var b=class{constructor(e,t={}){this.string=e,this.size=this.string.length;let{chunkSize:s=1024*256}=t;this.chunkSize=s}string;size;chunkSize;listener;#e=0;#t=0;isAborted=!1;start(e){this.listener=e,this.#s()}async#s(){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.#s()))}}abort(){this.isAborted=!0}};var d=class{constructor(e,t,{data:s,type:r,incomingType:n,collect:a,metadata:c,size:f,chunkSize:g,encoding:S,incomingEncoding:p,onBegin:h,onSenderProgress:W,onProgress:O,onEnd:y,onError:u},l){this.ws=e,this.#e=e.isWebSocket?[e]:[e.wss,e],this.kind=t,this.data=s,this.type=r,this.collect=a??!1,this.metadata=c,this.size=f??null,this.encoding=S,this.chunkSize=g??this.constructor.chunkSize,this.#t=l,h&&(this.#s=h),W&&(this.#l=W),O&&(this.#r=O),y&&(this.#o=y),u&&(this.#a=u),this.#n=this.#u(n,p)}ws;#e;kind;data;type;collect;metadata;size;encoding;chunkSize;#t;#s;#l;#r;#o;#a;#n;id=E();#i;isAborted=!1;isTransfered=!1;confirmResponse;beginAt=null;#f=null;#c=[];#h=!1;duration=null;transferedSize=0;bytesPerMs=null;senderProgress=0;progress=0;endAt=null;error=null;stringStreamer;fileStreamer;async#u(e,t){for(let[s,r,n]of this.constructor.types)if(this.type===s||r(this.data)){this.type=s,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.#s?.call(...this.#e,this),this.#i.confirm.call(this)}handleChunk=e=>{this.#c.push(e),this.#h||(this.#h=!0,this.#p())};async#p(){let e=this.#c.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 s=Date.now();this.bytesPerMs=t/(s-this.#f),this.#f=s,this.transferedSize+=t,this.size&&(this.senderProgress=this.transferedSize/this.size),await this.#l?.call(...this.#e,this),this.#c.length?this.#p():(this.#h=!1,this.senderProgress===1&&this.sent())}sent=()=>this.ws.sendMessage(o.sent,this.id);handleProgress(e){this.progress=e,this.#r?.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.#r?.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 b(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 b(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 b(this.data,{chunkSize:this.chunkSize}),this.size=this.stringStreamer.size,this.encoding||(this.encoding="utf8")},confirm(){this.stringStreamer.start(this.handleChunk)}}]];static chunkSize=z};var v=class{constructor(e){e.isWebSocketServer?(e.on(`client-message:${o.confirm}`,(t,...s)=>this.handleConfirm(t,...s)),e.on(`client-message:${o.progress}`,(t,...s)=>this.handleProgress(t,...s)),e.on(`client-message:${o.completed}`,(t,...s)=>this.handleCompleted(t,...s)),e.on(`client-message:${o.error}`,(t,...s)=>this.handleError(t,...s)),Object.assign(e,{transfer:(t,s,r)=>this.transfer(t,s,r)})):(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,s)=>this.transfer(e,t,s)}))}#e=new Map;#t={delete:e=>this.#e.delete(e)};transfer(e,t,s){let{Transfer:r}=this.constructor,n=new r(e,t,s,this.#t);return this.#e.set(n.id,n),n}handleConfirm(e,t,s){this.#e.get(t)?.handleConfirm(s)}handleProgress(e,t,s){this.#e.get(t)?.handleProgress(s)}handleCompleted(e,t){this.#e.get(t)?.handleCompleted()}handleError(e,t,s){this.#e.get(t)?.throw(s)}static Transfer=d};var w=class extends d{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"&&/^(\/|(\/[^/]+)+)$/.test(e),{async setup(){let e=this.data,t=j.basename(e),{size:s,mtimeMs:r}=await L.promises.stat(e),n={name:t,type:_.getType(j.extname(t).slice(1)),size:s,modifiedAt:r};this.stream=L.createReadStream(e),this.size=s,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")}}],...d.types]},B=class extends v{static Transfer=w};export{k as IncomingTransfer,$ as IncomingTransport,k as NodeIncomingTransfer,w as OutgoingTransfer,B as OutgoingTransport};
2
2
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "insite-ws-transfers",
3
- "version": "2.2.2",
3
+ "version": "2.2.3",
4
4
  "description": "inSite file transfers over WebSockets",
5
5
  "type": "module",
6
6
  "main": "./dist/node/index.js",
@@ -10,7 +10,7 @@
10
10
  "./node": "./dist/node/index.js",
11
11
  "./browser": "./dist/browser/index.js"
12
12
  },
13
- "packageManager": "bun@1.2.7",
13
+ "packageManager": "bun@1.2.9",
14
14
  "scripts": {
15
15
  "test": "echo \"Error: no test specified\" && exit 1",
16
16
  "build": "bun .conveyer.js",
@@ -30,15 +30,15 @@
30
30
  "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
31
31
  "license": "MIT",
32
32
  "dependencies": {
33
- "@nesvet/n": "^1.1.28",
34
- "insite-ws": "^2.2.2",
35
- "mime": "^4.0.6"
33
+ "@nesvet/n": "^1.1.29",
34
+ "insite-ws": "^2.2.3",
35
+ "mime": "^4.0.7"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@nesvet/conveyer": "^2.5.1",
39
- "@nesvet/eslint-config": "^2.0.51",
40
- "@types/node": "^22.13.14",
41
- "@types/ws": "^8.18.0",
42
- "typescript": "^5.8.2"
39
+ "@nesvet/eslint-config": "^2.0.52",
40
+ "@types/node": "^22.14.1",
41
+ "@types/ws": "^8.18.1",
42
+ "typescript": "^5.8.3"
43
43
  }
44
44
  }