Odoo GraphQL Subscription using Node, Express JS for Sample
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1 lines
11 KiB

!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?o(exports):"function"==typeof define&&define.amd?define(["exports"],o):o((e="undefined"!=typeof globalThis?globalThis:e||self).graphqlWs={})}(this,(function(e){"use strict";function o(e){return this instanceof o?(this.v=e,this):new o(e)}function t(e,t,r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n,s=r.apply(e,t||[]),i=[];return n={},a("next"),a("throw"),a("return"),n[Symbol.asyncIterator]=function(){return this},n;function a(e){s[e]&&(n[e]=function(o){return new Promise((function(t,r){i.push([e,o,t,r])>1||l(e,o)}))})}function l(e,t){try{(r=s[e](t)).value instanceof o?Promise.resolve(r.value.v).then(c,p):d(i[0][2],r)}catch(e){d(i[0][3],e)}var r}function c(e){l("next",e)}function p(e){l("throw",e)}function d(e,o){e(o),i.shift(),i.length&&l(i[0][0],i[0][1])}}function r(e){return null===e?"null":Array.isArray(e)?"array":typeof e}function n(e){return"object"===r(e)}function s(e,o){return e.length<124?e:o}const i="graphql-transport-ws";var a,l;function c(o){if(!n(o))throw new Error(`Message is expected to be an object, but got ${r(o)}`);if(!o.type)throw new Error("Message is missing the 'type' property");if("string"!=typeof o.type)throw new Error(`Message is expects the 'type' property to be a string, but got ${r(o.type)}`);switch(o.type){case e.MessageType.ConnectionInit:case e.MessageType.ConnectionAck:case e.MessageType.Ping:case e.MessageType.Pong:if(null!=o.payload&&!n(o.payload))throw new Error(`"${o.type}" message expects the 'payload' property to be an object or nullish or missing, but got "${o.payload}"`);break;case e.MessageType.Subscribe:if("string"!=typeof o.id)throw new Error(`"${o.type}" message expects the 'id' property to be a string, but got ${r(o.id)}`);if(!o.id)throw new Error(`"${o.type}" message requires a non-empty 'id' property`);if(!n(o.payload))throw new Error(`"${o.type}" message expects the 'payload' property to be an object, but got ${r(o.payload)}`);if("string"!=typeof o.payload.query)throw new Error(`"${o.type}" message payload expects the 'query' property to be a string, but got ${r(o.payload.query)}`);if(null!=o.payload.variables&&!n(o.payload.variables))throw new Error(`"${o.type}" message payload expects the 'variables' property to be a an object or nullish or missing, but got ${r(o.payload.variables)}`);if(null!=o.payload.operationName&&"string"!==r(o.payload.operationName))throw new Error(`"${o.type}" message payload expects the 'operationName' property to be a string or nullish or missing, but got ${r(o.payload.operationName)}`);if(null!=o.payload.extensions&&!n(o.payload.extensions))throw new Error(`"${o.type}" message payload expects the 'extensions' property to be a an object or nullish or missing, but got ${r(o.payload.extensions)}`);break;case e.MessageType.Next:if("string"!=typeof o.id)throw new Error(`"${o.type}" message expects the 'id' property to be a string, but got ${r(o.id)}`);if(!o.id)throw new Error(`"${o.type}" message requires a non-empty 'id' property`);if(!n(o.payload))throw new Error(`"${o.type}" message expects the 'payload' property to be an object, but got ${r(o.payload)}`);break;case e.MessageType.Error:if("string"!=typeof o.id)throw new Error(`"${o.type}" message expects the 'id' property to be a string, but got ${r(o.id)}`);if(!o.id)throw new Error(`"${o.type}" message requires a non-empty 'id' property`);if(t=o.payload,!(Array.isArray(t)&&t.length>0&&t.every((e=>"message"in e))))throw new Error(`"${o.type}" message expects the 'payload' property to be an array of GraphQL errors, but got ${JSON.stringify(o.payload)}`);break;case e.MessageType.Complete:if("string"!=typeof o.id)throw new Error(`"${o.type}" message expects the 'id' property to be a string, but got ${r(o.id)}`);if(!o.id)throw new Error(`"${o.type}" message requires a non-empty 'id' property`);break;default:throw new Error(`Invalid message 'type' property "${o.type}"`)}var t;return o}function p(e,o){return c("string"==typeof e?JSON.parse(e,o):e)}function d(e,o){return c(e),JSON.stringify(e,o)}e.CloseCode=void 0,(a=e.CloseCode||(e.CloseCode={}))[a.InternalServerError=4500]="InternalServerError",a[a.InternalClientError=4005]="InternalClientError",a[a.BadRequest=4400]="BadRequest",a[a.BadResponse=4004]="BadResponse",a[a.Unauthorized=4401]="Unauthorized",a[a.Forbidden=4403]="Forbidden",a[a.SubprotocolNotAcceptable=4406]="SubprotocolNotAcceptable",a[a.ConnectionInitialisationTimeout=4408]="ConnectionInitialisationTimeout",a[a.ConnectionAcknowledgementTimeout=4504]="ConnectionAcknowledgementTimeout",a[a.SubscriberAlreadyExists=4409]="SubscriberAlreadyExists",a[a.TooManyInitialisationRequests=4429]="TooManyInitialisationRequests",e.MessageType=void 0,(l=e.MessageType||(e.MessageType={})).ConnectionInit="connection_init",l.ConnectionAck="connection_ack",l.Ping="ping",l.Pong="pong",l.Subscribe="subscribe",l.Next="next",l.Error="error",l.Complete="complete";class y extends Error{constructor(){super(...arguments),this.name="TerminatedCloseEvent",this.message="4499: Terminated",this.code=4499,this.reason="Terminated",this.wasClean=!1}}function u(e){return n(e)&&"code"in e&&"reason"in e}e.DEPRECATED_GRAPHQL_WS_PROTOCOL="graphql-ws",e.GRAPHQL_TRANSPORT_WS_PROTOCOL=i,e.TerminatedCloseEvent=y,e.createClient=function(r){const{url:n,connectionParams:a,lazy:l=!0,onNonLazyError:c=console.error,lazyCloseTimeout:g=0,keepAlive:f=0,disablePong:m,connectionAckWaitTimeout:h=0,retryAttempts:w=5,retryWait:b=async function(e){let o=1e3;for(let t=0;t<e;t++)o*=2;await new Promise((e=>setTimeout(e,o+Math.floor(2700*Math.random()+300))))},shouldRetry:x=u,isFatalConnectionProblem:C,on:v,webSocketImpl:E,generateID:T=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(e=>{const o=16*Math.random()|0;return("x"==e?o:3&o|8).toString(16)}))},jsonMessageReplacer:S,jsonMessageReviver:M}=r;let $;if(E){if(!("function"==typeof(P=E)&&"constructor"in P&&"CLOSED"in P&&"CLOSING"in P&&"CONNECTING"in P&&"OPEN"in P))throw new Error("Invalid WebSocket implementation provided");$=E}else"undefined"!=typeof WebSocket?$=WebSocket:"undefined"!=typeof global?$=global.WebSocket||global.MozWebSocket:"undefined"!=typeof window&&($=window.WebSocket||window.MozWebSocket);var P;if(!$)throw new Error("WebSocket implementation missing; on Node you can `import WebSocket from 'ws';` and pass `webSocketImpl: WebSocket` to `createClient`");const I=$,N=(()=>{const e=(()=>{const e={};return{on:(o,t)=>(e[o]=t,()=>{delete e[o]}),emit(o){var t;"id"in o&&(null===(t=e[o.id])||void 0===t||t.call(e,o))}}})(),o={connecting:(null==v?void 0:v.connecting)?[v.connecting]:[],opened:(null==v?void 0:v.opened)?[v.opened]:[],connected:(null==v?void 0:v.connected)?[v.connected]:[],ping:(null==v?void 0:v.ping)?[v.ping]:[],pong:(null==v?void 0:v.pong)?[v.pong]:[],message:(null==v?void 0:v.message)?[e.emit,v.message]:[e.emit],closed:(null==v?void 0:v.closed)?[v.closed]:[],error:(null==v?void 0:v.error)?[v.error]:[]};return{onMessage:e.on,on(e,t){const r=o[e];return r.push(t),()=>{r.splice(r.indexOf(t),1)}},emit(e,...t){for(const r of[...o[e]])r(...t)}}})();function k(e){const o=[N.on("error",(t=>{o.forEach((e=>e())),e(t)})),N.on("closed",(t=>{o.forEach((e=>e())),e(t)}))]}let A,O,R=0,q=!1,W=0,j=!1;async function L(){clearTimeout(O);const[o,t]=await(null!=A?A:A=new Promise(((o,t)=>(async()=>{if(q){if(await b(W),!R)return A=void 0,t({code:1e3,reason:"All Subscriptions Gone"});W++}N.emit("connecting",q);const r=new I("function"==typeof n?await n():n,i);let l,c;function u(){isFinite(f)&&f>0&&(clearTimeout(c),c=setTimeout((()=>{r.readyState===I.OPEN&&(r.send(d({type:e.MessageType.Ping})),N.emit("ping",!1,void 0))}),f))}k((e=>{A=void 0,clearTimeout(l),clearTimeout(c),t(e),e instanceof y&&(r.close(4499,"Terminated"),r.onerror=null,r.onclose=null)})),r.onerror=e=>N.emit("error",e),r.onclose=e=>N.emit("closed",e),r.onopen=async()=>{try{N.emit("opened",r);const o="function"==typeof a?await a():a;if(r.readyState!==I.OPEN)return;r.send(d(o?{type:e.MessageType.ConnectionInit,payload:o}:{type:e.MessageType.ConnectionInit},S)),isFinite(h)&&h>0&&(l=setTimeout((()=>{r.close(e.CloseCode.ConnectionAcknowledgementTimeout,"Connection acknowledgement timeout")}),h)),u()}catch(o){N.emit("error",o),r.close(e.CloseCode.InternalClientError,s(o instanceof Error?o.message:new Error(o).message,"Internal client error"))}};let g=!1;r.onmessage=({data:t})=>{try{const n=p(t,M);if(N.emit("message",n),"ping"===n.type||"pong"===n.type)return N.emit(n.type,!0,n.payload),void("pong"===n.type?u():m||(r.send(d(n.payload?{type:e.MessageType.Pong,payload:n.payload}:{type:e.MessageType.Pong})),N.emit("pong",!1,n.payload)));if(g)return;if(n.type!==e.MessageType.ConnectionAck)throw new Error(`First message cannot be of type ${n.type}`);clearTimeout(l),g=!0,N.emit("connected",r,n.payload,q),q=!1,W=0,o([r,new Promise(((e,o)=>k(o)))])}catch(o){r.onmessage=null,N.emit("error",o),r.close(e.CloseCode.BadResponse,s(o instanceof Error?o.message:new Error(o).message,"Bad response"))}}})())));o.readyState===I.CLOSING&&await t;let r=()=>{};const l=new Promise((e=>r=e));return[o,r,Promise.race([l.then((()=>{if(!R){const e=()=>o.close(1e3,"Normal Closure");isFinite(g)&&g>0?O=setTimeout((()=>{o.readyState===I.OPEN&&e()}),g):e()}})),t])]}function z(o){if(u(o)&&(t=o.code,![1e3,1001,1006,1005,1012,1013,1014].includes(t)&&t>=1e3&&t<=1999||[e.CloseCode.InternalServerError,e.CloseCode.InternalClientError,e.CloseCode.BadRequest,e.CloseCode.BadResponse,e.CloseCode.Unauthorized,e.CloseCode.SubprotocolNotAcceptable,e.CloseCode.SubscriberAlreadyExists,e.CloseCode.TooManyInitialisationRequests].includes(o.code)))throw o;var t;if(j)return!1;if(u(o)&&1e3===o.code)return R>0;if(!w||W>=w)throw o;if(!x(o))throw o;if(null==C?void 0:C(o))throw o;return q=!0}function B(o,t){const r=T(o);let n=!1,s=!1,i=()=>{R--,n=!0};return(async()=>{for(R++;;)try{const[a,l,c]=await L();if(n)return l();const p=N.onMessage(r,(o=>{switch(o.type){case e.MessageType.Next:return void t.next(o.payload);case e.MessageType.Error:return s=!0,n=!0,t.error(o.payload),void i();case e.MessageType.Complete:return n=!0,void i()}}));return a.send(d({id:r,type:e.MessageType.Subscribe,payload:o},S)),i=()=>{n||a.readyState!==I.OPEN||a.send(d({id:r,type:e.MessageType.Complete},S)),R--,n=!0,l()},void await c.finally(p)}catch(e){if(!z(e))return}})().then((()=>{s||t.complete()})).catch((e=>{t.error(e)})),()=>{n||i()}}return l||(async()=>{for(R++;;)try{const[,,e]=await L();await e}catch(e){try{if(!z(e))return}catch(e){return null==c?void 0:c(e)}}})(),{on:N.on,subscribe:B,iterate(e){const r=[],n={done:!1,error:null,resolve:()=>{}},s=B(e,{next(e){r.push(e),n.resolve()},error(e){n.done=!0,n.error=e,n.resolve()},complete(){n.done=!0,n.resolve()}}),i=function(){return t(this,arguments,(function*(){for(;;){for(r.length||(yield o(new Promise((e=>n.resolve=e))));r.length;)yield yield o(r.shift());if(n.error)throw n.error;if(n.done)return yield o(void 0)}}))}();return i.throw=async e=>(n.done||(n.done=!0,n.error=e,n.resolve()),{done:!0,value:void 0}),i.return=async()=>(s(),{done:!0,value:void 0}),i},async dispose(){if(j=!0,A){const[e]=await A;e.close(1e3,"Normal Closure")}},terminate(){A&&N.emit("closed",new y)}}},e.isMessage=function(e){try{return c(e),!0}catch(e){return!1}},e.parseMessage=p,e.stringifyMessage=d,e.validateMessage=c}));