@voltro/web 0.28.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +655 -0
- package/dist/{frameworkBoot-DHdoAwd9.js → frameworkBoot-BkBY6M2s.js} +100 -108
- package/dist/frameworkBoot.d.ts +11 -9
- package/dist/frameworkBoot.js +1 -1
- package/dist/index.d.ts +94 -10
- package/dist/index.js +72 -48
- package/dist/{mount-DfyG67bY.js → mount-fDzFaIuf.js} +26 -26
- package/dist/mount.d.ts +1 -10
- package/dist/mount.js +1 -1
- package/dist/{routerState-DDDBYFrI.js → routerState-DAT472IC.js} +3 -1
- package/dist/{serverContext-BASpdhXG.js → serverContext-CV1ieZKF.js} +236 -229
- package/dist/ssr.d.ts +43 -5
- package/dist/ssr.js +56 -46
- package/package.json +3 -3
|
@@ -2,23 +2,19 @@ import { t as e } from "./globalContext-d4A-ugDg.js";
|
|
|
2
2
|
import { AppClientsContext as t } from "./hooks.js";
|
|
3
3
|
import { c as n, l as r, r as i, s as a } from "./defaultFallbacks-Fik_Gcjh.js";
|
|
4
4
|
import { useCallback as o, useContext as s, useEffect as c, useRef as l, useState as u, useSyncExternalStore as d } from "react";
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import * as g from "@effect/platform/Headers";
|
|
8
|
-
import { RpcClient as _, RpcSerialization as v } from "@effect/rpc";
|
|
9
|
-
import { FrameworkRuntimesProvider as y, RpcErrorBus as b, SubscriptionCache as ee, ssrClientProxy as te, ssrStubHandle as ne, subscribeClientTraces as re } from "@voltro/client";
|
|
10
|
-
import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
5
|
+
import { FrameworkRuntimesProvider as f, buildApiRuntime as p, ssrClientProxy as m, ssrStubHandle as h, subscribeClientTraces as g } from "@voltro/client";
|
|
6
|
+
import { Fragment as ee, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
11
7
|
//#region src/reconnect.ts
|
|
12
|
-
var
|
|
8
|
+
var y = e("reconnect", null), b = () => s(y) ?? (() => {}), x = 150, S = 220, C = () => {
|
|
13
9
|
let e = d(r, a, a).some((e) => e.kind === "loading" || e.kind === "reconnecting"), [t, n] = u(!1);
|
|
14
10
|
return c(() => {
|
|
15
11
|
if (!e) {
|
|
16
12
|
n(!1);
|
|
17
13
|
return;
|
|
18
14
|
}
|
|
19
|
-
let t = setTimeout(() => n(!0),
|
|
15
|
+
let t = setTimeout(() => n(!0), x);
|
|
20
16
|
return () => clearTimeout(t);
|
|
21
|
-
}, [e]), /* @__PURE__ */
|
|
17
|
+
}, [e]), /* @__PURE__ */ v("div", {
|
|
22
18
|
"aria-hidden": "true",
|
|
23
19
|
"data-voltro-nav-indicator": "",
|
|
24
20
|
style: {
|
|
@@ -29,7 +25,7 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
29
25
|
pointerEvents: "none",
|
|
30
26
|
opacity: +!!t,
|
|
31
27
|
transform: t ? "translateY(0) scale(1)" : "translateY(4px) scale(0.96)",
|
|
32
|
-
transition: `opacity ${
|
|
28
|
+
transition: `opacity ${S}ms ease, transform ${S}ms ease`,
|
|
33
29
|
display: "grid",
|
|
34
30
|
placeItems: "center",
|
|
35
31
|
width: 34,
|
|
@@ -41,16 +37,16 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
41
37
|
border: "1px solid color-mix(in oklch, canvastext 12%, transparent)",
|
|
42
38
|
boxShadow: "0 4px 14px color-mix(in oklch, canvastext 16%, transparent)"
|
|
43
39
|
},
|
|
44
|
-
children: [/* @__PURE__ */
|
|
40
|
+
children: [/* @__PURE__ */ _("span", { "data-voltro-nav-spinner": "" }), /* @__PURE__ */ _("style", { children: te })]
|
|
45
41
|
});
|
|
46
|
-
},
|
|
42
|
+
}, te = "\n@keyframes voltroNavSpin { to { transform: rotate(360deg); } }\n[data-voltro-nav-spinner] {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n border: 2px solid color-mix(in oklch, canvastext 22%, transparent);\n border-top-color: color-mix(in oklch, canvastext 78%, transparent);\n animation: voltroNavSpin 0.7s linear infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n [data-voltro-nav-spinner] { animation-duration: 1.6s; }\n}\n", ne = (e) => Math.min(500 * 2 ** Math.min(e - 1, 4), 5e3), re = 2, w = 2e3, T = () => typeof window < "u" && !1, ie = () => typeof window > "u" ? null : `${window.location.origin}/`, ae = 2e4, E = "voltro:wedge-reload-at", D = () => {
|
|
47
43
|
try {
|
|
48
|
-
let e = Number(window.sessionStorage.getItem(
|
|
49
|
-
if (t - e <
|
|
50
|
-
window.sessionStorage.setItem(
|
|
44
|
+
let e = Number(window.sessionStorage.getItem(E) ?? "0"), t = Date.now();
|
|
45
|
+
if (t - e < ae) return;
|
|
46
|
+
window.sessionStorage.setItem(E, String(t));
|
|
51
47
|
} catch {}
|
|
52
48
|
window.location.reload();
|
|
53
|
-
},
|
|
49
|
+
}, O = () => ({
|
|
54
50
|
resolved: null,
|
|
55
51
|
retryToken: 0,
|
|
56
52
|
failureCount: 0,
|
|
@@ -58,15 +54,15 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
58
54
|
reconnectStatusDispose: null,
|
|
59
55
|
everOpened: !1,
|
|
60
56
|
healthPollHandle: null
|
|
61
|
-
}),
|
|
57
|
+
}), k = (e) => {
|
|
62
58
|
e.healthPollHandle !== null && (clearInterval(e.healthPollHandle), e.healthPollHandle = null);
|
|
63
|
-
},
|
|
59
|
+
}, A = (e) => {
|
|
64
60
|
e.cache.destroy(e.runtime), e.runtime.dispose();
|
|
65
|
-
},
|
|
66
|
-
let t = e.apis, r = e.buildClient, i = e.onChange, a = e.retryDelayMs ??
|
|
61
|
+
}, oe = (e) => {
|
|
62
|
+
let t = e.apis, r = e.buildClient, i = e.onChange, a = e.retryDelayMs ?? ne, o = e.stableWindowMs ?? 5e3, s = e.scheduler?.setTimeout ?? ((e, t) => setTimeout(e, t)), c = e.scheduler?.clearTimeout ?? ((e) => {
|
|
67
63
|
clearTimeout(e);
|
|
68
64
|
}), l = e.scheduler?.queueMicrotask ?? queueMicrotask, u = /* @__PURE__ */ new Map();
|
|
69
|
-
for (let e of t) u.set(e.name,
|
|
65
|
+
for (let e of t) u.set(e.name, O());
|
|
70
66
|
let d = !1, f = /* @__PURE__ */ new Set(), p = (e, t) => {
|
|
71
67
|
let n = s(() => {
|
|
72
68
|
f.delete(n), e();
|
|
@@ -87,17 +83,17 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
87
83
|
id: `voltro:supervisor:${e.name}`,
|
|
88
84
|
kind: "reconnecting",
|
|
89
85
|
label: "Reconnecting…"
|
|
90
|
-
}),
|
|
91
|
-
let e =
|
|
86
|
+
}), T() && t.everOpened && t.failureCount >= re && t.healthPollHandle === null) {
|
|
87
|
+
let e = ie();
|
|
92
88
|
e && (t.healthPollHandle = setInterval(() => {
|
|
93
89
|
fetch(e, {
|
|
94
90
|
method: "GET",
|
|
95
91
|
cache: "no-store",
|
|
96
|
-
signal: AbortSignal.timeout(
|
|
92
|
+
signal: AbortSignal.timeout(w)
|
|
97
93
|
}).then((e) => {
|
|
98
|
-
e.status < 500 &&
|
|
94
|
+
e.status < 500 && D();
|
|
99
95
|
}).catch(() => {});
|
|
100
|
-
},
|
|
96
|
+
}, w));
|
|
101
97
|
}
|
|
102
98
|
p(() => {
|
|
103
99
|
d || t.retryToken === i && (t.generation += 1, g(e));
|
|
@@ -108,7 +104,7 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
108
104
|
if (!t) return;
|
|
109
105
|
let n = t.generation, i = () => {
|
|
110
106
|
if (d || t.generation !== n) return;
|
|
111
|
-
t.everOpened = !0,
|
|
107
|
+
t.everOpened = !0, k(t), t.retryToken++;
|
|
112
108
|
let e = t.failureCount;
|
|
113
109
|
p(() => {
|
|
114
110
|
d || t.failureCount === e && (t.failureCount = 0);
|
|
@@ -119,11 +115,11 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
119
115
|
try {
|
|
120
116
|
let o = await r(e, n, i, a);
|
|
121
117
|
if (d || t.generation !== n) {
|
|
122
|
-
|
|
118
|
+
A(o);
|
|
123
119
|
return;
|
|
124
120
|
}
|
|
125
121
|
let s = t.resolved;
|
|
126
|
-
t.resolved = o, t.reconnectStatusDispose &&= (t.reconnectStatusDispose(), null), m(), s &&
|
|
122
|
+
t.resolved = o, t.reconnectStatusDispose &&= (t.reconnectStatusDispose(), null), m(), s && A(s);
|
|
127
123
|
} catch {
|
|
128
124
|
if (d || t.generation !== n) return;
|
|
129
125
|
h(e);
|
|
@@ -142,35 +138,35 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
142
138
|
d = !0;
|
|
143
139
|
for (let e of f) c(e);
|
|
144
140
|
f.clear();
|
|
145
|
-
for (let [, e] of u) e.resolved &&
|
|
141
|
+
for (let [, e] of u) e.resolved && A(e.resolved), e.reconnectStatusDispose && e.reconnectStatusDispose(), k(e);
|
|
146
142
|
u.clear();
|
|
147
143
|
}
|
|
148
144
|
},
|
|
149
145
|
reconnect: () => {
|
|
150
146
|
if (!d) for (let e of t) {
|
|
151
147
|
let t = u.get(e.name);
|
|
152
|
-
t && (t.retryToken += 1, t.generation += 1, t.failureCount = 0,
|
|
148
|
+
t && (t.retryToken += 1, t.generation += 1, t.failureCount = 0, k(t), g(e));
|
|
153
149
|
}
|
|
154
150
|
}
|
|
155
151
|
});
|
|
156
|
-
},
|
|
152
|
+
}, j = {
|
|
157
153
|
log: console.log.bind(console),
|
|
158
154
|
info: console.info.bind(console),
|
|
159
155
|
warn: console.warn.bind(console),
|
|
160
156
|
error: console.error.bind(console),
|
|
161
157
|
debug: console.debug.bind(console)
|
|
162
|
-
},
|
|
158
|
+
}, se = 200, M = 400, N = 20, P = 1e3, F = (e) => {
|
|
163
159
|
if (typeof e == "string") return e;
|
|
164
160
|
if (e === void 0) return "undefined";
|
|
165
161
|
if (e === null) return "null";
|
|
166
162
|
if (e instanceof Error) return e.stack ?? e.message;
|
|
167
163
|
if (typeof e == "object") try {
|
|
168
|
-
return JSON.stringify(e,
|
|
164
|
+
return JSON.stringify(e, ce());
|
|
169
165
|
} catch {
|
|
170
166
|
return Object.prototype.toString.call(e);
|
|
171
167
|
}
|
|
172
168
|
return String(e);
|
|
173
|
-
},
|
|
169
|
+
}, ce = () => {
|
|
174
170
|
let e = /* @__PURE__ */ new WeakSet();
|
|
175
171
|
return (t, n) => {
|
|
176
172
|
if (typeof n == "object" && n) {
|
|
@@ -179,20 +175,20 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
179
175
|
}
|
|
180
176
|
return n;
|
|
181
177
|
};
|
|
182
|
-
},
|
|
178
|
+
}, I = (e, t) => e.length > t ? `${e.slice(0, t)}…` : e, L = /%[sdifoOc]/g, R = (e) => {
|
|
183
179
|
if (e.length === 0) return {
|
|
184
180
|
message: "",
|
|
185
181
|
rest: []
|
|
186
182
|
};
|
|
187
183
|
let t = e[0];
|
|
188
|
-
if (typeof t != "string" || !
|
|
184
|
+
if (typeof t != "string" || !L.test(t)) return {
|
|
189
185
|
message: F(t),
|
|
190
186
|
rest: e.slice(1)
|
|
191
187
|
};
|
|
192
|
-
|
|
188
|
+
L.lastIndex = 0;
|
|
193
189
|
let n = 1;
|
|
194
190
|
return {
|
|
195
|
-
message: t.replace(
|
|
191
|
+
message: t.replace(L, (t) => {
|
|
196
192
|
if (t === "%c") return n++, "";
|
|
197
193
|
if (n >= e.length) return t;
|
|
198
194
|
let r = e[n++];
|
|
@@ -214,15 +210,15 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
214
210
|
}),
|
|
215
211
|
rest: e.slice(n)
|
|
216
212
|
};
|
|
217
|
-
},
|
|
218
|
-
let t = e.flushAfterMs ??
|
|
213
|
+
}, z = (e) => {
|
|
214
|
+
let t = e.flushAfterMs ?? M, n = `${e.baseUrl.replace(/\/+$/, "")}/_voltro/inspect/clientLog`, r = [], i = null, a = !1, o = () => {
|
|
219
215
|
if (i !== null && (clearTimeout(i), i = null), r.length === 0) return;
|
|
220
216
|
let t = r;
|
|
221
217
|
r = [];
|
|
222
218
|
let a = {
|
|
223
219
|
app: e.appName,
|
|
224
220
|
page: typeof window < "u" ? window.location.pathname : void 0,
|
|
225
|
-
ua: typeof navigator < "u" ?
|
|
221
|
+
ua: typeof navigator < "u" ? I(navigator.userAgent, 200) : void 0,
|
|
226
222
|
entries: t
|
|
227
223
|
};
|
|
228
224
|
try {
|
|
@@ -238,11 +234,11 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
238
234
|
i === null && (i = setTimeout(o, t));
|
|
239
235
|
}, c = (e, t) => {
|
|
240
236
|
if (a) return;
|
|
241
|
-
r.length >=
|
|
237
|
+
r.length >= se && r.shift();
|
|
242
238
|
let n = t.find((e) => e instanceof Error), i = t.find((e) => typeof e == "object" && !!e && "componentStack" in e), c = typeof i?.componentStack == "string" ? i.componentStack : void 0, l = t[0] instanceof Error ? {
|
|
243
239
|
message: t[0].message,
|
|
244
240
|
rest: t.slice(1)
|
|
245
|
-
} :
|
|
241
|
+
} : R(t), u = I(l.message, P), d = l.rest.filter((e) => e !== n && e !== i).map((e) => I(F(e), P)), f;
|
|
246
242
|
n ? (f = n.stack ?? n.message, c && (f += `\n\nComponent stack:${c}`)) : e === "error" && (f = (/* @__PURE__ */ Error()).stack);
|
|
247
243
|
let p = {
|
|
248
244
|
ts: Date.now(),
|
|
@@ -253,27 +249,27 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
253
249
|
};
|
|
254
250
|
r.push(p), r.length >= N ? o() : s();
|
|
255
251
|
}, l = (e) => (...t) => {
|
|
256
|
-
|
|
252
|
+
j[e](...t), c(e, t);
|
|
257
253
|
};
|
|
258
254
|
console.log = l("log"), console.info = l("info"), console.warn = l("warn"), console.error = l("error"), console.debug = l("debug");
|
|
259
255
|
let u = () => {
|
|
260
256
|
o();
|
|
261
257
|
};
|
|
262
258
|
return typeof window < "u" && (window.addEventListener("beforeunload", u), window.addEventListener("pagehide", u)), { dispose: () => {
|
|
263
|
-
a = !0, o(), i !== null && (clearTimeout(i), i = null), console.log =
|
|
259
|
+
a = !0, o(), i !== null && (clearTimeout(i), i = null), console.log = j.log, console.info = j.info, console.warn = j.warn, console.error = j.error, console.debug = j.debug, typeof window < "u" && (window.removeEventListener("beforeunload", u), window.removeEventListener("pagehide", u));
|
|
264
260
|
} };
|
|
265
|
-
},
|
|
266
|
-
if (!V.has(e) && (V.add(e), V.size >
|
|
261
|
+
}, B = 500, V = /* @__PURE__ */ new Set(), H = (e) => {
|
|
262
|
+
if (!V.has(e) && (V.add(e), V.size > B)) {
|
|
267
263
|
let e = V.values().next().value;
|
|
268
264
|
e !== void 0 && V.delete(e);
|
|
269
265
|
}
|
|
270
266
|
}, U = /* @__PURE__ */ new Set(), W = (e) => (U.add(e), () => {
|
|
271
267
|
U.delete(e);
|
|
272
|
-
}),
|
|
268
|
+
}), le = (e) => {
|
|
273
269
|
for (let t of U) try {
|
|
274
270
|
t(e);
|
|
275
271
|
} catch {}
|
|
276
|
-
},
|
|
272
|
+
}, ue = {
|
|
277
273
|
log: "log",
|
|
278
274
|
info: "info",
|
|
279
275
|
warn: "warn",
|
|
@@ -292,21 +288,21 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
292
288
|
try {
|
|
293
289
|
let n = JSON.parse(t.data).payload;
|
|
294
290
|
if (!n || typeof n.message != "string" || n.scope === "client") return;
|
|
295
|
-
let r = n.level === void 0 ? "log" :
|
|
296
|
-
|
|
291
|
+
let r = n.level === void 0 ? "log" : ue[n.level], i = n.scope ? ` ${n.scope}` : "";
|
|
292
|
+
j[r](`%c[server ${e.originLabel}${i}]%c ${n.message}`, G[r], "", ...n.fields ? [n.fields] : []);
|
|
297
293
|
} catch {}
|
|
298
294
|
}), n.addEventListener("trace", (t) => {
|
|
299
295
|
try {
|
|
300
296
|
let n = JSON.parse(t.data).payload;
|
|
301
297
|
if (!n || n.status !== "error" || typeof n.traceId != "string" || !V.has(n.traceId)) return;
|
|
302
298
|
let r = n.name ?? "span", i = n.statusMessage && n.statusMessage.length > 0 ? n.statusMessage : `${r} failed`;
|
|
303
|
-
|
|
299
|
+
le({
|
|
304
300
|
traceId: n.traceId,
|
|
305
301
|
spanName: r,
|
|
306
302
|
api: e.originLabel,
|
|
307
303
|
message: i,
|
|
308
304
|
ts: Date.now()
|
|
309
|
-
}),
|
|
305
|
+
}), j.error(`%c[trace ${e.originLabel}]%c ${r} failed — ${i} (trace ${n.traceId})`, G.error, "");
|
|
310
306
|
} catch {}
|
|
311
307
|
}), n.addEventListener("error", () => {
|
|
312
308
|
n && n.readyState === EventSource.CLOSED && (n = null, !r && i === null && (i = setTimeout(() => {
|
|
@@ -325,20 +321,20 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
325
321
|
muted: "oklch(0.65 0.012 285)",
|
|
326
322
|
danger: "oklch(0.7 0.21 22)",
|
|
327
323
|
dangerDim: "oklch(0.5 0.18 22 / 25%)"
|
|
328
|
-
}, J = "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace",
|
|
324
|
+
}, J = "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', monospace", de = "ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif", fe = 0, pe = () => {
|
|
329
325
|
let [e, t] = u([]);
|
|
330
326
|
if (c(() => W((e) => {
|
|
331
327
|
t((t) => {
|
|
332
328
|
if (t.some((t) => t.traceId === e.traceId && t.spanName === e.spanName)) return t;
|
|
333
329
|
let n = [...t, {
|
|
334
330
|
...e,
|
|
335
|
-
id: ++
|
|
331
|
+
id: ++fe
|
|
336
332
|
}];
|
|
337
333
|
return n.length > 4 ? n.slice(n.length - 4) : n;
|
|
338
334
|
});
|
|
339
335
|
}), []), e.length === 0) return null;
|
|
340
336
|
let n = (e) => t((t) => t.filter((t) => t.id !== e));
|
|
341
|
-
return /* @__PURE__ */
|
|
337
|
+
return /* @__PURE__ */ _("div", {
|
|
342
338
|
style: {
|
|
343
339
|
position: "fixed",
|
|
344
340
|
right: 16,
|
|
@@ -348,17 +344,17 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
348
344
|
flexDirection: "column",
|
|
349
345
|
gap: 10,
|
|
350
346
|
maxWidth: 380,
|
|
351
|
-
fontFamily:
|
|
347
|
+
fontFamily: de,
|
|
352
348
|
pointerEvents: "none"
|
|
353
349
|
},
|
|
354
|
-
children: e.map((e) => /* @__PURE__ */
|
|
350
|
+
children: e.map((e) => /* @__PURE__ */ _(me, {
|
|
355
351
|
toast: e,
|
|
356
352
|
onDismiss: () => n(e.id)
|
|
357
353
|
}, e.id))
|
|
358
354
|
});
|
|
359
|
-
},
|
|
355
|
+
}, me = ({ toast: e, onDismiss: t }) => {
|
|
360
356
|
let [n, r] = u(!1), a = `voltro logs --trace ${e.traceId}`;
|
|
361
|
-
return /* @__PURE__ */
|
|
357
|
+
return /* @__PURE__ */ v("div", {
|
|
362
358
|
style: {
|
|
363
359
|
pointerEvents: "auto",
|
|
364
360
|
background: q.card,
|
|
@@ -372,14 +368,14 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
372
368
|
lineHeight: 1.45
|
|
373
369
|
},
|
|
374
370
|
children: [
|
|
375
|
-
/* @__PURE__ */
|
|
371
|
+
/* @__PURE__ */ v("div", {
|
|
376
372
|
style: {
|
|
377
373
|
display: "flex",
|
|
378
374
|
alignItems: "center",
|
|
379
375
|
justifyContent: "space-between",
|
|
380
376
|
gap: 8
|
|
381
377
|
},
|
|
382
|
-
children: [/* @__PURE__ */
|
|
378
|
+
children: [/* @__PURE__ */ _("span", {
|
|
383
379
|
style: {
|
|
384
380
|
color: q.danger,
|
|
385
381
|
fontWeight: 600,
|
|
@@ -387,7 +383,7 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
387
383
|
letterSpacing: .3
|
|
388
384
|
},
|
|
389
385
|
children: "⚠ Backend error"
|
|
390
|
-
}), /* @__PURE__ */
|
|
386
|
+
}), /* @__PURE__ */ _("button", {
|
|
391
387
|
onClick: t,
|
|
392
388
|
"aria-label": "Dismiss",
|
|
393
389
|
style: {
|
|
@@ -402,14 +398,14 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
402
398
|
children: "×"
|
|
403
399
|
})]
|
|
404
400
|
}),
|
|
405
|
-
/* @__PURE__ */
|
|
401
|
+
/* @__PURE__ */ v("div", {
|
|
406
402
|
style: {
|
|
407
403
|
marginTop: 6,
|
|
408
404
|
color: q.muted,
|
|
409
405
|
fontSize: 11.5
|
|
410
406
|
},
|
|
411
407
|
children: [
|
|
412
|
-
/* @__PURE__ */
|
|
408
|
+
/* @__PURE__ */ _("span", {
|
|
413
409
|
style: {
|
|
414
410
|
fontFamily: J,
|
|
415
411
|
color: q.fg
|
|
@@ -417,13 +413,13 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
417
413
|
children: e.api
|
|
418
414
|
}),
|
|
419
415
|
" · ",
|
|
420
|
-
/* @__PURE__ */
|
|
416
|
+
/* @__PURE__ */ _("span", {
|
|
421
417
|
style: { fontFamily: J },
|
|
422
418
|
children: e.spanName
|
|
423
419
|
})
|
|
424
420
|
]
|
|
425
421
|
}),
|
|
426
|
-
/* @__PURE__ */
|
|
422
|
+
/* @__PURE__ */ _("div", {
|
|
427
423
|
style: {
|
|
428
424
|
marginTop: 4,
|
|
429
425
|
color: q.fg,
|
|
@@ -431,7 +427,7 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
431
427
|
},
|
|
432
428
|
children: e.message
|
|
433
429
|
}),
|
|
434
|
-
/* @__PURE__ */
|
|
430
|
+
/* @__PURE__ */ _("button", {
|
|
435
431
|
onClick: () => {
|
|
436
432
|
i(a).then((e) => {
|
|
437
433
|
e !== "failed" && (r(!0), setTimeout(() => r(!1), 1500));
|
|
@@ -456,14 +452,14 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
456
452
|
})
|
|
457
453
|
]
|
|
458
454
|
});
|
|
459
|
-
},
|
|
455
|
+
}, he = (e) => {
|
|
460
456
|
try {
|
|
461
457
|
let t = new URL(e);
|
|
462
458
|
return `${t.protocol === "wss:" ? "https:" : "http:"}//${t.host}`;
|
|
463
459
|
} catch {
|
|
464
460
|
return "";
|
|
465
461
|
}
|
|
466
|
-
}, Y = (e, t) => /^wss?:\/\//i.test(e) || /^https?:\/\//i.test(e) ?
|
|
462
|
+
}, Y = (e, t) => /^wss?:\/\//i.test(e) || /^https?:\/\//i.test(e) ? he(e) : `/_voltro/api/${t}`, ge = typeof performance < "u" ? performance.now() : Date.now(), X = () => {
|
|
467
463
|
if (typeof window > "u") return !1;
|
|
468
464
|
try {
|
|
469
465
|
if (window.localStorage?.getItem("framework_debug") === "1") return !0;
|
|
@@ -477,10 +473,10 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
477
473
|
}.DEV === !0;
|
|
478
474
|
}, Z = (e, ...t) => {
|
|
479
475
|
if (!X()) return;
|
|
480
|
-
let n = ((typeof performance < "u" ? performance.now() : Date.now()) -
|
|
476
|
+
let n = ((typeof performance < "u" ? performance.now() : Date.now()) - ge).toFixed(0).padStart(6, " ");
|
|
481
477
|
console.log(`[fw ${e} +${n}ms]`, ...t);
|
|
482
|
-
}, Q = 3e3,
|
|
483
|
-
let o = ++
|
|
478
|
+
}, Q = 3e3, _e = 0, ve = (e, t, n, r) => (i, a) => {
|
|
479
|
+
let o = ++_e;
|
|
484
480
|
Z(e, `ws#${o} create gen=${t} url=${i}`);
|
|
485
481
|
let s = new globalThis.WebSocket(i, a), c = !1, l = !1, u = (e) => {
|
|
486
482
|
l || (l = !0, r(e));
|
|
@@ -498,23 +494,19 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
498
494
|
} catch {}
|
|
499
495
|
}
|
|
500
496
|
}, Q), s;
|
|
501
|
-
}
|
|
502
|
-
class i extends f.Tag(`@voltro/web/AppClient/${e.name}`)() {}
|
|
503
|
-
let a = _.layerProtocolSocket().pipe(p.provide(v.layerJson), p.provide(h.layerWebSocket(e.wsUrl)), p.provide(Ee(e.name, t, n, r))), o = typeof e.headers == "function" ? await e.headers() : e.headers, s = p.scoped(i, _.make(e.group)).pipe(p.provide(a)), c = o ? p.locallyScoped(_.currentHeaders, g.fromInput(o)) : p.empty;
|
|
497
|
+
}, ye = async (e, t, n, r) => {
|
|
504
498
|
Z(e.name, `build gen=${t}: making runtime`);
|
|
505
|
-
let l = m.make(p.merge(s, c));
|
|
506
499
|
try {
|
|
507
|
-
let
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
};
|
|
500
|
+
let i = await p({
|
|
501
|
+
name: e.name,
|
|
502
|
+
wsUrl: e.wsUrl,
|
|
503
|
+
group: e.group,
|
|
504
|
+
headers: e.headers,
|
|
505
|
+
webSocketConstructor: ve(e.name, t, n, r)
|
|
506
|
+
});
|
|
507
|
+
return Z(e.name, `build gen=${t}: runtime resolved`), i;
|
|
516
508
|
} catch (n) {
|
|
517
|
-
throw Z(e.name, `build gen=${t}: runtime FAILED, disposing`, n.message ?? n),
|
|
509
|
+
throw Z(e.name, `build gen=${t}: runtime FAILED, disposing`, n.message ?? n), n;
|
|
518
510
|
}
|
|
519
511
|
}, $ = ({ apis: e, children: n, chrome: r }) => {
|
|
520
512
|
let [i, a] = u(() => ({
|
|
@@ -522,13 +514,13 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
522
514
|
clients: /* @__PURE__ */ new Map()
|
|
523
515
|
})), s = l(null), d = o(() => {
|
|
524
516
|
s.current?.reconnect();
|
|
525
|
-
}, []), [
|
|
517
|
+
}, []), [p, b] = u(!1);
|
|
526
518
|
c(() => {
|
|
527
|
-
|
|
519
|
+
b(!0);
|
|
528
520
|
}, []), c(() => {
|
|
529
|
-
let t =
|
|
521
|
+
let t = oe({
|
|
530
522
|
apis: e,
|
|
531
|
-
buildClient:
|
|
523
|
+
buildClient: ye,
|
|
532
524
|
onChange: (e, t) => {
|
|
533
525
|
a({
|
|
534
526
|
clients: e,
|
|
@@ -542,7 +534,7 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
542
534
|
}, [e]), c(() => {
|
|
543
535
|
if (!X() || typeof window > "u") return;
|
|
544
536
|
let t = [], n = [], r = e[0]?.name ?? "web";
|
|
545
|
-
t.push(
|
|
537
|
+
t.push(z({
|
|
546
538
|
baseUrl: window.location.origin,
|
|
547
539
|
appName: r
|
|
548
540
|
}));
|
|
@@ -553,14 +545,14 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
553
545
|
originLabel: t.name
|
|
554
546
|
}));
|
|
555
547
|
}
|
|
556
|
-
let i =
|
|
548
|
+
let i = g((e) => H(e.traceId));
|
|
557
549
|
return () => {
|
|
558
550
|
for (let e of t) e.dispose();
|
|
559
551
|
for (let e of n) e.dispose();
|
|
560
552
|
i();
|
|
561
553
|
};
|
|
562
554
|
}, [e]);
|
|
563
|
-
let
|
|
555
|
+
let x = new Map(e.map((e) => [e.name, i.clients.get(e.name)?.client ?? m])), S = new Map(e.map((e) => {
|
|
564
556
|
let t = i.clients.get(e.name);
|
|
565
557
|
return t ? [e.name, {
|
|
566
558
|
runtime: t.runtime,
|
|
@@ -570,28 +562,28 @@ var w = e("reconnect", null), ie = () => s(w) ?? (() => {}), ae = 150, T = 220,
|
|
|
570
562
|
inspectBaseUrl: Y(e.wsUrl, e.name),
|
|
571
563
|
errorBus: t.errorBus
|
|
572
564
|
}] : [e.name, {
|
|
573
|
-
...
|
|
565
|
+
...h,
|
|
574
566
|
descriptors: e.descriptors
|
|
575
567
|
}];
|
|
576
568
|
}));
|
|
577
|
-
return /* @__PURE__ */
|
|
569
|
+
return /* @__PURE__ */ _(y.Provider, {
|
|
578
570
|
value: d,
|
|
579
|
-
children: /* @__PURE__ */
|
|
580
|
-
apis:
|
|
581
|
-
children: /* @__PURE__ */
|
|
582
|
-
value:
|
|
583
|
-
children: [n,
|
|
584
|
-
/* @__PURE__ */
|
|
571
|
+
children: /* @__PURE__ */ _(f, {
|
|
572
|
+
apis: S,
|
|
573
|
+
children: /* @__PURE__ */ v(t.Provider, {
|
|
574
|
+
value: x,
|
|
575
|
+
children: [n, p ? /* @__PURE__ */ v(ee, { children: [
|
|
576
|
+
/* @__PURE__ */ _(C, {}),
|
|
585
577
|
r,
|
|
586
|
-
X() ? /* @__PURE__ */
|
|
578
|
+
X() ? /* @__PURE__ */ _(pe, {}) : null
|
|
587
579
|
] }) : null]
|
|
588
580
|
})
|
|
589
581
|
})
|
|
590
582
|
});
|
|
591
|
-
},
|
|
583
|
+
}, be = ({ App: e, apis: t, Devtools: n }) => /* @__PURE__ */ _($, {
|
|
592
584
|
apis: t,
|
|
593
|
-
chrome: n ? /* @__PURE__ */
|
|
594
|
-
children: /* @__PURE__ */
|
|
585
|
+
chrome: n ? /* @__PURE__ */ _(n, {}) : null,
|
|
586
|
+
children: /* @__PURE__ */ _(e, {})
|
|
595
587
|
});
|
|
596
588
|
//#endregion
|
|
597
|
-
export { K as a,
|
|
589
|
+
export { K as a, C as c, z as i, y as l, $ as n, H as o, R as r, W as s, be as t, b as u };
|
package/dist/frameworkBoot.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ComponentType } from 'react';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
+
import { ResolvableHeaders } from '@voltro/client';
|
|
3
4
|
import { Rpc } from '@effect/rpc';
|
|
4
5
|
import { RpcGroup } from '@effect/rpc';
|
|
5
6
|
|
|
@@ -27,14 +28,6 @@ export declare interface FrameworkBootProps {
|
|
|
27
28
|
readonly Devtools?: ComponentType;
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
export declare interface MountedApi {
|
|
31
|
-
readonly name: string;
|
|
32
|
-
readonly group: RpcGroup.RpcGroup<Rpc.Any>;
|
|
33
|
-
readonly descriptors: ClientDescriptorMap;
|
|
34
|
-
readonly wsUrl: string;
|
|
35
|
-
readonly headers?: ResolvableHeaders | undefined;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
31
|
/**
|
|
39
32
|
* Auth headers for an api's WS rpc client. @effect/rpc sends these in the
|
|
40
33
|
* per-request MESSAGE frame (NOT the WS upgrade — a browser can't set upgrade
|
|
@@ -42,8 +35,17 @@ export declare interface MountedApi {
|
|
|
42
35
|
* what lets a cross-origin api authenticate WS subscriptions. A thunk is
|
|
43
36
|
* resolved fresh on every (re)connect, so a rotating token (e.g. a Supabase
|
|
44
37
|
* access token) is pulled anew per connect instead of freezing at first mount.
|
|
38
|
+
*
|
|
39
|
+
* `ResolvableHeaders` is re-exported from `@voltro/client` (the lower layer that
|
|
40
|
+
* owns `buildApiRuntime`) so there is ONE definition, not a web-local copy.
|
|
45
41
|
*/
|
|
46
|
-
export declare
|
|
42
|
+
export declare interface MountedApi {
|
|
43
|
+
readonly name: string;
|
|
44
|
+
readonly group: RpcGroup.RpcGroup<Rpc.Any>;
|
|
45
|
+
readonly descriptors: ClientDescriptorMap;
|
|
46
|
+
readonly wsUrl: string;
|
|
47
|
+
readonly headers?: ResolvableHeaders | undefined;
|
|
48
|
+
}
|
|
47
49
|
|
|
48
50
|
export declare const VoltroRuntimeProvider: ({ apis, children, chrome }: VoltroRuntimeProviderProps) => ReactNode;
|
|
49
51
|
|
package/dist/frameworkBoot.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as e, t } from "./frameworkBoot-
|
|
1
|
+
import { n as e, t } from "./frameworkBoot-BkBY6M2s.js";
|
|
2
2
|
export { t as FrameworkBoot, e as VoltroRuntimeProvider };
|