rsocket-browser
Version:
The RSocket client implementation over websocket with browser compatibility based on Uint8Array
2 lines • 6 kB
JavaScript
"use strict";var E=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var f=(d,e)=>{for(var s in e)E(d,s,{get:e[s],enumerable:!0})},P=(d,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of F(e))!N.call(d,o)&&o!==s&&E(d,o,{get:()=>e[o],enumerable:!(r=x(e,o))||r.enumerable});return d};var A=d=>P(E({},"__esModule",{value:!0}),d);var R={};f(R,{Connection:()=>v});module.exports=A(R);var a=require("reactor-core-ts"),t=require("rsocket-frames-ts");var y=require("reactor-core-ts"),h=class{constructor(){this.sink=y.Sinks.many().multicast();this.handlers=new Map;this.subscription=y.Flux.from(this.sink).subscribe({onNext:e=>this.handlers.get("next")?.forEach?.(s=>s(e)),onError:e=>this.handlers.get("error")?.forEach?.(s=>s(e)),onComplete:()=>this.handlers.get("complete")?.forEach?.(e=>e())})}addEmitHandler(e,s){let r=this.handlers.get(e)||new Set;r.add(s),this.handlers.set(e,r)}removeEmitHandler(e,s){this.handlers.get(e)?.delete?.(s)}next(e){this.sink.next(e)}error(e){this.sink.error(e)}complete(){this.sink.complete()}subscribe(e){return this.sink.subscribe(e)}unsubscribe(){this.subscription.unsubscribe()}request(e){this.subscription.request(e)}};var v=class{constructor(e,s,r){this.options=e;this.requests=new h;this.responses=new h;this._streamId=-1;this.websocket(),this.setup(s,r),this.keepAlive()}get streamId(){return this._streamId+=2}fireAndForget(e,s){this.normalize(e,s).subscribe({onNext:({metadata:r,payload:o})=>this.requests.next(new t.RequestFireAndForgetFrame(this.streamId,t.FireAndForgetFlag.NONE,r,o))}).request(1)}requestResponse(e,s){return this.normalize(e,s).flatMap(({metadata:r,payload:o})=>{let u=this.streamId;return this.requests.next(new t.RequestResponseFrame(u,t.RequestResponseFlag.NONE,r,o)),a.Flux.from(this.responses).filter(n=>n.header.streamId==u).mapNotNull(n=>n.payload?.payload).first().cast()})}requestStream(e,s){return this.normalize(e,s).flatMapMany(({metadata:r,payload:o})=>{let u=this.streamId;this.requests.next(new t.RequestStreamFrame(u,t.RequestStreamFlag.NONE,0,r,o));let n=a.Sinks.many().multicast(),p=!1,c=a.Flux.from(this.responses).filter(l=>(l.type==t.FrameType.PAYLOAD||l.type==t.FrameType.CANCEL)&&l.header.streamId==u).cast().subscribe({onNext:l=>{if(l.type==t.FrameType.CANCEL)c.unsubscribe(),n.complete();else{if(l.isNext()){let m=l.payload?.payload;m!=null&&n.next(m)}l.isComplete()&&(p=!0,n.complete())}},onComplete:()=>{n.complete()}});return a.Flux.from(n).doOnSubscribe(l=>{c.request(Number.MAX_SAFE_INTEGER);let m=l.request;l.request=b=>{m(b),this.requests.next(new t.RequestNFrame(u,b))};let i=l.unsubscribe;l.unsubscribe=()=>{i(),p||this.requests.next(new t.CancelFrame(u)),c.unsubscribe()}})})}requestChannel(e,s,r){return this.normalize(s,r).flatMapMany(({metadata:o,payload:u})=>{let n=this.streamId;this.requests.next(new t.RequestChannelFrame(n,t.RequestChannelFlag.NONE,0,o,u));let p=e.subscribe({onNext:i=>{this.requests.next(new t.PayloadFrame(n,t.PayloadFlag.NEXT,void 0,this.options.setup.mimetype.payload.toPayload(i)))},onComplete:()=>{this.requests.next(new t.PayloadFrame(n,t.PayloadFlag.COMPLETE))}}),c=a.Sinks.many().multicast(),l=!1,m=a.Flux.from(this.responses).filter(i=>(i.type==t.FrameType.CANCEL||i.type==t.FrameType.PAYLOAD||i.type==t.FrameType.REQUEST_N)&&i.header.streamId==n).map(i=>{let b=i?.payload?.payload;switch(i.type){case t.FrameType.PAYLOAD:{i.isFlagSet(t.PayloadFlag.NEXT)&&c.next(b),i.isFlagSet(t.PayloadFlag.COMPLETE)&&(l=!0,c.complete());break}case t.FrameType.CANCEL:{p.unsubscribe();break}case t.FrameType.REQUEST_N:{p.request(Number(b));break}}}).subscribe();return a.Flux.from(c).doOnSubscribe(i=>{m.request(Number.MAX_SAFE_INTEGER);let b=i.request;i.request=M=>{b(M),this.requests.next(new t.RequestNFrame(n,M))};let q=i.unsubscribe;i.unsubscribe=()=>{q(),l||this.requests.next(new t.CancelFrame(n)),m.unsubscribe()}})})}metadataPush(e){e.subscribe({onNext:s=>this.requests.next(new t.MetadataPushFrame(s))}).request(1)}disconnect(){this.requests.complete()}websocket(){let e=new WebSocket(this.options.url);e.binaryType="arraybuffer",e.addEventListener("open",s=>{console.debug("websocket open event",e),this.requests.addEmitHandler("next",r=>{console.debug("websocket send event",r,r.toUint8Array()),e.send(r.toUint8Array())}),this.requests.addEmitHandler("complete",()=>{e.close()}),this.requests.request(Number.MAX_SAFE_INTEGER)}),e.addEventListener("error",s=>{console.debug("websocket error event",e,s)}),e.addEventListener("close",s=>{console.debug("websocket close event",e,s),this.responses.complete()}),e.addEventListener("message",s=>{this.responses.next(t.FrameDeserializer.deserialize(new Uint8Array(s.data),this.options.setup.mimetype.metadata,this.options.setup.mimetype.payload))})}setup(e,s){this.normalize(e,s).subscribe({onNext:({metadata:r,payload:o})=>{let u=this.options.setup,n=u.mimetype,p=u.version;this.requests.next(new t.SetupFrame(u.keepAlive,u.lifetime,n.metadata,n.payload,void 0,p?.major,p?.minor,t.SetupFlag.NONE,r,o))}}).request(1)}keepAlive(){let e=new t.KeepaliveFrame(t.KeepaliveFlag.RESPOND),s=new t.KeepaliveFrame,r=[];a.Flux.from(this.responses).filter(o=>o.type==t.FrameType.KEEPALIVE).cast().doOnNext(o=>{o.isRequireRespond()?this.requests.next(s):(r.pop()?.cancel?.(),r.push(a.Schedulers.delay(this.options.setup.keepAlive).schedule(()=>{r.pop(),r.push(a.Schedulers.delay(this.options.setup.lifetime).schedule(()=>{r.pop(),this.disconnect()})),this.requests.next(e)})))}).doFinally(()=>r.forEach(o=>o.cancel())).subscribe().request(Number.MAX_SAFE_INTEGER),this.responses.next(s)}normalize(e,s){return(e||a.Mono.empty()).switchIfEmpty(a.Mono.just(0).cast()).zipWith((s||a.Mono.empty()).switchIfEmpty(a.Mono.just(0).cast())).map(r=>{let o=this.options.setup.mimetype;return{metadata:r[0]?o.metadata.toMetadata(r[0]):void 0,payload:r[1]?o.payload.toPayload(r[1]):void 0}})}};0&&(module.exports={Connection});
//# sourceMappingURL=index.js.map