@wcstack/websocket 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +546 -0
- package/README.md +546 -0
- package/dist/auto.js +3 -0
- package/dist/auto.min.js +3 -0
- package/dist/index.d.ts +141 -0
- package/dist/index.esm.js +440 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.esm.min.js +2 -0
- package/dist/index.esm.min.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
const _config = {
|
|
2
|
+
autoTrigger: true,
|
|
3
|
+
triggerAttribute: "data-wstarget",
|
|
4
|
+
tagNames: {
|
|
5
|
+
ws: "wcs-ws",
|
|
6
|
+
},
|
|
7
|
+
};
|
|
8
|
+
function deepFreeze(obj) {
|
|
9
|
+
if (obj === null || typeof obj !== "object")
|
|
10
|
+
return obj;
|
|
11
|
+
Object.freeze(obj);
|
|
12
|
+
for (const key of Object.keys(obj)) {
|
|
13
|
+
deepFreeze(obj[key]);
|
|
14
|
+
}
|
|
15
|
+
return obj;
|
|
16
|
+
}
|
|
17
|
+
function deepClone(obj) {
|
|
18
|
+
if (obj === null || typeof obj !== "object")
|
|
19
|
+
return obj;
|
|
20
|
+
const clone = {};
|
|
21
|
+
for (const key of Object.keys(obj)) {
|
|
22
|
+
clone[key] = deepClone(obj[key]);
|
|
23
|
+
}
|
|
24
|
+
return clone;
|
|
25
|
+
}
|
|
26
|
+
let frozenConfig = null;
|
|
27
|
+
const config = _config;
|
|
28
|
+
function getConfig() {
|
|
29
|
+
if (!frozenConfig) {
|
|
30
|
+
frozenConfig = deepFreeze(deepClone(_config));
|
|
31
|
+
}
|
|
32
|
+
return frozenConfig;
|
|
33
|
+
}
|
|
34
|
+
function setConfig(partialConfig) {
|
|
35
|
+
if (typeof partialConfig.autoTrigger === "boolean") {
|
|
36
|
+
_config.autoTrigger = partialConfig.autoTrigger;
|
|
37
|
+
}
|
|
38
|
+
if (typeof partialConfig.triggerAttribute === "string") {
|
|
39
|
+
_config.triggerAttribute = partialConfig.triggerAttribute;
|
|
40
|
+
}
|
|
41
|
+
if (partialConfig.tagNames) {
|
|
42
|
+
Object.assign(_config.tagNames, partialConfig.tagNames);
|
|
43
|
+
}
|
|
44
|
+
frozenConfig = null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function raiseError(message) {
|
|
48
|
+
throw new Error(`[@wcstack/websocket] ${message}`);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
class WebSocketCore extends EventTarget {
|
|
52
|
+
static wcBindable = {
|
|
53
|
+
protocol: "wc-bindable",
|
|
54
|
+
version: 1,
|
|
55
|
+
properties: [
|
|
56
|
+
{ name: "message", event: "wcs-ws:message" },
|
|
57
|
+
{ name: "connected", event: "wcs-ws:connected-changed" },
|
|
58
|
+
{ name: "loading", event: "wcs-ws:loading-changed" },
|
|
59
|
+
{ name: "error", event: "wcs-ws:error" },
|
|
60
|
+
{ name: "readyState", event: "wcs-ws:readystate-changed" },
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
_target;
|
|
64
|
+
_ws = null;
|
|
65
|
+
_message = null;
|
|
66
|
+
_connected = false;
|
|
67
|
+
_loading = false;
|
|
68
|
+
_error = null;
|
|
69
|
+
_readyState = WebSocket.CLOSED;
|
|
70
|
+
// 自動再接続
|
|
71
|
+
_autoReconnect = false;
|
|
72
|
+
_reconnectInterval = 3000;
|
|
73
|
+
_maxReconnects = Infinity;
|
|
74
|
+
_reconnectCount = 0;
|
|
75
|
+
_reconnectTimer = null;
|
|
76
|
+
_url = "";
|
|
77
|
+
_protocols = undefined;
|
|
78
|
+
_intentionalClose = false;
|
|
79
|
+
constructor(target) {
|
|
80
|
+
super();
|
|
81
|
+
this._target = target ?? this;
|
|
82
|
+
}
|
|
83
|
+
get message() {
|
|
84
|
+
return this._message;
|
|
85
|
+
}
|
|
86
|
+
get connected() {
|
|
87
|
+
return this._connected;
|
|
88
|
+
}
|
|
89
|
+
get loading() {
|
|
90
|
+
return this._loading;
|
|
91
|
+
}
|
|
92
|
+
get error() {
|
|
93
|
+
return this._error;
|
|
94
|
+
}
|
|
95
|
+
get readyState() {
|
|
96
|
+
return this._readyState;
|
|
97
|
+
}
|
|
98
|
+
// --- State setters with event dispatch ---
|
|
99
|
+
_setMessage(message) {
|
|
100
|
+
this._message = message;
|
|
101
|
+
this._target.dispatchEvent(new CustomEvent("wcs-ws:message", {
|
|
102
|
+
detail: message,
|
|
103
|
+
bubbles: true,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
_setConnected(connected) {
|
|
107
|
+
this._connected = connected;
|
|
108
|
+
this._target.dispatchEvent(new CustomEvent("wcs-ws:connected-changed", {
|
|
109
|
+
detail: connected,
|
|
110
|
+
bubbles: true,
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
_setLoading(loading) {
|
|
114
|
+
this._loading = loading;
|
|
115
|
+
this._target.dispatchEvent(new CustomEvent("wcs-ws:loading-changed", {
|
|
116
|
+
detail: loading,
|
|
117
|
+
bubbles: true,
|
|
118
|
+
}));
|
|
119
|
+
}
|
|
120
|
+
_setError(error) {
|
|
121
|
+
this._error = error;
|
|
122
|
+
this._target.dispatchEvent(new CustomEvent("wcs-ws:error", {
|
|
123
|
+
detail: error,
|
|
124
|
+
bubbles: true,
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
_setReadyState(readyState) {
|
|
128
|
+
this._readyState = readyState;
|
|
129
|
+
this._target.dispatchEvent(new CustomEvent("wcs-ws:readystate-changed", {
|
|
130
|
+
detail: readyState,
|
|
131
|
+
bubbles: true,
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
// --- Public API ---
|
|
135
|
+
connect(url, options = {}) {
|
|
136
|
+
if (!url) {
|
|
137
|
+
raiseError("url is required.");
|
|
138
|
+
}
|
|
139
|
+
// 既存の接続をクローズ
|
|
140
|
+
this._intentionalClose = true;
|
|
141
|
+
this._closeInternal();
|
|
142
|
+
this._url = url;
|
|
143
|
+
this._protocols = options.protocols;
|
|
144
|
+
this._autoReconnect = options.autoReconnect ?? false;
|
|
145
|
+
this._reconnectInterval = options.reconnectInterval ?? 3000;
|
|
146
|
+
this._maxReconnects = options.maxReconnects ?? Infinity;
|
|
147
|
+
this._reconnectCount = 0;
|
|
148
|
+
this._intentionalClose = false;
|
|
149
|
+
this._doConnect();
|
|
150
|
+
}
|
|
151
|
+
send(data) {
|
|
152
|
+
if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {
|
|
153
|
+
raiseError("WebSocket is not connected.");
|
|
154
|
+
}
|
|
155
|
+
this._ws.send(data);
|
|
156
|
+
}
|
|
157
|
+
close(code, reason) {
|
|
158
|
+
this._intentionalClose = true;
|
|
159
|
+
this._clearReconnectTimer();
|
|
160
|
+
if (this._ws) {
|
|
161
|
+
this._ws.close(code, reason);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// --- Internal ---
|
|
165
|
+
_doConnect() {
|
|
166
|
+
this._setLoading(true);
|
|
167
|
+
this._setError(null);
|
|
168
|
+
try {
|
|
169
|
+
this._ws = this._protocols
|
|
170
|
+
? new WebSocket(this._url, this._protocols)
|
|
171
|
+
: new WebSocket(this._url);
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
this._setLoading(false);
|
|
175
|
+
this._setError(e);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
this._setReadyState(WebSocket.CONNECTING);
|
|
179
|
+
this._ws.addEventListener("open", this._onOpen);
|
|
180
|
+
this._ws.addEventListener("message", this._onMessage);
|
|
181
|
+
this._ws.addEventListener("error", this._onError);
|
|
182
|
+
this._ws.addEventListener("close", this._onClose);
|
|
183
|
+
}
|
|
184
|
+
_onOpen = () => {
|
|
185
|
+
this._reconnectCount = 0;
|
|
186
|
+
this._setLoading(false);
|
|
187
|
+
this._setConnected(true);
|
|
188
|
+
this._setReadyState(WebSocket.OPEN);
|
|
189
|
+
};
|
|
190
|
+
_onMessage = (event) => {
|
|
191
|
+
let data = event.data;
|
|
192
|
+
// JSONの自動パース
|
|
193
|
+
if (typeof data === "string") {
|
|
194
|
+
try {
|
|
195
|
+
data = JSON.parse(data);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// テキストのまま
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
this._setMessage(data);
|
|
202
|
+
};
|
|
203
|
+
_onError = (event) => {
|
|
204
|
+
this._setError(event);
|
|
205
|
+
};
|
|
206
|
+
_onClose = (event) => {
|
|
207
|
+
this._removeListeners();
|
|
208
|
+
this._ws = null;
|
|
209
|
+
this._setConnected(false);
|
|
210
|
+
this._setLoading(false);
|
|
211
|
+
this._setReadyState(WebSocket.CLOSED);
|
|
212
|
+
// 異常クローズ時の自動再接続(正常終了 1000 は除外)
|
|
213
|
+
if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {
|
|
214
|
+
this._scheduleReconnect();
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
_scheduleReconnect() {
|
|
218
|
+
this._clearReconnectTimer();
|
|
219
|
+
this._reconnectTimer = setTimeout(() => {
|
|
220
|
+
this._reconnectTimer = null;
|
|
221
|
+
this._reconnectCount++;
|
|
222
|
+
this._doConnect();
|
|
223
|
+
}, this._reconnectInterval);
|
|
224
|
+
}
|
|
225
|
+
_clearReconnectTimer() {
|
|
226
|
+
if (this._reconnectTimer !== null) {
|
|
227
|
+
clearTimeout(this._reconnectTimer);
|
|
228
|
+
this._reconnectTimer = null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
_removeListeners() {
|
|
232
|
+
this._ws.removeEventListener("open", this._onOpen);
|
|
233
|
+
this._ws.removeEventListener("message", this._onMessage);
|
|
234
|
+
this._ws.removeEventListener("error", this._onError);
|
|
235
|
+
this._ws.removeEventListener("close", this._onClose);
|
|
236
|
+
}
|
|
237
|
+
_closeInternal() {
|
|
238
|
+
this._clearReconnectTimer();
|
|
239
|
+
if (this._ws) {
|
|
240
|
+
this._removeListeners();
|
|
241
|
+
if (this._ws.readyState === WebSocket.OPEN || this._ws.readyState === WebSocket.CONNECTING) {
|
|
242
|
+
this._ws.close();
|
|
243
|
+
}
|
|
244
|
+
this._ws = null;
|
|
245
|
+
}
|
|
246
|
+
// 旧接続の状態をリセット(コンストラクタ例外時に stale 状態が残るのを防止)
|
|
247
|
+
if (this._connected) {
|
|
248
|
+
this._setConnected(false);
|
|
249
|
+
}
|
|
250
|
+
if (this._readyState !== WebSocket.CLOSED) {
|
|
251
|
+
this._setReadyState(WebSocket.CLOSED);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
let registered = false;
|
|
257
|
+
function handleClick(event) {
|
|
258
|
+
const target = event.target;
|
|
259
|
+
if (!(target instanceof Element))
|
|
260
|
+
return;
|
|
261
|
+
const triggerElement = target.closest(`[${config.triggerAttribute}]`);
|
|
262
|
+
if (!triggerElement)
|
|
263
|
+
return;
|
|
264
|
+
const wsId = triggerElement.getAttribute(config.triggerAttribute);
|
|
265
|
+
if (!wsId)
|
|
266
|
+
return;
|
|
267
|
+
const wsElement = document.getElementById(wsId);
|
|
268
|
+
if (!wsElement || !(wsElement instanceof WcsWebSocket))
|
|
269
|
+
return;
|
|
270
|
+
event.preventDefault();
|
|
271
|
+
wsElement.connect();
|
|
272
|
+
}
|
|
273
|
+
function registerAutoTrigger() {
|
|
274
|
+
if (registered)
|
|
275
|
+
return;
|
|
276
|
+
registered = true;
|
|
277
|
+
document.addEventListener("click", handleClick);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
class WcsWebSocket extends HTMLElement {
|
|
281
|
+
static hasConnectedCallbackPromise = false;
|
|
282
|
+
static wcBindable = {
|
|
283
|
+
...WebSocketCore.wcBindable,
|
|
284
|
+
properties: [
|
|
285
|
+
...WebSocketCore.wcBindable.properties,
|
|
286
|
+
{ name: "trigger", event: "wcs-ws:trigger-changed" },
|
|
287
|
+
{ name: "send", event: "wcs-ws:send-changed" },
|
|
288
|
+
],
|
|
289
|
+
};
|
|
290
|
+
static get observedAttributes() { return ["url"]; }
|
|
291
|
+
_core;
|
|
292
|
+
_trigger = false;
|
|
293
|
+
constructor() {
|
|
294
|
+
super();
|
|
295
|
+
this._core = new WebSocketCore(this);
|
|
296
|
+
}
|
|
297
|
+
// --- Attribute accessors ---
|
|
298
|
+
get url() {
|
|
299
|
+
return this.getAttribute("url") || "";
|
|
300
|
+
}
|
|
301
|
+
set url(value) {
|
|
302
|
+
this.setAttribute("url", value);
|
|
303
|
+
}
|
|
304
|
+
get protocols() {
|
|
305
|
+
return this.getAttribute("protocols") || "";
|
|
306
|
+
}
|
|
307
|
+
set protocols(value) {
|
|
308
|
+
this.setAttribute("protocols", value);
|
|
309
|
+
}
|
|
310
|
+
get autoReconnect() {
|
|
311
|
+
return this.hasAttribute("auto-reconnect");
|
|
312
|
+
}
|
|
313
|
+
set autoReconnect(value) {
|
|
314
|
+
if (value) {
|
|
315
|
+
this.setAttribute("auto-reconnect", "");
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
this.removeAttribute("auto-reconnect");
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
get reconnectInterval() {
|
|
322
|
+
const attr = this.getAttribute("reconnect-interval");
|
|
323
|
+
return attr ? parseInt(attr, 10) : 3000;
|
|
324
|
+
}
|
|
325
|
+
set reconnectInterval(value) {
|
|
326
|
+
this.setAttribute("reconnect-interval", String(value));
|
|
327
|
+
}
|
|
328
|
+
get maxReconnects() {
|
|
329
|
+
const attr = this.getAttribute("max-reconnects");
|
|
330
|
+
return attr ? parseInt(attr, 10) : Infinity;
|
|
331
|
+
}
|
|
332
|
+
set maxReconnects(value) {
|
|
333
|
+
this.setAttribute("max-reconnects", String(value));
|
|
334
|
+
}
|
|
335
|
+
get manual() {
|
|
336
|
+
return this.hasAttribute("manual");
|
|
337
|
+
}
|
|
338
|
+
set manual(value) {
|
|
339
|
+
if (value) {
|
|
340
|
+
this.setAttribute("manual", "");
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
this.removeAttribute("manual");
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// --- Core delegated getters ---
|
|
347
|
+
get message() {
|
|
348
|
+
return this._core.message;
|
|
349
|
+
}
|
|
350
|
+
get connected() {
|
|
351
|
+
return this._core.connected;
|
|
352
|
+
}
|
|
353
|
+
get loading() {
|
|
354
|
+
return this._core.loading;
|
|
355
|
+
}
|
|
356
|
+
get error() {
|
|
357
|
+
return this._core.error;
|
|
358
|
+
}
|
|
359
|
+
get readyState() {
|
|
360
|
+
return this._core.readyState;
|
|
361
|
+
}
|
|
362
|
+
// --- Command properties ---
|
|
363
|
+
get trigger() {
|
|
364
|
+
return this._trigger;
|
|
365
|
+
}
|
|
366
|
+
set trigger(value) {
|
|
367
|
+
const v = !!value;
|
|
368
|
+
if (v) {
|
|
369
|
+
this._trigger = true;
|
|
370
|
+
this.connect();
|
|
371
|
+
this._trigger = false;
|
|
372
|
+
this.dispatchEvent(new CustomEvent("wcs-ws:trigger-changed", {
|
|
373
|
+
detail: false,
|
|
374
|
+
bubbles: true,
|
|
375
|
+
}));
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
set send(data) {
|
|
379
|
+
if (data === null || data === undefined)
|
|
380
|
+
return;
|
|
381
|
+
const payload = typeof data === "string" ? data : JSON.stringify(data);
|
|
382
|
+
this._core.send(payload);
|
|
383
|
+
this.dispatchEvent(new CustomEvent("wcs-ws:send-changed", {
|
|
384
|
+
detail: null,
|
|
385
|
+
bubbles: true,
|
|
386
|
+
}));
|
|
387
|
+
}
|
|
388
|
+
// --- Public methods ---
|
|
389
|
+
connect() {
|
|
390
|
+
const protocols = this.protocols
|
|
391
|
+
? this.protocols.split(",").map(p => p.trim()).filter(Boolean)
|
|
392
|
+
: undefined;
|
|
393
|
+
this._core.connect(this.url, {
|
|
394
|
+
protocols: protocols && protocols.length === 1 ? protocols[0] : protocols,
|
|
395
|
+
autoReconnect: this.autoReconnect,
|
|
396
|
+
reconnectInterval: this.reconnectInterval,
|
|
397
|
+
maxReconnects: this.maxReconnects,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
sendMessage(data) {
|
|
401
|
+
this._core.send(data);
|
|
402
|
+
}
|
|
403
|
+
close(code, reason) {
|
|
404
|
+
this._core.close(code, reason);
|
|
405
|
+
}
|
|
406
|
+
// --- Lifecycle ---
|
|
407
|
+
attributeChangedCallback(name, _oldValue, newValue) {
|
|
408
|
+
if (name === "url" && this.isConnected && !this.manual && newValue) {
|
|
409
|
+
this.connect();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
connectedCallback() {
|
|
413
|
+
this.style.display = "none";
|
|
414
|
+
if (config.autoTrigger) {
|
|
415
|
+
registerAutoTrigger();
|
|
416
|
+
}
|
|
417
|
+
if (!this.manual && this.url) {
|
|
418
|
+
this.connect();
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
disconnectedCallback() {
|
|
422
|
+
this._core.close();
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
function registerComponents() {
|
|
427
|
+
if (!customElements.get(config.tagNames.ws)) {
|
|
428
|
+
customElements.define(config.tagNames.ws, WcsWebSocket);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
function bootstrapWebSocket(userConfig) {
|
|
433
|
+
if (userConfig) {
|
|
434
|
+
setConfig(userConfig);
|
|
435
|
+
}
|
|
436
|
+
registerComponents();
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
export { WcsWebSocket, WebSocketCore, bootstrapWebSocket, getConfig };
|
|
440
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +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\";\r\n\r\ninterface IInternalConfig extends IConfig {\r\n autoTrigger: boolean;\r\n triggerAttribute: string;\r\n tagNames: {\r\n ws: string;\r\n };\r\n}\r\n\r\nconst _config: IInternalConfig = {\r\n autoTrigger: true,\r\n triggerAttribute: \"data-wstarget\",\r\n tagNames: {\r\n ws: \"wcs-ws\",\r\n },\r\n};\r\n\r\nfunction deepFreeze<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n Object.freeze(obj);\r\n for (const key of Object.keys(obj)) {\r\n deepFreeze((obj as Record<string, unknown>)[key]);\r\n }\r\n return obj;\r\n}\r\n\r\nfunction deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n const clone: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj)) {\r\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\r\n }\r\n return clone as T;\r\n}\r\n\r\nlet frozenConfig: IConfig | null = null;\r\n\r\nexport const config: IConfig = _config as IConfig;\r\n\r\nexport function getConfig(): IConfig {\r\n if (!frozenConfig) {\r\n frozenConfig = deepFreeze(deepClone(_config));\r\n }\r\n return frozenConfig;\r\n}\r\n\r\nexport function setConfig(partialConfig: IWritableConfig): void {\r\n if (typeof partialConfig.autoTrigger === \"boolean\") {\r\n _config.autoTrigger = partialConfig.autoTrigger;\r\n }\r\n if (typeof partialConfig.triggerAttribute === \"string\") {\r\n _config.triggerAttribute = partialConfig.triggerAttribute;\r\n }\r\n if (partialConfig.tagNames) {\r\n Object.assign(_config.tagNames, partialConfig.tagNames);\r\n }\r\n frozenConfig = null;\r\n}\r\n","export function raiseError(message: string): never {\r\n throw new Error(`[@wcstack/websocket] ${message}`);\r\n}\r\n","import { raiseError } from \"../raiseError.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\n\r\nexport interface WebSocketConnectOptions {\r\n protocols?: string | string[];\r\n autoReconnect?: boolean;\r\n reconnectInterval?: number;\r\n maxReconnects?: number;\r\n}\r\n\r\nexport class WebSocketCore extends EventTarget {\r\n static wcBindable: IWcBindable = {\r\n protocol: \"wc-bindable\",\r\n version: 1,\r\n properties: [\r\n { name: \"message\", event: \"wcs-ws:message\" },\r\n { name: \"connected\", event: \"wcs-ws:connected-changed\" },\r\n { name: \"loading\", event: \"wcs-ws:loading-changed\" },\r\n { name: \"error\", event: \"wcs-ws:error\" },\r\n { name: \"readyState\", event: \"wcs-ws:readystate-changed\" },\r\n ],\r\n };\r\n\r\n private _target: EventTarget;\r\n private _ws: WebSocket | null = null;\r\n private _message: any = null;\r\n private _connected: boolean = false;\r\n private _loading: boolean = false;\r\n private _error: any = null;\r\n private _readyState: number = WebSocket.CLOSED;\r\n\r\n // 自動再接続\r\n private _autoReconnect: boolean = false;\r\n private _reconnectInterval: number = 3000;\r\n private _maxReconnects: number = Infinity;\r\n private _reconnectCount: number = 0;\r\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n private _url: string = \"\";\r\n private _protocols: string | string[] | undefined = undefined;\r\n private _intentionalClose: boolean = false;\r\n\r\n constructor(target?: EventTarget) {\r\n super();\r\n this._target = target ?? this;\r\n }\r\n\r\n get message(): any {\r\n return this._message;\r\n }\r\n\r\n get connected(): boolean {\r\n return this._connected;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._loading;\r\n }\r\n\r\n get error(): any {\r\n return this._error;\r\n }\r\n\r\n get readyState(): number {\r\n return this._readyState;\r\n }\r\n\r\n // --- State setters with event dispatch ---\r\n\r\n private _setMessage(message: any): void {\r\n this._message = message;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:message\", {\r\n detail: message,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setConnected(connected: boolean): void {\r\n this._connected = connected;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:connected-changed\", {\r\n detail: connected,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setLoading(loading: boolean): void {\r\n this._loading = loading;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:loading-changed\", {\r\n detail: loading,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setError(error: any): void {\r\n this._error = error;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error\", {\r\n detail: error,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setReadyState(readyState: number): void {\r\n this._readyState = readyState;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:readystate-changed\", {\r\n detail: readyState,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n // --- Public API ---\r\n\r\n connect(url: string, options: WebSocketConnectOptions = {}): void {\r\n if (!url) {\r\n raiseError(\"url is required.\");\r\n }\r\n\r\n // 既存の接続をクローズ\r\n this._intentionalClose = true;\r\n this._closeInternal();\r\n\r\n this._url = url;\r\n this._protocols = options.protocols;\r\n this._autoReconnect = options.autoReconnect ?? false;\r\n this._reconnectInterval = options.reconnectInterval ?? 3000;\r\n this._maxReconnects = options.maxReconnects ?? Infinity;\r\n this._reconnectCount = 0;\r\n this._intentionalClose = false;\r\n\r\n this._doConnect();\r\n }\r\n\r\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\r\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\r\n raiseError(\"WebSocket is not connected.\");\r\n }\r\n this._ws.send(data);\r\n }\r\n\r\n close(code?: number, reason?: string): void {\r\n this._intentionalClose = true;\r\n this._clearReconnectTimer();\r\n if (this._ws) {\r\n this._ws.close(code, reason);\r\n }\r\n }\r\n\r\n // --- Internal ---\r\n\r\n private _doConnect(): void {\r\n this._setLoading(true);\r\n this._setError(null);\r\n\r\n try {\r\n this._ws = this._protocols\r\n ? new WebSocket(this._url, this._protocols)\r\n : new WebSocket(this._url);\r\n } catch (e) {\r\n this._setLoading(false);\r\n this._setError(e);\r\n return;\r\n }\r\n\r\n this._setReadyState(WebSocket.CONNECTING);\r\n\r\n this._ws.addEventListener(\"open\", this._onOpen);\r\n this._ws.addEventListener(\"message\", this._onMessage);\r\n this._ws.addEventListener(\"error\", this._onError);\r\n this._ws.addEventListener(\"close\", this._onClose);\r\n }\r\n\r\n private _onOpen = (): void => {\r\n this._reconnectCount = 0;\r\n this._setLoading(false);\r\n this._setConnected(true);\r\n this._setReadyState(WebSocket.OPEN);\r\n };\r\n\r\n private _onMessage = (event: MessageEvent): void => {\r\n let data = event.data;\r\n // JSONの自動パース\r\n if (typeof data === \"string\") {\r\n try {\r\n data = JSON.parse(data);\r\n } catch {\r\n // テキストのまま\r\n }\r\n }\r\n this._setMessage(data);\r\n };\r\n\r\n private _onError = (event: Event): void => {\r\n this._setError(event);\r\n };\r\n\r\n private _onClose = (event: CloseEvent): void => {\r\n this._removeListeners();\r\n this._ws = null;\r\n this._setConnected(false);\r\n this._setLoading(false);\r\n this._setReadyState(WebSocket.CLOSED);\r\n\r\n // 異常クローズ時の自動再接続(正常終了 1000 は除外)\r\n if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {\r\n this._scheduleReconnect();\r\n }\r\n };\r\n\r\n private _scheduleReconnect(): void {\r\n this._clearReconnectTimer();\r\n this._reconnectTimer = setTimeout(() => {\r\n this._reconnectTimer = null;\r\n this._reconnectCount++;\r\n this._doConnect();\r\n }, this._reconnectInterval);\r\n }\r\n\r\n private _clearReconnectTimer(): void {\r\n if (this._reconnectTimer !== null) {\r\n clearTimeout(this._reconnectTimer);\r\n this._reconnectTimer = null;\r\n }\r\n }\r\n\r\n private _removeListeners(): void {\r\n this._ws!.removeEventListener(\"open\", this._onOpen);\r\n this._ws!.removeEventListener(\"message\", this._onMessage);\r\n this._ws!.removeEventListener(\"error\", this._onError);\r\n this._ws!.removeEventListener(\"close\", this._onClose);\r\n }\r\n\r\n private _closeInternal(): void {\r\n this._clearReconnectTimer();\r\n if (this._ws) {\r\n this._removeListeners();\r\n if (this._ws.readyState === WebSocket.OPEN || this._ws.readyState === WebSocket.CONNECTING) {\r\n this._ws.close();\r\n }\r\n this._ws = null;\r\n }\r\n // 旧接続の状態をリセット(コンストラクタ例外時に stale 状態が残るのを防止)\r\n if (this._connected) {\r\n this._setConnected(false);\r\n }\r\n if (this._readyState !== WebSocket.CLOSED) {\r\n this._setReadyState(WebSocket.CLOSED);\r\n }\r\n }\r\n}\r\n","import { config } from \"./config.js\";\r\nimport { WcsWebSocket } from \"./components/WebSocket.js\";\r\n\r\nlet registered = false;\r\n\r\nfunction handleClick(event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof Element)) return;\r\n\r\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\r\n if (!triggerElement) return;\r\n\r\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\r\n if (!wsId) return;\r\n\r\n const wsElement = document.getElementById(wsId) as WcsWebSocket | null;\r\n if (!wsElement || !(wsElement instanceof WcsWebSocket)) return;\r\n\r\n event.preventDefault();\r\n wsElement.connect();\r\n}\r\n\r\nexport function registerAutoTrigger(): void {\r\n if (registered) return;\r\n registered = true;\r\n document.addEventListener(\"click\", handleClick);\r\n}\r\n\r\nexport function unregisterAutoTrigger(): void {\r\n if (!registered) return;\r\n registered = false;\r\n document.removeEventListener(\"click\", handleClick);\r\n}\r\n","import { config } from \"../config.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\r\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\r\n\r\nexport class WcsWebSocket extends HTMLElement {\r\n static hasConnectedCallbackPromise = false;\r\n static wcBindable: IWcBindable = {\r\n ...WebSocketCore.wcBindable,\r\n properties: [\r\n ...WebSocketCore.wcBindable.properties,\r\n { name: \"trigger\", event: \"wcs-ws:trigger-changed\" },\r\n { name: \"send\", event: \"wcs-ws:send-changed\" },\r\n ],\r\n };\r\n static get observedAttributes(): string[] { return [\"url\"]; }\r\n\r\n private _core: WebSocketCore;\r\n private _trigger: boolean = false;\r\n\r\n constructor() {\r\n super();\r\n this._core = new WebSocketCore(this);\r\n }\r\n\r\n // --- Attribute accessors ---\r\n\r\n get url(): string {\r\n return this.getAttribute(\"url\") || \"\";\r\n }\r\n\r\n set url(value: string) {\r\n this.setAttribute(\"url\", value);\r\n }\r\n\r\n get protocols(): string {\r\n return this.getAttribute(\"protocols\") || \"\";\r\n }\r\n\r\n set protocols(value: string) {\r\n this.setAttribute(\"protocols\", value);\r\n }\r\n\r\n get autoReconnect(): boolean {\r\n return this.hasAttribute(\"auto-reconnect\");\r\n }\r\n\r\n set autoReconnect(value: boolean) {\r\n if (value) {\r\n this.setAttribute(\"auto-reconnect\", \"\");\r\n } else {\r\n this.removeAttribute(\"auto-reconnect\");\r\n }\r\n }\r\n\r\n get reconnectInterval(): number {\r\n const attr = this.getAttribute(\"reconnect-interval\");\r\n return attr ? parseInt(attr, 10) : 3000;\r\n }\r\n\r\n set reconnectInterval(value: number) {\r\n this.setAttribute(\"reconnect-interval\", String(value));\r\n }\r\n\r\n get maxReconnects(): number {\r\n const attr = this.getAttribute(\"max-reconnects\");\r\n return attr ? parseInt(attr, 10) : Infinity;\r\n }\r\n\r\n set maxReconnects(value: number) {\r\n this.setAttribute(\"max-reconnects\", String(value));\r\n }\r\n\r\n get manual(): boolean {\r\n return this.hasAttribute(\"manual\");\r\n }\r\n\r\n set manual(value: boolean) {\r\n if (value) {\r\n this.setAttribute(\"manual\", \"\");\r\n } else {\r\n this.removeAttribute(\"manual\");\r\n }\r\n }\r\n\r\n // --- Core delegated getters ---\r\n\r\n get message(): any {\r\n return this._core.message;\r\n }\r\n\r\n get connected(): boolean {\r\n return this._core.connected;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._core.loading;\r\n }\r\n\r\n get error(): any {\r\n return this._core.error;\r\n }\r\n\r\n get readyState(): number {\r\n return this._core.readyState;\r\n }\r\n\r\n // --- Command properties ---\r\n\r\n get trigger(): boolean {\r\n return this._trigger;\r\n }\r\n\r\n set trigger(value: boolean) {\r\n const v = !!value;\r\n if (v) {\r\n this._trigger = true;\r\n this.connect();\r\n this._trigger = false;\r\n this.dispatchEvent(new CustomEvent(\"wcs-ws:trigger-changed\", {\r\n detail: false,\r\n bubbles: true,\r\n }));\r\n }\r\n }\r\n\r\n set send(data: any) {\r\n if (data === null || data === undefined) return;\r\n const payload = typeof data === \"string\" ? data : JSON.stringify(data);\r\n this._core.send(payload);\r\n this.dispatchEvent(new CustomEvent(\"wcs-ws:send-changed\", {\r\n detail: null,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n // --- Public methods ---\r\n\r\n connect(): void {\r\n const protocols = this.protocols\r\n ? this.protocols.split(\",\").map(p => p.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n this._core.connect(this.url, {\r\n protocols: protocols && protocols.length === 1 ? protocols[0] : protocols,\r\n autoReconnect: this.autoReconnect,\r\n reconnectInterval: this.reconnectInterval,\r\n maxReconnects: this.maxReconnects,\r\n });\r\n }\r\n\r\n sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\r\n this._core.send(data);\r\n }\r\n\r\n close(code?: number, reason?: string): void {\r\n this._core.close(code, reason);\r\n }\r\n\r\n // --- Lifecycle ---\r\n\r\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\r\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\r\n this.connect();\r\n }\r\n }\r\n\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n if (config.autoTrigger) {\r\n registerAutoTrigger();\r\n }\r\n if (!this.manual && this.url) {\r\n this.connect();\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n this._core.close();\r\n }\r\n}\r\n","import { WcsWebSocket } from \"./components/WebSocket.js\";\r\nimport { config } from \"./config.js\";\r\n\r\nexport function registerComponents(): void {\r\n if (!customElements.get(config.tagNames.ws)) {\r\n customElements.define(config.tagNames.ws, WcsWebSocket);\r\n }\r\n}\r\n","import { setConfig } from \"./config.js\";\r\nimport { registerComponents } from \"./registerComponents.js\";\r\nimport { IWritableConfig } from \"./types.js\";\r\n\r\nexport function bootstrapWebSocket(userConfig?: IWritableConfig): void {\r\n if (userConfig) {\r\n setConfig(userConfig);\r\n }\r\n registerComponents();\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e={autoTrigger:!0,triggerAttribute:"data-wstarget",tagNames:{ws:"wcs-ws"}};function t(e){if(null===e||"object"!=typeof e)return e;Object.freeze(e);for(const s of Object.keys(e))t(e[s]);return e}function s(e){if(null===e||"object"!=typeof e)return e;const t={};for(const n of Object.keys(e))t[n]=s(e[n]);return t}let n=null;const r=e;function o(){return n||(n=t(s(e))),n}function i(e){throw new Error(`[@wcstack/websocket] ${e}`)}class c extends EventTarget{static wcBindable={protocol:"wc-bindable",version:1,properties:[{name:"message",event:"wcs-ws:message"},{name:"connected",event:"wcs-ws:connected-changed"},{name:"loading",event:"wcs-ws:loading-changed"},{name:"error",event:"wcs-ws:error"},{name:"readyState",event:"wcs-ws:readystate-changed"}]};_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||i("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||i("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.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 h(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 o=document.getElementById(n);o&&o instanceof l&&(e.preventDefault(),o.connect())}class l extends HTMLElement{static hasConnectedCallbackPromise=!1;static wcBindable={...c.wcBindable,properties:[...c.wcBindable.properties,{name:"trigger",event:"wcs-ws:trigger-changed"},{name:"send",event:"wcs-ws:send-changed"}]};static get observedAttributes(){return["url"]}_core;_trigger=!1;constructor(){super(),this._core=new c(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");return e?parseInt(e,10):3e3}set reconnectInterval(e){this.setAttribute("reconnect-interval",String(e))}get maxReconnects(){const e=this.getAttribute("max-reconnects");return e?parseInt(e,10):1/0}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,s){"url"===e&&this.isConnected&&!this.manual&&s&&this.connect()}connectedCallback(){this.style.display="none",r.autoTrigger&&(a||(a=!0,document.addEventListener("click",h))),!this.manual&&this.url&&this.connect()}disconnectedCallback(){this._core.close()}}function u(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,l)}export{l as WcsWebSocket,c as WebSocketCore,u as bootstrapWebSocket,o as getConfig};
|
|
2
|
+
//# sourceMappingURL=index.esm.min.js.map
|
|
@@ -0,0 +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\";\r\n\r\ninterface IInternalConfig extends IConfig {\r\n autoTrigger: boolean;\r\n triggerAttribute: string;\r\n tagNames: {\r\n ws: string;\r\n };\r\n}\r\n\r\nconst _config: IInternalConfig = {\r\n autoTrigger: true,\r\n triggerAttribute: \"data-wstarget\",\r\n tagNames: {\r\n ws: \"wcs-ws\",\r\n },\r\n};\r\n\r\nfunction deepFreeze<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n Object.freeze(obj);\r\n for (const key of Object.keys(obj)) {\r\n deepFreeze((obj as Record<string, unknown>)[key]);\r\n }\r\n return obj;\r\n}\r\n\r\nfunction deepClone<T>(obj: T): T {\r\n if (obj === null || typeof obj !== \"object\") return obj;\r\n const clone: Record<string, unknown> = {};\r\n for (const key of Object.keys(obj)) {\r\n clone[key] = deepClone((obj as Record<string, unknown>)[key]);\r\n }\r\n return clone as T;\r\n}\r\n\r\nlet frozenConfig: IConfig | null = null;\r\n\r\nexport const config: IConfig = _config as IConfig;\r\n\r\nexport function getConfig(): IConfig {\r\n if (!frozenConfig) {\r\n frozenConfig = deepFreeze(deepClone(_config));\r\n }\r\n return frozenConfig;\r\n}\r\n\r\nexport function setConfig(partialConfig: IWritableConfig): void {\r\n if (typeof partialConfig.autoTrigger === \"boolean\") {\r\n _config.autoTrigger = partialConfig.autoTrigger;\r\n }\r\n if (typeof partialConfig.triggerAttribute === \"string\") {\r\n _config.triggerAttribute = partialConfig.triggerAttribute;\r\n }\r\n if (partialConfig.tagNames) {\r\n Object.assign(_config.tagNames, partialConfig.tagNames);\r\n }\r\n frozenConfig = null;\r\n}\r\n","export function raiseError(message: string): never {\r\n throw new Error(`[@wcstack/websocket] ${message}`);\r\n}\r\n","import { raiseError } from \"../raiseError.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\n\r\nexport interface WebSocketConnectOptions {\r\n protocols?: string | string[];\r\n autoReconnect?: boolean;\r\n reconnectInterval?: number;\r\n maxReconnects?: number;\r\n}\r\n\r\nexport class WebSocketCore extends EventTarget {\r\n static wcBindable: IWcBindable = {\r\n protocol: \"wc-bindable\",\r\n version: 1,\r\n properties: [\r\n { name: \"message\", event: \"wcs-ws:message\" },\r\n { name: \"connected\", event: \"wcs-ws:connected-changed\" },\r\n { name: \"loading\", event: \"wcs-ws:loading-changed\" },\r\n { name: \"error\", event: \"wcs-ws:error\" },\r\n { name: \"readyState\", event: \"wcs-ws:readystate-changed\" },\r\n ],\r\n };\r\n\r\n private _target: EventTarget;\r\n private _ws: WebSocket | null = null;\r\n private _message: any = null;\r\n private _connected: boolean = false;\r\n private _loading: boolean = false;\r\n private _error: any = null;\r\n private _readyState: number = WebSocket.CLOSED;\r\n\r\n // 自動再接続\r\n private _autoReconnect: boolean = false;\r\n private _reconnectInterval: number = 3000;\r\n private _maxReconnects: number = Infinity;\r\n private _reconnectCount: number = 0;\r\n private _reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n private _url: string = \"\";\r\n private _protocols: string | string[] | undefined = undefined;\r\n private _intentionalClose: boolean = false;\r\n\r\n constructor(target?: EventTarget) {\r\n super();\r\n this._target = target ?? this;\r\n }\r\n\r\n get message(): any {\r\n return this._message;\r\n }\r\n\r\n get connected(): boolean {\r\n return this._connected;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._loading;\r\n }\r\n\r\n get error(): any {\r\n return this._error;\r\n }\r\n\r\n get readyState(): number {\r\n return this._readyState;\r\n }\r\n\r\n // --- State setters with event dispatch ---\r\n\r\n private _setMessage(message: any): void {\r\n this._message = message;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:message\", {\r\n detail: message,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setConnected(connected: boolean): void {\r\n this._connected = connected;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:connected-changed\", {\r\n detail: connected,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setLoading(loading: boolean): void {\r\n this._loading = loading;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:loading-changed\", {\r\n detail: loading,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setError(error: any): void {\r\n this._error = error;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:error\", {\r\n detail: error,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n private _setReadyState(readyState: number): void {\r\n this._readyState = readyState;\r\n this._target.dispatchEvent(new CustomEvent(\"wcs-ws:readystate-changed\", {\r\n detail: readyState,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n // --- Public API ---\r\n\r\n connect(url: string, options: WebSocketConnectOptions = {}): void {\r\n if (!url) {\r\n raiseError(\"url is required.\");\r\n }\r\n\r\n // 既存の接続をクローズ\r\n this._intentionalClose = true;\r\n this._closeInternal();\r\n\r\n this._url = url;\r\n this._protocols = options.protocols;\r\n this._autoReconnect = options.autoReconnect ?? false;\r\n this._reconnectInterval = options.reconnectInterval ?? 3000;\r\n this._maxReconnects = options.maxReconnects ?? Infinity;\r\n this._reconnectCount = 0;\r\n this._intentionalClose = false;\r\n\r\n this._doConnect();\r\n }\r\n\r\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\r\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\r\n raiseError(\"WebSocket is not connected.\");\r\n }\r\n this._ws.send(data);\r\n }\r\n\r\n close(code?: number, reason?: string): void {\r\n this._intentionalClose = true;\r\n this._clearReconnectTimer();\r\n if (this._ws) {\r\n this._ws.close(code, reason);\r\n }\r\n }\r\n\r\n // --- Internal ---\r\n\r\n private _doConnect(): void {\r\n this._setLoading(true);\r\n this._setError(null);\r\n\r\n try {\r\n this._ws = this._protocols\r\n ? new WebSocket(this._url, this._protocols)\r\n : new WebSocket(this._url);\r\n } catch (e) {\r\n this._setLoading(false);\r\n this._setError(e);\r\n return;\r\n }\r\n\r\n this._setReadyState(WebSocket.CONNECTING);\r\n\r\n this._ws.addEventListener(\"open\", this._onOpen);\r\n this._ws.addEventListener(\"message\", this._onMessage);\r\n this._ws.addEventListener(\"error\", this._onError);\r\n this._ws.addEventListener(\"close\", this._onClose);\r\n }\r\n\r\n private _onOpen = (): void => {\r\n this._reconnectCount = 0;\r\n this._setLoading(false);\r\n this._setConnected(true);\r\n this._setReadyState(WebSocket.OPEN);\r\n };\r\n\r\n private _onMessage = (event: MessageEvent): void => {\r\n let data = event.data;\r\n // JSONの自動パース\r\n if (typeof data === \"string\") {\r\n try {\r\n data = JSON.parse(data);\r\n } catch {\r\n // テキストのまま\r\n }\r\n }\r\n this._setMessage(data);\r\n };\r\n\r\n private _onError = (event: Event): void => {\r\n this._setError(event);\r\n };\r\n\r\n private _onClose = (event: CloseEvent): void => {\r\n this._removeListeners();\r\n this._ws = null;\r\n this._setConnected(false);\r\n this._setLoading(false);\r\n this._setReadyState(WebSocket.CLOSED);\r\n\r\n // 異常クローズ時の自動再接続(正常終了 1000 は除外)\r\n if (!this._intentionalClose && this._autoReconnect && event.code !== 1000 && this._reconnectCount < this._maxReconnects) {\r\n this._scheduleReconnect();\r\n }\r\n };\r\n\r\n private _scheduleReconnect(): void {\r\n this._clearReconnectTimer();\r\n this._reconnectTimer = setTimeout(() => {\r\n this._reconnectTimer = null;\r\n this._reconnectCount++;\r\n this._doConnect();\r\n }, this._reconnectInterval);\r\n }\r\n\r\n private _clearReconnectTimer(): void {\r\n if (this._reconnectTimer !== null) {\r\n clearTimeout(this._reconnectTimer);\r\n this._reconnectTimer = null;\r\n }\r\n }\r\n\r\n private _removeListeners(): void {\r\n this._ws!.removeEventListener(\"open\", this._onOpen);\r\n this._ws!.removeEventListener(\"message\", this._onMessage);\r\n this._ws!.removeEventListener(\"error\", this._onError);\r\n this._ws!.removeEventListener(\"close\", this._onClose);\r\n }\r\n\r\n private _closeInternal(): void {\r\n this._clearReconnectTimer();\r\n if (this._ws) {\r\n this._removeListeners();\r\n if (this._ws.readyState === WebSocket.OPEN || this._ws.readyState === WebSocket.CONNECTING) {\r\n this._ws.close();\r\n }\r\n this._ws = null;\r\n }\r\n // 旧接続の状態をリセット(コンストラクタ例外時に stale 状態が残るのを防止)\r\n if (this._connected) {\r\n this._setConnected(false);\r\n }\r\n if (this._readyState !== WebSocket.CLOSED) {\r\n this._setReadyState(WebSocket.CLOSED);\r\n }\r\n }\r\n}\r\n","import { config } from \"./config.js\";\r\nimport { WcsWebSocket } from \"./components/WebSocket.js\";\r\n\r\nlet registered = false;\r\n\r\nfunction handleClick(event: Event): void {\r\n const target = event.target;\r\n if (!(target instanceof Element)) return;\r\n\r\n const triggerElement = target.closest<Element>(`[${config.triggerAttribute}]`);\r\n if (!triggerElement) return;\r\n\r\n const wsId = triggerElement.getAttribute(config.triggerAttribute);\r\n if (!wsId) return;\r\n\r\n const wsElement = document.getElementById(wsId) as WcsWebSocket | null;\r\n if (!wsElement || !(wsElement instanceof WcsWebSocket)) return;\r\n\r\n event.preventDefault();\r\n wsElement.connect();\r\n}\r\n\r\nexport function registerAutoTrigger(): void {\r\n if (registered) return;\r\n registered = true;\r\n document.addEventListener(\"click\", handleClick);\r\n}\r\n\r\nexport function unregisterAutoTrigger(): void {\r\n if (!registered) return;\r\n registered = false;\r\n document.removeEventListener(\"click\", handleClick);\r\n}\r\n","import { config } from \"../config.js\";\r\nimport { IWcBindable } from \"../types.js\";\r\nimport { WebSocketCore } from \"../core/WebSocketCore.js\";\r\nimport { registerAutoTrigger } from \"../autoTrigger.js\";\r\n\r\nexport class WcsWebSocket extends HTMLElement {\r\n static hasConnectedCallbackPromise = false;\r\n static wcBindable: IWcBindable = {\r\n ...WebSocketCore.wcBindable,\r\n properties: [\r\n ...WebSocketCore.wcBindable.properties,\r\n { name: \"trigger\", event: \"wcs-ws:trigger-changed\" },\r\n { name: \"send\", event: \"wcs-ws:send-changed\" },\r\n ],\r\n };\r\n static get observedAttributes(): string[] { return [\"url\"]; }\r\n\r\n private _core: WebSocketCore;\r\n private _trigger: boolean = false;\r\n\r\n constructor() {\r\n super();\r\n this._core = new WebSocketCore(this);\r\n }\r\n\r\n // --- Attribute accessors ---\r\n\r\n get url(): string {\r\n return this.getAttribute(\"url\") || \"\";\r\n }\r\n\r\n set url(value: string) {\r\n this.setAttribute(\"url\", value);\r\n }\r\n\r\n get protocols(): string {\r\n return this.getAttribute(\"protocols\") || \"\";\r\n }\r\n\r\n set protocols(value: string) {\r\n this.setAttribute(\"protocols\", value);\r\n }\r\n\r\n get autoReconnect(): boolean {\r\n return this.hasAttribute(\"auto-reconnect\");\r\n }\r\n\r\n set autoReconnect(value: boolean) {\r\n if (value) {\r\n this.setAttribute(\"auto-reconnect\", \"\");\r\n } else {\r\n this.removeAttribute(\"auto-reconnect\");\r\n }\r\n }\r\n\r\n get reconnectInterval(): number {\r\n const attr = this.getAttribute(\"reconnect-interval\");\r\n return attr ? parseInt(attr, 10) : 3000;\r\n }\r\n\r\n set reconnectInterval(value: number) {\r\n this.setAttribute(\"reconnect-interval\", String(value));\r\n }\r\n\r\n get maxReconnects(): number {\r\n const attr = this.getAttribute(\"max-reconnects\");\r\n return attr ? parseInt(attr, 10) : Infinity;\r\n }\r\n\r\n set maxReconnects(value: number) {\r\n this.setAttribute(\"max-reconnects\", String(value));\r\n }\r\n\r\n get manual(): boolean {\r\n return this.hasAttribute(\"manual\");\r\n }\r\n\r\n set manual(value: boolean) {\r\n if (value) {\r\n this.setAttribute(\"manual\", \"\");\r\n } else {\r\n this.removeAttribute(\"manual\");\r\n }\r\n }\r\n\r\n // --- Core delegated getters ---\r\n\r\n get message(): any {\r\n return this._core.message;\r\n }\r\n\r\n get connected(): boolean {\r\n return this._core.connected;\r\n }\r\n\r\n get loading(): boolean {\r\n return this._core.loading;\r\n }\r\n\r\n get error(): any {\r\n return this._core.error;\r\n }\r\n\r\n get readyState(): number {\r\n return this._core.readyState;\r\n }\r\n\r\n // --- Command properties ---\r\n\r\n get trigger(): boolean {\r\n return this._trigger;\r\n }\r\n\r\n set trigger(value: boolean) {\r\n const v = !!value;\r\n if (v) {\r\n this._trigger = true;\r\n this.connect();\r\n this._trigger = false;\r\n this.dispatchEvent(new CustomEvent(\"wcs-ws:trigger-changed\", {\r\n detail: false,\r\n bubbles: true,\r\n }));\r\n }\r\n }\r\n\r\n set send(data: any) {\r\n if (data === null || data === undefined) return;\r\n const payload = typeof data === \"string\" ? data : JSON.stringify(data);\r\n this._core.send(payload);\r\n this.dispatchEvent(new CustomEvent(\"wcs-ws:send-changed\", {\r\n detail: null,\r\n bubbles: true,\r\n }));\r\n }\r\n\r\n // --- Public methods ---\r\n\r\n connect(): void {\r\n const protocols = this.protocols\r\n ? this.protocols.split(\",\").map(p => p.trim()).filter(Boolean)\r\n : undefined;\r\n\r\n this._core.connect(this.url, {\r\n protocols: protocols && protocols.length === 1 ? protocols[0] : protocols,\r\n autoReconnect: this.autoReconnect,\r\n reconnectInterval: this.reconnectInterval,\r\n maxReconnects: this.maxReconnects,\r\n });\r\n }\r\n\r\n sendMessage(data: string | ArrayBufferLike | Blob | ArrayBufferView): void {\r\n this._core.send(data);\r\n }\r\n\r\n close(code?: number, reason?: string): void {\r\n this._core.close(code, reason);\r\n }\r\n\r\n // --- Lifecycle ---\r\n\r\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\r\n if (name === \"url\" && this.isConnected && !this.manual && newValue) {\r\n this.connect();\r\n }\r\n }\r\n\r\n connectedCallback(): void {\r\n this.style.display = \"none\";\r\n if (config.autoTrigger) {\r\n registerAutoTrigger();\r\n }\r\n if (!this.manual && this.url) {\r\n this.connect();\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n this._core.close();\r\n }\r\n}\r\n","import { setConfig } from \"./config.js\";\r\nimport { registerComponents } from \"./registerComponents.js\";\r\nimport { IWritableConfig } from \"./types.js\";\r\n\r\nexport function bootstrapWebSocket(userConfig?: IWritableConfig): void {\r\n if (userConfig) {\r\n setConfig(userConfig);\r\n }\r\n registerComponents();\r\n}\r\n","import { WcsWebSocket } from \"./components/WebSocket.js\";\r\nimport { config } from \"./config.js\";\r\n\r\nexport function registerComponents(): void {\r\n if (!customElements.get(config.tagNames.ws)) {\r\n customElements.define(config.tagNames.ws, WcsWebSocket);\r\n }\r\n}\r\n"],"names":["_config","autoTrigger","triggerAttribute","tagNames","ws","deepFreeze","obj","Object","freeze","key","keys","deepClone","clone","frozenConfig","config","getConfig","raiseError","message","Error","WebSocketCore","EventTarget","static","protocol","version","properties","name","event","_target","_ws","_message","_connected","_loading","_error","_readyState","WebSocket","CLOSED","_autoReconnect","_reconnectInterval","_maxReconnects","Infinity","_reconnectCount","_reconnectTimer","_url","_protocols","undefined","_intentionalClose","constructor","target","super","this","connected","loading","error","readyState","_setMessage","dispatchEvent","CustomEvent","detail","bubbles","_setConnected","_setLoading","_setError","_setReadyState","connect","url","options","_closeInternal","protocols","autoReconnect","reconnectInterval","maxReconnects","_doConnect","send","data","OPEN","close","code","reason","_clearReconnectTimer","e","CONNECTING","addEventListener","_onOpen","_onMessage","_onError","_onClose","JSON","parse","_removeListeners","_scheduleReconnect","setTimeout","clearTimeout","removeEventListener","registered","handleClick","Element","triggerElement","closest","wsId","getAttribute","wsElement","document","getElementById","WcsWebSocket","preventDefault","HTMLElement","wcBindable","observedAttributes","_core","_trigger","value","setAttribute","hasAttribute","removeAttribute","attr","parseInt","String","manual","trigger","payload","stringify","split","map","p","trim","filter","Boolean","length","sendMessage","attributeChangedCallback","_oldValue","newValue","isConnected","connectedCallback","style","display","disconnectedCallback","bootstrapWebSocket","userConfig","partialConfig","assign","customElements","get","define"],"mappings":"AAUA,MAAMA,EAA2B,CAC/BC,aAAa,EACbC,iBAAkB,gBAClBC,SAAU,CACRC,GAAI,WAIR,SAASC,EAAcC,GACrB,GAAY,OAARA,GAA+B,iBAARA,EAAkB,OAAOA,EACpDC,OAAOC,OAAOF,GACd,IAAK,MAAMG,KAAOF,OAAOG,KAAKJ,GAC5BD,EAAYC,EAAgCG,IAE9C,OAAOH,CACT,CAEA,SAASK,EAAaL,GACpB,GAAY,OAARA,GAA+B,iBAARA,EAAkB,OAAOA,EACpD,MAAMM,EAAiC,CAAA,EACvC,IAAK,MAAMH,KAAOF,OAAOG,KAAKJ,GAC5BM,EAAMH,GAAOE,EAAWL,EAAgCG,IAE1D,OAAOG,CACT,CAEA,IAAIC,EAA+B,KAE5B,MAAMC,EAAkBd,WAEfe,IAId,OAHKF,IACHA,EAAeR,EAAWM,EAAUX,KAE/Ba,CACT,CC7CM,SAAUG,EAAWC,GACzB,MAAM,IAAIC,MAAM,wBAAwBD,IAC1C,CCQM,MAAOE,UAAsBC,YACjCC,kBAAiC,CAC/BC,SAAU,cACVC,QAAS,EACTC,WAAY,CACV,CAAEC,KAAM,UAAWC,MAAO,kBAC1B,CAAED,KAAM,YAAaC,MAAO,4BAC5B,CAAED,KAAM,UAAWC,MAAO,0BAC1B,CAAED,KAAM,QAASC,MAAO,gBACxB,CAAED,KAAM,aAAcC,MAAO,+BAIzBC,QACAC,IAAwB,KACxBC,SAAgB,KAChBC,YAAsB,EACtBC,UAAoB,EACpBC,OAAc,KACdC,YAAsBC,UAAUC,OAGhCC,gBAA0B,EAC1BC,mBAA6B,IAC7BC,eAAyBC,IACzBC,gBAA0B,EAC1BC,gBAAwD,KACxDC,KAAe,GACfC,gBAA4CC,EAC5CC,mBAA6B,EAErC,WAAAC,CAAYC,GACVC,QACAC,KAAKtB,QAAUoB,GAAUE,IAC3B,CAEA,WAAIhC,GACF,OAAOgC,KAAKpB,QACd,CAEA,aAAIqB,GACF,OAAOD,KAAKnB,UACd,CAEA,WAAIqB,GACF,OAAOF,KAAKlB,QACd,CAEA,SAAIqB,GACF,OAAOH,KAAKjB,MACd,CAEA,cAAIqB,GACF,OAAOJ,KAAKhB,WACd,CAIQ,WAAAqB,CAAYrC,GAClBgC,KAAKpB,SAAWZ,EAChBgC,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,iBAAkB,CAC3DC,OAAQxC,EACRyC,SAAS,IAEb,CAEQ,aAAAC,CAAcT,GACpBD,KAAKnB,WAAaoB,EAClBD,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,2BAA4B,CACrEC,OAAQP,EACRQ,SAAS,IAEb,CAEQ,WAAAE,CAAYT,GAClBF,KAAKlB,SAAWoB,EAChBF,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,yBAA0B,CACnEC,OAAQN,EACRO,SAAS,IAEb,CAEQ,SAAAG,CAAUT,GAChBH,KAAKjB,OAASoB,EACdH,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,eAAgB,CACzDC,OAAQL,EACRM,SAAS,IAEb,CAEQ,cAAAI,CAAeT,GACrBJ,KAAKhB,YAAcoB,EACnBJ,KAAKtB,QAAQ4B,cAAc,IAAIC,YAAY,4BAA6B,CACtEC,OAAQJ,EACRK,SAAS,IAEb,CAIA,OAAAK,CAAQC,EAAaC,EAAmC,IACjDD,GACHhD,EAAW,oBAIbiC,KAAKJ,mBAAoB,EACzBI,KAAKiB,iBAELjB,KAAKP,KAAOsB,EACZf,KAAKN,WAAasB,EAAQE,UAC1BlB,KAAKb,eAAiB6B,EAAQG,gBAAiB,EAC/CnB,KAAKZ,mBAAqB4B,EAAQI,mBAAqB,IACvDpB,KAAKX,eAAiB2B,EAAQK,eAAiB/B,IAC/CU,KAAKT,gBAAkB,EACvBS,KAAKJ,mBAAoB,EAEzBI,KAAKsB,YACP,CAEA,IAAAC,CAAKC,GACExB,KAAKrB,KAAOqB,KAAKrB,IAAIyB,aAAenB,UAAUwC,MACjD1D,EAAW,+BAEbiC,KAAKrB,IAAI4C,KAAKC,EAChB,CAEA,KAAAE,CAAMC,EAAeC,GACnB5B,KAAKJ,mBAAoB,EACzBI,KAAK6B,uBACD7B,KAAKrB,KACPqB,KAAKrB,IAAI+C,MAAMC,EAAMC,EAEzB,CAIQ,UAAAN,GACNtB,KAAKW,aAAY,GACjBX,KAAKY,UAAU,MAEf,IACEZ,KAAKrB,IAAMqB,KAAKN,WACZ,IAAIT,UAAUe,KAAKP,KAAMO,KAAKN,YAC9B,IAAIT,UAAUe,KAAKP,KACzB,CAAE,MAAOqC,GAGP,OAFA9B,KAAKW,aAAY,QACjBX,KAAKY,UAAUkB,EAEjB,CAEA9B,KAAKa,eAAe5B,UAAU8C,YAE9B/B,KAAKrB,IAAIqD,iBAAiB,OAAQhC,KAAKiC,SACvCjC,KAAKrB,IAAIqD,iBAAiB,UAAWhC,KAAKkC,YAC1ClC,KAAKrB,IAAIqD,iBAAiB,QAAShC,KAAKmC,UACxCnC,KAAKrB,IAAIqD,iBAAiB,QAAShC,KAAKoC,SAC1C,CAEQH,QAAU,KAChBjC,KAAKT,gBAAkB,EACvBS,KAAKW,aAAY,GACjBX,KAAKU,eAAc,GACnBV,KAAKa,eAAe5B,UAAUwC,OAGxBS,WAAczD,IACpB,IAAI+C,EAAO/C,EAAM+C,KAEjB,GAAoB,iBAATA,EACT,IACEA,EAAOa,KAAKC,MAAMd,EACpB,CAAE,MAEF,CAEFxB,KAAKK,YAAYmB,IAGXW,SAAY1D,IAClBuB,KAAKY,UAAUnC,IAGT2D,SAAY3D,IAClBuB,KAAKuC,mBACLvC,KAAKrB,IAAM,KACXqB,KAAKU,eAAc,GACnBV,KAAKW,aAAY,GACjBX,KAAKa,eAAe5B,UAAUC,SAGzBc,KAAKJ,mBAAqBI,KAAKb,gBAAiC,MAAfV,EAAMkD,MAAiB3B,KAAKT,gBAAkBS,KAAKX,gBACvGW,KAAKwC,sBAID,kBAAAA,GACNxC,KAAK6B,uBACL7B,KAAKR,gBAAkBiD,WAAW,KAChCzC,KAAKR,gBAAkB,KACvBQ,KAAKT,kBACLS,KAAKsB,cACJtB,KAAKZ,mBACV,CAEQ,oBAAAyC,GACuB,OAAzB7B,KAAKR,kBACPkD,aAAa1C,KAAKR,iBAClBQ,KAAKR,gBAAkB,KAE3B,CAEQ,gBAAA+C,GACNvC,KAAKrB,IAAKgE,oBAAoB,OAAQ3C,KAAKiC,SAC3CjC,KAAKrB,IAAKgE,oBAAoB,UAAW3C,KAAKkC,YAC9ClC,KAAKrB,IAAKgE,oBAAoB,QAAS3C,KAAKmC,UAC5CnC,KAAKrB,IAAKgE,oBAAoB,QAAS3C,KAAKoC,SAC9C,CAEQ,cAAAnB,GACNjB,KAAK6B,uBACD7B,KAAKrB,MACPqB,KAAKuC,mBACDvC,KAAKrB,IAAIyB,aAAenB,UAAUwC,MAAQzB,KAAKrB,IAAIyB,aAAenB,UAAU8C,YAC9E/B,KAAKrB,IAAI+C,QAEX1B,KAAKrB,IAAM,MAGTqB,KAAKnB,YACPmB,KAAKU,eAAc,GAEjBV,KAAKhB,cAAgBC,UAAUC,QACjCc,KAAKa,eAAe5B,UAAUC,OAElC,EClPF,IAAI0D,GAAa,EAEjB,SAASC,EAAYpE,GACnB,MAAMqB,EAASrB,EAAMqB,OACrB,KAAMA,aAAkBgD,SAAU,OAElC,MAAMC,EAAiBjD,EAAOkD,QAAiB,IAAInF,EAAOZ,qBAC1D,IAAK8F,EAAgB,OAErB,MAAME,EAAOF,EAAeG,aAAarF,EAAOZ,kBAChD,IAAKgG,EAAM,OAEX,MAAME,EAAYC,SAASC,eAAeJ,GACrCE,GAAeA,aAAqBG,IAEzC7E,EAAM8E,iBACNJ,EAAUrC,UACZ,CCfM,MAAOwC,UAAqBE,YAChCpF,oCAAqC,EACrCA,kBAAiC,IAC5BF,EAAcuF,WACjBlF,WAAY,IACPL,EAAcuF,WAAWlF,WAC5B,CAAEC,KAAM,UAAWC,MAAO,0BAC1B,CAAED,KAAM,OAAQC,MAAO,yBAG3B,6BAAWiF,GAAiC,MAAO,CAAC,MAAQ,CAEpDC,MACAC,UAAoB,EAE5B,WAAA/D,GACEE,QACAC,KAAK2D,MAAQ,IAAIzF,EAAc8B,KACjC,CAIA,OAAIe,GACF,OAAOf,KAAKkD,aAAa,QAAU,EACrC,CAEA,OAAInC,CAAI8C,GACN7D,KAAK8D,aAAa,MAAOD,EAC3B,CAEA,aAAI3C,GACF,OAAOlB,KAAKkD,aAAa,cAAgB,EAC3C,CAEA,aAAIhC,CAAU2C,GACZ7D,KAAK8D,aAAa,YAAaD,EACjC,CAEA,iBAAI1C,GACF,OAAOnB,KAAK+D,aAAa,iBAC3B,CAEA,iBAAI5C,CAAc0C,GACZA,EACF7D,KAAK8D,aAAa,iBAAkB,IAEpC9D,KAAKgE,gBAAgB,iBAEzB,CAEA,qBAAI5C,GACF,MAAM6C,EAAOjE,KAAKkD,aAAa,sBAC/B,OAAOe,EAAOC,SAASD,EAAM,IAAM,GACrC,CAEA,qBAAI7C,CAAkByC,GACpB7D,KAAK8D,aAAa,qBAAsBK,OAAON,GACjD,CAEA,iBAAIxC,GACF,MAAM4C,EAAOjE,KAAKkD,aAAa,kBAC/B,OAAOe,EAAOC,SAASD,EAAM,IAAM3E,GACrC,CAEA,iBAAI+B,CAAcwC,GAChB7D,KAAK8D,aAAa,iBAAkBK,OAAON,GAC7C,CAEA,UAAIO,GACF,OAAOpE,KAAK+D,aAAa,SAC3B,CAEA,UAAIK,CAAOP,GACLA,EACF7D,KAAK8D,aAAa,SAAU,IAE5B9D,KAAKgE,gBAAgB,SAEzB,CAIA,WAAIhG,GACF,OAAOgC,KAAK2D,MAAM3F,OACpB,CAEA,aAAIiC,GACF,OAAOD,KAAK2D,MAAM1D,SACpB,CAEA,WAAIC,GACF,OAAOF,KAAK2D,MAAMzD,OACpB,CAEA,SAAIC,GACF,OAAOH,KAAK2D,MAAMxD,KACpB,CAEA,cAAIC,GACF,OAAOJ,KAAK2D,MAAMvD,UACpB,CAIA,WAAIiE,GACF,OAAOrE,KAAK4D,QACd,CAEA,WAAIS,CAAQR,KACEA,IAEV7D,KAAK4D,UAAW,EAChB5D,KAAKc,UACLd,KAAK4D,UAAW,EAChB5D,KAAKM,cAAc,IAAIC,YAAY,yBAA0B,CAC3DC,QAAQ,EACRC,SAAS,KAGf,CAEA,QAAIc,CAAKC,GACP,GAAIA,QAAqC,OACzC,MAAM8C,EAA0B,iBAAT9C,EAAoBA,EAAOa,KAAKkC,UAAU/C,GACjExB,KAAK2D,MAAMpC,KAAK+C,GAChBtE,KAAKM,cAAc,IAAIC,YAAY,sBAAuB,CACxDC,OAAQ,KACRC,SAAS,IAEb,CAIA,OAAAK,GACE,MAAMI,EAAYlB,KAAKkB,UACnBlB,KAAKkB,UAAUsD,MAAM,KAAKC,IAAIC,GAAKA,EAAEC,QAAQC,OAAOC,cACpDlF,EAEJK,KAAK2D,MAAM7C,QAAQd,KAAKe,IAAK,CAC3BG,UAAWA,GAAkC,IAArBA,EAAU4D,OAAe5D,EAAU,GAAKA,EAChEC,cAAenB,KAAKmB,cACpBC,kBAAmBpB,KAAKoB,kBACxBC,cAAerB,KAAKqB,eAExB,CAEA,WAAA0D,CAAYvD,GACVxB,KAAK2D,MAAMpC,KAAKC,EAClB,CAEA,KAAAE,CAAMC,EAAeC,GACnB5B,KAAK2D,MAAMjC,MAAMC,EAAMC,EACzB,CAIA,wBAAAoD,CAAyBxG,EAAcyG,EAA0BC,GAClD,QAAT1G,GAAkBwB,KAAKmF,cAAgBnF,KAAKoE,QAAUc,GACxDlF,KAAKc,SAET,CAEA,iBAAAsE,GACEpF,KAAKqF,MAAMC,QAAU,OACjBzH,EAAOb,cDlJT4F,IACJA,GAAa,EACbQ,SAASpB,iBAAiB,QAASa,MCmJ5B7C,KAAKoE,QAAUpE,KAAKe,KACvBf,KAAKc,SAET,CAEA,oBAAAyE,GACEvF,KAAK2D,MAAMjC,OACb,EC/KI,SAAU8D,EAAmBC,GL2C7B,IAAoBC,EK1CpBD,IL2CqC,kBADjBC,EKzCZD,GL0CazI,cACvBD,EAAQC,YAAc0I,EAAc1I,aAEQ,iBAAnC0I,EAAczI,mBACvBF,EAAQE,iBAAmByI,EAAczI,kBAEvCyI,EAAcxI,UAChBI,OAAOqI,OAAO5I,EAAQG,SAAUwI,EAAcxI,UAEhDU,EAAe,MMrDVgI,eAAeC,IAAIhI,EAAOX,SAASC,KACtCyI,eAAeE,OAAOjI,EAAOX,SAASC,GAAImG,EDI9C"}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wcstack/websocket",
|
|
3
|
+
"version": "1.8.1",
|
|
4
|
+
"description": "Declarative WebSocket component for Web Components. Framework-agnostic real-time communication via wc-bindable-protocol.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.esm.js",
|
|
7
|
+
"module": "./dist/index.esm.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.esm.js"
|
|
13
|
+
},
|
|
14
|
+
"./auto": "./dist/auto.min.js"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"clean": "rimraf dist .tsc-out",
|
|
21
|
+
"build": "rimraf dist .tsc-out && tsc && rollup -c",
|
|
22
|
+
"test": "vitest run",
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"test:coverage": "vitest run --coverage",
|
|
25
|
+
"lint": "eslint src",
|
|
26
|
+
"version:patch": "npm version patch",
|
|
27
|
+
"version:minor": "npm version minor",
|
|
28
|
+
"version:major": "npm version major",
|
|
29
|
+
"prepublishOnly": "npm run build && npm run test:coverage"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"web-components",
|
|
33
|
+
"websocket",
|
|
34
|
+
"custom-elements",
|
|
35
|
+
"wc-bindable",
|
|
36
|
+
"declarative",
|
|
37
|
+
"real-time",
|
|
38
|
+
"zero-dependencies",
|
|
39
|
+
"framework-agnostic"
|
|
40
|
+
],
|
|
41
|
+
"author": "mogera551",
|
|
42
|
+
"homepage": "https://wcstack.github.io",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "https://github.com/wcstack/wcstack.git",
|
|
46
|
+
"directory": "packages/websocket"
|
|
47
|
+
},
|
|
48
|
+
"bugs": {
|
|
49
|
+
"url": "https://github.com/wcstack/wcstack/issues"
|
|
50
|
+
},
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@eslint/js": "^9.39.1",
|
|
54
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
55
|
+
"@rollup/plugin-typescript": "^11.1.6",
|
|
56
|
+
"@vitest/coverage-v8": "^4.0.15",
|
|
57
|
+
"@vitest/ui": "^4.0.15",
|
|
58
|
+
"eslint": "^9.39.1",
|
|
59
|
+
"globals": "^16.5.0",
|
|
60
|
+
"happy-dom": "^20.0.11",
|
|
61
|
+
"rimraf": "^6.0.1",
|
|
62
|
+
"rollup": "^4.22.4",
|
|
63
|
+
"rollup-plugin-dts": "^6.1.1",
|
|
64
|
+
"rollup-plugin-copy": "^3.5.0",
|
|
65
|
+
"tslib": "^2.8.1",
|
|
66
|
+
"typescript": "^5.9.3",
|
|
67
|
+
"typescript-eslint": "^8.49.0",
|
|
68
|
+
"vitest": "^4.0.15"
|
|
69
|
+
}
|
|
70
|
+
}
|