@adonisjs/transmit-client 0.1.5 → 0.1.6
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/README.md +1 -1
- package/build/transmit.cjs +1 -1
- package/build/transmit.cjs.map +1 -1
- 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 +8 -0
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
<hr />
|
|
29
29
|
|
|
30
|
-
AdonisJS Transmit Client is a client for the native Server-Sent-Event (SSE) module of AdonisJS. It is built on top of the [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/
|
|
30
|
+
AdonisJS Transmit Client is a client for the native Server-Sent-Event (SSE) module of AdonisJS. It is built on top of the [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) API and provides a simple API to receive events from the server.
|
|
31
31
|
|
|
32
32
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
|
33
33
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
package/build/transmit.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(e=function(){return!!t})()}function t(e){var t=function(e,t){if("object"!=typeof e||!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)}(e);return"symbol"==typeof t?t:String(t)}function n(e){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},n(e)}function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function
|
|
1
|
+
function e(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(e=function(){return!!t})()}function t(e){var t=function(e,t){if("object"!=typeof e||!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)}(e);return"symbol"==typeof t?t:String(t)}function n(e){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},n(e)}function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(t){var i="function"==typeof Map?new Map:void 0;return o=function(t){if(null===t||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(t))return i.get(t);i.set(t,o)}function o(){return function(t,n,o){if(e())return Reflect.construct.apply(null,arguments);var i=[null];i.push.apply(i,n);var c=new(t.bind.apply(t,i));return o&&r(c,o.prototype),c}(t,arguments,n(this).constructor)}return o.prototype=Object.create(t.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),r(o,t)},o(t)}function i(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 a=0;function s(e){return"__private_"+a+++"_"+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,o=this,i=new Request(l(o,b)[b].baseUrl+"/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":null!=(t=l(o,j)[j]())?t:""},body:JSON.stringify({uid:l(o,v)[v],channel:e}),credentials:"include"});return null==(n=(r=l(o,b)[b]).beforeUnsubscribe)||n.call(r,i),Promise.resolve(fetch(i)).then(function(e){})}catch(e){return Promise.reject(e)}},p=function(e,t){try{var n,r,o,i=this;if(l(i,y)[y]!==d.Connected)return Promise.resolve(new Promise(function(n){setTimeout(function(){n(l(i,E)[E](e,t))},100)}));var c,u,a=l(i,h)[h].get(e);if(void 0!==a&&void 0!==t)return null==(c=(u=l(i,b)[b]).onSubscription)||c.call(u,e),a.add(t),Promise.resolve();if(l(i,g)[g].has(e))return Promise.resolve(new Promise(function(n){setTimeout(function(){n(l(i,E)[E](e,t))},100)}));l(i,g)[g].add(e);var s=new Request(l(i,b)[b].baseUrl+"/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":null!=(n=l(i,j)[j]())?n:""},body:JSON.stringify({uid:l(i,v)[v],channel:e}),credentials:"include"});return null==(r=(o=l(i,b)[b]).beforeSubscribe)||r.call(o,s),Promise.resolve(function(n,r){try{var o=Promise.resolve(fetch(s)).then(function(n){var r,o;if(!n.ok)return null==(r=(o=l(i,b)[b]).onSubscribeFailed)||r.call(o,n),void l(i,g)[g].delete(e);if(void 0!==t){var c,u,a=l(i,h)[h].get(e);void 0===a?l(i,h)[h].set(e,new Set([t])):a.add(t),null==(c=(u=l(i,b)[b]).onSubscription)||c.call(u,e)}})}catch(e){return r(!0,e)}return o&&o.then?o.then(r.bind(null,!1),r.bind(null,!0)):r(!1,o)}(0,function(t,n){if(l(i,g)[g].delete(e),t)throw n;return n}))}catch(e){return Promise.reject(e)}},d={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},v=/*#__PURE__*/s("uid"),b=/*#__PURE__*/s("options"),h=/*#__PURE__*/s("listeners"),y=/*#__PURE__*/s("status"),m=/*#__PURE__*/s("eventSource"),O=/*#__PURE__*/s("reconnectAttempts"),g=/*#__PURE__*/s("channelSubscriptionLock"),w=/*#__PURE__*/s("changeStatus"),P=/*#__PURE__*/s("connect"),S=/*#__PURE__*/s("onMessage"),j=/*#__PURE__*/s("retrieveXsrfToken"),R=/*#__PURE__*/s("onError"),E=/*#__PURE__*/s("subscribe"),_=/*#__PURE__*/s("unsubscribe"),T=/*#__PURE__*/function(e){var n,o;function c(t){var n;return n=e.call(this)||this,Object.defineProperty(i(n),_,{value:f}),Object.defineProperty(i(n),E,{value:p}),Object.defineProperty(i(n),R,{value:k}),Object.defineProperty(i(n),j,{value:U}),Object.defineProperty(i(n),S,{value:x}),Object.defineProperty(i(n),P,{value:C}),Object.defineProperty(i(n),w,{value:A}),Object.defineProperty(i(n),v,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(i(n),b,{writable:!0,value:void 0}),Object.defineProperty(i(n),h,{writable:!0,value:new Map}),Object.defineProperty(i(n),y,{writable:!0,value:d.Initializing}),Object.defineProperty(i(n),m,{writable:!0,value:void 0}),Object.defineProperty(i(n),O,{writable:!0,value:0}),Object.defineProperty(i(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(i(n),b)[b]=t,l(i(n),P)[P](),n}o=e,(n=c).prototype=Object.create(o.prototype),n.prototype.constructor=n,r(n,o);var u,a,s=c.prototype;return s.on=function(e,t){this.addEventListener(e,t)},s.listenOn=function(e,t){var n=this;return l(this,E)[E](e,t),function(r){var o,i,c=l(n,h)[h].get(e);void 0!==c&&(c.delete(t),null==(o=(i=l(n,b)[b]).onUnsubscription)||o.call(i,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()},u=c,(a=[{key:"uid",get:function(){return l(this,v)[v]}},{key:"listOfSubscriptions",get:function(){return Array.from(l(this,h)[h].keys())}}])&&function(e,n){for(var r=0;r<n.length;r++){var o=n[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,t(o.key),o)}}(u.prototype,a),Object.defineProperty(u,"prototype",{writable:!1}),c}(/*#__PURE__*/o(EventTarget));function A(e){l(this,y)[y]=e,this.dispatchEvent(new CustomEvent(e))}function C(){var e=this;l(this,w)[w](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,R)[R].bind(this)),l(this,m)[m].addEventListener("open",function(){l(e,w)[w](d.Connected),l(e,O)[O]=0;for(var t,n=u(l(e,h)[h].keys());!(t=n()).done;){var r=t.value;l(e,E)[E](r)}})}function x(e){var t=JSON.parse(e.data),n=l(this,h)[h].get(t.channel);if(void 0!==n)for(var r,o=u(n);!(r=o()).done;)(0,r.value)(t.payload)}function U(){var e=document.cookie.match(new RegExp("(^|;\\s*)(XSRF-TOKEN)=([^;]*)"));return e?decodeURIComponent(e[3]):null}function k(){if(l(this,y)[y]!==d.Reconnecting&&l(this,w)[w](d.Disconnected),l(this,w)[w](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]++}exports.Transmit=T,exports.TransmitStatus=d;
|
|
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 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(), {\n withCredentials: true,\n })\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 for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\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 (\n this.#options.maxReconnectAttempts &&\n this.#reconnectAttempts >= this.#options.maxReconnectAttempts\n ) {\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\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' && typeof callback !== '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(`${this.#options.baseUrl}/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\n })\n\n this.#options.beforeSubscribe?.(request)\n\n try {\n const response = await fetch(request)\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n this.#channelSubscriptionLock.delete(channel)\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 } finally {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`${this.#options.baseUrl}/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\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 (\n (unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) &&\n listeners.size === 0\n ) {\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","_this5","this","request","Request","_classPrivateFieldLooseBase","_options","baseUrl","method","headers","body","JSON","stringify","uid","_uid","credentials","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","onSubscribeFailed","_classPrivateFieldLoo9","_classPrivateFieldLoo10","set","Set","_finallyRethrows","_wasThrown","_result","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","searchParams","append","toString","withCredentials","bind","_step","_iterator","_createForOfIteratorHelperLoose","done","data","parse","_step2","_iterator2","listener","payload","onReconnectAttempt","onReconnectFailed"],"mappings":"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"}
|
|
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(), {\n withCredentials: true,\n })\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 for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\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 #retrieveXsrfToken() {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(XSRF-TOKEN)=([^;]*)'))\n\n return match ? decodeURIComponent(match[3]) : null\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 (\n this.#options.maxReconnectAttempts &&\n this.#reconnectAttempts >= this.#options.maxReconnectAttempts\n ) {\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\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' && typeof callback !== '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(`${this.#options.baseUrl}/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\n })\n\n this.#options.beforeSubscribe?.(request)\n\n try {\n const response = await fetch(request)\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n this.#channelSubscriptionLock.delete(channel)\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 } finally {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`${this.#options.baseUrl}/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\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 (\n (unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) &&\n listeners.size === 0\n ) {\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","_classPrivateFieldLoo12","_classPrivateFieldLoo13","_classPrivateFieldLoo14","_this5","this","request","Request","_classPrivateFieldLooseBase","_options","baseUrl","method","headers","_retrieveXsrfToken","body","JSON","stringify","uid","_uid","credentials","beforeUnsubscribe","call","Promise","resolve","fetch","then","response","e","reject","_subscribe2","callback","_classPrivateFieldLoo5","_classPrivateFieldLoo6","_classPrivateFieldLoo7","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","_classPrivateFieldLoo3","_classPrivateFieldLoo4","listeners","_listeners","get","onSubscription","add","_channelSubscriptionLock","has","beforeSubscribe","_classPrivateFieldLoo8","_classPrivateFieldLoo9","ok","onSubscribeFailed","_classPrivateFieldLoo10","_classPrivateFieldLoo11","set","Set","_finallyRethrows","_wasThrown","_result","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_retrieveXsrfToken2","_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","searchParams","append","toString","withCredentials","bind","_step","_iterator","_createForOfIteratorHelperLoose","done","data","parse","_step2","_iterator2","listener","payload","match","document","cookie","RegExp","decodeURIComponent","onReconnectAttempt","onReconnectFailed"],"mappings":"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"}
|
package/build/transmit.modern.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=0;function t(t){return"__private_"+e+++"_"+t}function n(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}const i={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"};var s=/*#__PURE__*/t("uid"),o=/*#__PURE__*/t("options"),r=/*#__PURE__*/t("listeners"),c=/*#__PURE__*/t("status"),a=/*#__PURE__*/t("eventSource"),h=/*#__PURE__*/t("reconnectAttempts"),l=/*#__PURE__*/t("channelSubscriptionLock"),
|
|
1
|
+
var e=0;function t(t){return"__private_"+e+++"_"+t}function n(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}const i={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"};var s=/*#__PURE__*/t("uid"),o=/*#__PURE__*/t("options"),r=/*#__PURE__*/t("listeners"),c=/*#__PURE__*/t("status"),a=/*#__PURE__*/t("eventSource"),h=/*#__PURE__*/t("reconnectAttempts"),l=/*#__PURE__*/t("channelSubscriptionLock"),u=/*#__PURE__*/t("changeStatus"),d=/*#__PURE__*/t("connect"),p=/*#__PURE__*/t("onMessage"),v=/*#__PURE__*/t("retrieveXsrfToken"),b=/*#__PURE__*/t("onError"),f=/*#__PURE__*/t("subscribe"),m=/*#__PURE__*/t("unsubscribe");class y extends EventTarget{get uid(){return n(this,s)[s]}get listOfSubscriptions(){return Array.from(n(this,r)[r].keys())}constructor(e){super(),Object.defineProperty(this,m,{value:j}),Object.defineProperty(this,f,{value:R}),Object.defineProperty(this,b,{value:P}),Object.defineProperty(this,v,{value:w}),Object.defineProperty(this,p,{value:g}),Object.defineProperty(this,d,{value:S}),Object.defineProperty(this,u,{value:O}),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,l,{writable:!0,value:new Set}),void 0===e.eventSourceConstructor&&(e.eventSourceConstructor=EventSource),void 0===e.maxReconnectAttempts&&(e.maxReconnectAttempts=5),void 0===e.removeSubscriptionOnZeroListener&&(e.removeSubscriptionOnZeroListener=!1),n(this,o)[o]=e,n(this,d)[d]()}on(e,t){this.addEventListener(e,t)}listenOn(e,t){return n(this,f)[f](e,t),i=>{var s,c;const a=n(this,r)[r].get(e);void 0!==a&&(a.delete(t),null==(s=(c=n(this,o)[o]).onUnsubscription)||s.call(c,e),(null!=i?i:n(this,o)[o].removeSubscriptionOnZeroListener)&&0===a.size&&n(this,m)[m](e))}}listenOnce(e,t){const n=this.listenOn(e,e=>{t(e),n()})}close(){n(this,a)[a].close()}}function O(e){n(this,c)[c]=e,this.dispatchEvent(new CustomEvent(e))}function S(){n(this,u)[u](i.Connecting);const e=new URL(`${n(this,o)[o].baseUrl}/__transmit/events`);e.searchParams.append("uid",n(this,s)[s]),n(this,a)[a]=new(n(this,o)[o].eventSourceConstructor)(e.toString(),{withCredentials:!0}),n(this,a)[a].addEventListener("message",n(this,p)[p].bind(this)),n(this,a)[a].addEventListener("error",n(this,b)[b].bind(this)),n(this,a)[a].addEventListener("open",()=>{n(this,u)[u](i.Connected),n(this,h)[h]=0;for(const e of n(this,r)[r].keys())n(this,f)[f](e)})}function g(e){const t=JSON.parse(e.data),i=n(this,r)[r].get(t.channel);if(void 0!==i)for(const e of i)e(t.payload)}function w(){const e=document.cookie.match(new RegExp("(^|;\\s*)(XSRF-TOKEN)=([^;]*)"));return e?decodeURIComponent(e[3]):null}function P(){if(n(this,c)[c]!==i.Reconnecting&&n(this,u)[u](i.Disconnected),n(this,u)[u](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]++}async function R(e,t){var a,h,u;if(n(this,c)[c]!==i.Connected)return new Promise(i=>{setTimeout(()=>{i(n(this,f)[f](e,t))},100)});const d=n(this,r)[r].get(e);var p,b;if(void 0!==d&&void 0!==t)return null==(p=(b=n(this,o)[o]).onSubscription)||p.call(b,e),void d.add(t);if(n(this,l)[l].has(e))return new Promise(i=>{setTimeout(()=>{i(n(this,f)[f](e,t))},100)});n(this,l)[l].add(e);const m=new Request(`${n(this,o)[o].baseUrl}/__transmit/subscribe`,{method:"POST",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":null!=(a=n(this,v)[v]())?a:""},body:JSON.stringify({uid:n(this,s)[s],channel:e}),credentials:"include"});null==(h=(u=n(this,o)[o]).beforeSubscribe)||h.call(u,m);try{const i=await fetch(m);var y,O;if(!i.ok)return null==(y=(O=n(this,o)[o]).onSubscribeFailed)||y.call(O,i),void n(this,l)[l].delete(e);if(void 0!==t){var S,g;const i=n(this,r)[r].get(e);void 0===i?n(this,r)[r].set(e,new Set([t])):i.add(t),null==(S=(g=n(this,o)[o]).onSubscription)||S.call(g,e)}}finally{n(this,l)[l].delete(e)}}async function j(e){var t,i,r;const c=new Request(`${n(this,o)[o].baseUrl}/__transmit/unsubscribe`,{method:"POST",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":null!=(t=n(this,v)[v]())?t:""},body:JSON.stringify({uid:n(this,s)[s],channel:e}),credentials:"include"});null==(i=(r=n(this,o)[o]).beforeUnsubscribe)||i.call(r,c),await fetch(c)}export{y 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 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(), {\n withCredentials: true,\n })\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 for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\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 (\n this.#options.maxReconnectAttempts &&\n this.#reconnectAttempts >= this.#options.maxReconnectAttempts\n ) {\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\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' && typeof callback !== '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(`${this.#options.baseUrl}/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\n })\n\n this.#options.beforeSubscribe?.(request)\n\n try {\n const response = await fetch(request)\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n this.#channelSubscriptionLock.delete(channel)\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 } finally {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`${this.#options.baseUrl}/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\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 (\n (unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) &&\n listeners.size === 0\n ) {\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","credentials","beforeSubscribe","response","fetch","_classPrivateFieldLoo7","_classPrivateFieldLoo8","ok","onSubscribeFailed","_classPrivateFieldLoo9","_classPrivateFieldLoo10","set","_classPrivateFieldLoo11","_classPrivateFieldLoo12","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(), {\n withCredentials: true,\n })\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 for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\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 #retrieveXsrfToken() {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(XSRF-TOKEN)=([^;]*)'))\n\n return match ? decodeURIComponent(match[3]) : null\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 (\n this.#options.maxReconnectAttempts &&\n this.#reconnectAttempts >= this.#options.maxReconnectAttempts\n ) {\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\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' && typeof callback !== '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(`${this.#options.baseUrl}/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\n })\n\n this.#options.beforeSubscribe?.(request)\n\n try {\n const response = await fetch(request)\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n this.#channelSubscriptionLock.delete(channel)\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 } finally {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`${this.#options.baseUrl}/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\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 (\n (unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) &&\n listeners.size === 0\n ) {\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","_retrieveXsrfToken","_onError","_subscribe","_unsubscribe","Transmit","EventTarget","uid","_classPrivateFieldLooseBase","this","listOfSubscriptions","Array","from","keys","constructor","options","super","Object","defineProperty","value","_unsubscribe2","_subscribe2","_onError2","_retrieveXsrfToken2","_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","match","document","cookie","RegExp","decodeURIComponent","onReconnectAttempt","onReconnectFailed","async","_classPrivateFieldLoo5","_classPrivateFieldLoo6","_classPrivateFieldLoo7","Promise","resolve","setTimeout","_classPrivateFieldLoo3","_classPrivateFieldLoo4","onSubscription","add","has","request","Request","method","headers","body","stringify","credentials","beforeSubscribe","response","fetch","_classPrivateFieldLoo8","_classPrivateFieldLoo9","ok","onSubscribeFailed","_classPrivateFieldLoo10","_classPrivateFieldLoo11","set","_classPrivateFieldLoo12","_classPrivateFieldLoo13","_classPrivateFieldLoo14","beforeUnsubscribe"],"mappings":"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"}
|
package/build/transmit.module.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(e=function(){return!!t})()}function t(e){var t=function(e,t){if("object"!=typeof e||!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)}(e);return"symbol"==typeof t?t:String(t)}function n(e){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},n(e)}function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function
|
|
1
|
+
function e(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(e=function(){return!!t})()}function t(e){var t=function(e,t){if("object"!=typeof e||!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)}(e);return"symbol"==typeof t?t:String(t)}function n(e){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},n(e)}function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(t){var i="function"==typeof Map?new Map:void 0;return o=function(t){if(null===t||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(t))return i.get(t);i.set(t,o)}function o(){return function(t,n,o){if(e())return Reflect.construct.apply(null,arguments);var i=[null];i.push.apply(i,n);var c=new(t.bind.apply(t,i));return o&&r(c,o.prototype),c}(t,arguments,n(this).constructor)}return o.prototype=Object.create(t.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),r(o,t)},o(t)}function i(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 a=0;function s(e){return"__private_"+a+++"_"+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,o=this,i=new Request(l(o,b)[b].baseUrl+"/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":null!=(t=l(o,j)[j]())?t:""},body:JSON.stringify({uid:l(o,v)[v],channel:e}),credentials:"include"});return null==(n=(r=l(o,b)[b]).beforeUnsubscribe)||n.call(r,i),Promise.resolve(fetch(i)).then(function(e){})}catch(e){return Promise.reject(e)}},p=function(e,t){try{var n,r,o,i=this;if(l(i,y)[y]!==d.Connected)return Promise.resolve(new Promise(function(n){setTimeout(function(){n(l(i,E)[E](e,t))},100)}));var c,u,a=l(i,h)[h].get(e);if(void 0!==a&&void 0!==t)return null==(c=(u=l(i,b)[b]).onSubscription)||c.call(u,e),a.add(t),Promise.resolve();if(l(i,g)[g].has(e))return Promise.resolve(new Promise(function(n){setTimeout(function(){n(l(i,E)[E](e,t))},100)}));l(i,g)[g].add(e);var s=new Request(l(i,b)[b].baseUrl+"/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":null!=(n=l(i,j)[j]())?n:""},body:JSON.stringify({uid:l(i,v)[v],channel:e}),credentials:"include"});return null==(r=(o=l(i,b)[b]).beforeSubscribe)||r.call(o,s),Promise.resolve(function(n,r){try{var o=Promise.resolve(fetch(s)).then(function(n){var r,o;if(!n.ok)return null==(r=(o=l(i,b)[b]).onSubscribeFailed)||r.call(o,n),void l(i,g)[g].delete(e);if(void 0!==t){var c,u,a=l(i,h)[h].get(e);void 0===a?l(i,h)[h].set(e,new Set([t])):a.add(t),null==(c=(u=l(i,b)[b]).onSubscription)||c.call(u,e)}})}catch(e){return r(!0,e)}return o&&o.then?o.then(r.bind(null,!1),r.bind(null,!0)):r(!1,o)}(0,function(t,n){if(l(i,g)[g].delete(e),t)throw n;return n}))}catch(e){return Promise.reject(e)}},d={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},v=/*#__PURE__*/s("uid"),b=/*#__PURE__*/s("options"),h=/*#__PURE__*/s("listeners"),y=/*#__PURE__*/s("status"),m=/*#__PURE__*/s("eventSource"),O=/*#__PURE__*/s("reconnectAttempts"),g=/*#__PURE__*/s("channelSubscriptionLock"),w=/*#__PURE__*/s("changeStatus"),P=/*#__PURE__*/s("connect"),S=/*#__PURE__*/s("onMessage"),j=/*#__PURE__*/s("retrieveXsrfToken"),R=/*#__PURE__*/s("onError"),E=/*#__PURE__*/s("subscribe"),_=/*#__PURE__*/s("unsubscribe"),T=/*#__PURE__*/function(e){var n,o;function c(t){var n;return n=e.call(this)||this,Object.defineProperty(i(n),_,{value:f}),Object.defineProperty(i(n),E,{value:p}),Object.defineProperty(i(n),R,{value:x}),Object.defineProperty(i(n),j,{value:k}),Object.defineProperty(i(n),S,{value:U}),Object.defineProperty(i(n),P,{value:C}),Object.defineProperty(i(n),w,{value:A}),Object.defineProperty(i(n),v,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(i(n),b,{writable:!0,value:void 0}),Object.defineProperty(i(n),h,{writable:!0,value:new Map}),Object.defineProperty(i(n),y,{writable:!0,value:d.Initializing}),Object.defineProperty(i(n),m,{writable:!0,value:void 0}),Object.defineProperty(i(n),O,{writable:!0,value:0}),Object.defineProperty(i(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(i(n),b)[b]=t,l(i(n),P)[P](),n}o=e,(n=c).prototype=Object.create(o.prototype),n.prototype.constructor=n,r(n,o);var u,a,s=c.prototype;return s.on=function(e,t){this.addEventListener(e,t)},s.listenOn=function(e,t){var n=this;return l(this,E)[E](e,t),function(r){var o,i,c=l(n,h)[h].get(e);void 0!==c&&(c.delete(t),null==(o=(i=l(n,b)[b]).onUnsubscription)||o.call(i,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()},u=c,(a=[{key:"uid",get:function(){return l(this,v)[v]}},{key:"listOfSubscriptions",get:function(){return Array.from(l(this,h)[h].keys())}}])&&function(e,n){for(var r=0;r<n.length;r++){var o=n[r];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,t(o.key),o)}}(u.prototype,a),Object.defineProperty(u,"prototype",{writable:!1}),c}(/*#__PURE__*/o(EventTarget));function A(e){l(this,y)[y]=e,this.dispatchEvent(new CustomEvent(e))}function C(){var e=this;l(this,w)[w](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,R)[R].bind(this)),l(this,m)[m].addEventListener("open",function(){l(e,w)[w](d.Connected),l(e,O)[O]=0;for(var t,n=u(l(e,h)[h].keys());!(t=n()).done;){var r=t.value;l(e,E)[E](r)}})}function U(e){var t=JSON.parse(e.data),n=l(this,h)[h].get(t.channel);if(void 0!==n)for(var r,o=u(n);!(r=o()).done;)(0,r.value)(t.payload)}function k(){var e=document.cookie.match(new RegExp("(^|;\\s*)(XSRF-TOKEN)=([^;]*)"));return e?decodeURIComponent(e[3]):null}function x(){if(l(this,y)[y]!==d.Reconnecting&&l(this,w)[w](d.Disconnected),l(this,w)[w](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]++}export{T as Transmit,d 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 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(), {\n withCredentials: true,\n })\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 for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\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 (\n this.#options.maxReconnectAttempts &&\n this.#reconnectAttempts >= this.#options.maxReconnectAttempts\n ) {\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\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' && typeof callback !== '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(`${this.#options.baseUrl}/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\n })\n\n this.#options.beforeSubscribe?.(request)\n\n try {\n const response = await fetch(request)\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n this.#channelSubscriptionLock.delete(channel)\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 } finally {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`${this.#options.baseUrl}/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\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 (\n (unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) &&\n listeners.size === 0\n ) {\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","_this5","this","request","Request","_classPrivateFieldLooseBase","_options","baseUrl","method","headers","body","JSON","stringify","uid","_uid","credentials","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","onSubscribeFailed","_classPrivateFieldLoo9","_classPrivateFieldLoo10","set","Set","_finallyRethrows","_wasThrown","_result","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","searchParams","append","toString","withCredentials","bind","_step","_iterator","_createForOfIteratorHelperLoose","done","data","parse","_step2","_iterator2","listener","payload","onReconnectAttempt","onReconnectFailed"],"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(), {\n withCredentials: true,\n })\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 for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\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 #retrieveXsrfToken() {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(XSRF-TOKEN)=([^;]*)'))\n\n return match ? decodeURIComponent(match[3]) : null\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 (\n this.#options.maxReconnectAttempts &&\n this.#reconnectAttempts >= this.#options.maxReconnectAttempts\n ) {\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\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' && typeof callback !== '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(`${this.#options.baseUrl}/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\n })\n\n this.#options.beforeSubscribe?.(request)\n\n try {\n const response = await fetch(request)\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n this.#channelSubscriptionLock.delete(channel)\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 } finally {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`${this.#options.baseUrl}/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\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 (\n (unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) &&\n listeners.size === 0\n ) {\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","_classPrivateFieldLoo12","_classPrivateFieldLoo13","_classPrivateFieldLoo14","_this5","this","request","Request","_classPrivateFieldLooseBase","_options","baseUrl","method","headers","_retrieveXsrfToken","body","JSON","stringify","uid","_uid","credentials","beforeUnsubscribe","call","Promise","resolve","fetch","then","response","e","reject","_subscribe2","callback","_classPrivateFieldLoo5","_classPrivateFieldLoo6","_classPrivateFieldLoo7","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","_classPrivateFieldLoo3","_classPrivateFieldLoo4","listeners","_listeners","get","onSubscription","add","_channelSubscriptionLock","has","beforeSubscribe","_classPrivateFieldLoo8","_classPrivateFieldLoo9","ok","onSubscribeFailed","_classPrivateFieldLoo10","_classPrivateFieldLoo11","set","Set","_finallyRethrows","_wasThrown","_result","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_retrieveXsrfToken2","_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","searchParams","append","toString","withCredentials","bind","_step","_iterator","_createForOfIteratorHelperLoose","done","data","parse","_step2","_iterator2","listener","payload","match","document","cookie","RegExp","decodeURIComponent","onReconnectAttempt","onReconnectFailed"],"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(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(t=function(){return!!e})()}function n(e){var t=function(e,t){if("object"!=typeof e||!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)}(e);return"symbol"==typeof t?t:String(t)}function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}function i(e,t){return i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},i(e,t)}function o(e){var n="function"==typeof Map?new Map:void 0;return o=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==n){if(n.has(e))return n.get(e);n.set(e,o)}function o(){return function(e,n,r){if(t())return Reflect.construct.apply(null,arguments);var o=[null];o.push.apply(o,n);var c=new(e.bind.apply(e,o));return r&&i(c,r.prototype),c}(e,arguments,r(this).constructor)}return o.prototype=Object.create(e.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),i(o,e)},o(e)}function c(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(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 a(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 u(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)?u(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 l(e){return"__private_"+s+++"_"+e}function f(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}var
|
|
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(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(t=function(){return!!e})()}function n(e){var t=function(e,t){if("object"!=typeof e||!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)}(e);return"symbol"==typeof t?t:String(t)}function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}function i(e,t){return i=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},i(e,t)}function o(e){var n="function"==typeof Map?new Map:void 0;return o=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==n){if(n.has(e))return n.get(e);n.set(e,o)}function o(){return function(e,n,r){if(t())return Reflect.construct.apply(null,arguments);var o=[null];o.push.apply(o,n);var c=new(e.bind.apply(e,o));return r&&i(c,r.prototype),c}(e,arguments,r(this).constructor)}return o.prototype=Object.create(e.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),i(o,e)},o(e)}function c(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function u(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 a(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 u(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)?u(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 l(e){return"__private_"+s+++"_"+e}function f(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}var d=function(e){try{var t,n,r,i=this,o=new Request(f(i,h)[h].baseUrl+"/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":null!=(t=f(i,R)[R]())?t:""},body:JSON.stringify({uid:f(i,b)[b],channel:e}),credentials:"include"});return null==(n=(r=f(i,h)[h]).beforeUnsubscribe)||n.call(r,o),Promise.resolve(fetch(o)).then(function(e){})}catch(e){return Promise.reject(e)}},p=function(e,t){try{var n,r,i,o=this;if(f(o,m)[m]!==v.Connected)return Promise.resolve(new Promise(function(n){setTimeout(function(){n(f(o,E)[E](e,t))},100)}));var c,u,a=f(o,y)[y].get(e);if(void 0!==a&&void 0!==t)return null==(c=(u=f(o,h)[h]).onSubscription)||c.call(u,e),a.add(t),Promise.resolve();if(f(o,w)[w].has(e))return Promise.resolve(new Promise(function(n){setTimeout(function(){n(f(o,E)[E](e,t))},100)}));f(o,w)[w].add(e);var s=new Request(f(o,h)[h].baseUrl+"/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json","X-XSRF-TOKEN":null!=(n=f(o,R)[R]())?n:""},body:JSON.stringify({uid:f(o,b)[b],channel:e}),credentials:"include"});return null==(r=(i=f(o,h)[h]).beforeSubscribe)||r.call(i,s),Promise.resolve(function(n,r){try{var i=Promise.resolve(fetch(s)).then(function(n){var r,i;if(!n.ok)return null==(r=(i=f(o,h)[h]).onSubscribeFailed)||r.call(i,n),void f(o,w)[w].delete(e);if(void 0!==t){var c,u,a=f(o,y)[y].get(e);void 0===a?f(o,y)[y].set(e,new Set([t])):a.add(t),null==(c=(u=f(o,h)[h]).onSubscription)||c.call(u,e)}})}catch(e){return r(!0,e)}return i&&i.then?i.then(r.bind(null,!1),r.bind(null,!0)):r(!1,i)}(0,function(t,n){if(f(o,w)[w].delete(e),t)throw n;return n}))}catch(e){return Promise.reject(e)}},v={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},b=/*#__PURE__*/l("uid"),h=/*#__PURE__*/l("options"),y=/*#__PURE__*/l("listeners"),m=/*#__PURE__*/l("status"),O=/*#__PURE__*/l("eventSource"),g=/*#__PURE__*/l("reconnectAttempts"),w=/*#__PURE__*/l("channelSubscriptionLock"),P=/*#__PURE__*/l("changeStatus"),S=/*#__PURE__*/l("connect"),j=/*#__PURE__*/l("onMessage"),R=/*#__PURE__*/l("retrieveXsrfToken"),T=/*#__PURE__*/l("onError"),E=/*#__PURE__*/l("subscribe"),_=/*#__PURE__*/l("unsubscribe"),C=/*#__PURE__*/function(e){var t,r;function o(t){var n;return n=e.call(this)||this,Object.defineProperty(c(n),_,{value:d}),Object.defineProperty(c(n),E,{value:p}),Object.defineProperty(c(n),T,{value:L}),Object.defineProperty(c(n),R,{value:k}),Object.defineProperty(c(n),j,{value:U}),Object.defineProperty(c(n),S,{value:x}),Object.defineProperty(c(n),P,{value:A}),Object.defineProperty(c(n),b,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(c(n),h,{writable:!0,value:void 0}),Object.defineProperty(c(n),y,{writable:!0,value:new Map}),Object.defineProperty(c(n),m,{writable:!0,value:v.Initializing}),Object.defineProperty(c(n),O,{writable:!0,value:void 0}),Object.defineProperty(c(n),g,{writable:!0,value:0}),Object.defineProperty(c(n),w,{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),f(c(n),h)[h]=t,f(c(n),S)[S](),n}r=e,(t=o).prototype=Object.create(r.prototype),t.prototype.constructor=t,i(t,r);var u,a,s=o.prototype;return s.on=function(e,t){this.addEventListener(e,t)},s.listenOn=function(e,t){var n=this;return f(this,E)[E](e,t),function(r){var i,o,c=f(n,y)[y].get(e);void 0!==c&&(c.delete(t),null==(i=(o=f(n,h)[h]).onUnsubscription)||i.call(o,e),(null!=r?r:f(n,h)[h].removeSubscriptionOnZeroListener)&&0===c.size&&f(n,_)[_](e))}},s.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},s.close=function(){f(this,O)[O].close()},u=o,(a=[{key:"uid",get:function(){return f(this,b)[b]}},{key:"listOfSubscriptions",get:function(){return Array.from(f(this,y)[y].keys())}}])&&function(e,t){for(var r=0;r<t.length;r++){var i=t[r];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,n(i.key),i)}}(u.prototype,a),Object.defineProperty(u,"prototype",{writable:!1}),o}(/*#__PURE__*/o(EventTarget));function A(e){f(this,m)[m]=e,this.dispatchEvent(new CustomEvent(e))}function x(){var e=this;f(this,P)[P](v.Connecting);var t=new URL(f(this,h)[h].baseUrl+"/__transmit/events");t.searchParams.append("uid",f(this,b)[b]),f(this,O)[O]=new(f(this,h)[h].eventSourceConstructor)(t.toString(),{withCredentials:!0}),f(this,O)[O].addEventListener("message",f(this,j)[j].bind(this)),f(this,O)[O].addEventListener("error",f(this,T)[T].bind(this)),f(this,O)[O].addEventListener("open",function(){f(e,P)[P](v.Connected),f(e,g)[g]=0;for(var t,n=a(f(e,y)[y].keys());!(t=n()).done;){var r=t.value;f(e,E)[E](r)}})}function U(e){var t=JSON.parse(e.data),n=f(this,y)[y].get(t.channel);if(void 0!==n)for(var r,i=a(n);!(r=i()).done;)(0,r.value)(t.payload)}function k(){var e=document.cookie.match(new RegExp("(^|;\\s*)(XSRF-TOKEN)=([^;]*)"));return e?decodeURIComponent(e[3]):null}function L(){if(f(this,m)[m]!==v.Reconnecting&&f(this,P)[P](v.Disconnected),f(this,P)[P](v.Reconnecting),f(this,h)[h].onReconnectAttempt&&f(this,h)[h].onReconnectAttempt(f(this,g)[g]+1),f(this,h)[h].maxReconnectAttempts&&f(this,g)[g]>=f(this,h)[h].maxReconnectAttempts)return f(this,O)[O].close(),void(f(this,h)[h].onReconnectFailed&&f(this,h)[h].onReconnectFailed());f(this,g)[g]++}e.Transmit=C,e.TransmitStatus=v});
|
|
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 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(), {\n withCredentials: true,\n })\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 for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\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 (\n this.#options.maxReconnectAttempts &&\n this.#reconnectAttempts >= this.#options.maxReconnectAttempts\n ) {\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\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' && typeof callback !== '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(`${this.#options.baseUrl}/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\n })\n\n this.#options.beforeSubscribe?.(request)\n\n try {\n const response = await fetch(request)\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n this.#channelSubscriptionLock.delete(channel)\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 } finally {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`${this.#options.baseUrl}/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\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 (\n (unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) &&\n listeners.size === 0\n ) {\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","_this5","this","request","Request","_classPrivateFieldLooseBase","_options","baseUrl","method","headers","body","JSON","stringify","uid","_uid","credentials","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","onSubscribeFailed","_classPrivateFieldLoo9","_classPrivateFieldLoo10","set","Set","_finallyRethrows","_wasThrown","_result","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","searchParams","append","toString","withCredentials","bind","_step","_iterator","_createForOfIteratorHelperLoose","done","data","parse","_step2","_iterator2","listener","payload","onReconnectAttempt","onReconnectFailed"],"mappings":"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"}
|
|
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(), {\n withCredentials: true,\n })\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 for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\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 #retrieveXsrfToken() {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(XSRF-TOKEN)=([^;]*)'))\n\n return match ? decodeURIComponent(match[3]) : null\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 (\n this.#options.maxReconnectAttempts &&\n this.#reconnectAttempts >= this.#options.maxReconnectAttempts\n ) {\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\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' && typeof callback !== '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(`${this.#options.baseUrl}/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\n })\n\n this.#options.beforeSubscribe?.(request)\n\n try {\n const response = await fetch(request)\n\n if (!response.ok) {\n this.#options.onSubscribeFailed?.(response)\n this.#channelSubscriptionLock.delete(channel)\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 } finally {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`${this.#options.baseUrl}/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',\n },\n body: JSON.stringify({ uid: this.#uid, channel }),\n credentials: 'include',\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 (\n (unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) &&\n listeners.size === 0\n ) {\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","_classPrivateFieldLoo12","_classPrivateFieldLoo13","_classPrivateFieldLoo14","_this5","this","request","Request","_classPrivateFieldLooseBase","_options","baseUrl","method","headers","_retrieveXsrfToken","body","JSON","stringify","uid","_uid","credentials","beforeUnsubscribe","call","Promise","resolve","fetch","then","response","e","reject","_subscribe2","callback","_classPrivateFieldLoo5","_classPrivateFieldLoo6","_classPrivateFieldLoo7","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","_classPrivateFieldLoo3","_classPrivateFieldLoo4","listeners","_listeners","get","onSubscription","add","_channelSubscriptionLock","has","beforeSubscribe","_classPrivateFieldLoo8","_classPrivateFieldLoo9","ok","onSubscribeFailed","_classPrivateFieldLoo10","_classPrivateFieldLoo11","set","Set","_finallyRethrows","_wasThrown","_result","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_retrieveXsrfToken2","_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","searchParams","append","toString","withCredentials","bind","_step","_iterator","_createForOfIteratorHelperLoose","done","data","parse","_step2","_iterator2","listener","payload","match","document","cookie","RegExp","decodeURIComponent","onReconnectAttempt","onReconnectFailed"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/transmit.ts
CHANGED
|
@@ -124,6 +124,12 @@ export class Transmit extends EventTarget {
|
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
+
#retrieveXsrfToken() {
|
|
128
|
+
const match = document.cookie.match(new RegExp('(^|;\\s*)(XSRF-TOKEN)=([^;]*)'))
|
|
129
|
+
|
|
130
|
+
return match ? decodeURIComponent(match[3]) : null
|
|
131
|
+
}
|
|
132
|
+
|
|
127
133
|
#onError() {
|
|
128
134
|
if (this.#status !== TransmitStatus.Reconnecting) {
|
|
129
135
|
this.#changeStatus(TransmitStatus.Disconnected)
|
|
@@ -182,6 +188,7 @@ export class Transmit extends EventTarget {
|
|
|
182
188
|
method: 'POST',
|
|
183
189
|
headers: {
|
|
184
190
|
'Content-Type': 'application/json',
|
|
191
|
+
'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',
|
|
185
192
|
},
|
|
186
193
|
body: JSON.stringify({ uid: this.#uid, channel }),
|
|
187
194
|
credentials: 'include',
|
|
@@ -219,6 +226,7 @@ export class Transmit extends EventTarget {
|
|
|
219
226
|
method: 'POST',
|
|
220
227
|
headers: {
|
|
221
228
|
'Content-Type': 'application/json',
|
|
229
|
+
'X-XSRF-TOKEN': this.#retrieveXsrfToken() ?? '',
|
|
222
230
|
},
|
|
223
231
|
body: JSON.stringify({ uid: this.#uid, channel }),
|
|
224
232
|
credentials: 'include',
|