@wcstack/websocket 1.19.1 → 1.21.0
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.ja.md +5 -1
- package/README.md +5 -1
- package/dist/index.d.ts +60 -3
- package/dist/index.esm.js +104 -6
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/package.json +1 -1
package/README.ja.md
CHANGED
|
@@ -8,7 +8,7 @@ WebSocket 通信とリアクティブな状態をつなぐ **I/O ノード** で
|
|
|
8
8
|
`@wcstack/state` と組み合わせると、`<wcs-ws>` はパス契約を通じて直接バインドできます:
|
|
9
9
|
|
|
10
10
|
- **入力 / コマンドサーフェス**: `url`, `trigger`, `send`
|
|
11
|
-
- **出力ステートサーフェス**: `message`, `connected`, `loading`, `error`, `readyState`
|
|
11
|
+
- **出力ステートサーフェス**: `message`, `connected`, `loading`, `error`, `errorInfo`, `readyState`
|
|
12
12
|
|
|
13
13
|
つまり、リアルタイム通信を HTML 内で宣言的に表現できます。UI レイヤーに `new WebSocket()`、`onmessage`、接続管理のグルーコードを書く必要はありません。
|
|
14
14
|
|
|
@@ -190,6 +190,7 @@ npm install @wcstack/websocket
|
|
|
190
190
|
| `connected` | `boolean` | WebSocket 接続中は `true` |
|
|
191
191
|
| `loading` | `boolean` | 接続処理中は `true` |
|
|
192
192
|
| `error` | `WcsWsError \| Event \| null` | 接続またはクローズエラー |
|
|
193
|
+
| `errorInfo` | `WcsIoErrorInfo \| null` | シリアライズ可能な失敗タクソノミ(安定した `code` / `phase` / `recoverable`)。`error` から導出される。追加的で、`error` の形状は不変。 |
|
|
193
194
|
| `readyState` | `number` | WebSocket readyState 定数 |
|
|
194
195
|
|
|
195
196
|
### 入力 / コマンドサーフェス
|
|
@@ -383,6 +384,7 @@ wcstack アプリケーションでは、**`trigger` によるステート駆動
|
|
|
383
384
|
| `connected` | `boolean` | WebSocket 接続中は `true` |
|
|
384
385
|
| `loading` | `boolean` | 接続処理中は `true` |
|
|
385
386
|
| `error` | `WcsWsError \| Event \| null` | エラー情報 |
|
|
387
|
+
| `errorInfo` | `WcsIoErrorInfo \| null` | 失敗タクソノミ(`code` / `phase` / `recoverable`)。`error` から導出される |
|
|
386
388
|
| `readyState` | `number` | WebSocket readyState 定数 |
|
|
387
389
|
| `binaryType` | `"blob" \| "arraybuffer"` | バイナリフレーム表現(`binary-type` 属性を背後に持つ。既定 `blob`) |
|
|
388
390
|
| `trigger` | `boolean` | `true` を設定すると接続を開始 |
|
|
@@ -417,6 +419,7 @@ static wcBindable = {
|
|
|
417
419
|
{ name: "connected", event: "wcs-ws:connected-changed" },
|
|
418
420
|
{ name: "loading", event: "wcs-ws:loading-changed" },
|
|
419
421
|
{ name: "error", event: "wcs-ws:error" },
|
|
422
|
+
{ name: "errorInfo", event: "wcs-ws:error-info-changed" },
|
|
420
423
|
{ name: "readyState", event: "wcs-ws:readystate-changed" },
|
|
421
424
|
],
|
|
422
425
|
commands: [
|
|
@@ -666,6 +669,7 @@ bootstrapWebSocket({
|
|
|
666
669
|
- JSON メッセージは受信時に自動パース、オブジェクトは送信時に自動文字列化
|
|
667
670
|
- `manual` は接続タイミングを明示的に制御したい場合に有用
|
|
668
671
|
- 自動再接続は異常切断時のみ発動(コード 1000 以外)
|
|
672
|
+
- **`errorInfo` タクソノミ**: `error` に現れるのと同じ失敗を、シリアライズ可能な `WcsIoErrorInfo`(安定した `code` / `phase` / `recoverable`)に分類する**追加的な**バインド可能出力(`wcs-ws:error-info-changed`)です。`error` の形状は変えません。`url` を指定しない `connect()` は `invalid-argument`(phase `start`、回復不可)、open 前の `send()` は `invalid-state`(phase `execute`、回復不可——先に connect が必要)、`new WebSocket()` の構築例外またはプラットフォームの `error` Event は `connection-error`(phase `execute`、**`recoverable: true`**——接続エラーは通常一過性で、再接続で回復しうる)です。`errorInfo` は `error` と同じタイミングで遷移し(`error` と共にクリアされる)ます。共有の `WcsIoErrorInfo` 型と `WCS_WEBSOCKET_ERROR_CODE` 定数は export 済みです。
|
|
669
673
|
|
|
670
674
|
## ライセンス
|
|
671
675
|
|
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@ It is an **I/O node** that connects WebSocket communication to reactive state.
|
|
|
8
8
|
With `@wcstack/state`, `<wcs-ws>` can be bound directly through path contracts:
|
|
9
9
|
|
|
10
10
|
- **input / command surface**: `url`, `trigger`, `send`
|
|
11
|
-
- **output state surface**: `message`, `connected`, `loading`, `error`, `readyState`
|
|
11
|
+
- **output state surface**: `message`, `connected`, `loading`, `error`, `errorInfo`, `readyState`
|
|
12
12
|
|
|
13
13
|
This means real-time communication can be expressed declaratively in HTML, without writing `new WebSocket()`, `onmessage`, or connection glue code in your UI layer.
|
|
14
14
|
|
|
@@ -190,6 +190,7 @@ These properties represent the current connection state and are the main observa
|
|
|
190
190
|
| `connected` | `boolean` | `true` while WebSocket is open |
|
|
191
191
|
| `loading` | `boolean` | `true` while connecting |
|
|
192
192
|
| `error` | `WcsWsError \| Event \| null` | Connection or close error |
|
|
193
|
+
| `errorInfo` | `WcsIoErrorInfo \| null` | Serializable failure taxonomy (stable `code` / `phase` / `recoverable`), derived from `error`. Additive — the `error` shape is unchanged. |
|
|
193
194
|
| `readyState` | `number` | WebSocket readyState constant |
|
|
194
195
|
|
|
195
196
|
### Input / command surface
|
|
@@ -386,6 +387,7 @@ In wcstack applications, **state-driven triggering via `trigger`** is usually th
|
|
|
386
387
|
| `connected` | `boolean` | `true` while WebSocket is open |
|
|
387
388
|
| `loading` | `boolean` | `true` while connecting |
|
|
388
389
|
| `error` | `WcsWsError \| Event \| null` | Error info |
|
|
390
|
+
| `errorInfo` | `WcsIoErrorInfo \| null` | Failure taxonomy (`code` / `phase` / `recoverable`), derived from `error` |
|
|
389
391
|
| `readyState` | `number` | WebSocket readyState constant |
|
|
390
392
|
| `binaryType` | `"blob" \| "arraybuffer"` | Binary frame representation (backs the `binary-type` attribute; default `blob`) |
|
|
391
393
|
| `trigger` | `boolean` | Set to `true` to open connection |
|
|
@@ -420,6 +422,7 @@ static wcBindable = {
|
|
|
420
422
|
{ name: "connected", event: "wcs-ws:connected-changed" },
|
|
421
423
|
{ name: "loading", event: "wcs-ws:loading-changed" },
|
|
422
424
|
{ name: "error", event: "wcs-ws:error" },
|
|
425
|
+
{ name: "errorInfo", event: "wcs-ws:error-info-changed" },
|
|
423
426
|
{ name: "readyState", event: "wcs-ws:readystate-changed" },
|
|
424
427
|
],
|
|
425
428
|
commands: [
|
|
@@ -669,6 +672,7 @@ bootstrapWebSocket({
|
|
|
669
672
|
- JSON messages are automatically parsed on receive; objects are auto-stringified on send
|
|
670
673
|
- `manual` is useful when connection timing should be controlled explicitly
|
|
671
674
|
- Auto-reconnect only fires on abnormal close (code other than 1000)
|
|
675
|
+
- **`errorInfo` taxonomy**: an **additive** bindable output (`wcs-ws:error-info-changed`) that classifies the same failure surfaced on `error` into a serializable `WcsIoErrorInfo` with a stable `code` / `phase` / `recoverable`, without changing the `error` shape. A `connect()` with no `url` is `invalid-argument` (phase `start`, not recoverable); a `send()` before the socket is open is `invalid-state` (phase `execute`, not recoverable — connect first); a `new WebSocket()` construction exception or the platform `error` Event is `connection-error` (phase `execute`, **`recoverable: true`** — connection errors are usually transient and a reconnect can recover). `errorInfo` transitions exactly when `error` does (cleared to `null` alongside it). The shared `WcsIoErrorInfo` type and the `WCS_WEBSOCKET_ERROR_CODE` constants are exported.
|
|
672
676
|
|
|
673
677
|
## License
|
|
674
678
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
/** operation error の phase(taxonomy)。 */
|
|
2
|
+
type WcsIoErrorPhase = "probe" | "start" | "execute" | "decode" | "commit" | "dispose";
|
|
3
|
+
/** serializable な error info(non-cloneable な cause とは分離。DevTools / remote へは info のみ)。 */
|
|
4
|
+
interface WcsIoErrorInfo {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
readonly phase: WcsIoErrorPhase;
|
|
7
|
+
readonly recoverable: boolean;
|
|
8
|
+
readonly capabilityId?: string;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
1
12
|
interface IWcBindableProperty {
|
|
2
13
|
readonly name: string;
|
|
3
14
|
readonly event: string;
|
|
@@ -13,7 +24,8 @@ interface IWcBindableCommand {
|
|
|
13
24
|
}
|
|
14
25
|
interface IWcBindable {
|
|
15
26
|
readonly protocol: "wc-bindable";
|
|
16
|
-
|
|
27
|
+
/** Integer protocol version. All versions >= 1 are core-compatible. */
|
|
28
|
+
readonly version: number;
|
|
17
29
|
readonly properties: readonly IWcBindableProperty[];
|
|
18
30
|
readonly inputs?: readonly IWcBindableInput[];
|
|
19
31
|
readonly commands?: readonly IWcBindableCommand[];
|
|
@@ -52,6 +64,8 @@ interface WcsWsCoreValues<T = unknown> {
|
|
|
52
64
|
connected: boolean;
|
|
53
65
|
loading: boolean;
|
|
54
66
|
error: WcsWsError | Event | null;
|
|
67
|
+
/** Additive failure taxonomy derived from `error` (stable code / phase / recoverable). */
|
|
68
|
+
errorInfo: WcsIoErrorInfo | null;
|
|
55
69
|
readyState: number;
|
|
56
70
|
}
|
|
57
71
|
/**
|
|
@@ -108,6 +122,7 @@ declare class WebSocketCore extends EventTarget {
|
|
|
108
122
|
private _connected;
|
|
109
123
|
private _loading;
|
|
110
124
|
private _error;
|
|
125
|
+
private _errorInfo;
|
|
111
126
|
private _readyState;
|
|
112
127
|
private _autoReconnect;
|
|
113
128
|
private _reconnectInterval;
|
|
@@ -129,11 +144,19 @@ declare class WebSocketCore extends EventTarget {
|
|
|
129
144
|
get connected(): boolean;
|
|
130
145
|
get loading(): boolean;
|
|
131
146
|
get error(): any;
|
|
147
|
+
/**
|
|
148
|
+
* The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /
|
|
149
|
+
* `recoverable`), or null. Additive wc-bindable property (event
|
|
150
|
+
* `wcs-ws:error-info-changed`), derived from `error`; the existing `error`
|
|
151
|
+
* property/event are unchanged.
|
|
152
|
+
*/
|
|
153
|
+
get errorInfo(): WcsIoErrorInfo | null;
|
|
132
154
|
get readyState(): number;
|
|
133
155
|
private _setMessage;
|
|
134
156
|
private _setConnected;
|
|
135
157
|
private _setLoading;
|
|
136
158
|
private _setError;
|
|
159
|
+
private _commitErrorInfo;
|
|
137
160
|
private _setReadyState;
|
|
138
161
|
connect(url: string, options?: WebSocketConnectOptions): void;
|
|
139
162
|
send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
|
|
@@ -180,6 +203,7 @@ declare class WcsWebSocket extends HTMLElement {
|
|
|
180
203
|
get connected(): boolean;
|
|
181
204
|
get loading(): boolean;
|
|
182
205
|
get error(): any;
|
|
206
|
+
get errorInfo(): WcsIoErrorInfo | null;
|
|
183
207
|
get readyState(): number;
|
|
184
208
|
get trigger(): boolean;
|
|
185
209
|
set trigger(value: boolean);
|
|
@@ -193,5 +217,38 @@ declare class WcsWebSocket extends HTMLElement {
|
|
|
193
217
|
disconnectedCallback(): void;
|
|
194
218
|
}
|
|
195
219
|
|
|
196
|
-
|
|
197
|
-
|
|
220
|
+
/**
|
|
221
|
+
* websocketCapabilities.ts
|
|
222
|
+
*
|
|
223
|
+
* WebSocket node 固有の error code(taxonomy)と derivation。汎用の error info 型は
|
|
224
|
+
* `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から
|
|
225
|
+
* import する。WebSocket は持続的な session / monitor node(1 本の接続を張り続ける)で、
|
|
226
|
+
* 競合する operation を持たないため lane は持たず、error taxonomy(errorInfo)のみを採用する。
|
|
227
|
+
*
|
|
228
|
+
* この node の `_setError` は 4 形態の非 null 入力を受ける(いずれも公開 `error` shape は不変):
|
|
229
|
+
* 1. synthetic な `{ message: "url is required." }`(`.name` 無し)— connect() の引数不備。
|
|
230
|
+
* 2. synthetic な `{ message: "WebSocket is not connected." }`(`.name` 無し)— open 前の send()。
|
|
231
|
+
* 3. caught された生の構築例外 `e`(`new WebSocket()` の同期 throw)。
|
|
232
|
+
* 4. platform の WebSocket `error` Event(`Event`。`.name`/`.message` を持たない)。
|
|
233
|
+
*
|
|
234
|
+
* これらは shape がバラバラで、message からの分類は脆い。そこで呼び出し側が明示的な
|
|
235
|
+
* taxonomy code を discriminator として渡す(storage の `deriveStorageErrorInfo(error, name)`
|
|
236
|
+
* と同じ技法)。derive 側は synthetic / Event / Error を reverse-engineer せず、渡された
|
|
237
|
+
* code で phase / recoverable を決め、message だけを防御的に抽出する。
|
|
238
|
+
*/
|
|
239
|
+
|
|
240
|
+
/** 安定した websocket error code(taxonomy)。値は公開キーとして固定。 */
|
|
241
|
+
declare const WCS_WEBSOCKET_ERROR_CODE: {
|
|
242
|
+
/** connect() の `url` 未指定 — 開始前の入力不備。retry では回復しない。 */
|
|
243
|
+
readonly InvalidArgument: "invalid-argument";
|
|
244
|
+
/** open 前の send() — 接続が OPEN でない状態での送信。retry では回復しない(先に connect が要る)。 */
|
|
245
|
+
readonly InvalidState: "invalid-state";
|
|
246
|
+
/**
|
|
247
|
+
* 接続の確立 / 維持に失敗(`new WebSocket()` の同期例外、または platform の error Event)。
|
|
248
|
+
* WebSocket のエラーは通常一過性で、再接続で回復しうる(recoverable=true)。
|
|
249
|
+
*/
|
|
250
|
+
readonly ConnectionError: "connection-error";
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
export { WCS_WEBSOCKET_ERROR_CODE, WcsWebSocket, WebSocketCore, bootstrapWebSocket, getConfig };
|
|
254
|
+
export type { IWritableConfig, IWritableTagNames, WcsIoErrorInfo, WcsIoErrorPhase, WcsWsCommands, WcsWsCoreCommands, WcsWsCoreValues, WcsWsError, WcsWsInputs, WcsWsValues, WebSocketConnectOptions };
|
package/dist/index.esm.js
CHANGED
|
@@ -44,6 +44,64 @@ function setConfig(partialConfig) {
|
|
|
44
44
|
frozenConfig = null;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
/**
|
|
48
|
+
* websocketCapabilities.ts
|
|
49
|
+
*
|
|
50
|
+
* WebSocket node 固有の error code(taxonomy)と derivation。汎用の error info 型は
|
|
51
|
+
* `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から
|
|
52
|
+
* import する。WebSocket は持続的な session / monitor node(1 本の接続を張り続ける)で、
|
|
53
|
+
* 競合する operation を持たないため lane は持たず、error taxonomy(errorInfo)のみを採用する。
|
|
54
|
+
*
|
|
55
|
+
* この node の `_setError` は 4 形態の非 null 入力を受ける(いずれも公開 `error` shape は不変):
|
|
56
|
+
* 1. synthetic な `{ message: "url is required." }`(`.name` 無し)— connect() の引数不備。
|
|
57
|
+
* 2. synthetic な `{ message: "WebSocket is not connected." }`(`.name` 無し)— open 前の send()。
|
|
58
|
+
* 3. caught された生の構築例外 `e`(`new WebSocket()` の同期 throw)。
|
|
59
|
+
* 4. platform の WebSocket `error` Event(`Event`。`.name`/`.message` を持たない)。
|
|
60
|
+
*
|
|
61
|
+
* これらは shape がバラバラで、message からの分類は脆い。そこで呼び出し側が明示的な
|
|
62
|
+
* taxonomy code を discriminator として渡す(storage の `deriveStorageErrorInfo(error, name)`
|
|
63
|
+
* と同じ技法)。derive 側は synthetic / Event / Error を reverse-engineer せず、渡された
|
|
64
|
+
* code で phase / recoverable を決め、message だけを防御的に抽出する。
|
|
65
|
+
*/
|
|
66
|
+
/** 安定した websocket error code(taxonomy)。値は公開キーとして固定。 */
|
|
67
|
+
const WCS_WEBSOCKET_ERROR_CODE = {
|
|
68
|
+
/** connect() の `url` 未指定 — 開始前の入力不備。retry では回復しない。 */
|
|
69
|
+
InvalidArgument: "invalid-argument",
|
|
70
|
+
/** open 前の send() — 接続が OPEN でない状態での送信。retry では回復しない(先に connect が要る)。 */
|
|
71
|
+
InvalidState: "invalid-state",
|
|
72
|
+
/**
|
|
73
|
+
* 接続の確立 / 維持に失敗(`new WebSocket()` の同期例外、または platform の error Event)。
|
|
74
|
+
* WebSocket のエラーは通常一過性で、再接続で回復しうる(recoverable=true)。
|
|
75
|
+
*/
|
|
76
|
+
ConnectionError: "connection-error",
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* websocket の失敗を serializable な error taxonomy に写す。`code` は呼び出し側が渡す
|
|
80
|
+
* discriminator(公開 `error` shape からは復元しない)。`message` は入力から防御的に抽出し、
|
|
81
|
+
* message を持たない error Event 等では安定した fallback を使う。
|
|
82
|
+
*
|
|
83
|
+
* - `invalid-argument`(url 未指定)は開始前の入力不備 → phase="start" / recoverable=false。
|
|
84
|
+
* - `invalid-state`(open 前 send)は接続状態が満たされない実行時失敗 → phase="execute" /
|
|
85
|
+
* recoverable=false(先に connect() が必要)。
|
|
86
|
+
* - `connection-error`(構築例外 / error Event)は接続の確立 / 維持失敗 → phase="execute" /
|
|
87
|
+
* recoverable=true(再接続で回復しうる)。
|
|
88
|
+
*/
|
|
89
|
+
function deriveWebSocketErrorInfo(error, code) {
|
|
90
|
+
// error は非 null(_setError は error===null を derive 前に分岐する)だが、synthetic /
|
|
91
|
+
// Event / caught 例外 / 生 throw と shape がバラバラなので message は防御的に抽出する。
|
|
92
|
+
// error Event は message を持たないため安定した fallback に落とす。
|
|
93
|
+
const raw = error.message;
|
|
94
|
+
const message = typeof raw === "string" ? raw : "WebSocket connection error";
|
|
95
|
+
if (code === WCS_WEBSOCKET_ERROR_CODE.InvalidArgument) {
|
|
96
|
+
return { code: WCS_WEBSOCKET_ERROR_CODE.InvalidArgument, phase: "start", recoverable: false, message };
|
|
97
|
+
}
|
|
98
|
+
if (code === WCS_WEBSOCKET_ERROR_CODE.InvalidState) {
|
|
99
|
+
return { code: WCS_WEBSOCKET_ERROR_CODE.InvalidState, phase: "execute", recoverable: false, message };
|
|
100
|
+
}
|
|
101
|
+
// connection-error(構築例外 / error Event): 接続の確立/維持失敗、再接続で回復しうる。
|
|
102
|
+
return { code: WCS_WEBSOCKET_ERROR_CODE.ConnectionError, phase: "execute", recoverable: true, message };
|
|
103
|
+
}
|
|
104
|
+
|
|
47
105
|
// WebSocket readyState values. Hardcoded rather than read from the global
|
|
48
106
|
// WebSocket so the Core does not require WebSocket to exist at module load
|
|
49
107
|
// (referencing `WebSocket.CLOSED` in a field initializer evaluates at class
|
|
@@ -60,6 +118,12 @@ class WebSocketCore extends EventTarget {
|
|
|
60
118
|
{ name: "connected", event: "wcs-ws:connected-changed" },
|
|
61
119
|
{ name: "loading", event: "wcs-ws:loading-changed" },
|
|
62
120
|
{ name: "error", event: "wcs-ws:error" },
|
|
121
|
+
// Serializable failure taxonomy (stable code / phase / recoverable), or null.
|
|
122
|
+
// Additive bindable output derived from `error` (invalid-argument / invalid-state
|
|
123
|
+
// / connection-error); the existing `error` property/event are unchanged. Fires
|
|
124
|
+
// wcs-ws:error-info-changed. No lane — WebSocket is a persistent session/monitor
|
|
125
|
+
// node, not a competing operation.
|
|
126
|
+
{ name: "errorInfo", event: "wcs-ws:error-info-changed" },
|
|
63
127
|
{ name: "readyState", event: "wcs-ws:readystate-changed" },
|
|
64
128
|
],
|
|
65
129
|
commands: [
|
|
@@ -74,6 +138,7 @@ class WebSocketCore extends EventTarget {
|
|
|
74
138
|
_connected = false;
|
|
75
139
|
_loading = false;
|
|
76
140
|
_error = null;
|
|
141
|
+
_errorInfo = null;
|
|
77
142
|
_readyState = WS_CLOSED;
|
|
78
143
|
// 自動再接続
|
|
79
144
|
_autoReconnect = false;
|
|
@@ -128,6 +193,15 @@ class WebSocketCore extends EventTarget {
|
|
|
128
193
|
get error() {
|
|
129
194
|
return this._error;
|
|
130
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /
|
|
198
|
+
* `recoverable`), or null. Additive wc-bindable property (event
|
|
199
|
+
* `wcs-ws:error-info-changed`), derived from `error`; the existing `error`
|
|
200
|
+
* property/event are unchanged.
|
|
201
|
+
*/
|
|
202
|
+
get errorInfo() {
|
|
203
|
+
return this._errorInfo;
|
|
204
|
+
}
|
|
131
205
|
get readyState() {
|
|
132
206
|
return this._readyState;
|
|
133
207
|
}
|
|
@@ -153,7 +227,12 @@ class WebSocketCore extends EventTarget {
|
|
|
153
227
|
bubbles: true,
|
|
154
228
|
}));
|
|
155
229
|
}
|
|
156
|
-
|
|
230
|
+
// `code` is an explicit taxonomy discriminator (WCS_WEBSOCKET_ERROR_CODE), passed
|
|
231
|
+
// only from the non-null failure call sites. It stays out of the public `error`
|
|
232
|
+
// shape and is used solely to classify errorInfo without reverse-engineering the
|
|
233
|
+
// heterogeneous `error` values (synthetic {message} / caught Error / raw Event).
|
|
234
|
+
// The clear path passes null and no code.
|
|
235
|
+
_setError(error, code) {
|
|
157
236
|
// Same-value guard (async-io-node-guidelines.md §3.3). `error` is state-ish,
|
|
158
237
|
// so suppressing redundant null→null dispatches (every connect/send start
|
|
159
238
|
// clears a usually-already-null error) avoids a spurious wcs-ws:error per
|
|
@@ -163,11 +242,27 @@ class WebSocketCore extends EventTarget {
|
|
|
163
242
|
if (this._error === error)
|
|
164
243
|
return;
|
|
165
244
|
this._error = error;
|
|
245
|
+
// Keep the additive `errorInfo` taxonomy in sync with `error`: derive from the
|
|
246
|
+
// explicit `code` (or null on clear). Fires before the `error` event so an
|
|
247
|
+
// observer binding both sees the classification first, mirroring the io-node
|
|
248
|
+
// family. Every non-null error carries a code (the clear path is the only
|
|
249
|
+
// caller without one, and it is short-circuited here), so `code!` holds.
|
|
250
|
+
this._commitErrorInfo(error === null ? null : deriveWebSocketErrorInfo(error, code));
|
|
166
251
|
this._target.dispatchEvent(new CustomEvent("wcs-ws:error", {
|
|
167
252
|
detail: error,
|
|
168
253
|
bubbles: true,
|
|
169
254
|
}));
|
|
170
255
|
}
|
|
256
|
+
// Called only from _setError (which already same-value-guards on the error
|
|
257
|
+
// reference), so errorInfo transitions exactly when error does — no separate
|
|
258
|
+
// guard needed here.
|
|
259
|
+
_commitErrorInfo(info) {
|
|
260
|
+
this._errorInfo = info;
|
|
261
|
+
this._target.dispatchEvent(new CustomEvent("wcs-ws:error-info-changed", {
|
|
262
|
+
detail: info,
|
|
263
|
+
bubbles: true,
|
|
264
|
+
}));
|
|
265
|
+
}
|
|
171
266
|
_setReadyState(readyState) {
|
|
172
267
|
this._readyState = readyState;
|
|
173
268
|
this._target.dispatchEvent(new CustomEvent("wcs-ws:readystate-changed", {
|
|
@@ -181,7 +276,7 @@ class WebSocketCore extends EventTarget {
|
|
|
181
276
|
// 流し、サニタイズ値(なにもしない)を返す。command-token 経路(set trigger →
|
|
182
277
|
// connect())からの呼び出しが state 更新サイクルを壊さないようにする。
|
|
183
278
|
if (!url) {
|
|
184
|
-
this._setError({ message: "url is required." });
|
|
279
|
+
this._setError({ message: "url is required." }, WCS_WEBSOCKET_ERROR_CODE.InvalidArgument);
|
|
185
280
|
return;
|
|
186
281
|
}
|
|
187
282
|
// 新しい接続を開始するため世代を更新し、進行中のソケット/再接続を無効化する。
|
|
@@ -203,7 +298,7 @@ class WebSocketCore extends EventTarget {
|
|
|
203
298
|
// never-throw (§3.6): 未接続での送信は例外ではなく error に流す。set send の
|
|
204
299
|
// fire-and-forget 経路で例外が伝播するのを防ぐ。
|
|
205
300
|
if (!this._ws || this._ws.readyState !== WS_OPEN) {
|
|
206
|
-
this._setError({ message: "WebSocket is not connected." });
|
|
301
|
+
this._setError({ message: "WebSocket is not connected." }, WCS_WEBSOCKET_ERROR_CODE.InvalidState);
|
|
207
302
|
return;
|
|
208
303
|
}
|
|
209
304
|
this._ws.send(data);
|
|
@@ -230,7 +325,7 @@ class WebSocketCore extends EventTarget {
|
|
|
230
325
|
}
|
|
231
326
|
catch (e) {
|
|
232
327
|
this._setLoading(false);
|
|
233
|
-
this._setError(e);
|
|
328
|
+
this._setError(e, WCS_WEBSOCKET_ERROR_CODE.ConnectionError);
|
|
234
329
|
return;
|
|
235
330
|
}
|
|
236
331
|
// Binary frames default to Blob; opt into ArrayBuffer for direct byte access.
|
|
@@ -267,7 +362,7 @@ class WebSocketCore extends EventTarget {
|
|
|
267
362
|
_onError = (event) => {
|
|
268
363
|
if (this._socketGen !== this._gen)
|
|
269
364
|
return;
|
|
270
|
-
this._setError(event);
|
|
365
|
+
this._setError(event, WCS_WEBSOCKET_ERROR_CODE.ConnectionError);
|
|
271
366
|
};
|
|
272
367
|
_onClose = (event) => {
|
|
273
368
|
this._removeListeners();
|
|
@@ -528,6 +623,9 @@ class WcsWebSocket extends HTMLElement {
|
|
|
528
623
|
get error() {
|
|
529
624
|
return this._core.error;
|
|
530
625
|
}
|
|
626
|
+
get errorInfo() {
|
|
627
|
+
return this._core.errorInfo;
|
|
628
|
+
}
|
|
531
629
|
get readyState() {
|
|
532
630
|
return this._core.readyState;
|
|
533
631
|
}
|
|
@@ -619,5 +717,5 @@ function bootstrapWebSocket(userConfig) {
|
|
|
619
717
|
registerComponents();
|
|
620
718
|
}
|
|
621
719
|
|
|
622
|
-
export { WcsWebSocket, WebSocketCore, bootstrapWebSocket, getConfig };
|
|
720
|
+
export { WCS_WEBSOCKET_ERROR_CODE, WcsWebSocket, WebSocketCore, bootstrapWebSocket, getConfig };
|
|
623
721
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/core/WebSocketCore.ts","../src/autoTrigger.ts","../src/components/WebSocket.ts","../src/registerComponents.ts","../src/bootstrapWebSocket.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n ws: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-wstarget\",\n tagNames: {\n ws: \"wcs-ws\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","import { IWcBindable } from \"../types.js\";\n\n// WebSocket readyState values. Hardcoded rather than read from the global\n// WebSocket so the Core does not require WebSocket to exist at module load\n// (referencing `WebSocket.CLOSED` in a field initializer evaluates at class\n// definition time; tests inject a mock). Mirrors SseCore's SSE_CLOSED.\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\nconst WS_CLOSED = 3;\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\n // How incoming binary frames are surfaced on `message`. \"blob\" (the platform\n // default) or \"arraybuffer\" for direct byte processing. Applied to every\n // socket this connection spawns, including auto-reconnects.\n binaryType?: BinaryType;\n}\n\nexport class WebSocketCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-ws:message\" },\n { name: \"connected\", event: \"wcs-ws:connected-changed\" },\n { name: \"loading\", event: \"wcs-ws:loading-changed\" },\n { name: \"error\", event: \"wcs-ws:error\" },\n { name: \"readyState\", event: \"wcs-ws:readystate-changed\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"send\" },\n { name: \"close\" },\n ],\n };\n\n private _target: EventTarget;\n private _ws: WebSocket | null = null;\n private _message: any = null;\n private _connected: boolean = false;\n private _loading: boolean = false;\n private _error: any = null;\n private _readyState: number = WS_CLOSED;\n\n // 自動再接続\n private _autoReconnect: boolean = false;\n private _reconnectInterval: number = 3000;\n private _maxReconnects: number = Infinity;\n private _reconnectCount: number = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _url: string = \"\";\n private _protocols: string | string[] | undefined = undefined;\n private _binaryType: BinaryType = \"blob\";\n private _intentionalClose: boolean = false;\n\n // Generation guard (§3.4): bumped on dispose() and at every connect(). A socket\n // event (open/message/error/close) or a scheduled reconnect that fires after\n // dispose / a superseding connect() carries a stale `gen` and MUST NOT write\n // state onto a torn-down element. A boolean flag is insufficient (dispose→observe\n // would let stale work slip through).\n private _gen = 0;\n // Generation captured when the current socket was opened. The shared socket\n // event handlers compare it against _gen to drop events from a superseded /\n // disposed connection.\n private _socketGen = 0;\n // SSR (§3.8): WebSocket is command-driven with no asynchronous probe to await,\n // so readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). WebSocket connections are command-driven (connect()), so\n // observe() is an idempotent no-op that resolves once ready; the Shell's\n // connectedCallback does not auto-establish a subscription here. dispose()\n // invalidates any in-flight socket / pending reconnect and closes the socket.\n observe(): Promise<void> {\n return this._ready;\n }\n\n dispose(): void {\n this._gen++;\n this.close();\n }\n\n get message(): any {\n return this._message;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get readyState(): number {\n return this._readyState;\n }\n\n // --- State setters with event dispatch ---\n\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n private _setConnected(connected: boolean): void {\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:connected-changed\", {\n detail: connected,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n // Same-value guard (async-io-node-guidelines.md §3.3). `error` is state-ish,\n // so suppressing redundant null→null dispatches (every connect/send start\n // clears a usually-already-null error) avoids a spurious wcs-ws:error per\n // successful operation. Reference identity is sufficient: each failure builds\n // a fresh object (or the platform's own error Event), and the clear path\n // always passes null.\n if (this._error === error) return;\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setReadyState(readyState: number): void {\n this._readyState = readyState;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:readystate-changed\", {\n detail: readyState,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n connect(url: string, options: WebSocketConnectOptions = {}): void {\n // never-throw (§3.6): 引数バリデーション失敗は例外ではなく error プロパティに\n // 流し、サニタイズ値(なにもしない)を返す。command-token 経路(set trigger →\n // connect())からの呼び出しが state 更新サイクルを壊さないようにする。\n if (!url) {\n this._setError({ message: \"url is required.\" });\n return;\n }\n\n // 新しい接続を開始するため世代を更新し、進行中のソケット/再接続を無効化する。\n this._gen++;\n\n // 既存の接続をクローズ\n this._intentionalClose = true;\n this._closeInternal();\n\n this._url = url;\n this._protocols = options.protocols;\n this._autoReconnect = options.autoReconnect ?? false;\n this._reconnectInterval = options.reconnectInterval ?? 3000;\n this._maxReconnects = options.maxReconnects ?? Infinity;\n this._binaryType = options.binaryType ?? \"blob\";\n this._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n // never-throw (§3.6): 未接続での送信は例外ではなく error に流す。set send の\n // fire-and-forget 経路で例外が伝播するのを防ぐ。\n if (!this._ws || this._ws.readyState !== WS_OPEN) {\n this._setError({ message: \"WebSocket is not connected.\" });\n return;\n }\n this._ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._intentionalClose = true;\n this._clearReconnectTimer();\n if (this._ws) {\n this._ws.close(code, reason);\n }\n }\n\n // --- Internal ---\n\n private _doConnect(): void {\n this._setLoading(true);\n this._setError(null);\n\n // 接続開始時点の世代を捕捉。dispose()/再 connect() 後に発火した古いソケット\n // イベントはこの gen が stale になり、状態を書き換えない(_onOpen ほかが\n // _socketGen と this._gen を突き合わせて判定する)。\n this._socketGen = this._gen;\n\n try {\n this._ws = this._protocols\n ? new WebSocket(this._url, this._protocols)\n : new WebSocket(this._url);\n } catch (e) {\n this._setLoading(false);\n this._setError(e);\n return;\n }\n\n // Binary frames default to Blob; opt into ArrayBuffer for direct byte access.\n this._ws.binaryType = this._binaryType;\n\n this._setReadyState(WS_CONNECTING);\n\n this._ws.addEventListener(\"open\", this._onOpen);\n this._ws.addEventListener(\"message\", this._onMessage);\n this._ws.addEventListener(\"error\", this._onError);\n this._ws.addEventListener(\"close\", this._onClose);\n }\n\n private _onOpen = (): void => {\n if (this._socketGen !== this._gen) return;\n this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WS_OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\n if (this._socketGen !== this._gen) return;\n let data = event.data;\n // JSONの自動パース\n if (typeof data === \"string\") {\n try {\n data = JSON.parse(data);\n } catch {\n // テキストのまま\n }\n }\n this._setMessage(data);\n };\n\n private _onError = (event: Event): void => {\n if (this._socketGen !== this._gen) return;\n this._setError(event);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n if (this._socketGen !== this._gen) return;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WS_CLOSED);\n\n // 異常クローズ時の自動再接続(正常終了 1000 は除外)\n if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {\n this._scheduleReconnect();\n }\n };\n\n private _scheduleReconnect(): void {\n const gen = this._gen;\n this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n // dispose()/再 connect() でこの再接続が無効化されていたら何もしない。\n if (gen !== this._gen) return;\n this._reconnectCount++;\n this._doConnect();\n }, this._reconnectInterval);\n }\n\n private _clearReconnectTimer(): void {\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n private _removeListeners(): void {\n if (!this._ws) {\n return;\n }\n\n this._ws.removeEventListener(\"open\", this._onOpen);\n this._ws.removeEventListener(\"message\", this._onMessage);\n this._ws.removeEventListener(\"error\", this._onError);\n this._ws.removeEventListener(\"close\", this._onClose);\n }\n\n private _closeInternal(): void {\n this._clearReconnectTimer();\n if (this._ws) {\n this._removeListeners();\n if (this._ws.readyState === WS_OPEN || this._ws.readyState === WS_CONNECTING) {\n this._ws.close();\n }\n this._ws = null;\n }\n // 旧接続の状態をリセット(コンストラクタ例外時に stale 状態が残るのを防止)\n if (this._connected) {\n this._setConnected(false);\n }\n if (this._readyState !== WS_CLOSED) {\n this._setReadyState(WS_CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWebSocket } from \"./components/WebSocket.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\n if (!wsId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWebSocket as a value. The value import created a components/WebSocket.ts ⇄\n // autoTrigger.ts cycle (WcsWebSocket.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-ws> class\n // matches — without the import cycle.\n const WsCtor = customElements.get(config.tagNames.ws);\n const wsElement = document.getElementById(wsId);\n if (!WsCtor || !(wsElement instanceof WsCtor)) return;\n\n event.preventDefault();\n (wsElement as WcsWebSocket).connect();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class WcsWebSocket extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WebSocketCore.wcBindable,\n properties: [\n ...WebSocketCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-ws:trigger-changed\" },\n { name: \"send\", event: \"wcs-ws:send-changed\" },\n ],\n inputs: [\n { name: \"url\", attribute: \"url\" },\n { name: \"protocols\", attribute: \"protocols\" },\n { name: \"autoReconnect\", attribute: \"auto-reconnect\" },\n { name: \"reconnectInterval\", attribute: \"reconnect-interval\" },\n { name: \"maxReconnects\", attribute: \"max-reconnects\" },\n { name: \"binaryType\", attribute: \"binary-type\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n { name: \"send\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"sendMessage\" },\n { name: \"close\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: WebSocketCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new WebSocketCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-ws:connected-changed\": (d) => ({ connected: d === true }),\n \"wcs-ws:loading-changed\": (d) => ({ loading: d === true }),\n \"wcs-ws:error\": (d) => ({ error: d != null }),\n });\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (async-io-node-guidelines.md §3.6): attachInternals is absent\n // in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works,\n // it just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get protocols(): string {\n return this.getAttribute(\"protocols\") || \"\";\n }\n\n set protocols(value: string) {\n this.setAttribute(\"protocols\", value);\n }\n\n get autoReconnect(): boolean {\n return this.hasAttribute(\"auto-reconnect\");\n }\n\n set autoReconnect(value: boolean) {\n if (value) {\n this.setAttribute(\"auto-reconnect\", \"\");\n } else {\n this.removeAttribute(\"auto-reconnect\");\n }\n }\n\n get reconnectInterval(): number {\n const attr = this.getAttribute(\"reconnect-interval\");\n const parsed = attr ? parseInt(attr, 10) : 3000;\n return Number.isNaN(parsed) ? 3000 : parsed;\n }\n\n set reconnectInterval(value: number) {\n this.setAttribute(\"reconnect-interval\", String(value));\n }\n\n get maxReconnects(): number {\n const attr = this.getAttribute(\"max-reconnects\");\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxReconnects(value: number) {\n this.setAttribute(\"max-reconnects\", String(value));\n }\n\n // Incoming binary frame representation. Backed by the `binary-type` attribute;\n // any value other than \"arraybuffer\" normalizes to the platform default \"blob\".\n get binaryType(): BinaryType {\n return this.getAttribute(\"binary-type\") === \"arraybuffer\" ? \"arraybuffer\" : \"blob\";\n }\n\n set binaryType(value: string | null) {\n if (value == null) {\n this.removeAttribute(\"binary-type\");\n } else {\n this.setAttribute(\"binary-type\", value);\n }\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get connected(): boolean {\n return this._core.connected;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get readyState(): number {\n return this._core.readyState;\n }\n\n // --- Command properties ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.connect();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-ws:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n // `send` is a write-only command surface: assigning transmits immediately.\n // Reading always returns null (no payload is retained) — consistent with the\n // null carried by wcs-ws:send-changed and the documented \"resets to null\".\n get send(): any {\n return null;\n }\n\n set send(data: any) {\n if (data === null || data === undefined) return;\n const payload = typeof data === \"string\" ? data : JSON.stringify(data);\n this._core.send(payload);\n this.dispatchEvent(new CustomEvent(\"wcs-ws:send-changed\", {\n detail: null,\n bubbles: true,\n }));\n }\n\n // --- Public methods ---\n\n connect(): void {\n const protocols = this.protocols\n ? this.protocols.split(\",\").map(p => p.trim()).filter(Boolean)\n : undefined;\n\n this._core.connect(this.url, {\n protocols: protocols && protocols.length === 1 ? protocols[0] : protocols,\n autoReconnect: this.autoReconnect,\n reconnectInterval: this.reconnectInterval,\n maxReconnects: this.maxReconnects,\n binaryType: this.binaryType,\n });\n }\n\n sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n this._core.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._core.close(code, reason);\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.connect();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // observe() は command-driven node では ready を返す no-op(§3.5)。SSR は\n // connectedCallbackPromise を await して初期スナップショットを取れる。\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n // dispose() が _gen を bump して進行中のソケット/再接続を無効化し、close() する。\n this._core.dispose();\n }\n}\n","import { WcsWebSocket } from \"./components/WebSocket.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.ws)) {\n customElements.define(config.tagNames.ws, WcsWebSocket);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWebSocket(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n"],"names":[],"mappings":"AAUA,MAAM,OAAO,GAAoB;AAC/B,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,gBAAgB,EAAE,eAAe;AACjC,IAAA,QAAQ,EAAE;AACR,QAAA,EAAE,EAAE,QAAQ;AACb,KAAA;CACF;AAED,SAAS,UAAU,CAAI,GAAM,EAAA;AAC3B,IAAA,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,QAAA,OAAO,GAAG;AACvD,IAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AAClC,QAAA,UAAU,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC;IACnD;AACA,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,SAAS,CAAI,GAAM,EAAA;AAC1B,IAAA,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,QAAA,OAAO,GAAG;IACvD,MAAM,KAAK,GAA4B,EAAE;IACzC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAClC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC;IAC/D;AACA,IAAA,OAAO,KAAU;AACnB;AAEA,IAAI,YAAY,GAAmB,IAAI;AAEhC,MAAM,MAAM,GAAY,OAAkB;SAEjC,SAAS,GAAA;IACvB,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C;AACA,IAAA,OAAO,YAAY;AACrB;AAEM,SAAU,SAAS,CAAC,aAA8B,EAAA;AACtD,IAAA,IAAI,OAAO,aAAa,CAAC,WAAW,KAAK,SAAS,EAAE;AAClD,QAAA,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW;IACjD;AACA,IAAA,IAAI,OAAO,aAAa,CAAC,gBAAgB,KAAK,QAAQ,EAAE;AACtD,QAAA,OAAO,CAAC,gBAAgB,GAAG,aAAa,CAAC,gBAAgB;IAC3D;AACA,IAAA,IAAI,aAAa,CAAC,QAAQ,EAAE;QAC1B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC;IACzD;IACA,YAAY,GAAG,IAAI;AACrB;;ACxDA;AACA;AACA;AACA;AACA,MAAM,aAAa,GAAG,CAAC;AACvB,MAAM,OAAO,GAAG,CAAC;AACjB,MAAM,SAAS,GAAG,CAAC;AAab,MAAO,aAAc,SAAQ,WAAW,CAAA;IAC5C,OAAO,UAAU,GAAgB;AAC/B,QAAA,QAAQ,EAAE,aAAa;AACvB,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,UAAU,EAAE;AACV,YAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE;AAC5C,YAAA,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,0BAA0B,EAAE;AACxD,YAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,wBAAwB,EAAE;AACpD,YAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE;AACxC,YAAA,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,2BAA2B,EAAE;AAC3D,SAAA;AACD,QAAA,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,SAAS,EAAE;YACnB,EAAE,IAAI,EAAE,MAAM,EAAE;YAChB,EAAE,IAAI,EAAE,OAAO,EAAE;AAClB,SAAA;KACF;AAEO,IAAA,OAAO;IACP,GAAG,GAAqB,IAAI;IAC5B,QAAQ,GAAQ,IAAI;IACpB,UAAU,GAAY,KAAK;IAC3B,QAAQ,GAAY,KAAK;IACzB,MAAM,GAAQ,IAAI;IAClB,WAAW,GAAW,SAAS;;IAG/B,cAAc,GAAY,KAAK;IAC/B,kBAAkB,GAAW,IAAI;IACjC,cAAc,GAAW,QAAQ;IACjC,eAAe,GAAW,CAAC;IAC3B,eAAe,GAAyC,IAAI;IAC5D,IAAI,GAAW,EAAE;IACjB,UAAU,GAAkC,SAAS;IACrD,WAAW,GAAe,MAAM;IAChC,iBAAiB,GAAY,KAAK;;;;;;IAOlC,IAAI,GAAG,CAAC;;;;IAIR,UAAU,GAAG,CAAC;;;AAGd,IAAA,MAAM,GAAkB,OAAO,CAAC,OAAO,EAAE;AAEjD,IAAA,WAAA,CAAY,MAAoB,EAAA;AAC9B,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,IAAI;IAC/B;AAEA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;;;;;IAMA,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,MAAM;IACpB;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,EAAE;QACX,IAAI,CAAC,KAAK,EAAE;IACd;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU;IACxB;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;IACtB;AAEA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,WAAW;IACzB;;AAIQ,IAAA,WAAW,CAAC,OAAY,EAAA;AAC9B,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;QACvB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gBAAgB,EAAE;AAC3D,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;IACL;AAEQ,IAAA,aAAa,CAAC,SAAkB,EAAA;AACtC,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,0BAA0B,EAAE;AACrE,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;IACL;AAEQ,IAAA,WAAW,CAAC,OAAgB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;QACvB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,wBAAwB,EAAE;AACnE,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;IACL;AAEQ,IAAA,SAAS,CAAC,KAAU,EAAA;;;;;;;AAO1B,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;YAAE;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;QACnB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,cAAc,EAAE;AACzD,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;IACL;AAEQ,IAAA,cAAc,CAAC,UAAkB,EAAA;AACvC,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU;QAC7B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,2BAA2B,EAAE;AACtE,YAAA,MAAM,EAAE,UAAU;AAClB,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;IACL;;AAIA,IAAA,OAAO,CAAC,GAAW,EAAE,OAAA,GAAmC,EAAE,EAAA;;;;QAIxD,IAAI,CAAC,GAAG,EAAE;YACR,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;YAC/C;QACF;;QAGA,IAAI,CAAC,IAAI,EAAE;;AAGX,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC7B,IAAI,CAAC,cAAc,EAAE;AAErB,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG;AACf,QAAA,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS;QACnC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,IAAI,KAAK;QACpD,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,IAAI,IAAI;QAC3D,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,IAAI,QAAQ;QACvD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM;AAC/C,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC;AACxB,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAE9B,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA,IAAA,IAAI,CAAC,IAAuD,EAAA;;;AAG1D,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,OAAO,EAAE;YAChD,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC;YAC1D;QACF;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IACrB;IAEA,KAAK,CAAC,IAAa,EAAE,MAAe,EAAA;AAClC,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC7B,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;QAC9B;IACF;;IAIQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;;;;AAKpB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI;AAE3B,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;kBACZ,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU;kBACxC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACjB;QACF;;QAGA,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW;AAEtC,QAAA,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;QAElC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC;IACnD;IAEQ,OAAO,GAAG,MAAW;AAC3B,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI;YAAE;AACnC,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC9B,IAAA,CAAC;AAEO,IAAA,UAAU,GAAG,CAAC,KAAmB,KAAU;AACjD,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI;YAAE;AACnC,QAAA,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI;;AAErB,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,IAAI;AACF,gBAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACzB;AAAE,YAAA,MAAM;;YAER;QACF;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACxB,IAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,CAAC,KAAY,KAAU;AACxC,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI;YAAE;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACvB,IAAA,CAAC;AAEO,IAAA,QAAQ,GAAG,CAAC,KAAiB,KAAU;QAC7C,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI;AACf,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI;YAAE;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;;QAG9B,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE;YACvH,IAAI,CAAC,kBAAkB,EAAE;QAC3B;AACF,IAAA,CAAC;IAEO,kBAAkB,GAAA;AACxB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI;QACrB,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,MAAK;AACrC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AAE3B,YAAA,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI;gBAAE;YACvB,IAAI,CAAC,eAAe,EAAE;YACtB,IAAI,CAAC,UAAU,EAAE;AACnB,QAAA,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC;IAC7B;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;AACjC,YAAA,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC;AAClC,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B;IACF;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb;QACF;QAEA,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC;IACtD;IAEQ,cAAc,GAAA;QACpB,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,KAAK,aAAa,EAAE;AAC5E,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;YAClB;AACA,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI;QACjB;;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAC3B;AACA,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE;AAClC,YAAA,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;QAChC;IACF;;;ACvUF,IAAI,UAAU,GAAG,KAAK;AAEtB,SAAS,WAAW,CAAC,KAAY,EAAA;AAC/B,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;AAC3B,IAAA,IAAI,EAAE,MAAM,YAAY,OAAO,CAAC;QAAE;AAElC,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAU,CAAA,CAAA,EAAI,MAAM,CAAC,gBAAgB,CAAA,CAAA,CAAG,CAAC;AAC9E,IAAA,IAAI,CAAC,cAAc;QAAE;IAErB,MAAM,IAAI,GAAG,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC;AACjE,IAAA,IAAI,CAAC,IAAI;QAAE;;;;;;;AAQX,IAAA,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC;IAC/C,IAAI,CAAC,MAAM,IAAI,EAAE,SAAS,YAAY,MAAM,CAAC;QAAE;IAE/C,KAAK,CAAC,cAAc,EAAE;IACrB,SAA0B,CAAC,OAAO,EAAE;AACvC;SAEgB,mBAAmB,GAAA;AACjC,IAAA,IAAI,UAAU;QAAE;IAChB,UAAU,GAAG,IAAI;AACjB,IAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;AACjD;;AC5BM,MAAO,YAAa,SAAQ,WAAW,CAAA;AAC3C,IAAA,OAAO,2BAA2B,GAAG,IAAI;IACzC,OAAO,UAAU,GAAgB;QAC/B,GAAG,aAAa,CAAC,UAAU;AAC3B,QAAA,UAAU,EAAE;AACV,YAAA,GAAG,aAAa,CAAC,UAAU,CAAC,UAAU;AACtC,YAAA,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,wBAAwB,EAAE;AACpD,YAAA,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAC/C,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;AACjC,YAAA,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE;AAC7C,YAAA,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE;AACtD,YAAA,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,oBAAoB,EAAE;AAC9D,YAAA,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE;AACtD,YAAA,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE;AAChD,YAAA,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE;YACvC,EAAE,IAAI,EAAE,SAAS,EAAE;YACnB,EAAE,IAAI,EAAE,MAAM,EAAE;AACjB,SAAA;AACD,QAAA,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,SAAS,EAAE;YACnB,EAAE,IAAI,EAAE,aAAa,EAAE;YACvB,EAAE,IAAI,EAAE,OAAO,EAAE;AAClB,SAAA;KACF;IACD,WAAW,kBAAkB,GAAA,EAAe,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAEpD,IAAA,KAAK;IACL,QAAQ,GAAY,KAAK;AACzB,IAAA,yBAAyB,GAAkB,OAAO,CAAC,OAAO,EAAE;IAC5D,UAAU,GAA4B,IAAI;AAElD,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,IAAI,CAAC,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC;AACpC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE;QACvC,IAAI,CAAC,WAAW,CAAC;AACf,YAAA,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;AAC9D,YAAA,wBAAwB,EAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;AAC5D,YAAA,cAAc,EAAc,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAC1D,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI,wBAAwB,GAAA;QAC1B,OAAO,IAAI,CAAC,yBAAyB;IACvC;;;;;AAMA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE;IAC3D;IAEQ,cAAc,GAAA;;;;;;AAMpB,QAAA,IAAI;AACF,YAAA,IAAI,OAAO,IAAI,CAAC,eAAe,KAAK,UAAU;AAAE,gBAAA,OAAO,IAAI;AAC3D,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE;AACxC,YAAA,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;AACjC,YAAA,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;AACpC,YAAA,OAAO,SAAS;QAClB;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;AAEQ,IAAA,WAAW,CAAC,GAA6D,EAAA;AAC/E,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AACrC,QAAA,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACnD,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAI;gBACjC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;AAC/C,gBAAA,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAE,CAAiB,CAAC,MAAM,CAAC,CAAC,EAAE;AAC5E,oBAAA,IAAI;wBACF,IAAI,EAAE,EAAE;AAAE,4BAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;wBAAE;6BAAO;AAAE,4BAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;wBAAE;oBAC5D;AAAE,oBAAA,MAAM,oBAAoB;AAC5B,oBAAA,IAAI,KAAK;wBAAE,IAAI,CAAC,eAAe,CAAC,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,EAAE,EAAE,CAAC;gBAC/D;AACF,YAAA,CAAC,CAAC;QACJ;IACF;;AAIA,IAAA,IAAI,GAAG,GAAA;QACL,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;IACvC;IAEA,IAAI,GAAG,CAAC,KAAa,EAAA;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC;IACjC;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE;IAC7C;IAEA,IAAI,SAAS,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC;IACvC;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC;IAC5C;IAEA,IAAI,aAAa,CAAC,KAAc,EAAA;QAC9B,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,EAAE,CAAC;QACzC;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC;QACxC;IACF;AAEA,IAAA,IAAI,iBAAiB,GAAA;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC;AACpD,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI;AAC/C,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM;IAC7C;IAEA,IAAI,iBAAiB,CAAC,KAAa,EAAA;QACjC,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC;AAChD,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ;AACnD,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ,GAAG,MAAM;IACjD;IAEA,IAAI,aAAa,CAAC,KAAa,EAAA;QAC7B,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD;;;AAIA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,aAAa,GAAG,aAAa,GAAG,MAAM;IACpF;IAEA,IAAI,UAAU,CAAC,KAAoB,EAAA;AACjC,QAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,YAAA,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC;QACrC;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC;QACzC;IACF;AAEA,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;IACpC;IAEA,IAAI,MAAM,CAAC,KAAc,EAAA;QACvB,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;QACjC;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;QAChC;IACF;;AAIA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;IAC3B;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS;IAC7B;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;IAC3B;AAEA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK;IACzB;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU;IAC9B;;AAIA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ;IACtB;IAEA,IAAI,OAAO,CAAC,KAAc,EAAA;AACxB,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK;QACjB,IAAI,CAAC,EAAE;AACL,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;YACpB,IAAI,CAAC,OAAO,EAAE;AACd,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,wBAAwB,EAAE;AAC3D,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,OAAO,EAAE,IAAI;AACd,aAAA,CAAC,CAAC;QACL;IACF;;;;AAKA,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,OAAO,IAAI;IACb;IAEA,IAAI,IAAI,CAAC,IAAS,EAAA;AAChB,QAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;YAAE;AACzC,QAAA,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACtE,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,qBAAqB,EAAE;AACxD,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC,CAAC;IACL;;IAIA,OAAO,GAAA;AACL,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC;cACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;cAC3D,SAAS;QAEb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;AAC3B,YAAA,SAAS,EAAE,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;YACzE,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU;AAC5B,SAAA,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,IAAuD,EAAA;AACjE,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IACvB;IAEA,KAAK,CAAC,IAAa,EAAE,MAAe,EAAA;QAClC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;IAChC;;AAIA,IAAA,wBAAwB,CAAC,IAAY,EAAE,SAAwB,EAAE,QAAuB,EAAA;AACtF,QAAA,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE;YAClE,IAAI,CAAC,OAAO,EAAE;QAChB;IACF;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AAC3B,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACtB,YAAA,mBAAmB,EAAE;QACvB;;;QAGA,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QACrD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,OAAO,EAAE;QAChB;IACF;IAEA,oBAAoB,GAAA;;AAElB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;IACtB;;;SCjRc,kBAAkB,GAAA;AAChC,IAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAC3C,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC;IACzD;AACF;;ACHM,SAAU,kBAAkB,CAAC,UAA4B,EAAA;IAC7D,IAAI,UAAU,EAAE;QACd,SAAS,CAAC,UAAU,CAAC;IACvB;AACA,IAAA,kBAAkB,EAAE;AACtB;;;;"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/core/websocketCapabilities.ts","../src/core/WebSocketCore.ts","../src/autoTrigger.ts","../src/components/WebSocket.ts","../src/registerComponents.ts","../src/bootstrapWebSocket.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n ws: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-wstarget\",\n tagNames: {\n ws: \"wcs-ws\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","/**\n * websocketCapabilities.ts\n *\n * WebSocket node 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から\n * import する。WebSocket は持続的な session / monitor node(1 本の接続を張り続ける)で、\n * 競合する operation を持たないため lane は持たず、error taxonomy(errorInfo)のみを採用する。\n *\n * この node の `_setError` は 4 形態の非 null 入力を受ける(いずれも公開 `error` shape は不変):\n * 1. synthetic な `{ message: \"url is required.\" }`(`.name` 無し)— connect() の引数不備。\n * 2. synthetic な `{ message: \"WebSocket is not connected.\" }`(`.name` 無し)— open 前の send()。\n * 3. caught された生の構築例外 `e`(`new WebSocket()` の同期 throw)。\n * 4. platform の WebSocket `error` Event(`Event`。`.name`/`.message` を持たない)。\n *\n * これらは shape がバラバラで、message からの分類は脆い。そこで呼び出し側が明示的な\n * taxonomy code を discriminator として渡す(storage の `deriveStorageErrorInfo(error, name)`\n * と同じ技法)。derive 側は synthetic / Event / Error を reverse-engineer せず、渡された\n * code で phase / recoverable を決め、message だけを防御的に抽出する。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\n\n/** 安定した websocket error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_WEBSOCKET_ERROR_CODE = {\n /** connect() の `url` 未指定 — 開始前の入力不備。retry では回復しない。 */\n InvalidArgument: \"invalid-argument\",\n /** open 前の send() — 接続が OPEN でない状態での送信。retry では回復しない(先に connect が要る)。 */\n InvalidState: \"invalid-state\",\n /**\n * 接続の確立 / 維持に失敗(`new WebSocket()` の同期例外、または platform の error Event)。\n * WebSocket のエラーは通常一過性で、再接続で回復しうる(recoverable=true)。\n */\n ConnectionError: \"connection-error\",\n} as const;\n\n/**\n * websocket の失敗を serializable な error taxonomy に写す。`code` は呼び出し側が渡す\n * discriminator(公開 `error` shape からは復元しない)。`message` は入力から防御的に抽出し、\n * message を持たない error Event 等では安定した fallback を使う。\n *\n * - `invalid-argument`(url 未指定)は開始前の入力不備 → phase=\"start\" / recoverable=false。\n * - `invalid-state`(open 前 send)は接続状態が満たされない実行時失敗 → phase=\"execute\" /\n * recoverable=false(先に connect() が必要)。\n * - `connection-error`(構築例外 / error Event)は接続の確立 / 維持失敗 → phase=\"execute\" /\n * recoverable=true(再接続で回復しうる)。\n */\nexport function deriveWebSocketErrorInfo(error: unknown, code: string): WcsIoErrorInfo {\n // error は非 null(_setError は error===null を derive 前に分岐する)だが、synthetic /\n // Event / caught 例外 / 生 throw と shape がバラバラなので message は防御的に抽出する。\n // error Event は message を持たないため安定した fallback に落とす。\n const raw = (error as { message?: unknown }).message;\n const message = typeof raw === \"string\" ? raw : \"WebSocket connection error\";\n\n if (code === WCS_WEBSOCKET_ERROR_CODE.InvalidArgument) {\n return { code: WCS_WEBSOCKET_ERROR_CODE.InvalidArgument, phase: \"start\", recoverable: false, message };\n }\n if (code === WCS_WEBSOCKET_ERROR_CODE.InvalidState) {\n return { code: WCS_WEBSOCKET_ERROR_CODE.InvalidState, phase: \"execute\", recoverable: false, message };\n }\n // connection-error(構築例外 / error Event): 接続の確立/維持失敗、再接続で回復しうる。\n return { code: WCS_WEBSOCKET_ERROR_CODE.ConnectionError, phase: \"execute\", recoverable: true, message };\n}\n","import { IWcBindable } from \"../types.js\";\nimport { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveWebSocketErrorInfo, WCS_WEBSOCKET_ERROR_CODE } from \"./websocketCapabilities.js\";\n\n// WebSocket readyState values. Hardcoded rather than read from the global\n// WebSocket so the Core does not require WebSocket to exist at module load\n// (referencing `WebSocket.CLOSED` in a field initializer evaluates at class\n// definition time; tests inject a mock). Mirrors SseCore's SSE_CLOSED.\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\nconst WS_CLOSED = 3;\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\n // How incoming binary frames are surfaced on `message`. \"blob\" (the platform\n // default) or \"arraybuffer\" for direct byte processing. Applied to every\n // socket this connection spawns, including auto-reconnects.\n binaryType?: BinaryType;\n}\n\nexport class WebSocketCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-ws:message\" },\n { name: \"connected\", event: \"wcs-ws:connected-changed\" },\n { name: \"loading\", event: \"wcs-ws:loading-changed\" },\n { name: \"error\", event: \"wcs-ws:error\" },\n // Serializable failure taxonomy (stable code / phase / recoverable), or null.\n // Additive bindable output derived from `error` (invalid-argument / invalid-state\n // / connection-error); the existing `error` property/event are unchanged. Fires\n // wcs-ws:error-info-changed. No lane — WebSocket is a persistent session/monitor\n // node, not a competing operation.\n { name: \"errorInfo\", event: \"wcs-ws:error-info-changed\" },\n { name: \"readyState\", event: \"wcs-ws:readystate-changed\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"send\" },\n { name: \"close\" },\n ],\n };\n\n private _target: EventTarget;\n private _ws: WebSocket | null = null;\n private _message: any = null;\n private _connected: boolean = false;\n private _loading: boolean = false;\n private _error: any = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n private _readyState: number = WS_CLOSED;\n\n // 自動再接続\n private _autoReconnect: boolean = false;\n private _reconnectInterval: number = 3000;\n private _maxReconnects: number = Infinity;\n private _reconnectCount: number = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _url: string = \"\";\n private _protocols: string | string[] | undefined = undefined;\n private _binaryType: BinaryType = \"blob\";\n private _intentionalClose: boolean = false;\n\n // Generation guard (§3.4): bumped on dispose() and at every connect(). A socket\n // event (open/message/error/close) or a scheduled reconnect that fires after\n // dispose / a superseding connect() carries a stale `gen` and MUST NOT write\n // state onto a torn-down element. A boolean flag is insufficient (dispose→observe\n // would let stale work slip through).\n private _gen = 0;\n // Generation captured when the current socket was opened. The shared socket\n // event handlers compare it against _gen to drop events from a superseded /\n // disposed connection.\n private _socketGen = 0;\n // SSR (§3.8): WebSocket is command-driven with no asynchronous probe to await,\n // so readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). WebSocket connections are command-driven (connect()), so\n // observe() is an idempotent no-op that resolves once ready; the Shell's\n // connectedCallback does not auto-establish a subscription here. dispose()\n // invalidates any in-flight socket / pending reconnect and closes the socket.\n observe(): Promise<void> {\n return this._ready;\n }\n\n dispose(): void {\n this._gen++;\n this.close();\n }\n\n get message(): any {\n return this._message;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n /**\n * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /\n * `recoverable`), or null. Additive wc-bindable property (event\n * `wcs-ws:error-info-changed`), derived from `error`; the existing `error`\n * property/event are unchanged.\n */\n get errorInfo(): WcsIoErrorInfo | null {\n return this._errorInfo;\n }\n\n get readyState(): number {\n return this._readyState;\n }\n\n // --- State setters with event dispatch ---\n\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n private _setConnected(connected: boolean): void {\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:connected-changed\", {\n detail: connected,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n // `code` is an explicit taxonomy discriminator (WCS_WEBSOCKET_ERROR_CODE), passed\n // only from the non-null failure call sites. It stays out of the public `error`\n // shape and is used solely to classify errorInfo without reverse-engineering the\n // heterogeneous `error` values (synthetic {message} / caught Error / raw Event).\n // The clear path passes null and no code.\n private _setError(error: any, code?: string): void {\n // Same-value guard (async-io-node-guidelines.md §3.3). `error` is state-ish,\n // so suppressing redundant null→null dispatches (every connect/send start\n // clears a usually-already-null error) avoids a spurious wcs-ws:error per\n // successful operation. Reference identity is sufficient: each failure builds\n // a fresh object (or the platform's own error Event), and the clear path\n // always passes null.\n if (this._error === error) return;\n this._error = error;\n // Keep the additive `errorInfo` taxonomy in sync with `error`: derive from the\n // explicit `code` (or null on clear). Fires before the `error` event so an\n // observer binding both sees the classification first, mirroring the io-node\n // family. Every non-null error carries a code (the clear path is the only\n // caller without one, and it is short-circuited here), so `code!` holds.\n this._commitErrorInfo(error === null ? null : deriveWebSocketErrorInfo(error, code!));\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n // Called only from _setError (which already same-value-guards on the error\n // reference), so errorInfo transitions exactly when error does — no separate\n // guard needed here.\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error-info-changed\", {\n detail: info,\n bubbles: true,\n }));\n }\n\n private _setReadyState(readyState: number): void {\n this._readyState = readyState;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:readystate-changed\", {\n detail: readyState,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n connect(url: string, options: WebSocketConnectOptions = {}): void {\n // never-throw (§3.6): 引数バリデーション失敗は例外ではなく error プロパティに\n // 流し、サニタイズ値(なにもしない)を返す。command-token 経路(set trigger →\n // connect())からの呼び出しが state 更新サイクルを壊さないようにする。\n if (!url) {\n this._setError({ message: \"url is required.\" }, WCS_WEBSOCKET_ERROR_CODE.InvalidArgument);\n return;\n }\n\n // 新しい接続を開始するため世代を更新し、進行中のソケット/再接続を無効化する。\n this._gen++;\n\n // 既存の接続をクローズ\n this._intentionalClose = true;\n this._closeInternal();\n\n this._url = url;\n this._protocols = options.protocols;\n this._autoReconnect = options.autoReconnect ?? false;\n this._reconnectInterval = options.reconnectInterval ?? 3000;\n this._maxReconnects = options.maxReconnects ?? Infinity;\n this._binaryType = options.binaryType ?? \"blob\";\n this._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n // never-throw (§3.6): 未接続での送信は例外ではなく error に流す。set send の\n // fire-and-forget 経路で例外が伝播するのを防ぐ。\n if (!this._ws || this._ws.readyState !== WS_OPEN) {\n this._setError({ message: \"WebSocket is not connected.\" }, WCS_WEBSOCKET_ERROR_CODE.InvalidState);\n return;\n }\n this._ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._intentionalClose = true;\n this._clearReconnectTimer();\n if (this._ws) {\n this._ws.close(code, reason);\n }\n }\n\n // --- Internal ---\n\n private _doConnect(): void {\n this._setLoading(true);\n this._setError(null);\n\n // 接続開始時点の世代を捕捉。dispose()/再 connect() 後に発火した古いソケット\n // イベントはこの gen が stale になり、状態を書き換えない(_onOpen ほかが\n // _socketGen と this._gen を突き合わせて判定する)。\n this._socketGen = this._gen;\n\n try {\n this._ws = this._protocols\n ? new WebSocket(this._url, this._protocols)\n : new WebSocket(this._url);\n } catch (e) {\n this._setLoading(false);\n this._setError(e, WCS_WEBSOCKET_ERROR_CODE.ConnectionError);\n return;\n }\n\n // Binary frames default to Blob; opt into ArrayBuffer for direct byte access.\n this._ws.binaryType = this._binaryType;\n\n this._setReadyState(WS_CONNECTING);\n\n this._ws.addEventListener(\"open\", this._onOpen);\n this._ws.addEventListener(\"message\", this._onMessage);\n this._ws.addEventListener(\"error\", this._onError);\n this._ws.addEventListener(\"close\", this._onClose);\n }\n\n private _onOpen = (): void => {\n if (this._socketGen !== this._gen) return;\n this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WS_OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\n if (this._socketGen !== this._gen) return;\n let data = event.data;\n // JSONの自動パース\n if (typeof data === \"string\") {\n try {\n data = JSON.parse(data);\n } catch {\n // テキストのまま\n }\n }\n this._setMessage(data);\n };\n\n private _onError = (event: Event): void => {\n if (this._socketGen !== this._gen) return;\n this._setError(event, WCS_WEBSOCKET_ERROR_CODE.ConnectionError);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n if (this._socketGen !== this._gen) return;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WS_CLOSED);\n\n // 異常クローズ時の自動再接続(正常終了 1000 は除外)\n if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {\n this._scheduleReconnect();\n }\n };\n\n private _scheduleReconnect(): void {\n const gen = this._gen;\n this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n // dispose()/再 connect() でこの再接続が無効化されていたら何もしない。\n if (gen !== this._gen) return;\n this._reconnectCount++;\n this._doConnect();\n }, this._reconnectInterval);\n }\n\n private _clearReconnectTimer(): void {\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n private _removeListeners(): void {\n if (!this._ws) {\n return;\n }\n\n this._ws.removeEventListener(\"open\", this._onOpen);\n this._ws.removeEventListener(\"message\", this._onMessage);\n this._ws.removeEventListener(\"error\", this._onError);\n this._ws.removeEventListener(\"close\", this._onClose);\n }\n\n private _closeInternal(): void {\n this._clearReconnectTimer();\n if (this._ws) {\n this._removeListeners();\n if (this._ws.readyState === WS_OPEN || this._ws.readyState === WS_CONNECTING) {\n this._ws.close();\n }\n this._ws = null;\n }\n // 旧接続の状態をリセット(コンストラクタ例外時に stale 状態が残るのを防止)\n if (this._connected) {\n this._setConnected(false);\n }\n if (this._readyState !== WS_CLOSED) {\n this._setReadyState(WS_CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWebSocket } from \"./components/WebSocket.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\n if (!wsId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWebSocket as a value. The value import created a components/WebSocket.ts ⇄\n // autoTrigger.ts cycle (WcsWebSocket.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-ws> class\n // matches — without the import cycle.\n const WsCtor = customElements.get(config.tagNames.ws);\n const wsElement = document.getElementById(wsId);\n if (!WsCtor || !(wsElement instanceof WsCtor)) return;\n\n event.preventDefault();\n (wsElement as WcsWebSocket).connect();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\nimport { WcsIoErrorInfo } from \"../core/platformCapability.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class WcsWebSocket extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WebSocketCore.wcBindable,\n properties: [\n ...WebSocketCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-ws:trigger-changed\" },\n { name: \"send\", event: \"wcs-ws:send-changed\" },\n ],\n inputs: [\n { name: \"url\", attribute: \"url\" },\n { name: \"protocols\", attribute: \"protocols\" },\n { name: \"autoReconnect\", attribute: \"auto-reconnect\" },\n { name: \"reconnectInterval\", attribute: \"reconnect-interval\" },\n { name: \"maxReconnects\", attribute: \"max-reconnects\" },\n { name: \"binaryType\", attribute: \"binary-type\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n { name: \"send\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"sendMessage\" },\n { name: \"close\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: WebSocketCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new WebSocketCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-ws:connected-changed\": (d) => ({ connected: d === true }),\n \"wcs-ws:loading-changed\": (d) => ({ loading: d === true }),\n \"wcs-ws:error\": (d) => ({ error: d != null }),\n });\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (async-io-node-guidelines.md §3.6): attachInternals is absent\n // in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works,\n // it just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get protocols(): string {\n return this.getAttribute(\"protocols\") || \"\";\n }\n\n set protocols(value: string) {\n this.setAttribute(\"protocols\", value);\n }\n\n get autoReconnect(): boolean {\n return this.hasAttribute(\"auto-reconnect\");\n }\n\n set autoReconnect(value: boolean) {\n if (value) {\n this.setAttribute(\"auto-reconnect\", \"\");\n } else {\n this.removeAttribute(\"auto-reconnect\");\n }\n }\n\n get reconnectInterval(): number {\n const attr = this.getAttribute(\"reconnect-interval\");\n const parsed = attr ? parseInt(attr, 10) : 3000;\n return Number.isNaN(parsed) ? 3000 : parsed;\n }\n\n set reconnectInterval(value: number) {\n this.setAttribute(\"reconnect-interval\", String(value));\n }\n\n get maxReconnects(): number {\n const attr = this.getAttribute(\"max-reconnects\");\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxReconnects(value: number) {\n this.setAttribute(\"max-reconnects\", String(value));\n }\n\n // Incoming binary frame representation. Backed by the `binary-type` attribute;\n // any value other than \"arraybuffer\" normalizes to the platform default \"blob\".\n get binaryType(): BinaryType {\n return this.getAttribute(\"binary-type\") === \"arraybuffer\" ? \"arraybuffer\" : \"blob\";\n }\n\n set binaryType(value: string | null) {\n if (value == null) {\n this.removeAttribute(\"binary-type\");\n } else {\n this.setAttribute(\"binary-type\", value);\n }\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get connected(): boolean {\n return this._core.connected;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get errorInfo(): WcsIoErrorInfo | null {\n return this._core.errorInfo;\n }\n\n get readyState(): number {\n return this._core.readyState;\n }\n\n // --- Command properties ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.connect();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-ws:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n // `send` is a write-only command surface: assigning transmits immediately.\n // Reading always returns null (no payload is retained) — consistent with the\n // null carried by wcs-ws:send-changed and the documented \"resets to null\".\n get send(): any {\n return null;\n }\n\n set send(data: any) {\n if (data === null || data === undefined) return;\n const payload = typeof data === \"string\" ? data : JSON.stringify(data);\n this._core.send(payload);\n this.dispatchEvent(new CustomEvent(\"wcs-ws:send-changed\", {\n detail: null,\n bubbles: true,\n }));\n }\n\n // --- Public methods ---\n\n connect(): void {\n const protocols = this.protocols\n ? this.protocols.split(\",\").map(p => p.trim()).filter(Boolean)\n : undefined;\n\n this._core.connect(this.url, {\n protocols: protocols && protocols.length === 1 ? protocols[0] : protocols,\n autoReconnect: this.autoReconnect,\n reconnectInterval: this.reconnectInterval,\n maxReconnects: this.maxReconnects,\n binaryType: this.binaryType,\n });\n }\n\n sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n this._core.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._core.close(code, reason);\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.connect();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // observe() は command-driven node では ready を返す no-op(§3.5)。SSR は\n // connectedCallbackPromise を await して初期スナップショットを取れる。\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n // dispose() が _gen を bump して進行中のソケット/再接続を無効化し、close() する。\n this._core.dispose();\n }\n}\n","import { WcsWebSocket } from \"./components/WebSocket.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.ws)) {\n customElements.define(config.tagNames.ws, WcsWebSocket);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWebSocket(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.esm.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e={autoTrigger:!0,triggerAttribute:"data-wstarget",tagNames:{ws:"wcs-ws"}};function t(e){if(null===e||"object"!=typeof e)return e;Object.freeze(e);for(const s of Object.keys(e))t(e[s]);return e}function s(e){if(null===e||"object"!=typeof e)return e;const t={};for(const n of Object.keys(e))t[n]=s(e[n]);return t}let n=null;const r=e;function i(){return n||(n=t(s(e))),n}class o extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"message",event:"wcs-ws:message"},{name:"connected",event:"wcs-ws:connected-changed"},{name:"loading",event:"wcs-ws:loading-changed"},{name:"error",event:"wcs-ws:error"},{name:"readyState",event:"wcs-ws:readystate-changed"}],commands:[{name:"connect"},{name:"send"},{name:"close"}]};_target;_ws=null;_message=null;_connected=!1;_loading=!1;_error=null;_readyState=3;_autoReconnect=!1;_reconnectInterval=3e3;_maxReconnects=1/0;_reconnectCount=0;_reconnectTimer=null;_url="";_protocols=void 0;_binaryType="blob";_intentionalClose=!1;_gen=0;_socketGen=0;_ready=Promise.resolve();constructor(e){super(),this._target=e??this}get ready(){return this._ready}observe(){return this._ready}dispose(){this._gen++,this.close()}get message(){return this._message}get connected(){return this._connected}get loading(){return this._loading}get error(){return this._error}get readyState(){return this._readyState}_setMessage(e){this._message=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:message",{detail:e,bubbles:!0}))}_setConnected(e){this._connected=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:connected-changed",{detail:e,bubbles:!0}))}_setLoading(e){this._loading=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:loading-changed",{detail:e,bubbles:!0}))}_setError(e){this._error!==e&&(this._error=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:error",{detail:e,bubbles:!0})))}_setReadyState(e){this._readyState=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:readystate-changed",{detail:e,bubbles:!0}))}connect(e,t={}){e?(this._gen++,this._intentionalClose=!0,this._closeInternal(),this._url=e,this._protocols=t.protocols,this._autoReconnect=t.autoReconnect??!1,this._reconnectInterval=t.reconnectInterval??3e3,this._maxReconnects=t.maxReconnects??1/0,this._binaryType=t.binaryType??"blob",this._reconnectCount=0,this._intentionalClose=!1,this._doConnect()):this._setError({message:"url is required."})}send(e){this._ws&&1===this._ws.readyState?this._ws.send(e):this._setError({message:"WebSocket is not connected."})}close(e,t){this._intentionalClose=!0,this._clearReconnectTimer(),this._ws&&this._ws.close(e,t)}_doConnect(){this._setLoading(!0),this._setError(null),this._socketGen=this._gen;try{this._ws=this._protocols?new WebSocket(this._url,this._protocols):new WebSocket(this._url)}catch(e){return this._setLoading(!1),void this._setError(e)}this._ws.binaryType=this._binaryType,this._setReadyState(0),this._ws.addEventListener("open",this._onOpen),this._ws.addEventListener("message",this._onMessage),this._ws.addEventListener("error",this._onError),this._ws.addEventListener("close",this._onClose)}_onOpen=()=>{this._socketGen===this._gen&&(this._reconnectCount=0,this._setLoading(!1),this._setConnected(!0),this._setReadyState(1))};_onMessage=e=>{if(this._socketGen!==this._gen)return;let t=e.data;if("string"==typeof t)try{t=JSON.parse(t)}catch{}this._setMessage(t)};_onError=e=>{this._socketGen===this._gen&&this._setError(e)};_onClose=e=>{this._removeListeners(),this._ws=null,this._socketGen===this._gen&&(this._setConnected(!1),this._setLoading(!1),this._setReadyState(3),!this._intentionalClose&&this._autoReconnect&&1e3!==e.code&&this._reconnectCount<this._maxReconnects&&this._scheduleReconnect())};_scheduleReconnect(){const e=this._gen;this._clearReconnectTimer(),this._reconnectTimer=setTimeout(()=>{this._reconnectTimer=null,e===this._gen&&(this._reconnectCount++,this._doConnect())},this._reconnectInterval)}_clearReconnectTimer(){null!==this._reconnectTimer&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null)}_removeListeners(){this._ws&&(this._ws.removeEventListener("open",this._onOpen),this._ws.removeEventListener("message",this._onMessage),this._ws.removeEventListener("error",this._onError),this._ws.removeEventListener("close",this._onClose))}_closeInternal(){this._clearReconnectTimer(),this._ws&&(this._removeListeners(),1!==this._ws.readyState&&0!==this._ws.readyState||this._ws.close(),this._ws=null),this._connected&&this._setConnected(!1),3!==this._readyState&&this._setReadyState(3)}}let c=!1;function a(e){const t=e.target;if(!(t instanceof Element))return;const s=t.closest(`[${r.triggerAttribute}]`);if(!s)return;const n=s.getAttribute(r.triggerAttribute);if(!n)return;const i=customElements.get(r.tagNames.ws),o=document.getElementById(n);i&&o instanceof i&&(e.preventDefault(),o.connect())}class h extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...o.wcBindable,properties:[...o.wcBindable.properties,{name:"trigger",event:"wcs-ws:trigger-changed"},{name:"send",event:"wcs-ws:send-changed"}],inputs:[{name:"url",attribute:"url"},{name:"protocols",attribute:"protocols"},{name:"autoReconnect",attribute:"auto-reconnect"},{name:"reconnectInterval",attribute:"reconnect-interval"},{name:"maxReconnects",attribute:"max-reconnects"},{name:"binaryType",attribute:"binary-type"},{name:"manual",attribute:"manual"},{name:"trigger"},{name:"send"}],commands:[{name:"connect"},{name:"sendMessage"},{name:"close"}]};static get observedAttributes(){return["url"]}_core;_trigger=!1;_connectedCallbackPromise=Promise.resolve();_internals=null;constructor(){super(),this._core=new o(this),this._internals=this._initInternals(),this._wireStates({"wcs-ws:connected-changed":e=>({connected:!0===e}),"wcs-ws:loading-changed":e=>({loading:!0===e}),"wcs-ws:error":e=>({error:null!=e})})}get connectedCallbackPromise(){return this._connectedCallbackPromise}get debugStates(){return this._internals?[...this._internals.states]:[]}_initInternals(){try{if("function"!=typeof this.attachInternals)return null;const e=this.attachInternals();return e.states.add("wcs-probe"),e.states.delete("wcs-probe"),e}catch{return null}}_wireStates(e){if(null===this._internals)return;const t=this._internals.states;for(const[s,n]of Object.entries(e))this.addEventListener(s,e=>{const s=this.hasAttribute("debug-states");for(const[r,i]of Object.entries(n(e.detail))){try{i?t.add(r):t.delete(r)}catch{}s&&this.toggleAttribute(`data-wcs-state-${r}`,i)}})}get url(){return this.getAttribute("url")||""}set url(e){this.setAttribute("url",e)}get protocols(){return this.getAttribute("protocols")||""}set protocols(e){this.setAttribute("protocols",e)}get autoReconnect(){return this.hasAttribute("auto-reconnect")}set autoReconnect(e){e?this.setAttribute("auto-reconnect",""):this.removeAttribute("auto-reconnect")}get reconnectInterval(){const e=this.getAttribute("reconnect-interval"),t=e?parseInt(e,10):3e3;return Number.isNaN(t)?3e3:t}set reconnectInterval(e){this.setAttribute("reconnect-interval",String(e))}get maxReconnects(){const e=this.getAttribute("max-reconnects"),t=e?parseInt(e,10):1/0;return Number.isNaN(t)?1/0:t}set maxReconnects(e){this.setAttribute("max-reconnects",String(e))}get binaryType(){return"arraybuffer"===this.getAttribute("binary-type")?"arraybuffer":"blob"}set binaryType(e){null==e?this.removeAttribute("binary-type"):this.setAttribute("binary-type",e)}get manual(){return this.hasAttribute("manual")}set manual(e){e?this.setAttribute("manual",""):this.removeAttribute("manual")}get message(){return this._core.message}get connected(){return this._core.connected}get loading(){return this._core.loading}get error(){return this._core.error}get readyState(){return this._core.readyState}get trigger(){return this._trigger}set trigger(e){!!e&&(this._trigger=!0,this.connect(),this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-ws:trigger-changed",{detail:!1,bubbles:!0})))}get send(){return null}set send(e){if(null==e)return;const t="string"==typeof e?e:JSON.stringify(e);this._core.send(t),this.dispatchEvent(new CustomEvent("wcs-ws:send-changed",{detail:null,bubbles:!0}))}connect(){const e=this.protocols?this.protocols.split(",").map(e=>e.trim()).filter(Boolean):void 0;this._core.connect(this.url,{protocols:e&&1===e.length?e[0]:e,autoReconnect:this.autoReconnect,reconnectInterval:this.reconnectInterval,maxReconnects:this.maxReconnects,binaryType:this.binaryType})}sendMessage(e){this._core.send(e)}close(e,t){this._core.close(e,t)}attributeChangedCallback(e,t,s){"url"===e&&this.isConnected&&!this.manual&&s&&this.connect()}connectedCallback(){this.style.display="none",r.autoTrigger&&(c||(c=!0,document.addEventListener("click",a))),this._connectedCallbackPromise=this._core.observe(),!this.manual&&this.url&&this.connect()}disconnectedCallback(){this._core.dispose()}}function l(t){var s;t&&("boolean"==typeof(s=t).autoTrigger&&(e.autoTrigger=s.autoTrigger),"string"==typeof s.triggerAttribute&&(e.triggerAttribute=s.triggerAttribute),s.tagNames&&Object.assign(e.tagNames,s.tagNames),n=null),customElements.get(r.tagNames.ws)||customElements.define(r.tagNames.ws,h)}export{h as WcsWebSocket,o as WebSocketCore,l as bootstrapWebSocket,i as getConfig};
|
|
1
|
+
const e={autoTrigger:!0,triggerAttribute:"data-wstarget",tagNames:{ws:"wcs-ws"}};function t(e){if(null===e||"object"!=typeof e)return e;Object.freeze(e);for(const n of Object.keys(e))t(e[n]);return e}function n(e){if(null===e||"object"!=typeof e)return e;const t={};for(const s of Object.keys(e))t[s]=n(e[s]);return t}let s=null;const r=e;function i(){return s||(s=t(n(e))),s}const o={InvalidArgument:"invalid-argument",InvalidState:"invalid-state",ConnectionError:"connection-error"};class c extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"message",event:"wcs-ws:message"},{name:"connected",event:"wcs-ws:connected-changed"},{name:"loading",event:"wcs-ws:loading-changed"},{name:"error",event:"wcs-ws:error"},{name:"errorInfo",event:"wcs-ws:error-info-changed"},{name:"readyState",event:"wcs-ws:readystate-changed"}],commands:[{name:"connect"},{name:"send"},{name:"close"}]};_target;_ws=null;_message=null;_connected=!1;_loading=!1;_error=null;_errorInfo=null;_readyState=3;_autoReconnect=!1;_reconnectInterval=3e3;_maxReconnects=1/0;_reconnectCount=0;_reconnectTimer=null;_url="";_protocols=void 0;_binaryType="blob";_intentionalClose=!1;_gen=0;_socketGen=0;_ready=Promise.resolve();constructor(e){super(),this._target=e??this}get ready(){return this._ready}observe(){return this._ready}dispose(){this._gen++,this.close()}get message(){return this._message}get connected(){return this._connected}get loading(){return this._loading}get error(){return this._error}get errorInfo(){return this._errorInfo}get readyState(){return this._readyState}_setMessage(e){this._message=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:message",{detail:e,bubbles:!0}))}_setConnected(e){this._connected=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:connected-changed",{detail:e,bubbles:!0}))}_setLoading(e){this._loading=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:loading-changed",{detail:e,bubbles:!0}))}_setError(e,t){this._error!==e&&(this._error=e,this._commitErrorInfo(null===e?null:function(e,t){const n=e.message,s="string"==typeof n?n:"WebSocket connection error";return t===o.InvalidArgument?{code:o.InvalidArgument,phase:"start",recoverable:!1,message:s}:t===o.InvalidState?{code:o.InvalidState,phase:"execute",recoverable:!1,message:s}:{code:o.ConnectionError,phase:"execute",recoverable:!0,message:s}}(e,t)),this._target.dispatchEvent(new CustomEvent("wcs-ws:error",{detail:e,bubbles:!0})))}_commitErrorInfo(e){this._errorInfo=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:error-info-changed",{detail:e,bubbles:!0}))}_setReadyState(e){this._readyState=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:readystate-changed",{detail:e,bubbles:!0}))}connect(e,t={}){e?(this._gen++,this._intentionalClose=!0,this._closeInternal(),this._url=e,this._protocols=t.protocols,this._autoReconnect=t.autoReconnect??!1,this._reconnectInterval=t.reconnectInterval??3e3,this._maxReconnects=t.maxReconnects??1/0,this._binaryType=t.binaryType??"blob",this._reconnectCount=0,this._intentionalClose=!1,this._doConnect()):this._setError({message:"url is required."},o.InvalidArgument)}send(e){this._ws&&1===this._ws.readyState?this._ws.send(e):this._setError({message:"WebSocket is not connected."},o.InvalidState)}close(e,t){this._intentionalClose=!0,this._clearReconnectTimer(),this._ws&&this._ws.close(e,t)}_doConnect(){this._setLoading(!0),this._setError(null),this._socketGen=this._gen;try{this._ws=this._protocols?new WebSocket(this._url,this._protocols):new WebSocket(this._url)}catch(e){return this._setLoading(!1),void this._setError(e,o.ConnectionError)}this._ws.binaryType=this._binaryType,this._setReadyState(0),this._ws.addEventListener("open",this._onOpen),this._ws.addEventListener("message",this._onMessage),this._ws.addEventListener("error",this._onError),this._ws.addEventListener("close",this._onClose)}_onOpen=()=>{this._socketGen===this._gen&&(this._reconnectCount=0,this._setLoading(!1),this._setConnected(!0),this._setReadyState(1))};_onMessage=e=>{if(this._socketGen!==this._gen)return;let t=e.data;if("string"==typeof t)try{t=JSON.parse(t)}catch{}this._setMessage(t)};_onError=e=>{this._socketGen===this._gen&&this._setError(e,o.ConnectionError)};_onClose=e=>{this._removeListeners(),this._ws=null,this._socketGen===this._gen&&(this._setConnected(!1),this._setLoading(!1),this._setReadyState(3),!this._intentionalClose&&this._autoReconnect&&1e3!==e.code&&this._reconnectCount<this._maxReconnects&&this._scheduleReconnect())};_scheduleReconnect(){const e=this._gen;this._clearReconnectTimer(),this._reconnectTimer=setTimeout(()=>{this._reconnectTimer=null,e===this._gen&&(this._reconnectCount++,this._doConnect())},this._reconnectInterval)}_clearReconnectTimer(){null!==this._reconnectTimer&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null)}_removeListeners(){this._ws&&(this._ws.removeEventListener("open",this._onOpen),this._ws.removeEventListener("message",this._onMessage),this._ws.removeEventListener("error",this._onError),this._ws.removeEventListener("close",this._onClose))}_closeInternal(){this._clearReconnectTimer(),this._ws&&(this._removeListeners(),1!==this._ws.readyState&&0!==this._ws.readyState||this._ws.close(),this._ws=null),this._connected&&this._setConnected(!1),3!==this._readyState&&this._setReadyState(3)}}let a=!1;function l(e){const t=e.target;if(!(t instanceof Element))return;const n=t.closest(`[${r.triggerAttribute}]`);if(!n)return;const s=n.getAttribute(r.triggerAttribute);if(!s)return;const i=customElements.get(r.tagNames.ws),o=document.getElementById(s);i&&o instanceof i&&(e.preventDefault(),o.connect())}class h extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...c.wcBindable,properties:[...c.wcBindable.properties,{name:"trigger",event:"wcs-ws:trigger-changed"},{name:"send",event:"wcs-ws:send-changed"}],inputs:[{name:"url",attribute:"url"},{name:"protocols",attribute:"protocols"},{name:"autoReconnect",attribute:"auto-reconnect"},{name:"reconnectInterval",attribute:"reconnect-interval"},{name:"maxReconnects",attribute:"max-reconnects"},{name:"binaryType",attribute:"binary-type"},{name:"manual",attribute:"manual"},{name:"trigger"},{name:"send"}],commands:[{name:"connect"},{name:"sendMessage"},{name:"close"}]};static get observedAttributes(){return["url"]}_core;_trigger=!1;_connectedCallbackPromise=Promise.resolve();_internals=null;constructor(){super(),this._core=new c(this),this._internals=this._initInternals(),this._wireStates({"wcs-ws:connected-changed":e=>({connected:!0===e}),"wcs-ws:loading-changed":e=>({loading:!0===e}),"wcs-ws:error":e=>({error:null!=e})})}get connectedCallbackPromise(){return this._connectedCallbackPromise}get debugStates(){return this._internals?[...this._internals.states]:[]}_initInternals(){try{if("function"!=typeof this.attachInternals)return null;const e=this.attachInternals();return e.states.add("wcs-probe"),e.states.delete("wcs-probe"),e}catch{return null}}_wireStates(e){if(null===this._internals)return;const t=this._internals.states;for(const[n,s]of Object.entries(e))this.addEventListener(n,e=>{const n=this.hasAttribute("debug-states");for(const[r,i]of Object.entries(s(e.detail))){try{i?t.add(r):t.delete(r)}catch{}n&&this.toggleAttribute(`data-wcs-state-${r}`,i)}})}get url(){return this.getAttribute("url")||""}set url(e){this.setAttribute("url",e)}get protocols(){return this.getAttribute("protocols")||""}set protocols(e){this.setAttribute("protocols",e)}get autoReconnect(){return this.hasAttribute("auto-reconnect")}set autoReconnect(e){e?this.setAttribute("auto-reconnect",""):this.removeAttribute("auto-reconnect")}get reconnectInterval(){const e=this.getAttribute("reconnect-interval"),t=e?parseInt(e,10):3e3;return Number.isNaN(t)?3e3:t}set reconnectInterval(e){this.setAttribute("reconnect-interval",String(e))}get maxReconnects(){const e=this.getAttribute("max-reconnects"),t=e?parseInt(e,10):1/0;return Number.isNaN(t)?1/0:t}set maxReconnects(e){this.setAttribute("max-reconnects",String(e))}get binaryType(){return"arraybuffer"===this.getAttribute("binary-type")?"arraybuffer":"blob"}set binaryType(e){null==e?this.removeAttribute("binary-type"):this.setAttribute("binary-type",e)}get manual(){return this.hasAttribute("manual")}set manual(e){e?this.setAttribute("manual",""):this.removeAttribute("manual")}get message(){return this._core.message}get connected(){return this._core.connected}get loading(){return this._core.loading}get error(){return this._core.error}get errorInfo(){return this._core.errorInfo}get readyState(){return this._core.readyState}get trigger(){return this._trigger}set trigger(e){!!e&&(this._trigger=!0,this.connect(),this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-ws:trigger-changed",{detail:!1,bubbles:!0})))}get send(){return null}set send(e){if(null==e)return;const t="string"==typeof e?e:JSON.stringify(e);this._core.send(t),this.dispatchEvent(new CustomEvent("wcs-ws:send-changed",{detail:null,bubbles:!0}))}connect(){const e=this.protocols?this.protocols.split(",").map(e=>e.trim()).filter(Boolean):void 0;this._core.connect(this.url,{protocols:e&&1===e.length?e[0]:e,autoReconnect:this.autoReconnect,reconnectInterval:this.reconnectInterval,maxReconnects:this.maxReconnects,binaryType:this.binaryType})}sendMessage(e){this._core.send(e)}close(e,t){this._core.close(e,t)}attributeChangedCallback(e,t,n){"url"===e&&this.isConnected&&!this.manual&&n&&this.connect()}connectedCallback(){this.style.display="none",r.autoTrigger&&(a||(a=!0,document.addEventListener("click",l))),this._connectedCallbackPromise=this._core.observe(),!this.manual&&this.url&&this.connect()}disconnectedCallback(){this._core.dispose()}}function u(t){var n;t&&("boolean"==typeof(n=t).autoTrigger&&(e.autoTrigger=n.autoTrigger),"string"==typeof n.triggerAttribute&&(e.triggerAttribute=n.triggerAttribute),n.tagNames&&Object.assign(e.tagNames,n.tagNames),s=null),customElements.get(r.tagNames.ws)||customElements.define(r.tagNames.ws,h)}export{o as WCS_WEBSOCKET_ERROR_CODE,h as WcsWebSocket,c as WebSocketCore,u as bootstrapWebSocket,i as getConfig};
|
|
2
2
|
//# sourceMappingURL=index.esm.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.min.js","sources":["../src/config.ts","../src/core/WebSocketCore.ts","../src/autoTrigger.ts","../src/components/WebSocket.ts","../src/bootstrapWebSocket.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n ws: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-wstarget\",\n tagNames: {\n ws: \"wcs-ws\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","import { IWcBindable } from \"../types.js\";\n\n// WebSocket readyState values. Hardcoded rather than read from the global\n// WebSocket so the Core does not require WebSocket to exist at module load\n// (referencing `WebSocket.CLOSED` in a field initializer evaluates at class\n// definition time; tests inject a mock). Mirrors SseCore's SSE_CLOSED.\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\nconst WS_CLOSED = 3;\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\n // How incoming binary frames are surfaced on `message`. \"blob\" (the platform\n // default) or \"arraybuffer\" for direct byte processing. Applied to every\n // socket this connection spawns, including auto-reconnects.\n binaryType?: BinaryType;\n}\n\nexport class WebSocketCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-ws:message\" },\n { name: \"connected\", event: \"wcs-ws:connected-changed\" },\n { name: \"loading\", event: \"wcs-ws:loading-changed\" },\n { name: \"error\", event: \"wcs-ws:error\" },\n { name: \"readyState\", event: \"wcs-ws:readystate-changed\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"send\" },\n { name: \"close\" },\n ],\n };\n\n private _target: EventTarget;\n private _ws: WebSocket | null = null;\n private _message: any = null;\n private _connected: boolean = false;\n private _loading: boolean = false;\n private _error: any = null;\n private _readyState: number = WS_CLOSED;\n\n // 自動再接続\n private _autoReconnect: boolean = false;\n private _reconnectInterval: number = 3000;\n private _maxReconnects: number = Infinity;\n private _reconnectCount: number = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _url: string = \"\";\n private _protocols: string | string[] | undefined = undefined;\n private _binaryType: BinaryType = \"blob\";\n private _intentionalClose: boolean = false;\n\n // Generation guard (§3.4): bumped on dispose() and at every connect(). A socket\n // event (open/message/error/close) or a scheduled reconnect that fires after\n // dispose / a superseding connect() carries a stale `gen` and MUST NOT write\n // state onto a torn-down element. A boolean flag is insufficient (dispose→observe\n // would let stale work slip through).\n private _gen = 0;\n // Generation captured when the current socket was opened. The shared socket\n // event handlers compare it against _gen to drop events from a superseded /\n // disposed connection.\n private _socketGen = 0;\n // SSR (§3.8): WebSocket is command-driven with no asynchronous probe to await,\n // so readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). WebSocket connections are command-driven (connect()), so\n // observe() is an idempotent no-op that resolves once ready; the Shell's\n // connectedCallback does not auto-establish a subscription here. dispose()\n // invalidates any in-flight socket / pending reconnect and closes the socket.\n observe(): Promise<void> {\n return this._ready;\n }\n\n dispose(): void {\n this._gen++;\n this.close();\n }\n\n get message(): any {\n return this._message;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get readyState(): number {\n return this._readyState;\n }\n\n // --- State setters with event dispatch ---\n\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n private _setConnected(connected: boolean): void {\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:connected-changed\", {\n detail: connected,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n // Same-value guard (async-io-node-guidelines.md §3.3). `error` is state-ish,\n // so suppressing redundant null→null dispatches (every connect/send start\n // clears a usually-already-null error) avoids a spurious wcs-ws:error per\n // successful operation. Reference identity is sufficient: each failure builds\n // a fresh object (or the platform's own error Event), and the clear path\n // always passes null.\n if (this._error === error) return;\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setReadyState(readyState: number): void {\n this._readyState = readyState;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:readystate-changed\", {\n detail: readyState,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n connect(url: string, options: WebSocketConnectOptions = {}): void {\n // never-throw (§3.6): 引数バリデーション失敗は例外ではなく error プロパティに\n // 流し、サニタイズ値(なにもしない)を返す。command-token 経路(set trigger →\n // connect())からの呼び出しが state 更新サイクルを壊さないようにする。\n if (!url) {\n this._setError({ message: \"url is required.\" });\n return;\n }\n\n // 新しい接続を開始するため世代を更新し、進行中のソケット/再接続を無効化する。\n this._gen++;\n\n // 既存の接続をクローズ\n this._intentionalClose = true;\n this._closeInternal();\n\n this._url = url;\n this._protocols = options.protocols;\n this._autoReconnect = options.autoReconnect ?? false;\n this._reconnectInterval = options.reconnectInterval ?? 3000;\n this._maxReconnects = options.maxReconnects ?? Infinity;\n this._binaryType = options.binaryType ?? \"blob\";\n this._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n // never-throw (§3.6): 未接続での送信は例外ではなく error に流す。set send の\n // fire-and-forget 経路で例外が伝播するのを防ぐ。\n if (!this._ws || this._ws.readyState !== WS_OPEN) {\n this._setError({ message: \"WebSocket is not connected.\" });\n return;\n }\n this._ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._intentionalClose = true;\n this._clearReconnectTimer();\n if (this._ws) {\n this._ws.close(code, reason);\n }\n }\n\n // --- Internal ---\n\n private _doConnect(): void {\n this._setLoading(true);\n this._setError(null);\n\n // 接続開始時点の世代を捕捉。dispose()/再 connect() 後に発火した古いソケット\n // イベントはこの gen が stale になり、状態を書き換えない(_onOpen ほかが\n // _socketGen と this._gen を突き合わせて判定する)。\n this._socketGen = this._gen;\n\n try {\n this._ws = this._protocols\n ? new WebSocket(this._url, this._protocols)\n : new WebSocket(this._url);\n } catch (e) {\n this._setLoading(false);\n this._setError(e);\n return;\n }\n\n // Binary frames default to Blob; opt into ArrayBuffer for direct byte access.\n this._ws.binaryType = this._binaryType;\n\n this._setReadyState(WS_CONNECTING);\n\n this._ws.addEventListener(\"open\", this._onOpen);\n this._ws.addEventListener(\"message\", this._onMessage);\n this._ws.addEventListener(\"error\", this._onError);\n this._ws.addEventListener(\"close\", this._onClose);\n }\n\n private _onOpen = (): void => {\n if (this._socketGen !== this._gen) return;\n this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WS_OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\n if (this._socketGen !== this._gen) return;\n let data = event.data;\n // JSONの自動パース\n if (typeof data === \"string\") {\n try {\n data = JSON.parse(data);\n } catch {\n // テキストのまま\n }\n }\n this._setMessage(data);\n };\n\n private _onError = (event: Event): void => {\n if (this._socketGen !== this._gen) return;\n this._setError(event);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n if (this._socketGen !== this._gen) return;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WS_CLOSED);\n\n // 異常クローズ時の自動再接続(正常終了 1000 は除外)\n if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {\n this._scheduleReconnect();\n }\n };\n\n private _scheduleReconnect(): void {\n const gen = this._gen;\n this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n // dispose()/再 connect() でこの再接続が無効化されていたら何もしない。\n if (gen !== this._gen) return;\n this._reconnectCount++;\n this._doConnect();\n }, this._reconnectInterval);\n }\n\n private _clearReconnectTimer(): void {\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n private _removeListeners(): void {\n if (!this._ws) {\n return;\n }\n\n this._ws.removeEventListener(\"open\", this._onOpen);\n this._ws.removeEventListener(\"message\", this._onMessage);\n this._ws.removeEventListener(\"error\", this._onError);\n this._ws.removeEventListener(\"close\", this._onClose);\n }\n\n private _closeInternal(): void {\n this._clearReconnectTimer();\n if (this._ws) {\n this._removeListeners();\n if (this._ws.readyState === WS_OPEN || this._ws.readyState === WS_CONNECTING) {\n this._ws.close();\n }\n this._ws = null;\n }\n // 旧接続の状態をリセット(コンストラクタ例外時に stale 状態が残るのを防止)\n if (this._connected) {\n this._setConnected(false);\n }\n if (this._readyState !== WS_CLOSED) {\n this._setReadyState(WS_CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWebSocket } from \"./components/WebSocket.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\n if (!wsId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWebSocket as a value. The value import created a components/WebSocket.ts ⇄\n // autoTrigger.ts cycle (WcsWebSocket.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-ws> class\n // matches — without the import cycle.\n const WsCtor = customElements.get(config.tagNames.ws);\n const wsElement = document.getElementById(wsId);\n if (!WsCtor || !(wsElement instanceof WsCtor)) return;\n\n event.preventDefault();\n (wsElement as WcsWebSocket).connect();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class WcsWebSocket extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WebSocketCore.wcBindable,\n properties: [\n ...WebSocketCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-ws:trigger-changed\" },\n { name: \"send\", event: \"wcs-ws:send-changed\" },\n ],\n inputs: [\n { name: \"url\", attribute: \"url\" },\n { name: \"protocols\", attribute: \"protocols\" },\n { name: \"autoReconnect\", attribute: \"auto-reconnect\" },\n { name: \"reconnectInterval\", attribute: \"reconnect-interval\" },\n { name: \"maxReconnects\", attribute: \"max-reconnects\" },\n { name: \"binaryType\", attribute: \"binary-type\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n { name: \"send\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"sendMessage\" },\n { name: \"close\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: WebSocketCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new WebSocketCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-ws:connected-changed\": (d) => ({ connected: d === true }),\n \"wcs-ws:loading-changed\": (d) => ({ loading: d === true }),\n \"wcs-ws:error\": (d) => ({ error: d != null }),\n });\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (async-io-node-guidelines.md §3.6): attachInternals is absent\n // in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works,\n // it just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get protocols(): string {\n return this.getAttribute(\"protocols\") || \"\";\n }\n\n set protocols(value: string) {\n this.setAttribute(\"protocols\", value);\n }\n\n get autoReconnect(): boolean {\n return this.hasAttribute(\"auto-reconnect\");\n }\n\n set autoReconnect(value: boolean) {\n if (value) {\n this.setAttribute(\"auto-reconnect\", \"\");\n } else {\n this.removeAttribute(\"auto-reconnect\");\n }\n }\n\n get reconnectInterval(): number {\n const attr = this.getAttribute(\"reconnect-interval\");\n const parsed = attr ? parseInt(attr, 10) : 3000;\n return Number.isNaN(parsed) ? 3000 : parsed;\n }\n\n set reconnectInterval(value: number) {\n this.setAttribute(\"reconnect-interval\", String(value));\n }\n\n get maxReconnects(): number {\n const attr = this.getAttribute(\"max-reconnects\");\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxReconnects(value: number) {\n this.setAttribute(\"max-reconnects\", String(value));\n }\n\n // Incoming binary frame representation. Backed by the `binary-type` attribute;\n // any value other than \"arraybuffer\" normalizes to the platform default \"blob\".\n get binaryType(): BinaryType {\n return this.getAttribute(\"binary-type\") === \"arraybuffer\" ? \"arraybuffer\" : \"blob\";\n }\n\n set binaryType(value: string | null) {\n if (value == null) {\n this.removeAttribute(\"binary-type\");\n } else {\n this.setAttribute(\"binary-type\", value);\n }\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get connected(): boolean {\n return this._core.connected;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get readyState(): number {\n return this._core.readyState;\n }\n\n // --- Command properties ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.connect();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-ws:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n // `send` is a write-only command surface: assigning transmits immediately.\n // Reading always returns null (no payload is retained) — consistent with the\n // null carried by wcs-ws:send-changed and the documented \"resets to null\".\n get send(): any {\n return null;\n }\n\n set send(data: any) {\n if (data === null || data === undefined) return;\n const payload = typeof data === \"string\" ? data : JSON.stringify(data);\n this._core.send(payload);\n this.dispatchEvent(new CustomEvent(\"wcs-ws:send-changed\", {\n detail: null,\n bubbles: true,\n }));\n }\n\n // --- Public methods ---\n\n connect(): void {\n const protocols = this.protocols\n ? this.protocols.split(\",\").map(p => p.trim()).filter(Boolean)\n : undefined;\n\n this._core.connect(this.url, {\n protocols: protocols && protocols.length === 1 ? protocols[0] : protocols,\n autoReconnect: this.autoReconnect,\n reconnectInterval: this.reconnectInterval,\n maxReconnects: this.maxReconnects,\n binaryType: this.binaryType,\n });\n }\n\n sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n this._core.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._core.close(code, reason);\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.connect();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // observe() は command-driven node では ready を返す no-op(§3.5)。SSR は\n // connectedCallbackPromise を await して初期スナップショットを取れる。\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n // dispose() が _gen を bump して進行中のソケット/再接続を無効化し、close() する。\n this._core.dispose();\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWebSocket(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n","import { WcsWebSocket } from \"./components/WebSocket.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.ws)) {\n customElements.define(config.tagNames.ws, WcsWebSocket);\n }\n}\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","ws","deepFreeze","obj","Object","freeze","key","keys","deepClone","clone","frozenConfig","config","getConfig","WebSocketCore","EventTarget","static","protocol","version","properties","name","event","commands","_target","_ws","_message","_connected","_loading","_error","_readyState","_autoReconnect","_reconnectInterval","_maxReconnects","Infinity","_reconnectCount","_reconnectTimer","_url","_protocols","undefined","_binaryType","_intentionalClose","_gen","_socketGen","_ready","Promise","resolve","constructor","target","super","this","ready","observe","dispose","close","message","connected","loading","error","readyState","_setMessage","dispatchEvent","CustomEvent","detail","bubbles","_setConnected","_setLoading","_setError","_setReadyState","connect","url","options","_closeInternal","protocols","autoReconnect","reconnectInterval","maxReconnects","binaryType","_doConnect","send","data","code","reason","_clearReconnectTimer","WebSocket","e","addEventListener","_onOpen","_onMessage","_onError","_onClose","JSON","parse","_removeListeners","_scheduleReconnect","gen","setTimeout","clearTimeout","removeEventListener","registered","handleClick","Element","triggerElement","closest","wsId","getAttribute","WsCtor","customElements","get","wsElement","document","getElementById","preventDefault","WcsWebSocket","HTMLElement","wcBindable","inputs","attribute","observedAttributes","_core","_trigger","_connectedCallbackPromise","_internals","_initInternals","_wireStates","d","connectedCallbackPromise","debugStates","states","attachInternals","internals","add","delete","map","toStates","entries","debug","hasAttribute","on","toggleAttribute","value","setAttribute","removeAttribute","attr","parsed","parseInt","Number","isNaN","String","manual","trigger","payload","stringify","split","p","trim","filter","Boolean","length","sendMessage","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","style","display","disconnectedCallback","bootstrapWebSocket","userConfig","partialConfig","assign","define"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.min.js","sources":["../src/config.ts","../src/core/websocketCapabilities.ts","../src/core/WebSocketCore.ts","../src/autoTrigger.ts","../src/components/WebSocket.ts","../src/bootstrapWebSocket.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n ws: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-wstarget\",\n tagNames: {\n ws: \"wcs-ws\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","/**\n * websocketCapabilities.ts\n *\n * WebSocket node 固有の error code(taxonomy)と derivation。汎用の error info 型は\n * `./platformCapability.js`(/io-core/ から copy-distribution される生成ファイル)から\n * import する。WebSocket は持続的な session / monitor node(1 本の接続を張り続ける)で、\n * 競合する operation を持たないため lane は持たず、error taxonomy(errorInfo)のみを採用する。\n *\n * この node の `_setError` は 4 形態の非 null 入力を受ける(いずれも公開 `error` shape は不変):\n * 1. synthetic な `{ message: \"url is required.\" }`(`.name` 無し)— connect() の引数不備。\n * 2. synthetic な `{ message: \"WebSocket is not connected.\" }`(`.name` 無し)— open 前の send()。\n * 3. caught された生の構築例外 `e`(`new WebSocket()` の同期 throw)。\n * 4. platform の WebSocket `error` Event(`Event`。`.name`/`.message` を持たない)。\n *\n * これらは shape がバラバラで、message からの分類は脆い。そこで呼び出し側が明示的な\n * taxonomy code を discriminator として渡す(storage の `deriveStorageErrorInfo(error, name)`\n * と同じ技法)。derive 側は synthetic / Event / Error を reverse-engineer せず、渡された\n * code で phase / recoverable を決め、message だけを防御的に抽出する。\n */\n\nimport type { WcsIoErrorInfo } from \"./platformCapability.js\";\n\n/** 安定した websocket error code(taxonomy)。値は公開キーとして固定。 */\nexport const WCS_WEBSOCKET_ERROR_CODE = {\n /** connect() の `url` 未指定 — 開始前の入力不備。retry では回復しない。 */\n InvalidArgument: \"invalid-argument\",\n /** open 前の send() — 接続が OPEN でない状態での送信。retry では回復しない(先に connect が要る)。 */\n InvalidState: \"invalid-state\",\n /**\n * 接続の確立 / 維持に失敗(`new WebSocket()` の同期例外、または platform の error Event)。\n * WebSocket のエラーは通常一過性で、再接続で回復しうる(recoverable=true)。\n */\n ConnectionError: \"connection-error\",\n} as const;\n\n/**\n * websocket の失敗を serializable な error taxonomy に写す。`code` は呼び出し側が渡す\n * discriminator(公開 `error` shape からは復元しない)。`message` は入力から防御的に抽出し、\n * message を持たない error Event 等では安定した fallback を使う。\n *\n * - `invalid-argument`(url 未指定)は開始前の入力不備 → phase=\"start\" / recoverable=false。\n * - `invalid-state`(open 前 send)は接続状態が満たされない実行時失敗 → phase=\"execute\" /\n * recoverable=false(先に connect() が必要)。\n * - `connection-error`(構築例外 / error Event)は接続の確立 / 維持失敗 → phase=\"execute\" /\n * recoverable=true(再接続で回復しうる)。\n */\nexport function deriveWebSocketErrorInfo(error: unknown, code: string): WcsIoErrorInfo {\n // error は非 null(_setError は error===null を derive 前に分岐する)だが、synthetic /\n // Event / caught 例外 / 生 throw と shape がバラバラなので message は防御的に抽出する。\n // error Event は message を持たないため安定した fallback に落とす。\n const raw = (error as { message?: unknown }).message;\n const message = typeof raw === \"string\" ? raw : \"WebSocket connection error\";\n\n if (code === WCS_WEBSOCKET_ERROR_CODE.InvalidArgument) {\n return { code: WCS_WEBSOCKET_ERROR_CODE.InvalidArgument, phase: \"start\", recoverable: false, message };\n }\n if (code === WCS_WEBSOCKET_ERROR_CODE.InvalidState) {\n return { code: WCS_WEBSOCKET_ERROR_CODE.InvalidState, phase: \"execute\", recoverable: false, message };\n }\n // connection-error(構築例外 / error Event): 接続の確立/維持失敗、再接続で回復しうる。\n return { code: WCS_WEBSOCKET_ERROR_CODE.ConnectionError, phase: \"execute\", recoverable: true, message };\n}\n","import { IWcBindable } from \"../types.js\";\nimport { WcsIoErrorInfo } from \"./platformCapability.js\";\nimport { deriveWebSocketErrorInfo, WCS_WEBSOCKET_ERROR_CODE } from \"./websocketCapabilities.js\";\n\n// WebSocket readyState values. Hardcoded rather than read from the global\n// WebSocket so the Core does not require WebSocket to exist at module load\n// (referencing `WebSocket.CLOSED` in a field initializer evaluates at class\n// definition time; tests inject a mock). Mirrors SseCore's SSE_CLOSED.\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\nconst WS_CLOSED = 3;\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\n // How incoming binary frames are surfaced on `message`. \"blob\" (the platform\n // default) or \"arraybuffer\" for direct byte processing. Applied to every\n // socket this connection spawns, including auto-reconnects.\n binaryType?: BinaryType;\n}\n\nexport class WebSocketCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-ws:message\" },\n { name: \"connected\", event: \"wcs-ws:connected-changed\" },\n { name: \"loading\", event: \"wcs-ws:loading-changed\" },\n { name: \"error\", event: \"wcs-ws:error\" },\n // Serializable failure taxonomy (stable code / phase / recoverable), or null.\n // Additive bindable output derived from `error` (invalid-argument / invalid-state\n // / connection-error); the existing `error` property/event are unchanged. Fires\n // wcs-ws:error-info-changed. No lane — WebSocket is a persistent session/monitor\n // node, not a competing operation.\n { name: \"errorInfo\", event: \"wcs-ws:error-info-changed\" },\n { name: \"readyState\", event: \"wcs-ws:readystate-changed\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"send\" },\n { name: \"close\" },\n ],\n };\n\n private _target: EventTarget;\n private _ws: WebSocket | null = null;\n private _message: any = null;\n private _connected: boolean = false;\n private _loading: boolean = false;\n private _error: any = null;\n private _errorInfo: WcsIoErrorInfo | null = null;\n private _readyState: number = WS_CLOSED;\n\n // 自動再接続\n private _autoReconnect: boolean = false;\n private _reconnectInterval: number = 3000;\n private _maxReconnects: number = Infinity;\n private _reconnectCount: number = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _url: string = \"\";\n private _protocols: string | string[] | undefined = undefined;\n private _binaryType: BinaryType = \"blob\";\n private _intentionalClose: boolean = false;\n\n // Generation guard (§3.4): bumped on dispose() and at every connect(). A socket\n // event (open/message/error/close) or a scheduled reconnect that fires after\n // dispose / a superseding connect() carries a stale `gen` and MUST NOT write\n // state onto a torn-down element. A boolean flag is insufficient (dispose→observe\n // would let stale work slip through).\n private _gen = 0;\n // Generation captured when the current socket was opened. The shared socket\n // event handlers compare it against _gen to drop events from a superseded /\n // disposed connection.\n private _socketGen = 0;\n // SSR (§3.8): WebSocket is command-driven with no asynchronous probe to await,\n // so readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). WebSocket connections are command-driven (connect()), so\n // observe() is an idempotent no-op that resolves once ready; the Shell's\n // connectedCallback does not auto-establish a subscription here. dispose()\n // invalidates any in-flight socket / pending reconnect and closes the socket.\n observe(): Promise<void> {\n return this._ready;\n }\n\n dispose(): void {\n this._gen++;\n this.close();\n }\n\n get message(): any {\n return this._message;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n /**\n * The last failure's serializable `WcsIoErrorInfo` (stable `code` / `phase` /\n * `recoverable`), or null. Additive wc-bindable property (event\n * `wcs-ws:error-info-changed`), derived from `error`; the existing `error`\n * property/event are unchanged.\n */\n get errorInfo(): WcsIoErrorInfo | null {\n return this._errorInfo;\n }\n\n get readyState(): number {\n return this._readyState;\n }\n\n // --- State setters with event dispatch ---\n\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n private _setConnected(connected: boolean): void {\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:connected-changed\", {\n detail: connected,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n // `code` is an explicit taxonomy discriminator (WCS_WEBSOCKET_ERROR_CODE), passed\n // only from the non-null failure call sites. It stays out of the public `error`\n // shape and is used solely to classify errorInfo without reverse-engineering the\n // heterogeneous `error` values (synthetic {message} / caught Error / raw Event).\n // The clear path passes null and no code.\n private _setError(error: any, code?: string): void {\n // Same-value guard (async-io-node-guidelines.md §3.3). `error` is state-ish,\n // so suppressing redundant null→null dispatches (every connect/send start\n // clears a usually-already-null error) avoids a spurious wcs-ws:error per\n // successful operation. Reference identity is sufficient: each failure builds\n // a fresh object (or the platform's own error Event), and the clear path\n // always passes null.\n if (this._error === error) return;\n this._error = error;\n // Keep the additive `errorInfo` taxonomy in sync with `error`: derive from the\n // explicit `code` (or null on clear). Fires before the `error` event so an\n // observer binding both sees the classification first, mirroring the io-node\n // family. Every non-null error carries a code (the clear path is the only\n // caller without one, and it is short-circuited here), so `code!` holds.\n this._commitErrorInfo(error === null ? null : deriveWebSocketErrorInfo(error, code!));\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n // Called only from _setError (which already same-value-guards on the error\n // reference), so errorInfo transitions exactly when error does — no separate\n // guard needed here.\n private _commitErrorInfo(info: WcsIoErrorInfo | null): void {\n this._errorInfo = info;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error-info-changed\", {\n detail: info,\n bubbles: true,\n }));\n }\n\n private _setReadyState(readyState: number): void {\n this._readyState = readyState;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:readystate-changed\", {\n detail: readyState,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n connect(url: string, options: WebSocketConnectOptions = {}): void {\n // never-throw (§3.6): 引数バリデーション失敗は例外ではなく error プロパティに\n // 流し、サニタイズ値(なにもしない)を返す。command-token 経路(set trigger →\n // connect())からの呼び出しが state 更新サイクルを壊さないようにする。\n if (!url) {\n this._setError({ message: \"url is required.\" }, WCS_WEBSOCKET_ERROR_CODE.InvalidArgument);\n return;\n }\n\n // 新しい接続を開始するため世代を更新し、進行中のソケット/再接続を無効化する。\n this._gen++;\n\n // 既存の接続をクローズ\n this._intentionalClose = true;\n this._closeInternal();\n\n this._url = url;\n this._protocols = options.protocols;\n this._autoReconnect = options.autoReconnect ?? false;\n this._reconnectInterval = options.reconnectInterval ?? 3000;\n this._maxReconnects = options.maxReconnects ?? Infinity;\n this._binaryType = options.binaryType ?? \"blob\";\n this._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n // never-throw (§3.6): 未接続での送信は例外ではなく error に流す。set send の\n // fire-and-forget 経路で例外が伝播するのを防ぐ。\n if (!this._ws || this._ws.readyState !== WS_OPEN) {\n this._setError({ message: \"WebSocket is not connected.\" }, WCS_WEBSOCKET_ERROR_CODE.InvalidState);\n return;\n }\n this._ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._intentionalClose = true;\n this._clearReconnectTimer();\n if (this._ws) {\n this._ws.close(code, reason);\n }\n }\n\n // --- Internal ---\n\n private _doConnect(): void {\n this._setLoading(true);\n this._setError(null);\n\n // 接続開始時点の世代を捕捉。dispose()/再 connect() 後に発火した古いソケット\n // イベントはこの gen が stale になり、状態を書き換えない(_onOpen ほかが\n // _socketGen と this._gen を突き合わせて判定する)。\n this._socketGen = this._gen;\n\n try {\n this._ws = this._protocols\n ? new WebSocket(this._url, this._protocols)\n : new WebSocket(this._url);\n } catch (e) {\n this._setLoading(false);\n this._setError(e, WCS_WEBSOCKET_ERROR_CODE.ConnectionError);\n return;\n }\n\n // Binary frames default to Blob; opt into ArrayBuffer for direct byte access.\n this._ws.binaryType = this._binaryType;\n\n this._setReadyState(WS_CONNECTING);\n\n this._ws.addEventListener(\"open\", this._onOpen);\n this._ws.addEventListener(\"message\", this._onMessage);\n this._ws.addEventListener(\"error\", this._onError);\n this._ws.addEventListener(\"close\", this._onClose);\n }\n\n private _onOpen = (): void => {\n if (this._socketGen !== this._gen) return;\n this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WS_OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\n if (this._socketGen !== this._gen) return;\n let data = event.data;\n // JSONの自動パース\n if (typeof data === \"string\") {\n try {\n data = JSON.parse(data);\n } catch {\n // テキストのまま\n }\n }\n this._setMessage(data);\n };\n\n private _onError = (event: Event): void => {\n if (this._socketGen !== this._gen) return;\n this._setError(event, WCS_WEBSOCKET_ERROR_CODE.ConnectionError);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n if (this._socketGen !== this._gen) return;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WS_CLOSED);\n\n // 異常クローズ時の自動再接続(正常終了 1000 は除外)\n if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {\n this._scheduleReconnect();\n }\n };\n\n private _scheduleReconnect(): void {\n const gen = this._gen;\n this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n // dispose()/再 connect() でこの再接続が無効化されていたら何もしない。\n if (gen !== this._gen) return;\n this._reconnectCount++;\n this._doConnect();\n }, this._reconnectInterval);\n }\n\n private _clearReconnectTimer(): void {\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n private _removeListeners(): void {\n if (!this._ws) {\n return;\n }\n\n this._ws.removeEventListener(\"open\", this._onOpen);\n this._ws.removeEventListener(\"message\", this._onMessage);\n this._ws.removeEventListener(\"error\", this._onError);\n this._ws.removeEventListener(\"close\", this._onClose);\n }\n\n private _closeInternal(): void {\n this._clearReconnectTimer();\n if (this._ws) {\n this._removeListeners();\n if (this._ws.readyState === WS_OPEN || this._ws.readyState === WS_CONNECTING) {\n this._ws.close();\n }\n this._ws = null;\n }\n // 旧接続の状態をリセット(コンストラクタ例外時に stale 状態が残るのを防止)\n if (this._connected) {\n this._setConnected(false);\n }\n if (this._readyState !== WS_CLOSED) {\n this._setReadyState(WS_CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWebSocket } from \"./components/WebSocket.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\n if (!wsId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWebSocket as a value. The value import created a components/WebSocket.ts ⇄\n // autoTrigger.ts cycle (WcsWebSocket.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-ws> class\n // matches — without the import cycle.\n const WsCtor = customElements.get(config.tagNames.ws);\n const wsElement = document.getElementById(wsId);\n if (!WsCtor || !(wsElement instanceof WsCtor)) return;\n\n event.preventDefault();\n (wsElement as WcsWebSocket).connect();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\nimport { WcsIoErrorInfo } from \"../core/platformCapability.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class WcsWebSocket extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WebSocketCore.wcBindable,\n properties: [\n ...WebSocketCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-ws:trigger-changed\" },\n { name: \"send\", event: \"wcs-ws:send-changed\" },\n ],\n inputs: [\n { name: \"url\", attribute: \"url\" },\n { name: \"protocols\", attribute: \"protocols\" },\n { name: \"autoReconnect\", attribute: \"auto-reconnect\" },\n { name: \"reconnectInterval\", attribute: \"reconnect-interval\" },\n { name: \"maxReconnects\", attribute: \"max-reconnects\" },\n { name: \"binaryType\", attribute: \"binary-type\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n { name: \"send\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"sendMessage\" },\n { name: \"close\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: WebSocketCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n private _internals: ElementInternals | null = null;\n\n constructor() {\n super();\n this._core = new WebSocketCore(this);\n this._internals = this._initInternals();\n this._wireStates({\n \"wcs-ws:connected-changed\": (d) => ({ connected: d === true }),\n \"wcs-ws:loading-changed\": (d) => ({ loading: d === true }),\n \"wcs-ws:error\": (d) => ({ error: d != null }),\n });\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // CSS state reflection (:state()) — debug-only snapshot getter. NOT part of\n // wc-bindable (not a bind target); see README \"CSS styling with :state()\".\n // MUST NOT return the live CustomStateSet (that would let callers write\n // states from outside, defeating the point of :state() being read-only).\n get debugStates(): string[] {\n return this._internals ? [...this._internals.states] : [];\n }\n\n private _initInternals(): ElementInternals | null {\n // never-throw (async-io-node-guidelines.md §3.6): attachInternals is absent\n // in happy-dom / older environments, and pre-125 Chromium rejects\n // non-dashed state names from states.add() (probed and discarded here).\n // Either case silently disables reflection — the component still works,\n // it just doesn't expose :state() selectors.\n try {\n if (typeof this.attachInternals !== \"function\") return null;\n const internals = this.attachInternals();\n internals.states.add(\"wcs-probe\");\n internals.states.delete(\"wcs-probe\");\n return internals;\n } catch {\n return null;\n }\n }\n\n private _wireStates(map: Record<string, (detail: any) => Record<string, boolean>>): void {\n if (this._internals === null) return;\n const states = this._internals.states;\n for (const [event, toStates] of Object.entries(map)) {\n this.addEventListener(event, (e) => {\n const debug = this.hasAttribute(\"debug-states\");\n for (const [name, on] of Object.entries(toStates((e as CustomEvent).detail))) {\n try {\n if (on) { states.add(name); } else { states.delete(name); }\n } catch { /* never-throw */ }\n if (debug) this.toggleAttribute(`data-wcs-state-${name}`, on);\n }\n });\n }\n }\n\n // --- Attribute accessors ---\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get protocols(): string {\n return this.getAttribute(\"protocols\") || \"\";\n }\n\n set protocols(value: string) {\n this.setAttribute(\"protocols\", value);\n }\n\n get autoReconnect(): boolean {\n return this.hasAttribute(\"auto-reconnect\");\n }\n\n set autoReconnect(value: boolean) {\n if (value) {\n this.setAttribute(\"auto-reconnect\", \"\");\n } else {\n this.removeAttribute(\"auto-reconnect\");\n }\n }\n\n get reconnectInterval(): number {\n const attr = this.getAttribute(\"reconnect-interval\");\n const parsed = attr ? parseInt(attr, 10) : 3000;\n return Number.isNaN(parsed) ? 3000 : parsed;\n }\n\n set reconnectInterval(value: number) {\n this.setAttribute(\"reconnect-interval\", String(value));\n }\n\n get maxReconnects(): number {\n const attr = this.getAttribute(\"max-reconnects\");\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxReconnects(value: number) {\n this.setAttribute(\"max-reconnects\", String(value));\n }\n\n // Incoming binary frame representation. Backed by the `binary-type` attribute;\n // any value other than \"arraybuffer\" normalizes to the platform default \"blob\".\n get binaryType(): BinaryType {\n return this.getAttribute(\"binary-type\") === \"arraybuffer\" ? \"arraybuffer\" : \"blob\";\n }\n\n set binaryType(value: string | null) {\n if (value == null) {\n this.removeAttribute(\"binary-type\");\n } else {\n this.setAttribute(\"binary-type\", value);\n }\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get connected(): boolean {\n return this._core.connected;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get errorInfo(): WcsIoErrorInfo | null {\n return this._core.errorInfo;\n }\n\n get readyState(): number {\n return this._core.readyState;\n }\n\n // --- Command properties ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.connect();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-ws:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n // `send` is a write-only command surface: assigning transmits immediately.\n // Reading always returns null (no payload is retained) — consistent with the\n // null carried by wcs-ws:send-changed and the documented \"resets to null\".\n get send(): any {\n return null;\n }\n\n set send(data: any) {\n if (data === null || data === undefined) return;\n const payload = typeof data === \"string\" ? data : JSON.stringify(data);\n this._core.send(payload);\n this.dispatchEvent(new CustomEvent(\"wcs-ws:send-changed\", {\n detail: null,\n bubbles: true,\n }));\n }\n\n // --- Public methods ---\n\n connect(): void {\n const protocols = this.protocols\n ? this.protocols.split(\",\").map(p => p.trim()).filter(Boolean)\n : undefined;\n\n this._core.connect(this.url, {\n protocols: protocols && protocols.length === 1 ? protocols[0] : protocols,\n autoReconnect: this.autoReconnect,\n reconnectInterval: this.reconnectInterval,\n maxReconnects: this.maxReconnects,\n binaryType: this.binaryType,\n });\n }\n\n sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n this._core.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._core.close(code, reason);\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.connect();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // observe() は command-driven node では ready を返す no-op(§3.5)。SSR は\n // connectedCallbackPromise を await して初期スナップショットを取れる。\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n // dispose() が _gen を bump して進行中のソケット/再接続を無効化し、close() する。\n this._core.dispose();\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWebSocket(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n","import { WcsWebSocket } from \"./components/WebSocket.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.ws)) {\n customElements.define(config.tagNames.ws, WcsWebSocket);\n }\n}\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","ws","deepFreeze","obj","Object","freeze","key","keys","deepClone","clone","frozenConfig","config","getConfig","WCS_WEBSOCKET_ERROR_CODE","InvalidArgument","InvalidState","ConnectionError","WebSocketCore","EventTarget","static","protocol","version","properties","name","event","commands","_target","_ws","_message","_connected","_loading","_error","_errorInfo","_readyState","_autoReconnect","_reconnectInterval","_maxReconnects","Infinity","_reconnectCount","_reconnectTimer","_url","_protocols","undefined","_binaryType","_intentionalClose","_gen","_socketGen","_ready","Promise","resolve","constructor","target","super","this","ready","observe","dispose","close","message","connected","loading","error","errorInfo","readyState","_setMessage","dispatchEvent","CustomEvent","detail","bubbles","_setConnected","_setLoading","_setError","code","_commitErrorInfo","raw","phase","recoverable","deriveWebSocketErrorInfo","info","_setReadyState","connect","url","options","_closeInternal","protocols","autoReconnect","reconnectInterval","maxReconnects","binaryType","_doConnect","send","data","reason","_clearReconnectTimer","WebSocket","e","addEventListener","_onOpen","_onMessage","_onError","_onClose","JSON","parse","_removeListeners","_scheduleReconnect","gen","setTimeout","clearTimeout","removeEventListener","registered","handleClick","Element","triggerElement","closest","wsId","getAttribute","WsCtor","customElements","get","wsElement","document","getElementById","preventDefault","WcsWebSocket","HTMLElement","wcBindable","inputs","attribute","observedAttributes","_core","_trigger","_connectedCallbackPromise","_internals","_initInternals","_wireStates","d","connectedCallbackPromise","debugStates","states","attachInternals","internals","add","delete","map","toStates","entries","debug","hasAttribute","on","toggleAttribute","value","setAttribute","removeAttribute","attr","parsed","parseInt","Number","isNaN","String","manual","trigger","payload","stringify","split","p","trim","filter","Boolean","length","sendMessage","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","style","display","disconnectedCallback","bootstrapWebSocket","userConfig","partialConfig","assign","define"],"mappings":"AAUA,MAAMA,EAA2B,CAC/BC,aAAa,EACbC,iBAAkB,gBAClBC,SAAU,CACRC,GAAI,WAIR,SAASC,EAAcC,GACrB,GAAY,OAARA,GAA+B,iBAARA,EAAkB,OAAOA,EACpDC,OAAOC,OAAOF,GACd,IAAK,MAAMG,KAAOF,OAAOG,KAAKJ,GAC5BD,EAAYC,EAAgCG,IAE9C,OAAOH,CACT,CAEA,SAASK,EAAaL,GACpB,GAAY,OAARA,GAA+B,iBAARA,EAAkB,OAAOA,EACpD,MAAMM,EAAiC,CAAA,EACvC,IAAK,MAAMH,KAAOF,OAAOG,KAAKJ,GAC5BM,EAAMH,GAAOE,EAAWL,EAAgCG,IAE1D,OAAOG,CACT,CAEA,IAAIC,EAA+B,KAE5B,MAAMC,EAAkBd,WAEfe,IAId,OAHKF,IACHA,EAAeR,EAAWM,EAAUX,KAE/Ba,CACT,CCtBO,MAAMG,EAA2B,CAEtCC,gBAAiB,mBAEjBC,aAAc,gBAKdC,gBAAiB,oBCTb,MAAOC,UAAsBC,YACjCC,kBAAiC,CAC/BC,SAAU,cACVC,QAAS,EACTC,WAAY,CACV,CAAEC,KAAM,UAAWC,MAAO,kBAC1B,CAAED,KAAM,YAAaC,MAAO,4BAC5B,CAAED,KAAM,UAAWC,MAAO,0BAC1B,CAAED,KAAM,QAASC,MAAO,gBAMxB,CAAED,KAAM,YAAaC,MAAO,6BAC5B,CAAED,KAAM,aAAcC,MAAO,8BAE/BC,SAAU,CACR,CAAEF,KAAM,WACR,CAAEA,KAAM,QACR,CAAEA,KAAM,WAIJG,QACAC,IAAwB,KACxBC,SAAgB,KAChBC,YAAsB,EACtBC,UAAoB,EACpBC,OAAc,KACdC,WAAoC,KACpCC,YA5CQ,EA+CRC,gBAA0B,EAC1BC,mBAA6B,IAC7BC,eAAyBC,IACzBC,gBAA0B,EAC1BC,gBAAwD,KACxDC,KAAe,GACfC,gBAA4CC,EAC5CC,YAA0B,OAC1BC,mBAA6B,EAO7BC,KAAO,EAIPC,WAAa,EAGbC,OAAwBC,QAAQC,UAExC,WAAAC,CAAYC,GACVC,QACAC,KAAK3B,QAAUyB,GAAUE,IAC3B,CAEA,SAAIC,GACF,OAAOD,KAAKN,MACd,CAMA,OAAAQ,GACE,OAAOF,KAAKN,MACd,CAEA,OAAAS,GACEH,KAAKR,OACLQ,KAAKI,OACP,CAEA,WAAIC,GACF,OAAOL,KAAKzB,QACd,CAEA,aAAI+B,GACF,OAAON,KAAKxB,UACd,CAEA,WAAI+B,GACF,OAAOP,KAAKvB,QACd,CAEA,SAAI+B,GACF,OAAOR,KAAKtB,MACd,CAQA,aAAI+B,GACF,OAAOT,KAAKrB,UACd,CAEA,cAAI+B,GACF,OAAOV,KAAKpB,WACd,CAIQ,WAAA+B,CAAYN,GAClBL,KAAKzB,SAAW8B,EAChBL,KAAK3B,QAAQuC,cAAc,IAAIC,YAAY,iBAAkB,CAC3DC,OAAQT,EACRU,SAAS,IAEb,CAEQ,aAAAC,CAAcV,GACpBN,KAAKxB,WAAa8B,EAClBN,KAAK3B,QAAQuC,cAAc,IAAIC,YAAY,2BAA4B,CACrEC,OAAQR,EACRS,SAAS,IAEb,CAEQ,WAAAE,CAAYV,GAClBP,KAAKvB,SAAW8B,EAChBP,KAAK3B,QAAQuC,cAAc,IAAIC,YAAY,yBAA0B,CACnEC,OAAQP,EACRQ,SAAS,IAEb,CAOQ,SAAAG,CAAUV,EAAYW,GAOxBnB,KAAKtB,SAAW8B,IACpBR,KAAKtB,OAAS8B,EAMdR,KAAKoB,iBAA2B,OAAVZ,EAAiB,KDpIrC,SAAmCA,EAAgBW,GAIvD,MAAME,EAAOb,EAAgCH,QACvCA,EAAyB,iBAARgB,EAAmBA,EAAM,6BAEhD,OAAIF,IAAS3D,EAAyBC,gBAC7B,CAAE0D,KAAM3D,EAAyBC,gBAAiB6D,MAAO,QAASC,aAAa,EAAOlB,WAE3Fc,IAAS3D,EAAyBE,aAC7B,CAAEyD,KAAM3D,EAAyBE,aAAc4D,MAAO,UAAWC,aAAa,EAAOlB,WAGvF,CAAEc,KAAM3D,EAAyBG,gBAAiB2D,MAAO,UAAWC,aAAa,EAAMlB,UAChG,CCqHkDmB,CAAyBhB,EAAOW,IAC9EnB,KAAK3B,QAAQuC,cAAc,IAAIC,YAAY,eAAgB,CACzDC,OAAQN,EACRO,SAAS,KAEb,CAKQ,gBAAAK,CAAiBK,GACvBzB,KAAKrB,WAAa8C,EAClBzB,KAAK3B,QAAQuC,cAAc,IAAIC,YAAY,4BAA6B,CACtEC,OAAQW,EACRV,SAAS,IAEb,CAEQ,cAAAW,CAAehB,GACrBV,KAAKpB,YAAc8B,EACnBV,KAAK3B,QAAQuC,cAAc,IAAIC,YAAY,4BAA6B,CACtEC,OAAQJ,EACRK,SAAS,IAEb,CAIA,OAAAY,CAAQC,EAAaC,EAAmC,IAIjDD,GAML5B,KAAKR,OAGLQ,KAAKT,mBAAoB,EACzBS,KAAK8B,iBAEL9B,KAAKb,KAAOyC,EACZ5B,KAAKZ,WAAayC,EAAQE,UAC1B/B,KAAKnB,eAAiBgD,EAAQG,gBAAiB,EAC/ChC,KAAKlB,mBAAqB+C,EAAQI,mBAAqB,IACvDjC,KAAKjB,eAAiB8C,EAAQK,eAAiBlD,IAC/CgB,KAAKV,YAAcuC,EAAQM,YAAc,OACzCnC,KAAKf,gBAAkB,EACvBe,KAAKT,mBAAoB,EAEzBS,KAAKoC,cApBHpC,KAAKkB,UAAU,CAAEb,QAAS,oBAAsB7C,EAAyBC,gBAqB7E,CAEA,IAAA4E,CAAKC,GAGEtC,KAAK1B,KApOE,IAoOK0B,KAAK1B,IAAIoC,WAI1BV,KAAK1B,IAAI+D,KAAKC,GAHZtC,KAAKkB,UAAU,CAAEb,QAAS,+BAAiC7C,EAAyBE,aAIxF,CAEA,KAAA0C,CAAMe,EAAeoB,GACnBvC,KAAKT,mBAAoB,EACzBS,KAAKwC,uBACDxC,KAAK1B,KACP0B,KAAK1B,IAAI8B,MAAMe,EAAMoB,EAEzB,CAIQ,UAAAH,GACNpC,KAAKiB,aAAY,GACjBjB,KAAKkB,UAAU,MAKflB,KAAKP,WAAaO,KAAKR,KAEvB,IACEQ,KAAK1B,IAAM0B,KAAKZ,WACZ,IAAIqD,UAAUzC,KAAKb,KAAMa,KAAKZ,YAC9B,IAAIqD,UAAUzC,KAAKb,KACzB,CAAE,MAAOuD,GAGP,OAFA1C,KAAKiB,aAAY,QACjBjB,KAAKkB,UAAUwB,EAAGlF,EAAyBG,gBAE7C,CAGAqC,KAAK1B,IAAI6D,WAAanC,KAAKV,YAE3BU,KAAK0B,eA5Qa,GA8QlB1B,KAAK1B,IAAIqE,iBAAiB,OAAQ3C,KAAK4C,SACvC5C,KAAK1B,IAAIqE,iBAAiB,UAAW3C,KAAK6C,YAC1C7C,KAAK1B,IAAIqE,iBAAiB,QAAS3C,KAAK8C,UACxC9C,KAAK1B,IAAIqE,iBAAiB,QAAS3C,KAAK+C,SAC1C,CAEQH,QAAU,KACZ5C,KAAKP,aAAeO,KAAKR,OAC7BQ,KAAKf,gBAAkB,EACvBe,KAAKiB,aAAY,GACjBjB,KAAKgB,eAAc,GACnBhB,KAAK0B,eAxRO,KA2RNmB,WAAc1E,IACpB,GAAI6B,KAAKP,aAAeO,KAAKR,KAAM,OACnC,IAAI8C,EAAOnE,EAAMmE,KAEjB,GAAoB,iBAATA,EACT,IACEA,EAAOU,KAAKC,MAAMX,EACpB,CAAE,MAEF,CAEFtC,KAAKW,YAAY2B,IAGXQ,SAAY3E,IACd6B,KAAKP,aAAeO,KAAKR,MAC7BQ,KAAKkB,UAAU/C,EAAOX,EAAyBG,kBAGzCoF,SAAY5E,IAClB6B,KAAKkD,mBACLlD,KAAK1B,IAAM,KACP0B,KAAKP,aAAeO,KAAKR,OAC7BQ,KAAKgB,eAAc,GACnBhB,KAAKiB,aAAY,GACjBjB,KAAK0B,eAnTS,IAsTT1B,KAAKT,mBAAqBS,KAAKnB,gBAAiC,MAAfV,EAAMgD,MAAiBnB,KAAKf,gBAAkBe,KAAKjB,gBACvGiB,KAAKmD,uBAID,kBAAAA,GACN,MAAMC,EAAMpD,KAAKR,KACjBQ,KAAKwC,uBACLxC,KAAKd,gBAAkBmE,WAAW,KAChCrD,KAAKd,gBAAkB,KAEnBkE,IAAQpD,KAAKR,OACjBQ,KAAKf,kBACLe,KAAKoC,eACJpC,KAAKlB,mBACV,CAEQ,oBAAA0D,GACuB,OAAzBxC,KAAKd,kBACPoE,aAAatD,KAAKd,iBAClBc,KAAKd,gBAAkB,KAE3B,CAEQ,gBAAAgE,GACDlD,KAAK1B,MAIV0B,KAAK1B,IAAIiF,oBAAoB,OAAQvD,KAAK4C,SAC1C5C,KAAK1B,IAAIiF,oBAAoB,UAAWvD,KAAK6C,YAC7C7C,KAAK1B,IAAIiF,oBAAoB,QAASvD,KAAK8C,UAC3C9C,KAAK1B,IAAIiF,oBAAoB,QAASvD,KAAK+C,UAC7C,CAEQ,cAAAjB,GACN9B,KAAKwC,uBACDxC,KAAK1B,MACP0B,KAAKkD,mBA7VK,IA8VNlD,KAAK1B,IAAIoC,YA/VG,IA+VuBV,KAAK1B,IAAIoC,YAC9CV,KAAK1B,IAAI8B,QAEXJ,KAAK1B,IAAM,MAGT0B,KAAKxB,YACPwB,KAAKgB,eAAc,GApWP,IAsWVhB,KAAKpB,aACPoB,KAAK0B,eAvWO,EAyWhB,EChXF,IAAI8B,GAAa,EAEjB,SAASC,EAAYtF,GACnB,MAAM2B,EAAS3B,EAAM2B,OACrB,KAAMA,aAAkB4D,SAAU,OAElC,MAAMC,EAAiB7D,EAAO8D,QAAiB,IAAItG,EAAOZ,qBAC1D,IAAKiH,EAAgB,OAErB,MAAME,EAAOF,EAAeG,aAAaxG,EAAOZ,kBAChD,IAAKmH,EAAM,OAQX,MAAME,EAASC,eAAeC,IAAI3G,EAAOX,SAASC,IAC5CsH,EAAYC,SAASC,eAAeP,GACrCE,GAAYG,aAAqBH,IAEtC5F,EAAMkG,iBACLH,EAA2BvC,UAC9B,CCrBM,MAAO2C,UAAqBC,YAChCzG,oCAAqC,EACrCA,kBAAiC,IAC5BF,EAAc4G,WACjBvG,WAAY,IACPL,EAAc4G,WAAWvG,WAC5B,CAAEC,KAAM,UAAWC,MAAO,0BAC1B,CAAED,KAAM,OAAQC,MAAO,wBAEzBsG,OAAQ,CACN,CAAEvG,KAAM,MAAOwG,UAAW,OAC1B,CAAExG,KAAM,YAAawG,UAAW,aAChC,CAAExG,KAAM,gBAAiBwG,UAAW,kBACpC,CAAExG,KAAM,oBAAqBwG,UAAW,sBACxC,CAAExG,KAAM,gBAAiBwG,UAAW,kBACpC,CAAExG,KAAM,aAAcwG,UAAW,eACjC,CAAExG,KAAM,SAAUwG,UAAW,UAC7B,CAAExG,KAAM,WACR,CAAEA,KAAM,SAEVE,SAAU,CACR,CAAEF,KAAM,WACR,CAAEA,KAAM,eACR,CAAEA,KAAM,WAGZ,6BAAWyG,GAAiC,MAAO,CAAC,MAAQ,CAEpDC,MACAC,UAAoB,EACpBC,0BAA2CnF,QAAQC,UACnDmF,WAAsC,KAE9C,WAAAlF,GACEE,QACAC,KAAK4E,MAAQ,IAAIhH,EAAcoC,MAC/BA,KAAK+E,WAAa/E,KAAKgF,iBACvBhF,KAAKiF,YAAY,CACf,2BAA6BC,IAAC,CAAQ5E,WAAiB,IAAN4E,IACjD,yBAA6BA,IAAC,CAAQ3E,SAAe,IAAN2E,IAC/C,eAA6BA,IAAC,CAAQ1E,MAAY,MAAL0E,KAEjD,CAEA,4BAAIC,GACF,OAAOnF,KAAK8E,yBACd,CAMA,eAAIM,GACF,OAAOpF,KAAK+E,WAAa,IAAI/E,KAAK+E,WAAWM,QAAU,EACzD,CAEQ,cAAAL,GAMN,IACE,GAAoC,mBAAzBhF,KAAKsF,gBAAgC,OAAO,KACvD,MAAMC,EAAYvF,KAAKsF,kBAGvB,OAFAC,EAAUF,OAAOG,IAAI,aACrBD,EAAUF,OAAOI,OAAO,aACjBF,CACT,CAAE,MACA,OAAO,IACT,CACF,CAEQ,WAAAN,CAAYS,GAClB,GAAwB,OAApB1F,KAAK+E,WAAqB,OAC9B,MAAMM,EAASrF,KAAK+E,WAAWM,OAC/B,IAAK,MAAOlH,EAAOwH,KAAa5I,OAAO6I,QAAQF,GAC7C1F,KAAK2C,iBAAiBxE,EAAQuE,IAC5B,MAAMmD,EAAQ7F,KAAK8F,aAAa,gBAChC,IAAK,MAAO5H,EAAM6H,KAAOhJ,OAAO6I,QAAQD,EAAUjD,EAAkB5B,SAAU,CAC5E,IACMiF,EAAMV,EAAOG,IAAItH,GAAgBmH,EAAOI,OAAOvH,EACrD,CAAE,MAA0B,CACxB2H,GAAO7F,KAAKgG,gBAAgB,kBAAkB9H,IAAQ6H,EAC5D,GAGN,CAIA,OAAInE,GACF,OAAO5B,KAAK8D,aAAa,QAAU,EACrC,CAEA,OAAIlC,CAAIqE,GACNjG,KAAKkG,aAAa,MAAOD,EAC3B,CAEA,aAAIlE,GACF,OAAO/B,KAAK8D,aAAa,cAAgB,EAC3C,CAEA,aAAI/B,CAAUkE,GACZjG,KAAKkG,aAAa,YAAaD,EACjC,CAEA,iBAAIjE,GACF,OAAOhC,KAAK8F,aAAa,iBAC3B,CAEA,iBAAI9D,CAAciE,GACZA,EACFjG,KAAKkG,aAAa,iBAAkB,IAEpClG,KAAKmG,gBAAgB,iBAEzB,CAEA,qBAAIlE,GACF,MAAMmE,EAAOpG,KAAK8D,aAAa,sBACzBuC,EAASD,EAAOE,SAASF,EAAM,IAAM,IAC3C,OAAOG,OAAOC,MAAMH,GAAU,IAAOA,CACvC,CAEA,qBAAIpE,CAAkBgE,GACpBjG,KAAKkG,aAAa,qBAAsBO,OAAOR,GACjD,CAEA,iBAAI/D,GACF,MAAMkE,EAAOpG,KAAK8D,aAAa,kBACzBuC,EAASD,EAAOE,SAASF,EAAM,IAAMpH,IAC3C,OAAOuH,OAAOC,MAAMH,GAAUrH,IAAWqH,CAC3C,CAEA,iBAAInE,CAAc+D,GAChBjG,KAAKkG,aAAa,iBAAkBO,OAAOR,GAC7C,CAIA,cAAI9D,GACF,MAA4C,gBAArCnC,KAAK8D,aAAa,eAAmC,cAAgB,MAC9E,CAEA,cAAI3B,CAAW8D,GACA,MAATA,EACFjG,KAAKmG,gBAAgB,eAErBnG,KAAKkG,aAAa,cAAeD,EAErC,CAEA,UAAIS,GACF,OAAO1G,KAAK8F,aAAa,SAC3B,CAEA,UAAIY,CAAOT,GACLA,EACFjG,KAAKkG,aAAa,SAAU,IAE5BlG,KAAKmG,gBAAgB,SAEzB,CAIA,WAAI9F,GACF,OAAOL,KAAK4E,MAAMvE,OACpB,CAEA,aAAIC,GACF,OAAON,KAAK4E,MAAMtE,SACpB,CAEA,WAAIC,GACF,OAAOP,KAAK4E,MAAMrE,OACpB,CAEA,SAAIC,GACF,OAAOR,KAAK4E,MAAMpE,KACpB,CAEA,aAAIC,GACF,OAAOT,KAAK4E,MAAMnE,SACpB,CAEA,cAAIC,GACF,OAAOV,KAAK4E,MAAMlE,UACpB,CAIA,WAAIiG,GACF,OAAO3G,KAAK6E,QACd,CAEA,WAAI8B,CAAQV,KACEA,IAEVjG,KAAK6E,UAAW,EAChB7E,KAAK2B,UACL3B,KAAK6E,UAAW,EAChB7E,KAAKY,cAAc,IAAIC,YAAY,yBAA0B,CAC3DC,QAAQ,EACRC,SAAS,KAGf,CAKA,QAAIsB,GACF,OAAO,IACT,CAEA,QAAIA,CAAKC,GACP,GAAIA,QAAqC,OACzC,MAAMsE,EAA0B,iBAATtE,EAAoBA,EAAOU,KAAK6D,UAAUvE,GACjEtC,KAAK4E,MAAMvC,KAAKuE,GAChB5G,KAAKY,cAAc,IAAIC,YAAY,sBAAuB,CACxDC,OAAQ,KACRC,SAAS,IAEb,CAIA,OAAAY,GACE,MAAMI,EAAY/B,KAAK+B,UACnB/B,KAAK+B,UAAU+E,MAAM,KAAKpB,IAAIqB,GAAKA,EAAEC,QAAQC,OAAOC,cACpD7H,EAEJW,KAAK4E,MAAMjD,QAAQ3B,KAAK4B,IAAK,CAC3BG,UAAWA,GAAkC,IAArBA,EAAUoF,OAAepF,EAAU,GAAKA,EAChEC,cAAehC,KAAKgC,cACpBC,kBAAmBjC,KAAKiC,kBACxBC,cAAelC,KAAKkC,cACpBC,WAAYnC,KAAKmC,YAErB,CAEA,WAAAiF,CAAY9E,GACVtC,KAAK4E,MAAMvC,KAAKC,EAClB,CAEA,KAAAlC,CAAMe,EAAeoB,GACnBvC,KAAK4E,MAAMxE,MAAMe,EAAMoB,EACzB,CAIA,wBAAA8E,CAAyBnJ,EAAcoJ,EAA0BC,GAClD,QAATrJ,GAAkB8B,KAAKwH,cAAgBxH,KAAK0G,QAAUa,GACxDvH,KAAK2B,SAET,CAEA,iBAAA8F,GACEzH,KAAK0H,MAAMC,QAAU,OACjBrK,EAAOb,cD7OT+G,IACJA,GAAa,EACbW,SAASxB,iBAAiB,QAASc,KCgPjCzD,KAAK8E,0BAA4B9E,KAAK4E,MAAM1E,WACvCF,KAAK0G,QAAU1G,KAAK4B,KACvB5B,KAAK2B,SAET,CAEA,oBAAAiG,GAEE5H,KAAK4E,MAAMzE,SACb,ECrRI,SAAU0H,EAAmBC,GL2C7B,IAAoBC,EK1CpBD,IL2CqC,kBADjBC,EKzCZD,GL0CarL,cACvBD,EAAQC,YAAcsL,EAActL,aAEQ,iBAAnCsL,EAAcrL,mBACvBF,EAAQE,iBAAmBqL,EAAcrL,kBAEvCqL,EAAcpL,UAChBI,OAAOiL,OAAOxL,EAAQG,SAAUoL,EAAcpL,UAEhDU,EAAe,MMrDV2G,eAAeC,IAAI3G,EAAOX,SAASC,KACtCoH,eAAeiE,OAAO3K,EAAOX,SAASC,GAAI0H,EDI9C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wcstack/websocket",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.21.0",
|
|
4
4
|
"description": "Declarative WebSocket component for Web Components. Framework-agnostic real-time communication via wc-bindable-protocol.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.esm.js",
|