trace-viz 0.3.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 +42 -0
- package/LICENSE +21 -0
- package/README.md +385 -0
- package/dist/adapters/index.d.ts +32 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +83 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/agent.d.ts +66 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +329 -0
- package/dist/agent.js.map +1 -0
- package/dist/atlas/atlas.d.ts +203 -0
- package/dist/atlas/atlas.d.ts.map +1 -0
- package/dist/atlas/atlas.js +1466 -0
- package/dist/atlas/atlas.js.map +1 -0
- package/dist/atlas/index.d.ts +7 -0
- package/dist/atlas/index.d.ts.map +1 -0
- package/dist/atlas/index.js +4 -0
- package/dist/atlas/index.js.map +1 -0
- package/dist/atlas/layout.d.ts +44 -0
- package/dist/atlas/layout.d.ts.map +1 -0
- package/dist/atlas/layout.js +103 -0
- package/dist/atlas/layout.js.map +1 -0
- package/dist/atlas/model.d.ts +164 -0
- package/dist/atlas/model.d.ts.map +1 -0
- package/dist/atlas/model.js +489 -0
- package/dist/atlas/model.js.map +1 -0
- package/dist/channels.d.ts +105 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +411 -0
- package/dist/channels.js.map +1 -0
- package/dist/components.d.ts +76 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +432 -0
- package/dist/components.js.map +1 -0
- package/dist/estate.d.ts +25 -0
- package/dist/estate.d.ts.map +1 -0
- package/dist/estate.js +285 -0
- package/dist/estate.js.map +1 -0
- package/dist/failure.d.ts +36 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +82 -0
- package/dist/failure.js.map +1 -0
- package/dist/geometry.d.ts +24 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +92 -0
- package/dist/geometry.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +66 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +152 -0
- package/dist/layout.js.map +1 -0
- package/dist/layout3d.d.ts +98 -0
- package/dist/layout3d.d.ts.map +1 -0
- package/dist/layout3d.js +350 -0
- package/dist/layout3d.js.map +1 -0
- package/dist/mesh.d.ts +23 -0
- package/dist/mesh.d.ts.map +1 -0
- package/dist/mesh.js +263 -0
- package/dist/mesh.js.map +1 -0
- package/dist/model.d.ts +94 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +84 -0
- package/dist/model.js.map +1 -0
- package/dist/particles.d.ts +80 -0
- package/dist/particles.d.ts.map +1 -0
- package/dist/particles.js +118 -0
- package/dist/particles.js.map +1 -0
- package/dist/project.d.ts +113 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +288 -0
- package/dist/project.js.map +1 -0
- package/dist/react/index.d.ts +22 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +69 -0
- package/dist/react/index.js.map +1 -0
- package/dist/renderer.d.ts +252 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +1710 -0
- package/dist/renderer.js.map +1 -0
- package/dist/scales.d.ts +99 -0
- package/dist/scales.d.ts.map +1 -0
- package/dist/scales.js +126 -0
- package/dist/scales.js.map +1 -0
- package/dist/scene.d.ts +53 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +44 -0
- package/dist/scene.js.map +1 -0
- package/dist/schema.d.ts +24 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +131 -0
- package/dist/schema.js.map +1 -0
- package/dist/seed.d.ts +33 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +173 -0
- package/dist/seed.js.map +1 -0
- package/dist/theme.d.ts +35 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +83 -0
- package/dist/theme.js.map +1 -0
- package/dist/trace-viz.esm.js +15 -0
- package/dist/trace-viz.min.js +15 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +105 -0
package/dist/estate.js
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { mulberry32 } from './particles.js';
|
|
2
|
+
const TIERS = ['edge', 'app', 'core', 'data'];
|
|
3
|
+
const DOMAINS = [
|
|
4
|
+
['identity', ['auth', 'accounts', 'sessions', 'consent']],
|
|
5
|
+
['payments', ['ledger', 'checkout', 'refunds', 'payouts', 'fraud-signals']],
|
|
6
|
+
['risk', ['scoring', 'rules', 'review', 'chargebacks']],
|
|
7
|
+
['marketplace', ['catalog', 'listings', 'sellers', 'reviews', 'media']],
|
|
8
|
+
['orders', ['orders-core', 'cart', 'fulfilment', 'returns']],
|
|
9
|
+
['logistics', ['dispatch', 'routing', 'tracking', 'carriers', 'warehouse']],
|
|
10
|
+
['comms', ['notify', 'email', 'push', 'templates']],
|
|
11
|
+
['search', ['query', 'indexing', 'ranking', 'suggest']],
|
|
12
|
+
['pricing', ['quotes', 'promotions', 'tax', 'fx']],
|
|
13
|
+
['growth', ['experiments', 'campaigns', 'referrals', 'loyalty']],
|
|
14
|
+
['platform', ['config', 'flags', 'observability', 'secrets', 'scheduler', 'api-gateway']],
|
|
15
|
+
['data', ['ingest', 'warehouse', 'features', 'ml-serving', 'lineage']],
|
|
16
|
+
];
|
|
17
|
+
const ROLES = {
|
|
18
|
+
edge: ['bff', 'api', 'gateway', 'graphql', 'webhooks'],
|
|
19
|
+
app: ['service', 'orchestrator', 'handler', 'router', 'worker', 'sync', 'dispatcher', 'projector'],
|
|
20
|
+
core: ['engine', 'ledger', 'matcher', 'scorer', 'rules', 'calculator', 'validator', 'resolver', 'state'],
|
|
21
|
+
data: ['db', 'store', 'index', 'cache', 'kv', 'blob', 'timeseries'],
|
|
22
|
+
};
|
|
23
|
+
const ENGINES = {
|
|
24
|
+
db: 'postgres',
|
|
25
|
+
store: 'cassandra',
|
|
26
|
+
index: 'elasticsearch',
|
|
27
|
+
cache: 'redis',
|
|
28
|
+
kv: 'dynamo',
|
|
29
|
+
blob: 's3',
|
|
30
|
+
timeseries: 'clickhouse',
|
|
31
|
+
};
|
|
32
|
+
export function generateEstate(options = {}) {
|
|
33
|
+
const { seed = 7, services: serviceCount = 600, topics: topicCount = 80, regions = ['eu-west', 'us-east'], baseRps = 42000, title = `Estate: ${serviceCount} services, ${topicCount} topics, ${DOMAINS.length} domains`, } = options;
|
|
34
|
+
const rand = mulberry32(seed);
|
|
35
|
+
const between = (lo, hi) => lo + rand() * (hi - lo);
|
|
36
|
+
const pick = (xs) => xs[Math.floor(rand() * xs.length)];
|
|
37
|
+
const lognormal = (mu, sigma) => {
|
|
38
|
+
const u = Math.max(1e-9, rand());
|
|
39
|
+
const v = rand();
|
|
40
|
+
const z = Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);
|
|
41
|
+
return Math.exp(mu + sigma * z);
|
|
42
|
+
};
|
|
43
|
+
// --- services --------------------------------------------------------------
|
|
44
|
+
const svcs = [];
|
|
45
|
+
const used = new Set();
|
|
46
|
+
const uniq = (base) => {
|
|
47
|
+
let n = base;
|
|
48
|
+
let i = 2;
|
|
49
|
+
while (used.has(n))
|
|
50
|
+
n = `${base}-${i++}`;
|
|
51
|
+
used.add(n);
|
|
52
|
+
return n;
|
|
53
|
+
};
|
|
54
|
+
const teams = DOMAINS.flatMap(([d, ts]) => ts.map((t) => ({ domain: d, team: t })));
|
|
55
|
+
// Team sizes are uneven on purpose: a couple of big teams per domain, a
|
|
56
|
+
// long tail of small ones.
|
|
57
|
+
const teamWeights = teams.map(() => lognormal(0, 0.6));
|
|
58
|
+
const wsum = teamWeights.reduce((a, b) => a + b, 0);
|
|
59
|
+
let remaining = serviceCount;
|
|
60
|
+
teams.forEach((t, i) => {
|
|
61
|
+
const want = i === teams.length - 1 ? remaining : Math.max(3, Math.round((serviceCount * teamWeights[i]) / wsum));
|
|
62
|
+
const n = Math.min(want, remaining);
|
|
63
|
+
remaining -= n;
|
|
64
|
+
for (let k = 0; k < n; k++) {
|
|
65
|
+
const r = rand();
|
|
66
|
+
const tier = k === 0 ? 'edge' : r < 0.36 ? 'app' : r < 0.74 ? 'core' : 'data';
|
|
67
|
+
const role = pick(ROLES[tier]);
|
|
68
|
+
const name = uniq(`${t.team}-${role}`);
|
|
69
|
+
const kind = tier === 'data' ? (role === 'cache' ? 'cache' : 'datastore') : tier === 'edge' && role === 'gateway' ? 'gateway' : 'service';
|
|
70
|
+
const level = tier === 'edge' ? 0 : tier === 'app' ? 1 + Math.floor(rand() * 2) : tier === 'core' ? 3 + Math.floor(rand() * 3) : 6;
|
|
71
|
+
svcs.push({
|
|
72
|
+
name,
|
|
73
|
+
domain: t.domain,
|
|
74
|
+
team: t.team,
|
|
75
|
+
tier,
|
|
76
|
+
kind,
|
|
77
|
+
role,
|
|
78
|
+
...(tier === 'data' ? { engine: ENGINES[role] ?? 'postgres' } : {}),
|
|
79
|
+
level,
|
|
80
|
+
inbound: 0,
|
|
81
|
+
index: 0,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
// A strict order so the call graph is a DAG by construction: tier first,
|
|
86
|
+
// then a shuffle. A few deliberate back-edges are added afterwards.
|
|
87
|
+
svcs.sort((a, b) => a.level - b.level || rand() - 0.5);
|
|
88
|
+
svcs.forEach((s, i) => (s.index = i));
|
|
89
|
+
const byName = new Map(svcs.map((s) => [s.name, s]));
|
|
90
|
+
const byTeam = new Map();
|
|
91
|
+
const byDomain = new Map();
|
|
92
|
+
for (const s of svcs) {
|
|
93
|
+
byTeam.set(s.team, [...(byTeam.get(s.team) ?? []), s]);
|
|
94
|
+
byDomain.set(s.domain, [...(byDomain.get(s.domain) ?? []), s]);
|
|
95
|
+
}
|
|
96
|
+
const platform = byDomain.get('platform').filter((s) => s.tier !== 'data');
|
|
97
|
+
const hubs = platform.filter((s) => /config|flags|secrets|auth/.test(s.name)).concat(byTeam.get('auth').filter((s) => s.tier !== 'data'));
|
|
98
|
+
// --- health ----------------------------------------------------------------
|
|
99
|
+
const nonData = svcs.filter((s) => s.tier !== 'data' && s.tier !== 'edge');
|
|
100
|
+
const sick = new Set();
|
|
101
|
+
while (sick.size < 6)
|
|
102
|
+
sick.add(pick(nonData).name);
|
|
103
|
+
const burning = new Set();
|
|
104
|
+
while (burning.size < 2) {
|
|
105
|
+
const s = pick(nonData).name;
|
|
106
|
+
if (!sick.has(s))
|
|
107
|
+
burning.add(s);
|
|
108
|
+
}
|
|
109
|
+
const errorFor = (target, healthy) => burning.has(target) ? between(0.12, 0.3) : sick.has(target) ? between(0.02, 0.05) : healthy;
|
|
110
|
+
const latencyFor = (t) => t === 'edge' ? between(5, 20) : t === 'app' ? between(8, 60) : t === 'core' ? between(4, 40) : between(1, 8);
|
|
111
|
+
const calls = [];
|
|
112
|
+
const edgeCount = new Map();
|
|
113
|
+
const link = (from, to, rps, back = false) => {
|
|
114
|
+
if (from === to)
|
|
115
|
+
return;
|
|
116
|
+
const k = `${from.name}>${to.name}`;
|
|
117
|
+
if (edgeCount.has(k))
|
|
118
|
+
return;
|
|
119
|
+
edgeCount.set(k, 1);
|
|
120
|
+
const sameTeam = from.team === to.team;
|
|
121
|
+
const failure = to.tier === 'data' ? 'fail-closed' : sameTeam ? (rand() < 0.6 ? 'fail-closed' : 'fail-open') : rand() < 0.3 ? 'fail-closed' : 'fail-open';
|
|
122
|
+
const api = to.tier === 'data' ? (to.role === 'cache' ? 'get' : to.role === 'blob' ? 'put' : 'query') : pick(['get', 'list', 'create', 'update', 'search', 'resolve', 'evaluate']);
|
|
123
|
+
calls.push({ from, to, api, rps, failure, protocol: to.tier === 'data' ? to.engine : rand() < 0.7 ? 'grpc' : 'http', back });
|
|
124
|
+
to.inbound += rps;
|
|
125
|
+
};
|
|
126
|
+
// Ingress: clients hit every domain's edge services, unevenly.
|
|
127
|
+
const clients = { name: 'clients', domain: 'outside', team: 'outside', tier: 'edge', kind: 'client', role: 'client', level: -1, inbound: 0, index: -1 };
|
|
128
|
+
const domainWeight = new Map(DOMAINS.map(([d]) => [d, lognormal(0, 0.9)]));
|
|
129
|
+
const dsum = [...domainWeight.values()].reduce((a, b) => a + b, 0);
|
|
130
|
+
for (const s of svcs) {
|
|
131
|
+
if (s.tier !== 'edge')
|
|
132
|
+
continue;
|
|
133
|
+
const teamEdges = byTeam.get(s.team).filter((x) => x.tier === 'edge').length;
|
|
134
|
+
const share = (domainWeight.get(s.domain) / dsum) / DOMAINS.find(([d]) => d === s.domain)[1].length / teamEdges;
|
|
135
|
+
link(clients, s, baseRps * share * between(0.6, 1.4));
|
|
136
|
+
}
|
|
137
|
+
for (const s of svcs) {
|
|
138
|
+
if (s.tier === 'data')
|
|
139
|
+
continue;
|
|
140
|
+
// Anything nobody calls still does work: a cron, a consumer, a job.
|
|
141
|
+
if (s.inbound === 0)
|
|
142
|
+
s.inbound = lognormal(1.5, 1);
|
|
143
|
+
const fan = s.tier === 'edge' ? 2 + Math.floor(rand() * 4) : 1 + Math.floor(rand() * 3);
|
|
144
|
+
for (let k = 0; k < fan; k++) {
|
|
145
|
+
const r = rand();
|
|
146
|
+
let pool;
|
|
147
|
+
if (r < 0.62)
|
|
148
|
+
pool = byTeam.get(s.team);
|
|
149
|
+
else if (r < 0.82)
|
|
150
|
+
pool = byDomain.get(s.domain);
|
|
151
|
+
else if (r < 0.94)
|
|
152
|
+
pool = hubs;
|
|
153
|
+
else
|
|
154
|
+
pool = svcs;
|
|
155
|
+
const later = pool.filter((t) => t.level > s.level && (t.tier !== 'data' || t.team === s.team || rand() < 0.05));
|
|
156
|
+
if (!later.length)
|
|
157
|
+
continue;
|
|
158
|
+
link(s, pick(later), s.inbound * between(0.15, 1.6));
|
|
159
|
+
}
|
|
160
|
+
// Every app/core service owns some data.
|
|
161
|
+
if (s.tier !== 'edge') {
|
|
162
|
+
const stores = byTeam.get(s.team).filter((t) => t.tier === 'data');
|
|
163
|
+
if (stores.length)
|
|
164
|
+
link(s, pick(stores), s.inbound * between(0.8, 2.5));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Back-edges: callbacks and status polls that go against the grain.
|
|
168
|
+
for (let i = 0; i < Math.round(svcs.length * 0.012); i++) {
|
|
169
|
+
const a = pick(nonData);
|
|
170
|
+
const earlier = nonData.filter((t) => t.level < a.level && t.domain === a.domain);
|
|
171
|
+
if (earlier.length)
|
|
172
|
+
link(a, pick(earlier), a.inbound * between(0.02, 0.1), true);
|
|
173
|
+
}
|
|
174
|
+
// --- kafka -------------------------------------------------------------------
|
|
175
|
+
const topics = [];
|
|
176
|
+
const topicNames = new Set();
|
|
177
|
+
const producerPool = svcs.filter((s) => s.tier === 'app' || s.tier === 'core');
|
|
178
|
+
const produces = [];
|
|
179
|
+
const consumes = [];
|
|
180
|
+
const topicLag = new Map();
|
|
181
|
+
const events = ['created', 'updated', 'completed', 'failed', 'events', 'changes', 'snapshots', 'audit', 'metrics', 'commands'];
|
|
182
|
+
for (let i = 0; i < topicCount; i++) {
|
|
183
|
+
const owner = pick(producerPool);
|
|
184
|
+
let name = `${owner.team}.${pick(events)}`;
|
|
185
|
+
let n = 2;
|
|
186
|
+
while (topicNames.has(name))
|
|
187
|
+
name = `${owner.team}.${pick(events)}.v${n++}`;
|
|
188
|
+
topicNames.add(name);
|
|
189
|
+
const topic = { name, domain: owner.domain, team: owner.team, partitions: pick([3, 6, 12, 24, 48]) };
|
|
190
|
+
topics.push(topic);
|
|
191
|
+
const producers = new Set([owner]);
|
|
192
|
+
if (rand() < 0.35)
|
|
193
|
+
producers.add(pick(byTeam.get(owner.team).filter((s) => s.tier !== 'data')) ?? owner);
|
|
194
|
+
let produced = 0;
|
|
195
|
+
for (const p of producers) {
|
|
196
|
+
const rps = Math.max(0.2, p.inbound * between(0.1, 1.2));
|
|
197
|
+
produces.push({ from: p, topic, rps });
|
|
198
|
+
produced += rps;
|
|
199
|
+
}
|
|
200
|
+
const groups = 1 + Math.floor(rand() * 4);
|
|
201
|
+
const backedUp = rand() < 0.15;
|
|
202
|
+
let lag = 0;
|
|
203
|
+
const seen = new Set();
|
|
204
|
+
for (let g = 0; g < groups; g++) {
|
|
205
|
+
const r = rand();
|
|
206
|
+
const pool = r < 0.45 ? byDomain.get(owner.domain) : svcs;
|
|
207
|
+
const c = pick(pool.filter((s) => (s.tier === 'app' || s.tier === 'core') && s.team !== owner.team));
|
|
208
|
+
if (!c || seen.has(c.name))
|
|
209
|
+
continue;
|
|
210
|
+
seen.add(c.name);
|
|
211
|
+
const slow = backedUp && g === 0;
|
|
212
|
+
const rate = produced * (slow ? between(0.45, 0.85) : between(0.97, 1.0));
|
|
213
|
+
const l = slow ? Math.round(lognormal(12, 1)) : Math.round(lognormal(4, 1.2));
|
|
214
|
+
lag += l;
|
|
215
|
+
consumes.push({ topic, to: c, group: `${c.name}-cg`, rps: rate, lag: l });
|
|
216
|
+
c.inbound += rate;
|
|
217
|
+
}
|
|
218
|
+
topicLag.set(name, lag);
|
|
219
|
+
}
|
|
220
|
+
// --- emit --------------------------------------------------------------------
|
|
221
|
+
const records = [];
|
|
222
|
+
const nodes = [];
|
|
223
|
+
const regionShare = regions.map((_, i) => (i === 0 ? 1 : between(0.4, 0.8)));
|
|
224
|
+
const total = regionShare.reduce((a, b) => a + b, 0);
|
|
225
|
+
const r4 = (x) => Math.round(x * 10000) / 10000;
|
|
226
|
+
regions.forEach((region, ri) => {
|
|
227
|
+
const share = regionShare[ri] / total;
|
|
228
|
+
for (const c of calls) {
|
|
229
|
+
records.push({
|
|
230
|
+
from: { service: c.from.name, api: c.from.tier === 'edge' ? 'ingress' : 'call' },
|
|
231
|
+
to: { service: c.to.name, api: c.api },
|
|
232
|
+
dims: { env: 'prod', region, transport: 'sync', protocol: c.protocol, failure: c.failure },
|
|
233
|
+
metrics: {
|
|
234
|
+
rps: Math.round(c.rps * share * 100) / 100,
|
|
235
|
+
latencyMs: Math.round(latencyFor(c.to.tier) * 10) / 10,
|
|
236
|
+
errorRate: r4(errorFor(c.to.name, between(0, 0.003))),
|
|
237
|
+
bytes: Math.round(between(200, 6000)),
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
for (const p of produces) {
|
|
242
|
+
records.push({
|
|
243
|
+
from: { service: p.from.name, api: 'produce' },
|
|
244
|
+
to: { service: p.topic.name, api: 'produce' },
|
|
245
|
+
dims: { env: 'prod', region, transport: 'kafka', protocol: 'kafka', failure: 'fail-open' },
|
|
246
|
+
metrics: { rps: Math.round(p.rps * share * 100) / 100, latencyMs: Math.round(between(2, 12) * 10) / 10, errorRate: r4(between(0, 0.001)), bytes: Math.round(between(300, 4000)) },
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
for (const c of consumes) {
|
|
250
|
+
records.push({
|
|
251
|
+
from: { service: c.topic.name, api: c.group },
|
|
252
|
+
to: { service: c.to.name, api: 'consume' },
|
|
253
|
+
dims: { env: 'prod', region, transport: 'kafka', protocol: 'kafka', failure: 'fail-open', group: c.group },
|
|
254
|
+
metrics: { rps: Math.round(c.rps * share * 100) / 100, latencyMs: Math.round(between(5, 80) * 10) / 10, errorRate: r4(errorFor(c.to.name, between(0, 0.004))), bytes: Math.round(between(300, 4000)) },
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
for (const s of svcs) {
|
|
259
|
+
nodes.push({
|
|
260
|
+
key: { service: s.name },
|
|
261
|
+
dims: { domain: s.domain, team: s.team, kind: s.kind, tier: s.tier, role: s.role, ...(s.engine ? { engine: s.engine } : {}) },
|
|
262
|
+
attrs: { instances: s.tier === 'data' ? Math.round(between(3, 9)) : Math.round(lognormal(2.2, 0.7)), cpu: between(0.1, 0.9), mem: between(0.2, 0.9) },
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
for (const t of topics) {
|
|
266
|
+
nodes.push({
|
|
267
|
+
key: { service: t.name },
|
|
268
|
+
dims: { domain: t.domain, team: t.team, kind: 'topic', tier: 'core', role: 'topic' },
|
|
269
|
+
attrs: { partitions: t.partitions, lag: topicLag.get(t.name) ?? 0, retentionHours: pick([24, 72, 168]) },
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
nodes.push({ key: { service: 'clients' }, dims: { domain: 'outside', team: 'outside', kind: 'client', tier: 'edge', role: 'client' }, attrs: { instances: 1 } });
|
|
273
|
+
return {
|
|
274
|
+
version: 1,
|
|
275
|
+
records,
|
|
276
|
+
nodes,
|
|
277
|
+
meta: {
|
|
278
|
+
title,
|
|
279
|
+
window: 'synthetic',
|
|
280
|
+
hierarchy: ['domain', 'team'],
|
|
281
|
+
note: `${svcs.length} services, ${topics.length} topics, ${calls.length} sync edges, ${produces.length + consumes.length} kafka edges, ${sick.size} sick, ${burning.size} burning`,
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=estate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"estate.js","sourceRoot":"","sources":["../src/estate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { EdgeStyle } from './channels.js';
|
|
2
|
+
import type { Scene } from './scene.js';
|
|
3
|
+
/**
|
|
4
|
+
* Blast radius.
|
|
5
|
+
*
|
|
6
|
+
* `fail-closed` and `fail-open` are not decoration on a dependency, they are
|
|
7
|
+
* the dependency's contract: they say what happens to the caller when the
|
|
8
|
+
* callee dies. So they get a first-class model, not just a colour.
|
|
9
|
+
*
|
|
10
|
+
* An edge `a -> b` means a calls b:
|
|
11
|
+
*
|
|
12
|
+
* - **rigid** (fail-closed): if b is dead, a is dead. Death travels backwards
|
|
13
|
+
* up the call graph, and this is the propagation people underestimate.
|
|
14
|
+
* - **breakaway** (fail-open): if b is dead, a is *degraded* and still serving.
|
|
15
|
+
* The link parts, the caller survives. A fail-open dependency is a firebreak,
|
|
16
|
+
* and it is the only thing that stops the front.
|
|
17
|
+
* - **plain** (unknown): treated as breakaway, because assuming an undeclared
|
|
18
|
+
* dependency is load-bearing would turn every diagram black on the first kill
|
|
19
|
+
* and teach nothing. The UI flags these rather than guessing loudly.
|
|
20
|
+
*/
|
|
21
|
+
export type NodeHealth = 'ok' | 'degraded' | 'dead';
|
|
22
|
+
export type EdgeHealth = 'flowing' | 'strained' | 'severed';
|
|
23
|
+
export interface FailureResult {
|
|
24
|
+
health: Map<string, NodeHealth>;
|
|
25
|
+
edgeHealth: Map<string, EdgeHealth>;
|
|
26
|
+
/** Hops from the nearest killed node, following the propagation. Drives the wavefront timing. */
|
|
27
|
+
hop: Map<string, number>;
|
|
28
|
+
/** Edges where a breakaway coupling stopped the front. */
|
|
29
|
+
firebreaks: string[];
|
|
30
|
+
deadRps: number;
|
|
31
|
+
degradedRps: number;
|
|
32
|
+
totalRps: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function propagateFailure(scene: Scene, killed: string[], styles: Map<string, EdgeStyle>, couplingBound: boolean): FailureResult;
|
|
35
|
+
export declare function emptyFailure(scene: Scene): FailureResult;
|
|
36
|
+
//# sourceMappingURL=failure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC;AACpD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAChC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,iGAAiG;IACjG,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC9B,aAAa,EAAE,OAAO,GACrB,aAAa,CAmEf;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,CAUxD"}
|
package/dist/failure.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export function propagateFailure(scene, killed, styles, couplingBound) {
|
|
2
|
+
const health = new Map();
|
|
3
|
+
const hop = new Map();
|
|
4
|
+
for (const n of scene.nodes)
|
|
5
|
+
health.set(n.id, 'ok');
|
|
6
|
+
const alive = new Set(scene.nodes.map((n) => n.id));
|
|
7
|
+
for (const id of killed) {
|
|
8
|
+
if (!alive.has(id))
|
|
9
|
+
continue;
|
|
10
|
+
health.set(id, 'dead');
|
|
11
|
+
hop.set(id, 0);
|
|
12
|
+
}
|
|
13
|
+
const couplingOf = (edgeId) => {
|
|
14
|
+
if (!couplingBound)
|
|
15
|
+
return 'breakaway';
|
|
16
|
+
const c = styles.get(edgeId)?.coupling ?? 'plain';
|
|
17
|
+
return c === 'plain' ? 'breakaway' : c;
|
|
18
|
+
};
|
|
19
|
+
// Fixpoint, so cycles terminate. Bounded by node count.
|
|
20
|
+
for (let pass = 0; pass < scene.nodes.length + 1; pass++) {
|
|
21
|
+
let changed = false;
|
|
22
|
+
for (const edge of scene.edges) {
|
|
23
|
+
if (edge.from === edge.to)
|
|
24
|
+
continue;
|
|
25
|
+
const callee = health.get(edge.to) ?? 'ok';
|
|
26
|
+
const caller = health.get(edge.from) ?? 'ok';
|
|
27
|
+
if (caller === 'dead')
|
|
28
|
+
continue;
|
|
29
|
+
const coupling = couplingOf(edge.id);
|
|
30
|
+
if (coupling === 'rigid' && callee === 'dead') {
|
|
31
|
+
health.set(edge.from, 'dead');
|
|
32
|
+
hop.set(edge.from, Math.min(hop.get(edge.from) ?? Infinity, (hop.get(edge.to) ?? 0) + 1));
|
|
33
|
+
changed = true;
|
|
34
|
+
}
|
|
35
|
+
else if (caller === 'ok' &&
|
|
36
|
+
((coupling === 'breakaway' && callee !== 'ok') || (coupling === 'rigid' && callee === 'degraded'))) {
|
|
37
|
+
health.set(edge.from, 'degraded');
|
|
38
|
+
hop.set(edge.from, Math.min(hop.get(edge.from) ?? Infinity, (hop.get(edge.to) ?? 0) + 1));
|
|
39
|
+
changed = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (!changed)
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
const edgeHealth = new Map();
|
|
46
|
+
const firebreaks = [];
|
|
47
|
+
let deadRps = 0;
|
|
48
|
+
let degradedRps = 0;
|
|
49
|
+
let totalRps = 0;
|
|
50
|
+
for (const edge of scene.edges) {
|
|
51
|
+
totalRps += edge.metrics.rps;
|
|
52
|
+
const to = health.get(edge.to) ?? 'ok';
|
|
53
|
+
const from = health.get(edge.from) ?? 'ok';
|
|
54
|
+
if (to === 'dead' || from === 'dead') {
|
|
55
|
+
edgeHealth.set(edge.id, 'severed');
|
|
56
|
+
deadRps += edge.metrics.rps;
|
|
57
|
+
if (to === 'dead' && from !== 'dead' && couplingOf(edge.id) === 'breakaway')
|
|
58
|
+
firebreaks.push(edge.id);
|
|
59
|
+
}
|
|
60
|
+
else if (to === 'degraded' || from === 'degraded') {
|
|
61
|
+
edgeHealth.set(edge.id, 'strained');
|
|
62
|
+
degradedRps += edge.metrics.rps;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
edgeHealth.set(edge.id, 'flowing');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { health, edgeHealth, hop, firebreaks, deadRps, degradedRps, totalRps };
|
|
69
|
+
}
|
|
70
|
+
export function emptyFailure(scene) {
|
|
71
|
+
const health = new Map();
|
|
72
|
+
for (const n of scene.nodes)
|
|
73
|
+
health.set(n.id, 'ok');
|
|
74
|
+
const edgeHealth = new Map();
|
|
75
|
+
let totalRps = 0;
|
|
76
|
+
for (const e of scene.edges) {
|
|
77
|
+
edgeHealth.set(e.id, 'flowing');
|
|
78
|
+
totalRps += e.metrics.rps;
|
|
79
|
+
}
|
|
80
|
+
return { health, edgeHealth, hop: new Map(), firebreaks: [], deadRps: 0, degradedRps: 0, totalRps };
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure.js","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { LayoutNode, Point } from './layout.js';
|
|
2
|
+
/** A quadratic bezier from `a` to `b`, with sampled arc-length. */
|
|
3
|
+
export interface EdgePath {
|
|
4
|
+
a: Point;
|
|
5
|
+
b: Point;
|
|
6
|
+
ctrl: Point;
|
|
7
|
+
length: number;
|
|
8
|
+
pointAt(t: number): Point;
|
|
9
|
+
tangentAt(t: number): Point;
|
|
10
|
+
}
|
|
11
|
+
/** Where a line from `from` towards `to` leaves `from`'s rounded box. */
|
|
12
|
+
export declare function borderPoint(box: LayoutNode, towards: Point, inset?: number): Point;
|
|
13
|
+
/**
|
|
14
|
+
* Build the path for one edge.
|
|
15
|
+
*
|
|
16
|
+
* `offset` bows the curve sideways. Bidirectional pairs get equal and opposite
|
|
17
|
+
* offsets so the forward and reverse streams are visibly separate lanes -
|
|
18
|
+
* without that, a 401 challenge leg hides underneath the request it answers,
|
|
19
|
+
* and the whole point of the picture is lost.
|
|
20
|
+
*/
|
|
21
|
+
export declare function edgePath(from: LayoutNode, to: LayoutNode, offset?: number): EdgePath;
|
|
22
|
+
/** Shortest distance from a point to the sampled curve, for hit-testing. */
|
|
23
|
+
export declare function distanceToPath(path: EdgePath, p: Point, samples?: number): number;
|
|
24
|
+
//# sourceMappingURL=geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAErD,mEAAmE;AACnE,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,KAAK,CAAC;IACT,CAAC,EAAE,KAAK,CAAC;IACT,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC1B,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC7B;AAUD,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,SAAI,GAAG,KAAK,CAQ7E;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,SAAI,GAAG,QAAQ,CAc/E;AAkCD,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,SAAK,GAAG,MAAM,CAS7E"}
|
package/dist/geometry.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
function quad(a, c, b, t) {
|
|
2
|
+
const mt = 1 - t;
|
|
3
|
+
return {
|
|
4
|
+
x: mt * mt * a.x + 2 * mt * t * c.x + t * t * b.x,
|
|
5
|
+
y: mt * mt * a.y + 2 * mt * t * c.y + t * t * b.y,
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
/** Where a line from `from` towards `to` leaves `from`'s rounded box. */
|
|
9
|
+
export function borderPoint(box, towards, inset = 4) {
|
|
10
|
+
const dx = towards.x - box.x;
|
|
11
|
+
const dy = towards.y - box.y;
|
|
12
|
+
if (dx === 0 && dy === 0)
|
|
13
|
+
return { x: box.x, y: box.y };
|
|
14
|
+
const hw = box.width / 2 + inset;
|
|
15
|
+
const hh = box.height / 2 + inset;
|
|
16
|
+
const scale = Math.min(hw / Math.abs(dx || 1e-6), hh / Math.abs(dy || 1e-6));
|
|
17
|
+
return { x: box.x + dx * scale, y: box.y + dy * scale };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build the path for one edge.
|
|
21
|
+
*
|
|
22
|
+
* `offset` bows the curve sideways. Bidirectional pairs get equal and opposite
|
|
23
|
+
* offsets so the forward and reverse streams are visibly separate lanes -
|
|
24
|
+
* without that, a 401 challenge leg hides underneath the request it answers,
|
|
25
|
+
* and the whole point of the picture is lost.
|
|
26
|
+
*/
|
|
27
|
+
export function edgePath(from, to, offset = 0) {
|
|
28
|
+
if (from.id === to.id)
|
|
29
|
+
return selfLoop(from);
|
|
30
|
+
const a = borderPoint(from, { x: to.x, y: to.y });
|
|
31
|
+
const b = borderPoint(to, { x: from.x, y: from.y });
|
|
32
|
+
const mx = (a.x + b.x) / 2;
|
|
33
|
+
const my = (a.y + b.y) / 2;
|
|
34
|
+
const dx = b.x - a.x;
|
|
35
|
+
const dy = b.y - a.y;
|
|
36
|
+
const len = Math.hypot(dx, dy) || 1;
|
|
37
|
+
// Perpendicular unit vector, scaled by the requested lane offset.
|
|
38
|
+
const ctrl = { x: mx + (-dy / len) * offset * 2, y: my + (dx / len) * offset * 2 };
|
|
39
|
+
return finish(a, b, ctrl);
|
|
40
|
+
}
|
|
41
|
+
function selfLoop(node) {
|
|
42
|
+
const a = { x: node.x + node.width / 2, y: node.y - node.height / 4 };
|
|
43
|
+
const b = { x: node.x + node.width / 2, y: node.y + node.height / 4 };
|
|
44
|
+
const ctrl = { x: node.x + node.width / 2 + 54, y: node.y };
|
|
45
|
+
return finish(a, b, ctrl);
|
|
46
|
+
}
|
|
47
|
+
function finish(a, b, ctrl) {
|
|
48
|
+
const SAMPLES = 24;
|
|
49
|
+
let length = 0;
|
|
50
|
+
let prev = a;
|
|
51
|
+
for (let i = 1; i <= SAMPLES; i++) {
|
|
52
|
+
const p = quad(a, ctrl, b, i / SAMPLES);
|
|
53
|
+
length += Math.hypot(p.x - prev.x, p.y - prev.y);
|
|
54
|
+
prev = p;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
a,
|
|
58
|
+
b,
|
|
59
|
+
ctrl,
|
|
60
|
+
length: length || 1,
|
|
61
|
+
pointAt: (t) => quad(a, ctrl, b, t),
|
|
62
|
+
tangentAt: (t) => {
|
|
63
|
+
const mt = 1 - t;
|
|
64
|
+
const x = 2 * mt * (ctrl.x - a.x) + 2 * t * (b.x - ctrl.x);
|
|
65
|
+
const y = 2 * mt * (ctrl.y - a.y) + 2 * t * (b.y - ctrl.y);
|
|
66
|
+
const m = Math.hypot(x, y) || 1;
|
|
67
|
+
return { x: x / m, y: y / m };
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Shortest distance from a point to the sampled curve, for hit-testing. */
|
|
72
|
+
export function distanceToPath(path, p, samples = 20) {
|
|
73
|
+
let best = Infinity;
|
|
74
|
+
let prev = path.pointAt(0);
|
|
75
|
+
for (let i = 1; i <= samples; i++) {
|
|
76
|
+
const cur = path.pointAt(i / samples);
|
|
77
|
+
best = Math.min(best, distanceToSegment(p, prev, cur));
|
|
78
|
+
prev = cur;
|
|
79
|
+
}
|
|
80
|
+
return best;
|
|
81
|
+
}
|
|
82
|
+
function distanceToSegment(p, a, b) {
|
|
83
|
+
const dx = b.x - a.x;
|
|
84
|
+
const dy = b.y - a.y;
|
|
85
|
+
const l2 = dx * dx + dy * dy;
|
|
86
|
+
if (l2 === 0)
|
|
87
|
+
return Math.hypot(p.x - a.x, p.y - a.y);
|
|
88
|
+
let t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / l2;
|
|
89
|
+
t = t < 0 ? 0 : t > 1 ? 1 : t;
|
|
90
|
+
return Math.hypot(p.x - (a.x + t * dx), p.y - (a.y + t * dy));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tracelight - visualize service topologies as animated particle flows.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { TraceLight, authChallengeScenario } from 'tracelight';
|
|
7
|
+
*
|
|
8
|
+
* const tl = new TraceLight(document.querySelector('#map')!, { theme: 'auto' });
|
|
9
|
+
* tl.setGraph(authChallengeScenario(5000));
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
export { TraceLight } from './renderer.js';
|
|
13
|
+
export type { HoverTarget, TraceLightOptions, ViewInfo, Stats } from './renderer.js';
|
|
14
|
+
export { describeTable, endpointDims, fieldValue } from './model.js';
|
|
15
|
+
export type { FlowTable, FlowRecord, FlowMeasures, NodeFact, DimValues, DimensionMeta, TableSchema } from './model.js';
|
|
16
|
+
export { project, nodeIdFor, isMeasure } from './project.js';
|
|
17
|
+
export type { ViewSpec, WorldSpec, ChannelBinding, ProjectionResult } from './project.js';
|
|
18
|
+
export { sceneFromGraph } from './scene.js';
|
|
19
|
+
export type { Scene, SceneNode, SceneEdge } from './scene.js';
|
|
20
|
+
export { CHANNELS, styleScene, couplingFor, CATEGORICAL, ERROR_FLOOR, ERROR_CEIL } from './channels.js';
|
|
21
|
+
export type { ChannelName, ChannelDef, EdgeStyle, NodeStyle, Glyph, Coupling, LegendGroup, StyledScene } from './channels.js';
|
|
22
|
+
export { COMPONENTS, pickComponent, defaultTier, TIER_LABELS } from './components.js';
|
|
23
|
+
export type { WorldComponent, ComponentProps, ComponentBox } from './components.js';
|
|
24
|
+
export { layoutWorld, fitCamera, project3, worldExtent, defaultWorldLayout } from './layout3d.js';
|
|
25
|
+
export type { WorldNode, Camera, WorldLayoutOptions } from './layout3d.js';
|
|
26
|
+
export { propagateFailure, emptyFailure } from './failure.js';
|
|
27
|
+
export type { FailureResult, NodeHealth, EdgeHealth } from './failure.js';
|
|
28
|
+
export { proposeSpec, validateSpec, heuristicSpec, buildPrompt, extractJson } from './agent.js';
|
|
29
|
+
export type { Completion, ProposeOptions, ProposalResult } from './agent.js';
|
|
30
|
+
export { generateMesh } from './mesh.js';
|
|
31
|
+
export { generateEstate } from './estate.js';
|
|
32
|
+
export type { EstateOptions } from './estate.js';
|
|
33
|
+
export type { MeshOptions } from './mesh.js';
|
|
34
|
+
export { resolveGraph, safeResolveGraph, GraphValidationError } from './schema.js';
|
|
35
|
+
export { layoutGraph, defaultLayout } from './layout.js';
|
|
36
|
+
export type { LayoutNode, LayoutOptions, LayoutInput, Point } from './layout.js';
|
|
37
|
+
export { EdgeStream, mulberry32 } from './particles.js';
|
|
38
|
+
export type { Particle } from './particles.js';
|
|
39
|
+
export { edgePath, borderPoint, distanceToPath } from './geometry.js';
|
|
40
|
+
export type { EdgePath } from './geometry.js';
|
|
41
|
+
export { defaultEncoding, emissionRate, particleSpeed, particleRadius, edgeWidth, logNorm, rpsDomain, clamp, formatRps, formatLatency, formatBytes, } from './scales.js';
|
|
42
|
+
export type { EncodingOptions } from './scales.js';
|
|
43
|
+
export { themes, lightTheme, darkTheme, resolveTheme } from './theme.js';
|
|
44
|
+
export type { Theme } from './theme.js';
|
|
45
|
+
export { generateSeedGraph, authChallengeScenario, tokenAuthScenario } from './seed.js';
|
|
46
|
+
export type { SeedOptions } from './seed.js';
|
|
47
|
+
export { fromObject, fromUrl, fromEventSource, pollSource } from './adapters/index.js';
|
|
48
|
+
export type { GraphSource } from './adapters/index.js';
|
|
49
|
+
export type { Graph, GraphEdge, GraphNode, GraphMeta, EdgeMetrics, EdgeKind, NodeKind, ResolvedGraph, ResolvedEdge, ResolvedNode, } from './types.js';
|
|
50
|
+
export * from './atlas/index.js';
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|