@wcstack/websocket 1.13.1 → 1.15.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/dist/index.d.ts CHANGED
@@ -1,19 +1,3 @@
1
- interface ITagNames {
2
- readonly ws: string;
3
- }
4
- interface IWritableTagNames {
5
- ws?: string;
6
- }
7
- interface IConfig {
8
- readonly autoTrigger: boolean;
9
- readonly triggerAttribute: string;
10
- readonly tagNames: ITagNames;
11
- }
12
- interface IWritableConfig {
13
- autoTrigger?: boolean;
14
- triggerAttribute?: string;
15
- tagNames?: IWritableTagNames;
16
- }
17
1
  interface IWcBindableProperty {
18
2
  readonly name: string;
19
3
  readonly event: string;
@@ -29,11 +13,29 @@ interface IWcBindableCommand {
29
13
  }
30
14
  interface IWcBindable {
31
15
  readonly protocol: "wc-bindable";
32
- readonly version: number;
33
- readonly properties: IWcBindableProperty[];
34
- readonly inputs?: IWcBindableInput[];
35
- readonly commands?: IWcBindableCommand[];
16
+ readonly version: 1;
17
+ readonly properties: readonly IWcBindableProperty[];
18
+ readonly inputs?: readonly IWcBindableInput[];
19
+ readonly commands?: readonly IWcBindableCommand[];
20
+ }
21
+
22
+ interface ITagNames {
23
+ readonly ws: string;
36
24
  }
25
+ interface IWritableTagNames {
26
+ ws?: string;
27
+ }
28
+ interface IConfig {
29
+ readonly autoTrigger: boolean;
30
+ readonly triggerAttribute: string;
31
+ readonly tagNames: ITagNames;
32
+ }
33
+ interface IWritableConfig {
34
+ autoTrigger?: boolean;
35
+ triggerAttribute?: string;
36
+ tagNames?: IWritableTagNames;
37
+ }
38
+
37
39
  /**
38
40
  * WebSocket error object.
39
41
  */
@@ -65,6 +67,7 @@ interface WcsWsInputs {
65
67
  autoReconnect: boolean;
66
68
  reconnectInterval: number;
67
69
  maxReconnects: number;
70
+ binaryType: BinaryType;
68
71
  manual: boolean;
69
72
  trigger: boolean;
70
73
  send: unknown;
@@ -75,6 +78,7 @@ interface WcsWsCoreCommands {
75
78
  autoReconnect?: boolean;
76
79
  reconnectInterval?: number;
77
80
  maxReconnects?: number;
81
+ binaryType?: BinaryType;
78
82
  }): void;
79
83
  send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;
80
84
  close(code?: number, reason?: string): void;
@@ -94,6 +98,7 @@ interface WebSocketConnectOptions {
94
98
  autoReconnect?: boolean;
95
99
  reconnectInterval?: number;
96
100
  maxReconnects?: number;
101
+ binaryType?: BinaryType;
97
102
  }
98
103
  declare class WebSocketCore extends EventTarget {
99
104
  static wcBindable: IWcBindable;
@@ -111,8 +116,15 @@ declare class WebSocketCore extends EventTarget {
111
116
  private _reconnectTimer;
112
117
  private _url;
113
118
  private _protocols;
119
+ private _binaryType;
114
120
  private _intentionalClose;
121
+ private _gen;
122
+ private _socketGen;
123
+ private _ready;
115
124
  constructor(target?: EventTarget);
125
+ get ready(): Promise<void>;
126
+ observe(): Promise<void>;
127
+ dispose(): void;
116
128
  get message(): any;
117
129
  get connected(): boolean;
118
130
  get loading(): boolean;
@@ -143,7 +155,9 @@ declare class WcsWebSocket extends HTMLElement {
143
155
  static get observedAttributes(): string[];
144
156
  private _core;
145
157
  private _trigger;
158
+ private _connectedCallbackPromise;
146
159
  constructor();
160
+ get connectedCallbackPromise(): Promise<void>;
147
161
  get url(): string;
148
162
  set url(value: string);
149
163
  get protocols(): string;
@@ -154,6 +168,8 @@ declare class WcsWebSocket extends HTMLElement {
154
168
  set reconnectInterval(value: number);
155
169
  get maxReconnects(): number;
156
170
  set maxReconnects(value: number);
171
+ get binaryType(): BinaryType;
172
+ set binaryType(value: string | null);
157
173
  get manual(): boolean;
158
174
  set manual(value: boolean);
159
175
  get message(): any;
package/dist/index.esm.js CHANGED
@@ -44,10 +44,13 @@ function setConfig(partialConfig) {
44
44
  frozenConfig = null;
45
45
  }
46
46
 
47
- function raiseError(message) {
48
- throw new Error(`[@wcstack/websocket] ${message}`);
49
- }
50
-
47
+ // WebSocket readyState values. Hardcoded rather than read from the global
48
+ // WebSocket so the Core does not require WebSocket to exist at module load
49
+ // (referencing `WebSocket.CLOSED` in a field initializer evaluates at class
50
+ // definition time; tests inject a mock). Mirrors SseCore's SSE_CLOSED.
51
+ const WS_CONNECTING = 0;
52
+ const WS_OPEN = 1;
53
+ const WS_CLOSED = 3;
51
54
  class WebSocketCore extends EventTarget {
52
55
  static wcBindable = {
53
56
  protocol: "wc-bindable",
@@ -71,7 +74,7 @@ class WebSocketCore extends EventTarget {
71
74
  _connected = false;
72
75
  _loading = false;
73
76
  _error = null;
74
- _readyState = WebSocket.CLOSED;
77
+ _readyState = WS_CLOSED;
75
78
  // 自動再接続
76
79
  _autoReconnect = false;
77
80
  _reconnectInterval = 3000;
@@ -80,11 +83,39 @@ class WebSocketCore extends EventTarget {
80
83
  _reconnectTimer = null;
81
84
  _url = "";
82
85
  _protocols = undefined;
86
+ _binaryType = "blob";
83
87
  _intentionalClose = false;
88
+ // Generation guard (§3.4): bumped on dispose() and at every connect(). A socket
89
+ // event (open/message/error/close) or a scheduled reconnect that fires after
90
+ // dispose / a superseding connect() carries a stale `gen` and MUST NOT write
91
+ // state onto a torn-down element. A boolean flag is insufficient (dispose→observe
92
+ // would let stale work slip through).
93
+ _gen = 0;
94
+ // Generation captured when the current socket was opened. The shared socket
95
+ // event handlers compare it against _gen to drop events from a superseded /
96
+ // disposed connection.
97
+ _socketGen = 0;
98
+ // SSR (§3.8): WebSocket is command-driven with no asynchronous probe to await,
99
+ // so readiness is immediate.
100
+ _ready = Promise.resolve();
84
101
  constructor(target) {
85
102
  super();
86
103
  this._target = target ?? this;
87
104
  }
105
+ get ready() {
106
+ return this._ready;
107
+ }
108
+ // Lifecycle (§3.5). WebSocket connections are command-driven (connect()), so
109
+ // observe() is an idempotent no-op that resolves once ready; the Shell's
110
+ // connectedCallback does not auto-establish a subscription here. dispose()
111
+ // invalidates any in-flight socket / pending reconnect and closes the socket.
112
+ observe() {
113
+ return this._ready;
114
+ }
115
+ dispose() {
116
+ this._gen++;
117
+ this.close();
118
+ }
88
119
  get message() {
89
120
  return this._message;
90
121
  }
@@ -138,9 +169,15 @@ class WebSocketCore extends EventTarget {
138
169
  }
139
170
  // --- Public API ---
140
171
  connect(url, options = {}) {
172
+ // never-throw (§3.6): 引数バリデーション失敗は例外ではなく error プロパティに
173
+ // 流し、サニタイズ値(なにもしない)を返す。command-token 経路(set trigger →
174
+ // connect())からの呼び出しが state 更新サイクルを壊さないようにする。
141
175
  if (!url) {
142
- raiseError("url is required.");
176
+ this._setError({ message: "url is required." });
177
+ return;
143
178
  }
179
+ // 新しい接続を開始するため世代を更新し、進行中のソケット/再接続を無効化する。
180
+ this._gen++;
144
181
  // 既存の接続をクローズ
145
182
  this._intentionalClose = true;
146
183
  this._closeInternal();
@@ -149,13 +186,17 @@ class WebSocketCore extends EventTarget {
149
186
  this._autoReconnect = options.autoReconnect ?? false;
150
187
  this._reconnectInterval = options.reconnectInterval ?? 3000;
151
188
  this._maxReconnects = options.maxReconnects ?? Infinity;
189
+ this._binaryType = options.binaryType ?? "blob";
152
190
  this._reconnectCount = 0;
153
191
  this._intentionalClose = false;
154
192
  this._doConnect();
155
193
  }
156
194
  send(data) {
157
- if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {
158
- raiseError("WebSocket is not connected.");
195
+ // never-throw (§3.6): 未接続での送信は例外ではなく error に流す。set send
196
+ // fire-and-forget 経路で例外が伝播するのを防ぐ。
197
+ if (!this._ws || this._ws.readyState !== WS_OPEN) {
198
+ this._setError({ message: "WebSocket is not connected." });
199
+ return;
159
200
  }
160
201
  this._ws.send(data);
161
202
  }
@@ -170,6 +211,10 @@ class WebSocketCore extends EventTarget {
170
211
  _doConnect() {
171
212
  this._setLoading(true);
172
213
  this._setError(null);
214
+ // 接続開始時点の世代を捕捉。dispose()/再 connect() 後に発火した古いソケット
215
+ // イベントはこの gen が stale になり、状態を書き換えない(_onOpen ほかが
216
+ // _socketGen と this._gen を突き合わせて判定する)。
217
+ this._socketGen = this._gen;
173
218
  try {
174
219
  this._ws = this._protocols
175
220
  ? new WebSocket(this._url, this._protocols)
@@ -180,19 +225,25 @@ class WebSocketCore extends EventTarget {
180
225
  this._setError(e);
181
226
  return;
182
227
  }
183
- this._setReadyState(WebSocket.CONNECTING);
228
+ // Binary frames default to Blob; opt into ArrayBuffer for direct byte access.
229
+ this._ws.binaryType = this._binaryType;
230
+ this._setReadyState(WS_CONNECTING);
184
231
  this._ws.addEventListener("open", this._onOpen);
185
232
  this._ws.addEventListener("message", this._onMessage);
186
233
  this._ws.addEventListener("error", this._onError);
187
234
  this._ws.addEventListener("close", this._onClose);
188
235
  }
189
236
  _onOpen = () => {
237
+ if (this._socketGen !== this._gen)
238
+ return;
190
239
  this._reconnectCount = 0;
191
240
  this._setLoading(false);
192
241
  this._setConnected(true);
193
- this._setReadyState(WebSocket.OPEN);
242
+ this._setReadyState(WS_OPEN);
194
243
  };
195
244
  _onMessage = (event) => {
245
+ if (this._socketGen !== this._gen)
246
+ return;
196
247
  let data = event.data;
197
248
  // JSONの自動パース
198
249
  if (typeof data === "string") {
@@ -206,23 +257,31 @@ class WebSocketCore extends EventTarget {
206
257
  this._setMessage(data);
207
258
  };
208
259
  _onError = (event) => {
260
+ if (this._socketGen !== this._gen)
261
+ return;
209
262
  this._setError(event);
210
263
  };
211
264
  _onClose = (event) => {
212
265
  this._removeListeners();
213
266
  this._ws = null;
267
+ if (this._socketGen !== this._gen)
268
+ return;
214
269
  this._setConnected(false);
215
270
  this._setLoading(false);
216
- this._setReadyState(WebSocket.CLOSED);
271
+ this._setReadyState(WS_CLOSED);
217
272
  // 異常クローズ時の自動再接続(正常終了 1000 は除外)
218
273
  if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {
219
274
  this._scheduleReconnect();
220
275
  }
221
276
  };
222
277
  _scheduleReconnect() {
278
+ const gen = this._gen;
223
279
  this._clearReconnectTimer();
224
280
  this._reconnectTimer = setTimeout(() => {
225
281
  this._reconnectTimer = null;
282
+ // dispose()/再 connect() でこの再接続が無効化されていたら何もしない。
283
+ if (gen !== this._gen)
284
+ return;
226
285
  this._reconnectCount++;
227
286
  this._doConnect();
228
287
  }, this._reconnectInterval);
@@ -246,7 +305,7 @@ class WebSocketCore extends EventTarget {
246
305
  this._clearReconnectTimer();
247
306
  if (this._ws) {
248
307
  this._removeListeners();
249
- if (this._ws.readyState === WebSocket.OPEN || this._ws.readyState === WebSocket.CONNECTING) {
308
+ if (this._ws.readyState === WS_OPEN || this._ws.readyState === WS_CONNECTING) {
250
309
  this._ws.close();
251
310
  }
252
311
  this._ws = null;
@@ -255,8 +314,8 @@ class WebSocketCore extends EventTarget {
255
314
  if (this._connected) {
256
315
  this._setConnected(false);
257
316
  }
258
- if (this._readyState !== WebSocket.CLOSED) {
259
- this._setReadyState(WebSocket.CLOSED);
317
+ if (this._readyState !== WS_CLOSED) {
318
+ this._setReadyState(WS_CLOSED);
260
319
  }
261
320
  }
262
321
  }
@@ -293,7 +352,7 @@ function registerAutoTrigger() {
293
352
  }
294
353
 
295
354
  class WcsWebSocket extends HTMLElement {
296
- static hasConnectedCallbackPromise = false;
355
+ static hasConnectedCallbackPromise = true;
297
356
  static wcBindable = {
298
357
  ...WebSocketCore.wcBindable,
299
358
  properties: [
@@ -307,6 +366,7 @@ class WcsWebSocket extends HTMLElement {
307
366
  { name: "autoReconnect", attribute: "auto-reconnect" },
308
367
  { name: "reconnectInterval", attribute: "reconnect-interval" },
309
368
  { name: "maxReconnects", attribute: "max-reconnects" },
369
+ { name: "binaryType", attribute: "binary-type" },
310
370
  { name: "manual", attribute: "manual" },
311
371
  { name: "trigger" },
312
372
  { name: "send" },
@@ -320,10 +380,14 @@ class WcsWebSocket extends HTMLElement {
320
380
  static get observedAttributes() { return ["url"]; }
321
381
  _core;
322
382
  _trigger = false;
383
+ _connectedCallbackPromise = Promise.resolve();
323
384
  constructor() {
324
385
  super();
325
386
  this._core = new WebSocketCore(this);
326
387
  }
388
+ get connectedCallbackPromise() {
389
+ return this._connectedCallbackPromise;
390
+ }
327
391
  // --- Attribute accessors ---
328
392
  get url() {
329
393
  return this.getAttribute("url") || "";
@@ -364,6 +428,19 @@ class WcsWebSocket extends HTMLElement {
364
428
  set maxReconnects(value) {
365
429
  this.setAttribute("max-reconnects", String(value));
366
430
  }
431
+ // Incoming binary frame representation. Backed by the `binary-type` attribute;
432
+ // any value other than "arraybuffer" normalizes to the platform default "blob".
433
+ get binaryType() {
434
+ return this.getAttribute("binary-type") === "arraybuffer" ? "arraybuffer" : "blob";
435
+ }
436
+ set binaryType(value) {
437
+ if (value == null) {
438
+ this.removeAttribute("binary-type");
439
+ }
440
+ else {
441
+ this.setAttribute("binary-type", value);
442
+ }
443
+ }
367
444
  get manual() {
368
445
  return this.hasAttribute("manual");
369
446
  }
@@ -427,6 +504,7 @@ class WcsWebSocket extends HTMLElement {
427
504
  autoReconnect: this.autoReconnect,
428
505
  reconnectInterval: this.reconnectInterval,
429
506
  maxReconnects: this.maxReconnects,
507
+ binaryType: this.binaryType,
430
508
  });
431
509
  }
432
510
  sendMessage(data) {
@@ -446,12 +524,16 @@ class WcsWebSocket extends HTMLElement {
446
524
  if (config.autoTrigger) {
447
525
  registerAutoTrigger();
448
526
  }
527
+ // observe() は command-driven node では ready を返す no-op(§3.5)。SSR は
528
+ // connectedCallbackPromise を await して初期スナップショットを取れる。
529
+ this._connectedCallbackPromise = this._core.observe();
449
530
  if (!this.manual && this.url) {
450
531
  this.connect();
451
532
  }
452
533
  }
453
534
  disconnectedCallback() {
454
- this._core.close();
535
+ // dispose() が _gen を bump して進行中のソケット/再接続を無効化し、close() する。
536
+ this._core.dispose();
455
537
  }
456
538
  }
457
539
 
@@ -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 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 type { WcsWebSocket } from \"./components/WebSocket.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\n if (!wsId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWebSocket as a value. The value import created a components/WebSocket.ts ⇄\n // autoTrigger.ts cycle (WcsWebSocket.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-ws> class\n // matches — without the import cycle.\n const WsCtor = customElements.get(config.tagNames.ws);\n const wsElement = document.getElementById(wsId);\n if (!WsCtor || !(wsElement instanceof WsCtor)) return;\n\n event.preventDefault();\n (wsElement as WcsWebSocket).connect();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class WcsWebSocket extends HTMLElement {\n static hasConnectedCallbackPromise = 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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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/config.ts","../src/core/WebSocketCore.ts","../src/autoTrigger.ts","../src/components/WebSocket.ts","../src/registerComponents.ts","../src/bootstrapWebSocket.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n ws: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-wstarget\",\n tagNames: {\n ws: \"wcs-ws\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","import { IWcBindable } from \"../types.js\";\n\n// WebSocket readyState values. Hardcoded rather than read from the global\n// WebSocket so the Core does not require WebSocket to exist at module load\n// (referencing `WebSocket.CLOSED` in a field initializer evaluates at class\n// definition time; tests inject a mock). Mirrors SseCore's SSE_CLOSED.\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\nconst WS_CLOSED = 3;\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\n // How incoming binary frames are surfaced on `message`. \"blob\" (the platform\n // default) or \"arraybuffer\" for direct byte processing. Applied to every\n // socket this connection spawns, including auto-reconnects.\n binaryType?: BinaryType;\n}\n\nexport class WebSocketCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-ws:message\" },\n { name: \"connected\", event: \"wcs-ws:connected-changed\" },\n { name: \"loading\", event: \"wcs-ws:loading-changed\" },\n { name: \"error\", event: \"wcs-ws:error\" },\n { name: \"readyState\", event: \"wcs-ws:readystate-changed\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"send\" },\n { name: \"close\" },\n ],\n };\n\n private _target: EventTarget;\n private _ws: WebSocket | null = null;\n private _message: any = null;\n private _connected: boolean = false;\n private _loading: boolean = false;\n private _error: any = null;\n private _readyState: number = WS_CLOSED;\n\n // 自動再接続\n private _autoReconnect: boolean = false;\n private _reconnectInterval: number = 3000;\n private _maxReconnects: number = Infinity;\n private _reconnectCount: number = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _url: string = \"\";\n private _protocols: string | string[] | undefined = undefined;\n private _binaryType: BinaryType = \"blob\";\n private _intentionalClose: boolean = false;\n\n // Generation guard (§3.4): bumped on dispose() and at every connect(). A socket\n // event (open/message/error/close) or a scheduled reconnect that fires after\n // dispose / a superseding connect() carries a stale `gen` and MUST NOT write\n // state onto a torn-down element. A boolean flag is insufficient (dispose→observe\n // would let stale work slip through).\n private _gen = 0;\n // Generation captured when the current socket was opened. The shared socket\n // event handlers compare it against _gen to drop events from a superseded /\n // disposed connection.\n private _socketGen = 0;\n // SSR (§3.8): WebSocket is command-driven with no asynchronous probe to await,\n // so readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). WebSocket connections are command-driven (connect()), so\n // observe() is an idempotent no-op that resolves once ready; the Shell's\n // connectedCallback does not auto-establish a subscription here. dispose()\n // invalidates any in-flight socket / pending reconnect and closes the socket.\n observe(): Promise<void> {\n return this._ready;\n }\n\n dispose(): void {\n this._gen++;\n this.close();\n }\n\n get message(): any {\n return this._message;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get readyState(): number {\n return this._readyState;\n }\n\n // --- State setters with event dispatch ---\n\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n private _setConnected(connected: boolean): void {\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:connected-changed\", {\n detail: connected,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setReadyState(readyState: number): void {\n this._readyState = readyState;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:readystate-changed\", {\n detail: readyState,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n connect(url: string, options: WebSocketConnectOptions = {}): void {\n // never-throw (§3.6): 引数バリデーション失敗は例外ではなく error プロパティに\n // 流し、サニタイズ値(なにもしない)を返す。command-token 経路(set trigger →\n // connect())からの呼び出しが state 更新サイクルを壊さないようにする。\n if (!url) {\n this._setError({ message: \"url is required.\" });\n return;\n }\n\n // 新しい接続を開始するため世代を更新し、進行中のソケット/再接続を無効化する。\n this._gen++;\n\n // 既存の接続をクローズ\n this._intentionalClose = true;\n this._closeInternal();\n\n this._url = url;\n this._protocols = options.protocols;\n this._autoReconnect = options.autoReconnect ?? false;\n this._reconnectInterval = options.reconnectInterval ?? 3000;\n this._maxReconnects = options.maxReconnects ?? Infinity;\n this._binaryType = options.binaryType ?? \"blob\";\n this._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n // never-throw (§3.6): 未接続での送信は例外ではなく error に流す。set send の\n // fire-and-forget 経路で例外が伝播するのを防ぐ。\n if (!this._ws || this._ws.readyState !== WS_OPEN) {\n this._setError({ message: \"WebSocket is not connected.\" });\n return;\n }\n this._ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._intentionalClose = true;\n this._clearReconnectTimer();\n if (this._ws) {\n this._ws.close(code, reason);\n }\n }\n\n // --- Internal ---\n\n private _doConnect(): void {\n this._setLoading(true);\n this._setError(null);\n\n // 接続開始時点の世代を捕捉。dispose()/再 connect() 後に発火した古いソケット\n // イベントはこの gen が stale になり、状態を書き換えない(_onOpen ほかが\n // _socketGen と this._gen を突き合わせて判定する)。\n this._socketGen = this._gen;\n\n try {\n this._ws = this._protocols\n ? new WebSocket(this._url, this._protocols)\n : new WebSocket(this._url);\n } catch (e) {\n this._setLoading(false);\n this._setError(e);\n return;\n }\n\n // Binary frames default to Blob; opt into ArrayBuffer for direct byte access.\n this._ws.binaryType = this._binaryType;\n\n this._setReadyState(WS_CONNECTING);\n\n this._ws.addEventListener(\"open\", this._onOpen);\n this._ws.addEventListener(\"message\", this._onMessage);\n this._ws.addEventListener(\"error\", this._onError);\n this._ws.addEventListener(\"close\", this._onClose);\n }\n\n private _onOpen = (): void => {\n if (this._socketGen !== this._gen) return;\n this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WS_OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\n if (this._socketGen !== this._gen) return;\n let data = event.data;\n // JSONの自動パース\n if (typeof data === \"string\") {\n try {\n data = JSON.parse(data);\n } catch {\n // テキストのまま\n }\n }\n this._setMessage(data);\n };\n\n private _onError = (event: Event): void => {\n if (this._socketGen !== this._gen) return;\n this._setError(event);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n if (this._socketGen !== this._gen) return;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WS_CLOSED);\n\n // 異常クローズ時の自動再接続(正常終了 1000 は除外)\n if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {\n this._scheduleReconnect();\n }\n };\n\n private _scheduleReconnect(): void {\n const gen = this._gen;\n this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n // dispose()/再 connect() でこの再接続が無効化されていたら何もしない。\n if (gen !== this._gen) return;\n this._reconnectCount++;\n this._doConnect();\n }, this._reconnectInterval);\n }\n\n private _clearReconnectTimer(): void {\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n private _removeListeners(): void {\n if (!this._ws) {\n return;\n }\n\n this._ws.removeEventListener(\"open\", this._onOpen);\n this._ws.removeEventListener(\"message\", this._onMessage);\n this._ws.removeEventListener(\"error\", this._onError);\n this._ws.removeEventListener(\"close\", this._onClose);\n }\n\n private _closeInternal(): void {\n this._clearReconnectTimer();\n if (this._ws) {\n this._removeListeners();\n if (this._ws.readyState === WS_OPEN || this._ws.readyState === WS_CONNECTING) {\n this._ws.close();\n }\n this._ws = null;\n }\n // 旧接続の状態をリセット(コンストラクタ例外時に stale 状態が残るのを防止)\n if (this._connected) {\n this._setConnected(false);\n }\n if (this._readyState !== WS_CLOSED) {\n this._setReadyState(WS_CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWebSocket } from \"./components/WebSocket.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\n if (!wsId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWebSocket as a value. The value import created a components/WebSocket.ts ⇄\n // autoTrigger.ts cycle (WcsWebSocket.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-ws> class\n // matches — without the import cycle.\n const WsCtor = customElements.get(config.tagNames.ws);\n const wsElement = document.getElementById(wsId);\n if (!WsCtor || !(wsElement instanceof WsCtor)) return;\n\n event.preventDefault();\n (wsElement as WcsWebSocket).connect();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class WcsWebSocket extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WebSocketCore.wcBindable,\n properties: [\n ...WebSocketCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-ws:trigger-changed\" },\n { name: \"send\", event: \"wcs-ws:send-changed\" },\n ],\n inputs: [\n { name: \"url\", attribute: \"url\" },\n { name: \"protocols\", attribute: \"protocols\" },\n { name: \"autoReconnect\", attribute: \"auto-reconnect\" },\n { name: \"reconnectInterval\", attribute: \"reconnect-interval\" },\n { name: \"maxReconnects\", attribute: \"max-reconnects\" },\n { name: \"binaryType\", attribute: \"binary-type\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n { name: \"send\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"sendMessage\" },\n { name: \"close\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: WebSocketCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n\n constructor() {\n super();\n this._core = new WebSocketCore(this);\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Attribute accessors ---\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get protocols(): string {\n return this.getAttribute(\"protocols\") || \"\";\n }\n\n set protocols(value: string) {\n this.setAttribute(\"protocols\", value);\n }\n\n get autoReconnect(): boolean {\n return this.hasAttribute(\"auto-reconnect\");\n }\n\n set autoReconnect(value: boolean) {\n if (value) {\n this.setAttribute(\"auto-reconnect\", \"\");\n } else {\n this.removeAttribute(\"auto-reconnect\");\n }\n }\n\n get reconnectInterval(): number {\n const attr = this.getAttribute(\"reconnect-interval\");\n const parsed = attr ? parseInt(attr, 10) : 3000;\n return Number.isNaN(parsed) ? 3000 : parsed;\n }\n\n set reconnectInterval(value: number) {\n this.setAttribute(\"reconnect-interval\", String(value));\n }\n\n get maxReconnects(): number {\n const attr = this.getAttribute(\"max-reconnects\");\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxReconnects(value: number) {\n this.setAttribute(\"max-reconnects\", String(value));\n }\n\n // Incoming binary frame representation. Backed by the `binary-type` attribute;\n // any value other than \"arraybuffer\" normalizes to the platform default \"blob\".\n get binaryType(): BinaryType {\n return this.getAttribute(\"binary-type\") === \"arraybuffer\" ? \"arraybuffer\" : \"blob\";\n }\n\n set binaryType(value: string | null) {\n if (value == null) {\n this.removeAttribute(\"binary-type\");\n } else {\n this.setAttribute(\"binary-type\", value);\n }\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get connected(): boolean {\n return this._core.connected;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get readyState(): number {\n return this._core.readyState;\n }\n\n // --- Command properties ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.connect();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-ws:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n set send(data: any) {\n if (data === null || data === undefined) return;\n const payload = typeof data === \"string\" ? data : JSON.stringify(data);\n this._core.send(payload);\n this.dispatchEvent(new CustomEvent(\"wcs-ws:send-changed\", {\n detail: null,\n bubbles: true,\n }));\n }\n\n // --- Public methods ---\n\n connect(): void {\n const protocols = this.protocols\n ? this.protocols.split(\",\").map(p => p.trim()).filter(Boolean)\n : undefined;\n\n this._core.connect(this.url, {\n protocols: protocols && protocols.length === 1 ? protocols[0] : protocols,\n autoReconnect: this.autoReconnect,\n reconnectInterval: this.reconnectInterval,\n maxReconnects: this.maxReconnects,\n binaryType: this.binaryType,\n });\n }\n\n sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n this._core.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._core.close(code, reason);\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.connect();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // observe() は command-driven node では ready を返す no-op(§3.5)。SSR は\n // connectedCallbackPromise を await して初期スナップショットを取れる。\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n // dispose() が _gen を bump して進行中のソケット/再接続を無効化し、close() する。\n this._core.dispose();\n }\n}\n","import { WcsWebSocket } from \"./components/WebSocket.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.ws)) {\n customElements.define(config.tagNames.ws, WcsWebSocket);\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWebSocket(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n"],"names":[],"mappings":"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"}
@@ -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 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=customElements.get(r.tagNames.ws),c=document.getElementById(s);o&&c instanceof o&&(e.preventDefault(),c.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};
1
+ const e={autoTrigger:!0,triggerAttribute:"data-wstarget",tagNames:{ws:"wcs-ws"}};function t(e){if(null===e||"object"!=typeof e)return e;Object.freeze(e);for(const s of Object.keys(e))t(e[s]);return e}function s(e){if(null===e||"object"!=typeof e)return e;const t={};for(const n of Object.keys(e))t[n]=s(e[n]);return t}let n=null;const r=e;function i(){return n||(n=t(s(e))),n}class o extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"message",event:"wcs-ws:message"},{name:"connected",event:"wcs-ws:connected-changed"},{name:"loading",event:"wcs-ws:loading-changed"},{name:"error",event:"wcs-ws:error"},{name:"readyState",event:"wcs-ws:readystate-changed"}],commands:[{name:"connect"},{name:"send"},{name:"close"}]};_target;_ws=null;_message=null;_connected=!1;_loading=!1;_error=null;_readyState=3;_autoReconnect=!1;_reconnectInterval=3e3;_maxReconnects=1/0;_reconnectCount=0;_reconnectTimer=null;_url="";_protocols=void 0;_binaryType="blob";_intentionalClose=!1;_gen=0;_socketGen=0;_ready=Promise.resolve();constructor(e){super(),this._target=e??this}get ready(){return this._ready}observe(){return this._ready}dispose(){this._gen++,this.close()}get message(){return this._message}get connected(){return this._connected}get loading(){return this._loading}get error(){return this._error}get readyState(){return this._readyState}_setMessage(e){this._message=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:message",{detail:e,bubbles:!0}))}_setConnected(e){this._connected=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:connected-changed",{detail:e,bubbles:!0}))}_setLoading(e){this._loading=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:loading-changed",{detail:e,bubbles:!0}))}_setError(e){this._error=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:error",{detail:e,bubbles:!0}))}_setReadyState(e){this._readyState=e,this._target.dispatchEvent(new CustomEvent("wcs-ws:readystate-changed",{detail:e,bubbles:!0}))}connect(e,t={}){e?(this._gen++,this._intentionalClose=!0,this._closeInternal(),this._url=e,this._protocols=t.protocols,this._autoReconnect=t.autoReconnect??!1,this._reconnectInterval=t.reconnectInterval??3e3,this._maxReconnects=t.maxReconnects??1/0,this._binaryType=t.binaryType??"blob",this._reconnectCount=0,this._intentionalClose=!1,this._doConnect()):this._setError({message:"url is required."})}send(e){this._ws&&1===this._ws.readyState?this._ws.send(e):this._setError({message:"WebSocket is not connected."})}close(e,t){this._intentionalClose=!0,this._clearReconnectTimer(),this._ws&&this._ws.close(e,t)}_doConnect(){this._setLoading(!0),this._setError(null),this._socketGen=this._gen;try{this._ws=this._protocols?new WebSocket(this._url,this._protocols):new WebSocket(this._url)}catch(e){return this._setLoading(!1),void this._setError(e)}this._ws.binaryType=this._binaryType,this._setReadyState(0),this._ws.addEventListener("open",this._onOpen),this._ws.addEventListener("message",this._onMessage),this._ws.addEventListener("error",this._onError),this._ws.addEventListener("close",this._onClose)}_onOpen=()=>{this._socketGen===this._gen&&(this._reconnectCount=0,this._setLoading(!1),this._setConnected(!0),this._setReadyState(1))};_onMessage=e=>{if(this._socketGen!==this._gen)return;let t=e.data;if("string"==typeof t)try{t=JSON.parse(t)}catch{}this._setMessage(t)};_onError=e=>{this._socketGen===this._gen&&this._setError(e)};_onClose=e=>{this._removeListeners(),this._ws=null,this._socketGen===this._gen&&(this._setConnected(!1),this._setLoading(!1),this._setReadyState(3),!this._intentionalClose&&this._autoReconnect&&1e3!==e.code&&this._reconnectCount<this._maxReconnects&&this._scheduleReconnect())};_scheduleReconnect(){const e=this._gen;this._clearReconnectTimer(),this._reconnectTimer=setTimeout(()=>{this._reconnectTimer=null,e===this._gen&&(this._reconnectCount++,this._doConnect())},this._reconnectInterval)}_clearReconnectTimer(){null!==this._reconnectTimer&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null)}_removeListeners(){this._ws&&(this._ws.removeEventListener("open",this._onOpen),this._ws.removeEventListener("message",this._onMessage),this._ws.removeEventListener("error",this._onError),this._ws.removeEventListener("close",this._onClose))}_closeInternal(){this._clearReconnectTimer(),this._ws&&(this._removeListeners(),1!==this._ws.readyState&&0!==this._ws.readyState||this._ws.close(),this._ws=null),this._connected&&this._setConnected(!1),3!==this._readyState&&this._setReadyState(3)}}let c=!1;function a(e){const t=e.target;if(!(t instanceof Element))return;const s=t.closest(`[${r.triggerAttribute}]`);if(!s)return;const n=s.getAttribute(r.triggerAttribute);if(!n)return;const i=customElements.get(r.tagNames.ws),o=document.getElementById(n);i&&o instanceof i&&(e.preventDefault(),o.connect())}class h extends HTMLElement{static hasConnectedCallbackPromise=!0;static wcBindable={...o.wcBindable,properties:[...o.wcBindable.properties,{name:"trigger",event:"wcs-ws:trigger-changed"},{name:"send",event:"wcs-ws:send-changed"}],inputs:[{name:"url",attribute:"url"},{name:"protocols",attribute:"protocols"},{name:"autoReconnect",attribute:"auto-reconnect"},{name:"reconnectInterval",attribute:"reconnect-interval"},{name:"maxReconnects",attribute:"max-reconnects"},{name:"binaryType",attribute:"binary-type"},{name:"manual",attribute:"manual"},{name:"trigger"},{name:"send"}],commands:[{name:"connect"},{name:"sendMessage"},{name:"close"}]};static get observedAttributes(){return["url"]}_core;_trigger=!1;_connectedCallbackPromise=Promise.resolve();constructor(){super(),this._core=new o(this)}get connectedCallbackPromise(){return this._connectedCallbackPromise}get url(){return this.getAttribute("url")||""}set url(e){this.setAttribute("url",e)}get protocols(){return this.getAttribute("protocols")||""}set protocols(e){this.setAttribute("protocols",e)}get autoReconnect(){return this.hasAttribute("auto-reconnect")}set autoReconnect(e){e?this.setAttribute("auto-reconnect",""):this.removeAttribute("auto-reconnect")}get reconnectInterval(){const e=this.getAttribute("reconnect-interval"),t=e?parseInt(e,10):3e3;return Number.isNaN(t)?3e3:t}set reconnectInterval(e){this.setAttribute("reconnect-interval",String(e))}get maxReconnects(){const e=this.getAttribute("max-reconnects"),t=e?parseInt(e,10):1/0;return Number.isNaN(t)?1/0:t}set maxReconnects(e){this.setAttribute("max-reconnects",String(e))}get binaryType(){return"arraybuffer"===this.getAttribute("binary-type")?"arraybuffer":"blob"}set binaryType(e){null==e?this.removeAttribute("binary-type"):this.setAttribute("binary-type",e)}get manual(){return this.hasAttribute("manual")}set manual(e){e?this.setAttribute("manual",""):this.removeAttribute("manual")}get message(){return this._core.message}get connected(){return this._core.connected}get loading(){return this._core.loading}get error(){return this._core.error}get readyState(){return this._core.readyState}get trigger(){return this._trigger}set trigger(e){!!e&&(this._trigger=!0,this.connect(),this._trigger=!1,this.dispatchEvent(new CustomEvent("wcs-ws:trigger-changed",{detail:!1,bubbles:!0})))}set send(e){if(null==e)return;const t="string"==typeof e?e:JSON.stringify(e);this._core.send(t),this.dispatchEvent(new CustomEvent("wcs-ws:send-changed",{detail:null,bubbles:!0}))}connect(){const e=this.protocols?this.protocols.split(",").map(e=>e.trim()).filter(Boolean):void 0;this._core.connect(this.url,{protocols:e&&1===e.length?e[0]:e,autoReconnect:this.autoReconnect,reconnectInterval:this.reconnectInterval,maxReconnects:this.maxReconnects,binaryType:this.binaryType})}sendMessage(e){this._core.send(e)}close(e,t){this._core.close(e,t)}attributeChangedCallback(e,t,s){"url"===e&&this.isConnected&&!this.manual&&s&&this.connect()}connectedCallback(){this.style.display="none",r.autoTrigger&&(c||(c=!0,document.addEventListener("click",a))),this._connectedCallbackPromise=this._core.observe(),!this.manual&&this.url&&this.connect()}disconnectedCallback(){this._core.dispose()}}function l(t){var s;t&&("boolean"==typeof(s=t).autoTrigger&&(e.autoTrigger=s.autoTrigger),"string"==typeof s.triggerAttribute&&(e.triggerAttribute=s.triggerAttribute),s.tagNames&&Object.assign(e.tagNames,s.tagNames),n=null),customElements.get(r.tagNames.ws)||customElements.define(r.tagNames.ws,h)}export{h as WcsWebSocket,o as WebSocketCore,l as bootstrapWebSocket,i as getConfig};
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 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 type { WcsWebSocket } from \"./components/WebSocket.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\n if (!wsId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWebSocket as a value. The value import created a components/WebSocket.ts ⇄\n // autoTrigger.ts cycle (WcsWebSocket.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-ws> class\n // matches — without the import cycle.\n const WsCtor = customElements.get(config.tagNames.ws);\n const wsElement = document.getElementById(wsId);\n if (!WsCtor || !(wsElement instanceof WsCtor)) return;\n\n event.preventDefault();\n (wsElement as WcsWebSocket).connect();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class WcsWebSocket extends HTMLElement {\n static hasConnectedCallbackPromise = 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","WsCtor","customElements","get","wsElement","document","getElementById","preventDefault","WcsWebSocket","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","define"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.min.js","sources":["../src/config.ts","../src/core/WebSocketCore.ts","../src/autoTrigger.ts","../src/components/WebSocket.ts","../src/bootstrapWebSocket.ts","../src/registerComponents.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\ninterface IInternalConfig extends IConfig {\n autoTrigger: boolean;\n triggerAttribute: string;\n tagNames: {\n ws: string;\n };\n}\n\nconst _config: IInternalConfig = {\n autoTrigger: true,\n triggerAttribute: \"data-wstarget\",\n tagNames: {\n ws: \"wcs-ws\",\n },\n};\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n Object.freeze(obj);\n for (const key of Object.keys(obj)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n return obj;\n}\n\nfunction deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") return obj;\n const clone: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return clone as T;\n}\n\nlet frozenConfig: IConfig | null = null;\n\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n if (!frozenConfig) {\n frozenConfig = deepFreeze(deepClone(_config));\n }\n return frozenConfig;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (typeof partialConfig.autoTrigger === \"boolean\") {\n _config.autoTrigger = partialConfig.autoTrigger;\n }\n if (typeof partialConfig.triggerAttribute === \"string\") {\n _config.triggerAttribute = partialConfig.triggerAttribute;\n }\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n frozenConfig = null;\n}\n","import { IWcBindable } from \"../types.js\";\n\n// WebSocket readyState values. Hardcoded rather than read from the global\n// WebSocket so the Core does not require WebSocket to exist at module load\n// (referencing `WebSocket.CLOSED` in a field initializer evaluates at class\n// definition time; tests inject a mock). Mirrors SseCore's SSE_CLOSED.\nconst WS_CONNECTING = 0;\nconst WS_OPEN = 1;\nconst WS_CLOSED = 3;\n\nexport interface WebSocketConnectOptions {\n protocols?: string | string[];\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnects?: number;\n // How incoming binary frames are surfaced on `message`. \"blob\" (the platform\n // default) or \"arraybuffer\" for direct byte processing. Applied to every\n // socket this connection spawns, including auto-reconnects.\n binaryType?: BinaryType;\n}\n\nexport class WebSocketCore extends EventTarget {\n static wcBindable: IWcBindable = {\n protocol: \"wc-bindable\",\n version: 1,\n properties: [\n { name: \"message\", event: \"wcs-ws:message\" },\n { name: \"connected\", event: \"wcs-ws:connected-changed\" },\n { name: \"loading\", event: \"wcs-ws:loading-changed\" },\n { name: \"error\", event: \"wcs-ws:error\" },\n { name: \"readyState\", event: \"wcs-ws:readystate-changed\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"send\" },\n { name: \"close\" },\n ],\n };\n\n private _target: EventTarget;\n private _ws: WebSocket | null = null;\n private _message: any = null;\n private _connected: boolean = false;\n private _loading: boolean = false;\n private _error: any = null;\n private _readyState: number = WS_CLOSED;\n\n // 自動再接続\n private _autoReconnect: boolean = false;\n private _reconnectInterval: number = 3000;\n private _maxReconnects: number = Infinity;\n private _reconnectCount: number = 0;\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private _url: string = \"\";\n private _protocols: string | string[] | undefined = undefined;\n private _binaryType: BinaryType = \"blob\";\n private _intentionalClose: boolean = false;\n\n // Generation guard (§3.4): bumped on dispose() and at every connect(). A socket\n // event (open/message/error/close) or a scheduled reconnect that fires after\n // dispose / a superseding connect() carries a stale `gen` and MUST NOT write\n // state onto a torn-down element. A boolean flag is insufficient (dispose→observe\n // would let stale work slip through).\n private _gen = 0;\n // Generation captured when the current socket was opened. The shared socket\n // event handlers compare it against _gen to drop events from a superseded /\n // disposed connection.\n private _socketGen = 0;\n // SSR (§3.8): WebSocket is command-driven with no asynchronous probe to await,\n // so readiness is immediate.\n private _ready: Promise<void> = Promise.resolve();\n\n constructor(target?: EventTarget) {\n super();\n this._target = target ?? this;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n // Lifecycle (§3.5). WebSocket connections are command-driven (connect()), so\n // observe() is an idempotent no-op that resolves once ready; the Shell's\n // connectedCallback does not auto-establish a subscription here. dispose()\n // invalidates any in-flight socket / pending reconnect and closes the socket.\n observe(): Promise<void> {\n return this._ready;\n }\n\n dispose(): void {\n this._gen++;\n this.close();\n }\n\n get message(): any {\n return this._message;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n get error(): any {\n return this._error;\n }\n\n get readyState(): number {\n return this._readyState;\n }\n\n // --- State setters with event dispatch ---\n\n private _setMessage(message: any): void {\n this._message = message;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:message\", {\n detail: message,\n bubbles: true,\n }));\n }\n\n private _setConnected(connected: boolean): void {\n this._connected = connected;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:connected-changed\", {\n detail: connected,\n bubbles: true,\n }));\n }\n\n private _setLoading(loading: boolean): void {\n this._loading = loading;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:loading-changed\", {\n detail: loading,\n bubbles: true,\n }));\n }\n\n private _setError(error: any): void {\n this._error = error;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error\", {\n detail: error,\n bubbles: true,\n }));\n }\n\n private _setReadyState(readyState: number): void {\n this._readyState = readyState;\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:readystate-changed\", {\n detail: readyState,\n bubbles: true,\n }));\n }\n\n // --- Public API ---\n\n connect(url: string, options: WebSocketConnectOptions = {}): void {\n // never-throw (§3.6): 引数バリデーション失敗は例外ではなく error プロパティに\n // 流し、サニタイズ値(なにもしない)を返す。command-token 経路(set trigger →\n // connect())からの呼び出しが state 更新サイクルを壊さないようにする。\n if (!url) {\n this._setError({ message: \"url is required.\" });\n return;\n }\n\n // 新しい接続を開始するため世代を更新し、進行中のソケット/再接続を無効化する。\n this._gen++;\n\n // 既存の接続をクローズ\n this._intentionalClose = true;\n this._closeInternal();\n\n this._url = url;\n this._protocols = options.protocols;\n this._autoReconnect = options.autoReconnect ?? false;\n this._reconnectInterval = options.reconnectInterval ?? 3000;\n this._maxReconnects = options.maxReconnects ?? Infinity;\n this._binaryType = options.binaryType ?? \"blob\";\n this._reconnectCount = 0;\n this._intentionalClose = false;\n\n this._doConnect();\n }\n\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n // never-throw (§3.6): 未接続での送信は例外ではなく error に流す。set send の\n // fire-and-forget 経路で例外が伝播するのを防ぐ。\n if (!this._ws || this._ws.readyState !== WS_OPEN) {\n this._setError({ message: \"WebSocket is not connected.\" });\n return;\n }\n this._ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._intentionalClose = true;\n this._clearReconnectTimer();\n if (this._ws) {\n this._ws.close(code, reason);\n }\n }\n\n // --- Internal ---\n\n private _doConnect(): void {\n this._setLoading(true);\n this._setError(null);\n\n // 接続開始時点の世代を捕捉。dispose()/再 connect() 後に発火した古いソケット\n // イベントはこの gen が stale になり、状態を書き換えない(_onOpen ほかが\n // _socketGen と this._gen を突き合わせて判定する)。\n this._socketGen = this._gen;\n\n try {\n this._ws = this._protocols\n ? new WebSocket(this._url, this._protocols)\n : new WebSocket(this._url);\n } catch (e) {\n this._setLoading(false);\n this._setError(e);\n return;\n }\n\n // Binary frames default to Blob; opt into ArrayBuffer for direct byte access.\n this._ws.binaryType = this._binaryType;\n\n this._setReadyState(WS_CONNECTING);\n\n this._ws.addEventListener(\"open\", this._onOpen);\n this._ws.addEventListener(\"message\", this._onMessage);\n this._ws.addEventListener(\"error\", this._onError);\n this._ws.addEventListener(\"close\", this._onClose);\n }\n\n private _onOpen = (): void => {\n if (this._socketGen !== this._gen) return;\n this._reconnectCount = 0;\n this._setLoading(false);\n this._setConnected(true);\n this._setReadyState(WS_OPEN);\n };\n\n private _onMessage = (event: MessageEvent): void => {\n if (this._socketGen !== this._gen) return;\n let data = event.data;\n // JSONの自動パース\n if (typeof data === \"string\") {\n try {\n data = JSON.parse(data);\n } catch {\n // テキストのまま\n }\n }\n this._setMessage(data);\n };\n\n private _onError = (event: Event): void => {\n if (this._socketGen !== this._gen) return;\n this._setError(event);\n };\n\n private _onClose = (event: CloseEvent): void => {\n this._removeListeners();\n this._ws = null;\n if (this._socketGen !== this._gen) return;\n this._setConnected(false);\n this._setLoading(false);\n this._setReadyState(WS_CLOSED);\n\n // 異常クローズ時の自動再接続(正常終了 1000 は除外)\n if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {\n this._scheduleReconnect();\n }\n };\n\n private _scheduleReconnect(): void {\n const gen = this._gen;\n this._clearReconnectTimer();\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n // dispose()/再 connect() でこの再接続が無効化されていたら何もしない。\n if (gen !== this._gen) return;\n this._reconnectCount++;\n this._doConnect();\n }, this._reconnectInterval);\n }\n\n private _clearReconnectTimer(): void {\n if (this._reconnectTimer !== null) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n private _removeListeners(): void {\n if (!this._ws) {\n return;\n }\n\n this._ws.removeEventListener(\"open\", this._onOpen);\n this._ws.removeEventListener(\"message\", this._onMessage);\n this._ws.removeEventListener(\"error\", this._onError);\n this._ws.removeEventListener(\"close\", this._onClose);\n }\n\n private _closeInternal(): void {\n this._clearReconnectTimer();\n if (this._ws) {\n this._removeListeners();\n if (this._ws.readyState === WS_OPEN || this._ws.readyState === WS_CONNECTING) {\n this._ws.close();\n }\n this._ws = null;\n }\n // 旧接続の状態をリセット(コンストラクタ例外時に stale 状態が残るのを防止)\n if (this._connected) {\n this._setConnected(false);\n }\n if (this._readyState !== WS_CLOSED) {\n this._setReadyState(WS_CLOSED);\n }\n }\n}\n","import { config } from \"./config.js\";\nimport type { WcsWebSocket } from \"./components/WebSocket.js\";\n\nlet registered = false;\n\nfunction handleClick(event: Event): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\n if (!triggerElement) return;\n\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\n if (!wsId) return;\n\n // Resolve the registered constructor at call time instead of importing\n // WcsWebSocket as a value. The value import created a components/WebSocket.ts ⇄\n // autoTrigger.ts cycle (WcsWebSocket.connectedCallback() calls\n // registerAutoTrigger()). instanceof against the customElements registry keeps\n // the exact same identity guarantee — only the registered <wcs-ws> class\n // matches — without the import cycle.\n const WsCtor = customElements.get(config.tagNames.ws);\n const wsElement = document.getElementById(wsId);\n if (!WsCtor || !(wsElement instanceof WsCtor)) return;\n\n event.preventDefault();\n (wsElement as WcsWebSocket).connect();\n}\n\nexport function registerAutoTrigger(): void {\n if (registered) return;\n registered = true;\n document.addEventListener(\"click\", handleClick);\n}\n\nexport function unregisterAutoTrigger(): void {\n if (!registered) return;\n registered = false;\n document.removeEventListener(\"click\", handleClick);\n}\n","import { config } from \"../config.js\";\nimport { IWcBindable } from \"../types.js\";\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\n\nexport class WcsWebSocket extends HTMLElement {\n static hasConnectedCallbackPromise = true;\n static wcBindable: IWcBindable = {\n ...WebSocketCore.wcBindable,\n properties: [\n ...WebSocketCore.wcBindable.properties,\n { name: \"trigger\", event: \"wcs-ws:trigger-changed\" },\n { name: \"send\", event: \"wcs-ws:send-changed\" },\n ],\n inputs: [\n { name: \"url\", attribute: \"url\" },\n { name: \"protocols\", attribute: \"protocols\" },\n { name: \"autoReconnect\", attribute: \"auto-reconnect\" },\n { name: \"reconnectInterval\", attribute: \"reconnect-interval\" },\n { name: \"maxReconnects\", attribute: \"max-reconnects\" },\n { name: \"binaryType\", attribute: \"binary-type\" },\n { name: \"manual\", attribute: \"manual\" },\n { name: \"trigger\" },\n { name: \"send\" },\n ],\n commands: [\n { name: \"connect\" },\n { name: \"sendMessage\" },\n { name: \"close\" },\n ],\n };\n static get observedAttributes(): string[] { return [\"url\"]; }\n\n private _core: WebSocketCore;\n private _trigger: boolean = false;\n private _connectedCallbackPromise: Promise<void> = Promise.resolve();\n\n constructor() {\n super();\n this._core = new WebSocketCore(this);\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n // --- Attribute accessors ---\n\n get url(): string {\n return this.getAttribute(\"url\") || \"\";\n }\n\n set url(value: string) {\n this.setAttribute(\"url\", value);\n }\n\n get protocols(): string {\n return this.getAttribute(\"protocols\") || \"\";\n }\n\n set protocols(value: string) {\n this.setAttribute(\"protocols\", value);\n }\n\n get autoReconnect(): boolean {\n return this.hasAttribute(\"auto-reconnect\");\n }\n\n set autoReconnect(value: boolean) {\n if (value) {\n this.setAttribute(\"auto-reconnect\", \"\");\n } else {\n this.removeAttribute(\"auto-reconnect\");\n }\n }\n\n get reconnectInterval(): number {\n const attr = this.getAttribute(\"reconnect-interval\");\n const parsed = attr ? parseInt(attr, 10) : 3000;\n return Number.isNaN(parsed) ? 3000 : parsed;\n }\n\n set reconnectInterval(value: number) {\n this.setAttribute(\"reconnect-interval\", String(value));\n }\n\n get maxReconnects(): number {\n const attr = this.getAttribute(\"max-reconnects\");\n const parsed = attr ? parseInt(attr, 10) : Infinity;\n return Number.isNaN(parsed) ? Infinity : parsed;\n }\n\n set maxReconnects(value: number) {\n this.setAttribute(\"max-reconnects\", String(value));\n }\n\n // Incoming binary frame representation. Backed by the `binary-type` attribute;\n // any value other than \"arraybuffer\" normalizes to the platform default \"blob\".\n get binaryType(): BinaryType {\n return this.getAttribute(\"binary-type\") === \"arraybuffer\" ? \"arraybuffer\" : \"blob\";\n }\n\n set binaryType(value: string | null) {\n if (value == null) {\n this.removeAttribute(\"binary-type\");\n } else {\n this.setAttribute(\"binary-type\", value);\n }\n }\n\n get manual(): boolean {\n return this.hasAttribute(\"manual\");\n }\n\n set manual(value: boolean) {\n if (value) {\n this.setAttribute(\"manual\", \"\");\n } else {\n this.removeAttribute(\"manual\");\n }\n }\n\n // --- Core delegated getters ---\n\n get message(): any {\n return this._core.message;\n }\n\n get connected(): boolean {\n return this._core.connected;\n }\n\n get loading(): boolean {\n return this._core.loading;\n }\n\n get error(): any {\n return this._core.error;\n }\n\n get readyState(): number {\n return this._core.readyState;\n }\n\n // --- Command properties ---\n\n get trigger(): boolean {\n return this._trigger;\n }\n\n set trigger(value: boolean) {\n const v = !!value;\n if (v) {\n this._trigger = true;\n this.connect();\n this._trigger = false;\n this.dispatchEvent(new CustomEvent(\"wcs-ws:trigger-changed\", {\n detail: false,\n bubbles: true,\n }));\n }\n }\n\n set send(data: any) {\n if (data === null || data === undefined) return;\n const payload = typeof data === \"string\" ? data : JSON.stringify(data);\n this._core.send(payload);\n this.dispatchEvent(new CustomEvent(\"wcs-ws:send-changed\", {\n detail: null,\n bubbles: true,\n }));\n }\n\n // --- Public methods ---\n\n connect(): void {\n const protocols = this.protocols\n ? this.protocols.split(\",\").map(p => p.trim()).filter(Boolean)\n : undefined;\n\n this._core.connect(this.url, {\n protocols: protocols && protocols.length === 1 ? protocols[0] : protocols,\n autoReconnect: this.autoReconnect,\n reconnectInterval: this.reconnectInterval,\n maxReconnects: this.maxReconnects,\n binaryType: this.binaryType,\n });\n }\n\n sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\n this._core.send(data);\n }\n\n close(code?: number, reason?: string): void {\n this._core.close(code, reason);\n }\n\n // --- Lifecycle ---\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\n this.connect();\n }\n }\n\n connectedCallback(): void {\n this.style.display = \"none\";\n if (config.autoTrigger) {\n registerAutoTrigger();\n }\n // observe() は command-driven node では ready を返す no-op(§3.5)。SSR は\n // connectedCallbackPromise を await して初期スナップショットを取れる。\n this._connectedCallbackPromise = this._core.observe();\n if (!this.manual && this.url) {\n this.connect();\n }\n }\n\n disconnectedCallback(): void {\n // dispose() が _gen を bump して進行中のソケット/再接続を無効化し、close() する。\n this._core.dispose();\n }\n}\n","import { setConfig } from \"./config.js\";\nimport { registerComponents } from \"./registerComponents.js\";\nimport { IWritableConfig } from \"./types.js\";\n\nexport function bootstrapWebSocket(userConfig?: IWritableConfig): void {\n if (userConfig) {\n setConfig(userConfig);\n }\n registerComponents();\n}\n","import { WcsWebSocket } from \"./components/WebSocket.js\";\nimport { config } from \"./config.js\";\n\nexport function registerComponents(): void {\n if (!customElements.get(config.tagNames.ws)) {\n customElements.define(config.tagNames.ws, WcsWebSocket);\n }\n}\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","ws","deepFreeze","obj","Object","freeze","key","keys","deepClone","clone","frozenConfig","config","getConfig","WebSocketCore","EventTarget","static","protocol","version","properties","name","event","commands","_target","_ws","_message","_connected","_loading","_error","_readyState","_autoReconnect","_reconnectInterval","_maxReconnects","Infinity","_reconnectCount","_reconnectTimer","_url","_protocols","undefined","_binaryType","_intentionalClose","_gen","_socketGen","_ready","Promise","resolve","constructor","target","super","this","ready","observe","dispose","close","message","connected","loading","error","readyState","_setMessage","dispatchEvent","CustomEvent","detail","bubbles","_setConnected","_setLoading","_setError","_setReadyState","connect","url","options","_closeInternal","protocols","autoReconnect","reconnectInterval","maxReconnects","binaryType","_doConnect","send","data","code","reason","_clearReconnectTimer","WebSocket","e","addEventListener","_onOpen","_onMessage","_onError","_onClose","JSON","parse","_removeListeners","_scheduleReconnect","gen","setTimeout","clearTimeout","removeEventListener","registered","handleClick","Element","triggerElement","closest","wsId","getAttribute","WsCtor","customElements","get","wsElement","document","getElementById","preventDefault","WcsWebSocket","HTMLElement","wcBindable","inputs","attribute","observedAttributes","_core","_trigger","_connectedCallbackPromise","connectedCallbackPromise","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","define"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wcstack/websocket",
3
- "version": "1.13.1",
3
+ "version": "1.15.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",