@adonisjs/transmit-client 0.0.2 → 0.0.4

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 ADDED
@@ -0,0 +1,187 @@
1
+ <div align="center">
2
+ <h1> AdonisJS Transmit Client</h1>
3
+ <p>A client for the native Server-Sent-Event (SSE) module of AdonisJS.</p>
4
+ </div>
5
+
6
+ <br />
7
+
8
+ <div align="center">
9
+
10
+ [![gh-workflow-image]][gh-workflow-url] [![npm-image]][npm-url] ![][typescript-image] [![license-image]][license-url] [![synk-image]][synk-url]
11
+
12
+ </div>
13
+
14
+ <div align="center">
15
+ <h3>
16
+ <a href="#installation">
17
+ Usage
18
+ </a>
19
+ <span> | </span>
20
+ <a href="https://adonisjs.com">
21
+ Checkout AdonisJS
22
+ </a>
23
+ </h3>
24
+ </div>
25
+
26
+ <br />
27
+
28
+ <hr />
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/ntSource) API and provides a simple API to receive events from the server.
31
+
32
+ <!-- START doctoc generated TOC please keep comment here to allow auto update -->
33
+ <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
34
+ ## Table of Contents
35
+
36
+ - [Installation](#installation)
37
+ - [Usage](#usage)
38
+ - [Subscribing to channels](#subscribing-to-channels)
39
+ - [Subscription Request](#subscription-request)
40
+ - [Reconnecting](#reconnecting)
41
+ - [Unsubscribing](#unsubscribing)
42
+ - [Events](#events)
43
+
44
+ <!-- END doctoc generated TOC please keep comment here to allow auto update -->
45
+
46
+ ## Installation
47
+
48
+ Install the package from the npm registry as follows:
49
+
50
+ ```sh
51
+ npm i @adonisjs/transmit-client
52
+
53
+ # yarn
54
+ yarn add @adonisjs/transmit-client
55
+
56
+ # pnpm
57
+ pnpm add @adonisjs/transmit-client
58
+ ```
59
+
60
+ ## Usage
61
+
62
+ The module exposes a `Transmit` class, which can be used to connect to the server and listen for events.
63
+
64
+ ```ts
65
+ import { Transmit } from '@adonisjs/transmit-client'
66
+
67
+ const transmit = new Transmit({
68
+ baseUrl: 'http://localhost:3333',
69
+ })
70
+ ```
71
+
72
+ ## Subscribing to channels
73
+
74
+ The `listenOn` method accepts the channel name and a callback to be invoked when the event is received from the server.
75
+
76
+ ```ts
77
+ transmit.listenOn<{ message: string }>('chat/1', (payload) => {
78
+ console.log(payload.message)
79
+ })
80
+ ```
81
+
82
+ You can also listen from a channel only once.
83
+
84
+ ```ts
85
+ transmit.listenOnce<{ message: string }>('chat/1', () => {
86
+ console.log('first message received!')
87
+ })
88
+ ```
89
+
90
+ ### Subscription Request
91
+
92
+ You can alter the subscription request by using the `beforeSubscribe` or `beforeUnsubscribe` options.
93
+
94
+ ```ts
95
+ const transmit = new Transmit({
96
+ baseUrl: 'http://localhost:3333',
97
+ beforeSubscribe: (_request: RequestInit) => {
98
+ console.log('beforeSubscribe')
99
+ },
100
+ beforeUnsubscribe: (_request: RequestInit) => {
101
+ console.log('beforeUnsubscribe')
102
+ },
103
+ })
104
+ ```
105
+
106
+ ### Reconnecting
107
+
108
+ The transmit client will automatically reconnect to the server when the connection is lost. You can change the number of retries and hook into the reconnect lifecycle as follows:
109
+
110
+ ```ts
111
+ const transmit = new Transmit({
112
+ baseUrl: 'http://localhost:3333',
113
+ maxReconnectionAttempts: 5,
114
+ onReconnectAttempt: (attempt) => {
115
+ console.log('Reconnect attempt ' + attempt)
116
+ },
117
+ onReconnectFailed: () => {
118
+ console.log('Reconnect failed')
119
+ },
120
+ })
121
+ ```
122
+
123
+ ### Unsubscribing
124
+
125
+ The `listenOn` method returns a function to unsubscribe from the channel.
126
+
127
+ ```ts
128
+ const unsubscribe = transmit.listenOn('chat/1', () => {
129
+ console.log('message received!')
130
+ })
131
+
132
+ // later
133
+ unsubscribe()
134
+ ```
135
+
136
+ When unsubscribing from a channel, the client will remove the local listener for that channel. By default, it will not send a request to the server when there are no more listener to unsubscribe from the channel. You can change this behavior by setting the `removeSubscriptionOnZeroListener` option to `true`.
137
+
138
+ ```ts
139
+ const transmit = new Transmit({
140
+ baseUrl: 'http://localhost:3333',
141
+ removeSubscriptionOnZeroListener: true,
142
+ })
143
+ ```
144
+
145
+ You can also change the default settings locally by passing a boolean to the unsubscribe method.
146
+
147
+ ```ts
148
+ const unsubscribe = transmit.listenOn('chat/1', () => {
149
+ console.log('message received!')
150
+ })
151
+
152
+ // later
153
+ unsubscribe(true) // or false
154
+ ```
155
+
156
+ # Events
157
+
158
+ The`Transmit` class extends the [`EventTarget`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) class and emits multiple events.
159
+
160
+ ```ts
161
+ transmit.on('connected', () => {
162
+ console.log('connected')
163
+ })
164
+
165
+ transmit.on('disconnected', () => {
166
+ console.log('disconnected')
167
+ })
168
+
169
+ transmit.on('reconnecting', () => {
170
+ console.log('reconnecting')
171
+ })
172
+ ```
173
+
174
+ [gh-workflow-image]: https://img.shields.io/github/actions/workflow/status/adonisjs/transmit-client/test?style=for-the-badge
175
+ [gh-workflow-url]: https://github.com/adonisjs/transmit-client/actions/workflows/test.yml "Github action"
176
+
177
+ [typescript-image]: https://img.shields.io/badge/Typescript-294E80.svg?style=for-the-badge&logo=typescript
178
+ [typescript-url]: "typescript"
179
+
180
+ [npm-image]: https://img.shields.io/npm/v/@adonisjs/transmit-client.svg?style=for-the-badge&logo=npm
181
+ [npm-url]: https://npmjs.org/package/@adonisjs/transmit-client 'npm'
182
+
183
+ [license-image]: https://img.shields.io/npm/l/@adonisjs/transmit-client?color=blueviolet&style=for-the-badge
184
+ [license-url]: LICENSE.md 'license'
185
+
186
+ [synk-image]: https://img.shields.io/snyk/vulnerabilities/github/adonisjs/transmit-client?label=Synk%20Vulnerabilities&style=for-the-badge
187
+ [synk-url]: https://snyk.io/test/github/adonisjs/transmit-client?targetFile=package.json "synk"
@@ -1,2 +1,2 @@
1
- function e(t){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e(t)}function t(e,n){return t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,r,o){return n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,n,r){var o=[null];o.push.apply(o,n);var i=new(Function.bind.apply(e,o));return r&&t(i,r.prototype),i},n.apply(null,arguments)}function r(o){var i="function"==typeof Map?new Map:void 0;return r=function(r){if(null===r||-1===Function.toString.call(r).indexOf("[native code]"))return r;if("function"!=typeof r)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(r))return i.get(r);i.set(r,o)}function o(){return n(r,arguments,e(this).constructor)}return o.prototype=Object.create(r.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),t(o,r)},r(o)}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return i(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)?i(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s=0;function a(e){return"__private_"+s+++"_"+e}function u(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=this,n=new Request("__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:u(t,d)[d],channel:e})});return u(t,h)[h].beforeUnsubscribe&&u(t,h)[h].beforeUnsubscribe(n),Promise.resolve(fetch(n)).then(function(e){if(!e.ok)throw new Error(e.statusText)})}catch(e){return Promise.reject(e)}},l=function(e,t){try{var n=this;if(u(n,b)[b]!==p.Connected)return Promise.resolve(new Promise(function(r){setTimeout(function(){r(u(n,S)[S](e,t))},100)}));var r=u(n,v)[v].get(e);if(void 0!==r)return r.add(t),Promise.resolve();if(u(n,O)[O].has(e))return Promise.resolve(new Promise(function(r){setTimeout(function(){r(u(n,S)[S](e,t))},100)}));u(n,O)[O].add(e);var o=new Request("__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:u(n,d)[d],channel:e})});return u(n,h)[h].beforeSubscribe&&u(n,h)[h].beforeSubscribe(o),Promise.resolve(fetch(o)).then(function(r){if(!r.ok)throw new Error(r.statusText);if(void 0!==t){var o=u(n,v)[v].get(e);void 0===o?u(n,v)[v].set(e,new Set([t])):o.add(t),u(n,O)[O].has(e)&&u(n,O)[O].delete(e)}})}catch(e){return Promise.reject(e)}},p={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},d=/*#__PURE__*/a("uid"),h=/*#__PURE__*/a("options"),v=/*#__PURE__*/a("listeners"),b=/*#__PURE__*/a("status"),y=/*#__PURE__*/a("eventSource"),m=/*#__PURE__*/a("reconnectAttempts"),O=/*#__PURE__*/a("channelSubscriptionLock"),w=/*#__PURE__*/a("changeStatus"),g=/*#__PURE__*/a("connect"),P=/*#__PURE__*/a("onMessage"),j=/*#__PURE__*/a("onError"),S=/*#__PURE__*/a("subscribe"),R=/*#__PURE__*/a("unsubscribe"),_=/*#__PURE__*/function(e){var n,r;function i(t){var n;return n=e.call(this)||this,Object.defineProperty(o(n),R,{value:f}),Object.defineProperty(o(n),S,{value:l}),Object.defineProperty(o(n),j,{value:x}),Object.defineProperty(o(n),P,{value:A}),Object.defineProperty(o(n),g,{value:T}),Object.defineProperty(o(n),w,{value:E}),Object.defineProperty(o(n),d,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(o(n),h,{writable:!0,value:void 0}),Object.defineProperty(o(n),v,{writable:!0,value:new Map}),Object.defineProperty(o(n),b,{writable:!0,value:p.Initializing}),Object.defineProperty(o(n),y,{writable:!0,value:void 0}),Object.defineProperty(o(n),m,{writable:!0,value:0}),Object.defineProperty(o(n),O,{writable:!0,value:new Set}),void 0===t.eventSourceConstructor&&(t.eventSourceConstructor=EventSource),void 0===t.maxReconnectAttempts&&(t.maxReconnectAttempts=5),u(o(n),h)[h]=t,u(o(n),g)[g](),n}r=e,(n=i).prototype=Object.create(r.prototype),n.prototype.constructor=n,t(n,r);var c=i.prototype;return c.on=function(e,t){this.addEventListener(e,t)},c.listenOn=function(e,t){var n=this;return u(this,S)[S](e,t),function(r){var o=u(n,v)[v].get(e);void 0!==o&&(o.delete(t),(null!=r?r:u(n,h)[h].removeSubscriptionOnZeroListener)&&0===o.size&&u(n,R)[R](e))}},c.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},i}(/*#__PURE__*/r(EventTarget));function E(e){u(this,b)[b]=e,this.dispatchEvent(new CustomEvent(e))}function T(){var e=this;u(this,w)[w](p.Connecting);var t=new URL(u(this,h)[h].endpoint);t.searchParams.append("uid",u(this,d)[d]),u(this,y)[y]=new(u(this,h)[h].eventSourceConstructor)(t.toString()),u(this,y)[y].addEventListener("message",u(this,P)[P].bind(this)),u(this,y)[y].addEventListener("error",u(this,j)[j].bind(this)),u(this,y)[y].addEventListener("open",function(){u(e,w)[w](p.Connected),u(e,m)[m]=0})}function A(e){var t=JSON.parse(e.data),n=u(this,v)[v].get(t.channel);if(void 0!==n)for(var r,o=c(n);!(r=o()).done;)(0,r.value)(t.payload)}function x(){u(this,b)[b]!==p.Reconnecting&&u(this,w)[w](p.Disconnected),u(this,w)[w](p.Reconnecting),u(this,h)[h].onReconnectAttempt&&u(this,h)[h].onReconnectAttempt(u(this,m)[m]+1),u(this,h)[h].maxReconnectAttempts&&u(this,m)[m]>=u(this,h)[h].maxReconnectAttempts&&(u(this,y)[y].close(),u(this,h)[h].onReconnectFailed&&u(this,h)[h].onReconnectFailed()),u(this,m)[m]++;for(var e,t=c(u(this,v)[v].keys());!(e=t()).done;){var n=e.value;u(this,S)[S](n)}}exports.Transmit=_,exports.TransmitStatus=p;
1
+ function e(t){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e(t)}function t(e,n){return t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,r,o){return n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,n,r){var o=[null];o.push.apply(o,n);var i=new(Function.bind.apply(e,o));return r&&t(i,r.prototype),i},n.apply(null,arguments)}function r(o){var i="function"==typeof Map?new Map:void 0;return r=function(r){if(null===r||-1===Function.toString.call(r).indexOf("[native code]"))return r;if("function"!=typeof r)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(r))return i.get(r);i.set(r,o)}function o(){return n(r,arguments,e(this).constructor)}return o.prototype=Object.create(r.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),t(o,r)},r(o)}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return i(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)?i(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s=0;function a(e){return"__private_"+s+++"_"+e}function u(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=this,n=new Request("/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:u(t,d)[d],channel:e})});return u(t,v)[v].beforeUnsubscribe&&u(t,v)[v].beforeUnsubscribe(n),Promise.resolve(fetch(n)).then(function(e){if(!e.ok)throw new Error(e.statusText)})}catch(e){return Promise.reject(e)}},l=function(e,t){try{var n=this;if(u(n,b)[b]!==p.Connected)return Promise.resolve(new Promise(function(r){setTimeout(function(){r(u(n,S)[S](e,t))},100)}));var r=u(n,h)[h].get(e);if(void 0!==r)return r.add(t),Promise.resolve();if(u(n,O)[O].has(e))return Promise.resolve(new Promise(function(r){setTimeout(function(){r(u(n,S)[S](e,t))},100)}));u(n,O)[O].add(e);var o=new Request("/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:u(n,d)[d],channel:e})});return u(n,v)[v].beforeSubscribe&&u(n,v)[v].beforeSubscribe(o),Promise.resolve(fetch(o)).then(function(r){if(!r.ok)throw new Error(r.statusText);if(void 0!==t){var o=u(n,h)[h].get(e);void 0===o?u(n,h)[h].set(e,new Set([t])):o.add(t),u(n,O)[O].has(e)&&u(n,O)[O].delete(e)}})}catch(e){return Promise.reject(e)}},p={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},d=/*#__PURE__*/a("uid"),v=/*#__PURE__*/a("options"),h=/*#__PURE__*/a("listeners"),b=/*#__PURE__*/a("status"),y=/*#__PURE__*/a("eventSource"),m=/*#__PURE__*/a("reconnectAttempts"),O=/*#__PURE__*/a("channelSubscriptionLock"),w=/*#__PURE__*/a("changeStatus"),g=/*#__PURE__*/a("connect"),P=/*#__PURE__*/a("onMessage"),j=/*#__PURE__*/a("onError"),S=/*#__PURE__*/a("subscribe"),R=/*#__PURE__*/a("unsubscribe"),_=/*#__PURE__*/function(e){var n,r;function i(t){var n;return n=e.call(this)||this,Object.defineProperty(o(n),R,{value:f}),Object.defineProperty(o(n),S,{value:l}),Object.defineProperty(o(n),j,{value:C}),Object.defineProperty(o(n),P,{value:A}),Object.defineProperty(o(n),g,{value:T}),Object.defineProperty(o(n),w,{value:E}),Object.defineProperty(o(n),d,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(o(n),v,{writable:!0,value:void 0}),Object.defineProperty(o(n),h,{writable:!0,value:new Map}),Object.defineProperty(o(n),b,{writable:!0,value:p.Initializing}),Object.defineProperty(o(n),y,{writable:!0,value:void 0}),Object.defineProperty(o(n),m,{writable:!0,value:0}),Object.defineProperty(o(n),O,{writable:!0,value:new Set}),void 0===t.eventSourceConstructor&&(t.eventSourceConstructor=EventSource),void 0===t.maxReconnectAttempts&&(t.maxReconnectAttempts=5),void 0===t.removeSubscriptionOnZeroListener&&(t.removeSubscriptionOnZeroListener=!1),u(o(n),v)[v]=t,u(o(n),g)[g](),n}r=e,(n=i).prototype=Object.create(r.prototype),n.prototype.constructor=n,t(n,r);var c=i.prototype;return c.on=function(e,t){this.addEventListener(e,t)},c.listenOn=function(e,t){var n=this;return u(this,S)[S](e,t),function(r){var o=u(n,h)[h].get(e);void 0!==o&&(o.delete(t),(null!=r?r:u(n,v)[v].removeSubscriptionOnZeroListener)&&0===o.size&&u(n,R)[R](e))}},c.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},c.close=function(){u(this,y)[y].close()},i}(/*#__PURE__*/r(EventTarget));function E(e){u(this,b)[b]=e,this.dispatchEvent(new CustomEvent(e))}function T(){var e=this;u(this,w)[w](p.Connecting);var t=new URL(u(this,v)[v].baseUrl+"/__transmit/events");t.searchParams.append("uid",u(this,d)[d]),u(this,y)[y]=new(u(this,v)[v].eventSourceConstructor)(t.toString(),{withCredentials:!0}),u(this,y)[y].addEventListener("message",u(this,P)[P].bind(this)),u(this,y)[y].addEventListener("error",u(this,j)[j].bind(this)),u(this,y)[y].addEventListener("open",function(){u(e,w)[w](p.Connected),u(e,m)[m]=0})}function A(e){var t=JSON.parse(e.data),n=u(this,h)[h].get(t.channel);if(void 0!==n)for(var r,o=c(n);!(r=o()).done;)(0,r.value)(t.payload)}function C(){if(u(this,b)[b]!==p.Reconnecting&&u(this,w)[w](p.Disconnected),u(this,w)[w](p.Reconnecting),u(this,v)[v].onReconnectAttempt&&u(this,v)[v].onReconnectAttempt(u(this,m)[m]+1),u(this,v)[v].maxReconnectAttempts&&u(this,m)[m]>=u(this,v)[v].maxReconnectAttempts)return u(this,y)[y].close(),void(u(this,v)[v].onReconnectFailed&&u(this,v)[v].onReconnectFailed());u(this,m)[m]++;for(var e,t=c(u(this,h)[h].keys());!(e=t()).done;){var n=e.value;u(this,S)[S](n)}}exports.Transmit=_,exports.TransmitStatus=p;
2
2
  //# sourceMappingURL=transmit.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transmit.cjs","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n endpoint: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n 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.endpoint)\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString())\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n}\n"],"names":["channel","_this5","this","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","_uid","_options","beforeUnsubscribe","Promise","resolve","fetch","then","response","ok","Error","statusText","e","reject","_subscribe2","callback","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","listeners","_listeners","get","add","_channelSubscriptionLock","has","beforeSubscribe","set","Set","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","call","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","removeSubscriptionOnZeroListener","size","listenOnce","unsubscribe","message","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","endpoint","searchParams","append","toString","bind","data","parse","_iterator","_step","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","close","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"uxEA8LqBA,IAAAA,EAAAA,SAAAA,OAAeC,IAAAA,EAMHC,KALvBC,EAAU,IAAIC,QAAkC,yBAAA,CACpDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAV,EAAAW,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAV,EAAAY,GAAAA,GAAcC,mBAChBH,EAAAV,EAAAY,GAAAA,GAAcC,kBAAkBX,GACjCY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAAQ,IAETA,EAASC,GACZ,UAAUC,MAAMF,EAASG,WAAW,EAExC,CAAC,MAAAC,UAAAR,QAAAS,OAAAD,EAAAE,CAAAA,EAAAA,WA7EgBzB,EAAiB0B,GAAc,QAAAC,EAC1CzB,KAAJ,GAAIS,EAAAgB,EAAAC,GAAAA,KAAiBC,EAAeC,UAClC,OAAAf,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGF,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,GAEtC,QAAyB,IAAdiC,EAET,OADAA,EAAUG,IAAIV,GACdX,QAAAC,UAGF,GAAIL,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,GACpC,OAAAe,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGFf,EAAAgB,EAAAU,GAAAA,GAA8BD,IAAIpC,GAElC,IAAMG,EAAU,IAAIC,QAAgC,uBAAA,CAClDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAgB,EAAAf,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAgB,EAAAd,GAAAA,GAAc0B,iBAChB5B,EAAAgB,EAAAd,GAAAA,GAAc0B,gBAAgBpC,GAC/BY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAEN,IAAKA,EAASC,GACZ,MAAU,IAAAC,MAAMF,EAASG,YAC1B,QAEuB,IAAbI,EAAwB,CACjC,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,QAEb,IAAdiC,EACTtB,EAAAgB,EAAAO,GAAAA,GAAgBM,IAAIxC,EAAS,IAAIyC,IAAI,CAACf,KAEtCO,EAAUG,IAAIV,GAGZf,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,IACpCW,EAAAgB,EAAAU,GAAAA,GAAA,OAAqCrC,KAG3C,CAAC,MAAAuB,GAAA,OAAAR,QAAAS,OAAAD,EAAA,CAAA,EAjLUM,EAAiB,CAC5Ba,aAAc,eACdC,WAAY,aACZb,UAAW,YACXc,aAAc,eACdC,aAAc,gBACNjC,eAAAkC,EAAA,OAAAjC,eAAAiC,aAAAZ,eAAAY,EAAAlB,aAAAA,eAAAkB,EAAA,UAAAC,eAAAD,iBAAAE,eAAAF,EAAAT,qBAAAA,eAAAS,EAAA,2BAAAG,eAAAH,kBAAAI,eAAAJ,EAAA,WAAAK,eAAAL,eAAAM,eAAAN,EAAAd,WAAAA,eAAAc,EAAA,aAAAO,eAAAP,iBAIGQ,eAASC,SAAAA,WAoCpB,SAAAD,EAAYE,OAAwBC,EAYnB,OAXfA,EAAAF,EAAAG,KAAAxD,OAAOyD,KAAAA,OAAAC,eAAAC,EAAAJ,GAAAJ,GAAAS,MAAAC,IAAAJ,OAAAC,eAAAC,EAAAJ,GAAAzB,EAAA,CAAA8B,MAAArC,IAAAkC,OAAAC,eAAAC,EAAAJ,GAAAL,EAAAU,CAAAA,MAAAE,IAAAL,OAAAC,eAAAC,EAAAJ,GAAAN,EAAAW,CAAAA,MAAAG,IAAAN,OAAAC,eAAAC,EAAAJ,GAAAP,GAAAY,MAAAI,IAAAP,OAAAC,eAAAC,EAAAJ,GAAAR,GAAAa,MAAAK,IAAAR,OAAAC,eAAAC,EAAAJ,GAAA7C,EAAA,CAAAwD,UAAA,EAAAN,MAjCMO,OAAOC,eAAYX,OAAAC,eAAAC,EAAAJ,GAAA5C,EAAA,CAAAuD,UAAAN,EAAAA,eAAAH,OAAAC,eAAAC,EAAAJ,GAAAvB,EAAAkC,CAAAA,YAAAN,MAUqB,IAAIS,MAAKZ,OAAAC,eAAAC,EAAAJ,GAAA7B,EAAA,CAAAwC,UAAAN,EAAAA,MAKrCjC,EAAea,eAAYiB,OAAAC,eAAAC,EAAAJ,GAAAV,EAAA,CAAAqB,UAAA,EAAAN,WAAAH,IAAAA,OAAAC,eAAAC,EAAAJ,GAAAT,EAAA,CAAAoB,UAAAN,EAAAA,MAUzB,IAACH,OAAAC,eAAAC,EAAAJ,GAAApB,EAAA+B,CAAAA,YAAAN,MAKU,IAAIrB,WAKI,IAAnCe,EAAQgB,yBACjBhB,EAAQgB,uBAAyBC,kBAGS,IAAjCjB,EAAQkB,uBACjBlB,EAAQkB,qBAAuB,GAGjC/D,EAAAkD,EAAAJ,GAAA5C,GAAAA,GAAgB2C,EAChB7C,EAAAkD,EAAAJ,GAAAP,GAAAA,KAAeO,CACjB,GAjDoBF,KAAAD,yEAiDnB,IAAAqB,EAAArB,EAAAsB,iBAAAD,EA4IDE,GAAA,SAAGC,EAA+CpD,GAChDxB,KAAK6E,iBAAiBD,EAAOpD,EAC/B,EAACiD,EAEDK,SAAA,SAAsBhF,EAAiB0B,GAA8BuD,IAAAA,OAGnE,OAFAtE,EAAKT,KAAI8B,GAAAA,GAAYhC,EAAS0B,GAEtBwD,SAAAA,GACN,IAAMjD,EAAYtB,EAAAsE,EAAI/C,GAAAA,GAAYC,IAAInC,QAEb,IAAdiC,IAIXA,EAAgB,OAACP,IAEZwD,MAAAA,EAAAA,EAA0BvE,EAAAsE,EAAIpE,GAAAA,GAAUsE,mCAAwD,IAAnBlD,EAAUmD,MAC1FzE,EAAKsE,EAAI5B,GAAAA,GAAcrD,GAE3B,CACF,EAAC2E,EAEDU,WAAA,SAAwBrF,EAAiB0B,GACvC,IAAM4D,EAAcpF,KAAK8E,SAAYhF,EAAS,SAACuF,GAC7C7D,EAAS6D,GACTD,GACF,EACF,EAAChC,CAAA,CAxNmBC,cAwNnBiC,EAxN2BC,cAyN7B,SAAAtB,EAtKeuB,GACZ/E,EAAIT,KAAA0B,GAAAA,GAAW8D,EACfxF,KAAKyF,cAAc,IAAIC,YAAYF,GACrC,CAAC,SAAAxB,IAEO2B,IAAAA,EACNlF,KAAAA,OAAIsC,GAAAA,GAAepB,EAAec,YAElC,IAAMmD,EAAM,IAAIC,IAAIpF,EAAIT,KAAAW,GAAAA,GAAUmF,UAClCF,EAAIG,aAAaC,OAAO,MAAKvF,EAAET,KAAIU,GAAAA,IAEnCD,OAAIoC,GAAAA,GAAgB,IAAIpC,EAAAT,KAAIW,GAAAA,GAAgC,wBAACiF,EAAIK,YACjExF,EAAIT,KAAA6C,GAAAA,GAAcgC,iBAAiB,UAAWpE,OAAIwC,GAAAA,GAAYiD,KAAKlG,OACnES,EAAAT,KAAI6C,GAAAA,GAAcgC,iBAAiB,QAASpE,EAAIT,KAAAkD,GAAAA,GAAUgD,KAAKlG,OAC/DS,OAAIoC,GAAAA,GAAcgC,iBAAiB,OAAQ,WACzCpE,EAAAkF,EAAI5C,GAAAA,GAAepB,EAAeC,WAClCnB,EAAAkF,EAAI7C,GAAAA,GAAsB,CAC5B,EACF,CAAC,SAAAiB,EAEUa,GACT,IAAMuB,EAAO7F,KAAK8F,MAAMxB,EAAMuB,MACxBpE,EAAYtB,EAAIT,KAAAgC,GAAAA,GAAYC,IAAIkE,EAAKrG,SAE3C,QAAyB,IAAdiC,EAIX,IAAAsE,IAAgCC,EAAhCD,EAAAE,EAAuBxE,KAASuE,EAAAD,KAAAG,OAC9BC,EADiBH,EAAA1C,OACRuC,EAAKO,QAElB,CAAC,SAAA5C,IAGKrD,OAAIiB,GAAAA,KAAaC,EAAegB,cAClClC,OAAIsC,GAAAA,GAAepB,EAAee,cAGpCjC,EAAIT,KAAA+C,GAAAA,GAAepB,EAAegB,cAE9BlC,EAAIT,KAAAW,GAAAA,GAAUgG,oBAChBlG,OAAIE,GAAAA,GAAUgG,mBAAmBlG,OAAIqC,GAAAA,GAAsB,GAGzDrC,EAAAT,KAAIW,GAAAA,GAAU6D,sBAAwB/D,EAAAT,KAAI8C,GAAAA,IAAuBrC,OAAIE,GAAAA,GAAU6D,uBACjF/D,EAAAT,KAAI6C,GAAAA,GAAc+D,QAEdnG,EAAAT,KAAIW,GAAAA,GAAUkG,mBAChBpG,EAAIT,KAAAW,GAAAA,GAAUkG,qBAIlBpG,EAAIT,KAAA8C,GAAAA,KAEJ,QAA4CgE,EAA5CC,EAAAR,EAAsB9F,OAAIuB,GAAAA,GAAYgF,UAAMF,EAAAC,KAAAP,MAAE,KAAnC1G,EAAOgH,EAAAlD,MAChBnD,EAAKT,KAAI8B,GAAAA,GAAYhC,EACtB,CACH"}
1
+ {"version":3,"file":"transmit.cjs","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["channel","_this5","this","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","_uid","_options","beforeUnsubscribe","Promise","resolve","fetch","then","response","ok","Error","statusText","e","reject","_subscribe2","callback","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","listeners","_listeners","get","add","_channelSubscriptionLock","has","beforeSubscribe","set","Set","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","call","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","size","listenOnce","unsubscribe","message","close","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_step","_iterator","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  interface TransmitOptions {
2
- endpoint: string;
2
+ baseUrl: string;
3
3
  eventSourceConstructor?: typeof EventSource;
4
4
  beforeSubscribe?: (request: RequestInit) => void;
5
5
  beforeUnsubscribe?: (request: RequestInit) => void;
@@ -22,5 +22,6 @@ export declare class Transmit extends EventTarget {
22
22
  on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void): void;
23
23
  listenOn<T = unknown>(channel: string, callback: (message: T) => void): (unsubscribeOnTheServer?: boolean) => void;
24
24
  listenOnce<T = unknown>(channel: string, callback: (message: T) => void): void;
25
+ close(): void;
25
26
  }
26
27
  export {};
@@ -1,2 +1,2 @@
1
- var t=0;function e(e){return"__private_"+t+++"_"+e}function n(t,e){if(!Object.prototype.hasOwnProperty.call(t,e))throw new TypeError("attempted to use private field on non-instance");return t}const i={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"};var s=/*#__PURE__*/e("uid"),o=/*#__PURE__*/e("options"),r=/*#__PURE__*/e("listeners"),c=/*#__PURE__*/e("status"),h=/*#__PURE__*/e("eventSource"),a=/*#__PURE__*/e("reconnectAttempts"),d=/*#__PURE__*/e("channelSubscriptionLock"),u=/*#__PURE__*/e("changeStatus"),b=/*#__PURE__*/e("connect"),p=/*#__PURE__*/e("onMessage"),l=/*#__PURE__*/e("onError"),f=/*#__PURE__*/e("subscribe"),v=/*#__PURE__*/e("unsubscribe");class y extends EventTarget{constructor(t){super(),Object.defineProperty(this,v,{value:S}),Object.defineProperty(this,f,{value:P}),Object.defineProperty(this,l,{value:g}),Object.defineProperty(this,p,{value:O}),Object.defineProperty(this,b,{value:m}),Object.defineProperty(this,u,{value:w}),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,h,{writable:!0,value:void 0}),Object.defineProperty(this,a,{writable:!0,value:0}),Object.defineProperty(this,d,{writable:!0,value:new Set}),void 0===t.eventSourceConstructor&&(t.eventSourceConstructor=EventSource),void 0===t.maxReconnectAttempts&&(t.maxReconnectAttempts=5),n(this,o)[o]=t,n(this,b)[b]()}on(t,e){this.addEventListener(t,e)}listenOn(t,e){return n(this,f)[f](t,e),i=>{const s=n(this,r)[r].get(t);void 0!==s&&(s.delete(e),(null!=i?i:n(this,o)[o].removeSubscriptionOnZeroListener)&&0===s.size&&n(this,v)[v](t))}}listenOnce(t,e){const n=this.listenOn(t,t=>{e(t),n()})}}function w(t){n(this,c)[c]=t,this.dispatchEvent(new CustomEvent(t))}function m(){n(this,u)[u](i.Connecting);const t=new URL(n(this,o)[o].endpoint);t.searchParams.append("uid",n(this,s)[s]),n(this,h)[h]=new(n(this,o)[o].eventSourceConstructor)(t.toString()),n(this,h)[h].addEventListener("message",n(this,p)[p].bind(this)),n(this,h)[h].addEventListener("error",n(this,l)[l].bind(this)),n(this,h)[h].addEventListener("open",()=>{n(this,u)[u](i.Connected),n(this,a)[a]=0})}function O(t){const e=JSON.parse(t.data),i=n(this,r)[r].get(e.channel);if(void 0!==i)for(const t of i)t(e.payload)}function g(){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,a)[a]+1),n(this,o)[o].maxReconnectAttempts&&n(this,a)[a]>=n(this,o)[o].maxReconnectAttempts&&(n(this,h)[h].close(),n(this,o)[o].onReconnectFailed&&n(this,o)[o].onReconnectFailed()),n(this,a)[a]++;for(const t of n(this,r)[r].keys())n(this,f)[f](t)}async function P(t,e){if(n(this,c)[c]!==i.Connected)return new Promise(i=>{setTimeout(()=>{i(n(this,f)[f](t,e))},100)});const h=n(this,r)[r].get(t);if(void 0!==h)return void h.add(e);if(n(this,d)[d].has(t))return new Promise(i=>{setTimeout(()=>{i(n(this,f)[f](t,e))},100)});n(this,d)[d].add(t);const a=new Request("__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:n(this,s)[s],channel:t})});n(this,o)[o].beforeSubscribe&&n(this,o)[o].beforeSubscribe(a);const u=await fetch(a);if(!u.ok)throw new Error(u.statusText);if(void 0!==e){const i=n(this,r)[r].get(t);void 0===i?n(this,r)[r].set(t,new Set([e])):i.add(e),n(this,d)[d].has(t)&&n(this,d)[d].delete(t)}}async function S(t){const e=new Request("__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:n(this,s)[s],channel:t})});n(this,o)[o].beforeUnsubscribe&&n(this,o)[o].beforeUnsubscribe(e);const i=await fetch(e);if(!i.ok)throw new Error(i.statusText)}export{y as Transmit,i as TransmitStatus};
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"),h=/*#__PURE__*/t("eventSource"),a=/*#__PURE__*/t("reconnectAttempts"),d=/*#__PURE__*/t("channelSubscriptionLock"),u=/*#__PURE__*/t("changeStatus"),b=/*#__PURE__*/t("connect"),l=/*#__PURE__*/t("onMessage"),p=/*#__PURE__*/t("onError"),v=/*#__PURE__*/t("subscribe"),f=/*#__PURE__*/t("unsubscribe");class m extends EventTarget{constructor(e){super(),Object.defineProperty(this,f,{value:P}),Object.defineProperty(this,v,{value:S}),Object.defineProperty(this,p,{value:g}),Object.defineProperty(this,l,{value:O}),Object.defineProperty(this,b,{value:y}),Object.defineProperty(this,u,{value:w}),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,h,{writable:!0,value:void 0}),Object.defineProperty(this,a,{writable:!0,value:0}),Object.defineProperty(this,d,{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,b)[b]()}on(e,t){this.addEventListener(e,t)}listenOn(e,t){return n(this,v)[v](e,t),i=>{const s=n(this,r)[r].get(e);void 0!==s&&(s.delete(t),(null!=i?i:n(this,o)[o].removeSubscriptionOnZeroListener)&&0===s.size&&n(this,f)[f](e))}}listenOnce(e,t){const n=this.listenOn(e,e=>{t(e),n()})}close(){n(this,h)[h].close()}}function w(e){n(this,c)[c]=e,this.dispatchEvent(new CustomEvent(e))}function y(){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,h)[h]=new(n(this,o)[o].eventSourceConstructor)(e.toString(),{withCredentials:!0}),n(this,h)[h].addEventListener("message",n(this,l)[l].bind(this)),n(this,h)[h].addEventListener("error",n(this,p)[p].bind(this)),n(this,h)[h].addEventListener("open",()=>{n(this,u)[u](i.Connected),n(this,a)[a]=0})}function O(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 g(){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,a)[a]+1),n(this,o)[o].maxReconnectAttempts&&n(this,a)[a]>=n(this,o)[o].maxReconnectAttempts)return n(this,h)[h].close(),void(n(this,o)[o].onReconnectFailed&&n(this,o)[o].onReconnectFailed());n(this,a)[a]++;for(const e of n(this,r)[r].keys())n(this,v)[v](e)}async function S(e,t){if(n(this,c)[c]!==i.Connected)return new Promise(i=>{setTimeout(()=>{i(n(this,v)[v](e,t))},100)});const h=n(this,r)[r].get(e);if(void 0!==h)return void h.add(t);if(n(this,d)[d].has(e))return new Promise(i=>{setTimeout(()=>{i(n(this,v)[v](e,t))},100)});n(this,d)[d].add(e);const a=new Request("/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:n(this,s)[s],channel:e})});n(this,o)[o].beforeSubscribe&&n(this,o)[o].beforeSubscribe(a);const u=await fetch(a);if(!u.ok)throw new Error(u.statusText);if(void 0!==t){const i=n(this,r)[r].get(e);void 0===i?n(this,r)[r].set(e,new Set([t])):i.add(t),n(this,d)[d].has(e)&&n(this,d)[d].delete(e)}}async function P(e){const t=new Request("/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:n(this,s)[s],channel:e})});n(this,o)[o].beforeUnsubscribe&&n(this,o)[o].beforeUnsubscribe(t);const i=await fetch(t);if(!i.ok)throw new Error(i.statusText)}export{m as Transmit,i as TransmitStatus};
2
2
  //# sourceMappingURL=transmit.modern.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transmit.modern.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n endpoint: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n 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.endpoint)\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString())\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n}\n"],"names":["TransmitStatus","Initializing","Connecting","Connected","Disconnected","Reconnecting","_uid","_classPrivateFieldLooseKey","_options","_listeners","_status","_eventSource","_reconnectAttempts","_channelSubscriptionLock","_changeStatus","_connect","_onMessage","_onError","_subscribe","_unsubscribe","Transmit","EventTarget","constructor","options","super","Object","defineProperty","value","_unsubscribe2","_subscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","this","writable","crypto","randomUUID","Map","Set","eventSourceConstructor","EventSource","maxReconnectAttempts","_classPrivateFieldLooseBase","on","event","callback","addEventListener","listenOn","channel","unsubscribeOnTheServer","listeners","get","delete","removeSubscriptionOnZeroListener","size","listenOnce","unsubscribe","message","status","dispatchEvent","CustomEvent","url","URL","endpoint","searchParams","append","toString","bind","data","JSON","parse","listener","payload","onReconnectAttempt","close","onReconnectFailed","keys","async","Promise","resolve","setTimeout","add","has","request","Request","method","headers","body","stringify","uid","beforeSubscribe","response","fetch","ok","Error","statusText","set","beforeUnsubscribe"],"mappings":"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"}
1
+ {"version":3,"file":"transmit.modern.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["TransmitStatus","Initializing","Connecting","Connected","Disconnected","Reconnecting","_uid","_classPrivateFieldLooseKey","_options","_listeners","_status","_eventSource","_reconnectAttempts","_channelSubscriptionLock","_changeStatus","_connect","_onMessage","_onError","_subscribe","_unsubscribe","Transmit","EventTarget","constructor","options","super","Object","defineProperty","value","_unsubscribe2","_subscribe2","this","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","Set","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_classPrivateFieldLooseBase","on","event","callback","addEventListener","listenOn","channel","unsubscribeOnTheServer","listeners","get","delete","size","listenOnce","unsubscribe","message","close","status","dispatchEvent","CustomEvent","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","JSON","parse","listener","payload","onReconnectAttempt","onReconnectFailed","keys","async","Promise","resolve","setTimeout","add","has","request","Request","method","headers","body","stringify","uid","beforeSubscribe","response","fetch","ok","Error","statusText","set","beforeUnsubscribe"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- function e(t){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e(t)}function t(e,n){return t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,r,o){return n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,n,r){var o=[null];o.push.apply(o,n);var i=new(Function.bind.apply(e,o));return r&&t(i,r.prototype),i},n.apply(null,arguments)}function r(o){var i="function"==typeof Map?new Map:void 0;return r=function(r){if(null===r||-1===Function.toString.call(r).indexOf("[native code]"))return r;if("function"!=typeof r)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(r))return i.get(r);i.set(r,o)}function o(){return n(r,arguments,e(this).constructor)}return o.prototype=Object.create(r.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),t(o,r)},r(o)}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return i(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)?i(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 u(e){return"__private_"+s+++"_"+e}function a(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}var f=function(e){try{var t=this,n=new Request("__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:a(t,d)[d],channel:e})});return a(t,h)[h].beforeUnsubscribe&&a(t,h)[h].beforeUnsubscribe(n),Promise.resolve(fetch(n)).then(function(e){if(!e.ok)throw new Error(e.statusText)})}catch(e){return Promise.reject(e)}},l=function(e,t){try{var n=this;if(a(n,b)[b]!==p.Connected)return Promise.resolve(new Promise(function(r){setTimeout(function(){r(a(n,S)[S](e,t))},100)}));var r=a(n,v)[v].get(e);if(void 0!==r)return r.add(t),Promise.resolve();if(a(n,O)[O].has(e))return Promise.resolve(new Promise(function(r){setTimeout(function(){r(a(n,S)[S](e,t))},100)}));a(n,O)[O].add(e);var o=new Request("__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:a(n,d)[d],channel:e})});return a(n,h)[h].beforeSubscribe&&a(n,h)[h].beforeSubscribe(o),Promise.resolve(fetch(o)).then(function(r){if(!r.ok)throw new Error(r.statusText);if(void 0!==t){var o=a(n,v)[v].get(e);void 0===o?a(n,v)[v].set(e,new Set([t])):o.add(t),a(n,O)[O].has(e)&&a(n,O)[O].delete(e)}})}catch(e){return Promise.reject(e)}},p={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},d=/*#__PURE__*/u("uid"),h=/*#__PURE__*/u("options"),v=/*#__PURE__*/u("listeners"),b=/*#__PURE__*/u("status"),y=/*#__PURE__*/u("eventSource"),m=/*#__PURE__*/u("reconnectAttempts"),O=/*#__PURE__*/u("channelSubscriptionLock"),w=/*#__PURE__*/u("changeStatus"),g=/*#__PURE__*/u("connect"),P=/*#__PURE__*/u("onMessage"),j=/*#__PURE__*/u("onError"),S=/*#__PURE__*/u("subscribe"),R=/*#__PURE__*/u("unsubscribe"),_=/*#__PURE__*/function(e){var n,r;function i(t){var n;return n=e.call(this)||this,Object.defineProperty(o(n),R,{value:f}),Object.defineProperty(o(n),S,{value:l}),Object.defineProperty(o(n),j,{value:T}),Object.defineProperty(o(n),P,{value:C}),Object.defineProperty(o(n),g,{value:A}),Object.defineProperty(o(n),w,{value:E}),Object.defineProperty(o(n),d,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(o(n),h,{writable:!0,value:void 0}),Object.defineProperty(o(n),v,{writable:!0,value:new Map}),Object.defineProperty(o(n),b,{writable:!0,value:p.Initializing}),Object.defineProperty(o(n),y,{writable:!0,value:void 0}),Object.defineProperty(o(n),m,{writable:!0,value:0}),Object.defineProperty(o(n),O,{writable:!0,value:new Set}),void 0===t.eventSourceConstructor&&(t.eventSourceConstructor=EventSource),void 0===t.maxReconnectAttempts&&(t.maxReconnectAttempts=5),a(o(n),h)[h]=t,a(o(n),g)[g](),n}r=e,(n=i).prototype=Object.create(r.prototype),n.prototype.constructor=n,t(n,r);var c=i.prototype;return c.on=function(e,t){this.addEventListener(e,t)},c.listenOn=function(e,t){var n=this;return a(this,S)[S](e,t),function(r){var o=a(n,v)[v].get(e);void 0!==o&&(o.delete(t),(null!=r?r:a(n,h)[h].removeSubscriptionOnZeroListener)&&0===o.size&&a(n,R)[R](e))}},c.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},i}(/*#__PURE__*/r(EventTarget));function E(e){a(this,b)[b]=e,this.dispatchEvent(new CustomEvent(e))}function A(){var e=this;a(this,w)[w](p.Connecting);var t=new URL(a(this,h)[h].endpoint);t.searchParams.append("uid",a(this,d)[d]),a(this,y)[y]=new(a(this,h)[h].eventSourceConstructor)(t.toString()),a(this,y)[y].addEventListener("message",a(this,P)[P].bind(this)),a(this,y)[y].addEventListener("error",a(this,j)[j].bind(this)),a(this,y)[y].addEventListener("open",function(){a(e,w)[w](p.Connected),a(e,m)[m]=0})}function C(e){var t=JSON.parse(e.data),n=a(this,v)[v].get(t.channel);if(void 0!==n)for(var r,o=c(n);!(r=o()).done;)(0,r.value)(t.payload)}function T(){a(this,b)[b]!==p.Reconnecting&&a(this,w)[w](p.Disconnected),a(this,w)[w](p.Reconnecting),a(this,h)[h].onReconnectAttempt&&a(this,h)[h].onReconnectAttempt(a(this,m)[m]+1),a(this,h)[h].maxReconnectAttempts&&a(this,m)[m]>=a(this,h)[h].maxReconnectAttempts&&(a(this,y)[y].close(),a(this,h)[h].onReconnectFailed&&a(this,h)[h].onReconnectFailed()),a(this,m)[m]++;for(var e,t=c(a(this,v)[v].keys());!(e=t()).done;){var n=e.value;a(this,S)[S](n)}}export{_ as Transmit,p as TransmitStatus};
1
+ function e(t){return e=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},e(t)}function t(e,n){return t=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},t(e,n)}function n(e,r,o){return n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,n,r){var o=[null];o.push.apply(o,n);var i=new(Function.bind.apply(e,o));return r&&t(i,r.prototype),i},n.apply(null,arguments)}function r(o){var i="function"==typeof Map?new Map:void 0;return r=function(r){if(null===r||-1===Function.toString.call(r).indexOf("[native code]"))return r;if("function"!=typeof r)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(r))return i.get(r);i.set(r,o)}function o(){return n(r,arguments,e(this).constructor)}return o.prototype=Object.create(r.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),t(o,r)},r(o)}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function c(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(n)return(n=n.call(e)).next.bind(n);if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return i(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)?i(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 u(e){return"__private_"+s+++"_"+e}function a(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}var f=function(e){try{var t=this,n=new Request("/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:a(t,d)[d],channel:e})});return a(t,v)[v].beforeUnsubscribe&&a(t,v)[v].beforeUnsubscribe(n),Promise.resolve(fetch(n)).then(function(e){if(!e.ok)throw new Error(e.statusText)})}catch(e){return Promise.reject(e)}},l=function(e,t){try{var n=this;if(a(n,b)[b]!==p.Connected)return Promise.resolve(new Promise(function(r){setTimeout(function(){r(a(n,S)[S](e,t))},100)}));var r=a(n,h)[h].get(e);if(void 0!==r)return r.add(t),Promise.resolve();if(a(n,O)[O].has(e))return Promise.resolve(new Promise(function(r){setTimeout(function(){r(a(n,S)[S](e,t))},100)}));a(n,O)[O].add(e);var o=new Request("/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:a(n,d)[d],channel:e})});return a(n,v)[v].beforeSubscribe&&a(n,v)[v].beforeSubscribe(o),Promise.resolve(fetch(o)).then(function(r){if(!r.ok)throw new Error(r.statusText);if(void 0!==t){var o=a(n,h)[h].get(e);void 0===o?a(n,h)[h].set(e,new Set([t])):o.add(t),a(n,O)[O].has(e)&&a(n,O)[O].delete(e)}})}catch(e){return Promise.reject(e)}},p={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},d=/*#__PURE__*/u("uid"),v=/*#__PURE__*/u("options"),h=/*#__PURE__*/u("listeners"),b=/*#__PURE__*/u("status"),y=/*#__PURE__*/u("eventSource"),m=/*#__PURE__*/u("reconnectAttempts"),O=/*#__PURE__*/u("channelSubscriptionLock"),w=/*#__PURE__*/u("changeStatus"),g=/*#__PURE__*/u("connect"),P=/*#__PURE__*/u("onMessage"),j=/*#__PURE__*/u("onError"),S=/*#__PURE__*/u("subscribe"),R=/*#__PURE__*/u("unsubscribe"),_=/*#__PURE__*/function(e){var n,r;function i(t){var n;return n=e.call(this)||this,Object.defineProperty(o(n),R,{value:f}),Object.defineProperty(o(n),S,{value:l}),Object.defineProperty(o(n),j,{value:T}),Object.defineProperty(o(n),P,{value:C}),Object.defineProperty(o(n),g,{value:A}),Object.defineProperty(o(n),w,{value:E}),Object.defineProperty(o(n),d,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(o(n),v,{writable:!0,value:void 0}),Object.defineProperty(o(n),h,{writable:!0,value:new Map}),Object.defineProperty(o(n),b,{writable:!0,value:p.Initializing}),Object.defineProperty(o(n),y,{writable:!0,value:void 0}),Object.defineProperty(o(n),m,{writable:!0,value:0}),Object.defineProperty(o(n),O,{writable:!0,value:new Set}),void 0===t.eventSourceConstructor&&(t.eventSourceConstructor=EventSource),void 0===t.maxReconnectAttempts&&(t.maxReconnectAttempts=5),void 0===t.removeSubscriptionOnZeroListener&&(t.removeSubscriptionOnZeroListener=!1),a(o(n),v)[v]=t,a(o(n),g)[g](),n}r=e,(n=i).prototype=Object.create(r.prototype),n.prototype.constructor=n,t(n,r);var c=i.prototype;return c.on=function(e,t){this.addEventListener(e,t)},c.listenOn=function(e,t){var n=this;return a(this,S)[S](e,t),function(r){var o=a(n,h)[h].get(e);void 0!==o&&(o.delete(t),(null!=r?r:a(n,v)[v].removeSubscriptionOnZeroListener)&&0===o.size&&a(n,R)[R](e))}},c.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},c.close=function(){a(this,y)[y].close()},i}(/*#__PURE__*/r(EventTarget));function E(e){a(this,b)[b]=e,this.dispatchEvent(new CustomEvent(e))}function A(){var e=this;a(this,w)[w](p.Connecting);var t=new URL(a(this,v)[v].baseUrl+"/__transmit/events");t.searchParams.append("uid",a(this,d)[d]),a(this,y)[y]=new(a(this,v)[v].eventSourceConstructor)(t.toString(),{withCredentials:!0}),a(this,y)[y].addEventListener("message",a(this,P)[P].bind(this)),a(this,y)[y].addEventListener("error",a(this,j)[j].bind(this)),a(this,y)[y].addEventListener("open",function(){a(e,w)[w](p.Connected),a(e,m)[m]=0})}function C(e){var t=JSON.parse(e.data),n=a(this,h)[h].get(t.channel);if(void 0!==n)for(var r,o=c(n);!(r=o()).done;)(0,r.value)(t.payload)}function T(){if(a(this,b)[b]!==p.Reconnecting&&a(this,w)[w](p.Disconnected),a(this,w)[w](p.Reconnecting),a(this,v)[v].onReconnectAttempt&&a(this,v)[v].onReconnectAttempt(a(this,m)[m]+1),a(this,v)[v].maxReconnectAttempts&&a(this,m)[m]>=a(this,v)[v].maxReconnectAttempts)return a(this,y)[y].close(),void(a(this,v)[v].onReconnectFailed&&a(this,v)[v].onReconnectFailed());a(this,m)[m]++;for(var e,t=c(a(this,h)[h].keys());!(e=t()).done;){var n=e.value;a(this,S)[S](n)}}export{_ as Transmit,p as TransmitStatus};
2
2
  //# sourceMappingURL=transmit.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transmit.module.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n endpoint: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n 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.endpoint)\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString())\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n}\n"],"names":["channel","_this5","this","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","_uid","_options","beforeUnsubscribe","Promise","resolve","fetch","then","response","ok","Error","statusText","e","reject","_subscribe2","callback","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","listeners","_listeners","get","add","_channelSubscriptionLock","has","beforeSubscribe","set","Set","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","call","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","removeSubscriptionOnZeroListener","size","listenOnce","unsubscribe","message","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","endpoint","searchParams","append","toString","bind","data","parse","_iterator","_step","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","close","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"uxEA8LqBA,IAAAA,EAAAA,SAAAA,OAAeC,IAAAA,EAMHC,KALvBC,EAAU,IAAIC,QAAkC,yBAAA,CACpDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAV,EAAAW,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAV,EAAAY,GAAAA,GAAcC,mBAChBH,EAAAV,EAAAY,GAAAA,GAAcC,kBAAkBX,GACjCY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAAQ,IAETA,EAASC,GACZ,UAAUC,MAAMF,EAASG,WAAW,EAExC,CAAC,MAAAC,UAAAR,QAAAS,OAAAD,EAAAE,CAAAA,EAAAA,WA7EgBzB,EAAiB0B,GAAc,QAAAC,EAC1CzB,KAAJ,GAAIS,EAAAgB,EAAAC,GAAAA,KAAiBC,EAAeC,UAClC,OAAAf,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGF,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,GAEtC,QAAyB,IAAdiC,EAET,OADAA,EAAUG,IAAIV,GACdX,QAAAC,UAGF,GAAIL,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,GACpC,OAAAe,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGFf,EAAAgB,EAAAU,GAAAA,GAA8BD,IAAIpC,GAElC,IAAMG,EAAU,IAAIC,QAAgC,uBAAA,CAClDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAgB,EAAAf,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAgB,EAAAd,GAAAA,GAAc0B,iBAChB5B,EAAAgB,EAAAd,GAAAA,GAAc0B,gBAAgBpC,GAC/BY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAEN,IAAKA,EAASC,GACZ,MAAU,IAAAC,MAAMF,EAASG,YAC1B,QAEuB,IAAbI,EAAwB,CACjC,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,QAEb,IAAdiC,EACTtB,EAAAgB,EAAAO,GAAAA,GAAgBM,IAAIxC,EAAS,IAAIyC,IAAI,CAACf,KAEtCO,EAAUG,IAAIV,GAGZf,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,IACpCW,EAAAgB,EAAAU,GAAAA,GAAA,OAAqCrC,KAG3C,CAAC,MAAAuB,GAAA,OAAAR,QAAAS,OAAAD,EAAA,CAAA,EAjLUM,EAAiB,CAC5Ba,aAAc,eACdC,WAAY,aACZb,UAAW,YACXc,aAAc,eACdC,aAAc,gBACNjC,eAAAkC,EAAA,OAAAjC,eAAAiC,aAAAZ,eAAAY,EAAAlB,aAAAA,eAAAkB,EAAA,UAAAC,eAAAD,iBAAAE,eAAAF,EAAAT,qBAAAA,eAAAS,EAAA,2BAAAG,eAAAH,kBAAAI,eAAAJ,EAAA,WAAAK,eAAAL,eAAAM,eAAAN,EAAAd,WAAAA,eAAAc,EAAA,aAAAO,eAAAP,iBAIGQ,eAASC,SAAAA,WAoCpB,SAAAD,EAAYE,OAAwBC,EAYnB,OAXfA,EAAAF,EAAAG,KAAAxD,OAAOyD,KAAAA,OAAAC,eAAAC,EAAAJ,GAAAJ,GAAAS,MAAAC,IAAAJ,OAAAC,eAAAC,EAAAJ,GAAAzB,EAAA,CAAA8B,MAAArC,IAAAkC,OAAAC,eAAAC,EAAAJ,GAAAL,EAAAU,CAAAA,MAAAE,IAAAL,OAAAC,eAAAC,EAAAJ,GAAAN,EAAAW,CAAAA,MAAAG,IAAAN,OAAAC,eAAAC,EAAAJ,GAAAP,GAAAY,MAAAI,IAAAP,OAAAC,eAAAC,EAAAJ,GAAAR,GAAAa,MAAAK,IAAAR,OAAAC,eAAAC,EAAAJ,GAAA7C,EAAA,CAAAwD,UAAA,EAAAN,MAjCMO,OAAOC,eAAYX,OAAAC,eAAAC,EAAAJ,GAAA5C,EAAA,CAAAuD,UAAAN,EAAAA,eAAAH,OAAAC,eAAAC,EAAAJ,GAAAvB,EAAAkC,CAAAA,YAAAN,MAUqB,IAAIS,MAAKZ,OAAAC,eAAAC,EAAAJ,GAAA7B,EAAA,CAAAwC,UAAAN,EAAAA,MAKrCjC,EAAea,eAAYiB,OAAAC,eAAAC,EAAAJ,GAAAV,EAAA,CAAAqB,UAAA,EAAAN,WAAAH,IAAAA,OAAAC,eAAAC,EAAAJ,GAAAT,EAAA,CAAAoB,UAAAN,EAAAA,MAUzB,IAACH,OAAAC,eAAAC,EAAAJ,GAAApB,EAAA+B,CAAAA,YAAAN,MAKU,IAAIrB,WAKI,IAAnCe,EAAQgB,yBACjBhB,EAAQgB,uBAAyBC,kBAGS,IAAjCjB,EAAQkB,uBACjBlB,EAAQkB,qBAAuB,GAGjC/D,EAAAkD,EAAAJ,GAAA5C,GAAAA,GAAgB2C,EAChB7C,EAAAkD,EAAAJ,GAAAP,GAAAA,KAAeO,CACjB,GAjDoBF,KAAAD,yEAiDnB,IAAAqB,EAAArB,EAAAsB,iBAAAD,EA4IDE,GAAA,SAAGC,EAA+CpD,GAChDxB,KAAK6E,iBAAiBD,EAAOpD,EAC/B,EAACiD,EAEDK,SAAA,SAAsBhF,EAAiB0B,GAA8BuD,IAAAA,OAGnE,OAFAtE,EAAKT,KAAI8B,GAAAA,GAAYhC,EAAS0B,GAEtBwD,SAAAA,GACN,IAAMjD,EAAYtB,EAAAsE,EAAI/C,GAAAA,GAAYC,IAAInC,QAEb,IAAdiC,IAIXA,EAAgB,OAACP,IAEZwD,MAAAA,EAAAA,EAA0BvE,EAAAsE,EAAIpE,GAAAA,GAAUsE,mCAAwD,IAAnBlD,EAAUmD,MAC1FzE,EAAKsE,EAAI5B,GAAAA,GAAcrD,GAE3B,CACF,EAAC2E,EAEDU,WAAA,SAAwBrF,EAAiB0B,GACvC,IAAM4D,EAAcpF,KAAK8E,SAAYhF,EAAS,SAACuF,GAC7C7D,EAAS6D,GACTD,GACF,EACF,EAAChC,CAAA,CAxNmBC,cAwNnBiC,EAxN2BC,cAyN7B,SAAAtB,EAtKeuB,GACZ/E,EAAIT,KAAA0B,GAAAA,GAAW8D,EACfxF,KAAKyF,cAAc,IAAIC,YAAYF,GACrC,CAAC,SAAAxB,IAEO2B,IAAAA,EACNlF,KAAAA,OAAIsC,GAAAA,GAAepB,EAAec,YAElC,IAAMmD,EAAM,IAAIC,IAAIpF,EAAIT,KAAAW,GAAAA,GAAUmF,UAClCF,EAAIG,aAAaC,OAAO,MAAKvF,EAAET,KAAIU,GAAAA,IAEnCD,OAAIoC,GAAAA,GAAgB,IAAIpC,EAAAT,KAAIW,GAAAA,GAAgC,wBAACiF,EAAIK,YACjExF,EAAIT,KAAA6C,GAAAA,GAAcgC,iBAAiB,UAAWpE,OAAIwC,GAAAA,GAAYiD,KAAKlG,OACnES,EAAAT,KAAI6C,GAAAA,GAAcgC,iBAAiB,QAASpE,EAAIT,KAAAkD,GAAAA,GAAUgD,KAAKlG,OAC/DS,OAAIoC,GAAAA,GAAcgC,iBAAiB,OAAQ,WACzCpE,EAAAkF,EAAI5C,GAAAA,GAAepB,EAAeC,WAClCnB,EAAAkF,EAAI7C,GAAAA,GAAsB,CAC5B,EACF,CAAC,SAAAiB,EAEUa,GACT,IAAMuB,EAAO7F,KAAK8F,MAAMxB,EAAMuB,MACxBpE,EAAYtB,EAAIT,KAAAgC,GAAAA,GAAYC,IAAIkE,EAAKrG,SAE3C,QAAyB,IAAdiC,EAIX,IAAAsE,IAAgCC,EAAhCD,EAAAE,EAAuBxE,KAASuE,EAAAD,KAAAG,OAC9BC,EADiBH,EAAA1C,OACRuC,EAAKO,QAElB,CAAC,SAAA5C,IAGKrD,OAAIiB,GAAAA,KAAaC,EAAegB,cAClClC,OAAIsC,GAAAA,GAAepB,EAAee,cAGpCjC,EAAIT,KAAA+C,GAAAA,GAAepB,EAAegB,cAE9BlC,EAAIT,KAAAW,GAAAA,GAAUgG,oBAChBlG,OAAIE,GAAAA,GAAUgG,mBAAmBlG,OAAIqC,GAAAA,GAAsB,GAGzDrC,EAAAT,KAAIW,GAAAA,GAAU6D,sBAAwB/D,EAAAT,KAAI8C,GAAAA,IAAuBrC,OAAIE,GAAAA,GAAU6D,uBACjF/D,EAAAT,KAAI6C,GAAAA,GAAc+D,QAEdnG,EAAAT,KAAIW,GAAAA,GAAUkG,mBAChBpG,EAAIT,KAAAW,GAAAA,GAAUkG,qBAIlBpG,EAAIT,KAAA8C,GAAAA,KAEJ,QAA4CgE,EAA5CC,EAAAR,EAAsB9F,OAAIuB,GAAAA,GAAYgF,UAAMF,EAAAC,KAAAP,MAAE,KAAnC1G,EAAOgH,EAAAlD,MAChBnD,EAAKT,KAAI8B,GAAAA,GAAYhC,EACtB,CACH"}
1
+ {"version":3,"file":"transmit.module.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["channel","_this5","this","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","_uid","_options","beforeUnsubscribe","Promise","resolve","fetch","then","response","ok","Error","statusText","e","reject","_subscribe2","callback","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","listeners","_listeners","get","add","_channelSubscriptionLock","has","beforeSubscribe","set","Set","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","call","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","size","listenOnce","unsubscribe","message","close","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_step","_iterator","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e||self).transmitClient={})}(this,function(e){function t(e){return t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},t(e)}function n(e,t){return n=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},n(e,t)}function r(e,t,o){return r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,t,r){var o=[null];o.push.apply(o,t);var i=new(Function.bind.apply(e,o));return r&&n(i,r.prototype),i},r.apply(null,arguments)}function o(e){var i="function"==typeof Map?new Map:void 0;return o=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(e))return i.get(e);i.set(e,o)}function o(){return r(e,arguments,t(this).constructor)}return o.prototype=Object.create(e.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),n(o,e)},o(e)}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 s(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 u=0;function a(e){return"__private_"+u+++"_"+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 l=function(e){try{var t=this,n=new Request("__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:f(t,h)[h],channel:e})});return f(t,v)[v].beforeUnsubscribe&&f(t,v)[v].beforeUnsubscribe(n),Promise.resolve(fetch(n)).then(function(e){if(!e.ok)throw new Error(e.statusText)})}catch(e){return Promise.reject(e)}},d=function(e,t){try{var n=this;if(f(n,y)[y]!==p.Connected)return Promise.resolve(new Promise(function(r){setTimeout(function(){r(f(n,R)[R](e,t))},100)}));var r=f(n,b)[b].get(e);if(void 0!==r)return r.add(t),Promise.resolve();if(f(n,g)[g].has(e))return Promise.resolve(new Promise(function(r){setTimeout(function(){r(f(n,R)[R](e,t))},100)}));f(n,g)[g].add(e);var o=new Request("__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:f(n,h)[h],channel:e})});return f(n,v)[v].beforeSubscribe&&f(n,v)[v].beforeSubscribe(o),Promise.resolve(fetch(o)).then(function(r){if(!r.ok)throw new Error(r.statusText);if(void 0!==t){var o=f(n,b)[b].get(e);void 0===o?f(n,b)[b].set(e,new Set([t])):o.add(t),f(n,g)[g].has(e)&&f(n,g)[g].delete(e)}})}catch(e){return Promise.reject(e)}},p={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},h=/*#__PURE__*/a("uid"),v=/*#__PURE__*/a("options"),b=/*#__PURE__*/a("listeners"),y=/*#__PURE__*/a("status"),m=/*#__PURE__*/a("eventSource"),O=/*#__PURE__*/a("reconnectAttempts"),g=/*#__PURE__*/a("channelSubscriptionLock"),w=/*#__PURE__*/a("changeStatus"),P=/*#__PURE__*/a("connect"),j=/*#__PURE__*/a("onMessage"),S=/*#__PURE__*/a("onError"),R=/*#__PURE__*/a("subscribe"),T=/*#__PURE__*/a("unsubscribe"),_=/*#__PURE__*/function(e){var t,r;function o(t){var n;return n=e.call(this)||this,Object.defineProperty(i(n),T,{value:l}),Object.defineProperty(i(n),R,{value:d}),Object.defineProperty(i(n),S,{value:C}),Object.defineProperty(i(n),j,{value:A}),Object.defineProperty(i(n),P,{value:x}),Object.defineProperty(i(n),w,{value:E}),Object.defineProperty(i(n),h,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(i(n),v,{writable:!0,value:void 0}),Object.defineProperty(i(n),b,{writable:!0,value:new Map}),Object.defineProperty(i(n),y,{writable:!0,value:p.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),f(i(n),v)[v]=t,f(i(n),P)[P](),n}r=e,(t=o).prototype=Object.create(r.prototype),t.prototype.constructor=t,n(t,r);var c=o.prototype;return c.on=function(e,t){this.addEventListener(e,t)},c.listenOn=function(e,t){var n=this;return f(this,R)[R](e,t),function(r){var o=f(n,b)[b].get(e);void 0!==o&&(o.delete(t),(null!=r?r:f(n,v)[v].removeSubscriptionOnZeroListener)&&0===o.size&&f(n,T)[T](e))}},c.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},o}(/*#__PURE__*/o(EventTarget));function E(e){f(this,y)[y]=e,this.dispatchEvent(new CustomEvent(e))}function x(){var e=this;f(this,w)[w](p.Connecting);var t=new URL(f(this,v)[v].endpoint);t.searchParams.append("uid",f(this,h)[h]),f(this,m)[m]=new(f(this,v)[v].eventSourceConstructor)(t.toString()),f(this,m)[m].addEventListener("message",f(this,j)[j].bind(this)),f(this,m)[m].addEventListener("error",f(this,S)[S].bind(this)),f(this,m)[m].addEventListener("open",function(){f(e,w)[w](p.Connected),f(e,O)[O]=0})}function A(e){var t=JSON.parse(e.data),n=f(this,b)[b].get(t.channel);if(void 0!==n)for(var r,o=s(n);!(r=o()).done;)(0,r.value)(t.payload)}function C(){f(this,y)[y]!==p.Reconnecting&&f(this,w)[w](p.Disconnected),f(this,w)[w](p.Reconnecting),f(this,v)[v].onReconnectAttempt&&f(this,v)[v].onReconnectAttempt(f(this,O)[O]+1),f(this,v)[v].maxReconnectAttempts&&f(this,O)[O]>=f(this,v)[v].maxReconnectAttempts&&(f(this,m)[m].close(),f(this,v)[v].onReconnectFailed&&f(this,v)[v].onReconnectFailed()),f(this,O)[O]++;for(var e,t=s(f(this,b)[b].keys());!(e=t()).done;){var n=e.value;f(this,R)[R](n)}}e.Transmit=_,e.TransmitStatus=p});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e||self).transmitClient={})}(this,function(e){function t(e){return t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},t(e)}function n(e,t){return n=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},n(e,t)}function r(e,t,o){return r=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,t,r){var o=[null];o.push.apply(o,t);var i=new(Function.bind.apply(e,o));return r&&n(i,r.prototype),i},r.apply(null,arguments)}function o(e){var i="function"==typeof Map?new Map:void 0;return o=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==i){if(i.has(e))return i.get(e);i.set(e,o)}function o(){return r(e,arguments,t(this).constructor)}return o.prototype=Object.create(e.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),n(o,e)},o(e)}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 s(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 u=0;function a(e){return"__private_"+u+++"_"+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 l=function(e){try{var t=this,n=new Request("/__transmit/unsubscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:f(t,h)[h],channel:e})});return f(t,v)[v].beforeUnsubscribe&&f(t,v)[v].beforeUnsubscribe(n),Promise.resolve(fetch(n)).then(function(e){if(!e.ok)throw new Error(e.statusText)})}catch(e){return Promise.reject(e)}},d=function(e,t){try{var n=this;if(f(n,y)[y]!==p.Connected)return Promise.resolve(new Promise(function(r){setTimeout(function(){r(f(n,R)[R](e,t))},100)}));var r=f(n,b)[b].get(e);if(void 0!==r)return r.add(t),Promise.resolve();if(f(n,g)[g].has(e))return Promise.resolve(new Promise(function(r){setTimeout(function(){r(f(n,R)[R](e,t))},100)}));f(n,g)[g].add(e);var o=new Request("/__transmit/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uid:f(n,h)[h],channel:e})});return f(n,v)[v].beforeSubscribe&&f(n,v)[v].beforeSubscribe(o),Promise.resolve(fetch(o)).then(function(r){if(!r.ok)throw new Error(r.statusText);if(void 0!==t){var o=f(n,b)[b].get(e);void 0===o?f(n,b)[b].set(e,new Set([t])):o.add(t),f(n,g)[g].has(e)&&f(n,g)[g].delete(e)}})}catch(e){return Promise.reject(e)}},p={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"},h=/*#__PURE__*/a("uid"),v=/*#__PURE__*/a("options"),b=/*#__PURE__*/a("listeners"),y=/*#__PURE__*/a("status"),m=/*#__PURE__*/a("eventSource"),O=/*#__PURE__*/a("reconnectAttempts"),g=/*#__PURE__*/a("channelSubscriptionLock"),w=/*#__PURE__*/a("changeStatus"),P=/*#__PURE__*/a("connect"),j=/*#__PURE__*/a("onMessage"),S=/*#__PURE__*/a("onError"),R=/*#__PURE__*/a("subscribe"),_=/*#__PURE__*/a("unsubscribe"),T=/*#__PURE__*/function(e){var t,r;function o(t){var n;return n=e.call(this)||this,Object.defineProperty(i(n),_,{value:l}),Object.defineProperty(i(n),R,{value:d}),Object.defineProperty(i(n),S,{value:A}),Object.defineProperty(i(n),j,{value:x}),Object.defineProperty(i(n),P,{value:C}),Object.defineProperty(i(n),w,{value:E}),Object.defineProperty(i(n),h,{writable:!0,value:crypto.randomUUID()}),Object.defineProperty(i(n),v,{writable:!0,value:void 0}),Object.defineProperty(i(n),b,{writable:!0,value:new Map}),Object.defineProperty(i(n),y,{writable:!0,value:p.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),f(i(n),v)[v]=t,f(i(n),P)[P](),n}r=e,(t=o).prototype=Object.create(r.prototype),t.prototype.constructor=t,n(t,r);var c=o.prototype;return c.on=function(e,t){this.addEventListener(e,t)},c.listenOn=function(e,t){var n=this;return f(this,R)[R](e,t),function(r){var o=f(n,b)[b].get(e);void 0!==o&&(o.delete(t),(null!=r?r:f(n,v)[v].removeSubscriptionOnZeroListener)&&0===o.size&&f(n,_)[_](e))}},c.listenOnce=function(e,t){var n=this.listenOn(e,function(e){t(e),n()})},c.close=function(){f(this,m)[m].close()},o}(/*#__PURE__*/o(EventTarget));function E(e){f(this,y)[y]=e,this.dispatchEvent(new CustomEvent(e))}function C(){var e=this;f(this,w)[w](p.Connecting);var t=new URL(f(this,v)[v].baseUrl+"/__transmit/events");t.searchParams.append("uid",f(this,h)[h]),f(this,m)[m]=new(f(this,v)[v].eventSourceConstructor)(t.toString(),{withCredentials:!0}),f(this,m)[m].addEventListener("message",f(this,j)[j].bind(this)),f(this,m)[m].addEventListener("error",f(this,S)[S].bind(this)),f(this,m)[m].addEventListener("open",function(){f(e,w)[w](p.Connected),f(e,O)[O]=0})}function x(e){var t=JSON.parse(e.data),n=f(this,b)[b].get(t.channel);if(void 0!==n)for(var r,o=s(n);!(r=o()).done;)(0,r.value)(t.payload)}function A(){if(f(this,y)[y]!==p.Reconnecting&&f(this,w)[w](p.Disconnected),f(this,w)[w](p.Reconnecting),f(this,v)[v].onReconnectAttempt&&f(this,v)[v].onReconnectAttempt(f(this,O)[O]+1),f(this,v)[v].maxReconnectAttempts&&f(this,O)[O]>=f(this,v)[v].maxReconnectAttempts)return f(this,m)[m].close(),void(f(this,v)[v].onReconnectFailed&&f(this,v)[v].onReconnectFailed());f(this,O)[O]++;for(var e,t=s(f(this,b)[b].keys());!(e=t()).done;){var n=e.value;f(this,R)[R](n)}}e.Transmit=T,e.TransmitStatus=p});
2
2
  //# sourceMappingURL=transmit.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transmit.umd.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n endpoint: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n 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.endpoint)\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString())\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n}\n"],"names":["channel","_this5","this","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","_uid","_options","beforeUnsubscribe","Promise","resolve","fetch","then","response","ok","Error","statusText","e","reject","_subscribe2","callback","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","listeners","_listeners","get","add","_channelSubscriptionLock","has","beforeSubscribe","set","Set","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","call","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","removeSubscriptionOnZeroListener","size","listenOnce","unsubscribe","message","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","endpoint","searchParams","append","toString","bind","data","parse","_iterator","_step","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","close","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"+/EA8LqBA,IAAAA,EAAAA,SAAAA,OAAeC,IAAAA,EAMHC,KALvBC,EAAU,IAAIC,QAAkC,yBAAA,CACpDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAV,EAAAW,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAV,EAAAY,GAAAA,GAAcC,mBAChBH,EAAAV,EAAAY,GAAAA,GAAcC,kBAAkBX,GACjCY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAAQ,IAETA,EAASC,GACZ,UAAUC,MAAMF,EAASG,WAAW,EAExC,CAAC,MAAAC,UAAAR,QAAAS,OAAAD,EAAAE,CAAAA,EAAAA,WA7EgBzB,EAAiB0B,GAAc,QAAAC,EAC1CzB,KAAJ,GAAIS,EAAAgB,EAAAC,GAAAA,KAAiBC,EAAeC,UAClC,OAAAf,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGF,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,GAEtC,QAAyB,IAAdiC,EAET,OADAA,EAAUG,IAAIV,GACdX,QAAAC,UAGF,GAAIL,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,GACpC,OAAAe,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBe,WAAW,WACTf,EAAOL,EAAAgB,EAAAK,GAAAA,GAAiBhC,EAAS0B,GACnC,EAAG,IACL,IAGFf,EAAAgB,EAAAU,GAAAA,GAA8BD,IAAIpC,GAElC,IAAMG,EAAU,IAAIC,QAAgC,uBAAA,CAClDC,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAACC,IAAGC,EAAAgB,EAAAf,GAAAA,GAAaZ,QAAAA,MAKvC,OAFGW,EAAAgB,EAAAd,GAAAA,GAAc0B,iBAChB5B,EAAAgB,EAAAd,GAAAA,GAAc0B,gBAAgBpC,GAC/BY,QAAAC,QAEsBC,MAAMd,IAAQe,KAAA,SAA/BC,GAEN,IAAKA,EAASC,GACZ,MAAU,IAAAC,MAAMF,EAASG,YAC1B,QAEuB,IAAbI,EAAwB,CACjC,IAAMO,EAAYtB,EAAAgB,EAAAO,GAAAA,GAAgBC,IAAInC,QAEb,IAAdiC,EACTtB,EAAAgB,EAAAO,GAAAA,GAAgBM,IAAIxC,EAAS,IAAIyC,IAAI,CAACf,KAEtCO,EAAUG,IAAIV,GAGZf,EAAAgB,EAAAU,GAAAA,GAA8BC,IAAItC,IACpCW,EAAAgB,EAAAU,GAAAA,GAAA,OAAqCrC,KAG3C,CAAC,MAAAuB,GAAA,OAAAR,QAAAS,OAAAD,EAAA,CAAA,EAjLUM,EAAiB,CAC5Ba,aAAc,eACdC,WAAY,aACZb,UAAW,YACXc,aAAc,eACdC,aAAc,gBACNjC,eAAAkC,EAAA,OAAAjC,eAAAiC,aAAAZ,eAAAY,EAAAlB,aAAAA,eAAAkB,EAAA,UAAAC,eAAAD,iBAAAE,eAAAF,EAAAT,qBAAAA,eAAAS,EAAA,2BAAAG,eAAAH,kBAAAI,eAAAJ,EAAA,WAAAK,eAAAL,eAAAM,eAAAN,EAAAd,WAAAA,eAAAc,EAAA,aAAAO,eAAAP,iBAIGQ,eAASC,SAAAA,WAoCpB,SAAAD,EAAYE,OAAwBC,EAYnB,OAXfA,EAAAF,EAAAG,KAAAxD,OAAOyD,KAAAA,OAAAC,eAAAC,EAAAJ,GAAAJ,GAAAS,MAAAC,IAAAJ,OAAAC,eAAAC,EAAAJ,GAAAzB,EAAA,CAAA8B,MAAArC,IAAAkC,OAAAC,eAAAC,EAAAJ,GAAAL,EAAAU,CAAAA,MAAAE,IAAAL,OAAAC,eAAAC,EAAAJ,GAAAN,EAAAW,CAAAA,MAAAG,IAAAN,OAAAC,eAAAC,EAAAJ,GAAAP,GAAAY,MAAAI,IAAAP,OAAAC,eAAAC,EAAAJ,GAAAR,GAAAa,MAAAK,IAAAR,OAAAC,eAAAC,EAAAJ,GAAA7C,EAAA,CAAAwD,UAAA,EAAAN,MAjCMO,OAAOC,eAAYX,OAAAC,eAAAC,EAAAJ,GAAA5C,EAAA,CAAAuD,UAAAN,EAAAA,eAAAH,OAAAC,eAAAC,EAAAJ,GAAAvB,EAAAkC,CAAAA,YAAAN,MAUqB,IAAIS,MAAKZ,OAAAC,eAAAC,EAAAJ,GAAA7B,EAAA,CAAAwC,UAAAN,EAAAA,MAKrCjC,EAAea,eAAYiB,OAAAC,eAAAC,EAAAJ,GAAAV,EAAA,CAAAqB,UAAA,EAAAN,WAAAH,IAAAA,OAAAC,eAAAC,EAAAJ,GAAAT,EAAA,CAAAoB,UAAAN,EAAAA,MAUzB,IAACH,OAAAC,eAAAC,EAAAJ,GAAApB,EAAA+B,CAAAA,YAAAN,MAKU,IAAIrB,WAKI,IAAnCe,EAAQgB,yBACjBhB,EAAQgB,uBAAyBC,kBAGS,IAAjCjB,EAAQkB,uBACjBlB,EAAQkB,qBAAuB,GAGjC/D,EAAAkD,EAAAJ,GAAA5C,GAAAA,GAAgB2C,EAChB7C,EAAAkD,EAAAJ,GAAAP,GAAAA,KAAeO,CACjB,GAjDoBF,KAAAD,yEAiDnB,IAAAqB,EAAArB,EAAAsB,iBAAAD,EA4IDE,GAAA,SAAGC,EAA+CpD,GAChDxB,KAAK6E,iBAAiBD,EAAOpD,EAC/B,EAACiD,EAEDK,SAAA,SAAsBhF,EAAiB0B,GAA8BuD,IAAAA,OAGnE,OAFAtE,EAAKT,KAAI8B,GAAAA,GAAYhC,EAAS0B,GAEtBwD,SAAAA,GACN,IAAMjD,EAAYtB,EAAAsE,EAAI/C,GAAAA,GAAYC,IAAInC,QAEb,IAAdiC,IAIXA,EAAgB,OAACP,IAEZwD,MAAAA,EAAAA,EAA0BvE,EAAAsE,EAAIpE,GAAAA,GAAUsE,mCAAwD,IAAnBlD,EAAUmD,MAC1FzE,EAAKsE,EAAI5B,GAAAA,GAAcrD,GAE3B,CACF,EAAC2E,EAEDU,WAAA,SAAwBrF,EAAiB0B,GACvC,IAAM4D,EAAcpF,KAAK8E,SAAYhF,EAAS,SAACuF,GAC7C7D,EAAS6D,GACTD,GACF,EACF,EAAChC,CAAA,CAxNmBC,cAwNnBiC,EAxN2BC,cAyN7B,SAAAtB,EAtKeuB,GACZ/E,EAAIT,KAAA0B,GAAAA,GAAW8D,EACfxF,KAAKyF,cAAc,IAAIC,YAAYF,GACrC,CAAC,SAAAxB,IAEO2B,IAAAA,EACNlF,KAAAA,OAAIsC,GAAAA,GAAepB,EAAec,YAElC,IAAMmD,EAAM,IAAIC,IAAIpF,EAAIT,KAAAW,GAAAA,GAAUmF,UAClCF,EAAIG,aAAaC,OAAO,MAAKvF,EAAET,KAAIU,GAAAA,IAEnCD,OAAIoC,GAAAA,GAAgB,IAAIpC,EAAAT,KAAIW,GAAAA,GAAgC,wBAACiF,EAAIK,YACjExF,EAAIT,KAAA6C,GAAAA,GAAcgC,iBAAiB,UAAWpE,OAAIwC,GAAAA,GAAYiD,KAAKlG,OACnES,EAAAT,KAAI6C,GAAAA,GAAcgC,iBAAiB,QAASpE,EAAIT,KAAAkD,GAAAA,GAAUgD,KAAKlG,OAC/DS,OAAIoC,GAAAA,GAAcgC,iBAAiB,OAAQ,WACzCpE,EAAAkF,EAAI5C,GAAAA,GAAepB,EAAeC,WAClCnB,EAAAkF,EAAI7C,GAAAA,GAAsB,CAC5B,EACF,CAAC,SAAAiB,EAEUa,GACT,IAAMuB,EAAO7F,KAAK8F,MAAMxB,EAAMuB,MACxBpE,EAAYtB,EAAIT,KAAAgC,GAAAA,GAAYC,IAAIkE,EAAKrG,SAE3C,QAAyB,IAAdiC,EAIX,IAAAsE,IAAgCC,EAAhCD,EAAAE,EAAuBxE,KAASuE,EAAAD,KAAAG,OAC9BC,EADiBH,EAAA1C,OACRuC,EAAKO,QAElB,CAAC,SAAA5C,IAGKrD,OAAIiB,GAAAA,KAAaC,EAAegB,cAClClC,OAAIsC,GAAAA,GAAepB,EAAee,cAGpCjC,EAAIT,KAAA+C,GAAAA,GAAepB,EAAegB,cAE9BlC,EAAIT,KAAAW,GAAAA,GAAUgG,oBAChBlG,OAAIE,GAAAA,GAAUgG,mBAAmBlG,OAAIqC,GAAAA,GAAsB,GAGzDrC,EAAAT,KAAIW,GAAAA,GAAU6D,sBAAwB/D,EAAAT,KAAI8C,GAAAA,IAAuBrC,OAAIE,GAAAA,GAAU6D,uBACjF/D,EAAAT,KAAI6C,GAAAA,GAAc+D,QAEdnG,EAAAT,KAAIW,GAAAA,GAAUkG,mBAChBpG,EAAIT,KAAAW,GAAAA,GAAUkG,qBAIlBpG,EAAIT,KAAA8C,GAAAA,KAEJ,QAA4CgE,EAA5CC,EAAAR,EAAsB9F,OAAIuB,GAAAA,GAAYgF,UAAMF,EAAAC,KAAAP,MAAE,KAAnC1G,EAAOgH,EAAAlD,MAChBnD,EAAKT,KAAI8B,GAAAA,GAAYhC,EACtB,CACH"}
1
+ {"version":3,"file":"transmit.umd.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n\n return\n }\n\n this.#reconnectAttempts++\n\n for (const channel of this.#listeners.keys()) {\n void this.#subscribe(channel)\n }\n }\n\n async #subscribe(channel: string, callback?: any) {\n if (this.#status !== TransmitStatus.Connected) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners !== 'undefined') {\n listeners.add(callback)\n return\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(this.#subscribe(channel, callback))\n }, 100)\n })\n }\n\n this.#channelSubscriptionLock.add(channel)\n\n const request = new Request(`/__transmit/subscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeSubscribe) {\n this.#options.beforeSubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n\n if (typeof callback !== 'undefined') {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n this.#listeners.set(channel, new Set([callback]))\n } else {\n listeners.add(callback)\n }\n\n if (this.#channelSubscriptionLock.has(channel)) {\n this.#channelSubscriptionLock.delete(channel)\n }\n }\n }\n\n async #unsubscribe(channel: string) {\n const request = new Request(`/__transmit/unsubscribe`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({uid: this.#uid, channel}),\n })\n\n if (this.#options.beforeUnsubscribe) {\n this.#options.beforeUnsubscribe(request)\n }\n\n const response = await fetch(request);\n\n if (!response.ok) {\n throw new Error(response.statusText)\n }\n }\n\n on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void) {\n this.addEventListener(event, callback)\n }\n\n listenOn<T = unknown>(channel: string, callback: (message: T) => void) {\n void this.#subscribe(channel, callback)\n\n return (unsubscribeOnTheServer?: boolean) => {\n const listeners = this.#listeners.get(channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n listeners.delete(callback)\n\n if ((unsubscribeOnTheServer ?? this.#options.removeSubscriptionOnZeroListener) && listeners.size === 0) {\n void this.#unsubscribe(channel)\n }\n }\n }\n\n listenOnce<T = unknown>(channel: string, callback: (message: T) => void) {\n const unsubscribe = this.listenOn<T>(channel, (message) => {\n callback(message)\n unsubscribe()\n })\n }\n\n close() {\n this.#eventSource.close()\n }\n}\n"],"names":["channel","_this5","this","request","Request","method","headers","body","JSON","stringify","uid","_classPrivateFieldLooseBase","_uid","_options","beforeUnsubscribe","Promise","resolve","fetch","then","response","ok","Error","statusText","e","reject","_subscribe2","callback","_this4","_status","TransmitStatus","Connected","setTimeout","_subscribe","listeners","_listeners","get","add","_channelSubscriptionLock","has","beforeSubscribe","set","Set","Initializing","Connecting","Disconnected","Reconnecting","_classPrivateFieldLooseKey","_eventSource","_reconnectAttempts","_changeStatus","_connect","_onMessage","_onError","_unsubscribe","Transmit","_EventTarget","options","_this","call","Object","defineProperty","_assertThisInitialized","value","_unsubscribe2","_onError2","_onMessage2","_connect2","_changeStatus2","writable","crypto","randomUUID","Map","eventSourceConstructor","EventSource","maxReconnectAttempts","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","size","listenOnce","unsubscribe","message","close","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_step","_iterator","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonisjs/transmit-client",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "A client for the native Server-Sent-Event module of AdonisJS.",
5
5
  "keywords": [
6
6
  "client",
package/src/transmit.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  interface TransmitOptions {
2
- endpoint: string
2
+ baseUrl: string
3
3
  eventSourceConstructor?: typeof EventSource
4
4
  beforeSubscribe?: (request: RequestInit) => void
5
5
  beforeUnsubscribe?: (request: RequestInit) => void
@@ -66,6 +66,10 @@ export class Transmit extends EventTarget {
66
66
  options.maxReconnectAttempts = 5
67
67
  }
68
68
 
69
+ if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {
70
+ options.removeSubscriptionOnZeroListener = false
71
+ }
72
+
69
73
  this.#options = options
70
74
  this.#connect()
71
75
  }
@@ -78,10 +82,10 @@ export class Transmit extends EventTarget {
78
82
  #connect() {
79
83
  this.#changeStatus(TransmitStatus.Connecting)
80
84
 
81
- const url = new URL(this.#options.endpoint)
85
+ const url = new URL(this.#options.baseUrl + '/__transmit/events')
82
86
  url.searchParams.append('uid', this.#uid)
83
87
 
84
- this.#eventSource = new this.#options.eventSourceConstructor(url.toString())
88
+ this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })
85
89
  this.#eventSource.addEventListener('message', this.#onMessage.bind(this))
86
90
  this.#eventSource.addEventListener('error', this.#onError.bind(this))
87
91
  this.#eventSource.addEventListener('open', () => {
@@ -120,6 +124,8 @@ export class Transmit extends EventTarget {
120
124
  if (this.#options.onReconnectFailed) {
121
125
  this.#options.onReconnectFailed()
122
126
  }
127
+
128
+ return
123
129
  }
124
130
 
125
131
  this.#reconnectAttempts++
@@ -155,7 +161,7 @@ export class Transmit extends EventTarget {
155
161
 
156
162
  this.#channelSubscriptionLock.add(channel)
157
163
 
158
- const request = new Request(`__transmit/subscribe`, {
164
+ const request = new Request(`/__transmit/subscribe`, {
159
165
  method: 'POST',
160
166
  headers: {
161
167
  'Content-Type': 'application/json',
@@ -189,7 +195,7 @@ export class Transmit extends EventTarget {
189
195
  }
190
196
 
191
197
  async #unsubscribe(channel: string) {
192
- const request = new Request(`__transmit/unsubscribe`, {
198
+ const request = new Request(`/__transmit/unsubscribe`, {
193
199
  method: 'POST',
194
200
  headers: {
195
201
  'Content-Type': 'application/json',
@@ -236,4 +242,8 @@ export class Transmit extends EventTarget {
236
242
  unsubscribe()
237
243
  })
238
244
  }
245
+
246
+ close() {
247
+ this.#eventSource.close()
248
+ }
239
249
  }