@adonisjs/transmit-client 0.0.4 → 0.1.0
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/build/transmit.cjs +1 -1
- package/build/transmit.cjs.map +1 -1
- package/build/transmit.d.ts +5 -0
- package/build/transmit.modern.js +1 -1
- package/build/transmit.modern.js.map +1 -1
- package/build/transmit.module.js +1 -1
- package/build/transmit.module.js.map +1 -1
- package/build/transmit.umd.js +1 -1
- package/build/transmit.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/transmit.ts +20 -8
package/build/transmit.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(t){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e(t)}function t(e,n){return t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,r,
|
|
1
|
+
function e(t){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e(t)}function t(e,n){return t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,r,i){return n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,n,r){var i=[null];i.push.apply(i,n);var o=new(Function.bind.apply(e,i));return r&&t(o,r.prototype),o},n.apply(null,arguments)}function r(i){var o="function"==typeof Map?new Map:void 0;return r=function(r){if(null===r||-1===Function.toString.call(r).indexOf("[native code]"))return r;if("function"!=typeof r)throw new TypeError("Super expression must either be null or a function");if(void 0!==o){if(o.has(r))return o.get(r);o.set(r,i)}function i(){return n(r,arguments,e(this).constructor)}return i.prototype=Object.create(r.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),t(i,r)},r(i)}function i(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var u=0;function s(e){return"__private_"+u+++"_"+e}function a(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}var l=function(e){try{var t,n,r=new Request("/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:a(this,d)[d],channel:e})});return null==(t=(n=a(this,v)[v]).beforeUnsubscribe)||t.call(n,r),Promise.resolve(fetch(r)).then(function(e){})}catch(e){return Promise.reject(e)}},f=function(e,t){try{var n,r,i=this;if(a(i,h)[h]!==p.Connected)return Promise.resolve(new Promise(function(n){setTimeout(function(){n(a(i,j)[j](e,t))},100)}));var o,c,u=a(i,b)[b].get(e);if(void 0!==u)return null==(o=(c=a(i,v)[v]).onSubscription)||o.call(c,e),u.add(t),Promise.resolve();if(a(i,O)[O].has(e))return Promise.resolve(new Promise(function(n){setTimeout(function(){n(a(i,j)[j](e,t))},100)}));a(i,O)[O].add(e);var s=new Request("/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:a(i,d)[d],channel:e})});return null==(n=(r=a(i,v)[v]).beforeSubscribe)||n.call(r,s),Promise.resolve(fetch(s)).then(function(n){var r,o;if(n.ok){if(void 0!==t){var c,u,s=a(i,b)[b].get(e);void 0===s?a(i,b)[b].set(e,new Set([t])):s.add(t),null==(c=(u=a(i,v)[v]).onSubscription)||c.call(u,e),a(i,O)[O].has(e)&&a(i,O)[O].delete(e)}}else null==(r=(o=a(i,v)[v]).onSubscribeFailed)||r.call(o,n)})}catch(e){return Promise.reject(e)}},p={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},d=/*#__PURE__*/s("uid"),v=/*#__PURE__*/s("options"),b=/*#__PURE__*/s("listeners"),h=/*#__PURE__*/s("status"),y=/*#__PURE__*/s("eventSource"),m=/*#__PURE__*/s("reconnectAttempts"),O=/*#__PURE__*/s("channelSubscriptionLock"),g=/*#__PURE__*/s("changeStatus"),P=/*#__PURE__*/s("connect"),w=/*#__PURE__*/s("onMessage"),S=/*#__PURE__*/s("onError"),j=/*#__PURE__*/s("subscribe"),R=/*#__PURE__*/s("unsubscribe"),_=/*#__PURE__*/function(e){var n,r;function o(t){var n;return n=e.call(this)||this,Object.defineProperty(i(n),R,{value:l}),Object.defineProperty(i(n),j,{value:f}),Object.defineProperty(i(n),S,{value:T}),Object.defineProperty(i(n),w,{value:C}),Object.defineProperty(i(n),P,{value:E}),Object.defineProperty(i(n),g,{value:A}),Object.defineProperty(i(n),d,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(i(n),v,{writable:!0,value:void 0}),Object.defineProperty(i(n),b,{writable:!0,value:new Map}),Object.defineProperty(i(n),h,{writable:!0,value:p.Initializing}),Object.defineProperty(i(n),y,{writable:!0,value:void 0}),Object.defineProperty(i(n),m,{writable:!0,value:0}),Object.defineProperty(i(n),O,{writable:!0,value:new Set}),void 0===t.eventSourceConstructor&&(t.eventSourceConstructor=EventSource),void 0===t.maxReconnectAttempts&&(t.maxReconnectAttempts=5),void 0===t.removeSubscriptionOnZeroListener&&(t.removeSubscriptionOnZeroListener=!1),a(i(n),v)[v]=t,a(i(n),P)[P](),n}r=e,(n=o).prototype=Object.create(r.prototype),n.prototype.constructor=n,t(n,r);var c,u,s=o.prototype;return s.on=function(e,t){this.addEventListener(e,t)},s.listenOn=function(e,t){var n=this;return a(this,j)[j](e,t),function(r){var i,o,c=a(n,b)[b].get(e);void 0!==c&&(c.delete(t),null==(i=(o=a(n,v)[v]).onUnsubscription)||i.call(o,e),(null!=r?r:a(n,v)[v].removeSubscriptionOnZeroListener)&&0===c.size&&a(n,R)[R](e))}},s.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},s.close=function(){a(this,y)[y].close()},c=o,(u=[{key:"uid",get:function(){return a(this,d)[d]}},{key:"listOfSubscriptions",get:function(){return Array.from(a(this,b)[b].keys())}}])&&function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,"symbol"==typeof(i=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(r.key))?i:String(i),r)}var i}(c.prototype,u),Object.defineProperty(c,"prototype",{writable:!1}),o}(/*#__PURE__*/r(EventTarget));function A(e){a(this,h)[h]=e,this.dispatchEvent(new CustomEvent(e))}function E(){var e=this;a(this,g)[g](p.Connecting);var t=new URL(a(this,v)[v].baseUrl+"/__transmit/events");t.searchParams.append("uid",a(this,d)[d]),a(this,y)[y]=new(a(this,v)[v].eventSourceConstructor)(t.toString(),{withCredentials:!0}),a(this,y)[y].addEventListener("message",a(this,w)[w].bind(this)),a(this,y)[y].addEventListener("error",a(this,S)[S].bind(this)),a(this,y)[y].addEventListener("open",function(){a(e,g)[g](p.Connected),a(e,m)[m]=0})}function C(e){var t=JSON.parse(e.data),n=a(this,b)[b].get(t.channel);if(void 0!==n)for(var r,i=c(n);!(r=i()).done;)(0,r.value)(t.payload)}function T(){if(a(this,h)[h]!==p.Reconnecting&&a(this,g)[g](p.Disconnected),a(this,g)[g](p.Reconnecting),a(this,v)[v].onReconnectAttempt&&a(this,v)[v].onReconnectAttempt(a(this,m)[m]+1),a(this,v)[v].maxReconnectAttempts&&a(this,m)[m]>=a(this,v)[v].maxReconnectAttempts)return a(this,y)[y].close(),void(a(this,v)[v].onReconnectFailed&&a(this,v)[v].onReconnectFailed());a(this,m)[m]++;for(var e,t=c(a(this,b)[b].keys());!(e=t()).done;){var n=e.value;a(this,j)[j](n)}}exports.Transmit=_,exports.TransmitStatus=p;
|
|
2
2
|
//# sourceMappingURL=transmit.cjs.map
|
package/build/transmit.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transmit.cjs","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["channel","_this5","this","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","_uid","_options","beforeUnsubscribe","Promise","resolve","fetch","then","response","ok","Error","statusText","e","reject","_subscribe2","callback","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","listeners","_listeners","get","add","_channelSubscriptionLock","has","beforeSubscribe","set","Set","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","call","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","size","listenOnce","unsubscribe","message","close","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_step","_iterator","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"uxEAoMqBA,IAAAA,EAAAA,SAAAA,OAAeC,IAAAA,EAMHC,KALvBC,EAAU,IAAIC,QAAmC,0BAAA,CACrDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAV,EAAAW,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAV,EAAAY,GAAAA,GAAcC,mBAChBH,EAAAV,EAAAY,GAAAA,GAAcC,kBAAkBX,GACjCY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAEF,IAACA,EAASC,GACZ,UAAUC,MAAMF,EAASG,WAAW,EAExC,CAAC,MAAAC,UAAAR,QAAAS,OAAAD,KAAAE,EAAA,SA7EgBzB,EAAiB0B,GAAc,IAAA,IAAAC,EAC1CzB,KAAJ,GAAIS,EAAAgB,EAAAC,GAAAA,KAAiBC,EAAeC,UAClC,OAAAf,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGF,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,GAEtC,QAAyB,IAAdiC,EAET,OADAA,EAAUG,IAAIV,GACdX,QAAAC,UAGF,GAAIL,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,GACpC,OAAAe,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGFf,EAAAgB,EAAAU,GAAAA,GAA8BD,IAAIpC,GAElC,IAAMG,EAAU,IAAIC,QAAiC,wBAAA,CACnDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAgB,EAAAf,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAgB,EAAAd,GAAAA,GAAc0B,iBAChB5B,EAAAgB,EAAAd,GAAAA,GAAc0B,gBAAgBpC,GAC/BY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAEN,IAAKA,EAASC,GACZ,MAAM,IAAIC,MAAMF,EAASG,YAC1B,QAEuB,IAAbI,EAAwB,CACjC,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,QAEb,IAAdiC,EACTtB,EAAAgB,EAAAO,GAAAA,GAAgBM,IAAIxC,EAAS,IAAIyC,IAAI,CAACf,KAEtCO,EAAUG,IAAIV,GAGZf,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,IACpCW,EAAAgB,EAAAU,GAAAA,GAAA,OAAqCrC,KAG3C,CAAC,MAAAuB,GAAAR,OAAAA,QAAAS,OAAAD,EAvLH,CAAA,EAAaM,EAAiB,CAC5Ba,aAAc,eACdC,WAAY,aACZb,UAAW,YACXc,aAAc,eACdC,aAAc,gBACNjC,eAAAkC,SAAAjC,eAAAiC,EAAAZ,WAAAA,eAAAY,EAAA,aAAAlB,eAAAkB,YAAAC,eAAAD,EAAAE,eAAAA,eAAAF,EAAA,qBAAAT,eAAAS,6BAAAG,eAAAH,EAAAI,gBAAAA,eAAAJ,EAAA,WAAAK,eAAAL,eAAAM,eAAAN,EAAAd,WAAAA,eAAAc,EAAA,aAAAO,eAAAP,EAIV,eAAaQ,eAAS,SAAAC,WAoCpB,SAAAD,EAAYE,OAAwBC,EAgBnB,OAffA,EAAAF,EAAAG,KAAAxD,OAAOyD,KAAAA,OAAAC,eAAAC,EAAAJ,GAAAJ,EAAA,CAAAS,MAAAC,IAAAJ,OAAAC,eAAAC,EAAAJ,GAAAzB,EAAA8B,CAAAA,MAAArC,IAAAkC,OAAAC,eAAAC,EAAAJ,GAAAL,GAAAU,MAAAE,IAAAL,OAAAC,eAAAC,EAAAJ,GAAAN,EAAA,CAAAW,MAAAG,IAAAN,OAAAC,eAAAC,EAAAJ,GAAAP,EAAAY,CAAAA,MAAAI,IAAAP,OAAAC,eAAAC,EAAAJ,GAAAR,GAAAa,MAAAK,IAAAR,OAAAC,eAAAC,EAAAJ,GAAA7C,EAAA,CAAAwD,UAAAN,EAAAA,MAjCMO,OAAOC,eAAYX,OAAAC,eAAAC,EAAAJ,GAAA5C,EAAAuD,CAAAA,YAAAN,WAAA,IAAAH,OAAAC,eAAAC,EAAAJ,GAAAvB,GAAAkC,UAAA,EAAAN,MAUqB,IAAIS,MAAKZ,OAAAC,eAAAC,EAAAJ,GAAA7B,GAAAwC,UAAA,EAAAN,MAKrCjC,EAAea,eAAYiB,OAAAC,eAAAC,EAAAJ,GAAAV,EAAAqB,CAAAA,YAAAN,WAAA,IAAAH,OAAAC,eAAAC,EAAAJ,GAAAT,GAAAoB,UAAA,EAAAN,MAUzB,IAACH,OAAAC,eAAAC,EAAAJ,GAAApB,EAAA+B,CAAAA,YAAAN,MAKU,IAAIrB,WAKI,IAAnCe,EAAQgB,yBACjBhB,EAAQgB,uBAAyBC,kBAGS,IAAjCjB,EAAQkB,uBACjBlB,EAAQkB,qBAAuB,QAGuB,IAA7ClB,EAAQmB,mCACjBnB,EAAQmB,kCAAmC,GAG7ChE,EAAAkD,EAAAJ,GAAA5C,GAAAA,GAAgB2C,EAChB7C,EAAAkD,EAAAJ,GAAAP,GAAAA,KAAeO,CACjB,GArDoBF,KAAAD,yEAqDnB,IAAAsB,EAAAtB,EAAAuB,UA6KAvB,OA7KAsB,EA8IDE,GAAA,SAAGC,EAA+CrD,GAChDxB,KAAK8E,iBAAiBD,EAAOrD,EAC/B,EAACkD,EAEDK,SAAA,SAAsBjF,EAAiB0B,GAA8BwD,IAAAA,OAGnE,OAFAvE,EAAKT,KAAI8B,GAAAA,GAAYhC,EAAS0B,GAEtByD,SAAAA,GACN,IAAMlD,EAAYtB,EAAAuE,EAAIhD,GAAAA,GAAYC,IAAInC,QAEb,IAAdiC,IAIXA,EAAgB,OAACP,UAEZyD,EAAAA,EAA0BxE,EAAAuE,EAAIrE,GAAAA,GAAU8D,mCAAwD,IAAnB1C,EAAUmD,MAC1FzE,EAAKuE,EAAI7B,GAAAA,GAAcrD,GAE3B,CACF,EAAC4E,EAEDS,WAAA,SAAwBrF,EAAiB0B,GACvC,IAAM4D,EAAcpF,KAAK+E,SAAYjF,EAAS,SAACuF,GAC7C7D,EAAS6D,GACTD,GACF,EACF,EAACV,EAEDY,MAAA,WACE7E,OAAIoC,GAAAA,GAAcyC,OACpB,EAAClC,CAAA,CAlOmB,cAkOnBmC,EAlO2BC,cAmO7B,SAAAvB,EA5KewB,GACZhF,EAAAT,KAAI0B,GAAAA,GAAW+D,EACfzF,KAAK0F,cAAc,IAAIC,YAAYF,GACrC,CAAC,SAAAzB,IAEO4B,IAAAA,OACNnF,EAAAT,KAAI+C,GAAAA,GAAepB,EAAec,YAElC,IAAMoD,EAAM,IAAIC,IAAIrF,OAAIE,GAAAA,GAAUoF,QAAU,sBAC5CF,EAAIG,aAAaC,OAAO,MAAKxF,EAAET,KAAIU,GAAAA,IAEnCD,EAAIT,KAAA6C,GAAAA,GAAgB,IAAIpC,OAAIE,GAAAA,GAAgC,wBAACkF,EAAIK,WAAY,CAAEC,iBAAiB,IAChG1F,EAAIT,KAAA6C,GAAAA,GAAciC,iBAAiB,UAAWrE,OAAIwC,GAAAA,GAAYmD,KAAKpG,OACnES,EAAIT,KAAA6C,GAAAA,GAAciC,iBAAiB,QAASrE,OAAIyC,GAAAA,GAAUkD,KAAKpG,OAC/DS,EAAIT,KAAA6C,GAAAA,GAAciC,iBAAiB,OAAQ,WACzCrE,EAAAmF,EAAI7C,GAAAA,GAAepB,EAAeC,WAClCnB,EAAAmF,EAAI9C,GAAAA,GAAsB,CAC5B,EACF,CAAC,SAAAiB,EAEUc,GACT,IAAMwB,EAAO/F,KAAKgG,MAAMzB,EAAMwB,MACxBtE,EAAYtB,OAAIuB,GAAAA,GAAYC,IAAIoE,EAAKvG,SAE3C,QAAyB,IAAdiC,EAIX,IAAA,IAAgCwE,EAAhCC,EAAAC,EAAuB1E,KAASwE,EAAAC,KAAAE,OAC9BC,EADiBJ,EAAA3C,OACRyC,EAAKO,QAElB,CAAC,SAAA9C,IAaC,GAVIrD,EAAIT,KAAA0B,GAAAA,KAAaC,EAAegB,cAClClC,EAAIT,KAAA+C,GAAAA,GAAepB,EAAee,cAGpCjC,EAAIT,KAAA+C,GAAAA,GAAepB,EAAegB,cAE9BlC,EAAIT,KAAAW,GAAAA,GAAUkG,oBAChBpG,EAAAT,KAAIW,GAAAA,GAAUkG,mBAAmBpG,EAAAT,KAAI8C,GAAAA,GAAsB,GAGzDrC,EAAIT,KAAAW,GAAAA,GAAU6D,sBAAwB/D,EAAIT,KAAA8C,GAAAA,IAAuBrC,EAAAT,KAAIW,GAAAA,GAAU6D,qBAOjF,OANA/D,OAAIoC,GAAAA,GAAcyC,aAEd7E,OAAIE,GAAAA,GAAUmG,mBAChBrG,EAAIT,KAAAW,GAAAA,GAAUmG,qBAMlBrG,EAAAT,KAAI8C,GAAAA,KAEJ,QAA4CiE,EAA5CC,EAAAP,EAAsBhG,OAAIuB,GAAAA,GAAYiF,UAAMF,EAAAC,KAAAN,MAAE,KAAnC5G,EAAOiH,EAAAnD,MAChBnD,EAAKT,KAAI8B,GAAAA,GAAYhC,EACtB,CACH"}
|
|
1
|
+
{"version":3,"file":"transmit.cjs","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n onSubscribeFailed?: (response: Response) => void\n onSubscription?: (channel: string) => void\n onUnsubscription?: (channel: string) => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n get uid() {\n return this.#uid\n }\n\n get listOfSubscriptions() {\n return Array.from(this.#listeners.keys())\n }\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n this.#options.onSubscription?.(channel)\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n this.#options.beforeSubscribe?.(request)\n\n const response = await fetch(request);\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n return\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n this.#options.onSubscription?.(channel)\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n this.#options.beforeUnsubscribe?.(request)\n\n const response = await fetch(request);\n\n if (!response.ok) {\n return\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n this.#options.onUnsubscription?.(channel)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["channel","_classPrivateFieldLoo11","_classPrivateFieldLoo12","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","this","_uid","_options","beforeUnsubscribe","call","Promise","resolve","fetch","then","response","e","reject","_subscribe2","callback","_classPrivateFieldLoo5","_classPrivateFieldLoo6","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","_classPrivateFieldLoo3","_classPrivateFieldLoo4","listeners","_listeners","get","onSubscription","add","_channelSubscriptionLock","has","beforeSubscribe","_classPrivateFieldLoo7","_classPrivateFieldLoo8","ok","_classPrivateFieldLoo9","_classPrivateFieldLoo10","set","Set","onSubscribeFailed","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","_classPrivateFieldLoo","_classPrivateFieldLoo2","onUnsubscription","size","listenOnce","unsubscribe","message","close","key","Array","from","keys","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_iterator","_step","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","onReconnectFailed","_step2","_iterator2"],"mappings":"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"}
|
package/build/transmit.d.ts
CHANGED
|
@@ -6,6 +6,9 @@ interface TransmitOptions {
|
|
|
6
6
|
maxReconnectAttempts?: number;
|
|
7
7
|
onReconnectAttempt?: (attempt: number) => void;
|
|
8
8
|
onReconnectFailed?: () => void;
|
|
9
|
+
onSubscribeFailed?: (response: Response) => void;
|
|
10
|
+
onSubscription?: (channel: string) => void;
|
|
11
|
+
onUnsubscription?: (channel: string) => void;
|
|
9
12
|
removeSubscriptionOnZeroListener?: boolean;
|
|
10
13
|
}
|
|
11
14
|
export declare const TransmitStatus: {
|
|
@@ -18,6 +21,8 @@ export declare const TransmitStatus: {
|
|
|
18
21
|
type TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus];
|
|
19
22
|
export declare class Transmit extends EventTarget {
|
|
20
23
|
#private;
|
|
24
|
+
get uid(): string;
|
|
25
|
+
get listOfSubscriptions(): string[];
|
|
21
26
|
constructor(options: TransmitOptions);
|
|
22
27
|
on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void): void;
|
|
23
28
|
listenOn<T = unknown>(channel: string, callback: (message: T) => void): (unsubscribeOnTheServer?: boolean) => void;
|
package/build/transmit.modern.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var t=0;function e(e){return"__private_"+t+++"_"+e}function n(t,e){if(!Object.prototype.hasOwnProperty.call(t,e))throw new TypeError("attempted to use private field on non-instance");return t}const i={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"};var s=/*#__PURE__*/e("uid"),o=/*#__PURE__*/e("options"),r=/*#__PURE__*/e("listeners"),c=/*#__PURE__*/e("status"),a=/*#__PURE__*/e("eventSource"),h=/*#__PURE__*/e("reconnectAttempts"),u=/*#__PURE__*/e("channelSubscriptionLock"),l=/*#__PURE__*/e("changeStatus"),d=/*#__PURE__*/e("connect"),p=/*#__PURE__*/e("onMessage"),v=/*#__PURE__*/e("onError"),b=/*#__PURE__*/e("subscribe"),f=/*#__PURE__*/e("unsubscribe");class m extends EventTarget{get uid(){return n(this,s)[s]}get listOfSubscriptions(){return Array.from(n(this,r)[r].keys())}constructor(t){super(),Object.defineProperty(this,f,{value:P}),Object.defineProperty(this,b,{value:S}),Object.defineProperty(this,v,{value:w}),Object.defineProperty(this,p,{value:g}),Object.defineProperty(this,d,{value:O}),Object.defineProperty(this,l,{value:y}),Object.defineProperty(this,s,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(this,o,{writable:!0,value:void 0}),Object.defineProperty(this,r,{writable:!0,value:new Map}),Object.defineProperty(this,c,{writable:!0,value:i.Initializing}),Object.defineProperty(this,a,{writable:!0,value:void 0}),Object.defineProperty(this,h,{writable:!0,value:0}),Object.defineProperty(this,u,{writable:!0,value:new Set}),void 0===t.eventSourceConstructor&&(t.eventSourceConstructor=EventSource),void 0===t.maxReconnectAttempts&&(t.maxReconnectAttempts=5),void 0===t.removeSubscriptionOnZeroListener&&(t.removeSubscriptionOnZeroListener=!1),n(this,o)[o]=t,n(this,d)[d]()}on(t,e){this.addEventListener(t,e)}listenOn(t,e){return n(this,b)[b](t,e),i=>{var s,c;const a=n(this,r)[r].get(t);void 0!==a&&(a.delete(e),null==(s=(c=n(this,o)[o]).onUnsubscription)||s.call(c,t),(null!=i?i:n(this,o)[o].removeSubscriptionOnZeroListener)&&0===a.size&&n(this,f)[f](t))}}listenOnce(t,e){const n=this.listenOn(t,t=>{e(t),n()})}close(){n(this,a)[a].close()}}function y(t){n(this,c)[c]=t,this.dispatchEvent(new CustomEvent(t))}function O(){n(this,l)[l](i.Connecting);const t=new URL(n(this,o)[o].baseUrl+"/__transmit/events");t.searchParams.append("uid",n(this,s)[s]),n(this,a)[a]=new(n(this,o)[o].eventSourceConstructor)(t.toString(),{withCredentials:!0}),n(this,a)[a].addEventListener("message",n(this,p)[p].bind(this)),n(this,a)[a].addEventListener("error",n(this,v)[v].bind(this)),n(this,a)[a].addEventListener("open",()=>{n(this,l)[l](i.Connected),n(this,h)[h]=0})}function g(t){const e=JSON.parse(t.data),i=n(this,r)[r].get(e.channel);if(void 0!==i)for(const t of i)t(e.payload)}function w(){if(n(this,c)[c]!==i.Reconnecting&&n(this,l)[l](i.Disconnected),n(this,l)[l](i.Reconnecting),n(this,o)[o].onReconnectAttempt&&n(this,o)[o].onReconnectAttempt(n(this,h)[h]+1),n(this,o)[o].maxReconnectAttempts&&n(this,h)[h]>=n(this,o)[o].maxReconnectAttempts)return n(this,a)[a].close(),void(n(this,o)[o].onReconnectFailed&&n(this,o)[o].onReconnectFailed());n(this,h)[h]++;for(const t of n(this,r)[r].keys())n(this,b)[b](t)}async function S(t,e){var a,h;if(n(this,c)[c]!==i.Connected)return new Promise(i=>{setTimeout(()=>{i(n(this,b)[b](t,e))},100)});const l=n(this,r)[r].get(t);var d,p;if(void 0!==l)return null==(d=(p=n(this,o)[o]).onSubscription)||d.call(p,t),void l.add(e);if(n(this,u)[u].has(t))return new Promise(i=>{setTimeout(()=>{i(n(this,b)[b](t,e))},100)});n(this,u)[u].add(t);const v=new Request("/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:n(this,s)[s],channel:t})});null==(a=(h=n(this,o)[o]).beforeSubscribe)||a.call(h,v);const f=await fetch(v);var m,y;if(f.ok){if(void 0!==e){var O,g;const i=n(this,r)[r].get(t);void 0===i?n(this,r)[r].set(t,new Set([e])):i.add(e),null==(O=(g=n(this,o)[o]).onSubscription)||O.call(g,t),n(this,u)[u].has(t)&&n(this,u)[u].delete(t)}}else null==(m=(y=n(this,o)[o]).onSubscribeFailed)||m.call(y,f)}async function P(t){var e,i;const r=new Request("/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:n(this,s)[s],channel:t})});null==(e=(i=n(this,o)[o]).beforeUnsubscribe)||e.call(i,r),await fetch(r)}export{m as Transmit,i as TransmitStatus};
|
|
2
2
|
//# sourceMappingURL=transmit.modern.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transmit.modern.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["TransmitStatus","Initializing","Connecting","Connected","Disconnected","Reconnecting","_uid","_classPrivateFieldLooseKey","_options","_listeners","_status","_eventSource","_reconnectAttempts","_channelSubscriptionLock","_changeStatus","_connect","_onMessage","_onError","_subscribe","_unsubscribe","Transmit","EventTarget","constructor","options","super","Object","defineProperty","value","_unsubscribe2","_subscribe2","this","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","Set","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_classPrivateFieldLooseBase","on","event","callback","addEventListener","listenOn","channel","unsubscribeOnTheServer","listeners","get","delete","size","listenOnce","unsubscribe","message","close","status","dispatchEvent","CustomEvent","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","JSON","parse","listener","payload","onReconnectAttempt","onReconnectFailed","keys","async","Promise","resolve","setTimeout","add","has","request","Request","method","headers","body","stringify","uid","beforeSubscribe","response","fetch","ok","Error","statusText","set","beforeUnsubscribe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transmit.modern.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n onSubscribeFailed?: (response: Response) => void\n onSubscription?: (channel: string) => void\n onUnsubscription?: (channel: string) => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n get uid() {\n return this.#uid\n }\n\n get listOfSubscriptions() {\n return Array.from(this.#listeners.keys())\n }\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n this.#options.onSubscription?.(channel)\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n this.#options.beforeSubscribe?.(request)\n\n const response = await fetch(request);\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n return\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n this.#options.onSubscription?.(channel)\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n this.#options.beforeUnsubscribe?.(request)\n\n const response = await fetch(request);\n\n if (!response.ok) {\n return\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n this.#options.onUnsubscription?.(channel)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["TransmitStatus","Initializing","Connecting","Connected","Disconnected","Reconnecting","_uid","_classPrivateFieldLooseKey","_options","_listeners","_status","_eventSource","_reconnectAttempts","_channelSubscriptionLock","_changeStatus","_connect","_onMessage","_onError","_subscribe","_unsubscribe","Transmit","EventTarget","uid","_classPrivateFieldLooseBase","this","listOfSubscriptions","Array","from","keys","constructor","options","super","Object","defineProperty","value","_unsubscribe2","_subscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","Set","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","on","event","callback","addEventListener","listenOn","channel","unsubscribeOnTheServer","_classPrivateFieldLoo","_classPrivateFieldLoo2","listeners","get","delete","onUnsubscription","call","size","listenOnce","unsubscribe","message","close","status","dispatchEvent","CustomEvent","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","JSON","parse","listener","payload","onReconnectAttempt","onReconnectFailed","async","_classPrivateFieldLoo5","_classPrivateFieldLoo6","Promise","resolve","setTimeout","_classPrivateFieldLoo3","_classPrivateFieldLoo4","onSubscription","add","has","request","Request","method","headers","body","stringify","beforeSubscribe","response","fetch","_classPrivateFieldLoo7","_classPrivateFieldLoo8","ok","_classPrivateFieldLoo9","_classPrivateFieldLoo10","set","onSubscribeFailed","_classPrivateFieldLoo11","_classPrivateFieldLoo12","beforeUnsubscribe"],"mappings":"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"}
|
package/build/transmit.module.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(t){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e(t)}function t(e,n){return t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,r,
|
|
1
|
+
function e(t){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e(t)}function t(e,n){return t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,r,i){return n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,n,r){var i=[null];i.push.apply(i,n);var o=new(Function.bind.apply(e,i));return r&&t(o,r.prototype),o},n.apply(null,arguments)}function r(i){var o="function"==typeof Map?new Map:void 0;return r=function(r){if(null===r||-1===Function.toString.call(r).indexOf("[native code]"))return r;if("function"!=typeof r)throw new TypeError("Super expression must either be null or a function");if(void 0!==o){if(o.has(r))return o.get(r);o.set(r,i)}function i(){return n(r,arguments,e(this).constructor)}return i.prototype=Object.create(r.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),t(i,r)},r(i)}function i(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var u=0;function s(e){return"__private_"+u+++"_"+e}function a(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}var l=function(e){try{var t,n,r=new Request("/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:a(this,d)[d],channel:e})});return null==(t=(n=a(this,v)[v]).beforeUnsubscribe)||t.call(n,r),Promise.resolve(fetch(r)).then(function(e){})}catch(e){return Promise.reject(e)}},f=function(e,t){try{var n,r,i=this;if(a(i,h)[h]!==p.Connected)return Promise.resolve(new Promise(function(n){setTimeout(function(){n(a(i,j)[j](e,t))},100)}));var o,c,u=a(i,b)[b].get(e);if(void 0!==u)return null==(o=(c=a(i,v)[v]).onSubscription)||o.call(c,e),u.add(t),Promise.resolve();if(a(i,O)[O].has(e))return Promise.resolve(new Promise(function(n){setTimeout(function(){n(a(i,j)[j](e,t))},100)}));a(i,O)[O].add(e);var s=new Request("/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:a(i,d)[d],channel:e})});return null==(n=(r=a(i,v)[v]).beforeSubscribe)||n.call(r,s),Promise.resolve(fetch(s)).then(function(n){var r,o;if(n.ok){if(void 0!==t){var c,u,s=a(i,b)[b].get(e);void 0===s?a(i,b)[b].set(e,new Set([t])):s.add(t),null==(c=(u=a(i,v)[v]).onSubscription)||c.call(u,e),a(i,O)[O].has(e)&&a(i,O)[O].delete(e)}}else null==(r=(o=a(i,v)[v]).onSubscribeFailed)||r.call(o,n)})}catch(e){return Promise.reject(e)}},p={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},d=/*#__PURE__*/s("uid"),v=/*#__PURE__*/s("options"),b=/*#__PURE__*/s("listeners"),h=/*#__PURE__*/s("status"),y=/*#__PURE__*/s("eventSource"),m=/*#__PURE__*/s("reconnectAttempts"),O=/*#__PURE__*/s("channelSubscriptionLock"),g=/*#__PURE__*/s("changeStatus"),P=/*#__PURE__*/s("connect"),w=/*#__PURE__*/s("onMessage"),S=/*#__PURE__*/s("onError"),j=/*#__PURE__*/s("subscribe"),R=/*#__PURE__*/s("unsubscribe"),_=/*#__PURE__*/function(e){var n,r;function o(t){var n;return n=e.call(this)||this,Object.defineProperty(i(n),R,{value:l}),Object.defineProperty(i(n),j,{value:f}),Object.defineProperty(i(n),S,{value:T}),Object.defineProperty(i(n),w,{value:C}),Object.defineProperty(i(n),P,{value:E}),Object.defineProperty(i(n),g,{value:A}),Object.defineProperty(i(n),d,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(i(n),v,{writable:!0,value:void 0}),Object.defineProperty(i(n),b,{writable:!0,value:new Map}),Object.defineProperty(i(n),h,{writable:!0,value:p.Initializing}),Object.defineProperty(i(n),y,{writable:!0,value:void 0}),Object.defineProperty(i(n),m,{writable:!0,value:0}),Object.defineProperty(i(n),O,{writable:!0,value:new Set}),void 0===t.eventSourceConstructor&&(t.eventSourceConstructor=EventSource),void 0===t.maxReconnectAttempts&&(t.maxReconnectAttempts=5),void 0===t.removeSubscriptionOnZeroListener&&(t.removeSubscriptionOnZeroListener=!1),a(i(n),v)[v]=t,a(i(n),P)[P](),n}r=e,(n=o).prototype=Object.create(r.prototype),n.prototype.constructor=n,t(n,r);var c,u,s=o.prototype;return s.on=function(e,t){this.addEventListener(e,t)},s.listenOn=function(e,t){var n=this;return a(this,j)[j](e,t),function(r){var i,o,c=a(n,b)[b].get(e);void 0!==c&&(c.delete(t),null==(i=(o=a(n,v)[v]).onUnsubscription)||i.call(o,e),(null!=r?r:a(n,v)[v].removeSubscriptionOnZeroListener)&&0===c.size&&a(n,R)[R](e))}},s.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},s.close=function(){a(this,y)[y].close()},c=o,(u=[{key:"uid",get:function(){return a(this,d)[d]}},{key:"listOfSubscriptions",get:function(){return Array.from(a(this,b)[b].keys())}}])&&function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,"symbol"==typeof(i=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(r.key))?i:String(i),r)}var i}(c.prototype,u),Object.defineProperty(c,"prototype",{writable:!1}),o}(/*#__PURE__*/r(EventTarget));function A(e){a(this,h)[h]=e,this.dispatchEvent(new CustomEvent(e))}function E(){var e=this;a(this,g)[g](p.Connecting);var t=new URL(a(this,v)[v].baseUrl+"/__transmit/events");t.searchParams.append("uid",a(this,d)[d]),a(this,y)[y]=new(a(this,v)[v].eventSourceConstructor)(t.toString(),{withCredentials:!0}),a(this,y)[y].addEventListener("message",a(this,w)[w].bind(this)),a(this,y)[y].addEventListener("error",a(this,S)[S].bind(this)),a(this,y)[y].addEventListener("open",function(){a(e,g)[g](p.Connected),a(e,m)[m]=0})}function C(e){var t=JSON.parse(e.data),n=a(this,b)[b].get(t.channel);if(void 0!==n)for(var r,i=c(n);!(r=i()).done;)(0,r.value)(t.payload)}function T(){if(a(this,h)[h]!==p.Reconnecting&&a(this,g)[g](p.Disconnected),a(this,g)[g](p.Reconnecting),a(this,v)[v].onReconnectAttempt&&a(this,v)[v].onReconnectAttempt(a(this,m)[m]+1),a(this,v)[v].maxReconnectAttempts&&a(this,m)[m]>=a(this,v)[v].maxReconnectAttempts)return a(this,y)[y].close(),void(a(this,v)[v].onReconnectFailed&&a(this,v)[v].onReconnectFailed());a(this,m)[m]++;for(var e,t=c(a(this,b)[b].keys());!(e=t()).done;){var n=e.value;a(this,j)[j](n)}}export{_ as Transmit,p as TransmitStatus};
|
|
2
2
|
//# sourceMappingURL=transmit.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transmit.module.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["channel","_this5","this","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","_uid","_options","beforeUnsubscribe","Promise","resolve","fetch","then","response","ok","Error","statusText","e","reject","_subscribe2","callback","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","listeners","_listeners","get","add","_channelSubscriptionLock","has","beforeSubscribe","set","Set","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","call","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","size","listenOnce","unsubscribe","message","close","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_step","_iterator","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transmit.module.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n onSubscribeFailed?: (response: Response) => void\n onSubscription?: (channel: string) => void\n onUnsubscription?: (channel: string) => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n get uid() {\n return this.#uid\n }\n\n get listOfSubscriptions() {\n return Array.from(this.#listeners.keys())\n }\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n this.#options.onSubscription?.(channel)\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n this.#options.beforeSubscribe?.(request)\n\n const response = await fetch(request);\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n return\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n this.#options.onSubscription?.(channel)\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n this.#options.beforeUnsubscribe?.(request)\n\n const response = await fetch(request);\n\n if (!response.ok) {\n return\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n this.#options.onUnsubscription?.(channel)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["channel","_classPrivateFieldLoo11","_classPrivateFieldLoo12","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","this","_uid","_options","beforeUnsubscribe","call","Promise","resolve","fetch","then","response","e","reject","_subscribe2","callback","_classPrivateFieldLoo5","_classPrivateFieldLoo6","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","_classPrivateFieldLoo3","_classPrivateFieldLoo4","listeners","_listeners","get","onSubscription","add","_channelSubscriptionLock","has","beforeSubscribe","_classPrivateFieldLoo7","_classPrivateFieldLoo8","ok","_classPrivateFieldLoo9","_classPrivateFieldLoo10","set","Set","onSubscribeFailed","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","_classPrivateFieldLoo","_classPrivateFieldLoo2","onUnsubscription","size","listenOnce","unsubscribe","message","close","key","Array","from","keys","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_iterator","_step","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","onReconnectFailed","_step2","_iterator2"],"mappings":"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"}
|
package/build/transmit.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e||self).transmitClient={})}(this,function(e){function t(e){return t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},t(e)}function n(e,t){return n=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},n(e,t)}function r(e,t,
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e||self).transmitClient={})}(this,function(e){function t(e){return t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},t(e)}function n(e,t){return n=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},n(e,t)}function r(e,t,i){return r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,t,r){var i=[null];i.push.apply(i,t);var o=new(Function.bind.apply(e,i));return r&&n(o,r.prototype),o},r.apply(null,arguments)}function i(e){var o="function"==typeof Map?new Map:void 0;return i=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==o){if(o.has(e))return o.get(e);o.set(e,i)}function i(){return r(e,arguments,t(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),n(i,e)},i(e)}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function u(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return c(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s=0;function a(e){return"__private_"+s+++"_"+e}function l(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}var f=function(e){try{var t,n,r=new Request("/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:l(this,v)[v],channel:e})});return null==(t=(n=l(this,b)[b]).beforeUnsubscribe)||t.call(n,r),Promise.resolve(fetch(r)).then(function(e){})}catch(e){return Promise.reject(e)}},p=function(e,t){try{var n,r,i=this;if(l(i,y)[y]!==d.Connected)return Promise.resolve(new Promise(function(n){setTimeout(function(){n(l(i,R)[R](e,t))},100)}));var o,c,u=l(i,h)[h].get(e);if(void 0!==u)return null==(o=(c=l(i,b)[b]).onSubscription)||o.call(c,e),u.add(t),Promise.resolve();if(l(i,g)[g].has(e))return Promise.resolve(new Promise(function(n){setTimeout(function(){n(l(i,R)[R](e,t))},100)}));l(i,g)[g].add(e);var s=new Request("/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:l(i,v)[v],channel:e})});return null==(n=(r=l(i,b)[b]).beforeSubscribe)||n.call(r,s),Promise.resolve(fetch(s)).then(function(n){var r,o;if(n.ok){if(void 0!==t){var c,u,s=l(i,h)[h].get(e);void 0===s?l(i,h)[h].set(e,new Set([t])):s.add(t),null==(c=(u=l(i,b)[b]).onSubscription)||c.call(u,e),l(i,g)[g].has(e)&&l(i,g)[g].delete(e)}}else null==(r=(o=l(i,b)[b]).onSubscribeFailed)||r.call(o,n)})}catch(e){return Promise.reject(e)}},d={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},v=/*#__PURE__*/a("uid"),b=/*#__PURE__*/a("options"),h=/*#__PURE__*/a("listeners"),y=/*#__PURE__*/a("status"),m=/*#__PURE__*/a("eventSource"),O=/*#__PURE__*/a("reconnectAttempts"),g=/*#__PURE__*/a("channelSubscriptionLock"),P=/*#__PURE__*/a("changeStatus"),w=/*#__PURE__*/a("connect"),S=/*#__PURE__*/a("onMessage"),j=/*#__PURE__*/a("onError"),R=/*#__PURE__*/a("subscribe"),_=/*#__PURE__*/a("unsubscribe"),T=/*#__PURE__*/function(e){var t,r;function i(t){var n;return n=e.call(this)||this,Object.defineProperty(o(n),_,{value:f}),Object.defineProperty(o(n),R,{value:p}),Object.defineProperty(o(n),j,{value:x}),Object.defineProperty(o(n),S,{value:E}),Object.defineProperty(o(n),w,{value:C}),Object.defineProperty(o(n),P,{value:A}),Object.defineProperty(o(n),v,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(o(n),b,{writable:!0,value:void 0}),Object.defineProperty(o(n),h,{writable:!0,value:new Map}),Object.defineProperty(o(n),y,{writable:!0,value:d.Initializing}),Object.defineProperty(o(n),m,{writable:!0,value:void 0}),Object.defineProperty(o(n),O,{writable:!0,value:0}),Object.defineProperty(o(n),g,{writable:!0,value:new Set}),void 0===t.eventSourceConstructor&&(t.eventSourceConstructor=EventSource),void 0===t.maxReconnectAttempts&&(t.maxReconnectAttempts=5),void 0===t.removeSubscriptionOnZeroListener&&(t.removeSubscriptionOnZeroListener=!1),l(o(n),b)[b]=t,l(o(n),w)[w](),n}r=e,(t=i).prototype=Object.create(r.prototype),t.prototype.constructor=t,n(t,r);var c,u,s=i.prototype;return s.on=function(e,t){this.addEventListener(e,t)},s.listenOn=function(e,t){var n=this;return l(this,R)[R](e,t),function(r){var i,o,c=l(n,h)[h].get(e);void 0!==c&&(c.delete(t),null==(i=(o=l(n,b)[b]).onUnsubscription)||i.call(o,e),(null!=r?r:l(n,b)[b].removeSubscriptionOnZeroListener)&&0===c.size&&l(n,_)[_](e))}},s.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},s.close=function(){l(this,m)[m].close()},c=i,(u=[{key:"uid",get:function(){return l(this,v)[v]}},{key:"listOfSubscriptions",get:function(){return Array.from(l(this,h)[h].keys())}}])&&function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,"symbol"==typeof(i=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(r.key))?i:String(i),r)}var i}(c.prototype,u),Object.defineProperty(c,"prototype",{writable:!1}),i}(/*#__PURE__*/i(EventTarget));function A(e){l(this,y)[y]=e,this.dispatchEvent(new CustomEvent(e))}function C(){var e=this;l(this,P)[P](d.Connecting);var t=new URL(l(this,b)[b].baseUrl+"/__transmit/events");t.searchParams.append("uid",l(this,v)[v]),l(this,m)[m]=new(l(this,b)[b].eventSourceConstructor)(t.toString(),{withCredentials:!0}),l(this,m)[m].addEventListener("message",l(this,S)[S].bind(this)),l(this,m)[m].addEventListener("error",l(this,j)[j].bind(this)),l(this,m)[m].addEventListener("open",function(){l(e,P)[P](d.Connected),l(e,O)[O]=0})}function E(e){var t=JSON.parse(e.data),n=l(this,h)[h].get(t.channel);if(void 0!==n)for(var r,i=u(n);!(r=i()).done;)(0,r.value)(t.payload)}function x(){if(l(this,y)[y]!==d.Reconnecting&&l(this,P)[P](d.Disconnected),l(this,P)[P](d.Reconnecting),l(this,b)[b].onReconnectAttempt&&l(this,b)[b].onReconnectAttempt(l(this,O)[O]+1),l(this,b)[b].maxReconnectAttempts&&l(this,O)[O]>=l(this,b)[b].maxReconnectAttempts)return l(this,m)[m].close(),void(l(this,b)[b].onReconnectFailed&&l(this,b)[b].onReconnectFailed());l(this,O)[O]++;for(var e,t=u(l(this,h)[h].keys());!(e=t()).done;){var n=e.value;l(this,R)[R](n)}}e.Transmit=T,e.TransmitStatus=d});
|
|
2
2
|
//# sourceMappingURL=transmit.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transmit.umd.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["channel","_this5","this","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","_uid","_options","beforeUnsubscribe","Promise","resolve","fetch","then","response","ok","Error","statusText","e","reject","_subscribe2","callback","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","listeners","_listeners","get","add","_channelSubscriptionLock","has","beforeSubscribe","set","Set","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","call","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","size","listenOnce","unsubscribe","message","close","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_step","_iterator","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"+/EAoMqBA,IAAAA,EAAAA,SAAAA,OAAeC,IAAAA,EAMHC,KALvBC,EAAU,IAAIC,QAAmC,0BAAA,CACrDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAV,EAAAW,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAV,EAAAY,GAAAA,GAAcC,mBAChBH,EAAAV,EAAAY,GAAAA,GAAcC,kBAAkBX,GACjCY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAEF,IAACA,EAASC,GACZ,UAAUC,MAAMF,EAASG,WAAW,EAExC,CAAC,MAAAC,UAAAR,QAAAS,OAAAD,KAAAE,EAAA,SA7EgBzB,EAAiB0B,GAAc,IAAA,IAAAC,EAC1CzB,KAAJ,GAAIS,EAAAgB,EAAAC,GAAAA,KAAiBC,EAAeC,UAClC,OAAAf,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGF,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,GAEtC,QAAyB,IAAdiC,EAET,OADAA,EAAUG,IAAIV,GACdX,QAAAC,UAGF,GAAIL,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,GACpC,OAAAe,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGFf,EAAAgB,EAAAU,GAAAA,GAA8BD,IAAIpC,GAElC,IAAMG,EAAU,IAAIC,QAAiC,wBAAA,CACnDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAgB,EAAAf,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAgB,EAAAd,GAAAA,GAAc0B,iBAChB5B,EAAAgB,EAAAd,GAAAA,GAAc0B,gBAAgBpC,GAC/BY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAEN,IAAKA,EAASC,GACZ,MAAM,IAAIC,MAAMF,EAASG,YAC1B,QAEuB,IAAbI,EAAwB,CACjC,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,QAEb,IAAdiC,EACTtB,EAAAgB,EAAAO,GAAAA,GAAgBM,IAAIxC,EAAS,IAAIyC,IAAI,CAACf,KAEtCO,EAAUG,IAAIV,GAGZf,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,IACpCW,EAAAgB,EAAAU,GAAAA,GAAA,OAAqCrC,KAG3C,CAAC,MAAAuB,GAAAR,OAAAA,QAAAS,OAAAD,EAvLH,CAAA,EAAaM,EAAiB,CAC5Ba,aAAc,eACdC,WAAY,aACZb,UAAW,YACXc,aAAc,eACdC,aAAc,gBACNjC,eAAAkC,SAAAjC,eAAAiC,EAAAZ,WAAAA,eAAAY,EAAA,aAAAlB,eAAAkB,YAAAC,eAAAD,EAAAE,eAAAA,eAAAF,EAAA,qBAAAT,eAAAS,6BAAAG,eAAAH,EAAAI,gBAAAA,eAAAJ,EAAA,WAAAK,eAAAL,eAAAM,eAAAN,EAAAd,WAAAA,eAAAc,EAAA,aAAAO,eAAAP,EAIV,eAAaQ,eAAS,SAAAC,WAoCpB,SAAAD,EAAYE,OAAwBC,EAgBnB,OAffA,EAAAF,EAAAG,KAAAxD,OAAOyD,KAAAA,OAAAC,eAAAC,EAAAJ,GAAAJ,EAAA,CAAAS,MAAAC,IAAAJ,OAAAC,eAAAC,EAAAJ,GAAAzB,EAAA8B,CAAAA,MAAArC,IAAAkC,OAAAC,eAAAC,EAAAJ,GAAAL,GAAAU,MAAAE,IAAAL,OAAAC,eAAAC,EAAAJ,GAAAN,EAAA,CAAAW,MAAAG,IAAAN,OAAAC,eAAAC,EAAAJ,GAAAP,EAAAY,CAAAA,MAAAI,IAAAP,OAAAC,eAAAC,EAAAJ,GAAAR,GAAAa,MAAAK,IAAAR,OAAAC,eAAAC,EAAAJ,GAAA7C,EAAA,CAAAwD,UAAAN,EAAAA,MAjCMO,OAAOC,eAAYX,OAAAC,eAAAC,EAAAJ,GAAA5C,EAAAuD,CAAAA,YAAAN,WAAA,IAAAH,OAAAC,eAAAC,EAAAJ,GAAAvB,GAAAkC,UAAA,EAAAN,MAUqB,IAAIS,MAAKZ,OAAAC,eAAAC,EAAAJ,GAAA7B,GAAAwC,UAAA,EAAAN,MAKrCjC,EAAea,eAAYiB,OAAAC,eAAAC,EAAAJ,GAAAV,EAAAqB,CAAAA,YAAAN,WAAA,IAAAH,OAAAC,eAAAC,EAAAJ,GAAAT,GAAAoB,UAAA,EAAAN,MAUzB,IAACH,OAAAC,eAAAC,EAAAJ,GAAApB,EAAA+B,CAAAA,YAAAN,MAKU,IAAIrB,WAKI,IAAnCe,EAAQgB,yBACjBhB,EAAQgB,uBAAyBC,kBAGS,IAAjCjB,EAAQkB,uBACjBlB,EAAQkB,qBAAuB,QAGuB,IAA7ClB,EAAQmB,mCACjBnB,EAAQmB,kCAAmC,GAG7ChE,EAAAkD,EAAAJ,GAAA5C,GAAAA,GAAgB2C,EAChB7C,EAAAkD,EAAAJ,GAAAP,GAAAA,KAAeO,CACjB,GArDoBF,KAAAD,yEAqDnB,IAAAsB,EAAAtB,EAAAuB,UA6KAvB,OA7KAsB,EA8IDE,GAAA,SAAGC,EAA+CrD,GAChDxB,KAAK8E,iBAAiBD,EAAOrD,EAC/B,EAACkD,EAEDK,SAAA,SAAsBjF,EAAiB0B,GAA8BwD,IAAAA,OAGnE,OAFAvE,EAAKT,KAAI8B,GAAAA,GAAYhC,EAAS0B,GAEtByD,SAAAA,GACN,IAAMlD,EAAYtB,EAAAuE,EAAIhD,GAAAA,GAAYC,IAAInC,QAEb,IAAdiC,IAIXA,EAAgB,OAACP,UAEZyD,EAAAA,EAA0BxE,EAAAuE,EAAIrE,GAAAA,GAAU8D,mCAAwD,IAAnB1C,EAAUmD,MAC1FzE,EAAKuE,EAAI7B,GAAAA,GAAcrD,GAE3B,CACF,EAAC4E,EAEDS,WAAA,SAAwBrF,EAAiB0B,GACvC,IAAM4D,EAAcpF,KAAK+E,SAAYjF,EAAS,SAACuF,GAC7C7D,EAAS6D,GACTD,GACF,EACF,EAACV,EAEDY,MAAA,WACE7E,OAAIoC,GAAAA,GAAcyC,OACpB,EAAClC,CAAA,CAlOmB,cAkOnBmC,EAlO2BC,cAmO7B,SAAAvB,EA5KewB,GACZhF,EAAAT,KAAI0B,GAAAA,GAAW+D,EACfzF,KAAK0F,cAAc,IAAIC,YAAYF,GACrC,CAAC,SAAAzB,IAEO4B,IAAAA,OACNnF,EAAAT,KAAI+C,GAAAA,GAAepB,EAAec,YAElC,IAAMoD,EAAM,IAAIC,IAAIrF,OAAIE,GAAAA,GAAUoF,QAAU,sBAC5CF,EAAIG,aAAaC,OAAO,MAAKxF,EAAET,KAAIU,GAAAA,IAEnCD,EAAIT,KAAA6C,GAAAA,GAAgB,IAAIpC,OAAIE,GAAAA,GAAgC,wBAACkF,EAAIK,WAAY,CAAEC,iBAAiB,IAChG1F,EAAIT,KAAA6C,GAAAA,GAAciC,iBAAiB,UAAWrE,OAAIwC,GAAAA,GAAYmD,KAAKpG,OACnES,EAAIT,KAAA6C,GAAAA,GAAciC,iBAAiB,QAASrE,OAAIyC,GAAAA,GAAUkD,KAAKpG,OAC/DS,EAAIT,KAAA6C,GAAAA,GAAciC,iBAAiB,OAAQ,WACzCrE,EAAAmF,EAAI7C,GAAAA,GAAepB,EAAeC,WAClCnB,EAAAmF,EAAI9C,GAAAA,GAAsB,CAC5B,EACF,CAAC,SAAAiB,EAEUc,GACT,IAAMwB,EAAO/F,KAAKgG,MAAMzB,EAAMwB,MACxBtE,EAAYtB,OAAIuB,GAAAA,GAAYC,IAAIoE,EAAKvG,SAE3C,QAAyB,IAAdiC,EAIX,IAAA,IAAgCwE,EAAhCC,EAAAC,EAAuB1E,KAASwE,EAAAC,KAAAE,OAC9BC,EADiBJ,EAAA3C,OACRyC,EAAKO,QAElB,CAAC,SAAA9C,IAaC,GAVIrD,EAAIT,KAAA0B,GAAAA,KAAaC,EAAegB,cAClClC,EAAIT,KAAA+C,GAAAA,GAAepB,EAAee,cAGpCjC,EAAIT,KAAA+C,GAAAA,GAAepB,EAAegB,cAE9BlC,EAAIT,KAAAW,GAAAA,GAAUkG,oBAChBpG,EAAAT,KAAIW,GAAAA,GAAUkG,mBAAmBpG,EAAAT,KAAI8C,GAAAA,GAAsB,GAGzDrC,EAAIT,KAAAW,GAAAA,GAAU6D,sBAAwB/D,EAAIT,KAAA8C,GAAAA,IAAuBrC,EAAAT,KAAIW,GAAAA,GAAU6D,qBAOjF,OANA/D,OAAIoC,GAAAA,GAAcyC,aAEd7E,OAAIE,GAAAA,GAAUmG,mBAChBrG,EAAIT,KAAAW,GAAAA,GAAUmG,qBAMlBrG,EAAAT,KAAI8C,GAAAA,KAEJ,QAA4CiE,EAA5CC,EAAAP,EAAsBhG,OAAIuB,GAAAA,GAAYiF,UAAMF,EAAAC,KAAAN,MAAE,KAAnC5G,EAAOiH,EAAAnD,MAChBnD,EAAKT,KAAI8B,GAAAA,GAAYhC,EACtB,CACH"}
|
|
1
|
+
{"version":3,"file":"transmit.umd.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n onSubscribeFailed?: (response: Response) => void\n onSubscription?: (channel: string) => void\n onUnsubscription?: (channel: string) => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n get uid() {\n return this.#uid\n }\n\n get listOfSubscriptions() {\n return Array.from(this.#listeners.keys())\n }\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n this.#options.onSubscription?.(channel)\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n this.#options.beforeSubscribe?.(request)\n\n const response = await fetch(request);\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n return\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n this.#options.onSubscription?.(channel)\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n this.#options.beforeUnsubscribe?.(request)\n\n const response = await fetch(request);\n\n if (!response.ok) {\n return\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n this.#options.onUnsubscription?.(channel)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["channel","_classPrivateFieldLoo11","_classPrivateFieldLoo12","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","this","_uid","_options","beforeUnsubscribe","call","Promise","resolve","fetch","then","response","e","reject","_subscribe2","callback","_classPrivateFieldLoo5","_classPrivateFieldLoo6","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","_classPrivateFieldLoo3","_classPrivateFieldLoo4","listeners","_listeners","get","onSubscription","add","_channelSubscriptionLock","has","beforeSubscribe","_classPrivateFieldLoo7","_classPrivateFieldLoo8","ok","_classPrivateFieldLoo9","_classPrivateFieldLoo10","set","Set","onSubscribeFailed","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","_classPrivateFieldLoo","_classPrivateFieldLoo2","onUnsubscription","size","listenOnce","unsubscribe","message","close","key","Array","from","keys","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_iterator","_step","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","onReconnectFailed","_step2","_iterator2"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/transmit.ts
CHANGED
|
@@ -6,6 +6,9 @@ interface TransmitOptions {
|
|
|
6
6
|
maxReconnectAttempts?: number
|
|
7
7
|
onReconnectAttempt?: (attempt: number) => void
|
|
8
8
|
onReconnectFailed?: () => void
|
|
9
|
+
onSubscribeFailed?: (response: Response) => void
|
|
10
|
+
onSubscription?: (channel: string) => void
|
|
11
|
+
onUnsubscription?: (channel: string) => void
|
|
9
12
|
removeSubscriptionOnZeroListener?: boolean
|
|
10
13
|
}
|
|
11
14
|
|
|
@@ -55,6 +58,14 @@ export class Transmit extends EventTarget {
|
|
|
55
58
|
*/
|
|
56
59
|
#channelSubscriptionLock: Set<string> = new Set()
|
|
57
60
|
|
|
61
|
+
get uid() {
|
|
62
|
+
return this.#uid
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get listOfSubscriptions() {
|
|
66
|
+
return Array.from(this.#listeners.keys())
|
|
67
|
+
}
|
|
68
|
+
|
|
58
69
|
constructor(options: TransmitOptions) {
|
|
59
70
|
super()
|
|
60
71
|
|
|
@@ -147,6 +158,7 @@ export class Transmit extends EventTarget {
|
|
|
147
158
|
const listeners = this.#listeners.get(channel)
|
|
148
159
|
|
|
149
160
|
if (typeof listeners !== 'undefined') {
|
|
161
|
+
this.#options.onSubscription?.(channel)
|
|
150
162
|
listeners.add(callback)
|
|
151
163
|
return
|
|
152
164
|
}
|
|
@@ -169,14 +181,13 @@ export class Transmit extends EventTarget {
|
|
|
169
181
|
body: JSON.stringify({uid: this.#uid, channel}),
|
|
170
182
|
})
|
|
171
183
|
|
|
172
|
-
|
|
173
|
-
this.#options.beforeSubscribe(request)
|
|
174
|
-
}
|
|
184
|
+
this.#options.beforeSubscribe?.(request)
|
|
175
185
|
|
|
176
186
|
const response = await fetch(request);
|
|
177
187
|
|
|
178
188
|
if (!response.ok) {
|
|
179
|
-
|
|
189
|
+
this.#options.onSubscribeFailed?.(response)
|
|
190
|
+
return
|
|
180
191
|
}
|
|
181
192
|
|
|
182
193
|
if (typeof callback !== 'undefined') {
|
|
@@ -188,6 +199,8 @@ export class Transmit extends EventTarget {
|
|
|
188
199
|
listeners.add(callback)
|
|
189
200
|
}
|
|
190
201
|
|
|
202
|
+
this.#options.onSubscription?.(channel)
|
|
203
|
+
|
|
191
204
|
if (this.#channelSubscriptionLock.has(channel)) {
|
|
192
205
|
this.#channelSubscriptionLock.delete(channel)
|
|
193
206
|
}
|
|
@@ -203,14 +216,12 @@ export class Transmit extends EventTarget {
|
|
|
203
216
|
body: JSON.stringify({uid: this.#uid, channel}),
|
|
204
217
|
})
|
|
205
218
|
|
|
206
|
-
|
|
207
|
-
this.#options.beforeUnsubscribe(request)
|
|
208
|
-
}
|
|
219
|
+
this.#options.beforeUnsubscribe?.(request)
|
|
209
220
|
|
|
210
221
|
const response = await fetch(request);
|
|
211
222
|
|
|
212
223
|
if (!response.ok) {
|
|
213
|
-
|
|
224
|
+
return
|
|
214
225
|
}
|
|
215
226
|
}
|
|
216
227
|
|
|
@@ -229,6 +240,7 @@ export class Transmit extends EventTarget {
|
|
|
229
240
|
}
|
|
230
241
|
|
|
231
242
|
listeners.delete(callback)
|
|
243
|
+
this.#options.onUnsubscription?.(channel)
|
|
232
244
|
|
|
233
245
|
if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {
|
|
234
246
|
void this.#unsubscribe(channel)
|