@toa.io/extensions.introspection 1.0.0-alpha.305 → 1.0.0-alpha.306

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 (67) hide show
  1. package/components/introspection.edges/manifest.toa.yaml +4 -12
  2. package/components/introspection.edges/operations/merge.js +1 -4
  3. package/components/introspection.edges/source/merge.ts +0 -3
  4. package/components/introspection.edges/types/toa.d.ts +0 -12
  5. package/components/introspection.signals/manifest.toa.yaml +109 -0
  6. package/components/introspection.signals/operations/configuration.js +17 -0
  7. package/components/introspection.signals/source/configuration.ts +26 -0
  8. package/components/introspection.signals/tsconfig.json +10 -0
  9. package/components/introspection.signals/types/index.d.ts +3 -0
  10. package/components/introspection.signals/types/toa.d.ts +61 -0
  11. package/package.json +7 -7
  12. package/readme.md +7 -26
  13. package/transpiled/Factory.d.ts +11 -5
  14. package/transpiled/Factory.js +34 -37
  15. package/transpiled/Factory.js.map +1 -1
  16. package/transpiled/Halt.d.ts +72 -0
  17. package/transpiled/Halt.js +279 -0
  18. package/transpiled/Halt.js.map +1 -0
  19. package/transpiled/Reporter.d.ts +10 -0
  20. package/transpiled/Reporter.js +23 -7
  21. package/transpiled/Reporter.js.map +1 -1
  22. package/transpiled/index.d.ts +1 -1
  23. package/transpiled/model.d.ts +3 -10
  24. package/ui/dist/_app/immutable/assets/0.lZd8PDGB.css +2 -0
  25. package/ui/dist/_app/immutable/chunks/BYGx-tUu.js +6 -0
  26. package/ui/dist/_app/immutable/chunks/BmMhn2QK.js +1 -0
  27. package/ui/dist/_app/immutable/chunks/C7j91YQ-.js +6 -0
  28. package/ui/dist/_app/immutable/chunks/{Bkm7IFSz.js → CB6qHsyu.js} +1 -1
  29. package/ui/dist/_app/immutable/chunks/CBoY9kBO.js +2 -0
  30. package/ui/dist/_app/immutable/chunks/CMJYA4Le.js +1 -0
  31. package/ui/dist/_app/immutable/chunks/Cyx235dG.js +1 -0
  32. package/ui/dist/_app/immutable/chunks/DSlJ2Pi2.js +1 -0
  33. package/ui/dist/_app/immutable/chunks/K6eu_fpK.js +1 -0
  34. package/ui/dist/_app/immutable/chunks/X3sfW33Q.js +1 -0
  35. package/ui/dist/_app/immutable/chunks/sTot5bBi.js +3 -0
  36. package/ui/dist/_app/immutable/entry/app._nBtHSlX.js +2 -0
  37. package/ui/dist/_app/immutable/entry/start.BIK196Vd.js +1 -0
  38. package/ui/dist/_app/immutable/nodes/0.jrtR8xep.js +1 -0
  39. package/ui/dist/_app/immutable/nodes/1.DcxTn8Wv.js +1 -0
  40. package/ui/dist/_app/immutable/nodes/2.C0fg7g4t.js +8 -0
  41. package/ui/dist/_app/immutable/nodes/3.PPZqOKXF.js +1 -0
  42. package/ui/dist/_app/immutable/nodes/4.DtCrZa9O.js +1 -0
  43. package/ui/dist/_app/immutable/nodes/5.G5Augfai.js +1 -0
  44. package/ui/dist/_app/version.json +1 -1
  45. package/ui/dist/index.html +14 -14
  46. package/transpiled/sample.d.ts +0 -7
  47. package/transpiled/sample.js +0 -39
  48. package/transpiled/sample.js.map +0 -1
  49. package/ui/dist/_app/immutable/assets/0.DG1WW3yI.css +0 -2
  50. package/ui/dist/_app/immutable/chunks/0-u_iN6y.js +0 -1
  51. package/ui/dist/_app/immutable/chunks/1AWk4n87.js +0 -6
  52. package/ui/dist/_app/immutable/chunks/BIDHvTr8.js +0 -1
  53. package/ui/dist/_app/immutable/chunks/BQPEyVde.js +0 -1
  54. package/ui/dist/_app/immutable/chunks/CJXg8Ahs.js +0 -2
  55. package/ui/dist/_app/immutable/chunks/CXHbcmHx.js +0 -1
  56. package/ui/dist/_app/immutable/chunks/CcHVMucT.js +0 -6
  57. package/ui/dist/_app/immutable/chunks/DINmginf.js +0 -1
  58. package/ui/dist/_app/immutable/chunks/FNfabOeV.js +0 -1
  59. package/ui/dist/_app/immutable/chunks/PUjOYRcs.js +0 -3
  60. package/ui/dist/_app/immutable/entry/app.DnsDRBZU.js +0 -2
  61. package/ui/dist/_app/immutable/entry/start.CwPkfBe-.js +0 -1
  62. package/ui/dist/_app/immutable/nodes/0.BC5OkQW-.js +0 -1
  63. package/ui/dist/_app/immutable/nodes/1.CXab7BsT.js +0 -1
  64. package/ui/dist/_app/immutable/nodes/2.31hlSS9p.js +0 -8
  65. package/ui/dist/_app/immutable/nodes/3.zu-dF4dT.js +0 -1
  66. package/ui/dist/_app/immutable/nodes/4.QGYaIsvq.js +0 -1
  67. package/ui/dist/_app/immutable/nodes/5.BXAcSBZY.js +0 -1
@@ -0,0 +1,72 @@
1
+ import { Connector } from '@toa.io/core';
2
+ import type { Options } from '@toa.io/definitions/extensions.introspection';
3
+ import type { Host } from './Factory.ts';
4
+ /**
5
+ * Hears a halt, takes the process quiet, and reads the map to find out whether the deployment
6
+ * went quiet with it.
7
+ *
8
+ * A signal is a record of `introspection.signals`, so what carries it is the event that
9
+ * component publishes on a committed write. The subscription takes no group, which is a queue
10
+ * of its own per process — so a signal written once reaches every process there is.
11
+ *
12
+ * **Any process may call the stop, and the rest obey without consulting their own view.**
13
+ * Seeing stillness is an assertion, acted on alone and binding on everyone; seeing activity is
14
+ * only an opinion, held quietly and given up if anyone asserts otherwise. Nothing has to be
15
+ * agreed, which is the point: `UPDATED` is one field overwritten in place, so no two processes
16
+ * reading the map read the same past, and a scheme that needed them to would need an atomic
17
+ * read point this has nowhere to take from.
18
+ *
19
+ * This sits behind a gate of its own, and so goes down with everything else. Nothing is
20
+ * listening while a halt lasts, which is what makes a halted process hold nothing open, and
21
+ * why a halt cannot be called off once it is down: it ends when the interval it carried is up,
22
+ * and by nothing else.
23
+ */
24
+ export declare class Halt extends Connector {
25
+ private readonly host;
26
+ private readonly options;
27
+ private readonly remotes;
28
+ /** The halt this process is quiesced for, while it is. */
29
+ private pending;
30
+ private timer;
31
+ constructor(host: Host, options: Options);
32
+ protected open(): Promise<void>;
33
+ protected close(): Promise<void>;
34
+ private subscribe;
35
+ /**
36
+ * What arrives crosses the wire and outlives the release that wrote it, so every number is
37
+ * read as one and bounded here rather than trusted: the receiver is what has to come back.
38
+ */
39
+ private signalled;
40
+ private begin;
41
+ private quiesce;
42
+ /**
43
+ * The window is over. What the map says now is what this process has to go on, and what it
44
+ * says is one thing: whether anything, anywhere in this region, was called since the signal.
45
+ */
46
+ private decide;
47
+ /** No stop came. Nothing was closed, so nothing has to be built again. */
48
+ private give;
49
+ /** A stop is obeyed only while this process is quiesced for the halt it answers. */
50
+ private obey;
51
+ private down;
52
+ /**
53
+ * Whether nothing has been called in this region since the signal.
54
+ *
55
+ * The map is what the whole fleet writes, and a flush that observed nothing writes nothing —
56
+ * so a region with no edge newer than the signal is a region where nothing was called. It is
57
+ * read rather than voted on, and this process's own view of itself is not part of it: what a
58
+ * process is handling it has written no edge for yet, and a stop called while it was would
59
+ * still wait for it rather than interrupt it.
60
+ *
61
+ * Anything unanswered is activity. A process that cannot read the map does not stop the
62
+ * deployment on a guess.
63
+ */
64
+ private still;
65
+ /** Writes the stop. It reaches every process as the halt did, this one included. */
66
+ private call;
67
+ private later;
68
+ private disarm;
69
+ /** Runs in the background: discovery waits for the explorer as long as it takes. */
70
+ private acquire;
71
+ private reach;
72
+ }
@@ -0,0 +1,279 @@
1
+ import { Connector, Locator } from '@toa.io/core';
2
+ import { console } from 'openspan';
3
+ import { environment, timeout } from '@toa.io/generic';
4
+ import { CHECK_TIMEOUT, DEFAULT_GRACE, EDGES, GRACE, HALT_GAP, NAMESPACE, SIGNAL, SIGNALS } from '@toa.io/definitions/extensions.introspection';
5
+ /**
6
+ * Hears a halt, takes the process quiet, and reads the map to find out whether the deployment
7
+ * went quiet with it.
8
+ *
9
+ * A signal is a record of `introspection.signals`, so what carries it is the event that
10
+ * component publishes on a committed write. The subscription takes no group, which is a queue
11
+ * of its own per process — so a signal written once reaches every process there is.
12
+ *
13
+ * **Any process may call the stop, and the rest obey without consulting their own view.**
14
+ * Seeing stillness is an assertion, acted on alone and binding on everyone; seeing activity is
15
+ * only an opinion, held quietly and given up if anyone asserts otherwise. Nothing has to be
16
+ * agreed, which is the point: `UPDATED` is one field overwritten in place, so no two processes
17
+ * reading the map read the same past, and a scheme that needed them to would need an atomic
18
+ * read point this has nowhere to take from.
19
+ *
20
+ * This sits behind a gate of its own, and so goes down with everything else. Nothing is
21
+ * listening while a halt lasts, which is what makes a halted process hold nothing open, and
22
+ * why a halt cannot be called off once it is down: it ends when the interval it carried is up,
23
+ * and by nothing else.
24
+ */
25
+ export class Halt extends Connector {
26
+ host;
27
+ options;
28
+ remotes = {};
29
+ /** The halt this process is quiesced for, while it is. */
30
+ pending = null;
31
+ timer = null;
32
+ constructor(host, options) {
33
+ super();
34
+ this.host = host;
35
+ this.options = options;
36
+ }
37
+ async open() {
38
+ /*
39
+ * Deliberately not awaited. Reaching the component is a discovery, which waits as long as
40
+ * it takes, and in the explorer process the component being looked up is one this same
41
+ * process is still starting. A halt is not worth holding a boot for.
42
+ */
43
+ void this.subscribe().catch((error) => {
44
+ console.error('Introspection cannot subscribe to signals', {
45
+ message: error.message
46
+ });
47
+ });
48
+ }
49
+ async close() {
50
+ this.disarm();
51
+ this.pending = null;
52
+ }
53
+ async subscribe() {
54
+ const consumer = await this.host.receive(SIGNAL, new Subscription(this.signalled.bind(this)));
55
+ this.depends(consumer);
56
+ await consumer.connect();
57
+ }
58
+ /**
59
+ * What arrives crosses the wire and outlives the release that wrote it, so every number is
60
+ * read as one and bounded here rather than trusted: the receiver is what has to come back.
61
+ */
62
+ signalled(signal) {
63
+ if (signal?.type === 'halt')
64
+ this.begin(signal);
65
+ if (signal?.type === 'stop')
66
+ this.obey(signal);
67
+ }
68
+ begin(signal) {
69
+ // one at a time: a process quiesced for a halt is deaf to another, and to a redelivery
70
+ if (this.pending !== null || typeof signal.id !== 'string')
71
+ return;
72
+ const seconds = bound(signal.seconds, this.options.duration);
73
+ const quiescence = bound(signal.quiescence, this.options.quiescence);
74
+ const grace = bound(signal.grace, GRACE, DEFAULT_GRACE);
75
+ if (seconds === null || quiescence === null || grace === null)
76
+ return;
77
+ /*
78
+ * The map is read against the moment the signal was written, not the moment this process
79
+ * received it: `CREATED` and an edge's `UPDATED` are both written by the components of
80
+ * this extension, so they are one clock, and what this process's clock says about either
81
+ * is beside the point.
82
+ */
83
+ const since = typeof signal.CREATED === 'number' ? signal.CREATED : Date.now();
84
+ this.pending = { id: signal.id, seconds, quiescence, grace, since };
85
+ console.warn('Halt signalled, going quiet', { seconds, quiescence });
86
+ // the caller is a consumer callback, and this goes on to wait out a window under it
87
+ void this.quiesce(quiescence);
88
+ }
89
+ async quiesce(quiescence) {
90
+ // in the background, so that the map is reachable by the time there is a decision to make
91
+ this.acquire();
92
+ try {
93
+ await this.host.quiesce();
94
+ }
95
+ finally {
96
+ // whatever the quiesce did, there is a decision owed: one never taken is a process
97
+ // that is quiet for good
98
+ this.later(quiescence + HALT_GAP, () => void this.decide());
99
+ }
100
+ }
101
+ /**
102
+ * The window is over. What the map says now is what this process has to go on, and what it
103
+ * says is one thing: whether anything, anywhere in this region, was called since the signal.
104
+ */
105
+ async decide() {
106
+ const pending = this.pending;
107
+ if (pending === null)
108
+ return;
109
+ const still = await this.still(pending.since);
110
+ // someone else's stop may have landed while the map was being read
111
+ if (this.pending !== pending)
112
+ return;
113
+ if (still) {
114
+ console.warn('The deployment is still, calling the stop');
115
+ // written first, because what stops every other process is the record and not this one
116
+ if (await this.call(pending)) {
117
+ this.down(pending.seconds);
118
+ return;
119
+ }
120
+ }
121
+ /*
122
+ * Someone is always last to catch on. This process has concluded, and what it does now is
123
+ * wait for someone else's conclusion — listening, not looking again. It leaves the halt
124
+ * only if no stop arrives, and the guard covers the other order: one that has left ignores
125
+ * a stop that lands after.
126
+ */
127
+ console.warn('The deployment is working, waiting for another opinion', {
128
+ grace: pending.grace
129
+ });
130
+ this.later(pending.grace, () => void this.give());
131
+ }
132
+ /** No stop came. Nothing was closed, so nothing has to be built again. */
133
+ async give() {
134
+ if (this.pending === null)
135
+ return;
136
+ this.pending = null;
137
+ console.warn('Halt cancelled, this process is working');
138
+ await this.host.cancel();
139
+ }
140
+ /** A stop is obeyed only while this process is quiesced for the halt it answers. */
141
+ obey(signal) {
142
+ const pending = this.pending;
143
+ if (pending === null || signal.signal !== pending.id)
144
+ return;
145
+ this.down(pending.seconds);
146
+ }
147
+ down(seconds) {
148
+ this.disarm();
149
+ this.pending = null;
150
+ this.host.stop(seconds);
151
+ }
152
+ /**
153
+ * Whether nothing has been called in this region since the signal.
154
+ *
155
+ * The map is what the whole fleet writes, and a flush that observed nothing writes nothing —
156
+ * so a region with no edge newer than the signal is a region where nothing was called. It is
157
+ * read rather than voted on, and this process's own view of itself is not part of it: what a
158
+ * process is handling it has written no edge for yet, and a stop called while it was would
159
+ * still wait for it rather than interrupt it.
160
+ *
161
+ * Anything unanswered is activity. A process that cannot read the map does not stop the
162
+ * deployment on a guess.
163
+ */
164
+ async still(since) {
165
+ const edges = this.remotes[EDGES];
166
+ if (edges === undefined)
167
+ return false;
168
+ const criteria = `UPDATED>${since};REGION==${REGION}`;
169
+ try {
170
+ const reply = await race(edges.invoke('enumerate', { query: { criteria, limit: 1 } }));
171
+ const rows = Array.isArray(reply) ? reply : reply?.output;
172
+ if (!Array.isArray(rows)) {
173
+ console.warn('The map answered something else', { reply });
174
+ return false;
175
+ }
176
+ return rows.length === 0;
177
+ }
178
+ catch (error) {
179
+ console.error('The map could not be read', { message: error.message });
180
+ return false;
181
+ }
182
+ }
183
+ /** Writes the stop. It reaches every process as the halt did, this one included. */
184
+ async call(pending) {
185
+ const signals = this.remotes[SIGNALS];
186
+ if (signals === undefined)
187
+ return false;
188
+ try {
189
+ const reply = await race(signals.invoke('create', {
190
+ input: {
191
+ type: 'stop',
192
+ seconds: pending.seconds,
193
+ // what the halt asked for, because a record says what it was answering
194
+ quiescence: pending.quiescence,
195
+ signal: pending.id
196
+ }
197
+ }));
198
+ if (reply?.error !== undefined || reply?.exception !== undefined) {
199
+ console.error('The stop was refused', { reply });
200
+ return false;
201
+ }
202
+ return true;
203
+ }
204
+ catch (error) {
205
+ console.error('The stop could not be written', {
206
+ message: error.message
207
+ });
208
+ return false;
209
+ }
210
+ }
211
+ later(seconds, fn) {
212
+ this.disarm();
213
+ this.timer = setTimeout(fn, seconds * 1000);
214
+ this.timer.unref();
215
+ }
216
+ disarm() {
217
+ if (this.timer === null)
218
+ return;
219
+ clearTimeout(this.timer);
220
+ this.timer = null;
221
+ }
222
+ /** Runs in the background: discovery waits for the explorer as long as it takes. */
223
+ acquire() {
224
+ for (const name of [EDGES, SIGNALS]) {
225
+ if (name in this.remotes)
226
+ continue;
227
+ void this.reach(name).catch((error) => {
228
+ console.error('Introspection cannot reach its explorer', {
229
+ message: error.message
230
+ });
231
+ });
232
+ }
233
+ }
234
+ async reach(name) {
235
+ const remote = await this.host.remote(new Locator(name, NAMESPACE));
236
+ this.depends(remote);
237
+ await remote.connect();
238
+ this.remotes[name] = remote;
239
+ }
240
+ }
241
+ /** What a binding hands a message to; the connector's lifecycle is not the handler's. */
242
+ class Subscription extends Connector {
243
+ handler;
244
+ constructor(handler) {
245
+ super();
246
+ this.handler = handler;
247
+ }
248
+ async receive(message) {
249
+ this.handler(message.payload);
250
+ }
251
+ }
252
+ /** A number as it came, within what this release accepts, or `null` where it is not one. */
253
+ function bound(value, [min, max], fallback) {
254
+ if (value === undefined && fallback !== undefined)
255
+ return fallback;
256
+ if (typeof value !== 'number' || !Number.isFinite(value))
257
+ return null;
258
+ return Math.min(max, Math.max(min, Math.round(value)));
259
+ }
260
+ /**
261
+ * A quiesced process that waits for an answer that never comes is a process that never comes
262
+ * back, so every call a decision rests on is given a deadline.
263
+ *
264
+ * What runs out of it is a failure and not an answer: a stop whose write went unacknowledged
265
+ * may never have been written, and a process that took it for one would go down alone.
266
+ */
267
+ async function race(call) {
268
+ const reply = await Promise.race([
269
+ call,
270
+ timeout(CHECK_TIMEOUT).then(() => UNANSWERED)
271
+ ]);
272
+ if (reply === UNANSWERED)
273
+ throw new Error(`it was not answered within ${CHECK_TIMEOUT}ms`);
274
+ return reply;
275
+ }
276
+ const UNANSWERED = Symbol('unanswered');
277
+ /** The region this deployment is, which is the only one its map answers for. */
278
+ const REGION = Number(environment.get('TOA_REGION') ?? 0);
279
+ //# sourceMappingURL=Halt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Halt.js","sourceRoot":"","sources":["../source/Halt.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,17 @@ export declare class Reporter extends Connector {
28
28
  /** A call between two components. */
29
29
  observe(observed: Edge): void;
30
30
  protected open(): Promise<void>;
31
+ /**
32
+ * A quiesced process flushes every second instead of on its configured period, because what
33
+ * it observed last is the evidence a halt is decided on and the decision is seconds away.
34
+ *
35
+ * It costs nothing: nothing is calling anything, so every flush but the first finds an empty
36
+ * buffer and returns without a call.
37
+ */
38
+ protected pause(): void;
39
+ protected unpause(): void;
31
40
  protected close(): Promise<void>;
41
+ private every;
32
42
  private ready;
33
43
  private flush;
34
44
  private discard;
@@ -1,6 +1,6 @@
1
1
  import { Connector, Locator } from '@toa.io/core';
2
2
  import { console } from 'openspan';
3
- import { EDGES, MAX_EDGES, NAMESPACE, NODES } from '@toa.io/definitions/extensions.introspection';
3
+ import { EDGES, MAX_EDGES, NAMESPACE, NODES, QUIESCE_INTERVAL } from '@toa.io/definitions/extensions.introspection';
4
4
  import * as keys from './keys.js';
5
5
  /**
6
6
  * Buffers what a process observes and flushes it into the introspection
@@ -35,8 +35,7 @@ export class Reporter extends Connector {
35
35
  /** A call between two components. */
36
36
  observe(observed) {
37
37
  const id = keys.edge(observed.src, observed.dst);
38
- const edge = this.edges.get(id);
39
- if (edge === undefined) {
38
+ if (!this.edges.has(id)) {
40
39
  /*
41
40
  * `source` arrives over the wire, so the number of distinct edges a process
42
41
  * can hold has to be bounded regardless of what peers send — and of whether
@@ -48,16 +47,27 @@ export class Reporter extends Connector {
48
47
  }
49
48
  this.edges.set(id, observed);
50
49
  }
51
- else if (observed.sample !== undefined)
52
- edge.sample = observed.sample;
53
50
  if (this.edges.size >= this.options.threshold)
54
51
  void this.flush();
55
52
  }
56
53
  async open() {
57
54
  // deliberately not awaited: the explorer may not be there yet, or at all
58
55
  this.acquire();
59
- this.timer = setInterval(() => void this.flush(), this.options.interval * 1000);
60
- this.timer.unref();
56
+ this.every(this.options.interval);
57
+ }
58
+ /**
59
+ * A quiesced process flushes every second instead of on its configured period, because what
60
+ * it observed last is the evidence a halt is decided on and the decision is seconds away.
61
+ *
62
+ * It costs nothing: nothing is calling anything, so every flush but the first finds an empty
63
+ * buffer and returns without a call.
64
+ */
65
+ pause() {
66
+ this.every(QUIESCE_INTERVAL);
67
+ void this.flush();
68
+ }
69
+ unpause() {
70
+ this.every(this.options.interval);
61
71
  }
62
72
  async close() {
63
73
  if (this.timer !== null) {
@@ -74,6 +84,12 @@ export class Reporter extends Connector {
74
84
  console.debug('Introspection final flush failed', { message: error.message });
75
85
  });
76
86
  }
87
+ every(seconds) {
88
+ if (this.timer !== null)
89
+ clearInterval(this.timer);
90
+ this.timer = setInterval(() => void this.flush(), seconds * 1000);
91
+ this.timer.unref();
92
+ }
77
93
  ready() {
78
94
  return NODES in this.remotes && EDGES in this.remotes;
79
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Reporter.js","sourceRoot":"","sources":["../source/Reporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Reporter.js","sourceRoot":"","sources":["../source/Reporter.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  export { Factory } from './Factory.ts';
2
2
  export { components } from './Composition.ts';
3
- export type { Annotation, Declaration, Options, Settings } from '@toa.io/definitions/extensions.introspection';
3
+ export type { Annotation, Declaration, Options } from '@toa.io/definitions/extensions.introspection';
4
4
  export type * from './model.ts';
@@ -52,21 +52,14 @@ export interface Node {
52
52
  receivers: Receiver[];
53
53
  extensions: string[];
54
54
  }
55
- export interface Sample {
56
- at: number;
57
- input?: unknown;
58
- outcome: Outcome;
59
- }
60
- export type Outcome = 'ok' | 'error' | 'exception';
61
55
  /**
62
- * A call observed in a process between flushes. What the application declares —
63
- * which events exist, and which receiver takes which — is a node's business;
64
- * an edge is what actually happened.
56
+ * A call observed in a process between flushes: that it was made, and between whom —
57
+ * never what it carried. What the application declares — which events exist, and which
58
+ * receiver takes which — is a node's business; an edge is what actually happened.
65
59
  *
66
60
  * Sent to `introspection.edges`.
67
61
  */
68
62
  export interface Edge {
69
63
  src: Origin;
70
64
  dst: Target;
71
- sample?: Sample;
72
65
  }