voodoojs 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +77 -0
- package/dist/chunk-234ZLC6W.js +401 -0
- package/dist/chunk-4HQEOXTK.js +10271 -0
- package/dist/chunk-5777LJVW.js +64 -0
- package/dist/chunk-5CKGDARU.js +1845 -0
- package/dist/chunk-A2UOVQBP.js +82 -0
- package/dist/chunk-E27NRARW.js +16 -0
- package/dist/chunk-JZIYRIY6.js +1196 -0
- package/dist/chunk-NNU6WOOU.js +641 -0
- package/dist/chunk-PQZEVFVZ.js +448 -0
- package/dist/chunk-RJUNPXQF.js +946 -0
- package/dist/chunk-U76IRJKH.js +72 -0
- package/dist/essential.cjs +13889 -0
- package/dist/essential.d.cts +24 -0
- package/dist/essential.d.ts +24 -0
- package/dist/essential.js +51 -0
- package/dist/gpu.cjs +2008 -0
- package/dist/gpu.d.cts +68 -0
- package/dist/gpu.d.ts +68 -0
- package/dist/gpu.js +273 -0
- package/dist/http.cjs +467 -0
- package/dist/http.d.cts +148 -0
- package/dist/http.d.ts +148 -0
- package/dist/http.js +7 -0
- package/dist/index-CaLD-0oh.d.cts +608 -0
- package/dist/index-CaLD-0oh.d.ts +608 -0
- package/dist/index-DTllqUtj.d.cts +261 -0
- package/dist/index-DTllqUtj.d.ts +261 -0
- package/dist/index.cjs +23063 -0
- package/dist/index.d.cts +1603 -0
- package/dist/index.d.ts +1603 -0
- package/dist/index.js +6924 -0
- package/dist/query-CKJ4oSpG.d.cts +1595 -0
- package/dist/query-DQFRmu3u.d.ts +1595 -0
- package/dist/reactivity.cjs +676 -0
- package/dist/reactivity.d.cts +188 -0
- package/dist/reactivity.d.ts +188 -0
- package/dist/reactivity.js +4 -0
- package/dist/socket.cjs +2685 -0
- package/dist/socket.d.cts +167 -0
- package/dist/socket.d.ts +167 -0
- package/dist/socket.js +238 -0
- package/dist/style-XEUAGGJK.js +5 -0
- package/dist/utils.cjs +397 -0
- package/dist/utils.d.cts +111 -0
- package/dist/utils.d.ts +111 -0
- package/dist/utils.js +4 -0
- package/dist/voodoo.core.js +8213 -0
- package/dist/voodoo.core.min.js +146 -0
- package/dist/voodoo.full.js +21193 -0
- package/dist/voodoo.full.min.js +1784 -0
- package/dist/voodoo.js +14185 -0
- package/dist/voodoo.min.js +420 -0
- package/package.json +127 -0
|
@@ -0,0 +1,946 @@
|
|
|
1
|
+
import { reactive } from './chunk-NNU6WOOU.js';
|
|
2
|
+
import { warnOnce } from './chunk-A2UOVQBP.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Voodoo.js v0.4.6
|
|
6
|
+
* JavaScript feels like magic.
|
|
7
|
+
* (c) 2026 Voodoo.js contributors. MIT License.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// src/devtools/bus.ts
|
|
11
|
+
var listeners = /* @__PURE__ */ new Map();
|
|
12
|
+
var devtoolsBus = {
|
|
13
|
+
/** Publishes an event. With no listeners, the call is practically free. */
|
|
14
|
+
emit(type, data) {
|
|
15
|
+
const set = listeners.get(type);
|
|
16
|
+
if (!set || set.size === 0) return;
|
|
17
|
+
for (const listener of [...set]) {
|
|
18
|
+
try {
|
|
19
|
+
listener(data);
|
|
20
|
+
} catch (err) {
|
|
21
|
+
console.error("[Voodoo] error in devtools listener:", err);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
/** Subscribes to an event type. Returns the function that unsubscribes. */
|
|
26
|
+
on(type, callback) {
|
|
27
|
+
let set = listeners.get(type);
|
|
28
|
+
if (!set) listeners.set(type, set = /* @__PURE__ */ new Set());
|
|
29
|
+
set.add(callback);
|
|
30
|
+
return () => {
|
|
31
|
+
set?.delete(callback);
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
/** Cancels a specific subscription. */
|
|
35
|
+
off(type, callback) {
|
|
36
|
+
listeners.get(type)?.delete(callback);
|
|
37
|
+
},
|
|
38
|
+
/** Removes all listeners of a type or all listeners. */
|
|
39
|
+
clear(type) {
|
|
40
|
+
if (type) listeners.delete(type);
|
|
41
|
+
else listeners.clear();
|
|
42
|
+
},
|
|
43
|
+
/** Number of listeners registered for a type. */
|
|
44
|
+
count(type) {
|
|
45
|
+
return listeners.get(type)?.size ?? 0;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// src/socket/protocol.ts
|
|
50
|
+
var ENGINE = {
|
|
51
|
+
OPEN: "0",
|
|
52
|
+
CLOSE: "1",
|
|
53
|
+
PING: "2",
|
|
54
|
+
PONG: "3",
|
|
55
|
+
MESSAGE: "4",
|
|
56
|
+
UPGRADE: "5",
|
|
57
|
+
NOOP: "6"
|
|
58
|
+
};
|
|
59
|
+
var SIO = {
|
|
60
|
+
CONNECT: 0,
|
|
61
|
+
DISCONNECT: 1,
|
|
62
|
+
EVENT: 2,
|
|
63
|
+
ACK: 3,
|
|
64
|
+
CONNECT_ERROR: 4,
|
|
65
|
+
BINARY_EVENT: 5,
|
|
66
|
+
BINARY_ACK: 6
|
|
67
|
+
};
|
|
68
|
+
function parseJson(text) {
|
|
69
|
+
if (!text) return void 0;
|
|
70
|
+
try {
|
|
71
|
+
return JSON.parse(text);
|
|
72
|
+
} catch {
|
|
73
|
+
return void 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function decodeSocketIo(body) {
|
|
77
|
+
if (!body) return null;
|
|
78
|
+
const type = Number(body[0]);
|
|
79
|
+
if (!Number.isInteger(type) || type < 0 || type > 6) return null;
|
|
80
|
+
let i = 1;
|
|
81
|
+
let namespace = "/";
|
|
82
|
+
if (body[i] === "/") {
|
|
83
|
+
const comma = body.indexOf(",", i);
|
|
84
|
+
if (comma === -1) {
|
|
85
|
+
return { type, namespace: body.slice(i) };
|
|
86
|
+
}
|
|
87
|
+
namespace = body.slice(i, comma);
|
|
88
|
+
i = comma + 1;
|
|
89
|
+
}
|
|
90
|
+
let ack;
|
|
91
|
+
const ackStart = i;
|
|
92
|
+
while (i < body.length && body.charCodeAt(i) >= 48 && body.charCodeAt(i) <= 57) i++;
|
|
93
|
+
if (i > ackStart) ack = Number(body.slice(ackStart, i));
|
|
94
|
+
const rest = body.slice(i);
|
|
95
|
+
return { type, namespace, ack, data: parseJson(rest) };
|
|
96
|
+
}
|
|
97
|
+
function decodeEngine(raw) {
|
|
98
|
+
if (typeof raw !== "string" || !raw) return { kind: "unknown", raw: String(raw ?? "") };
|
|
99
|
+
const code = raw[0];
|
|
100
|
+
const body = raw.slice(1);
|
|
101
|
+
switch (code) {
|
|
102
|
+
case ENGINE.OPEN: {
|
|
103
|
+
const data = parseJson(body);
|
|
104
|
+
return {
|
|
105
|
+
kind: "open",
|
|
106
|
+
handshake: {
|
|
107
|
+
sid: data?.sid ?? "",
|
|
108
|
+
// Server values take precedence. The defaults here are from Engine.IO
|
|
109
|
+
// v4 and only come into play if the handshake is incomplete.
|
|
110
|
+
pingInterval: Number(data?.pingInterval) || 25e3,
|
|
111
|
+
pingTimeout: Number(data?.pingTimeout) || 2e4,
|
|
112
|
+
upgrades: data?.upgrades,
|
|
113
|
+
maxPayload: data?.maxPayload
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
case ENGINE.CLOSE:
|
|
118
|
+
return { kind: "close" };
|
|
119
|
+
case ENGINE.PING:
|
|
120
|
+
return { kind: "ping" };
|
|
121
|
+
case ENGINE.PONG:
|
|
122
|
+
return { kind: "pong" };
|
|
123
|
+
case ENGINE.MESSAGE: {
|
|
124
|
+
const packet = decodeSocketIo(body);
|
|
125
|
+
return packet ? { kind: "message", packet } : { kind: "unknown", raw };
|
|
126
|
+
}
|
|
127
|
+
case ENGINE.NOOP:
|
|
128
|
+
return { kind: "noop" };
|
|
129
|
+
default:
|
|
130
|
+
return { kind: "unknown", raw };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function encodeSocketIo(packet) {
|
|
134
|
+
let out = ENGINE.MESSAGE + String(packet.type);
|
|
135
|
+
if (packet.namespace && packet.namespace !== "/") out += `${packet.namespace},`;
|
|
136
|
+
if (packet.ack !== void 0) out += String(packet.ack);
|
|
137
|
+
if (packet.data !== void 0) out += JSON.stringify(packet.data);
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
function engineURL(base, path = "/socket.io/") {
|
|
141
|
+
const pathname = `/${path.replace(/^\/+|\/+$/g, "")}/`;
|
|
142
|
+
const query = "EIO=4&transport=websocket";
|
|
143
|
+
try {
|
|
144
|
+
const u = new URL(base);
|
|
145
|
+
u.pathname = pathname;
|
|
146
|
+
u.search = query;
|
|
147
|
+
return u.toString();
|
|
148
|
+
} catch {
|
|
149
|
+
return `${base.replace(/\/+$/, "")}${pathname}?${query}`;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// src/socket/index.ts
|
|
154
|
+
var defaults = {
|
|
155
|
+
baseURL: "",
|
|
156
|
+
transport: "ws",
|
|
157
|
+
reconnect: true,
|
|
158
|
+
reconnectDelay: 500,
|
|
159
|
+
reconnectMaxDelay: 3e4,
|
|
160
|
+
reconnectMaxAttempts: Infinity,
|
|
161
|
+
jitter: 0.3,
|
|
162
|
+
heartbeat: 25e3,
|
|
163
|
+
heartbeatTimeout: 1e4,
|
|
164
|
+
pingPayload: "ping",
|
|
165
|
+
pongPayload: "pong",
|
|
166
|
+
queueLimit: 64,
|
|
167
|
+
json: true,
|
|
168
|
+
path: "/socket.io/",
|
|
169
|
+
namespace: "/",
|
|
170
|
+
auth: null,
|
|
171
|
+
WebSocket: null,
|
|
172
|
+
manual: false,
|
|
173
|
+
joinEvent: "join",
|
|
174
|
+
leaveEvent: "leave",
|
|
175
|
+
presenceEvent: "room:members",
|
|
176
|
+
memberJoinEvent: "room:joined",
|
|
177
|
+
memberLeaveEvent: "room:left",
|
|
178
|
+
roomBuffer: 50
|
|
179
|
+
};
|
|
180
|
+
var incomingInterceptors = [];
|
|
181
|
+
var outgoingInterceptors = [];
|
|
182
|
+
function use(list, fn) {
|
|
183
|
+
list.push(fn);
|
|
184
|
+
return () => {
|
|
185
|
+
const i = list.indexOf(fn);
|
|
186
|
+
if (i > -1) list.splice(i, 1);
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function apply(list, message) {
|
|
190
|
+
let current = message;
|
|
191
|
+
for (const fn of list) {
|
|
192
|
+
if (!current) return null;
|
|
193
|
+
const result = fn(current);
|
|
194
|
+
if (result === null) return null;
|
|
195
|
+
if (result) current = result;
|
|
196
|
+
}
|
|
197
|
+
return current;
|
|
198
|
+
}
|
|
199
|
+
var openConnections = /* @__PURE__ */ new Set();
|
|
200
|
+
function sameMember(a, b) {
|
|
201
|
+
if (a === b) return true;
|
|
202
|
+
const ida = a && typeof a === "object" ? a.id : a;
|
|
203
|
+
const idb = b && typeof b === "object" ? b.id : b;
|
|
204
|
+
return ida !== void 0 && ida === idb;
|
|
205
|
+
}
|
|
206
|
+
function resolveSocketURL(url, baseURL = defaults.baseURL) {
|
|
207
|
+
let address = url || "/";
|
|
208
|
+
if (baseURL && !/^(wss?|https?):\/\//i.test(address) && !address.startsWith("//")) {
|
|
209
|
+
address = `${baseURL.replace(/\/$/, "")}/${address.replace(/^\//, "")}`;
|
|
210
|
+
}
|
|
211
|
+
if (/^wss?:\/\//i.test(address)) return address;
|
|
212
|
+
if (/^https?:\/\//i.test(address)) return address.replace(/^http/i, "ws");
|
|
213
|
+
if (typeof location === "undefined" || !location.host) return address;
|
|
214
|
+
const protocol = location.protocol === "https:" ? "wss:" : "ws:";
|
|
215
|
+
return `${protocol}//${location.host}${address.startsWith("/") ? address : `/${address}`}`;
|
|
216
|
+
}
|
|
217
|
+
function constructor(options) {
|
|
218
|
+
const chosen = options.WebSocket ?? defaults.WebSocket ?? globalThis.WebSocket;
|
|
219
|
+
return typeof chosen === "function" ? chosen : null;
|
|
220
|
+
}
|
|
221
|
+
function socketSupported() {
|
|
222
|
+
return constructor({}) !== null;
|
|
223
|
+
}
|
|
224
|
+
function createSocket(url, options = {}) {
|
|
225
|
+
const opts = { ...defaults, ...options };
|
|
226
|
+
const Impl = constructor(options);
|
|
227
|
+
const base = resolveSocketURL(url, opts.baseURL);
|
|
228
|
+
const socketIo = opts.transport === "socket.io";
|
|
229
|
+
const address = socketIo ? engineURL(base, opts.path) : base;
|
|
230
|
+
const state = reactive({
|
|
231
|
+
state: "closed",
|
|
232
|
+
connected: false,
|
|
233
|
+
attempts: 0,
|
|
234
|
+
queued: 0,
|
|
235
|
+
error: null
|
|
236
|
+
});
|
|
237
|
+
const listeners2 = /* @__PURE__ */ new Map();
|
|
238
|
+
const queue = [];
|
|
239
|
+
const acks = /* @__PURE__ */ new Map();
|
|
240
|
+
const rooms = /* @__PURE__ */ new Map();
|
|
241
|
+
let ws = null;
|
|
242
|
+
let nextAck = 1;
|
|
243
|
+
let closedPurposefully = false;
|
|
244
|
+
let handshake = null;
|
|
245
|
+
let openedAt = 0;
|
|
246
|
+
let reconnectTimer = null;
|
|
247
|
+
let heartbeatTimer = null;
|
|
248
|
+
let watchdogTimer = null;
|
|
249
|
+
function on(event, listener) {
|
|
250
|
+
let set = listeners2.get(event);
|
|
251
|
+
if (!set) listeners2.set(event, set = /* @__PURE__ */ new Set());
|
|
252
|
+
set.add(listener);
|
|
253
|
+
return () => {
|
|
254
|
+
set?.delete(listener);
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
function once(event, listener) {
|
|
258
|
+
const cancel = on(event, (data, ack) => {
|
|
259
|
+
cancel();
|
|
260
|
+
listener(data, ack);
|
|
261
|
+
});
|
|
262
|
+
return cancel;
|
|
263
|
+
}
|
|
264
|
+
function off(event, listener) {
|
|
265
|
+
if (!event) {
|
|
266
|
+
listeners2.clear();
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (!listener) {
|
|
270
|
+
listeners2.delete(event);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
listeners2.get(event)?.delete(listener);
|
|
274
|
+
}
|
|
275
|
+
function deliver(event, data, ack) {
|
|
276
|
+
for (const name of event === "message" ? [event] : [event, "message"]) {
|
|
277
|
+
const set = listeners2.get(name);
|
|
278
|
+
if (!set) continue;
|
|
279
|
+
for (const listener of [...set]) {
|
|
280
|
+
try {
|
|
281
|
+
listener(data, ack);
|
|
282
|
+
} catch (err) {
|
|
283
|
+
console.error("[Voodoo] error in socket listener:", err);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function changeState(newState) {
|
|
289
|
+
if (state.state === newState) return;
|
|
290
|
+
state.state = newState;
|
|
291
|
+
state.connected = newState === "open";
|
|
292
|
+
deliver(`state:${newState}`, newState);
|
|
293
|
+
}
|
|
294
|
+
function registerError(message) {
|
|
295
|
+
state.error = message;
|
|
296
|
+
deliver("error", message);
|
|
297
|
+
devtoolsBus.emit("network", {
|
|
298
|
+
method: "WS",
|
|
299
|
+
url: address,
|
|
300
|
+
ok: false,
|
|
301
|
+
error: message,
|
|
302
|
+
source: "socket"
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
function stopTimers() {
|
|
306
|
+
if (reconnectTimer !== null) {
|
|
307
|
+
clearTimeout(reconnectTimer);
|
|
308
|
+
reconnectTimer = null;
|
|
309
|
+
}
|
|
310
|
+
if (heartbeatTimer !== null) {
|
|
311
|
+
clearInterval(heartbeatTimer);
|
|
312
|
+
heartbeatTimer = null;
|
|
313
|
+
}
|
|
314
|
+
if (watchdogTimer !== null) {
|
|
315
|
+
clearTimeout(watchdogTimer);
|
|
316
|
+
watchdogTimer = null;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
function armWatchdog(ms) {
|
|
320
|
+
if (watchdogTimer !== null) clearTimeout(watchdogTimer);
|
|
321
|
+
watchdogTimer = null;
|
|
322
|
+
if (!ms || ms <= 0) return;
|
|
323
|
+
watchdogTimer = setTimeout(() => {
|
|
324
|
+
watchdogTimer = null;
|
|
325
|
+
registerError("connection unresponsive");
|
|
326
|
+
tearDown();
|
|
327
|
+
}, ms);
|
|
328
|
+
}
|
|
329
|
+
function silenceWindow() {
|
|
330
|
+
if (socketIo) {
|
|
331
|
+
const h = handshake;
|
|
332
|
+
return h ? h.pingInterval + h.pingTimeout : 0;
|
|
333
|
+
}
|
|
334
|
+
return opts.heartbeat > 0 ? opts.heartbeat + opts.heartbeatTimeout : 0;
|
|
335
|
+
}
|
|
336
|
+
function markAlive() {
|
|
337
|
+
armWatchdog(silenceWindow());
|
|
338
|
+
}
|
|
339
|
+
function startHeartbeat() {
|
|
340
|
+
if (socketIo || opts.heartbeat <= 0) return;
|
|
341
|
+
if (heartbeatTimer !== null) clearInterval(heartbeatTimer);
|
|
342
|
+
heartbeatTimer = setInterval(() => {
|
|
343
|
+
if (opts.pingPayload == null) return;
|
|
344
|
+
sendText(opts.pingPayload);
|
|
345
|
+
}, opts.heartbeat);
|
|
346
|
+
}
|
|
347
|
+
function attemptDelay(n) {
|
|
348
|
+
const raw = opts.reconnectDelay * 2 ** Math.max(0, n - 1);
|
|
349
|
+
const cap = Math.min(raw, opts.reconnectMaxDelay);
|
|
350
|
+
const deviation = cap * Math.min(Math.max(opts.jitter, 0), 1);
|
|
351
|
+
return Math.max(0, Math.round(cap - deviation + Math.random() * deviation * 2));
|
|
352
|
+
}
|
|
353
|
+
function scheduleReconnect() {
|
|
354
|
+
if (closedPurposefully || !opts.reconnect) {
|
|
355
|
+
changeState("closed");
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
if (state.attempts >= opts.reconnectMaxAttempts) {
|
|
359
|
+
registerError(`reconnection gave up after ${state.attempts} attempts`);
|
|
360
|
+
changeState("closed");
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
state.attempts += 1;
|
|
364
|
+
changeState("reconnecting");
|
|
365
|
+
const delay = attemptDelay(state.attempts);
|
|
366
|
+
deliver("reconnecting", { attempt: state.attempts, delay });
|
|
367
|
+
if (reconnectTimer !== null) clearTimeout(reconnectTimer);
|
|
368
|
+
reconnectTimer = setTimeout(() => {
|
|
369
|
+
reconnectTimer = null;
|
|
370
|
+
if (closedPurposefully) return;
|
|
371
|
+
connect();
|
|
372
|
+
}, delay);
|
|
373
|
+
}
|
|
374
|
+
function enqueue(text) {
|
|
375
|
+
if (opts.queueLimit <= 0) return;
|
|
376
|
+
if (queue.length >= opts.queueLimit) {
|
|
377
|
+
queue.shift();
|
|
378
|
+
warnOnce(
|
|
379
|
+
`socket-queue:${address}`,
|
|
380
|
+
`The send queue for ${address} reached the limit of ${opts.queueLimit} messages and started discarding the oldest. Increase "queueLimit" or send less while the connection is closed.`
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
queue.push(text);
|
|
384
|
+
state.queued = queue.length;
|
|
385
|
+
}
|
|
386
|
+
function drainQueue() {
|
|
387
|
+
if (!queue.length) return;
|
|
388
|
+
const pending = queue.splice(0, queue.length);
|
|
389
|
+
state.queued = 0;
|
|
390
|
+
for (const text of pending) sendText(text);
|
|
391
|
+
}
|
|
392
|
+
function sendText(text) {
|
|
393
|
+
if (ws && ws.readyState === 1 && (!socketIo || state.connected)) {
|
|
394
|
+
try {
|
|
395
|
+
ws.send(text);
|
|
396
|
+
return true;
|
|
397
|
+
} catch (err) {
|
|
398
|
+
registerError(err?.message ?? "send failed");
|
|
399
|
+
return false;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
enqueue(text);
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
function emit(event, data, ack) {
|
|
406
|
+
const message = apply(outgoingInterceptors, { event, data, url: address });
|
|
407
|
+
if (!message) return false;
|
|
408
|
+
devtoolsBus.emit("event", {
|
|
409
|
+
type: `socket:${message.event}`,
|
|
410
|
+
detail: message.data,
|
|
411
|
+
source: "socket:out"
|
|
412
|
+
});
|
|
413
|
+
if (socketIo) {
|
|
414
|
+
let num;
|
|
415
|
+
if (ack) {
|
|
416
|
+
num = nextAck++;
|
|
417
|
+
acks.set(num, ack);
|
|
418
|
+
}
|
|
419
|
+
const args = message.data === void 0 ? [message.event] : [message.event, message.data];
|
|
420
|
+
return sendText(
|
|
421
|
+
encodeSocketIo({
|
|
422
|
+
type: SIO.EVENT,
|
|
423
|
+
namespace: opts.namespace,
|
|
424
|
+
ack: num,
|
|
425
|
+
data: args
|
|
426
|
+
})
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
return sendText(
|
|
430
|
+
opts.json ? JSON.stringify({ event: message.event, data: message.data }) : String(message.data ?? message.event)
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
function send(data) {
|
|
434
|
+
const message = apply(outgoingInterceptors, { event: "message", data, url: address });
|
|
435
|
+
if (!message) return false;
|
|
436
|
+
const payload = message.data;
|
|
437
|
+
const text = typeof payload === "string" ? payload : JSON.stringify(payload);
|
|
438
|
+
if (socketIo) {
|
|
439
|
+
return sendText(
|
|
440
|
+
encodeSocketIo({
|
|
441
|
+
type: SIO.EVENT,
|
|
442
|
+
namespace: opts.namespace,
|
|
443
|
+
data: ["message", payload]
|
|
444
|
+
})
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
return sendText(text);
|
|
448
|
+
}
|
|
449
|
+
function receive(event, data, raw, ack) {
|
|
450
|
+
const message = apply(incomingInterceptors, {
|
|
451
|
+
event,
|
|
452
|
+
data,
|
|
453
|
+
url: address,
|
|
454
|
+
raw
|
|
455
|
+
});
|
|
456
|
+
if (!message) return;
|
|
457
|
+
devtoolsBus.emit("event", {
|
|
458
|
+
type: `socket:${message.event}`,
|
|
459
|
+
detail: message.data,
|
|
460
|
+
source: "socket:in"
|
|
461
|
+
});
|
|
462
|
+
routePresence(message.event, message.data);
|
|
463
|
+
routeRoom(message.event, message.data, ack);
|
|
464
|
+
deliver(message.event, message.data, ack);
|
|
465
|
+
}
|
|
466
|
+
function roomName(data) {
|
|
467
|
+
if (!data || typeof data !== "object" || Array.isArray(data)) return null;
|
|
468
|
+
const obj = data;
|
|
469
|
+
const name = obj.room ?? obj.sala;
|
|
470
|
+
return typeof name === "string" && name ? name : null;
|
|
471
|
+
}
|
|
472
|
+
function roomPayload(data) {
|
|
473
|
+
const obj = data;
|
|
474
|
+
if ("data" in obj) return obj.data;
|
|
475
|
+
if ("dados" in obj) return obj.dados;
|
|
476
|
+
return obj;
|
|
477
|
+
}
|
|
478
|
+
function deliverInRoom(room, event, data, ack) {
|
|
479
|
+
for (const name of event === "message" ? [event] : [event, "message"]) {
|
|
480
|
+
const set = room.listeners.get(name);
|
|
481
|
+
if (!set) continue;
|
|
482
|
+
for (const listener of [...set]) {
|
|
483
|
+
try {
|
|
484
|
+
listener(data, ack);
|
|
485
|
+
} catch (err) {
|
|
486
|
+
console.error("[Voodoo] error in room listener:", err);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
function routeRoom(event, data, ack) {
|
|
492
|
+
const name = roomName(data);
|
|
493
|
+
if (!name) return;
|
|
494
|
+
const room = rooms.get(name);
|
|
495
|
+
if (!room) return;
|
|
496
|
+
if (event === opts.presenceEvent || event === opts.memberJoinEvent || event === opts.memberLeaveEvent) {
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
const payload = roomPayload(data);
|
|
500
|
+
room.state.messages.push(payload);
|
|
501
|
+
if (room.state.messages.length > room.buffer) {
|
|
502
|
+
room.state.messages.splice(0, room.state.messages.length - room.buffer);
|
|
503
|
+
}
|
|
504
|
+
deliverInRoom(room, event, payload, ack);
|
|
505
|
+
}
|
|
506
|
+
function routePresence(event, data) {
|
|
507
|
+
const name = roomName(data);
|
|
508
|
+
if (!name) return;
|
|
509
|
+
const room = rooms.get(name);
|
|
510
|
+
if (!room) return;
|
|
511
|
+
const obj = data;
|
|
512
|
+
if (event === opts.presenceEvent) {
|
|
513
|
+
const list = obj.members ?? obj.membros;
|
|
514
|
+
if (Array.isArray(list)) room.state.members = [...list];
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
const member = obj.member ?? obj.membro ?? obj.id;
|
|
518
|
+
if (member === void 0) return;
|
|
519
|
+
if (event === opts.memberJoinEvent) {
|
|
520
|
+
if (!room.state.members.some((m) => sameMember(m, member))) {
|
|
521
|
+
room.state.members.push(member);
|
|
522
|
+
}
|
|
523
|
+
deliverInRoom(room, "entrou", member);
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
if (event === opts.memberLeaveEvent) {
|
|
527
|
+
const i = room.state.members.findIndex((m) => sameMember(m, member));
|
|
528
|
+
if (i > -1) room.state.members.splice(i, 1);
|
|
529
|
+
deliverInRoom(room, "saiu", member);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
function requestJoin(room, name) {
|
|
533
|
+
room.state.state = "joining";
|
|
534
|
+
emit(opts.joinEvent, { room: name, private: room.private });
|
|
535
|
+
}
|
|
536
|
+
function rejoinRooms() {
|
|
537
|
+
for (const [name, room] of rooms) {
|
|
538
|
+
if (room.state.state === "left") continue;
|
|
539
|
+
requestJoin(room, name);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
function join(name, config = {}) {
|
|
543
|
+
const existing = rooms.get(name);
|
|
544
|
+
if (existing && existing.state.state !== "left") return existing.public;
|
|
545
|
+
const isPrivate = config.privada ?? config.private ?? false;
|
|
546
|
+
const roomState = reactive({
|
|
547
|
+
state: "joining",
|
|
548
|
+
members: [],
|
|
549
|
+
messages: []
|
|
550
|
+
});
|
|
551
|
+
const roomListeners = /* @__PURE__ */ new Map();
|
|
552
|
+
const sendInRoom = (event, data, target) => emit(event, target ? { room: name, to: target, data } : { room: name, data });
|
|
553
|
+
const public_ = {
|
|
554
|
+
get name() {
|
|
555
|
+
return name;
|
|
556
|
+
},
|
|
557
|
+
get private() {
|
|
558
|
+
return isPrivate;
|
|
559
|
+
},
|
|
560
|
+
get privada() {
|
|
561
|
+
return isPrivate;
|
|
562
|
+
},
|
|
563
|
+
get state() {
|
|
564
|
+
return roomState.state;
|
|
565
|
+
},
|
|
566
|
+
get estado() {
|
|
567
|
+
return roomState.state;
|
|
568
|
+
},
|
|
569
|
+
get members() {
|
|
570
|
+
return roomState.members;
|
|
571
|
+
},
|
|
572
|
+
get membros() {
|
|
573
|
+
return roomState.members;
|
|
574
|
+
},
|
|
575
|
+
get messages() {
|
|
576
|
+
return roomState.messages;
|
|
577
|
+
},
|
|
578
|
+
get mensagens() {
|
|
579
|
+
return roomState.messages;
|
|
580
|
+
},
|
|
581
|
+
on(event, listener) {
|
|
582
|
+
let set = roomListeners.get(event);
|
|
583
|
+
if (!set) roomListeners.set(event, set = /* @__PURE__ */ new Set());
|
|
584
|
+
set.add(listener);
|
|
585
|
+
return () => {
|
|
586
|
+
set?.delete(listener);
|
|
587
|
+
};
|
|
588
|
+
},
|
|
589
|
+
off(event, listener) {
|
|
590
|
+
if (!event) roomListeners.clear();
|
|
591
|
+
else if (!listener) roomListeners.delete(event);
|
|
592
|
+
else roomListeners.get(event)?.delete(listener);
|
|
593
|
+
},
|
|
594
|
+
emit: (event, data) => sendInRoom(event, data),
|
|
595
|
+
enviar: (event, data) => sendInRoom(event, data),
|
|
596
|
+
to: (target) => ({
|
|
597
|
+
emit: (event, data) => sendInRoom(event, data, target)
|
|
598
|
+
}),
|
|
599
|
+
leave: () => leave(name),
|
|
600
|
+
sair: () => leave(name)
|
|
601
|
+
};
|
|
602
|
+
const internal = {
|
|
603
|
+
public: public_,
|
|
604
|
+
state: roomState,
|
|
605
|
+
listeners: roomListeners,
|
|
606
|
+
private: isPrivate,
|
|
607
|
+
buffer: config.buffer ?? opts.roomBuffer
|
|
608
|
+
};
|
|
609
|
+
rooms.set(name, internal);
|
|
610
|
+
requestJoin(internal, name);
|
|
611
|
+
if (state.connected) roomState.state = "joined";
|
|
612
|
+
return public_;
|
|
613
|
+
}
|
|
614
|
+
function leave(name) {
|
|
615
|
+
const room = rooms.get(name);
|
|
616
|
+
if (!room) return;
|
|
617
|
+
rooms.delete(name);
|
|
618
|
+
room.state.state = "left";
|
|
619
|
+
room.listeners.clear();
|
|
620
|
+
room.state.members = [];
|
|
621
|
+
if (state.connected) emit(opts.leaveEvent, { room: name });
|
|
622
|
+
}
|
|
623
|
+
function to(target) {
|
|
624
|
+
return {
|
|
625
|
+
emit: (event, data) => emit(event, { to: target, data })
|
|
626
|
+
};
|
|
627
|
+
}
|
|
628
|
+
function receiveNative(raw) {
|
|
629
|
+
if (typeof raw !== "string") {
|
|
630
|
+
receive("message", raw);
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
if (opts.pongPayload != null && raw === opts.pongPayload) return;
|
|
634
|
+
let payload = raw;
|
|
635
|
+
if (opts.json) {
|
|
636
|
+
const start = raw.trimStart()[0];
|
|
637
|
+
if (start === "{" || start === "[") {
|
|
638
|
+
try {
|
|
639
|
+
payload = JSON.parse(raw);
|
|
640
|
+
} catch {
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
if (payload && typeof payload === "object" && !Array.isArray(payload)) {
|
|
645
|
+
const obj = payload;
|
|
646
|
+
const name = obj.event ?? obj.type;
|
|
647
|
+
if (typeof name === "string" && name) {
|
|
648
|
+
receive(name, "data" in obj ? obj.data : obj, raw);
|
|
649
|
+
return;
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
receive("message", payload, raw);
|
|
653
|
+
}
|
|
654
|
+
function receiveSocketIo(raw) {
|
|
655
|
+
const packet = decodeEngine(raw);
|
|
656
|
+
switch (packet.kind) {
|
|
657
|
+
case "open":
|
|
658
|
+
handshake = packet.handshake;
|
|
659
|
+
sendHandshakeConnect();
|
|
660
|
+
markAlive();
|
|
661
|
+
return;
|
|
662
|
+
case "ping":
|
|
663
|
+
ws?.send(ENGINE.PONG);
|
|
664
|
+
markAlive();
|
|
665
|
+
return;
|
|
666
|
+
case "pong":
|
|
667
|
+
case "noop":
|
|
668
|
+
markAlive();
|
|
669
|
+
return;
|
|
670
|
+
case "close":
|
|
671
|
+
tearDown();
|
|
672
|
+
return;
|
|
673
|
+
case "message":
|
|
674
|
+
break;
|
|
675
|
+
default:
|
|
676
|
+
markAlive();
|
|
677
|
+
warnOnce(
|
|
678
|
+
`socket-frame:${address}`,
|
|
679
|
+
`The server sent a frame this Socket.IO client cannot read (binary or upgrade). Binary attachments are not implemented; send data as JSON or base64.`
|
|
680
|
+
);
|
|
681
|
+
return;
|
|
682
|
+
}
|
|
683
|
+
const { packet: socketPacket } = packet;
|
|
684
|
+
switch (socketPacket.type) {
|
|
685
|
+
case SIO.CONNECT:
|
|
686
|
+
confirmOpen();
|
|
687
|
+
return;
|
|
688
|
+
case SIO.CONNECT_ERROR: {
|
|
689
|
+
const data = socketPacket.data;
|
|
690
|
+
registerError(data?.message ?? "connection refused by server");
|
|
691
|
+
tearDown();
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
694
|
+
case SIO.DISCONNECT:
|
|
695
|
+
tearDown();
|
|
696
|
+
return;
|
|
697
|
+
case SIO.ACK: {
|
|
698
|
+
const response = Array.isArray(socketPacket.data) ? socketPacket.data[0] : socketPacket.data;
|
|
699
|
+
if (socketPacket.ack !== void 0) {
|
|
700
|
+
const callback = acks.get(socketPacket.ack);
|
|
701
|
+
acks.delete(socketPacket.ack);
|
|
702
|
+
callback?.(response);
|
|
703
|
+
}
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
case SIO.EVENT: {
|
|
707
|
+
const args = Array.isArray(socketPacket.data) ? socketPacket.data : [];
|
|
708
|
+
const name = typeof args[0] === "string" ? args[0] : "message";
|
|
709
|
+
const payload = args.length > 2 ? args.slice(1) : args[1];
|
|
710
|
+
let responder;
|
|
711
|
+
if (socketPacket.ack !== void 0) {
|
|
712
|
+
const num = socketPacket.ack;
|
|
713
|
+
responder = (response) => {
|
|
714
|
+
sendText(
|
|
715
|
+
encodeSocketIo({
|
|
716
|
+
type: SIO.ACK,
|
|
717
|
+
namespace: opts.namespace,
|
|
718
|
+
ack: num,
|
|
719
|
+
data: [response]
|
|
720
|
+
})
|
|
721
|
+
);
|
|
722
|
+
};
|
|
723
|
+
}
|
|
724
|
+
receive(name, payload, typeof raw === "string" ? raw : void 0, responder);
|
|
725
|
+
return;
|
|
726
|
+
}
|
|
727
|
+
default:
|
|
728
|
+
warnOnce(
|
|
729
|
+
`socket-packet:${address}`,
|
|
730
|
+
`Socket.IO packet type ${socketPacket.type} ignored: binary attachments are not implemented in this client.`
|
|
731
|
+
);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
function sendHandshakeConnect() {
|
|
735
|
+
ws?.send(
|
|
736
|
+
encodeSocketIo({
|
|
737
|
+
type: SIO.CONNECT,
|
|
738
|
+
namespace: opts.namespace,
|
|
739
|
+
data: options.auth ?? defaults.auth ?? void 0
|
|
740
|
+
})
|
|
741
|
+
);
|
|
742
|
+
}
|
|
743
|
+
function confirmOpen() {
|
|
744
|
+
state.attempts = 0;
|
|
745
|
+
state.error = null;
|
|
746
|
+
openedAt = Date.now();
|
|
747
|
+
changeState("open");
|
|
748
|
+
startHeartbeat();
|
|
749
|
+
markAlive();
|
|
750
|
+
rejoinRooms();
|
|
751
|
+
drainQueue();
|
|
752
|
+
for (const room of rooms.values()) {
|
|
753
|
+
if (room.state.state === "joining") room.state.state = "joined";
|
|
754
|
+
}
|
|
755
|
+
deliver("open", { url: address });
|
|
756
|
+
devtoolsBus.emit("network", {
|
|
757
|
+
method: "WS",
|
|
758
|
+
url: address,
|
|
759
|
+
status: 101,
|
|
760
|
+
ok: true,
|
|
761
|
+
source: "socket"
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
function releaseWs() {
|
|
765
|
+
const prev = ws;
|
|
766
|
+
if (prev) {
|
|
767
|
+
prev.onopen = null;
|
|
768
|
+
prev.onclose = null;
|
|
769
|
+
prev.onerror = null;
|
|
770
|
+
prev.onmessage = null;
|
|
771
|
+
}
|
|
772
|
+
ws = null;
|
|
773
|
+
return prev;
|
|
774
|
+
}
|
|
775
|
+
function tearDown() {
|
|
776
|
+
const prev = releaseWs();
|
|
777
|
+
handshake = null;
|
|
778
|
+
if (heartbeatTimer !== null) {
|
|
779
|
+
clearInterval(heartbeatTimer);
|
|
780
|
+
heartbeatTimer = null;
|
|
781
|
+
}
|
|
782
|
+
if (watchdogTimer !== null) {
|
|
783
|
+
clearTimeout(watchdogTimer);
|
|
784
|
+
watchdogTimer = null;
|
|
785
|
+
}
|
|
786
|
+
state.connected = false;
|
|
787
|
+
try {
|
|
788
|
+
prev?.close();
|
|
789
|
+
} catch {
|
|
790
|
+
}
|
|
791
|
+
deliver("close", { url: address });
|
|
792
|
+
scheduleReconnect();
|
|
793
|
+
}
|
|
794
|
+
function connect() {
|
|
795
|
+
if (!Impl) return;
|
|
796
|
+
if (ws) return;
|
|
797
|
+
changeState(state.attempts > 0 ? "reconnecting" : "connecting");
|
|
798
|
+
let newWs;
|
|
799
|
+
try {
|
|
800
|
+
newWs = new Impl(address, opts.protocols);
|
|
801
|
+
} catch (err) {
|
|
802
|
+
registerError(err?.message ?? "failed to open connection");
|
|
803
|
+
scheduleReconnect();
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
ws = newWs;
|
|
807
|
+
newWs.onopen = () => {
|
|
808
|
+
if (ws !== newWs) return;
|
|
809
|
+
if (socketIo) markAlive();
|
|
810
|
+
else confirmOpen();
|
|
811
|
+
};
|
|
812
|
+
newWs.onmessage = (event) => {
|
|
813
|
+
if (ws !== newWs) return;
|
|
814
|
+
markAlive();
|
|
815
|
+
if (socketIo) receiveSocketIo(event?.data);
|
|
816
|
+
else receiveNative(event?.data);
|
|
817
|
+
};
|
|
818
|
+
newWs.onerror = () => {
|
|
819
|
+
if (ws !== newWs) return;
|
|
820
|
+
registerError("connection failed");
|
|
821
|
+
};
|
|
822
|
+
newWs.onclose = (event) => {
|
|
823
|
+
if (ws !== newWs) return;
|
|
824
|
+
releaseWs();
|
|
825
|
+
handshake = null;
|
|
826
|
+
if (heartbeatTimer !== null) {
|
|
827
|
+
clearInterval(heartbeatTimer);
|
|
828
|
+
heartbeatTimer = null;
|
|
829
|
+
}
|
|
830
|
+
if (watchdogTimer !== null) {
|
|
831
|
+
clearTimeout(watchdogTimer);
|
|
832
|
+
watchdogTimer = null;
|
|
833
|
+
}
|
|
834
|
+
state.connected = false;
|
|
835
|
+
const detail = event;
|
|
836
|
+
deliver("close", { url: address, code: detail?.code, reason: detail?.reason });
|
|
837
|
+
devtoolsBus.emit("network", {
|
|
838
|
+
method: "WS",
|
|
839
|
+
url: address,
|
|
840
|
+
status: detail?.code,
|
|
841
|
+
ok: true,
|
|
842
|
+
duration: openedAt ? Date.now() - openedAt : void 0,
|
|
843
|
+
source: "socket"
|
|
844
|
+
});
|
|
845
|
+
scheduleReconnect();
|
|
846
|
+
};
|
|
847
|
+
}
|
|
848
|
+
function openConnection() {
|
|
849
|
+
closedPurposefully = false;
|
|
850
|
+
if (!Impl) return;
|
|
851
|
+
openConnections.add(instance);
|
|
852
|
+
if (ws || reconnectTimer !== null) return;
|
|
853
|
+
connect();
|
|
854
|
+
}
|
|
855
|
+
function closeConnection(code, reason) {
|
|
856
|
+
closedPurposefully = true;
|
|
857
|
+
stopTimers();
|
|
858
|
+
changeState("closing");
|
|
859
|
+
const prev = releaseWs();
|
|
860
|
+
handshake = null;
|
|
861
|
+
acks.clear();
|
|
862
|
+
queue.length = 0;
|
|
863
|
+
state.queued = 0;
|
|
864
|
+
state.attempts = 0;
|
|
865
|
+
for (const [name, room] of rooms) {
|
|
866
|
+
room.state.state = "left";
|
|
867
|
+
room.listeners.clear();
|
|
868
|
+
room.state.members = [];
|
|
869
|
+
rooms.delete(name);
|
|
870
|
+
}
|
|
871
|
+
try {
|
|
872
|
+
prev?.close(code, reason);
|
|
873
|
+
} catch {
|
|
874
|
+
}
|
|
875
|
+
openConnections.delete(instance);
|
|
876
|
+
changeState("closed");
|
|
877
|
+
deliver("close", { url: address, code, reason });
|
|
878
|
+
}
|
|
879
|
+
const instance = {
|
|
880
|
+
get url() {
|
|
881
|
+
return address;
|
|
882
|
+
},
|
|
883
|
+
get state() {
|
|
884
|
+
return state.state;
|
|
885
|
+
},
|
|
886
|
+
get connected() {
|
|
887
|
+
return state.connected;
|
|
888
|
+
},
|
|
889
|
+
get attempts() {
|
|
890
|
+
return state.attempts;
|
|
891
|
+
},
|
|
892
|
+
get queued() {
|
|
893
|
+
return state.queued;
|
|
894
|
+
},
|
|
895
|
+
get error() {
|
|
896
|
+
return state.error;
|
|
897
|
+
},
|
|
898
|
+
get raw() {
|
|
899
|
+
return ws;
|
|
900
|
+
},
|
|
901
|
+
get rooms() {
|
|
902
|
+
return [...rooms.values()].map((r) => r.public);
|
|
903
|
+
},
|
|
904
|
+
on,
|
|
905
|
+
once,
|
|
906
|
+
off,
|
|
907
|
+
emit,
|
|
908
|
+
send,
|
|
909
|
+
open: openConnection,
|
|
910
|
+
close: closeConnection,
|
|
911
|
+
join,
|
|
912
|
+
leave,
|
|
913
|
+
to
|
|
914
|
+
};
|
|
915
|
+
if (!Impl) {
|
|
916
|
+
state.error = "WebSocket unavailable in this environment";
|
|
917
|
+
return instance;
|
|
918
|
+
}
|
|
919
|
+
if (!opts.manual) openConnection();
|
|
920
|
+
else openConnections.add(instance);
|
|
921
|
+
return instance;
|
|
922
|
+
}
|
|
923
|
+
var factory = ((url, options = {}) => createSocket(url, options));
|
|
924
|
+
Object.assign(factory, {
|
|
925
|
+
defaults,
|
|
926
|
+
interceptors: {
|
|
927
|
+
incoming: { use: (fn) => use(incomingInterceptors, fn) },
|
|
928
|
+
outgoing: { use: (fn) => use(outgoingInterceptors, fn) }
|
|
929
|
+
},
|
|
930
|
+
close() {
|
|
931
|
+
for (const s of [...openConnections]) s.close();
|
|
932
|
+
},
|
|
933
|
+
supported: socketSupported,
|
|
934
|
+
setWebSocket(impl) {
|
|
935
|
+
defaults.WebSocket = impl;
|
|
936
|
+
}
|
|
937
|
+
});
|
|
938
|
+
Object.defineProperty(factory, "open", {
|
|
939
|
+
get: () => [...openConnections],
|
|
940
|
+
enumerable: true
|
|
941
|
+
});
|
|
942
|
+
var socket = factory;
|
|
943
|
+
|
|
944
|
+
export { ENGINE, SIO, createSocket, decodeEngine, decodeSocketIo, devtoolsBus, encodeSocketIo, engineURL, resolveSocketURL, socket, socketSupported };
|
|
945
|
+
//# sourceMappingURL=chunk-RJUNPXQF.js.map
|
|
946
|
+
//# sourceMappingURL=chunk-RJUNPXQF.js.map
|