@wix/duplexer-js 2.0.5
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 +239 -0
- package/dist/src/_external-types.d.ts +1 -0
- package/dist/src/authenticator.d.ts +22 -0
- package/dist/src/authenticator.js +42 -0
- package/dist/src/authenticator.js.map +1 -0
- package/dist/src/channels/channel.d.ts +29 -0
- package/dist/src/channels/channel.js +159 -0
- package/dist/src/channels/channel.js.map +1 -0
- package/dist/src/channels/channels.d.ts +13 -0
- package/dist/src/channels/channels.js +41 -0
- package/dist/src/channels/channels.js.map +1 -0
- package/dist/src/channels/subscription-error.d.ts +6 -0
- package/dist/src/channels/subscription-error.js +3 -0
- package/dist/src/channels/subscription-error.js.map +1 -0
- package/dist/src/connection-manager.d.ts +62 -0
- package/dist/src/connection-manager.js +228 -0
- package/dist/src/connection-manager.js.map +1 -0
- package/dist/src/constants.d.ts +5 -0
- package/dist/src/constants.js +9 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/domain.d.ts +3 -0
- package/dist/src/domain.js +3 -0
- package/dist/src/domain.js.map +1 -0
- package/dist/src/duplexer.d.ts +41 -0
- package/dist/src/duplexer.js +125 -0
- package/dist/src/duplexer.js.map +1 -0
- package/dist/src/environments/core/environment.d.ts +13 -0
- package/dist/src/environments/core/environment.js +25 -0
- package/dist/src/environments/core/environment.js.map +1 -0
- package/dist/src/environments/core/network.d.ts +6 -0
- package/dist/src/environments/core/network.js +32 -0
- package/dist/src/environments/core/network.js.map +1 -0
- package/dist/src/environments/react-native/environment.d.ts +7 -0
- package/dist/src/environments/react-native/environment.js +27 -0
- package/dist/src/environments/react-native/environment.js.map +1 -0
- package/dist/src/environments/react-native/network.d.ts +6 -0
- package/dist/src/environments/react-native/network.js +54 -0
- package/dist/src/environments/react-native/network.js.map +1 -0
- package/dist/src/environments/react-native/transports.d.ts +8 -0
- package/dist/src/environments/react-native/transports.js +31 -0
- package/dist/src/environments/react-native/transports.js.map +1 -0
- package/dist/src/environments/web/environment.d.ts +8 -0
- package/dist/src/environments/web/environment.js +19 -0
- package/dist/src/environments/web/environment.js.map +1 -0
- package/dist/src/environments/web/network.d.ts +4 -0
- package/dist/src/environments/web/network.js +38 -0
- package/dist/src/environments/web/network.js.map +1 -0
- package/dist/src/environments/web/transports.d.ts +8 -0
- package/dist/src/environments/web/transports.js +51 -0
- package/dist/src/environments/web/transports.js.map +1 -0
- package/dist/src/errors/is-transport-error.d.ts +1 -0
- package/dist/src/errors/is-transport-error.js +7 -0
- package/dist/src/errors/is-transport-error.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/instance-updater.d.ts +5 -0
- package/dist/src/instance-updater.js +3 -0
- package/dist/src/instance-updater.js.map +1 -0
- package/dist/src/keep-alive.d.ts +18 -0
- package/dist/src/keep-alive.js +66 -0
- package/dist/src/keep-alive.js.map +1 -0
- package/dist/src/ready-state.d.ts +6 -0
- package/dist/src/ready-state.js +10 -0
- package/dist/src/ready-state.js.map +1 -0
- package/dist/src/strategies/strategy-builder.d.ts +11 -0
- package/dist/src/strategies/strategy-builder.js +34 -0
- package/dist/src/strategies/strategy-builder.js.map +1 -0
- package/dist/src/strategies/strategy-presets.d.ts +4 -0
- package/dist/src/strategies/strategy-presets.js +20 -0
- package/dist/src/strategies/strategy-presets.js.map +1 -0
- package/dist/src/strategies/strategy.d.ts +25 -0
- package/dist/src/strategies/strategy.js +153 -0
- package/dist/src/strategies/strategy.js.map +1 -0
- package/dist/src/timeline/noop-timeline.d.ts +5 -0
- package/dist/src/timeline/noop-timeline.js +15 -0
- package/dist/src/timeline/noop-timeline.js.map +1 -0
- package/dist/src/timeline/timeline.d.ts +7 -0
- package/dist/src/timeline/timeline.js +3 -0
- package/dist/src/timeline/timeline.js.map +1 -0
- package/dist/src/transport/http-polling.d.ts +27 -0
- package/dist/src/transport/http-polling.js +245 -0
- package/dist/src/transport/http-polling.js.map +1 -0
- package/dist/src/transport/http.d.ts +14 -0
- package/dist/src/transport/http.js +106 -0
- package/dist/src/transport/http.js.map +1 -0
- package/dist/src/transport/params.d.ts +3 -0
- package/dist/src/transport/params.js +70 -0
- package/dist/src/transport/params.js.map +1 -0
- package/dist/src/transport/transport-error.d.ts +8 -0
- package/dist/src/transport/transport-error.js +3 -0
- package/dist/src/transport/transport-error.js.map +1 -0
- package/dist/src/transport/transport-params.d.ts +3 -0
- package/dist/src/transport/transport-params.js +3 -0
- package/dist/src/transport/transport-params.js.map +1 -0
- package/dist/src/transport/transport.d.ts +50 -0
- package/dist/src/transport/transport.js +120 -0
- package/dist/src/transport/transport.js.map +1 -0
- package/dist/src/transport/transports-manager.d.ts +42 -0
- package/dist/src/transport/transports-manager.js +248 -0
- package/dist/src/transport/transports-manager.js.map +1 -0
- package/dist/src/transport/unrecoverable.d.ts +1 -0
- package/dist/src/transport/unrecoverable.js +8 -0
- package/dist/src/transport/unrecoverable.js.map +1 -0
- package/dist/src/transport/websocket.d.ts +18 -0
- package/dist/src/transport/websocket.js +155 -0
- package/dist/src/transport/websocket.js.map +1 -0
- package/dist/src/utils/assert.d.ts +1 -0
- package/dist/src/utils/assert.js +34 -0
- package/dist/src/utils/assert.js.map +1 -0
- package/dist/src/utils/cancel-token.d.ts +10 -0
- package/dist/src/utils/cancel-token.js +28 -0
- package/dist/src/utils/cancel-token.js.map +1 -0
- package/dist/src/utils/deferred.d.ts +9 -0
- package/dist/src/utils/deferred.js +27 -0
- package/dist/src/utils/deferred.js.map +1 -0
- package/dist/src/utils/event-emitter.d.ts +15 -0
- package/dist/src/utils/event-emitter.js +106 -0
- package/dist/src/utils/event-emitter.js.map +1 -0
- package/dist/src/utils/on.d.ts +4 -0
- package/dist/src/utils/on.js +10 -0
- package/dist/src/utils/on.js.map +1 -0
- package/dist/src/utils/request.d.ts +20 -0
- package/dist/src/utils/request.js +164 -0
- package/dist/src/utils/request.js.map +1 -0
- package/dist/src/utils/timer.d.ts +8 -0
- package/dist/src/utils/timer.js +17 -0
- package/dist/src/utils/timer.js.map +1 -0
- package/dist/src/utils/utils.d.ts +1 -0
- package/dist/src/utils/utils.js +8 -0
- package/dist/src/utils/utils.js.map +1 -0
- package/dist/src/virtual-socket.d.ts +42 -0
- package/dist/src/virtual-socket.js +199 -0
- package/dist/src/virtual-socket.js.map +1 -0
- package/dist/statics/duplexer.bundle.js +982 -0
- package/dist/statics/duplexer.bundle.js.map +1 -0
- package/dist/statics/duplexer.bundle.min.js +2 -0
- package/dist/statics/duplexer.bundle.min.js.map +1 -0
- package/dist/statics/manifest.json +3 -0
- package/dist/statics/manifest.min.json +3 -0
- package/dist/test/_external-types.d.ts +2 -0
- package/dist/test/_global-types.d.ts +10 -0
- package/dist/test/_setup-global-hooks.spec.d.ts +1 -0
- package/dist/test/_setup-global-hooks.spec.js +13 -0
- package/dist/test/_setup-global-hooks.spec.js.map +1 -0
- package/dist/test/client-events.it.d.ts +1 -0
- package/dist/test/client-events.it.js +33 -0
- package/dist/test/client-events.it.js.map +1 -0
- package/dist/test/connect.spec.d.ts +1 -0
- package/dist/test/connect.spec.js +71 -0
- package/dist/test/connect.spec.js.map +1 -0
- package/dist/test/connection-manager.spec.d.ts +1 -0
- package/dist/test/connection-manager.spec.js +523 -0
- package/dist/test/connection-manager.spec.js.map +1 -0
- package/dist/test/duplexer.it.d.ts +1 -0
- package/dist/test/duplexer.it.js +243 -0
- package/dist/test/duplexer.it.js.map +1 -0
- package/dist/test/duplexer.spec.d.ts +1 -0
- package/dist/test/duplexer.spec.js +337 -0
- package/dist/test/duplexer.spec.js.map +1 -0
- package/dist/test/environments/web.it.d.ts +1 -0
- package/dist/test/environments/web.it.js +30 -0
- package/dist/test/environments/web.it.js.map +1 -0
- package/dist/test/environments/web.spec.d.ts +1 -0
- package/dist/test/environments/web.spec.js +92 -0
- package/dist/test/environments/web.spec.js.map +1 -0
- package/dist/test/event-emitter.spec.d.ts +1 -0
- package/dist/test/event-emitter.spec.js +182 -0
- package/dist/test/event-emitter.spec.js.map +1 -0
- package/dist/test/helpers/as-promised.d.ts +7 -0
- package/dist/test/helpers/as-promised.js +38 -0
- package/dist/test/helpers/as-promised.js.map +1 -0
- package/dist/test/helpers/assertions.d.ts +8 -0
- package/dist/test/helpers/assertions.js +43 -0
- package/dist/test/helpers/assertions.js.map +1 -0
- package/dist/test/helpers/auth-server.d.ts +10 -0
- package/dist/test/helpers/auth-server.js +61 -0
- package/dist/test/helpers/auth-server.js.map +1 -0
- package/dist/test/helpers/http-polling-environment.d.ts +2 -0
- package/dist/test/helpers/http-polling-environment.js +20 -0
- package/dist/test/helpers/http-polling-environment.js.map +1 -0
- package/dist/test/helpers/in-memory-environemnt.d.ts +15 -0
- package/dist/test/helpers/in-memory-environemnt.js +39 -0
- package/dist/test/helpers/in-memory-environemnt.js.map +1 -0
- package/dist/test/helpers/in-memory-network.d.ts +5 -0
- package/dist/test/helpers/in-memory-network.js +37 -0
- package/dist/test/helpers/in-memory-network.js.map +1 -0
- package/dist/test/helpers/in-memory-timeline.d.ts +8 -0
- package/dist/test/helpers/in-memory-timeline.js +24 -0
- package/dist/test/helpers/in-memory-timeline.js.map +1 -0
- package/dist/test/helpers/in-memory-transport.d.ts +68 -0
- package/dist/test/helpers/in-memory-transport.js +271 -0
- package/dist/test/helpers/in-memory-transport.js.map +1 -0
- package/dist/test/helpers/server-interceptor.d.ts +10 -0
- package/dist/test/helpers/server-interceptor.js +138 -0
- package/dist/test/helpers/server-interceptor.js.map +1 -0
- package/dist/test/helpers/setup-global-mock-navigator.d.ts +4 -0
- package/dist/test/helpers/setup-global-mock-navigator.js +22 -0
- package/dist/test/helpers/setup-global-mock-navigator.js.map +1 -0
- package/dist/test/helpers/window.d.ts +1 -0
- package/dist/test/helpers/window.js +17 -0
- package/dist/test/helpers/window.js.map +1 -0
- package/dist/test/keep-alive.it.spec.d.ts +1 -0
- package/dist/test/keep-alive.it.spec.js +42 -0
- package/dist/test/keep-alive.it.spec.js.map +1 -0
- package/dist/test/keep-alive.spec.d.ts +1 -0
- package/dist/test/keep-alive.spec.js +140 -0
- package/dist/test/keep-alive.spec.js.map +1 -0
- package/dist/test/ng/channel-support.d.ts +39 -0
- package/dist/test/ng/channel-support.js +178 -0
- package/dist/test/ng/channel-support.js.map +1 -0
- package/dist/test/ng/channels.spec.d.ts +1 -0
- package/dist/test/ng/channels.spec.js +79 -0
- package/dist/test/ng/channels.spec.js.map +1 -0
- package/dist/test/ng/client-events.it.d.ts +1 -0
- package/dist/test/ng/client-events.it.js +75 -0
- package/dist/test/ng/client-events.it.js.map +1 -0
- package/dist/test/ng/connect.it.d.ts +1 -0
- package/dist/test/ng/connect.it.js +128 -0
- package/dist/test/ng/connect.it.js.map +1 -0
- package/dist/test/ng/corvid-environment.d.ts +22 -0
- package/dist/test/ng/corvid-environment.js +44 -0
- package/dist/test/ng/corvid-environment.js.map +1 -0
- package/dist/test/ng/environment.d.ts +49 -0
- package/dist/test/ng/environment.js +250 -0
- package/dist/test/ng/environment.js.map +1 -0
- package/dist/test/ng/setup.d.ts +54 -0
- package/dist/test/ng/setup.js +256 -0
- package/dist/test/ng/setup.js.map +1 -0
- package/dist/test/ng/subscribe.it.d.ts +1 -0
- package/dist/test/ng/subscribe.it.js +354 -0
- package/dist/test/ng/subscribe.it.js.map +1 -0
- package/dist/test/ng/unsubscribe.it.d.ts +1 -0
- package/dist/test/ng/unsubscribe.it.js +73 -0
- package/dist/test/ng/unsubscribe.it.js.map +1 -0
- package/dist/test/ng/util-functions.d.ts +7 -0
- package/dist/test/ng/util-functions.js +73 -0
- package/dist/test/ng/util-functions.js.map +1 -0
- package/dist/test/proto/client/index.d.ts +2852 -0
- package/dist/test/proto/index.d.ts +1421 -0
- package/dist/test/proto/server/index.d.ts +2832 -0
- package/dist/test/restore-overrides.it.d.ts +1 -0
- package/dist/test/restore-overrides.it.js +38 -0
- package/dist/test/restore-overrides.it.js.map +1 -0
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.js +5 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/test/strategy.spec.d.ts +1 -0
- package/dist/test/strategy.spec.js +209 -0
- package/dist/test/strategy.spec.js.map +1 -0
- package/dist/test/subscribe.it.d.ts +1 -0
- package/dist/test/subscribe.it.js +216 -0
- package/dist/test/subscribe.it.js.map +1 -0
- package/dist/test/subscribe.spec.d.ts +1 -0
- package/dist/test/subscribe.spec.js +86 -0
- package/dist/test/subscribe.spec.js.map +1 -0
- package/dist/test/transporters/http-polling.it.d.ts +1 -0
- package/dist/test/transporters/http-polling.it.js +118 -0
- package/dist/test/transporters/http-polling.it.js.map +1 -0
- package/dist/test/transporters/http-polling.spec.d.ts +1 -0
- package/dist/test/transporters/http-polling.spec.js +354 -0
- package/dist/test/transporters/http-polling.spec.js.map +1 -0
- package/dist/test/transporters/transporter.spec.d.ts +1 -0
- package/dist/test/transporters/transporter.spec.js +46 -0
- package/dist/test/transporters/transporter.spec.js.map +1 -0
- package/dist/test/transporters/websocket.spec.d.ts +1 -0
- package/dist/test/transporters/websocket.spec.js +26 -0
- package/dist/test/transporters/websocket.spec.js.map +1 -0
- package/dist/test/transports-manager.spec.d.ts +1 -0
- package/dist/test/transports-manager.spec.js +346 -0
- package/dist/test/transports-manager.spec.js.map +1 -0
- package/dist/test/utils/request.spec.d.ts +1 -0
- package/dist/test/utils/request.spec.js +274 -0
- package/dist/test/utils/request.spec.js.map +1 -0
- package/dist/test/virtual-socket.it.d.ts +1 -0
- package/dist/test/virtual-socket.it.js +153 -0
- package/dist/test/virtual-socket.it.js.map +1 -0
- package/package.json +131 -0
- package/react-native.d.ts +1 -0
- package/react-native.js +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
# @wix/duplexer-js
|
|
2
|
+
|
|
3
|
+
Establish a connection to [wix-duplexer-sockets-server](../../services/wix-duplexer-sockets-server), subscribe and listen to channels & events from the
|
|
4
|
+
browser.
|
|
5
|
+
|
|
6
|
+
## Requirements
|
|
7
|
+
|
|
8
|
+
| Environment | Minimum version |
|
|
9
|
+
| --- | --- |
|
|
10
|
+
| Node.js | 18.0.0 |
|
|
11
|
+
| Chrome | 42 |
|
|
12
|
+
| Firefox | 39 |
|
|
13
|
+
| Safari | 10.1 |
|
|
14
|
+
| Edge | 14 |
|
|
15
|
+
|
|
16
|
+
The following Web APIs must be available at runtime:
|
|
17
|
+
- `fetch` / `Response`
|
|
18
|
+
- `AbortController` / `AbortSignal` (for request cancellation)
|
|
19
|
+
|
|
20
|
+
### Testing in Node.js
|
|
21
|
+
|
|
22
|
+
Node 18+ includes a global `fetch` (based on undici). If your test framework intercepts HTTP with `nock`, ensure you are using `nock` v13+ which supports intercepting native `fetch`.
|
|
23
|
+
|
|
24
|
+
## Features
|
|
25
|
+
|
|
26
|
+
### Send events
|
|
27
|
+
|
|
28
|
+
Send event directly from the client (browser). Read more about [sending client event](../../docs/CLIENT_EVENTS.md).
|
|
29
|
+
|
|
30
|
+
### Private channels
|
|
31
|
+
|
|
32
|
+
Allow authorized-only clients to subscribe specific channels. Read more about [private channels](../../docs/PRIVATE_CHANNELS.md).
|
|
33
|
+
|
|
34
|
+
### Multiplexing
|
|
35
|
+
|
|
36
|
+
It means that N different clients can utilize/share same the physical socket while having a full isolation and, hence, improve general performance.
|
|
37
|
+
|
|
38
|
+
### Environments
|
|
39
|
+
|
|
40
|
+
- Browser (default).
|
|
41
|
+
- [React Native](../../docs/REACT_NATIVE.md).
|
|
42
|
+
|
|
43
|
+
## Install
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
npm install @wix/duplexer-js
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Usage
|
|
50
|
+
|
|
51
|
+
```js
|
|
52
|
+
import { Duplexer } from '@wix/duplexer-js';
|
|
53
|
+
|
|
54
|
+
const instanceUpdater = {
|
|
55
|
+
getInstance() {
|
|
56
|
+
return window.__APP_INSTANCE__;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const siteRevision = '1';
|
|
61
|
+
|
|
62
|
+
const duplexer = new Duplexer('duplexer.wix.com', {
|
|
63
|
+
instanceUpdater,
|
|
64
|
+
siteRevision,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const connection = duplexer.connect({
|
|
68
|
+
appDefId: '224b330b-f3dc-4898-8876-d177ab3877ca'
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const channel = connection.subscribe('some-channel');
|
|
72
|
+
|
|
73
|
+
connection.on('@duplexer:connected', () => {
|
|
74
|
+
// connection established
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
channel.on('some-event', payload => {
|
|
78
|
+
// do something with your payload
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Note:** in case you use jsdom, you must specify its url with `http://` protocol in order to make Duplexer testkit to work properly (exposed websocket & http server are not under SSL).
|
|
83
|
+
|
|
84
|
+
```js
|
|
85
|
+
require('jsdom-global)('', { url: 'http://localhost:7000' });
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Note:** in case you run Duplexer in a Node.js environment (e.g. testing with Jest/Mocha), you need:
|
|
89
|
+
|
|
90
|
+
1. **Node.js 18+** (provides global `fetch`, `AbortController`).
|
|
91
|
+
2. A WebSocket implementation on the `global` object. You can install [`ws`](https://www.npmjs.com/package/ws):
|
|
92
|
+
|
|
93
|
+
```js
|
|
94
|
+
global.WebSocket = require('ws');
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## API
|
|
98
|
+
|
|
99
|
+
### new Duplexer(opts): Duplexer
|
|
100
|
+
|
|
101
|
+
Create a new `Duplexer` instance that will open socket against `url`. It must be provided with `duplexer.wix.com` as the url, as it communicates with the sockets server directly (opens a connection, send commands etc.).
|
|
102
|
+
|
|
103
|
+
Parameters:
|
|
104
|
+
|
|
105
|
+
- opts (Object):
|
|
106
|
+
- `url` (String) - url to [wix-duplexer-sockets-server](../../services/wix-duplexer-sockets-server) service, must be protocol-less.
|
|
107
|
+
- `siteRevision` (String) - the [site's revision](https://www.wix.com/corvid/reference/wix-site.html#revision) number.
|
|
108
|
+
- `instanceUpdater` (InstanceUpdater) - an object that exposes `getInstance: () => string` member that is responsible of retrieving Wix's instance.
|
|
109
|
+
- `autoConnect` (Boolean, default: true) - whether to enable auto reconnect when a sudden disconnection accurs. Used for testing purposes.
|
|
110
|
+
|
|
111
|
+
### Duplexer.connect(opts): VirtualSocket
|
|
112
|
+
|
|
113
|
+
Establish a connection according to given `opts.appDefId`.
|
|
114
|
+
|
|
115
|
+
Parameters:
|
|
116
|
+
|
|
117
|
+
- opts
|
|
118
|
+
- `appDefId` (String)
|
|
119
|
+
|
|
120
|
+
### Duplexer.getConnectionServerTime(): Promise<number>
|
|
121
|
+
|
|
122
|
+
Retrieves the server time that the connection was established with. Promise is getting resolved upon successful connect.
|
|
123
|
+
|
|
124
|
+
Note: it refers to the physical connection establishment (`connection_establish` packet).
|
|
125
|
+
|
|
126
|
+
### Duplexer.triggerInstanceChanged(): void
|
|
127
|
+
|
|
128
|
+
In case the signed instance is no longer valid (say, expired) and connection closed with status 401, you should make the instance updater to return a new valid signed instance. After you do that, you can call `triggerInstanceChanged()`, so Duplexer will try to reconnect (... and resubscribe).
|
|
129
|
+
|
|
130
|
+
### VirtualSocket.disconnect(): void
|
|
131
|
+
|
|
132
|
+
Closes namespace (might close the entire underlying connection or not, depends if pool contains more namespaces or not).
|
|
133
|
+
|
|
134
|
+
### VirtualSocket.subscribe(channel, opts): Channel
|
|
135
|
+
|
|
136
|
+
Subscribe to channel and start getting emitted events.
|
|
137
|
+
|
|
138
|
+
Note: current limitation is up to 10 different subscriptions (channels) per api key.
|
|
139
|
+
|
|
140
|
+
Parameters:
|
|
141
|
+
|
|
142
|
+
- channel (String)
|
|
143
|
+
- opts (Object) (Optional)
|
|
144
|
+
- restoreStrategy (Object) - custom restore strategy taht will be attached to the subscribe command, see [RestoreStrategyBuilderFactory](#restorestrategybuilderfactory) for more information about possible restore strategies.
|
|
145
|
+
- resourceId - if you have a specific channel for each resource, like `scores/1` and `scores/2`.
|
|
146
|
+
|
|
147
|
+
### VirtualSocket.subscribeToUserChannel(): Channel
|
|
148
|
+
|
|
149
|
+
Subscribe to user's dedicated channel. This channel acts like his own inbox, so nobody else can listen to.
|
|
150
|
+
|
|
151
|
+
In order to publish to user channel (backend perspective), the `USER` context should be used along with the `recipients` field (that represents the user IDs that should receive the message).
|
|
152
|
+
|
|
153
|
+
### VirtualSocket.unsubscribe(channel): void
|
|
154
|
+
|
|
155
|
+
Unsubscribe channel, stop getting emitted events.
|
|
156
|
+
|
|
157
|
+
Parameters:
|
|
158
|
+
|
|
159
|
+
- channel (String)
|
|
160
|
+
|
|
161
|
+
### VirtualSocket.on(event, handler)
|
|
162
|
+
|
|
163
|
+
Listen to event and execute handler on every event that emitted on this connection.
|
|
164
|
+
|
|
165
|
+
Parameters:
|
|
166
|
+
|
|
167
|
+
- event (String)
|
|
168
|
+
- handler (Function: payload? => void)
|
|
169
|
+
|
|
170
|
+
#### Reserved events
|
|
171
|
+
|
|
172
|
+
| Event | Description |
|
|
173
|
+
| -------------------------- | ----------- |
|
|
174
|
+
| @duplexer:connected | Emitted on connection successfully established |
|
|
175
|
+
| @duplexer:disconnected | Emitted on connection closed, either intentionally or caused by error. If connection was closed due to error, a `TransportError` instance will be passed. In case `TransportError` contains `{ recoverable: false }`, you will have to conneect manually (you should check the `status` and act accordingly; for instance, in case it's `401` - the provided signed instance is invalid) |
|
|
176
|
+
| @duplexer:connect_error | Emitted on every connect try error, a `TransportError` instance will be passed. In case error is unrecoverable, `@duplexer:connect_error` won't be thrown, but `@duplexer:diconnected` with `TransportError` that contains `{ recoverable: false }` |
|
|
177
|
+
|
|
178
|
+
**Note:** all above events might be called multiple times, for instance:
|
|
179
|
+
|
|
180
|
+
`connected -> disconnected (with error) -> connect_erorr -> connect_erorr -> connected`
|
|
181
|
+
|
|
182
|
+
This happens because duplexer client tries to recover itself in case of unexpected disconnection.
|
|
183
|
+
|
|
184
|
+
### VirtualSocket.off(event, handler?)
|
|
185
|
+
|
|
186
|
+
Remove `handler` from being executed on `event`. In case no handler passed, all handlers will be removed.
|
|
187
|
+
|
|
188
|
+
Parameters:
|
|
189
|
+
|
|
190
|
+
- event (String)
|
|
191
|
+
- handler (Optional) (Function)
|
|
192
|
+
|
|
193
|
+
### Channel.on(event, handler): Channel
|
|
194
|
+
|
|
195
|
+
Listen to event and execute handler on every event that emitted on this channel.
|
|
196
|
+
|
|
197
|
+
Parameters:
|
|
198
|
+
|
|
199
|
+
- event (String)
|
|
200
|
+
- handler (Function: (payload?, attachments?) => void) - handler that will be executed every time an event received:
|
|
201
|
+
- payload (any)
|
|
202
|
+
- attachments (Object)
|
|
203
|
+
- user (Object) - user informartion that was attached to event (from signed subscription token).
|
|
204
|
+
|
|
205
|
+
```js
|
|
206
|
+
channel.on('client-typing', (_, {user}) => {
|
|
207
|
+
// ${user.info.name} is typing!
|
|
208
|
+
})
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
#### Reserved events
|
|
212
|
+
|
|
213
|
+
| Event | Description |
|
|
214
|
+
| -------------------------------- | ----------- |
|
|
215
|
+
| @duplexer:subscription_succeeded | Subscription established successfully and from now on messages will be delivered. Note: will be called on every resubscribe (in case of reconnect for instance), so make sure your handler is idempotent.<br />Payload is an object that contains:<br />- `isSynced` (Boolean) - determines if app server should resync (possibly) missed messages. Will always return `false` at the beginning, and app server might needs to fetch its recent messages in this phase. |
|
|
216
|
+
| @duplexer:subscription_failed | Emitted on authorization failure - in case request returns status other than 2xx.<br />Payload is an object that contains:<br />- `status` (Boolean) - status code the request returned with.<br />- `message` (String) - detailed message about the error |
|
|
217
|
+
| @duplexer:unsubscribe_succeeded | Unsubscribed successfully from channel and messages will stop being delivered. |
|
|
218
|
+
|
|
219
|
+
### Channel.off(event, handler?)
|
|
220
|
+
|
|
221
|
+
Remove `handler` from being executed on `event`. In case no handler passed, all handlers will be removed.
|
|
222
|
+
|
|
223
|
+
Parameters:
|
|
224
|
+
|
|
225
|
+
- event (String)
|
|
226
|
+
- handler (Optional) (Function)
|
|
227
|
+
|
|
228
|
+
### Channel.send(event, payload): void
|
|
229
|
+
|
|
230
|
+
Send a client event. User is implicitly attached.
|
|
231
|
+
|
|
232
|
+
Parameters:
|
|
233
|
+
|
|
234
|
+
- event (String)
|
|
235
|
+
- payload (Object)
|
|
236
|
+
|
|
237
|
+
### RestoreStrategyBuilderFactory
|
|
238
|
+
|
|
239
|
+
Possible restore strategies, see [wix-duplexer-protocol#RestoreStrategyBuilderFactory](../../utils/wix-duplexer-protocol#restorestrategybuilderfactory)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declare module 'backo2';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface AuthenticatorOptions {
|
|
2
|
+
url: string;
|
|
3
|
+
onBeforeRequest?(): OnBeforeRequest;
|
|
4
|
+
}
|
|
5
|
+
export interface OnBeforeRequest {
|
|
6
|
+
body?: object;
|
|
7
|
+
headers?: object;
|
|
8
|
+
}
|
|
9
|
+
export interface AuthResponse {
|
|
10
|
+
success: boolean;
|
|
11
|
+
auth?: string;
|
|
12
|
+
error?: AuthError;
|
|
13
|
+
}
|
|
14
|
+
export interface AuthError {
|
|
15
|
+
status: number;
|
|
16
|
+
message: string;
|
|
17
|
+
}
|
|
18
|
+
export default class Authenticator {
|
|
19
|
+
private readonly opts;
|
|
20
|
+
constructor(opts: AuthenticatorOptions);
|
|
21
|
+
auth(channelName: string, sessionId: string): Promise<AuthResponse>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var request_1 = require("./utils/request");
|
|
4
|
+
var Authenticator = /** @class */ (function () {
|
|
5
|
+
function Authenticator(opts) {
|
|
6
|
+
this.opts = opts;
|
|
7
|
+
}
|
|
8
|
+
Authenticator.prototype.auth = function (channelName, sessionId) {
|
|
9
|
+
var _a = this.opts.onBeforeRequest
|
|
10
|
+
? this.opts.onBeforeRequest()
|
|
11
|
+
: {}, body = _a.body, headers = _a.headers;
|
|
12
|
+
var payload = {
|
|
13
|
+
sessionId: sessionId,
|
|
14
|
+
channelName: channelName,
|
|
15
|
+
custom: body,
|
|
16
|
+
};
|
|
17
|
+
return (0, request_1.post)(this.opts.url, payload, {
|
|
18
|
+
withCredentials: true,
|
|
19
|
+
headers: headers,
|
|
20
|
+
}).then(authSuceess, authFailure);
|
|
21
|
+
};
|
|
22
|
+
return Authenticator;
|
|
23
|
+
}());
|
|
24
|
+
exports.default = Authenticator;
|
|
25
|
+
function authSuceess(_a) {
|
|
26
|
+
var data = _a.data;
|
|
27
|
+
return {
|
|
28
|
+
success: true,
|
|
29
|
+
auth: typeof data === 'object' ? data.token : data,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function authFailure(error) {
|
|
33
|
+
var response = error.response;
|
|
34
|
+
return {
|
|
35
|
+
success: false,
|
|
36
|
+
error: {
|
|
37
|
+
status: response ? response.status : -1,
|
|
38
|
+
message: error.toString(),
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=authenticator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authenticator.js","sourceRoot":"","sources":["../../src/authenticator.ts"],"names":[],"mappings":";;AAAA,2CAAgE;AAuBhE;IAGE,uBAAY,IAA0B;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEM,4BAAI,GAAX,UAAY,WAAmB,EAAE,SAAiB;QAC1C,IAAA,KAAqC,IAAI,CAAC,IAAI,CAAC,eAAe;YAClE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YAC7B,CAAC,CAAC,EAAE,EAFE,IAAI,UAAA,EAAE,OAAO,aAEf,CAAC;QACP,IAAM,OAAO,GAAG;YACd,SAAS,WAAA;YACT,WAAW,aAAA;YACX,MAAM,EAAE,IAAI;SACb,CAAC;QAEF,OAAO,IAAA,cAAI,EAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;YAClC,eAAe,EAAE,IAAI;YACrB,OAAO,SAAA;SACR,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACpC,CAAC;IACH,oBAAC;AAAD,CAAC,AAtBD,IAsBC;;AAED,SAAS,WAAW,CAAC,EAAkB;QAAhB,IAAI,UAAA;IACzB,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAoB;IAC/B,IAAA,QAAQ,GAAK,KAAK,SAAV,CAAW;IAC3B,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE;YACL,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE;SAC1B;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Emitter } from '../utils/event-emitter';
|
|
2
|
+
import { Protocol } from '@wix/wix-duplexer-typescript-definitions';
|
|
3
|
+
import RestoreStrategy from '@wix/wix-duplexer-protocol/dist/lib/restore/RestoreStrategy';
|
|
4
|
+
import { MessageIdRestoreStrategy } from '@wix/wix-duplexer-protocol/dist/lib/restore/MessageIdRestoreStrategyBuilder';
|
|
5
|
+
import VirtualSocket from '../virtual-socket';
|
|
6
|
+
export interface SubscribeOptions {
|
|
7
|
+
restoreStrategy?: RestoreStrategy;
|
|
8
|
+
}
|
|
9
|
+
export interface ChannelOptions<T> {
|
|
10
|
+
forceTokenRequest?: boolean;
|
|
11
|
+
resourceId?: string;
|
|
12
|
+
info?: T;
|
|
13
|
+
}
|
|
14
|
+
export default class Channel<T = any> extends Emitter {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly resourceId: string;
|
|
17
|
+
private readonly virtualSocket;
|
|
18
|
+
private readonly info;
|
|
19
|
+
private restore;
|
|
20
|
+
private subscribingState;
|
|
21
|
+
constructor(virtualSocket: VirtualSocket, name: string, resourceId?: string, info?: T);
|
|
22
|
+
setMessageIdRestore(messageId: string): MessageIdRestoreStrategy;
|
|
23
|
+
subscribe(opts?: SubscribeOptions): Promise<void>;
|
|
24
|
+
setUnsubscribe(): void;
|
|
25
|
+
private sendSubscribe;
|
|
26
|
+
unsubscribe(): Promise<void>;
|
|
27
|
+
send(event: string, payload?: string): Promise<Protocol.Ack | Protocol.ErrorPacket>;
|
|
28
|
+
private emitSubscriptionSucceeded;
|
|
29
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
+
function step(op) {
|
|
31
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
33
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
34
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
+
switch (op[0]) {
|
|
36
|
+
case 0: case 1: t = op; break;
|
|
37
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
+
default:
|
|
41
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
+
if (t[2]) _.ops.pop();
|
|
46
|
+
_.trys.pop(); continue;
|
|
47
|
+
}
|
|
48
|
+
op = body.call(thisArg, _);
|
|
49
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
var event_emitter_1 = require("../utils/event-emitter");
|
|
55
|
+
var wix_duplexer_protocol_1 = require("@wix/wix-duplexer-protocol");
|
|
56
|
+
var Channel = /** @class */ (function (_super) {
|
|
57
|
+
__extends(Channel, _super);
|
|
58
|
+
function Channel(virtualSocket, name, resourceId, info) {
|
|
59
|
+
var _this = _super.call(this) || this;
|
|
60
|
+
_this.subscribingState = 1 /* SubscribingState.UNSUBSCRIBED */;
|
|
61
|
+
_this.name = name;
|
|
62
|
+
_this.virtualSocket = virtualSocket;
|
|
63
|
+
_this.resourceId = resourceId;
|
|
64
|
+
_this.info = info;
|
|
65
|
+
return _this;
|
|
66
|
+
}
|
|
67
|
+
Channel.prototype.setMessageIdRestore = function (messageId) {
|
|
68
|
+
this.restore = wix_duplexer_protocol_1.RestoreStrategyBuilderFactory.messageId()
|
|
69
|
+
.withId(messageId)
|
|
70
|
+
.build();
|
|
71
|
+
return this.restore;
|
|
72
|
+
};
|
|
73
|
+
Channel.prototype.subscribe = function (opts) {
|
|
74
|
+
if (opts === void 0) { opts = {}; }
|
|
75
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
76
|
+
var _this = this;
|
|
77
|
+
return __generator(this, function (_a) {
|
|
78
|
+
switch (_a.label) {
|
|
79
|
+
case 0:
|
|
80
|
+
if (this.subscribingState === 0 /* SubscribingState.SUBSCRIBED */) {
|
|
81
|
+
setTimeout(function () { return _this.emitSubscriptionSucceeded(true); }, 0);
|
|
82
|
+
return [2 /*return*/];
|
|
83
|
+
}
|
|
84
|
+
if (this.subscribingState === 2 /* SubscribingState.SUBSCRIBING */) {
|
|
85
|
+
return [2 /*return*/];
|
|
86
|
+
}
|
|
87
|
+
this.subscribingState = 2 /* SubscribingState.SUBSCRIBING */;
|
|
88
|
+
return [4 /*yield*/, this.sendSubscribe(opts)];
|
|
89
|
+
case 1:
|
|
90
|
+
_a.sent();
|
|
91
|
+
return [2 /*return*/];
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
Channel.prototype.setUnsubscribe = function () {
|
|
97
|
+
this.subscribingState = 1 /* SubscribingState.UNSUBSCRIBED */;
|
|
98
|
+
};
|
|
99
|
+
Channel.prototype.sendSubscribe = function (opts) {
|
|
100
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
101
|
+
var res;
|
|
102
|
+
return __generator(this, function (_a) {
|
|
103
|
+
switch (_a.label) {
|
|
104
|
+
case 0: return [4 /*yield*/, this.virtualSocket.send({
|
|
105
|
+
type: 'subscribe',
|
|
106
|
+
channel: this.name,
|
|
107
|
+
resourceId: this.resourceId,
|
|
108
|
+
auth: '',
|
|
109
|
+
restore: opts.restoreStrategy || this.restore,
|
|
110
|
+
info: this.info,
|
|
111
|
+
})];
|
|
112
|
+
case 1:
|
|
113
|
+
res = _a.sent();
|
|
114
|
+
if (res.type === 'error') {
|
|
115
|
+
this.emit('@duplexer:subscription_failed', res);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this.subscribingState = 0 /* SubscribingState.SUBSCRIBED */;
|
|
119
|
+
this.emitSubscriptionSucceeded(res.isSynced);
|
|
120
|
+
}
|
|
121
|
+
return [2 /*return*/];
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
Channel.prototype.unsubscribe = function () {
|
|
127
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
128
|
+
return __generator(this, function (_a) {
|
|
129
|
+
switch (_a.label) {
|
|
130
|
+
case 0: return [4 /*yield*/, this.virtualSocket.send({
|
|
131
|
+
type: 'unsubscribe',
|
|
132
|
+
channel: this.name,
|
|
133
|
+
resourceId: this.resourceId,
|
|
134
|
+
})];
|
|
135
|
+
case 1:
|
|
136
|
+
_a.sent();
|
|
137
|
+
this.subscribingState = 1 /* SubscribingState.UNSUBSCRIBED */;
|
|
138
|
+
this.emit('@duplexer:unsubscribe_succeeded');
|
|
139
|
+
return [2 /*return*/];
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
Channel.prototype.send = function (event, payload) {
|
|
145
|
+
return this.virtualSocket.send({
|
|
146
|
+
type: 'client_message',
|
|
147
|
+
channel: this.name,
|
|
148
|
+
resourceId: this.resourceId,
|
|
149
|
+
event: event,
|
|
150
|
+
payload: payload,
|
|
151
|
+
}, { affectState: false });
|
|
152
|
+
};
|
|
153
|
+
Channel.prototype.emitSubscriptionSucceeded = function (isSynced) {
|
|
154
|
+
this.emit('@duplexer:subscription_succeeded', { isSynced: isSynced });
|
|
155
|
+
};
|
|
156
|
+
return Channel;
|
|
157
|
+
}(event_emitter_1.Emitter));
|
|
158
|
+
exports.default = Channel;
|
|
159
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../../src/channels/channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Channel from './channel';
|
|
2
|
+
import VirtualSocket from '../virtual-socket';
|
|
3
|
+
export default class Channels {
|
|
4
|
+
private readonly virtualSocket;
|
|
5
|
+
private channelsList;
|
|
6
|
+
constructor(virtualSocket: VirtualSocket);
|
|
7
|
+
add<T>(name: string, resourceId?: string, info?: T): Channel<any>;
|
|
8
|
+
remove(name: string, resourceId?: string): Channel<any>;
|
|
9
|
+
find(name: string, resourceId?: string): Channel<any>;
|
|
10
|
+
all(): Channel<any>[];
|
|
11
|
+
subscribeAll(): void;
|
|
12
|
+
setUnsubscribeAll(): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var channel_1 = __importDefault(require("./channel"));
|
|
7
|
+
var Channels = /** @class */ (function () {
|
|
8
|
+
function Channels(virtualSocket) {
|
|
9
|
+
this.virtualSocket = virtualSocket;
|
|
10
|
+
this.channelsList = [];
|
|
11
|
+
}
|
|
12
|
+
Channels.prototype.add = function (name, resourceId, info) {
|
|
13
|
+
var maybeChannel = this.find(name, resourceId);
|
|
14
|
+
if (maybeChannel) {
|
|
15
|
+
return maybeChannel;
|
|
16
|
+
}
|
|
17
|
+
var channel = new channel_1.default(this.virtualSocket, name, resourceId, info);
|
|
18
|
+
this.channelsList.push(channel);
|
|
19
|
+
return channel;
|
|
20
|
+
};
|
|
21
|
+
Channels.prototype.remove = function (name, resourceId) {
|
|
22
|
+
var channel = this.find(name, resourceId);
|
|
23
|
+
this.channelsList = this.channelsList.filter(function (c) { return c.name !== name || c.resourceId !== resourceId; });
|
|
24
|
+
return channel;
|
|
25
|
+
};
|
|
26
|
+
Channels.prototype.find = function (name, resourceId) {
|
|
27
|
+
return this.channelsList.find(function (c) { return c.name === name && c.resourceId === resourceId; });
|
|
28
|
+
};
|
|
29
|
+
Channels.prototype.all = function () {
|
|
30
|
+
return this.channelsList;
|
|
31
|
+
};
|
|
32
|
+
Channels.prototype.subscribeAll = function () {
|
|
33
|
+
this.all().forEach(function (c) { return c.subscribe(); });
|
|
34
|
+
};
|
|
35
|
+
Channels.prototype.setUnsubscribeAll = function () {
|
|
36
|
+
this.all().forEach(function (c) { return c.setUnsubscribe(); });
|
|
37
|
+
};
|
|
38
|
+
return Channels;
|
|
39
|
+
}());
|
|
40
|
+
exports.default = Channels;
|
|
41
|
+
//# sourceMappingURL=channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../../../src/channels/channels.ts"],"names":[],"mappings":";;;;;AAAA,sDAAgC;AAGhC;IAGE,kBAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QAFjD,iBAAY,GAAc,EAAE,CAAC;IAEuB,CAAC;IAE7D,sBAAG,GAAH,UAAO,IAAY,EAAE,UAAmB,EAAE,IAAQ;QAChD,IAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEjD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAM,OAAO,GAAG,IAAI,iBAAO,CAAI,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEhC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yBAAM,GAAN,UAAO,IAAY,EAAE,UAAmB;QACtC,IAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAC1C,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,EAA9C,CAA8C,CACtD,CAAC;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,uBAAI,GAAJ,UAAK,IAAY,EAAE,UAAmB;QACpC,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAC3B,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,EAA9C,CAA8C,CACtD,CAAC;IACJ,CAAC;IAED,sBAAG,GAAH;QACE,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,+BAAY,GAAZ;QACE,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,SAAS,EAAE,EAAb,CAAa,CAAC,CAAC;IAC3C,CAAC;IAED,oCAAiB,GAAjB;QACE,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,cAAc,EAAE,EAAlB,CAAkB,CAAC,CAAC;IAChD,CAAC;IACH,eAAC;AAAD,CAAC,AA5CD,IA4CC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription-error.js","sourceRoot":"","sources":["../../../src/channels/subscription-error.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Emitter } from './utils/event-emitter';
|
|
2
|
+
import { Protocol } from '@wix/wix-duplexer-typescript-definitions';
|
|
3
|
+
import { PollPayloadProtocol } from '@wix/wix-duplexer-protocol/dist/lib/PollPayloadBuilder';
|
|
4
|
+
import Environment from './environments/core/environment';
|
|
5
|
+
import { KeepAliveOpts } from './keep-alive';
|
|
6
|
+
import { WriteOptions } from './transport/transport';
|
|
7
|
+
import Timeline from './timeline/timeline';
|
|
8
|
+
import { InstanceUpdater } from './instance-updater';
|
|
9
|
+
export interface ConnectionManagerOpts extends KeepAliveOpts {
|
|
10
|
+
environment: Environment;
|
|
11
|
+
timeline: Timeline;
|
|
12
|
+
instanceUpdater?: InstanceUpdater;
|
|
13
|
+
autoConnectEnabed?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* ConnectionManager responsibilities:
|
|
17
|
+
* - Auto reconnections on abrupt disconnections and environment state changes
|
|
18
|
+
* - Keep alive (in relevant transports only)
|
|
19
|
+
* - Network state changes (on online hints)
|
|
20
|
+
* - Dealing with TransportsManager
|
|
21
|
+
*
|
|
22
|
+
* Events:
|
|
23
|
+
* - "open" - on connection open, depends on result from TransportsManager#connect
|
|
24
|
+
* - "close" - passed through from TransportsManager
|
|
25
|
+
* - "connect_error" - passed through from TransportsManager
|
|
26
|
+
* - "message" - passed through from TransportsManager
|
|
27
|
+
*/
|
|
28
|
+
export default class ConnectionManager extends Emitter {
|
|
29
|
+
private readonly opts;
|
|
30
|
+
private keepAlive;
|
|
31
|
+
private autoConnect;
|
|
32
|
+
private readonly environment;
|
|
33
|
+
private readonly timeline;
|
|
34
|
+
private readonly autoConnectEnabled;
|
|
35
|
+
constructor(opts: ConnectionManagerOpts);
|
|
36
|
+
get sessionId(): string;
|
|
37
|
+
updatePayload(payload: PollPayloadProtocol): void;
|
|
38
|
+
send(packet: Protocol.Packet, opts?: WriteOptions): void;
|
|
39
|
+
close(): void;
|
|
40
|
+
get readyState(): import("./ready-state").default;
|
|
41
|
+
connect(): Promise<void>;
|
|
42
|
+
isClosed(): boolean;
|
|
43
|
+
private isOpen;
|
|
44
|
+
private get transport();
|
|
45
|
+
/**
|
|
46
|
+
* we reconnect in the following scenarios only:
|
|
47
|
+
*
|
|
48
|
+
* - unexpected close, due to command that errored out or any other unexpected
|
|
49
|
+
* network error.
|
|
50
|
+
* - keep alive failed to return a pong during the defined timeout/timeframe.
|
|
51
|
+
* - sessions expired.
|
|
52
|
+
*
|
|
53
|
+
* note: invalid signed instance is currently an error we do not recover, it's a todo.
|
|
54
|
+
* basically we can recover it, because instance updater provided by the user should
|
|
55
|
+
* always return a valid signed instance, so we can retry multiple times.
|
|
56
|
+
*/
|
|
57
|
+
private shouldReconnect;
|
|
58
|
+
private listenNeworkStateChanges;
|
|
59
|
+
private listenTransportEvents;
|
|
60
|
+
private dispose;
|
|
61
|
+
private maybeLogDisconnectionError;
|
|
62
|
+
}
|