@wcstack/websocket 1.10.0 → 1.11.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 +67 -11
- package/README.md +67 -11
- package/dist/index.d.ts +36 -1
- package/dist/index.esm.js +27 -2
- 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
|
@@ -12,11 +12,11 @@ WebSocket 通信とリアクティブな状態をつなぐ **I/O ノード** で
|
|
|
12
12
|
|
|
13
13
|
つまり、リアルタイム通信を HTML 内で宣言的に表現できます。UI レイヤーに `new WebSocket()`、`onmessage`、接続管理のグルーコードを書く必要はありません。
|
|
14
14
|
|
|
15
|
-
`@wcstack/websocket` は [
|
|
15
|
+
`@wcstack/websocket` は [CSBC](https://github.com/csbc-dev/arch/blob/main/README.md)(Core / Shell / Binding Contract)アーキテクチャに従います:
|
|
16
16
|
|
|
17
17
|
- **Core** (`WebSocketCore`) が接続、メッセージング、再接続、非同期状態を処理
|
|
18
|
-
- **Shell** (`<wcs-ws>`) がその状態を DOM
|
|
19
|
-
-
|
|
18
|
+
- **Shell** (`<wcs-ws>`) がその状態を DOM 属性、ライフサイクル、宣言的コマンドに接続
|
|
19
|
+
- **Binding Contract** (`static wcBindable`) が観測可能な `properties`、書き込み可能な `inputs`、呼び出し可能な `commands` を宣言
|
|
20
20
|
|
|
21
21
|
## なぜこれが存在するのか
|
|
22
22
|
|
|
@@ -169,7 +169,7 @@ npm install @wcstack/websocket
|
|
|
169
169
|
|
|
170
170
|
### 出力ステート(バインド可能な非同期状態)
|
|
171
171
|
|
|
172
|
-
|
|
172
|
+
現在の接続状態を表す、主な観測サーフェスです:
|
|
173
173
|
|
|
174
174
|
| プロパティ | 型 | 説明 |
|
|
175
175
|
|------------|------|------|
|
|
@@ -192,7 +192,7 @@ HTML、JS、または `@wcstack/state` バインディングから接続とメ
|
|
|
192
192
|
|
|
193
193
|
## アーキテクチャ
|
|
194
194
|
|
|
195
|
-
`@wcstack/websocket` は
|
|
195
|
+
`@wcstack/websocket` は CSBC アーキテクチャに従います。
|
|
196
196
|
|
|
197
197
|
### Core: `WebSocketCore`
|
|
198
198
|
|
|
@@ -203,7 +203,7 @@ HTML、JS、または `@wcstack/state` バインディングから接続とメ
|
|
|
203
203
|
- 自動再接続ロジック
|
|
204
204
|
- JSON メッセージパース
|
|
205
205
|
- 非同期状態遷移
|
|
206
|
-
- `wc-bindable-protocol` 宣言
|
|
206
|
+
- 観測可能な状態と呼び出し可能なコマンドの `wc-bindable-protocol` 宣言
|
|
207
207
|
|
|
208
208
|
`EventTarget` と `WebSocket` をサポートする任意のランタイムでヘッドレスに動作します。
|
|
209
209
|
|
|
@@ -215,6 +215,7 @@ HTML、JS、または `@wcstack/state` バインディングから接続とメ
|
|
|
215
215
|
- 属性 / プロパティマッピング
|
|
216
216
|
- DOM ライフサイクル統合
|
|
217
217
|
- `trigger`、`send` などの宣言的ヘルパー
|
|
218
|
+
- DOM 向け設定とコマンドプロパティのための `wc-bindable-protocol` inputs
|
|
218
219
|
|
|
219
220
|
この分離により、接続ロジックのポータビリティを保ちながら、`@wcstack/state` のような DOM ベースのバインディングシステムとの自然な連携を可能にしています。
|
|
220
221
|
|
|
@@ -328,7 +329,13 @@ wcstack アプリケーションでは、**`trigger` によるステート駆動
|
|
|
328
329
|
|
|
329
330
|
## wc-bindable-protocol
|
|
330
331
|
|
|
331
|
-
`WebSocketCore` と `<wcs-ws>` はどちらも wc-bindable-protocol
|
|
332
|
+
`WebSocketCore` と `<wcs-ws>` はどちらも `wc-bindable-protocol` 契約を宣言しており、プロトコル対応の任意のフレームワーク、アダプタ、remote proxy、ツール層と相互運用できます。
|
|
333
|
+
|
|
334
|
+
現在の契約は独立した 3 つのサーフェスで構成されます:
|
|
335
|
+
|
|
336
|
+
- `properties`: `bind()` とフレームワークアダプタが消費する観測可能な出力
|
|
337
|
+
- `inputs`: DOM 設定とコマンド的プロパティのための書き込み可能なインターフェースメタデータ
|
|
338
|
+
- `commands`: ツールや remote 対応 consumer から呼び出せるメソッド
|
|
332
339
|
|
|
333
340
|
### Core (`WebSocketCore`)
|
|
334
341
|
|
|
@@ -345,14 +352,19 @@ static wcBindable = {
|
|
|
345
352
|
{ name: "error", event: "wcs-ws:error" },
|
|
346
353
|
{ name: "readyState", event: "wcs-ws:readystate-changed" },
|
|
347
354
|
],
|
|
355
|
+
commands: [
|
|
356
|
+
{ name: "connect" },
|
|
357
|
+
{ name: "send" },
|
|
358
|
+
{ name: "close" },
|
|
359
|
+
],
|
|
348
360
|
};
|
|
349
361
|
```
|
|
350
362
|
|
|
351
|
-
ヘッドレスの利用者は `core.connect(url)` を直接呼ぶため、`trigger` は不要です。
|
|
363
|
+
ヘッドレスの利用者は `core.connect(url)` を直接呼ぶため、`trigger` は不要です。Core は settable な `url` / option プロパティを公開しないため `inputs` を宣言せず、それらの値は `connect()` コマンドに渡します。
|
|
352
364
|
|
|
353
365
|
### Shell (`<wcs-ws>`)
|
|
354
366
|
|
|
355
|
-
Shell は Core
|
|
367
|
+
Shell は Core の宣言を拡張し、DOM 向け input、コマンドプロパティ、HTMLElement メソッドを通じて、バインディングシステムから宣言的に接続とメッセージングを制御できるようにします:
|
|
356
368
|
|
|
357
369
|
```typescript
|
|
358
370
|
static wcBindable = {
|
|
@@ -362,6 +374,21 @@ static wcBindable = {
|
|
|
362
374
|
{ name: "trigger", event: "wcs-ws:trigger-changed" },
|
|
363
375
|
{ name: "send", event: "wcs-ws:send-changed" },
|
|
364
376
|
],
|
|
377
|
+
inputs: [
|
|
378
|
+
{ name: "url", attribute: "url" },
|
|
379
|
+
{ name: "protocols", attribute: "protocols" },
|
|
380
|
+
{ name: "autoReconnect", attribute: "auto-reconnect" },
|
|
381
|
+
{ name: "reconnectInterval", attribute: "reconnect-interval" },
|
|
382
|
+
{ name: "maxReconnects", attribute: "max-reconnects" },
|
|
383
|
+
{ name: "manual", attribute: "manual" },
|
|
384
|
+
{ name: "trigger" },
|
|
385
|
+
{ name: "send" },
|
|
386
|
+
],
|
|
387
|
+
commands: [
|
|
388
|
+
{ name: "connect" },
|
|
389
|
+
{ name: "sendMessage" },
|
|
390
|
+
{ name: "close" },
|
|
391
|
+
],
|
|
365
392
|
};
|
|
366
393
|
```
|
|
367
394
|
|
|
@@ -369,7 +396,8 @@ static wcBindable = {
|
|
|
369
396
|
|
|
370
397
|
```typescript
|
|
371
398
|
import type {
|
|
372
|
-
WcsWsError, WcsWsCoreValues, WcsWsValues
|
|
399
|
+
WcsWsError, WcsWsCoreValues, WcsWsValues,
|
|
400
|
+
WcsWsInputs, WcsWsCoreCommands, WcsWsCommands
|
|
373
401
|
} from "@wcstack/websocket";
|
|
374
402
|
```
|
|
375
403
|
|
|
@@ -396,6 +424,34 @@ interface WcsWsValues<T = unknown> extends WcsWsCoreValues<T> {
|
|
|
396
424
|
trigger: boolean;
|
|
397
425
|
send: unknown;
|
|
398
426
|
}
|
|
427
|
+
|
|
428
|
+
interface WcsWsInputs {
|
|
429
|
+
url: string;
|
|
430
|
+
protocols: string;
|
|
431
|
+
autoReconnect: boolean;
|
|
432
|
+
reconnectInterval: number;
|
|
433
|
+
maxReconnects: number;
|
|
434
|
+
manual: boolean;
|
|
435
|
+
trigger: boolean;
|
|
436
|
+
send: unknown;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
interface WcsWsCoreCommands {
|
|
440
|
+
connect(url: string, options?: {
|
|
441
|
+
protocols?: string | string[];
|
|
442
|
+
autoReconnect?: boolean;
|
|
443
|
+
reconnectInterval?: number;
|
|
444
|
+
maxReconnects?: number;
|
|
445
|
+
}): void;
|
|
446
|
+
send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
|
|
447
|
+
close(code?: number, reason?: string): void;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
interface WcsWsCommands {
|
|
451
|
+
connect(): void;
|
|
452
|
+
sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
|
|
453
|
+
close(code?: number, reason?: string): void;
|
|
454
|
+
}
|
|
399
455
|
```
|
|
400
456
|
|
|
401
457
|
## なぜ `@wcstack/state` とうまく連携するのか
|
|
@@ -413,7 +469,7 @@ interface WcsWsValues<T = unknown> extends WcsWsCoreValues<T> {
|
|
|
413
469
|
|
|
414
470
|
## フレームワーク連携
|
|
415
471
|
|
|
416
|
-
`<wcs-ws>` は
|
|
472
|
+
`<wcs-ws>` は CSBC の `wc-bindable-protocol` 契約を公開するため、`@wc-bindable/*` の薄いアダプタを通じて任意のフレームワークで動作します。
|
|
417
473
|
|
|
418
474
|
### React
|
|
419
475
|
|
package/README.md
CHANGED
|
@@ -12,11 +12,11 @@ With `@wcstack/state`, `<wcs-ws>` can be bound directly through path contracts:
|
|
|
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
|
|
|
15
|
-
`@wcstack/websocket` follows the [
|
|
15
|
+
`@wcstack/websocket` follows the [CSBC](https://github.com/csbc-dev/arch/blob/main/README.md) (Core / Shell / Binding Contract) architecture:
|
|
16
16
|
|
|
17
17
|
- **Core** (`WebSocketCore`) handles connection, messaging, reconnection, and async state
|
|
18
|
-
- **Shell** (`<wcs-ws>`) connects that state to
|
|
19
|
-
-
|
|
18
|
+
- **Shell** (`<wcs-ws>`) connects that state to DOM attributes, lifecycle, and declarative commands
|
|
19
|
+
- **Binding Contract** (`static wcBindable`) declares observable `properties`, writable `inputs`, and callable `commands`
|
|
20
20
|
|
|
21
21
|
## Why this exists
|
|
22
22
|
|
|
@@ -169,7 +169,7 @@ When the connection drops unexpectedly (close code other than 1000), `<wcs-ws>`
|
|
|
169
169
|
|
|
170
170
|
### Output state (bindable async state)
|
|
171
171
|
|
|
172
|
-
These properties represent the current connection state and are the main
|
|
172
|
+
These properties represent the current connection state and are the main observable surface:
|
|
173
173
|
|
|
174
174
|
| Property | Type | Description |
|
|
175
175
|
|----------|------|-------------|
|
|
@@ -192,7 +192,7 @@ These properties control connection and messaging from HTML, JS, or `@wcstack/st
|
|
|
192
192
|
|
|
193
193
|
## Architecture
|
|
194
194
|
|
|
195
|
-
`@wcstack/websocket` follows the
|
|
195
|
+
`@wcstack/websocket` follows the CSBC architecture.
|
|
196
196
|
|
|
197
197
|
### Core: `WebSocketCore`
|
|
198
198
|
|
|
@@ -203,7 +203,7 @@ It contains:
|
|
|
203
203
|
- automatic reconnection logic
|
|
204
204
|
- JSON message parsing
|
|
205
205
|
- async state transitions
|
|
206
|
-
- `wc-bindable-protocol` declaration
|
|
206
|
+
- `wc-bindable-protocol` declaration for observable state and callable commands
|
|
207
207
|
|
|
208
208
|
It can run headlessly in any runtime that supports `EventTarget` and `WebSocket`.
|
|
209
209
|
|
|
@@ -215,6 +215,7 @@ It adds:
|
|
|
215
215
|
- attribute / property mapping
|
|
216
216
|
- DOM lifecycle integration
|
|
217
217
|
- declarative helpers: `trigger`, `send`
|
|
218
|
+
- `wc-bindable-protocol` inputs for DOM-facing configuration and command properties
|
|
218
219
|
|
|
219
220
|
This split keeps the connection logic portable while allowing DOM-based binding systems such as `@wcstack/state` to interact with it naturally.
|
|
220
221
|
|
|
@@ -328,7 +329,13 @@ In wcstack applications, **state-driven triggering via `trigger`** is usually th
|
|
|
328
329
|
|
|
329
330
|
## wc-bindable-protocol
|
|
330
331
|
|
|
331
|
-
Both `WebSocketCore` and `<wcs-ws>` declare `wc-bindable-protocol`
|
|
332
|
+
Both `WebSocketCore` and `<wcs-ws>` declare a `wc-bindable-protocol` contract, making them interoperable with any framework, adapter, remote proxy, or tooling layer that understands the protocol.
|
|
333
|
+
|
|
334
|
+
The current contract has three independent surfaces:
|
|
335
|
+
|
|
336
|
+
- `properties`: observable outputs consumed by `bind()` and framework adapters
|
|
337
|
+
- `inputs`: writable interface metadata for DOM configuration and command-like properties
|
|
338
|
+
- `commands`: callable methods for tools and remote-capable consumers
|
|
332
339
|
|
|
333
340
|
### Core (`WebSocketCore`)
|
|
334
341
|
|
|
@@ -345,14 +352,19 @@ static wcBindable = {
|
|
|
345
352
|
{ name: "error", event: "wcs-ws:error" },
|
|
346
353
|
{ name: "readyState", event: "wcs-ws:readystate-changed" },
|
|
347
354
|
],
|
|
355
|
+
commands: [
|
|
356
|
+
{ name: "connect" },
|
|
357
|
+
{ name: "send" },
|
|
358
|
+
{ name: "close" },
|
|
359
|
+
],
|
|
348
360
|
};
|
|
349
361
|
```
|
|
350
362
|
|
|
351
|
-
Headless consumers call `core.connect(url)` directly — no `trigger` needed.
|
|
363
|
+
Headless consumers call `core.connect(url)` directly — no `trigger` needed. The Core does not declare `inputs` because it does not expose settable `url` / option properties; those values are provided through the `connect()` command.
|
|
352
364
|
|
|
353
365
|
### Shell (`<wcs-ws>`)
|
|
354
366
|
|
|
355
|
-
The Shell extends the Core declaration with
|
|
367
|
+
The Shell extends the Core declaration with DOM-facing inputs, command properties, and HTMLElement methods so binding systems can control the connection declaratively:
|
|
356
368
|
|
|
357
369
|
```typescript
|
|
358
370
|
static wcBindable = {
|
|
@@ -362,6 +374,21 @@ static wcBindable = {
|
|
|
362
374
|
{ name: "trigger", event: "wcs-ws:trigger-changed" },
|
|
363
375
|
{ name: "send", event: "wcs-ws:send-changed" },
|
|
364
376
|
],
|
|
377
|
+
inputs: [
|
|
378
|
+
{ name: "url", attribute: "url" },
|
|
379
|
+
{ name: "protocols", attribute: "protocols" },
|
|
380
|
+
{ name: "autoReconnect", attribute: "auto-reconnect" },
|
|
381
|
+
{ name: "reconnectInterval", attribute: "reconnect-interval" },
|
|
382
|
+
{ name: "maxReconnects", attribute: "max-reconnects" },
|
|
383
|
+
{ name: "manual", attribute: "manual" },
|
|
384
|
+
{ name: "trigger" },
|
|
385
|
+
{ name: "send" },
|
|
386
|
+
],
|
|
387
|
+
commands: [
|
|
388
|
+
{ name: "connect" },
|
|
389
|
+
{ name: "sendMessage" },
|
|
390
|
+
{ name: "close" },
|
|
391
|
+
],
|
|
365
392
|
};
|
|
366
393
|
```
|
|
367
394
|
|
|
@@ -369,7 +396,8 @@ static wcBindable = {
|
|
|
369
396
|
|
|
370
397
|
```typescript
|
|
371
398
|
import type {
|
|
372
|
-
WcsWsError, WcsWsCoreValues, WcsWsValues
|
|
399
|
+
WcsWsError, WcsWsCoreValues, WcsWsValues,
|
|
400
|
+
WcsWsInputs, WcsWsCoreCommands, WcsWsCommands
|
|
373
401
|
} from "@wcstack/websocket";
|
|
374
402
|
```
|
|
375
403
|
|
|
@@ -396,6 +424,34 @@ interface WcsWsValues<T = unknown> extends WcsWsCoreValues<T> {
|
|
|
396
424
|
trigger: boolean;
|
|
397
425
|
send: unknown;
|
|
398
426
|
}
|
|
427
|
+
|
|
428
|
+
interface WcsWsInputs {
|
|
429
|
+
url: string;
|
|
430
|
+
protocols: string;
|
|
431
|
+
autoReconnect: boolean;
|
|
432
|
+
reconnectInterval: number;
|
|
433
|
+
maxReconnects: number;
|
|
434
|
+
manual: boolean;
|
|
435
|
+
trigger: boolean;
|
|
436
|
+
send: unknown;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
interface WcsWsCoreCommands {
|
|
440
|
+
connect(url: string, options?: {
|
|
441
|
+
protocols?: string | string[];
|
|
442
|
+
autoReconnect?: boolean;
|
|
443
|
+
reconnectInterval?: number;
|
|
444
|
+
maxReconnects?: number;
|
|
445
|
+
}): void;
|
|
446
|
+
send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
|
|
447
|
+
close(code?: number, reason?: string): void;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
interface WcsWsCommands {
|
|
451
|
+
connect(): void;
|
|
452
|
+
sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
|
|
453
|
+
close(code?: number, reason?: string): void;
|
|
454
|
+
}
|
|
399
455
|
```
|
|
400
456
|
|
|
401
457
|
## Why this works well with `@wcstack/state`
|
|
@@ -413,7 +469,7 @@ This makes real-time communication look like ordinary state updates.
|
|
|
413
469
|
|
|
414
470
|
## Framework Integration
|
|
415
471
|
|
|
416
|
-
Since `<wcs-ws>`
|
|
472
|
+
Since `<wcs-ws>` exposes a CSBC `wc-bindable-protocol` contract, it works with any framework through thin adapters from `@wc-bindable/*`.
|
|
417
473
|
|
|
418
474
|
### React
|
|
419
475
|
|
package/dist/index.d.ts
CHANGED
|
@@ -19,10 +19,20 @@ interface IWcBindableProperty {
|
|
|
19
19
|
readonly event: string;
|
|
20
20
|
readonly getter?: (event: Event) => any;
|
|
21
21
|
}
|
|
22
|
+
interface IWcBindableInput {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly attribute?: string;
|
|
25
|
+
}
|
|
26
|
+
interface IWcBindableCommand {
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly async?: boolean;
|
|
29
|
+
}
|
|
22
30
|
interface IWcBindable {
|
|
23
31
|
readonly protocol: "wc-bindable";
|
|
24
32
|
readonly version: number;
|
|
25
33
|
readonly properties: IWcBindableProperty[];
|
|
34
|
+
readonly inputs?: IWcBindableInput[];
|
|
35
|
+
readonly commands?: IWcBindableCommand[];
|
|
26
36
|
}
|
|
27
37
|
/**
|
|
28
38
|
* WebSocket error object.
|
|
@@ -49,6 +59,31 @@ interface WcsWsValues<T = unknown> extends WcsWsCoreValues<T> {
|
|
|
49
59
|
trigger: boolean;
|
|
50
60
|
send: unknown;
|
|
51
61
|
}
|
|
62
|
+
interface WcsWsInputs {
|
|
63
|
+
url: string;
|
|
64
|
+
protocols: string;
|
|
65
|
+
autoReconnect: boolean;
|
|
66
|
+
reconnectInterval: number;
|
|
67
|
+
maxReconnects: number;
|
|
68
|
+
manual: boolean;
|
|
69
|
+
trigger: boolean;
|
|
70
|
+
send: unknown;
|
|
71
|
+
}
|
|
72
|
+
interface WcsWsCoreCommands {
|
|
73
|
+
connect(url: string, options?: {
|
|
74
|
+
protocols?: string | string[];
|
|
75
|
+
autoReconnect?: boolean;
|
|
76
|
+
reconnectInterval?: number;
|
|
77
|
+
maxReconnects?: number;
|
|
78
|
+
}): void;
|
|
79
|
+
send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
|
|
80
|
+
close(code?: number, reason?: string): void;
|
|
81
|
+
}
|
|
82
|
+
interface WcsWsCommands {
|
|
83
|
+
connect(): void;
|
|
84
|
+
sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
|
|
85
|
+
close(code?: number, reason?: string): void;
|
|
86
|
+
}
|
|
52
87
|
|
|
53
88
|
declare function bootstrapWebSocket(userConfig?: IWritableConfig): void;
|
|
54
89
|
|
|
@@ -138,4 +173,4 @@ declare class WcsWebSocket extends HTMLElement {
|
|
|
138
173
|
}
|
|
139
174
|
|
|
140
175
|
export { WcsWebSocket, WebSocketCore, bootstrapWebSocket, getConfig };
|
|
141
|
-
export type { IWritableConfig, IWritableTagNames, WcsWsCoreValues, WcsWsError, WcsWsValues, WebSocketConnectOptions };
|
|
176
|
+
export type { IWritableConfig, IWritableTagNames, WcsWsCommands, WcsWsCoreCommands, WcsWsCoreValues, WcsWsError, WcsWsInputs, WcsWsValues, WebSocketConnectOptions };
|
package/dist/index.esm.js
CHANGED
|
@@ -59,6 +59,11 @@ class WebSocketCore extends EventTarget {
|
|
|
59
59
|
{ name: "error", event: "wcs-ws:error" },
|
|
60
60
|
{ name: "readyState", event: "wcs-ws:readystate-changed" },
|
|
61
61
|
],
|
|
62
|
+
commands: [
|
|
63
|
+
{ name: "connect" },
|
|
64
|
+
{ name: "send" },
|
|
65
|
+
{ name: "close" },
|
|
66
|
+
],
|
|
62
67
|
};
|
|
63
68
|
_target;
|
|
64
69
|
_ws = null;
|
|
@@ -229,6 +234,9 @@ class WebSocketCore extends EventTarget {
|
|
|
229
234
|
}
|
|
230
235
|
}
|
|
231
236
|
_removeListeners() {
|
|
237
|
+
if (!this._ws) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
232
240
|
this._ws.removeEventListener("open", this._onOpen);
|
|
233
241
|
this._ws.removeEventListener("message", this._onMessage);
|
|
234
242
|
this._ws.removeEventListener("error", this._onError);
|
|
@@ -286,6 +294,21 @@ class WcsWebSocket extends HTMLElement {
|
|
|
286
294
|
{ name: "trigger", event: "wcs-ws:trigger-changed" },
|
|
287
295
|
{ name: "send", event: "wcs-ws:send-changed" },
|
|
288
296
|
],
|
|
297
|
+
inputs: [
|
|
298
|
+
{ name: "url", attribute: "url" },
|
|
299
|
+
{ name: "protocols", attribute: "protocols" },
|
|
300
|
+
{ name: "autoReconnect", attribute: "auto-reconnect" },
|
|
301
|
+
{ name: "reconnectInterval", attribute: "reconnect-interval" },
|
|
302
|
+
{ name: "maxReconnects", attribute: "max-reconnects" },
|
|
303
|
+
{ name: "manual", attribute: "manual" },
|
|
304
|
+
{ name: "trigger" },
|
|
305
|
+
{ name: "send" },
|
|
306
|
+
],
|
|
307
|
+
commands: [
|
|
308
|
+
{ name: "connect" },
|
|
309
|
+
{ name: "sendMessage" },
|
|
310
|
+
{ name: "close" },
|
|
311
|
+
],
|
|
289
312
|
};
|
|
290
313
|
static get observedAttributes() { return ["url"]; }
|
|
291
314
|
_core;
|
|
@@ -320,14 +343,16 @@ class WcsWebSocket extends HTMLElement {
|
|
|
320
343
|
}
|
|
321
344
|
get reconnectInterval() {
|
|
322
345
|
const attr = this.getAttribute("reconnect-interval");
|
|
323
|
-
|
|
346
|
+
const parsed = attr ? parseInt(attr, 10) : 3000;
|
|
347
|
+
return Number.isNaN(parsed) ? 3000 : parsed;
|
|
324
348
|
}
|
|
325
349
|
set reconnectInterval(value) {
|
|
326
350
|
this.setAttribute("reconnect-interval", String(value));
|
|
327
351
|
}
|
|
328
352
|
get maxReconnects() {
|
|
329
353
|
const attr = this.getAttribute("max-reconnects");
|
|
330
|
-
|
|
354
|
+
const parsed = attr ? parseInt(attr, 10) : Infinity;
|
|
355
|
+
return Number.isNaN(parsed) ? Infinity : parsed;
|
|
331
356
|
}
|
|
332
357
|
set maxReconnects(value) {
|
|
333
358
|
this.setAttribute("max-reconnects", String(value));
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/raiseError.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","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/websocket] ${message}`);\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable } from \"../types.js\";\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\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 };\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 = WebSocket.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 _intentionalClose: boolean = false;\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\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 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 if (!url) {\n raiseError(\"url is required.\");\n }\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._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\n raiseError(\"WebSocket is not connected.\");\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 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 this._setReadyState(WebSocket.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 this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WebSocket.OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\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 this._setError(event);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WebSocket.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 this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\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 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 === WebSocket.OPEN || this._ws.readyState === WebSocket.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 !== WebSocket.CLOSED) {\n this._setReadyState(WebSocket.CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport { 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 const wsElement = document.getElementById(wsId) as WcsWebSocket | null;\n if (!wsElement || !(wsElement instanceof WcsWebSocket)) return;\n\n event.preventDefault();\n wsElement.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 = false;\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 };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: WebSocketCore;\n private _trigger: boolean = false;\n\n constructor() {\n super();\n this._core = new WebSocketCore(this);\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 return attr ? parseInt(attr, 10) : 3000;\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 return attr ? parseInt(attr, 10) : Infinity;\n }\n\n set maxReconnects(value: number) {\n this.setAttribute(\"max-reconnects\", String(value));\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 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 });\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 if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n this._core.close();\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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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/raiseError.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","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/websocket] ${message}`);\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable } from \"../types.js\";\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\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 = WebSocket.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 _intentionalClose: boolean = false;\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\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 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 if (!url) {\n raiseError(\"url is required.\");\n }\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._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\n raiseError(\"WebSocket is not connected.\");\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 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 this._setReadyState(WebSocket.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 this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WebSocket.OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\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 this._setError(event);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WebSocket.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 this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\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 === WebSocket.OPEN || this._ws.readyState === WebSocket.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 !== WebSocket.CLOSED) {\n this._setReadyState(WebSocket.CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport { 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 const wsElement = document.getElementById(wsId) as WcsWebSocket | null;\n if (!wsElement || !(wsElement instanceof WcsWebSocket)) return;\n\n event.preventDefault();\n wsElement.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 = false;\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: \"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\n constructor() {\n super();\n this._core = new WebSocketCore(this);\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 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 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 });\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 if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n this._core.close();\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
|
|
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 o(){return s||(s=t(n(e))),s}function c(e){throw new Error(`[@wcstack/websocket] ${e}`)}class i 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=WebSocket.CLOSED;_autoReconnect=!1;_reconnectInterval=3e3;_maxReconnects=1/0;_reconnectCount=0;_reconnectTimer=null;_url="";_protocols=void 0;_intentionalClose=!1;constructor(e){super(),this._target=e??this}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._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||c("url is required."),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._reconnectCount=0,this._intentionalClose=!1,this._doConnect()}send(e){this._ws&&this._ws.readyState===WebSocket.OPEN||c("WebSocket is not connected."),this._ws.send(e)}close(e,t){this._intentionalClose=!0,this._clearReconnectTimer(),this._ws&&this._ws.close(e,t)}_doConnect(){this._setLoading(!0),this._setError(null);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._setReadyState(WebSocket.CONNECTING),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._reconnectCount=0,this._setLoading(!1),this._setConnected(!0),this._setReadyState(WebSocket.OPEN)};_onMessage=e=>{let t=e.data;if("string"==typeof t)try{t=JSON.parse(t)}catch{}this._setMessage(t)};_onError=e=>{this._setError(e)};_onClose=e=>{this._removeListeners(),this._ws=null,this._setConnected(!1),this._setLoading(!1),this._setReadyState(WebSocket.CLOSED),!this._intentionalClose&&this._autoReconnect&&1e3!==e.code&&this._reconnectCount<this._maxReconnects&&this._scheduleReconnect()};_scheduleReconnect(){this._clearReconnectTimer(),this._reconnectTimer=setTimeout(()=>{this._reconnectTimer=null,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(),this._ws.readyState!==WebSocket.OPEN&&this._ws.readyState!==WebSocket.CONNECTING||this._ws.close(),this._ws=null),this._connected&&this._setConnected(!1),this._readyState!==WebSocket.CLOSED&&this._setReadyState(WebSocket.CLOSED)}}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 o=document.getElementById(s);o&&o instanceof h&&(e.preventDefault(),o.connect())}class h extends HTMLElement{static hasConnectedCallbackPromise=!1;static wcBindable={...i.wcBindable,properties:[...i.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:"manual",attribute:"manual"},{name:"trigger"},{name:"send"}],commands:[{name:"connect"},{name:"sendMessage"},{name:"close"}]};static get observedAttributes(){return["url"]}_core;_trigger=!1;constructor(){super(),this._core=new i(this)}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 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})))}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})}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.manual&&this.url&&this.connect()}disconnectedCallback(){this._core.close()}}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{h as WcsWebSocket,i as WebSocketCore,u as bootstrapWebSocket,o 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/raiseError.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","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/websocket] ${message}`);\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable } from \"../types.js\";\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\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 };\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 = WebSocket.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 _intentionalClose: boolean = false;\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\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 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 if (!url) {\n raiseError(\"url is required.\");\n }\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._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\n raiseError(\"WebSocket is not connected.\");\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 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 this._setReadyState(WebSocket.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 this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WebSocket.OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\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 this._setError(event);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WebSocket.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 this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\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 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 === WebSocket.OPEN || this._ws.readyState === WebSocket.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 !== WebSocket.CLOSED) {\n this._setReadyState(WebSocket.CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport { 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 const wsElement = document.getElementById(wsId) as WcsWebSocket | null;\n if (!wsElement || !(wsElement instanceof WcsWebSocket)) return;\n\n event.preventDefault();\n wsElement.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 = false;\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 };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: WebSocketCore;\n private _trigger: boolean = false;\n\n constructor() {\n super();\n this._core = new WebSocketCore(this);\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 return attr ? parseInt(attr, 10) : 3000;\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 return attr ? parseInt(attr, 10) : Infinity;\n }\n\n set maxReconnects(value: number) {\n this.setAttribute(\"max-reconnects\", String(value));\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 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 });\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 if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n this._core.close();\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","raiseError","message","Error","WebSocketCore","EventTarget","static","protocol","version","properties","name","event","_target","_ws","_message","_connected","_loading","_error","_readyState","WebSocket","CLOSED","_autoReconnect","_reconnectInterval","_maxReconnects","Infinity","_reconnectCount","_reconnectTimer","_url","_protocols","undefined","_intentionalClose","constructor","target","super","this","connected","loading","error","readyState","_setMessage","dispatchEvent","CustomEvent","detail","bubbles","_setConnected","_setLoading","_setError","_setReadyState","connect","url","options","_closeInternal","protocols","autoReconnect","reconnectInterval","maxReconnects","_doConnect","send","data","OPEN","close","code","reason","_clearReconnectTimer","e","CONNECTING","addEventListener","_onOpen","_onMessage","_onError","_onClose","JSON","parse","_removeListeners","_scheduleReconnect","setTimeout","clearTimeout","removeEventListener","registered","handleClick","Element","triggerElement","closest","wsId","getAttribute","wsElement","document","getElementById","WcsWebSocket","preventDefault","HTMLElement","wcBindable","observedAttributes","_core","_trigger","value","setAttribute","hasAttribute","removeAttribute","attr","parseInt","String","manual","trigger","payload","stringify","split","map","p","trim","filter","Boolean","length","sendMessage","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","style","display","disconnectedCallback","bootstrapWebSocket","userConfig","partialConfig","assign","customElements","get","define"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.min.js","sources":["../src/config.ts","../src/raiseError.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","export function raiseError(message: string): never {\n throw new Error(`[@wcstack/websocket] ${message}`);\n}\n","import { raiseError } from \"../raiseError.js\";\nimport { IWcBindable } from \"../types.js\";\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\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 = WebSocket.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 _intentionalClose: boolean = false;\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\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 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 if (!url) {\n raiseError(\"url is required.\");\n }\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._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\n raiseError(\"WebSocket is not connected.\");\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 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 this._setReadyState(WebSocket.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 this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WebSocket.OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\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 this._setError(event);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WebSocket.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 this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\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 === WebSocket.OPEN || this._ws.readyState === WebSocket.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 !== WebSocket.CLOSED) {\n this._setReadyState(WebSocket.CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport { 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 const wsElement = document.getElementById(wsId) as WcsWebSocket | null;\n if (!wsElement || !(wsElement instanceof WcsWebSocket)) return;\n\n event.preventDefault();\n wsElement.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 = false;\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: \"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\n constructor() {\n super();\n this._core = new WebSocketCore(this);\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 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 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 });\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 if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n this._core.close();\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","raiseError","message","Error","WebSocketCore","EventTarget","static","protocol","version","properties","name","event","commands","_target","_ws","_message","_connected","_loading","_error","_readyState","WebSocket","CLOSED","_autoReconnect","_reconnectInterval","_maxReconnects","Infinity","_reconnectCount","_reconnectTimer","_url","_protocols","undefined","_intentionalClose","constructor","target","super","this","connected","loading","error","readyState","_setMessage","dispatchEvent","CustomEvent","detail","bubbles","_setConnected","_setLoading","_setError","_setReadyState","connect","url","options","_closeInternal","protocols","autoReconnect","reconnectInterval","maxReconnects","_doConnect","send","data","OPEN","close","code","reason","_clearReconnectTimer","e","CONNECTING","addEventListener","_onOpen","_onMessage","_onError","_onClose","JSON","parse","_removeListeners","_scheduleReconnect","setTimeout","clearTimeout","removeEventListener","registered","handleClick","Element","triggerElement","closest","wsId","getAttribute","wsElement","document","getElementById","WcsWebSocket","preventDefault","HTMLElement","wcBindable","inputs","attribute","observedAttributes","_core","_trigger","value","setAttribute","hasAttribute","removeAttribute","attr","parsed","parseInt","Number","isNaN","String","manual","trigger","payload","stringify","split","map","p","trim","filter","Boolean","length","sendMessage","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","style","display","disconnectedCallback","bootstrapWebSocket","userConfig","partialConfig","assign","customElements","get","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,CC7CM,SAAUG,EAAWC,GACzB,MAAM,IAAIC,MAAM,wBAAwBD,IAC1C,CCQM,MAAOE,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,gBACxB,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,YAAsBC,UAAUC,OAGhCC,gBAA0B,EAC1BC,mBAA6B,IAC7BC,eAAyBC,IACzBC,gBAA0B,EAC1BC,gBAAwD,KACxDC,KAAe,GACfC,gBAA4CC,EAC5CC,mBAA6B,EAErC,WAAAC,CAAYC,GACVC,QACAC,KAAKtB,QAAUoB,GAAUE,IAC3B,CAEA,WAAIjC,GACF,OAAOiC,KAAKpB,QACd,CAEA,aAAIqB,GACF,OAAOD,KAAKnB,UACd,CAEA,WAAIqB,GACF,OAAOF,KAAKlB,QACd,CAEA,SAAIqB,GACF,OAAOH,KAAKjB,MACd,CAEA,cAAIqB,GACF,OAAOJ,KAAKhB,WACd,CAIQ,WAAAqB,CAAYtC,GAClBiC,KAAKpB,SAAWb,EAChBiC,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,iBAAkB,CAC3DC,OAAQzC,EACR0C,SAAS,IAEb,CAEQ,aAAAC,CAAcT,GACpBD,KAAKnB,WAAaoB,EAClBD,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,2BAA4B,CACrEC,OAAQP,EACRQ,SAAS,IAEb,CAEQ,WAAAE,CAAYT,GAClBF,KAAKlB,SAAWoB,EAChBF,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,yBAA0B,CACnEC,OAAQN,EACRO,SAAS,IAEb,CAEQ,SAAAG,CAAUT,GAChBH,KAAKjB,OAASoB,EACdH,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,eAAgB,CACzDC,OAAQL,EACRM,SAAS,IAEb,CAEQ,cAAAI,CAAeT,GACrBJ,KAAKhB,YAAcoB,EACnBJ,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,4BAA6B,CACtEC,OAAQJ,EACRK,SAAS,IAEb,CAIA,OAAAK,CAAQC,EAAaC,EAAmC,IACjDD,GACHjD,EAAW,oBAIbkC,KAAKJ,mBAAoB,EACzBI,KAAKiB,iBAELjB,KAAKP,KAAOsB,EACZf,KAAKN,WAAasB,EAAQE,UAC1BlB,KAAKb,eAAiB6B,EAAQG,gBAAiB,EAC/CnB,KAAKZ,mBAAqB4B,EAAQI,mBAAqB,IACvDpB,KAAKX,eAAiB2B,EAAQK,eAAiB/B,IAC/CU,KAAKT,gBAAkB,EACvBS,KAAKJ,mBAAoB,EAEzBI,KAAKsB,YACP,CAEA,IAAAC,CAAKC,GACExB,KAAKrB,KAAOqB,KAAKrB,IAAIyB,aAAenB,UAAUwC,MACjD3D,EAAW,+BAEbkC,KAAKrB,IAAI4C,KAAKC,EAChB,CAEA,KAAAE,CAAMC,EAAeC,GACnB5B,KAAKJ,mBAAoB,EACzBI,KAAK6B,uBACD7B,KAAKrB,KACPqB,KAAKrB,IAAI+C,MAAMC,EAAMC,EAEzB,CAIQ,UAAAN,GACNtB,KAAKW,aAAY,GACjBX,KAAKY,UAAU,MAEf,IACEZ,KAAKrB,IAAMqB,KAAKN,WACZ,IAAIT,UAAUe,KAAKP,KAAMO,KAAKN,YAC9B,IAAIT,UAAUe,KAAKP,KACzB,CAAE,MAAOqC,GAGP,OAFA9B,KAAKW,aAAY,QACjBX,KAAKY,UAAUkB,EAEjB,CAEA9B,KAAKa,eAAe5B,UAAU8C,YAE9B/B,KAAKrB,IAAIqD,iBAAiB,OAAQhC,KAAKiC,SACvCjC,KAAKrB,IAAIqD,iBAAiB,UAAWhC,KAAKkC,YAC1ClC,KAAKrB,IAAIqD,iBAAiB,QAAShC,KAAKmC,UACxCnC,KAAKrB,IAAIqD,iBAAiB,QAAShC,KAAKoC,SAC1C,CAEQH,QAAU,KAChBjC,KAAKT,gBAAkB,EACvBS,KAAKW,aAAY,GACjBX,KAAKU,eAAc,GACnBV,KAAKa,eAAe5B,UAAUwC,OAGxBS,WAAc1D,IACpB,IAAIgD,EAAOhD,EAAMgD,KAEjB,GAAoB,iBAATA,EACT,IACEA,EAAOa,KAAKC,MAAMd,EACpB,CAAE,MAEF,CAEFxB,KAAKK,YAAYmB,IAGXW,SAAY3D,IAClBwB,KAAKY,UAAUpC,IAGT4D,SAAY5D,IAClBwB,KAAKuC,mBACLvC,KAAKrB,IAAM,KACXqB,KAAKU,eAAc,GACnBV,KAAKW,aAAY,GACjBX,KAAKa,eAAe5B,UAAUC,SAGzBc,KAAKJ,mBAAqBI,KAAKb,gBAAiC,MAAfX,EAAMmD,MAAiB3B,KAAKT,gBAAkBS,KAAKX,gBACvGW,KAAKwC,sBAID,kBAAAA,GACNxC,KAAK6B,uBACL7B,KAAKR,gBAAkBiD,WAAW,KAChCzC,KAAKR,gBAAkB,KACvBQ,KAAKT,kBACLS,KAAKsB,cACJtB,KAAKZ,mBACV,CAEQ,oBAAAyC,GACuB,OAAzB7B,KAAKR,kBACPkD,aAAa1C,KAAKR,iBAClBQ,KAAKR,gBAAkB,KAE3B,CAEQ,gBAAA+C,GACDvC,KAAKrB,MAIVqB,KAAKrB,IAAIgE,oBAAoB,OAAQ3C,KAAKiC,SAC1CjC,KAAKrB,IAAIgE,oBAAoB,UAAW3C,KAAKkC,YAC7ClC,KAAKrB,IAAIgE,oBAAoB,QAAS3C,KAAKmC,UAC3CnC,KAAKrB,IAAIgE,oBAAoB,QAAS3C,KAAKoC,UAC7C,CAEQ,cAAAnB,GACNjB,KAAK6B,uBACD7B,KAAKrB,MACPqB,KAAKuC,mBACDvC,KAAKrB,IAAIyB,aAAenB,UAAUwC,MAAQzB,KAAKrB,IAAIyB,aAAenB,UAAU8C,YAC9E/B,KAAKrB,IAAI+C,QAEX1B,KAAKrB,IAAM,MAGTqB,KAAKnB,YACPmB,KAAKU,eAAc,GAEjBV,KAAKhB,cAAgBC,UAAUC,QACjCc,KAAKa,eAAe5B,UAAUC,OAElC,EC3PF,IAAI0D,GAAa,EAEjB,SAASC,EAAYrE,GACnB,MAAMsB,EAAStB,EAAMsB,OACrB,KAAMA,aAAkBgD,SAAU,OAElC,MAAMC,EAAiBjD,EAAOkD,QAAiB,IAAIpF,EAAOZ,qBAC1D,IAAK+F,EAAgB,OAErB,MAAME,EAAOF,EAAeG,aAAatF,EAAOZ,kBAChD,IAAKiG,EAAM,OAEX,MAAME,EAAYC,SAASC,eAAeJ,GACrCE,GAAeA,aAAqBG,IAEzC9E,EAAM+E,iBACNJ,EAAUrC,UACZ,CCfM,MAAOwC,UAAqBE,YAChCrF,oCAAqC,EACrCA,kBAAiC,IAC5BF,EAAcwF,WACjBnF,WAAY,IACPL,EAAcwF,WAAWnF,WAC5B,CAAEC,KAAM,UAAWC,MAAO,0BAC1B,CAAED,KAAM,OAAQC,MAAO,wBAEzBkF,OAAQ,CACN,CAAEnF,KAAM,MAAOoF,UAAW,OAC1B,CAAEpF,KAAM,YAAaoF,UAAW,aAChC,CAAEpF,KAAM,gBAAiBoF,UAAW,kBACpC,CAAEpF,KAAM,oBAAqBoF,UAAW,sBACxC,CAAEpF,KAAM,gBAAiBoF,UAAW,kBACpC,CAAEpF,KAAM,SAAUoF,UAAW,UAC7B,CAAEpF,KAAM,WACR,CAAEA,KAAM,SAEVE,SAAU,CACR,CAAEF,KAAM,WACR,CAAEA,KAAM,eACR,CAAEA,KAAM,WAGZ,6BAAWqF,GAAiC,MAAO,CAAC,MAAQ,CAEpDC,MACAC,UAAoB,EAE5B,WAAAjE,GACEE,QACAC,KAAK6D,MAAQ,IAAI5F,EAAc+B,KACjC,CAIA,OAAIe,GACF,OAAOf,KAAKkD,aAAa,QAAU,EACrC,CAEA,OAAInC,CAAIgD,GACN/D,KAAKgE,aAAa,MAAOD,EAC3B,CAEA,aAAI7C,GACF,OAAOlB,KAAKkD,aAAa,cAAgB,EAC3C,CAEA,aAAIhC,CAAU6C,GACZ/D,KAAKgE,aAAa,YAAaD,EACjC,CAEA,iBAAI5C,GACF,OAAOnB,KAAKiE,aAAa,iBAC3B,CAEA,iBAAI9C,CAAc4C,GACZA,EACF/D,KAAKgE,aAAa,iBAAkB,IAEpChE,KAAKkE,gBAAgB,iBAEzB,CAEA,qBAAI9C,GACF,MAAM+C,EAAOnE,KAAKkD,aAAa,sBACzBkB,EAASD,EAAOE,SAASF,EAAM,IAAM,IAC3C,OAAOG,OAAOC,MAAMH,GAAU,IAAOA,CACvC,CAEA,qBAAIhD,CAAkB2C,GACpB/D,KAAKgE,aAAa,qBAAsBQ,OAAOT,GACjD,CAEA,iBAAI1C,GACF,MAAM8C,EAAOnE,KAAKkD,aAAa,kBACzBkB,EAASD,EAAOE,SAASF,EAAM,IAAM7E,IAC3C,OAAOgF,OAAOC,MAAMH,GAAU9E,IAAW8E,CAC3C,CAEA,iBAAI/C,CAAc0C,GAChB/D,KAAKgE,aAAa,iBAAkBQ,OAAOT,GAC7C,CAEA,UAAIU,GACF,OAAOzE,KAAKiE,aAAa,SAC3B,CAEA,UAAIQ,CAAOV,GACLA,EACF/D,KAAKgE,aAAa,SAAU,IAE5BhE,KAAKkE,gBAAgB,SAEzB,CAIA,WAAInG,GACF,OAAOiC,KAAK6D,MAAM9F,OACpB,CAEA,aAAIkC,GACF,OAAOD,KAAK6D,MAAM5D,SACpB,CAEA,WAAIC,GACF,OAAOF,KAAK6D,MAAM3D,OACpB,CAEA,SAAIC,GACF,OAAOH,KAAK6D,MAAM1D,KACpB,CAEA,cAAIC,GACF,OAAOJ,KAAK6D,MAAMzD,UACpB,CAIA,WAAIsE,GACF,OAAO1E,KAAK8D,QACd,CAEA,WAAIY,CAAQX,KACEA,IAEV/D,KAAK8D,UAAW,EAChB9D,KAAKc,UACLd,KAAK8D,UAAW,EAChB9D,KAAKM,cAAc,IAAIC,YAAY,yBAA0B,CAC3DC,QAAQ,EACRC,SAAS,KAGf,CAEA,QAAIc,CAAKC,GACP,GAAIA,QAAqC,OACzC,MAAMmD,EAA0B,iBAATnD,EAAoBA,EAAOa,KAAKuC,UAAUpD,GACjExB,KAAK6D,MAAMtC,KAAKoD,GAChB3E,KAAKM,cAAc,IAAIC,YAAY,sBAAuB,CACxDC,OAAQ,KACRC,SAAS,IAEb,CAIA,OAAAK,GACE,MAAMI,EAAYlB,KAAKkB,UACnBlB,KAAKkB,UAAU2D,MAAM,KAAKC,IAAIC,GAAKA,EAAEC,QAAQC,OAAOC,cACpDvF,EAEJK,KAAK6D,MAAM/C,QAAQd,KAAKe,IAAK,CAC3BG,UAAWA,GAAkC,IAArBA,EAAUiE,OAAejE,EAAU,GAAKA,EAChEC,cAAenB,KAAKmB,cACpBC,kBAAmBpB,KAAKoB,kBACxBC,cAAerB,KAAKqB,eAExB,CAEA,WAAA+D,CAAY5D,GACVxB,KAAK6D,MAAMtC,KAAKC,EAClB,CAEA,KAAAE,CAAMC,EAAeC,GACnB5B,KAAK6D,MAAMnC,MAAMC,EAAMC,EACzB,CAIA,wBAAAyD,CAAyB9G,EAAc+G,EAA0BC,GAClD,QAAThH,GAAkByB,KAAKwF,cAAgBxF,KAAKyE,QAAUc,GACxDvF,KAAKc,SAET,CAEA,iBAAA2E,GACEzF,KAAK0F,MAAMC,QAAU,OACjB/H,EAAOb,cDnKT6F,IACJA,GAAa,EACbQ,SAASpB,iBAAiB,QAASa,MCoK5B7C,KAAKyE,QAAUzE,KAAKe,KACvBf,KAAKc,SAET,CAEA,oBAAA8E,GACE5F,KAAK6D,MAAMnC,OACb,EChMI,SAAUmE,EAAmBC,GL2C7B,IAAoBC,EK1CpBD,IL2CqC,kBADjBC,EKzCZD,GL0Ca/I,cACvBD,EAAQC,YAAcgJ,EAAchJ,aAEQ,iBAAnCgJ,EAAc/I,mBACvBF,EAAQE,iBAAmB+I,EAAc/I,kBAEvC+I,EAAc9I,UAChBI,OAAO2I,OAAOlJ,EAAQG,SAAU8I,EAAc9I,UAEhDU,EAAe,MMrDVsI,eAAeC,IAAItI,EAAOX,SAASC,KACtC+I,eAAeE,OAAOvI,EAAOX,SAASC,GAAIoG,EDI9C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wcstack/websocket",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.11.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",
|