@owlmeans/client-socket 0.1.18-rc.33 → 0.1.18-rc.35
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 +2 -2
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/client-socket/SKILL.md +36 -14
- package/build/consts.d.ts.map +1 -1
- package/build/consts.js +1 -0
- package/build/consts.js.map +1 -1
- package/build/helper.d.ts +3 -2
- package/build/helper.d.ts.map +1 -1
- package/build/helper.js +40 -12
- package/build/helper.js.map +1 -1
- package/build/status.d.ts +9 -0
- package/build/status.d.ts.map +1 -1
- package/build/status.js +83 -26
- package/build/status.js.map +1 -1
- package/build/types.d.ts +13 -2
- package/build/types.d.ts.map +1 -1
- package/build/utils/connection.d.ts +5 -0
- package/build/utils/connection.d.ts.map +1 -1
- package/build/utils/connection.js +73 -19
- package/build/utils/connection.js.map +1 -1
- package/package.json +10 -10
- package/src/consts.ts +1 -0
- package/src/helper.ts +40 -12
- package/src/status.ts +81 -25
- package/src/types.ts +13 -2
- package/src/utils/connection.ts +77 -19
- package/tests/reconnect.spec.ts +228 -6
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ React hook and factory for WebSocket connections via OwlMeans entrypoint routing
|
|
|
12
12
|
## Installation
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
bun add @owlmeans/client-socket@^0.1.18-rc.
|
|
15
|
+
bun add @owlmeans/client-socket@^0.1.18-rc.35
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
## Usage
|
|
@@ -75,7 +75,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
|
|
|
75
75
|
your project's skill store (`.agents/skills/`):
|
|
76
76
|
|
|
77
77
|
```sh
|
|
78
|
-
npx @owlmeans/agent-skills@^0.1.18-rc.
|
|
78
|
+
npx @owlmeans/agent-skills@^0.1.18-rc.34
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
The embedded files are version-matched to this package release. Do not edit them
|
package/agent-meta/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"package": "@owlmeans/client-socket",
|
|
4
|
-
"version": "0.1.18-rc.
|
|
5
|
-
"generatedAt": "2026-09-
|
|
4
|
+
"version": "0.1.18-rc.35",
|
|
5
|
+
"generatedAt": "2026-09-22T20:45:24.048Z",
|
|
6
6
|
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -8,7 +8,7 @@ user-invocable: false
|
|
|
8
8
|
# @owlmeans/client-socket
|
|
9
9
|
|
|
10
10
|
**Layer:** Client
|
|
11
|
-
**Install:** `"@owlmeans/client-socket": "^0.1.18-rc.
|
|
11
|
+
**Install:** `"@owlmeans/client-socket": "^0.1.18-rc.35"` in `dependencies`
|
|
12
12
|
|
|
13
13
|
The browser carrier for `@owlmeans/socket`. It supplies the four members the connection model
|
|
14
14
|
leaves abstract — `send`, `close`, `prepare`, `authenticate` — and hands back a plain `Connection`,
|
|
@@ -24,7 +24,7 @@ re-registered after a network blip.
|
|
|
24
24
|
| `ws(entrypoint, request?, options?)` | Open a `Connection` to a socket entrypoint. Resolves once the FIRST attempt opens; rejects with `SocketConnectionError('lost')` if the retry budget elapses first |
|
|
25
25
|
| `useWs(protocol \| alias, request?, options?)` | React hook — `Connection \| null` until it opens (or gives up); re-opens on `alias`/`AUTH_QUERY`/`params` change and closes on unmount |
|
|
26
26
|
| `connect(address, ctx, options?)` | The same machinery with no entrypoint behind it — an `address` callback returning the URL, for an adapter or a test |
|
|
27
|
-
| `appendSocketStatus(ctx, alias?)` / `useSocketStatus()` | The status aggregator — see below |
|
|
27
|
+
| `appendSocketStatus(ctx, alias?)` / `useSocketStatus()` / `useSocketRetry()` | The status aggregator and its retry — see below |
|
|
28
28
|
| `Config` / `Context` | The client config (`socket?: SocketClientSettings`) and context types this package expects |
|
|
29
29
|
| `ReconnectPolicy` / `SocketClientSettings` / `ConnectOptions` / `WsOptions` | The reconnect policy shape and where it can be set — config, or per-call `options` |
|
|
30
30
|
|
|
@@ -103,9 +103,10 @@ reconnect, because it was registered on the model, not on the socket.
|
|
|
103
103
|
| `factor` | 2 | Geometric growth per failed attempt |
|
|
104
104
|
| `jitter` | 0.1 | ±10% randomization on each computed delay |
|
|
105
105
|
| `budget` | 600000ms (10 min) | Total retry time before the carrier gives up |
|
|
106
|
-
| `
|
|
106
|
+
| `reviveBudget` | 15000ms | Retry window `retry()` gives a lost socket (and the minimum it leaves one still retrying) — short, so a retry that cannot succeed reports `'lost'` again while someone is still looking |
|
|
107
|
+
| `stableAfter` | 10000ms | How long a reopened socket must stay up before the attempt count, the outage clock and the budget (back to `budget`) reset |
|
|
107
108
|
| `heartbeat` | 30000ms | Ping interval — runs even with `reconnect: false` |
|
|
108
|
-
| `pongTimeout` | 10000ms |
|
|
109
|
+
| `pongTimeout` | 10000ms | Checked at the next heartbeat tick: the ping still unanswered this long ⇒ the carrier force-closes the socket itself (code 4000, `SOCKET_HEARTBEAT_TIMEOUT_CODE`) — the only way a silently half-open TCP connection is noticed before the OS would, minutes later. Measured from the PING, never from the last frame: a hidden tab's timers are throttled to roughly one wake-up a minute, and "nothing for a whole interval" is what throttling looks like, not what a dead socket looks like. Any inbound frame answers the ping; `server-socket` replies `{"type":"pong"}` |
|
|
109
110
|
|
|
110
111
|
Set it on `ctx.cfg.socket.reconnect` (app-wide) or per call via `options.reconnect` (which wins).
|
|
111
112
|
`reconnect: false` disables retries — a drop is reported once and stays dropped, the
|
|
@@ -119,10 +120,10 @@ subscriber:
|
|
|
119
120
|
| Event | When |
|
|
120
121
|
|---|---|
|
|
121
122
|
| `disconnected` | The socket dropped and a retry IS scheduled — `{ code }` |
|
|
122
|
-
| `reconnecting` | Before each retry attempt — `{ attempt, delay }` |
|
|
123
|
-
| `reconnected` | A retry succeeded — `{ attempts }` |
|
|
124
|
-
| `lost` | The retry budget elapsed with no success — no payload |
|
|
125
|
-
| `close` | The connection is gone for GOOD: a client-initiated close, a terminal server code (1000/1008), `reconnect: false` and the one attempt failed
|
|
123
|
+
| `reconnecting` | Before each retry attempt — `{ attempt, delay }` (`delay: 0` for a revive's immediate attempt) |
|
|
124
|
+
| `reconnected` | A retry succeeded, a revived one included — `{ attempts }` |
|
|
125
|
+
| `lost` | The retry budget elapsed with no success — no payload. The connection is NOT closed: it stays revivable (below) until its owner closes it |
|
|
126
|
+
| `close` | The connection is gone for GOOD: a client-initiated close, a terminal server code (1000/1008), or `reconnect: false` and the one attempt failed. Never follows `lost` by itself |
|
|
126
127
|
|
|
127
128
|
```typescript
|
|
128
129
|
connection.listen(async message => {
|
|
@@ -135,14 +136,34 @@ connection.listen(async message => {
|
|
|
135
136
|
|
|
136
137
|
**The status aggregator.** `appendSocketStatus(ctx)` registers a shared service every
|
|
137
138
|
`ws()`/`useWs()` connection reports its state into; `useSocketStatus()` reads the WORST state
|
|
138
|
-
across all of them (`'online' | 'reconnecting' | 'lost'`). A
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
what `@owlmeans/web-panel`'s `SocketReloadDialog` reads to put up a global, blocking "reload the
|
|
142
|
-
page" prompt once every socket in the app has given up (`cfg.socket.reloadDialog`). Calling
|
|
139
|
+
across all of them (`'online' | 'reconnecting' | 'lost'`). A `'lost'` connection stays in the
|
|
140
|
+
aggregate — that is what `@owlmeans/web-panel`'s `SocketReloadDialog` reads to put up its global
|
|
141
|
+
prompt (`cfg.socket.reloadDialog`) — until something revives or closes it. Calling
|
|
143
142
|
`appendSocketStatus` unconditionally is cheap and safe for a host package — nothing reports into
|
|
144
143
|
it unless something calls `ws()`/`useWs()`, so an app that never does behaves exactly as before.
|
|
145
144
|
|
|
145
|
+
**Retry.** `socketStatus().retry()` revives every `'lost'` connection and hurries every
|
|
146
|
+
`'reconnecting'` one (attempt at once instead of after the backoff, and at least `reviveBudget`
|
|
147
|
+
left) — without that, a sibling whose older budget runs out a moment later reports `'lost'` right
|
|
148
|
+
after the retry and puts the dialog straight back. It fires `onRetry` listeners and returns `true`
|
|
149
|
+
only when something was lost, so calling it freely is safe.
|
|
150
|
+
The service calls it by itself when the tab becomes visible, the window gains focus, or the
|
|
151
|
+
browser goes back `online` — a background tab is where sockets die unnoticed (throttled timers, a
|
|
152
|
+
sleeping machine), so the moment it is looked at again is when to retry. How a lost connection
|
|
153
|
+
comes back depends on whether it ever opened:
|
|
154
|
+
|
|
155
|
+
- **Opened before** — revived in place: one attempt at once, then the normal backoff within
|
|
156
|
+
`reviveBudget`. Same `Connection` model, and success emits `reconnected`, so the re-auth / re-sync
|
|
157
|
+
listeners every caller already has for a network blip cover this too. Failing again reports
|
|
158
|
+
`lost` again.
|
|
159
|
+
- **Never opened** — `ws()` already rejected and nobody holds it, so it is closed for good and
|
|
160
|
+
released. `useWs` re-dials by itself on `onRetry` (a fresh `ws()`, full `budget`); a direct
|
|
161
|
+
`ws()` caller re-opens on its own terms.
|
|
162
|
+
- A terminal close (1000/1008, `reconnect: false`) is never revived.
|
|
163
|
+
|
|
164
|
+
`useSocketRetry()` gives a UI `{ retry, retrying }` — `retrying` is true from any retry (the
|
|
165
|
+
button, or the service's own on activation) until the aggregate settles on `'online'` or `'lost'`.
|
|
166
|
+
|
|
146
167
|
`useSocketStatus()` tolerates being called before the context's own `configure()`/`init()` has
|
|
147
168
|
run (it defaults to `'online'` and re-attaches once `ctx.waitForInitialized()` resolves) — a
|
|
148
169
|
component mounted as a sibling of the router, as `SocketReloadDialog` is, renders on React's
|
|
@@ -170,4 +191,5 @@ its thinking/slot socket relies on a separate periodic API push for the same rea
|
|
|
170
191
|
- `server-socket` — the far side: guard enforcement, and what it stamps on a frame
|
|
171
192
|
- `client-auth` — the `useWs` that carries the token and refreshes it across reconnects;
|
|
172
193
|
`client-job` — `useJobFeed`, a worked subscription built on it
|
|
173
|
-
- `web-panel` — `SocketReloadDialog`, the global blocking prompt built on `useSocketStatus()`
|
|
194
|
+
- `web-panel` — `SocketReloadDialog`, the global blocking prompt built on `useSocketStatus()` /
|
|
195
|
+
`useSocketRetry()`
|
package/build/consts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,
|
|
1
|
+
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,eAUtC,CAAA"}
|
package/build/consts.js
CHANGED
package/build/consts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,OAAO;IACf,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,MAAM;CACpB,CAAA"}
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,OAAO;IACf,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,MAAM;CACpB,CAAA"}
|
package/build/helper.d.ts
CHANGED
|
@@ -25,8 +25,9 @@ export declare const ws: (module: ClientEntrypoint<string>, request?: AbstractRe
|
|
|
25
25
|
* entrypoint here at the transport boundary.
|
|
26
26
|
*
|
|
27
27
|
* Re-opens on its own after a network drop (see `ws()`). `null` until the first attempt opens,
|
|
28
|
-
* and again once the retry budget elapses without one ever opening —
|
|
29
|
-
*
|
|
28
|
+
* and again once the retry budget elapses without one ever opening — dialed afresh on the next
|
|
29
|
+
* `SocketStatusService.retry()`. A screen that must tell those two apart reads
|
|
30
|
+
* `useSocketStatus()` (from `./status.js`) alongside this.
|
|
30
31
|
*/
|
|
31
32
|
export declare const useWs: (module: EntrypointReference | string, request?: Partial<AbstractRequest<any>>, options?: WsOptions) => Connection | null;
|
|
32
33
|
//# sourceMappingURL=helper.d.ts.map
|
package/build/helper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAIlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAU,OAAO,EAAE,cAAc,EAA8C,SAAS,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAIlD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAU,OAAO,EAAE,cAAc,EAA8C,SAAS,EAAE,MAAM,YAAY,CAAA;AA6ExH;;;GAGG;AACH,eAAO,MAAM,OAAO,YACT,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,OAAO,YAAY,cAAc,KAC9E,OAAO,CAAC,UAAU,CAGpB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,EAAE,WACL,gBAAgB,CAAC,MAAM,CAAC,YAAY,eAAe,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,YAAY,SAAS,KACnG,OAAO,CAAC,UAAU,CAUpB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK,WACR,mBAAmB,GAAG,MAAM,YAAY,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,YAAY,SAAS,KACjG,UAAU,GAAG,IAiDf,CAAA"}
|
package/build/helper.js
CHANGED
|
@@ -5,7 +5,7 @@ import { assertContext } from '@owlmeans/context';
|
|
|
5
5
|
import { useContext, useValue } from '@owlmeans/client';
|
|
6
6
|
import { AUTH_QUERY } from '@owlmeans/auth';
|
|
7
7
|
import { entrypointUrl } from '@owlmeans/client-entrypoint/utils';
|
|
8
|
-
import { useEffect, useMemo } from 'react';
|
|
8
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
9
9
|
import { createIdOfLength } from '@owlmeans/basic-ids';
|
|
10
10
|
import { DEFAULT_RECONNECT_POLICY } from './consts.js';
|
|
11
11
|
import { SOCKET_STATUS } from './status.js';
|
|
@@ -34,21 +34,35 @@ const establish = async (ctx, policy, retry, open) => {
|
|
|
34
34
|
const statusId = createIdOfLength(8);
|
|
35
35
|
const status = ctx.hasService(SOCKET_STATUS)
|
|
36
36
|
? ctx.socketStatus() : null;
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
let opened = false;
|
|
38
|
+
let lost = false;
|
|
39
|
+
const managed = makeConnection({
|
|
40
|
+
policy, retry, open, onStatus: state => {
|
|
41
|
+
lost = state === 'lost';
|
|
42
|
+
status?.report(statusId, state, state === 'online' ? undefined : revive);
|
|
43
|
+
}
|
|
39
44
|
});
|
|
45
|
+
const { connection, ready } = managed;
|
|
40
46
|
const baseClose = connection.close;
|
|
41
47
|
connection.close = async () => {
|
|
42
48
|
await baseClose();
|
|
43
49
|
status?.release(statusId);
|
|
44
50
|
};
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
const revive = () => {
|
|
52
|
+
if (opened || !lost) {
|
|
53
|
+
managed.revive();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Never opened, so `ws()` already rejected and nobody holds this connection to hand a revived
|
|
57
|
+
// socket to: drop it for good and leave re-dialing to its owner (`useWs` does, on `onRetry`).
|
|
58
|
+
void baseClose();
|
|
59
|
+
status?.release(statusId);
|
|
60
|
+
};
|
|
61
|
+
// A rejection leaves this id reporting `'lost'` rather than releasing it — there is no
|
|
62
|
+
// `Connection` to hand back for a caller to close, and the aggregate is what puts
|
|
63
|
+
// `SocketReloadDialog` up. It is released by `revive` above, on the next `retry()`.
|
|
51
64
|
await ready;
|
|
65
|
+
opened = true;
|
|
52
66
|
return connection;
|
|
53
67
|
};
|
|
54
68
|
/**
|
|
@@ -83,12 +97,15 @@ export const ws = async (module, request, options) => {
|
|
|
83
97
|
* entrypoint here at the transport boundary.
|
|
84
98
|
*
|
|
85
99
|
* Re-opens on its own after a network drop (see `ws()`). `null` until the first attempt opens,
|
|
86
|
-
* and again once the retry budget elapses without one ever opening —
|
|
87
|
-
*
|
|
100
|
+
* and again once the retry budget elapses without one ever opening — dialed afresh on the next
|
|
101
|
+
* `SocketStatusService.retry()`. A screen that must tell those two apart reads
|
|
102
|
+
* `useSocketStatus()` (from `./status.js`) alongside this.
|
|
88
103
|
*/
|
|
89
104
|
export const useWs = (module, request, options) => {
|
|
90
105
|
const ctx = useContext();
|
|
91
106
|
const mod = useMemo(() => ctx.entrypoint(module), [module]);
|
|
107
|
+
const [failed, setFailed] = useState(false);
|
|
108
|
+
const [dial, setDial] = useState(0);
|
|
92
109
|
const connection = useValue(async (cancel) => {
|
|
93
110
|
const _request = provideRequest(mod.alias, mod.path());
|
|
94
111
|
Object.assign(_request, request);
|
|
@@ -104,13 +121,24 @@ export const useWs = (module, request, options) => {
|
|
|
104
121
|
return conn;
|
|
105
122
|
}
|
|
106
123
|
catch {
|
|
124
|
+
if (!cancel?.current)
|
|
125
|
+
setFailed(true);
|
|
107
126
|
return null;
|
|
108
127
|
}
|
|
109
128
|
}, [
|
|
110
129
|
mod.alias,
|
|
111
130
|
request?.query?.[AUTH_QUERY],
|
|
112
|
-
request?.params ? JSON.stringify(request.params) : undefined
|
|
131
|
+
request?.params ? JSON.stringify(request.params) : undefined,
|
|
132
|
+
dial
|
|
113
133
|
]);
|
|
134
|
+
useEffect(() => {
|
|
135
|
+
if (!failed || !ctx.hasService(SOCKET_STATUS))
|
|
136
|
+
return;
|
|
137
|
+
return ctx.socketStatus().onRetry(() => {
|
|
138
|
+
setFailed(false);
|
|
139
|
+
setDial(n => n + 1);
|
|
140
|
+
});
|
|
141
|
+
}, [failed]);
|
|
114
142
|
useEffect(() => {
|
|
115
143
|
if (connection != null) {
|
|
116
144
|
return () => {
|
package/build/helper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"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"}
|
package/build/status.d.ts
CHANGED
|
@@ -19,4 +19,13 @@ export declare const appendSocketStatus: <C extends Config = Config, T extends C
|
|
|
19
19
|
* registered the status service (`appendSocketStatus`) or has not finished initializing yet.
|
|
20
20
|
*/
|
|
21
21
|
export declare const useSocketStatus: () => SocketConnectionState;
|
|
22
|
+
/**
|
|
23
|
+
* `retry` revives every lost connection now (`SocketStatusService.retry()`); `retrying` is true
|
|
24
|
+
* from any retry — this one, or the service's own on tab activation — until the aggregate settles
|
|
25
|
+
* back on `'online'` or `'lost'`.
|
|
26
|
+
*/
|
|
27
|
+
export declare const useSocketRetry: () => {
|
|
28
|
+
retry: () => void;
|
|
29
|
+
retrying: boolean;
|
|
30
|
+
};
|
|
22
31
|
//# sourceMappingURL=status.d.ts.map
|
package/build/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,yBAAyB,EACvF,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,aAAa,kBAAkB,CAAA;AAI5C;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,WAAW,MAAM,KAAmB,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,yBAAyB,EACvF,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,aAAa,kBAAkB,CAAA;AAI5C;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,WAAW,MAAM,KAAmB,mBA6DzE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,OACxF,CAAC,UAAS,MAAM,KACpB,CAAC,GAAG,yBAON,CAAA;AAgCD;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,qBAWlC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAO;IAAE,KAAK,EAAE,MAAM,IAAI,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAcvE,CAAA"}
|
package/build/status.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createService } from '@owlmeans/context';
|
|
2
2
|
import { useContext } from '@owlmeans/client';
|
|
3
|
-
import { useEffect, useState } from 'react';
|
|
3
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
4
4
|
export const SOCKET_STATUS = 'socket-status';
|
|
5
5
|
const RANK = { online: 0, reconnecting: 1, lost: 2 };
|
|
6
6
|
/**
|
|
@@ -11,7 +11,9 @@ const RANK = { online: 0, reconnecting: 1, lost: 2 };
|
|
|
11
11
|
*/
|
|
12
12
|
export const createSocketStatusService = (alias = SOCKET_STATUS) => {
|
|
13
13
|
const states = new Map();
|
|
14
|
+
const revivers = new Map();
|
|
14
15
|
const listeners = new Set();
|
|
16
|
+
const retryListeners = new Set();
|
|
15
17
|
let current = 'online';
|
|
16
18
|
const recompute = () => {
|
|
17
19
|
let worst = 'online';
|
|
@@ -24,15 +26,52 @@ export const createSocketStatusService = (alias = SOCKET_STATUS) => {
|
|
|
24
26
|
listeners.forEach(listener => listener(current));
|
|
25
27
|
}
|
|
26
28
|
};
|
|
29
|
+
// Connections still retrying are nudged too, so one whose older budget is about to run out does
|
|
30
|
+
// not report `'lost'` right after its lost siblings were revived.
|
|
31
|
+
const retry = () => {
|
|
32
|
+
const pending = [...states].filter(([, state]) => state !== 'online');
|
|
33
|
+
pending.forEach(([id]) => revivers.get(id)?.());
|
|
34
|
+
if (!pending.some(([, state]) => state === 'lost'))
|
|
35
|
+
return false;
|
|
36
|
+
retryListeners.forEach(listener => listener());
|
|
37
|
+
return true;
|
|
38
|
+
};
|
|
39
|
+
// A backgrounded tab is where sockets die unnoticed (throttled timers, a sleeping machine), so
|
|
40
|
+
// the moment it is looked at again is the moment to retry — before anyone reaches for a button.
|
|
41
|
+
const watchActivation = () => {
|
|
42
|
+
if (typeof document === 'undefined' || typeof window === 'undefined')
|
|
43
|
+
return;
|
|
44
|
+
document.addEventListener('visibilitychange', () => {
|
|
45
|
+
if (document.visibilityState === 'visible')
|
|
46
|
+
retry();
|
|
47
|
+
});
|
|
48
|
+
window.addEventListener('focus', () => { retry(); });
|
|
49
|
+
window.addEventListener('online', () => { retry(); });
|
|
50
|
+
};
|
|
27
51
|
return createService(alias, {
|
|
28
|
-
report: (id, state) => {
|
|
29
|
-
|
|
52
|
+
report: (id, state, revive) => {
|
|
53
|
+
states.set(id, state);
|
|
54
|
+
if (revive != null)
|
|
55
|
+
revivers.set(id, revive);
|
|
56
|
+
else
|
|
57
|
+
revivers.delete(id);
|
|
58
|
+
recompute();
|
|
59
|
+
},
|
|
60
|
+
release: (id) => { states.delete(id); revivers.delete(id); recompute(); },
|
|
30
61
|
state: () => current,
|
|
31
62
|
subscribe: listener => {
|
|
32
63
|
listeners.add(listener);
|
|
33
64
|
return () => { listeners.delete(listener); };
|
|
34
65
|
},
|
|
35
|
-
|
|
66
|
+
retry,
|
|
67
|
+
onRetry: listener => {
|
|
68
|
+
retryListeners.add(listener);
|
|
69
|
+
return () => { retryListeners.delete(listener); };
|
|
70
|
+
},
|
|
71
|
+
}, service => async () => {
|
|
72
|
+
watchActivation();
|
|
73
|
+
service.initialized = true;
|
|
74
|
+
});
|
|
36
75
|
};
|
|
37
76
|
/**
|
|
38
77
|
* Register the shared socket-status aggregator. Idempotent, and cheap enough for a host package
|
|
@@ -61,34 +100,52 @@ const readSocketStatusService = (ctx) => {
|
|
|
61
100
|
return null;
|
|
62
101
|
}
|
|
63
102
|
};
|
|
103
|
+
/** The status service once the context can hand it out; `null` while it cannot, or never will. */
|
|
104
|
+
const useStatusService = () => {
|
|
105
|
+
const ctx = useContext();
|
|
106
|
+
const [service, setService] = useState(() => readSocketStatusService(ctx));
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
if (service != null)
|
|
109
|
+
return;
|
|
110
|
+
let cancelled = false;
|
|
111
|
+
void ctx.waitForInitialized?.().then(() => { if (!cancelled)
|
|
112
|
+
setService(readSocketStatusService(ctx)); });
|
|
113
|
+
return () => { cancelled = true; };
|
|
114
|
+
}, [ctx, service]);
|
|
115
|
+
return service;
|
|
116
|
+
};
|
|
64
117
|
/**
|
|
65
118
|
* The worst state across every live `ws()`/`useWs()` connection, or `'online'` if the app never
|
|
66
119
|
* registered the status service (`appendSocketStatus`) or has not finished initializing yet.
|
|
67
120
|
*/
|
|
68
121
|
export const useSocketStatus = () => {
|
|
69
|
-
const
|
|
70
|
-
const [state, setState] = useState(() =>
|
|
122
|
+
const service = useStatusService();
|
|
123
|
+
const [state, setState] = useState(() => service?.state() ?? 'online');
|
|
71
124
|
useEffect(() => {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return false;
|
|
78
|
-
setState(service.state());
|
|
79
|
-
unsubscribe = service.subscribe(next => { if (!cancelled)
|
|
80
|
-
setState(next); });
|
|
81
|
-
return true;
|
|
82
|
-
};
|
|
83
|
-
if (!attach()) {
|
|
84
|
-
void ctx.waitForInitialized?.().then(() => { if (!cancelled)
|
|
85
|
-
attach(); });
|
|
86
|
-
}
|
|
87
|
-
return () => {
|
|
88
|
-
cancelled = true;
|
|
89
|
-
unsubscribe?.();
|
|
90
|
-
};
|
|
91
|
-
}, [ctx]);
|
|
125
|
+
if (service == null)
|
|
126
|
+
return;
|
|
127
|
+
setState(service.state());
|
|
128
|
+
return service.subscribe(setState);
|
|
129
|
+
}, [service]);
|
|
92
130
|
return state;
|
|
93
131
|
};
|
|
132
|
+
/**
|
|
133
|
+
* `retry` revives every lost connection now (`SocketStatusService.retry()`); `retrying` is true
|
|
134
|
+
* from any retry — this one, or the service's own on tab activation — until the aggregate settles
|
|
135
|
+
* back on `'online'` or `'lost'`.
|
|
136
|
+
*/
|
|
137
|
+
export const useSocketRetry = () => {
|
|
138
|
+
const service = useStatusService();
|
|
139
|
+
const [retrying, setRetrying] = useState(false);
|
|
140
|
+
useEffect(() => {
|
|
141
|
+
if (service == null)
|
|
142
|
+
return;
|
|
143
|
+
const stopRetry = service.onRetry(() => setRetrying(service.state() === 'reconnecting'));
|
|
144
|
+
const stopState = service.subscribe(state => { if (state !== 'reconnecting')
|
|
145
|
+
setRetrying(false); });
|
|
146
|
+
return () => { stopRetry(); stopState(); };
|
|
147
|
+
}, [service]);
|
|
148
|
+
const retry = useCallback(() => { service?.retry(); }, [service]);
|
|
149
|
+
return { retry, retrying };
|
|
150
|
+
};
|
|
94
151
|
//# sourceMappingURL=status.js.map
|
package/build/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
|
package/build/types.d.ts
CHANGED
|
@@ -29,6 +29,10 @@ export interface ReconnectPolicy {
|
|
|
29
29
|
/** Total time, in ms, the carrier keeps retrying before it reports the socket lost. Default
|
|
30
30
|
* 600000 (10 minutes). */
|
|
31
31
|
budget: number;
|
|
32
|
+
/** Retry window, in ms, of an outage restarted on a lost socket by `SocketStatusService.retry()`
|
|
33
|
+
* (a "Try again" press, the tab coming back) — short, so a retry that cannot succeed reports
|
|
34
|
+
* `'lost'` again while someone is still looking. Default 15000. */
|
|
35
|
+
reviveBudget: number;
|
|
32
36
|
/** How long a reopened socket must stay open before the attempt count and the outage clock
|
|
33
37
|
* reset, in ms. Default 10000. */
|
|
34
38
|
stableAfter: number;
|
|
@@ -57,13 +61,20 @@ export interface WsOptions extends ConnectOptions {
|
|
|
57
61
|
/** The coarse health of a socket connection — the worst of everything a status service tracks. */
|
|
58
62
|
export type SocketConnectionState = 'online' | 'reconnecting' | 'lost';
|
|
59
63
|
export interface SocketStatusService extends InitializedService {
|
|
60
|
-
/** Record this connection's current state under `id` — call again to update it.
|
|
61
|
-
|
|
64
|
+
/** Record this connection's current state under `id` — call again to update it. `revive` is
|
|
65
|
+
* how `retry()` brings it back (`'lost'`) or hurries it (`'reconnecting'`); every report
|
|
66
|
+
* replaces the previous one. */
|
|
67
|
+
report: (id: string, state: SocketConnectionState, revive?: () => void) => void;
|
|
62
68
|
/** Stop tracking `id` (the connection closed on purpose). */
|
|
63
69
|
release: (id: string) => void;
|
|
64
70
|
/** The worst state across every tracked connection; `'online'` when none are tracked. */
|
|
65
71
|
state: () => SocketConnectionState;
|
|
66
72
|
subscribe: (listener: (state: SocketConnectionState) => void) => () => void;
|
|
73
|
+
/** Revive every `'lost'` connection and hurry every `'reconnecting'` one, then tell `onRetry`
|
|
74
|
+
* listeners. `false` (and no listener call) when nothing was lost. Also fires by itself when a
|
|
75
|
+
* browser tab becomes visible, its window gains focus, or the network comes back online. */
|
|
76
|
+
retry: () => boolean;
|
|
77
|
+
onRetry: (listener: () => void) => () => void;
|
|
67
78
|
}
|
|
68
79
|
export interface SocketStatusServiceAppend {
|
|
69
80
|
socketStatus: () => SocketStatusService;
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,MAAM,WAAW,MAAO,SAAQ,YAAY;IAC1C,MAAM,CAAC,EAAE,oBAAoB,CAAA;CAC9B;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;CAAI;AAEhF;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAA;IAChB,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAA;IACd,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAA;IACd;+BAC2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd;uCACmC;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAA;IACjB;mDAC+C;IAC/C,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC;uFACmF;IACnF,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,SAAU,SAAQ,cAAc;IAC/C;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxE;AAED,kGAAkG;AAClG,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,cAAc,GAAG,MAAM,CAAA;AAEtE,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,MAAM,WAAW,MAAO,SAAQ,YAAY;IAC1C,MAAM,CAAC,EAAE,oBAAoB,CAAA;CAC9B;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;CAAI;AAEhF;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAA;IAChB,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAA;IACd,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAA;IACd;+BAC2B;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd;;wEAEoE;IACpE,YAAY,EAAE,MAAM,CAAA;IACpB;uCACmC;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAA;IACjB;mDAC+C;IAC/C,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC;uFACmF;IACnF,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,SAAU,SAAQ,cAAc;IAC/C;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxE;AAED,kGAAkG;AAClG,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,cAAc,GAAG,MAAM,CAAA;AAEtE,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D;;qCAEiC;IACjC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;IAC/E,6DAA6D;IAC7D,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7B,yFAAyF;IACzF,KAAK,EAAE,MAAM,qBAAqB,CAAA;IAClC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;IAC3E;;iGAE6F;IAC7F,KAAK,EAAE,MAAM,OAAO,CAAA;IACpB,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAA;CAC9C;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,mBAAmB,CAAA;CACxC"}
|
|
@@ -22,6 +22,11 @@ export interface ManagedConnection {
|
|
|
22
22
|
/** Settles once the first socket opens; rejects with `SocketConnectionError('lost')` once the
|
|
23
23
|
* retry budget elapses first (or the single attempt fails, with `retry: false`). */
|
|
24
24
|
ready: Promise<void>;
|
|
25
|
+
/** Restart retrying a connection that gave up after its budget: one attempt at once, then the
|
|
26
|
+
* usual backoff within `policy.reviveBudget`. On a connection still waiting out a backoff
|
|
27
|
+
* delay: attempt at once, and leave it at least `reviveBudget`. A no-op otherwise — a terminal
|
|
28
|
+
* close (client close, 1000/1008, `retry: false`) is never revived. */
|
|
29
|
+
revive: () => void;
|
|
25
30
|
}
|
|
26
31
|
/**
|
|
27
32
|
* Build a `Connection` whose transport survives a dropped WebSocket.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAA;AAM5E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAQzE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,eAAe,CAAA;IACvB;;yCAEqC;IACrC,KAAK,EAAE,OAAO,CAAA;IACd;;0CAEsC;IACtC,IAAI,EAAE,gBAAgB,CAAA;IACtB;+DAC2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAA;CAClD;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAA;IACtB;yFACqF;IACrF,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/utils/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAA;AAM5E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAQzE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,eAAe,CAAA;IACvB;;yCAEqC;IACrC,KAAK,EAAE,OAAO,CAAA;IACd;;0CAEsC;IACtC,IAAI,EAAE,gBAAgB,CAAA;IACtB;+DAC2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAA;CAClD;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAA;IACtB;yFACqF;IACrF,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB;;;4EAGwE;IACxE,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,SAAU,wBAAwB,KAAG,iBAqQ/D,CAAA"}
|