@zio.dev/zio-blocks 0.0.33 → 0.0.51
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/guides/compile-time-resource-safety-with-scope.md +16 -17
- package/guides/getting-started-with-mux.md +1507 -0
- package/guides/query-dsl-extending.md +161 -102
- package/guides/query-dsl-fluent-builder.md +217 -157
- package/guides/query-dsl-reified-optics.md +12 -10
- package/guides/query-dsl-sql.md +246 -165
- package/guides/telemetry-guide.md +1069 -0
- package/guides/zio-schema-migration.md +29 -22
- package/index.md +292 -50
- package/package.json +1 -1
- package/plans/config-follow-up-prs.md +188 -0
- package/plans/config-pr-assessment-roadmap.md +310 -0
- package/reference/MuxDataFlow.jsx +250 -0
- package/reference/async.md +651 -0
- package/reference/chunk.md +3533 -308
- package/reference/codegen/case-class.md +436 -0
- package/reference/codegen/emitter-config.md +383 -0
- package/reference/codegen/examples.md +664 -0
- package/reference/codegen/field.md +316 -0
- package/reference/codegen/index.md +317 -0
- package/reference/codegen/scala-emitter.md +392 -0
- package/reference/codegen/scala-file.md +276 -0
- package/reference/codegen/sealed-trait.md +408 -0
- package/reference/codegen/type-definition.md +340 -0
- package/reference/codegen/type-ref.md +201 -0
- package/reference/combinators.md +347 -117
- package/reference/config.md +158 -0
- package/reference/context.md +4 -4
- package/reference/datastar.md +346 -0
- package/reference/docs.md +1461 -345
- package/reference/endpoint/auth-type.md +146 -0
- package/reference/endpoint/endpoint.md +297 -0
- package/reference/endpoint/http-codec.md +249 -0
- package/reference/endpoint/index.md +825 -0
- package/reference/endpoint/path-codec.md +237 -0
- package/reference/endpoint/route-pattern.md +196 -0
- package/reference/endpoint/route-tree.md +111 -0
- package/reference/endpoint/segment-codec.md +212 -0
- package/reference/html.md +1120 -0
- package/reference/htmx/attribute-values.md +359 -0
- package/reference/htmx/hx-encoding.md +111 -0
- package/reference/htmx/hx-params.md +204 -0
- package/reference/htmx/hx-swap.md +276 -0
- package/reference/htmx/hx-sync.md +251 -0
- package/reference/htmx/hx-target.md +314 -0
- package/reference/htmx/hx-trigger.md +457 -0
- package/reference/htmx/hx-url-update.md +239 -0
- package/reference/htmx/index.md +855 -0
- package/reference/http-model/index.md +47 -0
- package/reference/http-model/model.md +1481 -0
- package/reference/http-model/schema.md +747 -0
- package/reference/maybe.md +826 -0
- package/reference/media-type.md +2 -2
- package/reference/mux.mdx +823 -0
- package/reference/openapi.md +1351 -0
- package/reference/resource-management/defer-handle.md +1 -1
- package/reference/resource-management/resource.md +31 -2
- package/reference/resource-management/scope.md +28 -12
- package/reference/resource-management/wire.md +3 -7
- package/reference/ringbuffer/MpmcDiagram.jsx +717 -0
- package/reference/ringbuffer/MpscDiagram.jsx +618 -0
- package/reference/ringbuffer/SpmcDiagram.jsx +680 -0
- package/reference/ringbuffer/SpscDiagram.jsx +677 -0
- package/reference/ringbuffer/advanced.mdx +109 -0
- package/reference/ringbuffer/index.mdx +145 -0
- package/reference/ringbuffer/mpmc.mdx +151 -0
- package/reference/ringbuffer/mpsc.mdx +132 -0
- package/reference/ringbuffer/spmc.mdx +108 -0
- package/reference/ringbuffer/spsc.mdx +344 -0
- package/reference/{allows.md → schema/allows.md} +4 -4
- package/reference/{binding-resolver.md → schema/binding-resolver.md} +1 -1
- package/reference/{binding.md → schema/binding.md} +2 -3
- package/reference/schema/built-in-codecs/avro.md +451 -0
- package/reference/schema/built-in-codecs/bson.md +480 -0
- package/reference/schema/built-in-codecs/csv.md +564 -0
- package/reference/schema/built-in-codecs/index.md +77 -0
- package/reference/schema/built-in-codecs/json/index.md +295 -0
- package/reference/schema/built-in-codecs/json/json-config.md +217 -0
- package/reference/{json-patch.md → schema/built-in-codecs/json/json-patch.md} +5 -5
- package/reference/{json-schema.md → schema/built-in-codecs/json/json-schema.md} +14 -47
- package/reference/schema/built-in-codecs/json/json-selection.md +322 -0
- package/reference/{json.md → schema/built-in-codecs/json/json.md} +32 -64
- package/reference/schema/built-in-codecs/messagepack.md +508 -0
- package/reference/schema/built-in-codecs/thrift.md +433 -0
- package/reference/schema/built-in-codecs/toon.md +1078 -0
- package/reference/{xml.md → schema/built-in-codecs/xml.md} +13 -9
- package/reference/schema/built-in-codecs/yaml.md +552 -0
- package/reference/{codec.md → schema/codec.md} +10 -10
- package/reference/{dynamic-optic.md → schema/dynamic-optic.md} +151 -5
- package/reference/{dynamic-schema.md → schema/dynamic-schema.md} +8 -8
- package/reference/schema/format.md +92 -0
- package/reference/schema/index.md +50 -0
- package/reference/schema/migration.md +297 -0
- package/reference/{modifier.md → schema/modifier.md} +58 -7
- package/reference/{optics.md → schema/optics.md} +2 -2
- package/reference/{patch.md → schema/patch.md} +1 -1
- package/{path-interpolator.md → reference/schema/path-interpolator.md} +165 -72
- package/reference/{schema-evolution → schema/schema-evolution}/as.md +8 -8
- package/reference/{schema-evolution → schema/schema-evolution}/index.md +2 -2
- package/reference/{schema-evolution → schema/schema-evolution}/into.md +8 -8
- package/reference/{schema-expr.md → schema/schema-expr.md} +110 -175
- package/reference/{schema.md → schema/schema.md} +12 -0
- package/reference/{structural-types.md → schema/structural-types.md} +1 -1
- package/reference/{type-class-derivation.md → schema/type-class-derivation.md} +63 -1
- package/reference/smithy.md +533 -0
- package/reference/sql/db-codec-deriver.md +71 -0
- package/reference/sql/db-codec.md +687 -0
- package/reference/sql/db-con.md +271 -0
- package/reference/sql/db-connection.md +153 -0
- package/reference/sql/db-param-writer.md +77 -0
- package/reference/sql/db-param.md +66 -0
- package/reference/sql/db-result-reader.md +146 -0
- package/reference/sql/db-tx.md +82 -0
- package/reference/sql/db-value.md +41 -0
- package/reference/sql/ddl.md +85 -0
- package/reference/sql/frag.md +254 -0
- package/reference/sql/index.md +341 -0
- package/reference/sql/repo.md +600 -0
- package/reference/sql/sql-dialect.md +73 -0
- package/reference/sql/sql-logger.md +62 -0
- package/reference/sql/sql-name-mapper.md +70 -0
- package/reference/sql/table-metadata.md +134 -0
- package/reference/sql/table.md +448 -0
- package/reference/sql/transactor-zio.md +399 -0
- package/reference/sql/transactor.md +353 -0
- package/reference/sql-zio.md +112 -0
- package/reference/streams/concurrent-operators.md +106 -0
- package/reference/streams/index.md +653 -0
- package/reference/streams/pipeline.md +718 -0
- package/reference/streams/reader.md +1284 -0
- package/reference/streams/scala-2-compatibility.md +55 -0
- package/reference/streams/sink.md +1426 -0
- package/reference/streams/stream.md +2526 -0
- package/reference/streams/writer.md +1045 -0
- package/reference/streams/zero-boxing.md +275 -0
- package/reference/telemetry.md +693 -0
- package/reference/typeid.md +5 -19
- package/sidebars.js +238 -43
- package/reference/formats.md +0 -694
- package/reference/http-model.md +0 -1716
- package/reference/streams.md +0 -989
- package/ringbuffer.md +0 -249
- /package/reference/{json-differ.md → schema/built-in-codecs/json/json-differ.md} +0 -0
- /package/reference/{dynamic-value.md → schema/dynamic-value.md} +0 -0
- /package/reference/{lazy.md → schema/lazy.md} +0 -0
- /package/reference/{reflect.md → schema/reflect.md} +0 -0
- /package/reference/{registers.md → schema/registers.md} +0 -0
- /package/reference/{schema-error.md → schema/schema-error.md} +0 -0
- /package/reference/{syntax.md → schema/syntax.md} +0 -0
- /package/reference/{validation.md → schema/validation.md} +0 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import React, { useState, useRef, useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
const MAX_VISIBLE = 8;
|
|
4
|
+
const QUEUE_CAP = 256;
|
|
5
|
+
const STREAM_COUNT = 3;
|
|
6
|
+
|
|
7
|
+
const stateMap = {
|
|
8
|
+
open: { label: "open", bg: "#e8f5e0", color: "#3B6D11", dot: "#639922" },
|
|
9
|
+
hcl: { label: "half-closed local", bg: "#fef3cd", color: "#854F0B", dot: "#BA7517" },
|
|
10
|
+
hcr: { label: "half-closed remote", bg: "#fef3cd", color: "#854F0B", dot: "#BA7517" },
|
|
11
|
+
closed: { label: "closed", bg: "#fce8e8", color: "#A32D2D", dot: "#E24B4A" },
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const initStreams = () =>
|
|
15
|
+
Array.from({ length: STREAM_COUNT }, (_, i) => ({
|
|
16
|
+
id: i + 1, state: "open", outQ: [], inQ: [], logs: [],
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
const Badge = ({ state }) => (
|
|
20
|
+
<span style={{
|
|
21
|
+
display: "inline-block", fontSize: 11, fontWeight: 500,
|
|
22
|
+
padding: "2px 8px", borderRadius: 6,
|
|
23
|
+
background: stateMap[state].bg, color: stateMap[state].color,
|
|
24
|
+
}}>
|
|
25
|
+
{stateMap[state].label}
|
|
26
|
+
</span>
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
const Pill = ({ label, dir }) => (
|
|
30
|
+
<span style={{
|
|
31
|
+
padding: "2px 8px", borderRadius: 4, fontSize: 11, whiteSpace: "nowrap",
|
|
32
|
+
fontFamily: "monospace",
|
|
33
|
+
background: dir === "out" ? "rgba(126,119,221,0.15)" : "rgba(29,158,117,0.15)",
|
|
34
|
+
color: dir === "out" ? "#534AB7" : "#0F6E56",
|
|
35
|
+
}}>
|
|
36
|
+
{label}
|
|
37
|
+
</span>
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const Btn = ({ children, variant, disabled, onClick }) => {
|
|
41
|
+
const palette = {
|
|
42
|
+
app: { border: "rgba(126,119,221,0.4)", color: "#534AB7", hover: "rgba(126,119,221,0.1)" },
|
|
43
|
+
proto: { border: "rgba(29,158,117,0.4)", color: "#0F6E56", hover: "rgba(29,158,117,0.1)" },
|
|
44
|
+
lc: { border: "rgba(186,117,23,0.4)", color: "#854F0B", hover: "rgba(186,117,23,0.1)" },
|
|
45
|
+
}[variant];
|
|
46
|
+
return (
|
|
47
|
+
<button
|
|
48
|
+
type="button"
|
|
49
|
+
disabled={disabled}
|
|
50
|
+
onClick={onClick}
|
|
51
|
+
style={{
|
|
52
|
+
fontSize: 12, padding: "4px 10px", borderRadius: 6, cursor: disabled ? "not-allowed" : "pointer",
|
|
53
|
+
border: `1px solid ${palette.border}`, color: palette.color, background: "transparent",
|
|
54
|
+
opacity: disabled ? 0.35 : 1, transition: "background 0.15s",
|
|
55
|
+
}}
|
|
56
|
+
onMouseEnter={e => { if (!disabled) e.currentTarget.style.background = palette.hover; }}
|
|
57
|
+
onMouseLeave={e => { e.currentTarget.style.background = "transparent"; }}
|
|
58
|
+
>
|
|
59
|
+
{children}
|
|
60
|
+
</button>
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const Zone = ({ children, label, tint }) => (
|
|
65
|
+
<div style={{
|
|
66
|
+
padding: "12px 16px", borderRadius: 12, marginBottom: 6,
|
|
67
|
+
background: tint.bg, border: `1px solid ${tint.border}`,
|
|
68
|
+
}}>
|
|
69
|
+
<div style={{ fontSize: 11, fontWeight: 600, textTransform: "uppercase", letterSpacing: 0.5, marginBottom: 8, color: tint.label }}>
|
|
70
|
+
{label}
|
|
71
|
+
</div>
|
|
72
|
+
{children}
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const QueueRow = ({ label, items, dir, count }) => (
|
|
77
|
+
<div style={{ display: "flex", alignItems: "center", gap: 8, marginBottom: 4 }}>
|
|
78
|
+
<span style={{ fontSize: 12, color: "#888", minWidth: 80, textAlign: "right" }}>{label}</span>
|
|
79
|
+
<div style={{
|
|
80
|
+
flex: 1, display: "flex", gap: 3, alignItems: "center", minHeight: 28,
|
|
81
|
+
padding: "3px 6px", borderRadius: 6, border: "1px dashed #ddd", overflow: "hidden",
|
|
82
|
+
}}>
|
|
83
|
+
{items.slice(0, MAX_VISIBLE).map((m, i) => <Pill key={`${m}-${i}`} label={m} dir={dir} />)}
|
|
84
|
+
{items.length > MAX_VISIBLE && <span style={{ fontSize: 10, color: "#aaa" }}>+{items.length - MAX_VISIBLE}</span>}
|
|
85
|
+
</div>
|
|
86
|
+
<span style={{ fontSize: 10, color: "#aaa", minWidth: 40, textAlign: "center" }}>{count}/{QUEUE_CAP}</span>
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const MuxDataFlow = () => {
|
|
91
|
+
const [streams, setStreams] = useState(initStreams);
|
|
92
|
+
const [activeIdx, setActiveIdx] = useState(0);
|
|
93
|
+
const msgRef = useRef(0);
|
|
94
|
+
const logRef = useRef(null);
|
|
95
|
+
|
|
96
|
+
const current = streams[activeIdx];
|
|
97
|
+
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
if (logRef.current) logRef.current.scrollTop = logRef.current.scrollHeight;
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const update = (fn) => {
|
|
103
|
+
setStreams(prev => {
|
|
104
|
+
const next = prev.map(s => ({ ...s, outQ: [...s.outQ], inQ: [...s.inQ], logs: [...s.logs] }));
|
|
105
|
+
fn(next[activeIdx]);
|
|
106
|
+
return next;
|
|
107
|
+
});
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const addLog = (st, msg, ok) => {
|
|
111
|
+
st.logs.push({ msg, ok });
|
|
112
|
+
if (st.logs.length > 40) st.logs.splice(0, st.logs.length - 40);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const nextTag = (p) => { msgRef.current += 1; return p + msgRef.current; };
|
|
116
|
+
|
|
117
|
+
const appSend = () => update(st => {
|
|
118
|
+
if (st.state === "closed" || st.state === "hcl") return addLog(st, "send() → StreamClosed", false);
|
|
119
|
+
if (st.outQ.length >= QUEUE_CAP) return addLog(st, `send() → QueueFull(${QUEUE_CAP})`, false);
|
|
120
|
+
const t = nextTag("M"); st.outQ.push(t); addLog(st, `send("${t}") → ok`, true);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const appReceive = () => update(st => {
|
|
124
|
+
if (st.inQ.length > 0) { const m = st.inQ.shift(); addLog(st, `receive() → Some("${m}")`, true); }
|
|
125
|
+
else if (st.state === "closed") addLog(st, "receive() → StreamClosed", false);
|
|
126
|
+
else addLog(st, "receive() → None", null);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const protoTake = () => update(st => {
|
|
130
|
+
if (st.outQ.length > 0) { const m = st.outQ.shift(); addLog(st, `takeOutbound() → Some("${m}")`, true); }
|
|
131
|
+
else if (st.state === "closed") addLog(st, "takeOutbound() → StreamClosed", false);
|
|
132
|
+
else addLog(st, "takeOutbound() → None", null);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
const protoOffer = () => update(st => {
|
|
136
|
+
if (st.state === "closed" || st.state === "hcr") return addLog(st, "offerInbound() → StreamClosed", false);
|
|
137
|
+
if (st.inQ.length >= QUEUE_CAP) return addLog(st, `offerInbound() → QueueFull(${QUEUE_CAP})`, false);
|
|
138
|
+
const t = nextTag("R"); st.inQ.push(t); addLog(st, `offerInbound("${t}") → ok`, true);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
const doHalfClose = () => update(st => {
|
|
142
|
+
if (st.state === "open") { st.state = "hcl"; addLog(st, "halfClose() → HALF_CLOSED_LOCAL", true); }
|
|
143
|
+
else if (st.state === "hcr") { st.state = "closed"; addLog(st, "halfClose() → CLOSED (both sides done)", true); }
|
|
144
|
+
else addLog(st, `halfClose() → no-op (${stateMap[st.state].label})`, null);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
const doSignalRemote = () => update(st => {
|
|
148
|
+
if (st.state === "open") { st.state = "hcr"; addLog(st, "signalRemoteClose() → HALF_CLOSED_REMOTE", true); }
|
|
149
|
+
else if (st.state === "hcl") { st.state = "closed"; addLog(st, "signalRemoteClose() → CLOSED (both sides done)", true); }
|
|
150
|
+
else addLog(st, `signalRemoteClose() → no-op (${stateMap[st.state].label})`, null);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const doClose = () => update(st => { st.state = "closed"; addLog(st, "close() → CLOSED (immediate)", true); });
|
|
154
|
+
|
|
155
|
+
const doReset = () => update(st => {
|
|
156
|
+
st.state = "open"; st.outQ = []; st.inQ = []; st.logs = [];
|
|
157
|
+
addLog(st, `Stream ${st.id} reset to OPEN`, true);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
const isClosed = current.state === "closed";
|
|
161
|
+
const isHCL = current.state === "hcl";
|
|
162
|
+
const isHCR = current.state === "hcr";
|
|
163
|
+
const activeCount = streams.filter(s => s.state !== "closed").length;
|
|
164
|
+
const recentLogs = current.logs.slice(-14);
|
|
165
|
+
|
|
166
|
+
const flowArrow = { textAlign: "center", fontSize: 11, color: "#aaa", padding: "2px 0" };
|
|
167
|
+
|
|
168
|
+
return (
|
|
169
|
+
<div style={{ maxWidth: 640, margin: "0 auto", fontFamily: "system-ui, sans-serif", fontSize: 14 }}>
|
|
170
|
+
|
|
171
|
+
{/* Stream tabs */}
|
|
172
|
+
<div style={{ display: "flex", gap: 6, marginBottom: 8 }}>
|
|
173
|
+
{streams.map((ss, i) => (
|
|
174
|
+
<button type="button" key={ss.id} onClick={() => setActiveIdx(i)} style={{
|
|
175
|
+
padding: "4px 14px", borderRadius: 8, fontSize: 13, cursor: "pointer",
|
|
176
|
+
border: i === activeIdx ? "none" : "1px solid #ddd",
|
|
177
|
+
background: i === activeIdx ? "#333" : "#fff",
|
|
178
|
+
color: i === activeIdx ? "#fff" : "#888",
|
|
179
|
+
}}>
|
|
180
|
+
Stream {ss.id}
|
|
181
|
+
<span style={{ display: "inline-block", width: 7, height: 7, borderRadius: "50%", marginLeft: 6, verticalAlign: "middle", background: stateMap[ss.state].dot }} />
|
|
182
|
+
</button>
|
|
183
|
+
))}
|
|
184
|
+
</div>
|
|
185
|
+
|
|
186
|
+
{/* Stats */}
|
|
187
|
+
<div style={{ fontSize: 12, color: "#888", marginBottom: 10 }}>
|
|
188
|
+
Active streams: <strong>{activeCount}/{STREAM_COUNT}</strong>
|
|
189
|
+
<span style={{ marginLeft: 16 }}>Mux capacity: <strong>{STREAM_COUNT}</strong></span>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
{/* Application zone */}
|
|
193
|
+
<Zone label="Application code" tint={{ bg: "rgba(126,119,221,0.06)", border: "rgba(126,119,221,0.2)", label: "#534AB7" }}>
|
|
194
|
+
<div style={{ display: "flex", gap: 6, flexWrap: "wrap" }}>
|
|
195
|
+
<Btn variant="app" disabled={isClosed || isHCL} onClick={appSend}>↑ send()</Btn>
|
|
196
|
+
<Btn variant="app" disabled={false} onClick={appReceive}>↓ receive()</Btn>
|
|
197
|
+
</div>
|
|
198
|
+
</Zone>
|
|
199
|
+
|
|
200
|
+
<div style={flowArrow}>↓ send() receive() ↑</div>
|
|
201
|
+
|
|
202
|
+
{/* Mux zone */}
|
|
203
|
+
<Zone label="" tint={{ bg: "#f9f9f7", border: "#e5e5e0", label: "#888" }}>
|
|
204
|
+
<div style={{ display: "flex", alignItems: "center", gap: 8, marginBottom: 8 }}>
|
|
205
|
+
<span style={{ fontSize: 11, fontWeight: 600, textTransform: "uppercase", letterSpacing: 0.5, color: "#888" }}>MuxStream</span>
|
|
206
|
+
<Badge state={current.state} />
|
|
207
|
+
</div>
|
|
208
|
+
<QueueRow label="Outbound" items={current.outQ} dir="out" count={current.outQ.length} />
|
|
209
|
+
<QueueRow label="Inbound" items={current.inQ} dir="in" count={current.inQ.length} />
|
|
210
|
+
</Zone>
|
|
211
|
+
|
|
212
|
+
<div style={flowArrow}>↓ takeOutbound() offerInbound() ↑</div>
|
|
213
|
+
|
|
214
|
+
{/* Protocol zone */}
|
|
215
|
+
<Zone label="Protocol layer" tint={{ bg: "rgba(29,158,117,0.06)", border: "rgba(29,158,117,0.2)", label: "#0F6E56" }}>
|
|
216
|
+
<div style={{ display: "flex", gap: 6, flexWrap: "wrap" }}>
|
|
217
|
+
<Btn variant="proto" disabled={false} onClick={protoTake}>↑ takeOutbound()</Btn>
|
|
218
|
+
<Btn variant="proto" disabled={isClosed || isHCR} onClick={protoOffer}>↓ offerInbound()</Btn>
|
|
219
|
+
</div>
|
|
220
|
+
</Zone>
|
|
221
|
+
|
|
222
|
+
{/* Lifecycle controls */}
|
|
223
|
+
<div style={{ display: "flex", alignItems: "center", gap: 6, flexWrap: "wrap", marginTop: 8, marginBottom: 4 }}>
|
|
224
|
+
<span style={{ fontSize: 11, color: "#aaa", marginRight: 2 }}>Lifecycle:</span>
|
|
225
|
+
<Btn variant="lc" disabled={isClosed} onClick={doHalfClose}>halfClose()</Btn>
|
|
226
|
+
<Btn variant="lc" disabled={isClosed} onClick={doSignalRemote}>signalRemoteClose()</Btn>
|
|
227
|
+
<Btn variant="lc" disabled={isClosed} onClick={doClose}>close()</Btn>
|
|
228
|
+
<Btn variant="lc" disabled={false} onClick={doReset}>↻ reset</Btn>
|
|
229
|
+
</div>
|
|
230
|
+
|
|
231
|
+
{/* Event log */}
|
|
232
|
+
<div ref={logRef} style={{
|
|
233
|
+
marginTop: 8, maxHeight: 100, overflowY: "auto", borderRadius: 8,
|
|
234
|
+
background: "#f7f7f5", border: "1px solid #e5e5e0", padding: "8px 12px",
|
|
235
|
+
fontFamily: "monospace", fontSize: 11, lineHeight: 1.7, color: "#888",
|
|
236
|
+
}}>
|
|
237
|
+
{recentLogs.map((entry, i) => (
|
|
238
|
+
<div key={i} style={{ color: entry.ok === true ? "#3B6D11" : entry.ok === false ? "#c03030" : undefined }}>
|
|
239
|
+
{entry.msg}
|
|
240
|
+
</div>
|
|
241
|
+
))}
|
|
242
|
+
{recentLogs.length === 0 && (
|
|
243
|
+
<div style={{ color: "#bbb", fontStyle: "italic" }}>Click an action to begin</div>
|
|
244
|
+
)}
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
);
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
export default MuxDataFlow;
|