@adonisjs/transmit-client 0.0.1 → 0.0.3
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 +187 -0
- package/build/transmit.cjs +2 -0
- package/build/transmit.cjs.map +1 -0
- package/build/transmit.d.ts +26 -0
- package/build/transmit.modern.js +2 -0
- package/build/transmit.modern.js.map +1 -0
- package/build/transmit.module.js +2 -0
- package/build/transmit.module.js.map +1 -0
- package/build/transmit.umd.js +2 -0
- package/build/transmit.umd.js.map +1 -0
- package/package.json +5 -1
- package/src/transmit.ts +9 -5
- package/.editorconfig +0 -15
- package/.prettierignore +0 -4
- package/tsconfig.json +0 -7
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"
|
|
@@ -0,0 +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,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()})},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(){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&&(u(this,y)[y].close(),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
|
+
//# sourceMappingURL=transmit.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmit.cjs","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n }\n\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","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","size","listenOnce","unsubscribe","message","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_iterator","_step","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","close","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
interface TransmitOptions {
|
|
2
|
+
baseUrl: string;
|
|
3
|
+
eventSourceConstructor?: typeof EventSource;
|
|
4
|
+
beforeSubscribe?: (request: RequestInit) => void;
|
|
5
|
+
beforeUnsubscribe?: (request: RequestInit) => void;
|
|
6
|
+
maxReconnectAttempts?: number;
|
|
7
|
+
onReconnectAttempt?: (attempt: number) => void;
|
|
8
|
+
onReconnectFailed?: () => void;
|
|
9
|
+
removeSubscriptionOnZeroListener?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const TransmitStatus: {
|
|
12
|
+
readonly Initializing: "initializing";
|
|
13
|
+
readonly Connecting: "connecting";
|
|
14
|
+
readonly Connected: "connected";
|
|
15
|
+
readonly Disconnected: "disconnected";
|
|
16
|
+
readonly Reconnecting: "reconnecting";
|
|
17
|
+
};
|
|
18
|
+
type TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus];
|
|
19
|
+
export declare class Transmit extends EventTarget {
|
|
20
|
+
#private;
|
|
21
|
+
constructor(options: TransmitOptions);
|
|
22
|
+
on(event: Exclude<TTransmitStatus, 'connecting'>, callback: (event: CustomEvent) => void): void;
|
|
23
|
+
listenOn<T = unknown>(channel: string, callback: (message: T) => void): (unsubscribeOnTheServer?: boolean) => void;
|
|
24
|
+
listenOnce<T = unknown>(channel: string, callback: (message: T) => void): void;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=0;function t(t){return"__private_"+e+++"_"+t}function n(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))throw new TypeError("attempted to use private field on non-instance");return e}const i={Initializing:"initializing",Connecting:"connecting",Connected:"connected",Disconnected:"disconnected",Reconnecting:"reconnecting"};var s=/*#__PURE__*/t("uid"),o=/*#__PURE__*/t("options"),r=/*#__PURE__*/t("listeners"),c=/*#__PURE__*/t("status"),h=/*#__PURE__*/t("eventSource"),a=/*#__PURE__*/t("reconnectAttempts"),d=/*#__PURE__*/t("channelSubscriptionLock"),u=/*#__PURE__*/t("changeStatus"),b=/*#__PURE__*/t("connect"),p=/*#__PURE__*/t("onMessage"),l=/*#__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,l,{value:g}),Object.defineProperty(this,p,{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()})}}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,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(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(){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 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
|
+
//# sourceMappingURL=transmit.modern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmit.modern.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n }\n\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","this","value","_unsubscribe2","_subscribe2","_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","status","dispatchEvent","CustomEvent","url","URL","baseUrl","searchParams","append","toString","withCredentials","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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"}
|
|
@@ -0,0 +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,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: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),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()})},i}(/*#__PURE__*/r(EventTarget));function E(e){u(this,b)[b]=e,this.dispatchEvent(new CustomEvent(e))}function A(){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 C(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 T(){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&&(u(this,y)[y].close(),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)}}export{_ as Transmit,p as TransmitStatus};
|
|
2
|
+
//# sourceMappingURL=transmit.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmit.module.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n }\n\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","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","size","listenOnce","unsubscribe","message","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_iterator","_step","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","close","onReconnectFailed","_step2","_iterator2","keys"],"mappings":"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"}
|
|
@@ -0,0 +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 a=0;function u(e){return"__private_"+a+++"_"+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__*/u("uid"),v=/*#__PURE__*/u("options"),b=/*#__PURE__*/u("listeners"),y=/*#__PURE__*/u("status"),m=/*#__PURE__*/u("eventSource"),O=/*#__PURE__*/u("reconnectAttempts"),g=/*#__PURE__*/u("channelSubscriptionLock"),w=/*#__PURE__*/u("changeStatus"),P=/*#__PURE__*/u("connect"),j=/*#__PURE__*/u("onMessage"),S=/*#__PURE__*/u("onError"),R=/*#__PURE__*/u("subscribe"),_=/*#__PURE__*/u("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()})},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(){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=T,e.TransmitStatus=p});
|
|
2
|
+
//# sourceMappingURL=transmit.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmit.umd.js","sources":["../src/transmit.ts"],"sourcesContent":["interface TransmitOptions {\n baseUrl: string\n eventSourceConstructor?: typeof EventSource\n beforeSubscribe?: (request: RequestInit) => void\n beforeUnsubscribe?: (request: RequestInit) => void\n maxReconnectAttempts?: number\n onReconnectAttempt?: (attempt: number) => void\n onReconnectFailed?: () => void\n removeSubscriptionOnZeroListener?: boolean\n}\n\nexport const TransmitStatus = {\n Initializing: 'initializing',\n Connecting: 'connecting',\n Connected: 'connected',\n Disconnected: 'disconnected',\n Reconnecting: 'reconnecting',\n} as const\n\ntype TTransmitStatus = typeof TransmitStatus[keyof typeof TransmitStatus]\n\nexport class Transmit extends EventTarget {\n /**\n * Unique identifier for this client.\n */\n #uid: string = crypto.randomUUID()\n\n /**\n * Options for this client.\n */\n #options: TransmitOptions;\n\n /**\n * Registered listeners.\n */\n #listeners: Map<string, Set<(message: any) => void>> = new Map()\n\n /**\n * Current status of the client.\n */\n #status: TTransmitStatus = TransmitStatus.Initializing\n\n /**\n * EventSource instance.\n */\n #eventSource!: EventSource;\n\n /**\n * Number of reconnect attempts.\n */\n #reconnectAttempts: number = 0\n\n /**\n * Locks for channel subscriptions.\n */\n #channelSubscriptionLock: Set<string> = new Set()\n\n constructor(options: TransmitOptions) {\n super()\n\n if (typeof options.eventSourceConstructor === 'undefined') {\n options.eventSourceConstructor = EventSource\n }\n\n if (typeof options.maxReconnectAttempts === 'undefined') {\n options.maxReconnectAttempts = 5\n }\n\n if (typeof options.removeSubscriptionOnZeroListener === 'undefined') {\n options.removeSubscriptionOnZeroListener = false\n }\n\n this.#options = options\n this.#connect()\n }\n\n #changeStatus(status: TTransmitStatus) {\n this.#status = status\n this.dispatchEvent(new CustomEvent(status))\n }\n\n #connect() {\n this.#changeStatus(TransmitStatus.Connecting)\n\n const url = new URL(this.#options.baseUrl + '/__transmit/events')\n url.searchParams.append('uid', this.#uid)\n\n this.#eventSource = new this.#options.eventSourceConstructor(url.toString(), { withCredentials: true })\n this.#eventSource.addEventListener('message', this.#onMessage.bind(this))\n this.#eventSource.addEventListener('error', this.#onError.bind(this))\n this.#eventSource.addEventListener('open', () => {\n this.#changeStatus(TransmitStatus.Connected)\n this.#reconnectAttempts = 0\n })\n }\n\n #onMessage(event: MessageEvent){\n const data = JSON.parse(event.data)\n const listeners = this.#listeners.get(data.channel)\n\n if (typeof listeners === 'undefined') {\n return\n }\n\n for (const listener of listeners) {\n listener(data.payload)\n }\n }\n\n #onError() {\n if (this.#status !== TransmitStatus.Reconnecting) {\n this.#changeStatus(TransmitStatus.Disconnected)\n }\n\n this.#changeStatus(TransmitStatus.Reconnecting)\n\n if (this.#options.onReconnectAttempt) {\n this.#options.onReconnectAttempt(this.#reconnectAttempts + 1)\n }\n\n if (this.#options.maxReconnectAttempts && this.#reconnectAttempts >= this.#options.maxReconnectAttempts) {\n this.#eventSource.close()\n\n if (this.#options.onReconnectFailed) {\n this.#options.onReconnectFailed()\n }\n }\n\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","removeSubscriptionOnZeroListener","_proto","prototype","on","event","addEventListener","listenOn","_this2","unsubscribeOnTheServer","size","listenOnce","unsubscribe","message","_wrapNativeSuper","EventTarget","status","dispatchEvent","CustomEvent","_this3","url","URL","baseUrl","searchParams","append","toString","withCredentials","bind","data","parse","_iterator","_step","_createForOfIteratorHelperLoose","done","listener","payload","onReconnectAttempt","close","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.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "A client for the native Server-Sent-Event module of AdonisJS.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"client",
|
|
@@ -44,6 +44,10 @@
|
|
|
44
44
|
"prettier": "^3.0.0",
|
|
45
45
|
"typescript": "^5.1.6"
|
|
46
46
|
},
|
|
47
|
+
"files": [
|
|
48
|
+
"src",
|
|
49
|
+
"build"
|
|
50
|
+
],
|
|
47
51
|
"engines": {
|
|
48
52
|
"node": ">=18.16.0"
|
|
49
53
|
},
|
package/src/transmit.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
interface TransmitOptions {
|
|
2
|
-
|
|
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.
|
|
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', () => {
|
|
@@ -155,7 +159,7 @@ export class Transmit extends EventTarget {
|
|
|
155
159
|
|
|
156
160
|
this.#channelSubscriptionLock.add(channel)
|
|
157
161
|
|
|
158
|
-
const request = new Request(
|
|
162
|
+
const request = new Request(`/__transmit/subscribe`, {
|
|
159
163
|
method: 'POST',
|
|
160
164
|
headers: {
|
|
161
165
|
'Content-Type': 'application/json',
|
|
@@ -189,7 +193,7 @@ export class Transmit extends EventTarget {
|
|
|
189
193
|
}
|
|
190
194
|
|
|
191
195
|
async #unsubscribe(channel: string) {
|
|
192
|
-
const request = new Request(
|
|
196
|
+
const request = new Request(`/__transmit/unsubscribe`, {
|
|
193
197
|
method: 'POST',
|
|
194
198
|
headers: {
|
|
195
199
|
'Content-Type': 'application/json',
|
package/.editorconfig
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# http://editorconfig.org
|
|
2
|
-
|
|
3
|
-
[*]
|
|
4
|
-
indent_style = space
|
|
5
|
-
indent_size = 2
|
|
6
|
-
end_of_line = lf
|
|
7
|
-
charset = utf-8
|
|
8
|
-
trim_trailing_whitespace = true
|
|
9
|
-
insert_final_newline = true
|
|
10
|
-
|
|
11
|
-
[*.json]
|
|
12
|
-
insert_final_newline = ignore
|
|
13
|
-
|
|
14
|
-
[*.md]
|
|
15
|
-
trim_trailing_whitespace = false
|
package/.prettierignore
DELETED