uidex 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/cli/cli.cjs +1112 -1054
  2. package/dist/cli/cli.cjs.map +1 -1
  3. package/dist/headless/index.cjs +4 -448
  4. package/dist/headless/index.cjs.map +1 -1
  5. package/dist/headless/index.d.cts +41 -11
  6. package/dist/headless/index.d.ts +41 -11
  7. package/dist/headless/index.js +4 -450
  8. package/dist/headless/index.js.map +1 -1
  9. package/dist/index.cjs +147 -3252
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +43 -316
  12. package/dist/index.d.ts +43 -316
  13. package/dist/index.js +133 -3254
  14. package/dist/index.js.map +1 -1
  15. package/dist/playwright/index.cjs +175 -0
  16. package/dist/playwright/index.cjs.map +1 -1
  17. package/dist/playwright/index.d.cts +2 -0
  18. package/dist/playwright/index.d.ts +2 -0
  19. package/dist/playwright/index.js +167 -0
  20. package/dist/playwright/index.js.map +1 -1
  21. package/dist/playwright/states-reporter.cjs +123 -0
  22. package/dist/playwright/states-reporter.cjs.map +1 -0
  23. package/dist/playwright/states-reporter.d.cts +46 -0
  24. package/dist/playwright/states-reporter.d.ts +46 -0
  25. package/dist/playwright/states-reporter.js +88 -0
  26. package/dist/playwright/states-reporter.js.map +1 -0
  27. package/dist/playwright/states.cjs +118 -0
  28. package/dist/playwright/states.cjs.map +1 -0
  29. package/dist/playwright/states.d.cts +120 -0
  30. package/dist/playwright/states.d.ts +120 -0
  31. package/dist/playwright/states.js +88 -0
  32. package/dist/playwright/states.js.map +1 -0
  33. package/dist/react/index.cjs +163 -3255
  34. package/dist/react/index.cjs.map +1 -1
  35. package/dist/react/index.d.cts +62 -275
  36. package/dist/react/index.d.ts +62 -275
  37. package/dist/react/index.js +151 -3268
  38. package/dist/react/index.js.map +1 -1
  39. package/dist/scan/index.cjs +1292 -345
  40. package/dist/scan/index.cjs.map +1 -1
  41. package/dist/scan/index.d.cts +305 -12
  42. package/dist/scan/index.d.ts +305 -12
  43. package/dist/scan/index.js +1283 -345
  44. package/dist/scan/index.js.map +1 -1
  45. package/package.json +12 -16
  46. package/dist/cloud/index.cjs +0 -682
  47. package/dist/cloud/index.cjs.map +0 -1
  48. package/dist/cloud/index.d.cts +0 -270
  49. package/dist/cloud/index.d.ts +0 -270
  50. package/dist/cloud/index.js +0 -645
  51. package/dist/cloud/index.js.map +0 -1
@@ -1,645 +0,0 @@
1
- // src/cloud/protocol.ts
2
- var RPC_METHODS = [
3
- "reports.submit",
4
- "reports.list",
5
- "config.get",
6
- "pins.list",
7
- "pins.screenshot",
8
- "pins.archive",
9
- "screenshot.chunk"
10
- ];
11
- var SCREENSHOT_INLINE_MAX_BYTES = 20 * 1024 * 1024;
12
- var SCREENSHOT_CHUNK_BYTES = 8 * 1024 * 1024;
13
- function isRpcMethod(value) {
14
- return typeof value === "string" && RPC_METHODS.includes(value);
15
- }
16
- function parseRpcResponseFrame(msg) {
17
- if (!msg || typeof msg !== "object") return null;
18
- const m = msg;
19
- if (m.type !== "rpc:res" || typeof m.id !== "string") return null;
20
- if (m.ok === true) {
21
- return { type: "rpc:res", id: m.id, ok: true, data: m.data };
22
- }
23
- if (m.ok === false) {
24
- if (typeof m.status !== "number" || typeof m.error !== "string") return null;
25
- return {
26
- type: "rpc:res",
27
- id: m.id,
28
- ok: false,
29
- status: m.status,
30
- error: m.error,
31
- retryAfter: typeof m.retryAfter === "number" ? m.retryAfter : void 0,
32
- details: m.details
33
- };
34
- }
35
- return null;
36
- }
37
-
38
- // src/cloud/realtime.ts
39
- var RECONNECT_INITIAL_MS = 1e3;
40
- var RECONNECT_MAX_MS = 3e4;
41
- var MAX_RECONNECT_ATTEMPTS = 10;
42
- var CLOSE_CODE_AUTH_FAILED = 4001;
43
- var CLOSE_CODE_SYNTHETIC = 1006;
44
- function emit(listeners, value) {
45
- for (const cb of listeners) {
46
- try {
47
- cb(value);
48
- } catch {
49
- }
50
- }
51
- }
52
- function resolveWebSocket(override) {
53
- if (override) return override;
54
- if (typeof globalThis !== "undefined" && typeof globalThis.WebSocket === "function") {
55
- return globalThis.WebSocket;
56
- }
57
- throw new Error(
58
- "uidex/cloud: global WebSocket is not available; pass a `WebSocketImpl` override"
59
- );
60
- }
61
- function createRealtimeChannel(options) {
62
- let WS = options.WebSocketImpl ?? null;
63
- const presenceListeners = /* @__PURE__ */ new Set();
64
- const pinListeners = /* @__PURE__ */ new Set();
65
- const pinArchivedListeners = /* @__PURE__ */ new Set();
66
- const openListeners = /* @__PURE__ */ new Set();
67
- const closeListeners = /* @__PURE__ */ new Set();
68
- const rpcListeners = /* @__PURE__ */ new Set();
69
- let ws = null;
70
- let state = "disconnected";
71
- let disposed = false;
72
- let reconnectAttempts = 0;
73
- let reconnectTimer = null;
74
- let identity = null;
75
- let route = null;
76
- function emitClose(code, willReconnect) {
77
- for (const cb of closeListeners) {
78
- try {
79
- cb(code, willReconnect);
80
- } catch {
81
- }
82
- }
83
- }
84
- function clearReconnectTimer() {
85
- if (reconnectTimer !== null) {
86
- clearTimeout(reconnectTimer);
87
- reconnectTimer = null;
88
- }
89
- }
90
- function scheduleReconnect() {
91
- if (disposed) return;
92
- const delay = Math.min(
93
- RECONNECT_INITIAL_MS * 2 ** reconnectAttempts,
94
- RECONNECT_MAX_MS
95
- );
96
- reconnectAttempts += 1;
97
- state = "connecting";
98
- clearReconnectTimer();
99
- reconnectTimer = setTimeout(() => {
100
- reconnectTimer = null;
101
- openSocket();
102
- }, delay);
103
- }
104
- function handleMessage(event) {
105
- if (typeof event.data !== "string") return;
106
- let parsed;
107
- try {
108
- parsed = JSON.parse(event.data);
109
- } catch {
110
- return;
111
- }
112
- if (!parsed || typeof parsed !== "object") return;
113
- const msg = parsed;
114
- if (msg.type === "rpc:res") {
115
- const frame = parseRpcResponseFrame(parsed);
116
- if (frame) emit(rpcListeners, frame);
117
- return;
118
- }
119
- if (msg.type === "presence") {
120
- const p = msg;
121
- if (!Array.isArray(p.users)) return;
122
- const users = [];
123
- for (const raw of p.users) {
124
- if (!raw || typeof raw !== "object") continue;
125
- const u = raw;
126
- if (typeof u.userId !== "string" || typeof u.name !== "string") continue;
127
- users.push({
128
- userId: u.userId,
129
- name: u.name,
130
- avatar: typeof u.avatar === "string" ? u.avatar : null
131
- });
132
- }
133
- emit(presenceListeners, users);
134
- return;
135
- }
136
- if (msg.type === "pin:archived") {
137
- const p = msg;
138
- if (typeof p.reportId !== "string") return;
139
- emit(pinArchivedListeners, p.reportId);
140
- return;
141
- }
142
- if (msg.type === "pin") {
143
- const p = msg;
144
- if (typeof p.reportId !== "string" || !p.elementRef || typeof p.elementRef !== "object" || typeof p.elementRef.kind !== "string" || typeof p.elementRef.id !== "string" || !p.author || typeof p.author !== "object" || typeof p.body !== "string" || typeof p.reportType !== "string" || typeof p.reportSeverity !== "string" || typeof p.createdAt !== "string") {
145
- return;
146
- }
147
- const author = p.author;
148
- const elRef = p.elementRef;
149
- const pin = {
150
- id: p.reportId,
151
- entity: `${elRef.kind}:${elRef.id}`,
152
- reporter: {
153
- name: typeof author.name === "string" ? author.name : void 0,
154
- email: typeof author.email === "string" ? author.email : void 0
155
- },
156
- body: p.body,
157
- type: p.reportType,
158
- severity: p.reportSeverity,
159
- status: "open",
160
- createdAt: p.createdAt,
161
- url: ""
162
- };
163
- emit(pinListeners, pin);
164
- return;
165
- }
166
- }
167
- function sendRaw(frame) {
168
- if (!ws || !WS || ws.readyState !== WS.OPEN) return false;
169
- try {
170
- ws.send(JSON.stringify(frame));
171
- return true;
172
- } catch {
173
- return false;
174
- }
175
- }
176
- function openSocket() {
177
- if (disposed) return;
178
- state = "connecting";
179
- if (!WS) {
180
- try {
181
- WS = resolveWebSocket(options.WebSocketImpl);
182
- } catch {
183
- state = "disconnected";
184
- emitClose(CLOSE_CODE_SYNTHETIC, false);
185
- return;
186
- }
187
- }
188
- let url;
189
- try {
190
- url = options.buildUrl();
191
- } catch {
192
- state = "disconnected";
193
- emitClose(CLOSE_CODE_SYNTHETIC, false);
194
- return;
195
- }
196
- let socket;
197
- try {
198
- socket = new WS(url);
199
- } catch {
200
- if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
201
- state = "disconnected";
202
- emitClose(CLOSE_CODE_SYNTHETIC, false);
203
- return;
204
- }
205
- emitClose(CLOSE_CODE_SYNTHETIC, true);
206
- scheduleReconnect();
207
- return;
208
- }
209
- ws = socket;
210
- socket.addEventListener("open", () => {
211
- if (ws !== socket) return;
212
- state = "connected";
213
- reconnectAttempts = 0;
214
- if (identity) {
215
- sendRaw({
216
- type: "identify",
217
- userId: identity.id,
218
- ...identity.name ? { name: identity.name } : {},
219
- ...identity.avatar ? { avatar: identity.avatar } : {}
220
- });
221
- }
222
- if (route !== null) {
223
- sendRaw({ type: "join", route });
224
- }
225
- emit(openListeners, void 0);
226
- });
227
- socket.addEventListener("message", (event) => {
228
- if (ws !== socket) return;
229
- handleMessage(event);
230
- });
231
- socket.addEventListener("close", (event) => {
232
- if (ws !== socket) return;
233
- ws = null;
234
- const code = event.code;
235
- if (disposed || code === CLOSE_CODE_AUTH_FAILED || reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
236
- state = "disconnected";
237
- emitClose(code, false);
238
- return;
239
- }
240
- emitClose(code, true);
241
- scheduleReconnect();
242
- });
243
- socket.addEventListener("error", () => {
244
- });
245
- }
246
- function connect() {
247
- if (disposed) {
248
- disposed = false;
249
- }
250
- if (ws) return;
251
- if (state === "connecting") return;
252
- reconnectAttempts = 0;
253
- openSocket();
254
- }
255
- function disconnect() {
256
- disposed = true;
257
- clearReconnectTimer();
258
- state = "disconnected";
259
- identity = null;
260
- route = null;
261
- if (ws) {
262
- const socket = ws;
263
- ws = null;
264
- try {
265
- socket.close(1e3);
266
- } catch {
267
- }
268
- }
269
- emitClose(CLOSE_CODE_SYNTHETIC, false);
270
- }
271
- function clearSession() {
272
- identity = null;
273
- route = null;
274
- }
275
- function identify(user) {
276
- identity = user;
277
- sendRaw({
278
- type: "identify",
279
- userId: user.id,
280
- ...user.name ? { name: user.name } : {},
281
- ...user.avatar ? { avatar: user.avatar } : {}
282
- });
283
- }
284
- function joinRoute(nextRoute) {
285
- route = nextRoute;
286
- emit(presenceListeners, []);
287
- sendRaw({ type: "join", route: nextRoute });
288
- }
289
- function onPresence(cb) {
290
- presenceListeners.add(cb);
291
- return () => {
292
- presenceListeners.delete(cb);
293
- };
294
- }
295
- function onPin(cb) {
296
- pinListeners.add(cb);
297
- return () => {
298
- pinListeners.delete(cb);
299
- };
300
- }
301
- function onPinArchived(cb) {
302
- pinArchivedListeners.add(cb);
303
- return () => {
304
- pinArchivedListeners.delete(cb);
305
- };
306
- }
307
- function onOpen(cb) {
308
- openListeners.add(cb);
309
- return () => {
310
- openListeners.delete(cb);
311
- };
312
- }
313
- function onClose(cb) {
314
- closeListeners.add(cb);
315
- return () => {
316
- closeListeners.delete(cb);
317
- };
318
- }
319
- function onRpcResponse(cb) {
320
- rpcListeners.add(cb);
321
- return () => {
322
- rpcListeners.delete(cb);
323
- };
324
- }
325
- return {
326
- get state() {
327
- return state;
328
- },
329
- connect,
330
- disconnect,
331
- identify,
332
- clearSession,
333
- joinRoute,
334
- sendFrame: sendRaw,
335
- onPresence,
336
- onPin,
337
- onPinArchived,
338
- onOpen,
339
- onClose,
340
- onRpcResponse
341
- };
342
- }
343
-
344
- // src/cloud/types.ts
345
- var DEFAULT_CLOUD_ENDPOINT = "https://app.uidex.dev";
346
- var CloudError = class extends Error {
347
- status;
348
- retryAfter;
349
- details;
350
- constructor(message, options) {
351
- super(message);
352
- this.name = "CloudError";
353
- this.status = options.status;
354
- this.retryAfter = options.retryAfter;
355
- this.details = options.details;
356
- }
357
- };
358
-
359
- // src/cloud/rpc.ts
360
- var DEFAULT_RPC_TIMEOUT_MS = 3e4;
361
- var SUBMIT_RPC_TIMEOUT_MS = 12e4;
362
- function authFailedError() {
363
- return new CloudError("WebSocket authentication failed", { status: 401 });
364
- }
365
- function createRpcClient(channel, options) {
366
- const timeoutMs = options?.timeoutMs ?? DEFAULT_RPC_TIMEOUT_MS;
367
- const idSuffix = Math.random().toString(36).slice(2, 8);
368
- let idCounter = 0;
369
- const pending = /* @__PURE__ */ new Map();
370
- const queue = [];
371
- let terminalError = null;
372
- function settlePending(err) {
373
- for (const entry of pending.values()) {
374
- clearTimeout(entry.timer);
375
- entry.reject(err);
376
- }
377
- pending.clear();
378
- }
379
- channel.onOpen(() => {
380
- while (queue.length > 0) {
381
- const next = queue[0];
382
- if (!channel.sendFrame(next.frame)) return;
383
- queue.shift();
384
- pending.set(next.frame.id, next.entry);
385
- }
386
- });
387
- function rejectQueue(err) {
388
- for (const queued of queue) {
389
- clearTimeout(queued.entry.timer);
390
- queued.entry.reject(err);
391
- }
392
- queue.length = 0;
393
- }
394
- channel.onClose((code, willReconnect) => {
395
- if (code === CLOSE_CODE_AUTH_FAILED) {
396
- const err = authFailedError();
397
- terminalError = err;
398
- settlePending(err);
399
- rejectQueue(err);
400
- return;
401
- }
402
- settlePending(new CloudError("Connection lost", { status: 0 }));
403
- if (!willReconnect) {
404
- rejectQueue(new CloudError("Connection lost", { status: 0 }));
405
- }
406
- });
407
- channel.onRpcResponse((frame) => {
408
- const entry = pending.get(frame.id);
409
- if (!entry) return;
410
- pending.delete(frame.id);
411
- clearTimeout(entry.timer);
412
- if (frame.ok) {
413
- entry.resolve(frame.data);
414
- } else {
415
- entry.reject(
416
- new CloudError(frame.error, {
417
- status: frame.status,
418
- retryAfter: frame.retryAfter,
419
- details: frame.details
420
- })
421
- );
422
- }
423
- });
424
- function call(method, params, opts) {
425
- if (terminalError) return Promise.reject(terminalError);
426
- const callTimeoutMs = opts?.timeoutMs ?? timeoutMs;
427
- return new Promise((resolve, reject) => {
428
- idCounter += 1;
429
- const id = `${idCounter.toString(36)}-${idSuffix}`;
430
- const frame = {
431
- type: "rpc",
432
- id,
433
- method,
434
- ...params !== void 0 ? { params } : {}
435
- };
436
- const timer = setTimeout(() => {
437
- pending.delete(id);
438
- const queuedIndex = queue.findIndex((q) => q.frame.id === id);
439
- if (queuedIndex !== -1) queue.splice(queuedIndex, 1);
440
- reject(new CloudError("Request timed out", { status: 0 }));
441
- }, callTimeoutMs);
442
- const entry = {
443
- resolve,
444
- reject,
445
- timer
446
- };
447
- if (channel.sendFrame(frame)) {
448
- pending.set(id, entry);
449
- } else {
450
- queue.push({ frame, entry });
451
- channel.connect();
452
- }
453
- });
454
- }
455
- return { call };
456
- }
457
-
458
- // src/cloud/client.ts
459
- function trimEndpoint(endpoint) {
460
- return endpoint.endsWith("/") ? endpoint.slice(0, -1) : endpoint;
461
- }
462
- function nextUploadId() {
463
- return `up-${crypto.randomUUID()}`;
464
- }
465
- function cloud(options) {
466
- let cachedConfig = null;
467
- let resolvedConfig = null;
468
- const projectKey = options.projectKey;
469
- if (!projectKey) {
470
- throw new Error("uidex/cloud: `projectKey` is required");
471
- }
472
- const endpoint = trimEndpoint(options.endpoint ?? DEFAULT_CLOUD_ENDPOINT);
473
- const git = options.git;
474
- function buildWsUrl() {
475
- const httpToWs = endpoint.replace(/^http:/, "ws:").replace(/^https:/, "wss:");
476
- const params = new URLSearchParams();
477
- params.set("key", projectKey);
478
- return `${httpToWs}/ws?${params.toString()}`;
479
- }
480
- const channel = createRealtimeChannel({
481
- buildUrl: buildWsUrl,
482
- ...options.WebSocketImpl ? { WebSocketImpl: options.WebSocketImpl } : {}
483
- });
484
- const rpc = createRpcClient(channel);
485
- const eagerConnect = options.WebSocketImpl !== void 0 || typeof window !== "undefined" && typeof WebSocket === "function";
486
- async function submit(payload) {
487
- const enriched = git?.branch || git?.commit ? {
488
- ...payload,
489
- context: {
490
- ...payload.context,
491
- git: payload.context?.git ?? {
492
- branch: git.branch,
493
- commit: git.commit
494
- }
495
- }
496
- } : payload;
497
- const screenshot = enriched.screenshot;
498
- if (typeof screenshot === "string" && screenshot.length > SCREENSHOT_INLINE_MAX_BYTES) {
499
- const uploadId = nextUploadId();
500
- const total = Math.ceil(screenshot.length / SCREENSHOT_CHUNK_BYTES);
501
- for (let seq = 0; seq < total; seq++) {
502
- const data = screenshot.slice(
503
- seq * SCREENSHOT_CHUNK_BYTES,
504
- (seq + 1) * SCREENSHOT_CHUNK_BYTES
505
- );
506
- await rpc.call(
507
- "screenshot.chunk",
508
- { uploadId, seq, total, data },
509
- { timeoutMs: SUBMIT_RPC_TIMEOUT_MS }
510
- );
511
- }
512
- return rpc.call(
513
- "reports.submit",
514
- { ...enriched, screenshot: void 0, screenshotUploadId: uploadId },
515
- { timeoutMs: SUBMIT_RPC_TIMEOUT_MS }
516
- );
517
- }
518
- return rpc.call("reports.submit", enriched, {
519
- timeoutMs: SUBMIT_RPC_TIMEOUT_MS
520
- });
521
- }
522
- function startFetch() {
523
- const promise = rpc.call("config.get", void 0);
524
- cachedConfig = promise;
525
- promise.then(
526
- (config) => {
527
- resolvedConfig = config;
528
- },
529
- () => {
530
- if (cachedConfig === promise) cachedConfig = null;
531
- }
532
- );
533
- return promise;
534
- }
535
- if (eagerConnect) {
536
- channel.connect();
537
- startFetch();
538
- }
539
- function getConfig() {
540
- return cachedConfig ?? startFetch();
541
- }
542
- function getCachedConfig() {
543
- return resolvedConfig;
544
- }
545
- function connectRealtime(opts) {
546
- if (!opts || !opts.user || typeof opts.user.id !== "string") {
547
- throw new TypeError("uidex/cloud: realtime.connect requires `user.id`");
548
- }
549
- let currentRoute = opts.route;
550
- let detached = false;
551
- const registrations = /* @__PURE__ */ new Set();
552
- function register(attach) {
553
- const reg = { attach, detach: detached ? null : attach() };
554
- registrations.add(reg);
555
- return () => {
556
- registrations.delete(reg);
557
- reg.detach?.();
558
- reg.detach = null;
559
- };
560
- }
561
- function arm() {
562
- channel.identify(opts.user);
563
- channel.joinRoute(currentRoute);
564
- channel.connect();
565
- }
566
- arm();
567
- return {
568
- get state() {
569
- return detached ? "disconnected" : channel.state;
570
- },
571
- // Re-arms identity/route and re-attaches this facade's listeners so an
572
- // explicit disconnect() -> connect() restores presence and pin events.
573
- connect: () => {
574
- if (detached) {
575
- detached = false;
576
- for (const reg of registrations) reg.detach ??= reg.attach();
577
- }
578
- arm();
579
- },
580
- // Soft leave: drop presence and the stored identity (so a later
581
- // reopen/revival stays anonymous) but keep the adapter's shared socket
582
- // alive — in-flight and future RPCs (reports.submit, pins.*) must
583
- // survive a surface unmount. Socket teardown is reserved for
584
- // CloudAdapter.dispose().
585
- disconnect: () => {
586
- detached = true;
587
- channel.sendFrame({ type: "leave" });
588
- channel.clearSession();
589
- for (const reg of registrations) {
590
- reg.detach?.();
591
- reg.detach = null;
592
- }
593
- },
594
- joinRoute: (route) => {
595
- currentRoute = route;
596
- channel.joinRoute(route);
597
- },
598
- onPresence: (cb) => register(() => channel.onPresence(cb)),
599
- onPin: (cb) => register(() => channel.onPin(cb)),
600
- onPinArchived: (cb) => register(() => channel.onPinArchived(cb))
601
- };
602
- }
603
- async function listPins(params) {
604
- const entities = params.entities ? params.entities.split(",").filter(Boolean) : void 0;
605
- const result = await rpc.call("pins.list", {
606
- ...params.route !== void 0 ? { route: params.route } : {},
607
- ...entities ? { entities } : {}
608
- });
609
- return result.pins;
610
- }
611
- async function getPinScreenshot(reportId) {
612
- const result = await rpc.call("pins.screenshot", { reportId });
613
- return result.screenshot;
614
- }
615
- async function closePin(reportId, reason) {
616
- await rpc.call("pins.archive", { reportId, ...reason ? { reason } : {} });
617
- }
618
- function listReports(opts) {
619
- return rpc.call("reports.list", opts ?? {});
620
- }
621
- function dispose() {
622
- channel.disconnect();
623
- }
624
- return {
625
- reports: { submit, list: listReports },
626
- integrations: { getConfig, getCachedConfig },
627
- realtime: { connect: connectRealtime },
628
- pins: { list: listPins, screenshot: getPinScreenshot, close: closePin },
629
- dispose
630
- };
631
- }
632
- export {
633
- CloudError,
634
- DEFAULT_CLOUD_ENDPOINT,
635
- DEFAULT_RPC_TIMEOUT_MS,
636
- RPC_METHODS,
637
- SCREENSHOT_CHUNK_BYTES,
638
- SCREENSHOT_INLINE_MAX_BYTES,
639
- cloud,
640
- createRealtimeChannel,
641
- createRpcClient,
642
- isRpcMethod,
643
- parseRpcResponseFrame
644
- };
645
- //# sourceMappingURL=index.js.map