@victframework/runtime 0.1.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/dist/agent-governance.d.ts +285 -0
- package/dist/agent-governance.js +438 -0
- package/dist/agent-governance.js.map +1 -0
- package/dist/agent-registry.d.ts +103 -0
- package/dist/agent-registry.js +758 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/agent-types.d.ts +433 -0
- package/dist/agent-types.js +480 -0
- package/dist/agent-types.js.map +1 -0
- package/dist/authority.d.ts +83 -0
- package/dist/authority.js +170 -0
- package/dist/authority.js.map +1 -0
- package/dist/boundary-conformance.d.ts +51 -0
- package/dist/boundary-conformance.js +364 -0
- package/dist/boundary-conformance.js.map +1 -0
- package/dist/control-conformance.d.ts +68 -0
- package/dist/control-conformance.js +1131 -0
- package/dist/control-conformance.js.map +1 -0
- package/dist/control-in-memory.d.ts +257 -0
- package/dist/control-in-memory.js +886 -0
- package/dist/control-in-memory.js.map +1 -0
- package/dist/control-types.d.ts +1017 -0
- package/dist/control-types.js +779 -0
- package/dist/control-types.js.map +1 -0
- package/dist/durable-run.d.ts +73 -0
- package/dist/durable-run.js +262 -0
- package/dist/durable-run.js.map +1 -0
- package/dist/effect-policy.d.ts +22 -0
- package/dist/effect-policy.js +45 -0
- package/dist/effect-policy.js.map +1 -0
- package/dist/errors.d.ts +36 -0
- package/dist/errors.js +71 -0
- package/dist/errors.js.map +1 -0
- package/dist/in-memory-stores.d.ts +16 -0
- package/dist/in-memory-stores.js +522 -0
- package/dist/in-memory-stores.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/operator-config.d.ts +141 -0
- package/dist/operator-config.js +289 -0
- package/dist/operator-config.js.map +1 -0
- package/dist/orchestration-activation.d.ts +116 -0
- package/dist/orchestration-activation.js +223 -0
- package/dist/orchestration-activation.js.map +1 -0
- package/dist/orchestration-canary-conformance.d.ts +10 -0
- package/dist/orchestration-canary-conformance.js +726 -0
- package/dist/orchestration-canary-conformance.js.map +1 -0
- package/dist/orchestration-commands.d.ts +47 -0
- package/dist/orchestration-commands.js +538 -0
- package/dist/orchestration-commands.js.map +1 -0
- package/dist/orchestration-conformance.d.ts +59 -0
- package/dist/orchestration-conformance.js +594 -0
- package/dist/orchestration-conformance.js.map +1 -0
- package/dist/orchestration-driver-types.d.ts +163 -0
- package/dist/orchestration-driver-types.js +21 -0
- package/dist/orchestration-driver-types.js.map +1 -0
- package/dist/orchestration-driver.d.ts +48 -0
- package/dist/orchestration-driver.js +1030 -0
- package/dist/orchestration-driver.js.map +1 -0
- package/dist/orchestration-in-memory.d.ts +18 -0
- package/dist/orchestration-in-memory.js +1313 -0
- package/dist/orchestration-in-memory.js.map +1 -0
- package/dist/orchestration-join-conformance.d.ts +20 -0
- package/dist/orchestration-join-conformance.js +542 -0
- package/dist/orchestration-join-conformance.js.map +1 -0
- package/dist/orchestration-plan.d.ts +52 -0
- package/dist/orchestration-plan.js +265 -0
- package/dist/orchestration-plan.js.map +1 -0
- package/dist/orchestration-race-conformance.d.ts +35 -0
- package/dist/orchestration-race-conformance.js +1265 -0
- package/dist/orchestration-race-conformance.js.map +1 -0
- package/dist/orchestration-remediation-conformance.d.ts +54 -0
- package/dist/orchestration-remediation-conformance.js +632 -0
- package/dist/orchestration-remediation-conformance.js.map +1 -0
- package/dist/orchestration-store-types.d.ts +568 -0
- package/dist/orchestration-store-types.js +2 -0
- package/dist/orchestration-store-types.js.map +1 -0
- package/dist/pack-conformance.d.ts +59 -0
- package/dist/pack-conformance.js +222 -0
- package/dist/pack-conformance.js.map +1 -0
- package/dist/pack-install.d.ts +44 -0
- package/dist/pack-install.js +126 -0
- package/dist/pack-install.js.map +1 -0
- package/dist/registry.d.ts +107 -0
- package/dist/registry.js +481 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime.d.ts +158 -0
- package/dist/runtime.js +1341 -0
- package/dist/runtime.js.map +1 -0
- package/dist/serialization.d.ts +26 -0
- package/dist/serialization.js +162 -0
- package/dist/serialization.js.map +1 -0
- package/dist/store-conformance.d.ts +45 -0
- package/dist/store-conformance.js +876 -0
- package/dist/store-conformance.js.map +1 -0
- package/dist/store-errors.d.ts +49 -0
- package/dist/store-errors.js +48 -0
- package/dist/store-errors.js.map +1 -0
- package/dist/store-types.d.ts +331 -0
- package/dist/store-types.js +14 -0
- package/dist/store-types.js.map +1 -0
- package/dist/store-validation.d.ts +63 -0
- package/dist/store-validation.js +164 -0
- package/dist/store-validation.js.map +1 -0
- package/dist/stream-hub.d.ts +151 -0
- package/dist/stream-hub.js +402 -0
- package/dist/stream-hub.js.map +1 -0
- package/dist/testing.d.ts +25 -0
- package/dist/testing.js +19 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +221 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { backoffDelayMs, isRetryable, resolveDecisionRoute, } from '@victframework/kernel';
|
|
2
|
+
import { canonicalBranchLineage, forkChildTokenId, forkLineageOf, joinTokenId, waitIdFor, } from './orchestration-activation.js';
|
|
3
|
+
export function invalidOutcome(message) {
|
|
4
|
+
return {
|
|
5
|
+
code: 'VICT_ORCH_INVALID_TRANSITION',
|
|
6
|
+
message,
|
|
7
|
+
retryable: false,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function blockedOutcome(code, reason) {
|
|
11
|
+
return { continuation: { kind: 'block', code, reason }, runStatus: 'blocked' };
|
|
12
|
+
}
|
|
13
|
+
function safeCode(error) {
|
|
14
|
+
return error?.code ?? 'VICT_ORCH_CAPABILITY_FAILED';
|
|
15
|
+
}
|
|
16
|
+
export function planContinuation(input) {
|
|
17
|
+
const { graph, claim, outcome } = input;
|
|
18
|
+
const node = graph.getNode(claim.token.nodeId);
|
|
19
|
+
if (!node) {
|
|
20
|
+
return {
|
|
21
|
+
kind: 'invalid',
|
|
22
|
+
error: invalidOutcome(`Compiled graph '${graph.id}' has no node '${claim.token.nodeId}'.`),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (outcome.kind === 'cancelled') {
|
|
26
|
+
return { kind: 'transition', continuation: { kind: 'none' }, runStatus: 'running' };
|
|
27
|
+
}
|
|
28
|
+
if (outcome.kind === 'outcome_unknown') {
|
|
29
|
+
return {
|
|
30
|
+
kind: 'transition',
|
|
31
|
+
continuation: {
|
|
32
|
+
kind: 'block',
|
|
33
|
+
code: 'VICT_ORCH_OUTCOME_UNKNOWN',
|
|
34
|
+
reason: 'The attempt outcome is unknown; explicit operator resolution is required.',
|
|
35
|
+
},
|
|
36
|
+
runStatus: 'blocked',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
if (outcome.kind === 'failed') {
|
|
40
|
+
return planFailure(input, safeCode(outcome.error));
|
|
41
|
+
}
|
|
42
|
+
if (outcome.kind === 'timed_out') {
|
|
43
|
+
return planTimeout(input);
|
|
44
|
+
}
|
|
45
|
+
return planSuccess(input);
|
|
46
|
+
}
|
|
47
|
+
/** Failure routing: bounded retry → error edge → branch failure → run failed. */
|
|
48
|
+
function planFailure(input, code) {
|
|
49
|
+
const { graph, claim } = input;
|
|
50
|
+
const node = graph.getNode(claim.token.nodeId);
|
|
51
|
+
if (node.retry !== undefined &&
|
|
52
|
+
claim.attempt.attemptNumber < node.retry.maxAttempts &&
|
|
53
|
+
isRetryable(node.retry, code)) {
|
|
54
|
+
return {
|
|
55
|
+
kind: 'transition',
|
|
56
|
+
continuation: {
|
|
57
|
+
kind: 'retry',
|
|
58
|
+
dueAt: input.now + backoffDelayMs(node.retry, claim.attempt.attemptNumber),
|
|
59
|
+
retryOnCode: code,
|
|
60
|
+
maxAttempts: node.retry.maxAttempts,
|
|
61
|
+
},
|
|
62
|
+
runStatus: 'running',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const errorTarget = graph.errorTargetOf(node.id);
|
|
66
|
+
if (errorTarget !== undefined) {
|
|
67
|
+
return {
|
|
68
|
+
kind: 'transition',
|
|
69
|
+
continuation: { kind: 'advance', toNodeId: errorTarget, payload: input.error },
|
|
70
|
+
runStatus: 'running',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (claim.token.forkId !== null) {
|
|
74
|
+
return { kind: 'transition', continuation: { kind: 'branchFailure' }, runStatus: 'failed' };
|
|
75
|
+
}
|
|
76
|
+
return { kind: 'transition', continuation: { kind: 'none' }, runStatus: 'failed' };
|
|
77
|
+
}
|
|
78
|
+
/** Timeout routing under effect-specific ambiguity rules (handoff §13). */
|
|
79
|
+
function planTimeout(input) {
|
|
80
|
+
const { graph, claim } = input;
|
|
81
|
+
const node = graph.getNode(claim.token.nodeId);
|
|
82
|
+
const effect = input.descriptor?.effect ?? 'pure';
|
|
83
|
+
const keyed = input.descriptor?.idempotency === 'keyed';
|
|
84
|
+
const retry = node.retry;
|
|
85
|
+
if (retry !== undefined &&
|
|
86
|
+
claim.attempt.attemptNumber < retry.maxAttempts &&
|
|
87
|
+
isRetryable(retry, 'timeout')) {
|
|
88
|
+
if (effect === 'irreversible') {
|
|
89
|
+
const blocked = blockedOutcome('VICT_ORCH_AMBIGUOUS_TIMEOUT', 'A timed-out irreversible attempt is never replayed; operator resolution is required.');
|
|
90
|
+
return { kind: 'transition', ...blocked };
|
|
91
|
+
}
|
|
92
|
+
if (effect === 'write' && !keyed) {
|
|
93
|
+
const blocked = blockedOutcome('VICT_ORCH_OUTCOME_UNKNOWN', 'A timed-out write without keyed idempotency has an ambiguous outcome.');
|
|
94
|
+
return { kind: 'transition', ...blocked };
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
kind: 'transition',
|
|
98
|
+
continuation: {
|
|
99
|
+
kind: 'retry',
|
|
100
|
+
dueAt: input.now + backoffDelayMs(retry, claim.attempt.attemptNumber),
|
|
101
|
+
retryOnCode: 'timeout',
|
|
102
|
+
maxAttempts: retry.maxAttempts,
|
|
103
|
+
},
|
|
104
|
+
runStatus: 'running',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
if (effect === 'write' || effect === 'irreversible') {
|
|
108
|
+
const blocked = blockedOutcome('VICT_ORCH_OUTCOME_UNKNOWN', 'A timed-out unsafe effect has an ambiguous outcome; it is never replayed automatically.');
|
|
109
|
+
return { kind: 'transition', ...blocked };
|
|
110
|
+
}
|
|
111
|
+
return planFailure(input, 'timeout');
|
|
112
|
+
}
|
|
113
|
+
/** Success routing: decision routes, waits, forks, terminal, and branch arrival. */
|
|
114
|
+
function planSuccess(input) {
|
|
115
|
+
const { graph, claim } = input;
|
|
116
|
+
const node = graph.getNode(claim.token.nodeId);
|
|
117
|
+
if (node.kind === 'decision') {
|
|
118
|
+
const result = input.validatedOutput;
|
|
119
|
+
if (!result || typeof result !== 'object' || typeof result.route !== 'string') {
|
|
120
|
+
return {
|
|
121
|
+
kind: 'invalid',
|
|
122
|
+
error: invalidOutcome(`Decision node '${node.id}' must return a validated DecisionResult.`),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const resolved = resolveDecisionRoute(graph.routeTargetsOf(node.id), result);
|
|
126
|
+
if (!resolved.ok) {
|
|
127
|
+
return {
|
|
128
|
+
kind: 'invalid',
|
|
129
|
+
error: invalidOutcome(resolved.code === 'EMPTY_ROUTE'
|
|
130
|
+
? `Decision node '${node.id}' returned an empty route; no target was invoked.`
|
|
131
|
+
: `Decision node '${node.id}' returned undeclared route '${resolved.route}'; no target was invoked.`),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
kind: 'transition',
|
|
136
|
+
continuation: { kind: 'advance', toNodeId: resolved.target, payload: result.value },
|
|
137
|
+
runStatus: 'running',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (node.kind === 'wait' && input.resolvedWait !== true) {
|
|
141
|
+
const wait = node.wait;
|
|
142
|
+
const waitId = waitIdFor(claim.token.runId, claim.token.lineage, node.id);
|
|
143
|
+
if (wait.kind === 'timer') {
|
|
144
|
+
// Scheduling-time overflow guard: the deadline must stay inside the
|
|
145
|
+
// safe persisted-timestamp domain. Compilation already rejects
|
|
146
|
+
// non-positive/fractional/NaN/Infinite delays; an enormous (but
|
|
147
|
+
// compile-valid) delay combined with the current time could still
|
|
148
|
+
// overflow `Number.MAX_SAFE_INTEGER`, which fails structurally here
|
|
149
|
+
// instead of persisting an unusable timestamp.
|
|
150
|
+
const dueAt = input.now + wait.delayMs;
|
|
151
|
+
if (!Number.isSafeInteger(dueAt)) {
|
|
152
|
+
return {
|
|
153
|
+
kind: 'invalid',
|
|
154
|
+
error: invalidOutcome(`Timer wait node '${node.id}' declares delayMs ${wait.delayMs}, which would schedule a deadline outside the safe persisted-timestamp domain; the run cannot park on this wait.`),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const command = {
|
|
158
|
+
waitId,
|
|
159
|
+
nodeId: node.id,
|
|
160
|
+
kind: 'timer',
|
|
161
|
+
signalName: null,
|
|
162
|
+
contractId: null,
|
|
163
|
+
contractRevision: null,
|
|
164
|
+
dueAt,
|
|
165
|
+
timeoutAt: null,
|
|
166
|
+
};
|
|
167
|
+
return {
|
|
168
|
+
kind: 'transition',
|
|
169
|
+
continuation: { kind: 'wait', wait: command },
|
|
170
|
+
runStatus: 'waiting',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
// Same overflow guard for a declared wait timeout (absent when
|
|
174
|
+
// `undefined` or `null`).
|
|
175
|
+
const timeoutAt = wait.timeoutMs !== undefined && wait.timeoutMs !== null ? input.now + wait.timeoutMs : null;
|
|
176
|
+
if (timeoutAt !== null && !Number.isSafeInteger(timeoutAt)) {
|
|
177
|
+
return {
|
|
178
|
+
kind: 'invalid',
|
|
179
|
+
error: invalidOutcome(`Signal wait node '${node.id}' declares timeoutMs ${String(wait.timeoutMs)}, which would schedule a deadline outside the safe persisted-timestamp domain; the run cannot park on this wait.`),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
const command = {
|
|
183
|
+
waitId,
|
|
184
|
+
nodeId: node.id,
|
|
185
|
+
kind: 'signal',
|
|
186
|
+
signalName: wait.name,
|
|
187
|
+
contractId: wait.contract ?? null,
|
|
188
|
+
contractRevision: null,
|
|
189
|
+
dueAt: null,
|
|
190
|
+
// The canonical manifest form normalizes an ABSENT timeout to `null`.
|
|
191
|
+
// Both `undefined` and `null` mean "no timeout": no wait-timeout timer
|
|
192
|
+
// is scheduled for a plain signal wait.
|
|
193
|
+
timeoutAt,
|
|
194
|
+
};
|
|
195
|
+
return {
|
|
196
|
+
kind: 'transition',
|
|
197
|
+
continuation: { kind: 'wait', wait: command },
|
|
198
|
+
runStatus: 'waiting',
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
if (node.kind === 'fork') {
|
|
202
|
+
const joinId = graph.joinOfFork(node.id);
|
|
203
|
+
if (joinId === undefined) {
|
|
204
|
+
return {
|
|
205
|
+
kind: 'invalid',
|
|
206
|
+
error: invalidOutcome(`Fork node '${node.id}' has no matching join.`),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
const children = graph.branchKeysOf(node.id).map((branchKey) => ({
|
|
210
|
+
branchKey,
|
|
211
|
+
toNodeId: graph.branchTargetsOf(node.id)[branchKey],
|
|
212
|
+
forkId: node.id,
|
|
213
|
+
lineage: canonicalBranchLineage(claim.token.lineage, node.id, branchKey),
|
|
214
|
+
tokenId: forkChildTokenId(claim.token.runId, node.id, branchKey),
|
|
215
|
+
}));
|
|
216
|
+
return {
|
|
217
|
+
kind: 'transition',
|
|
218
|
+
continuation: { kind: 'fork', joinId, children },
|
|
219
|
+
runStatus: 'running',
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
const successTarget = graph.successTargetOf(node.id);
|
|
223
|
+
if (successTarget === undefined) {
|
|
224
|
+
if (claim.token.forkId !== null) {
|
|
225
|
+
// A branch path escaping to a terminal is a compile-time diagnostic;
|
|
226
|
+
// treat defensively as a branch failure.
|
|
227
|
+
return { kind: 'transition', continuation: { kind: 'branchFailure' }, runStatus: 'failed' };
|
|
228
|
+
}
|
|
229
|
+
return { kind: 'transition', continuation: { kind: 'none' }, runStatus: 'completed' };
|
|
230
|
+
}
|
|
231
|
+
const targetNode = graph.getNode(successTarget);
|
|
232
|
+
if (targetNode !== undefined && targetNode.kind === 'join') {
|
|
233
|
+
// Branch arrival: the branch token is consumed; the store records the
|
|
234
|
+
// branch result and — on the final arrival — creates exactly ONE
|
|
235
|
+
// join-ready token AT THE JOIN NODE carrying the private canonical
|
|
236
|
+
// checkpoint. The join node is then claimed and completed by the
|
|
237
|
+
// runtime like any other control node: its declared output contract
|
|
238
|
+
// is validated OUTSIDE the store transaction, and one atomic
|
|
239
|
+
// transition either advances downstream (or completes a terminal
|
|
240
|
+
// join) or fails the run with a sanitized contract error. The join
|
|
241
|
+
// therefore always crosses its own declared boundary, exactly once,
|
|
242
|
+
// even when it declares zero success edges (terminal join).
|
|
243
|
+
return {
|
|
244
|
+
kind: 'transition',
|
|
245
|
+
continuation: {
|
|
246
|
+
kind: 'branchArrival',
|
|
247
|
+
forkId: targetNode.fork,
|
|
248
|
+
joinId: successTarget,
|
|
249
|
+
branchKey: claim.token.branchKey ?? '',
|
|
250
|
+
joinContinuation: {
|
|
251
|
+
tokenId: joinTokenId(claim.token.runId, successTarget),
|
|
252
|
+
toNodeId: successTarget,
|
|
253
|
+
lineage: forkLineageOf(claim.token.lineage, targetNode.fork, claim.token.branchKey ?? ''),
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
runStatus: 'running',
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
kind: 'transition',
|
|
261
|
+
continuation: { kind: 'advance', toNodeId: successTarget, payload: input.validatedOutput },
|
|
262
|
+
runStatus: 'running',
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=orchestration-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestration-plan.js","sourceRoot":"","sources":["../src/orchestration-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { VictRuntime } from './runtime.js';
|
|
2
|
+
import type { ConformanceExpect, ConformanceTestRunner, OrchestrationConformanceFixture, OrchestrationConformanceStores } from './orchestration-conformance.js';
|
|
3
|
+
/**
|
|
4
|
+
* Adapter-neutral Stage 03 race and adversarial conformance suite
|
|
5
|
+
* (corrective evidence for handoff §23–§24: races, fencing, cancellation,
|
|
6
|
+
* blocked-state resolution, fan-out recovery). Every conforming backend
|
|
7
|
+
* (in-memory, SQLite) runs this exact suite. Deterministic by
|
|
8
|
+
* construction: barriers, injected deadlines and raw guarded store
|
|
9
|
+
* commands — never timing guesses.
|
|
10
|
+
*/
|
|
11
|
+
export interface OrchestrationRaceStores extends OrchestrationConformanceStores {
|
|
12
|
+
/** A SECOND runtime sharing the same durable stores with explicit operator authorization. */
|
|
13
|
+
createOperatorRuntime(): Promise<VictRuntime>;
|
|
14
|
+
}
|
|
15
|
+
export interface OrchestrationRaceFixture extends OrchestrationConformanceFixture {
|
|
16
|
+
/**
|
|
17
|
+
* `clock` (optional) is injected as both the runtime clock and the
|
|
18
|
+
* orchestration time port so timeout/race tests are fully deterministic.
|
|
19
|
+
*/
|
|
20
|
+
create(clock?: ManualOrchestrationClock): Promise<OrchestrationRaceStores>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A fully deterministic orchestration clock: `now()` is test-advanced,
|
|
24
|
+
* `delay()` resolves only when the test advances past the requested due
|
|
25
|
+
* time. Injected as BOTH the runtime `clock` and the orchestration time
|
|
26
|
+
* port, so persisted deadlines, retry-timer eligibility, and deadline
|
|
27
|
+
* racing all move only when the test moves them. No wall-clock guessing.
|
|
28
|
+
*/
|
|
29
|
+
export interface ManualOrchestrationClock {
|
|
30
|
+
readonly now: () => number;
|
|
31
|
+
readonly delay: (ms: number) => Promise<void>;
|
|
32
|
+
readonly advance: (ms: number) => void;
|
|
33
|
+
}
|
|
34
|
+
export declare function createManualOrchestrationClock(start?: number): ManualOrchestrationClock;
|
|
35
|
+
export declare function runOrchestrationRaceSuite(runner: ConformanceTestRunner, expect: ConformanceExpect, factory: OrchestrationRaceFixture): void;
|