@miragon/pulse-engine-core 0.0.0-bootstrap.0 → 0.25.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/LICENSE +21 -0
- package/dist/activities.d.ts +31 -0
- package/dist/activities.d.ts.map +1 -0
- package/dist/activities.js +62 -0
- package/dist/activities.js.map +1 -0
- package/dist/advance-plan.d.ts +21 -0
- package/dist/advance-plan.d.ts.map +1 -0
- package/dist/advance-plan.js +192 -0
- package/dist/advance-plan.js.map +1 -0
- package/dist/conditions.d.ts +66 -0
- package/dist/conditions.d.ts.map +1 -0
- package/dist/conditions.js +119 -0
- package/dist/conditions.js.map +1 -0
- package/dist/dates.d.ts +59 -0
- package/dist/dates.d.ts.map +1 -0
- package/dist/dates.js +189 -0
- package/dist/dates.js.map +1 -0
- package/dist/durations.d.ts +4 -0
- package/dist/durations.d.ts.map +1 -0
- package/dist/durations.js +10 -0
- package/dist/durations.js.map +1 -0
- package/dist/engine-status.d.ts +57 -0
- package/dist/engine-status.d.ts.map +1 -0
- package/dist/engine-status.js +193 -0
- package/dist/engine-status.js.map +1 -0
- package/dist/errors.d.ts +101 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/filters.d.ts +53 -0
- package/dist/filters.d.ts.map +1 -0
- package/dist/filters.js +74 -0
- package/dist/filters.js.map +1 -0
- package/dist/findings.d.ts +46 -0
- package/dist/findings.d.ts.map +1 -0
- package/dist/findings.js +105 -0
- package/dist/findings.js.map +1 -0
- package/dist/incident-recovery.d.ts +35 -0
- package/dist/incident-recovery.d.ts.map +1 -0
- package/dist/incident-recovery.js +24 -0
- package/dist/incident-recovery.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +34 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +247 -0
- package/dist/inspect.js.map +1 -0
- package/dist/next.d.ts +26 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +83 -0
- package/dist/next.js.map +1 -0
- package/dist/operations.d.ts +9 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +41 -0
- package/dist/operations.js.map +1 -0
- package/dist/poll.d.ts +24 -0
- package/dist/poll.d.ts.map +1 -0
- package/dist/poll.js +29 -0
- package/dist/poll.js.map +1 -0
- package/dist/port.d.ts +95 -0
- package/dist/port.d.ts.map +1 -0
- package/dist/port.js +113 -0
- package/dist/port.js.map +1 -0
- package/dist/records.d.ts +27 -0
- package/dist/records.d.ts.map +1 -0
- package/dist/records.js +58 -0
- package/dist/records.js.map +1 -0
- package/dist/requests.d.ts +24 -0
- package/dist/requests.d.ts.map +1 -0
- package/dist/requests.js +35 -0
- package/dist/requests.js.map +1 -0
- package/dist/retry-plan.d.ts +62 -0
- package/dist/retry-plan.d.ts.map +1 -0
- package/dist/retry-plan.js +140 -0
- package/dist/retry-plan.js.map +1 -0
- package/dist/root-cause.d.ts +17 -0
- package/dist/root-cause.d.ts.map +1 -0
- package/dist/root-cause.js +35 -0
- package/dist/root-cause.js.map +1 -0
- package/dist/select.d.ts +16 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +133 -0
- package/dist/select.js.map +1 -0
- package/dist/snapshot.d.ts +12 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +134 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/sorting.d.ts +20 -0
- package/dist/sorting.d.ts.map +1 -0
- package/dist/sorting.js +17 -0
- package/dist/sorting.js.map +1 -0
- package/dist/status.d.ts +91 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +222 -0
- package/dist/status.js.map +1 -0
- package/dist/testing/fake-port.d.ts +31 -0
- package/dist/testing/fake-port.d.ts.map +1 -0
- package/dist/testing/fake-port.js +50 -0
- package/dist/testing/fake-port.js.map +1 -0
- package/dist/testing/fixture.d.ts +39 -0
- package/dist/testing/fixture.d.ts.map +1 -0
- package/dist/testing/fixture.js +288 -0
- package/dist/testing/fixture.js.map +1 -0
- package/dist/testing/index.d.ts +23 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +23 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/inspect-routes.d.ts +12 -0
- package/dist/testing/inspect-routes.d.ts.map +1 -0
- package/dist/testing/inspect-routes.js +63 -0
- package/dist/testing/inspect-routes.js.map +1 -0
- package/dist/testing/status.d.ts +18 -0
- package/dist/testing/status.d.ts.map +1 -0
- package/dist/testing/status.js +12 -0
- package/dist/testing/status.js.map +1 -0
- package/dist/testing/waits.d.ts +60 -0
- package/dist/testing/waits.d.ts.map +1 -0
- package/dist/testing/waits.js +53 -0
- package/dist/testing/waits.js.map +1 -0
- package/dist/timeline.d.ts +9 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +63 -0
- package/dist/timeline.js.map +1 -0
- package/dist/tree.d.ts +19 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +61 -0
- package/dist/tree.js.map +1 -0
- package/dist/types.d.ts +254 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +26 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +44 -0
- package/dist/util.js.map +1 -0
- package/dist/variable-writes.d.ts +32 -0
- package/dist/variable-writes.d.ts.map +1 -0
- package/dist/variable-writes.js +113 -0
- package/dist/variable-writes.js.map +1 -0
- package/dist/variables.d.ts +28 -0
- package/dist/variables.d.ts.map +1 -0
- package/dist/variables.js +64 -0
- package/dist/variables.js.map +1 -0
- package/dist/waits.d.ts +11 -0
- package/dist/waits.d.ts.map +1 -0
- package/dist/waits.js +253 -0
- package/dist/waits.js.map +1 -0
- package/package.json +47 -5
package/dist/status.js
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Aggregation of the status triage: definitions, incident groups, external task topics, jobs,
|
|
3
|
+
* tasks and batches from the responses of round 1. Pure; `now` is injected (engine and client
|
|
4
|
+
* clocks are assumed to agree, as for local containers).
|
|
5
|
+
*/
|
|
6
|
+
import { isRetryable } from "./next.js";
|
|
7
|
+
import { amount, compareText, compareTime, definitionKeyOf, field, num, records, str, } from "./records.js";
|
|
8
|
+
import { engineTime } from "./dates.js";
|
|
9
|
+
import { compact } from "./util.js";
|
|
10
|
+
/** Incident groups list at most this many instance ids. */
|
|
11
|
+
const LISTED_INSTANCES = 3;
|
|
12
|
+
const UUID = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;
|
|
13
|
+
const HEX_RUN = /[0-9a-f]{16,}/gi;
|
|
14
|
+
const DIGITS = /\d+/g;
|
|
15
|
+
/** The message with UUIDs, hex runs of 16+ characters and digit runs masked as `#`. */
|
|
16
|
+
export function messagePattern(message) {
|
|
17
|
+
return message.replace(UUID, "#").replace(HEX_RUN, "#").replace(DIGITS, "#");
|
|
18
|
+
}
|
|
19
|
+
/** Process definitions of the statistics rows by id: key and version. */
|
|
20
|
+
function definitionsById(statistics) {
|
|
21
|
+
return new Map(statistics.flatMap((row) => {
|
|
22
|
+
const definition = row.definition;
|
|
23
|
+
const dto = typeof definition === "object" && definition !== null ? definition : row;
|
|
24
|
+
const id = str(dto, "id") ?? str(row, "id");
|
|
25
|
+
return id === undefined ? [] : [[id, dto]];
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
function incidentCount(row) {
|
|
29
|
+
return records(row.incidents).reduce((sum, entry) => sum + amount(entry, "incidentCount"), 0);
|
|
30
|
+
}
|
|
31
|
+
/** The definition key of a statistics row. */
|
|
32
|
+
function statisticsKey(row) {
|
|
33
|
+
return str(row.definition, "key") ?? definitionKeyOf(str(row, "id")) ?? "";
|
|
34
|
+
}
|
|
35
|
+
/** Named keys without any deployed definition (a typo, or another engine). */
|
|
36
|
+
export function unknownKeys(statistics, keys) {
|
|
37
|
+
const known = new Set(statistics.map(statisticsKey));
|
|
38
|
+
return keys.filter((key) => !known.has(key));
|
|
39
|
+
}
|
|
40
|
+
/** Statistics summed per key; keys without instances, failed jobs and incidents only when named. */
|
|
41
|
+
export function definitionStatus(statistics, keys) {
|
|
42
|
+
const byKey = new Map();
|
|
43
|
+
for (const row of statistics) {
|
|
44
|
+
const key = statisticsKey(row);
|
|
45
|
+
byKey.set(key, [...(byKey.get(key) ?? []), row]);
|
|
46
|
+
}
|
|
47
|
+
return [...byKey.entries()]
|
|
48
|
+
.filter(([key]) => keys.length === 0 || keys.includes(key))
|
|
49
|
+
.map(([key, rows]) => {
|
|
50
|
+
const definitions = rows.map((row) => (row.definition ?? {}));
|
|
51
|
+
const latest = definitions.toSorted((left, right) => amount(right, "version") - amount(left, "version"))[0];
|
|
52
|
+
const sum = (read) => rows.reduce((total, row) => total + read(row), 0);
|
|
53
|
+
return {
|
|
54
|
+
key,
|
|
55
|
+
...compact({ name: str(latest, "name") }),
|
|
56
|
+
latestVersion: amount(latest, "version"),
|
|
57
|
+
versions: rows.length,
|
|
58
|
+
instances: sum((row) => amount(row, "instances")),
|
|
59
|
+
failedJobs: sum((row) => amount(row, "failedJobs")),
|
|
60
|
+
incidents: sum(incidentCount),
|
|
61
|
+
};
|
|
62
|
+
})
|
|
63
|
+
.filter((status) => keys.includes(status.key) || status.instances + status.failedJobs + status.incidents > 0)
|
|
64
|
+
.toSorted((left, right) => right.incidents - left.incidents ||
|
|
65
|
+
right.failedJobs - left.failedJobs ||
|
|
66
|
+
right.instances - left.instances ||
|
|
67
|
+
compareText(left.key, right.key));
|
|
68
|
+
}
|
|
69
|
+
function groupNext(processDefinitionKey, activityId, incidentType, jobDefinitionId) {
|
|
70
|
+
if (processDefinitionKey === "") {
|
|
71
|
+
// a job outside any process definition (a batch or a history cleanup job)
|
|
72
|
+
return jobDefinitionId === undefined
|
|
73
|
+
? { action: "listIncidentsOfType", incidentType }
|
|
74
|
+
: { action: "listFailedJobs", jobDefinitionId };
|
|
75
|
+
}
|
|
76
|
+
return isRetryable(incidentType)
|
|
77
|
+
? { action: "retryActivity", processDefinitionKey, activityId }
|
|
78
|
+
: { action: "listIncidentsAtActivity", processDefinitionKey, activityId };
|
|
79
|
+
}
|
|
80
|
+
/** The fields of a group step, in the order `defaultGroupOrder` compares them. */
|
|
81
|
+
function stepFields(step) {
|
|
82
|
+
const own = step;
|
|
83
|
+
return [
|
|
84
|
+
step.action,
|
|
85
|
+
own.processDefinitionKey ?? "",
|
|
86
|
+
own.activityId ?? "",
|
|
87
|
+
own.incidentType ?? "",
|
|
88
|
+
own.jobDefinitionId ?? "",
|
|
89
|
+
];
|
|
90
|
+
}
|
|
91
|
+
/** The tie-break of equal groups: action, then key, activity, incident type, job definition. */
|
|
92
|
+
export function defaultGroupOrder(left, right) {
|
|
93
|
+
const a = stepFields(left);
|
|
94
|
+
const b = stepFields(right);
|
|
95
|
+
return a.reduce((order, value, index) => order || compareText(value, b[index] ?? ""), 0);
|
|
96
|
+
}
|
|
97
|
+
/** Newest first, then by id. */
|
|
98
|
+
function newestFirst(left, right) {
|
|
99
|
+
return (compareTime(str(right, "incidentTimestamp"), str(left, "incidentTimestamp")) ||
|
|
100
|
+
compareText(field(left, "id"), field(right, "id")));
|
|
101
|
+
}
|
|
102
|
+
function isRoot(incident) {
|
|
103
|
+
return str(incident, "id") === str(incident, "rootCauseIncidentId");
|
|
104
|
+
}
|
|
105
|
+
/** The group of an incident: key (else its job definition), activity, type, message pattern. */
|
|
106
|
+
function groupId(incident, key) {
|
|
107
|
+
return [
|
|
108
|
+
key === "" ? `job-definition:${field(incident, "jobDefinitionId")}` : key,
|
|
109
|
+
field(incident, "activityId"),
|
|
110
|
+
field(incident, "incidentType"),
|
|
111
|
+
messagePattern(field(incident, "incidentMessage")),
|
|
112
|
+
].join("\u0000");
|
|
113
|
+
}
|
|
114
|
+
function groupOf(members) {
|
|
115
|
+
const newest = members[0] ?? {};
|
|
116
|
+
const key = field(newest, "processDefinitionKey");
|
|
117
|
+
const activityId = field(newest, "activityId");
|
|
118
|
+
const type = field(newest, "incidentType");
|
|
119
|
+
const jobDefinitionId = key === "" ? str(newest, "jobDefinitionId") : undefined;
|
|
120
|
+
return {
|
|
121
|
+
processDefinitionKey: key,
|
|
122
|
+
activityId,
|
|
123
|
+
...compact({ jobDefinitionId }),
|
|
124
|
+
type,
|
|
125
|
+
message: field(newest, "incidentMessage"),
|
|
126
|
+
count: members.length,
|
|
127
|
+
firstAt: str(members.at(-1), "incidentTimestamp") ?? "",
|
|
128
|
+
lastAt: field(newest, "incidentTimestamp"),
|
|
129
|
+
processInstanceIds: [
|
|
130
|
+
...new Set(members.flatMap((member) => str(member, "processInstanceId") ?? [])),
|
|
131
|
+
].slice(0, LISTED_INSTANCES),
|
|
132
|
+
next: groupNext(key, activityId, type, jobDefinitionId),
|
|
133
|
+
newest,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Root cause incidents grouped by key, activity, type and message pattern; largest groups first,
|
|
138
|
+
* then the most recent, then `compareSteps` over the next steps. Incidents of the failed jobs of a
|
|
139
|
+
* batch (`batchJobDefinitions`) are left out: BATCH_FAILURES reports them.
|
|
140
|
+
*/
|
|
141
|
+
export function groupIncidents(incidents, statistics, batchJobDefinitions = new Set(), compareSteps = defaultGroupOrder) {
|
|
142
|
+
const definitions = definitionsById(statistics);
|
|
143
|
+
const roots = incidents
|
|
144
|
+
.filter(isRoot)
|
|
145
|
+
.filter((incident) => !batchJobDefinitions.has(field(incident, "jobDefinitionId")));
|
|
146
|
+
const groups = new Map();
|
|
147
|
+
for (const incident of roots.toSorted(newestFirst)) {
|
|
148
|
+
const definitionId = str(incident, "processDefinitionId");
|
|
149
|
+
const key = str(definitions.get(definitionId ?? ""), "key") ?? definitionKeyOf(definitionId) ?? "";
|
|
150
|
+
const id = groupId(incident, key);
|
|
151
|
+
groups.set(id, [...(groups.get(id) ?? []), { ...incident, processDefinitionKey: key }]);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
groups: [...groups.values()]
|
|
155
|
+
.map(groupOf)
|
|
156
|
+
.toSorted((left, right) => right.count - left.count ||
|
|
157
|
+
compareTime(right.lastAt, left.lastAt) ||
|
|
158
|
+
compareSteps(left.next, right.next)),
|
|
159
|
+
propagated: incidents.filter((incident) => !isRoot(incident)).length,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Failed (no retries left), locked (lock in the future), waiting (never locked, or a reported
|
|
164
|
+
* failure whose retry is due: the engine keeps the worker and sets the lock to the retry time),
|
|
165
|
+
* else lock expired (a worker crashed or exceeded its lock).
|
|
166
|
+
*/
|
|
167
|
+
function taskState(task, now) {
|
|
168
|
+
if (num(task, "retries") === 0)
|
|
169
|
+
return "failed";
|
|
170
|
+
const lock = engineTime(str(task, "lockExpirationTime"));
|
|
171
|
+
if (lock === undefined)
|
|
172
|
+
return "waiting";
|
|
173
|
+
if (lock > now)
|
|
174
|
+
return "locked";
|
|
175
|
+
return str(task, "errorMessage") === undefined ? "lockExpired" : "waiting";
|
|
176
|
+
}
|
|
177
|
+
/** Since when a task waits: its retry time after a failure, else its create time. */
|
|
178
|
+
function waitingSince(task) {
|
|
179
|
+
return str(task, "errorMessage") === undefined
|
|
180
|
+
? str(task, "createTime")
|
|
181
|
+
: (str(task, "lockExpirationTime") ?? str(task, "createTime"));
|
|
182
|
+
}
|
|
183
|
+
function earliest(times) {
|
|
184
|
+
return times.filter((time) => time !== undefined).toSorted(compareTime)[0];
|
|
185
|
+
}
|
|
186
|
+
function topicOf(topic, members, now) {
|
|
187
|
+
const of = (state) => members.filter((task) => taskState(task, now) === state);
|
|
188
|
+
const waiting = of("waiting");
|
|
189
|
+
const expired = of("lockExpired");
|
|
190
|
+
return {
|
|
191
|
+
topic,
|
|
192
|
+
waiting: waiting.length,
|
|
193
|
+
locked: of("locked").length,
|
|
194
|
+
lockExpired: expired.length,
|
|
195
|
+
failed: of("failed").length,
|
|
196
|
+
workers: [...new Set(of("locked").flatMap((task) => str(task, "workerId") ?? []))].sort(compareText),
|
|
197
|
+
...compact({
|
|
198
|
+
oldestWaitingSince: earliest(waiting.map(waitingSince)),
|
|
199
|
+
oldestLockExpiredAt: earliest(expired.map((task) => str(task, "lockExpirationTime"))),
|
|
200
|
+
}),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/** External tasks per topic, a partition: failed, locked, lock expired or waiting. */
|
|
204
|
+
export function topicStatus(tasks, now) {
|
|
205
|
+
const topics = new Map();
|
|
206
|
+
for (const task of tasks) {
|
|
207
|
+
const topic = field(task, "topicName");
|
|
208
|
+
topics.set(topic, [...(topics.get(topic) ?? []), task]);
|
|
209
|
+
}
|
|
210
|
+
return [...topics.entries()]
|
|
211
|
+
.map(([topic, members]) => topicOf(topic, members, now))
|
|
212
|
+
.toSorted((left, right) => compareText(left.topic, right.topic));
|
|
213
|
+
}
|
|
214
|
+
/** Executable jobs whose due date (or create time) is older than the threshold are overdue. */
|
|
215
|
+
export function jobStatus(executable, staleJobs, threshold) {
|
|
216
|
+
const ready = staleJobs
|
|
217
|
+
.map((job) => str(job, "dueDate") ?? str(job, "createTime"))
|
|
218
|
+
.filter((time) => (engineTime(time) ?? Number.POSITIVE_INFINITY) < threshold)
|
|
219
|
+
.toSorted(compareTime);
|
|
220
|
+
return { executable, overdue: ready.length, ...compact({ oldestReadySince: ready[0] }) };
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** A recording engine port over canned answers, and a fake clock, for tests of the workflows. */
|
|
2
|
+
import { type EngineFailure, type EnginePort, type OperationInput } from "../port.js";
|
|
3
|
+
/** The answer of one operation: a JSON value (a text for text operations), or a thrown `fakeFailure`. */
|
|
4
|
+
export type Route = (input: OperationInput) => unknown;
|
|
5
|
+
export interface FakeCall {
|
|
6
|
+
readonly operationId: string;
|
|
7
|
+
readonly input: OperationInput;
|
|
8
|
+
}
|
|
9
|
+
/** An engine error answer, as the fake transport reads it back. */
|
|
10
|
+
export declare class FakeFailure extends Error {
|
|
11
|
+
readonly failure: EngineFailure;
|
|
12
|
+
constructor(failure: EngineFailure);
|
|
13
|
+
}
|
|
14
|
+
/** The error of an engine answer with `status` and the engine exception type. */
|
|
15
|
+
export declare function fakeFailure(status: number, engineType?: string): FakeFailure;
|
|
16
|
+
export interface FakePort extends EnginePort {
|
|
17
|
+
/** Every operation sent, in order. */
|
|
18
|
+
readonly calls: readonly FakeCall[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A port whose transport answers each operation from `routes`; an operation without a route is
|
|
22
|
+
* refused with an error, so a test pins the operations a workflow may send.
|
|
23
|
+
*/
|
|
24
|
+
export declare function fakePort(routes: Readonly<Partial<Record<string, Route>>>): FakePort;
|
|
25
|
+
/** A fake clock: `sleep` advances it at once and records the sleeps. */
|
|
26
|
+
export declare function fakeClock(start?: number): {
|
|
27
|
+
sleeps: number[];
|
|
28
|
+
now: () => number;
|
|
29
|
+
sleep: (ms: number) => Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=fake-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-port.d.ts","sourceRoot":"","sources":["../../src/testing/fake-port.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,UAAU,EAEf,KAAK,cAAc,EACpB,MAAM,YAAY,CAAA;AAEnB,yGAAyG;AACzG,MAAM,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAA;AAEtD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;CAC/B;AAED,mEAAmE;AACnE,qBAAa,WAAY,SAAQ,KAAK;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa;gBAAtB,OAAO,EAAE,aAAa;CAM5C;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAE5E;AAED,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;CACpC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAcnF;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,KAAK,SAAoB;;;gBAMnC,MAAM;EAMrB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** A recording engine port over canned answers, and a fake clock, for tests of the workflows. */
|
|
2
|
+
import { createEnginePort, } from "../port.js";
|
|
3
|
+
/** An engine error answer, as the fake transport reads it back. */
|
|
4
|
+
export class FakeFailure extends Error {
|
|
5
|
+
failure;
|
|
6
|
+
constructor(failure) {
|
|
7
|
+
super(`HTTP ${failure.status}${failure.engineType === undefined ? "" : ` ${failure.engineType}`}`);
|
|
8
|
+
this.failure = failure;
|
|
9
|
+
this.name = "FakeFailure";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** The error of an engine answer with `status` and the engine exception type. */
|
|
13
|
+
export function fakeFailure(status, engineType) {
|
|
14
|
+
return new FakeFailure(engineType === undefined ? { status } : { status, engineType });
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A port whose transport answers each operation from `routes`; an operation without a route is
|
|
18
|
+
* refused with an error, so a test pins the operations a workflow may send.
|
|
19
|
+
*/
|
|
20
|
+
export function fakePort(routes) {
|
|
21
|
+
const calls = [];
|
|
22
|
+
const transport = {
|
|
23
|
+
async send(operationId, input) {
|
|
24
|
+
calls.push({ operationId, input });
|
|
25
|
+
const route = routes[operationId];
|
|
26
|
+
if (route === undefined)
|
|
27
|
+
throw new Error(`fakePort: no route for ${operationId}`);
|
|
28
|
+
return await route(input);
|
|
29
|
+
},
|
|
30
|
+
json: (answer) => answer,
|
|
31
|
+
text: (answer) => (typeof answer === "string" ? answer : undefined),
|
|
32
|
+
failure: (error) => (error instanceof FakeFailure ? error.failure : undefined),
|
|
33
|
+
};
|
|
34
|
+
return { ...createEnginePort(transport), calls };
|
|
35
|
+
}
|
|
36
|
+
/** A fake clock: `sleep` advances it at once and records the sleeps. */
|
|
37
|
+
export function fakeClock(start = 1_700_000_000_000) {
|
|
38
|
+
let now = start;
|
|
39
|
+
const sleeps = [];
|
|
40
|
+
return {
|
|
41
|
+
sleeps,
|
|
42
|
+
now: () => now,
|
|
43
|
+
sleep: (ms) => {
|
|
44
|
+
sleeps.push(ms);
|
|
45
|
+
now += ms;
|
|
46
|
+
return Promise.resolve();
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=fake-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-port.js","sourceRoot":"","sources":["../../src/testing/fake-port.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG,OAAO,EACL,gBAAgB,GAKjB,MAAM,YAAY,CAAA;AAUnB,mEAAmE;AACnE,MAAM,OAAO,WAAY,SAAQ,KAAK;IACf;IAArB,YAAqB,OAAsB;QACzC,KAAK,CACH,QAAQ,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAC5F,CAAA;QAHkB,YAAO,GAAP,OAAO,CAAe;QAIzC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;IAC3B,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,UAAmB;IAC7D,OAAO,IAAI,WAAW,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;AACxF,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAgD;IACvE,MAAM,KAAK,GAAe,EAAE,CAAA;IAC5B,MAAM,SAAS,GAAoB;QACjC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAA;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAA;YACjC,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAA;YACjF,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;QACD,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM;QACxB,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;KAC/E,CAAA;IACD,OAAO,EAAE,GAAG,gBAAgB,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAA;AAClD,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,KAAK,GAAG,iBAAiB;IACjD,IAAI,GAAG,GAAG,KAAK,CAAA;IACf,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,OAAO;QACL,MAAM;QACN,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG;QACd,KAAK,EAAE,CAAC,EAAU,EAAE,EAAE;YACpB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACf,GAAG,IAAI,EAAE,CAAA;YACT,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine responses of the verified workflow fixture (apps/cli/test/integration/fixtures/workflow.bpmn
|
|
3
|
+
* in the Pulse repository) at each of its wait states, shaped like the answers of Operaton 2.1.5 /
|
|
4
|
+
* Camunda 7.24 / CIB seven 2.2.0, as `InstanceData` for the instance view assembly.
|
|
5
|
+
*/
|
|
6
|
+
import type { Rec } from "../records.js";
|
|
7
|
+
import type { InstanceData, TreeNode } from "../types.js";
|
|
8
|
+
export declare const P = "adff9abe-c3e6-11f1-aa2b-66e6c1afd69e";
|
|
9
|
+
export declare const C = "adffc1d4-c3e6-11f1-aa2b-66e6c1afd69e";
|
|
10
|
+
export declare const PARENT_DEF = "workflow-parent:1:add41deb-c3e6-11f1-aa2b-66e6c1afd69e";
|
|
11
|
+
export declare const CHILD_DEF = "workflow-child:1:add3f6da-c3e6-11f1-aa2b-66e6c1afd69e";
|
|
12
|
+
export declare const runtimeDto: Rec;
|
|
13
|
+
export declare const historyDto: Rec;
|
|
14
|
+
export declare const DEFINITIONS: readonly Rec[];
|
|
15
|
+
export declare const JOB_DEFINITIONS: readonly Rec[];
|
|
16
|
+
export declare const ROOT_NODE: TreeNode;
|
|
17
|
+
export declare const CHILD_NODE: TreeNode;
|
|
18
|
+
/** An activity instance tree of an instance with the given leaf activity instances. */
|
|
19
|
+
export declare function activityTree(pid: string, definitionId: string, children: readonly Rec[], transitions?: readonly Rec[]): Rec;
|
|
20
|
+
/** A leaf activity instance; `executions` are its execution ids, optionally ending with `name=<activity name>`. */
|
|
21
|
+
export declare function activity(id: string, activityId: string, activityType: string, executions: readonly string[]): Rec;
|
|
22
|
+
/** Data of an active instance with defaults for everything not given. */
|
|
23
|
+
export declare function activeData(overrides?: Partial<InstanceData>): InstanceData;
|
|
24
|
+
/** Waiting at the user task `approve` of the called child instance. */
|
|
25
|
+
export declare function approveStage(): InstanceData;
|
|
26
|
+
/** Waiting at the external task `charge`. */
|
|
27
|
+
export declare function chargeStage(): InstanceData;
|
|
28
|
+
/** Waiting at the message catch event `paid`. */
|
|
29
|
+
export declare function paidStage(): InstanceData;
|
|
30
|
+
/** Waiting at the timer `cool-down`. */
|
|
31
|
+
export declare function coolDownStage(): InstanceData;
|
|
32
|
+
export declare const BOOK_ERROR = "Unknown property used in expression: ${failBooking ? missingBean.run() : true}. Cause: Cannot resolve identifier 'missingBean'";
|
|
33
|
+
/** The asynchronous `book` failed for good: a failedJob incident. */
|
|
34
|
+
export declare function bookFailedStage(): InstanceData;
|
|
35
|
+
/** Waiting at the receive task `wait-signal` (no message): an `other` wait state. */
|
|
36
|
+
export declare function waitSignalStage(): InstanceData;
|
|
37
|
+
/** The instance completed: no runtime, the history record and its timeline. */
|
|
38
|
+
export declare function endedStage(): InstanceData;
|
|
39
|
+
//# sourceMappingURL=fixture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/testing/fixture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEzD,eAAO,MAAM,CAAC,yCAAyC,CAAA;AACvD,eAAO,MAAM,CAAC,yCAAyC,CAAA;AACvD,eAAO,MAAM,UAAU,2DAA2D,CAAA;AAClF,eAAO,MAAM,SAAS,0DAA0D,CAAA;AAGhF,eAAO,MAAM,UAAU,EAAE,GAOxB,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,GAaxB,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,SAAS,GAAG,EAGrC,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,GAAG,EAazC,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,QAOvB,CAAA;AACD,eAAO,MAAM,UAAU,EAAE,QAOxB,CAAA;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,SAAS,GAAG,EAAE,EACxB,WAAW,GAAE,SAAS,GAAG,EAAO,GAC/B,GAAG,CAYL;AAED,mHAAmH;AACnH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,GAAG,CAWL;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,SAAS,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,YAAY,CAoB9E;AAED,uEAAuE;AACvE,wBAAgB,YAAY,IAAI,YAAY,CAyB3C;AAED,6CAA6C;AAC7C,wBAAgB,WAAW,IAAI,YAAY,CAqB1C;AAED,iDAAiD;AACjD,wBAAgB,SAAS,IAAI,YAAY,CAmBxC;AAED,wCAAwC;AACxC,wBAAgB,aAAa,IAAI,YAAY,CAqB5C;AAED,eAAO,MAAM,UAAU,mIAC2G,CAAA;AAElI,qEAAqE;AACrE,wBAAgB,eAAe,IAAI,YAAY,CAsD9C;AAED,qFAAqF;AACrF,wBAAgB,eAAe,IAAI,YAAY,CAQ9C;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,IAAI,YAAY,CAazC"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine responses of the verified workflow fixture (apps/cli/test/integration/fixtures/workflow.bpmn
|
|
3
|
+
* in the Pulse repository) at each of its wait states, shaped like the answers of Operaton 2.1.5 /
|
|
4
|
+
* Camunda 7.24 / CIB seven 2.2.0, as `InstanceData` for the instance view assembly.
|
|
5
|
+
*/
|
|
6
|
+
import { omit } from "../util.js";
|
|
7
|
+
export const P = "adff9abe-c3e6-11f1-aa2b-66e6c1afd69e";
|
|
8
|
+
export const C = "adffc1d4-c3e6-11f1-aa2b-66e6c1afd69e";
|
|
9
|
+
export const PARENT_DEF = "workflow-parent:1:add41deb-c3e6-11f1-aa2b-66e6c1afd69e";
|
|
10
|
+
export const CHILD_DEF = "workflow-child:1:add3f6da-c3e6-11f1-aa2b-66e6c1afd69e";
|
|
11
|
+
const T0 = "2026-10-09T13:38:15.430+0000";
|
|
12
|
+
export const runtimeDto = {
|
|
13
|
+
id: P,
|
|
14
|
+
definitionId: PARENT_DEF,
|
|
15
|
+
definitionKey: "workflow-parent",
|
|
16
|
+
businessKey: "WF-1",
|
|
17
|
+
ended: false,
|
|
18
|
+
suspended: false,
|
|
19
|
+
};
|
|
20
|
+
export const historyDto = {
|
|
21
|
+
id: P,
|
|
22
|
+
businessKey: "WF-1",
|
|
23
|
+
processDefinitionId: PARENT_DEF,
|
|
24
|
+
processDefinitionKey: "workflow-parent",
|
|
25
|
+
processDefinitionVersion: 1,
|
|
26
|
+
processDefinitionName: null,
|
|
27
|
+
startTime: T0,
|
|
28
|
+
endTime: null,
|
|
29
|
+
durationInMillis: null,
|
|
30
|
+
rootProcessInstanceId: P,
|
|
31
|
+
superProcessInstanceId: null,
|
|
32
|
+
state: "ACTIVE",
|
|
33
|
+
};
|
|
34
|
+
export const DEFINITIONS = [
|
|
35
|
+
{ id: PARENT_DEF, key: "workflow-parent", version: 1, name: null },
|
|
36
|
+
{ id: CHILD_DEF, key: "workflow-child", version: 1, name: "Child" },
|
|
37
|
+
];
|
|
38
|
+
export const JOB_DEFINITIONS = [
|
|
39
|
+
{
|
|
40
|
+
id: "jd-timer",
|
|
41
|
+
processDefinitionId: PARENT_DEF,
|
|
42
|
+
activityId: "cool-down",
|
|
43
|
+
jobType: "timer-intermediate-transition",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "jd-book",
|
|
47
|
+
processDefinitionId: PARENT_DEF,
|
|
48
|
+
activityId: "book",
|
|
49
|
+
jobType: "async-continuation",
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
export const ROOT_NODE = {
|
|
53
|
+
id: P,
|
|
54
|
+
definitionId: PARENT_DEF,
|
|
55
|
+
definitionKey: "workflow-parent",
|
|
56
|
+
businessKey: "WF-1",
|
|
57
|
+
suspended: false,
|
|
58
|
+
depth: 0,
|
|
59
|
+
};
|
|
60
|
+
export const CHILD_NODE = {
|
|
61
|
+
id: C,
|
|
62
|
+
parentId: P,
|
|
63
|
+
definitionId: CHILD_DEF,
|
|
64
|
+
definitionKey: "workflow-child",
|
|
65
|
+
suspended: false,
|
|
66
|
+
depth: 1,
|
|
67
|
+
};
|
|
68
|
+
/** An activity instance tree of an instance with the given leaf activity instances. */
|
|
69
|
+
export function activityTree(pid, definitionId, children, transitions = []) {
|
|
70
|
+
return {
|
|
71
|
+
id: pid,
|
|
72
|
+
parentActivityInstanceId: null,
|
|
73
|
+
activityId: definitionId,
|
|
74
|
+
activityType: "processDefinition",
|
|
75
|
+
processInstanceId: pid,
|
|
76
|
+
processDefinitionId: definitionId,
|
|
77
|
+
executionIds: [pid],
|
|
78
|
+
childActivityInstances: children,
|
|
79
|
+
childTransitionInstances: transitions,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** A leaf activity instance; `executions` are its execution ids, optionally ending with `name=<activity name>`. */
|
|
83
|
+
export function activity(id, activityId, activityType, executions) {
|
|
84
|
+
const name = executions.find((entry) => entry.startsWith("name="))?.slice("name=".length);
|
|
85
|
+
return {
|
|
86
|
+
id,
|
|
87
|
+
activityId,
|
|
88
|
+
activityType,
|
|
89
|
+
activityName: name ?? null,
|
|
90
|
+
executionIds: executions.filter((entry) => !entry.startsWith("name=")),
|
|
91
|
+
childActivityInstances: [],
|
|
92
|
+
childTransitionInstances: [],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Data of an active instance with defaults for everything not given. */
|
|
96
|
+
export function activeData(overrides = {}) {
|
|
97
|
+
return {
|
|
98
|
+
id: P,
|
|
99
|
+
runtime: runtimeDto,
|
|
100
|
+
history: historyDto,
|
|
101
|
+
tree: [ROOT_NODE],
|
|
102
|
+
truncated: false,
|
|
103
|
+
activityTrees: [activityTree(P, PARENT_DEF, [])],
|
|
104
|
+
incidents: [],
|
|
105
|
+
subscriptions: [],
|
|
106
|
+
tasks: [],
|
|
107
|
+
externalTasks: [],
|
|
108
|
+
jobs: [],
|
|
109
|
+
timerJobIds: new Set(),
|
|
110
|
+
definitions: DEFINITIONS,
|
|
111
|
+
jobDefinitions: JOB_DEFINITIONS,
|
|
112
|
+
causes: new Map(),
|
|
113
|
+
historyRequested: false,
|
|
114
|
+
...overrides,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** Waiting at the user task `approve` of the called child instance. */
|
|
118
|
+
export function approveStage() {
|
|
119
|
+
return activeData({
|
|
120
|
+
tree: [ROOT_NODE, CHILD_NODE],
|
|
121
|
+
activityTrees: [
|
|
122
|
+
activityTree(P, PARENT_DEF, [
|
|
123
|
+
activity("call-approval:ai-1", "call-approval", "callActivity", ["ex-call"]),
|
|
124
|
+
]),
|
|
125
|
+
activityTree(C, CHILD_DEF, [
|
|
126
|
+
activity("approve:ai-2", "approve", "userTask", [C, "name=Approve"]),
|
|
127
|
+
]),
|
|
128
|
+
],
|
|
129
|
+
tasks: [
|
|
130
|
+
{
|
|
131
|
+
id: "task-1",
|
|
132
|
+
name: "Approve",
|
|
133
|
+
taskDefinitionKey: "approve",
|
|
134
|
+
executionId: C,
|
|
135
|
+
processInstanceId: C,
|
|
136
|
+
created: "2026-10-09T13:38:15.431+0000",
|
|
137
|
+
assignee: null,
|
|
138
|
+
due: null,
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
variables: { failBooking: { type: "Boolean", value: true, valueInfo: {} } },
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/** Waiting at the external task `charge`. */
|
|
145
|
+
export function chargeStage() {
|
|
146
|
+
return activeData({
|
|
147
|
+
activityTrees: [
|
|
148
|
+
activityTree(P, PARENT_DEF, [activity("charge:ai-3", "charge", "serviceTask", [P])]),
|
|
149
|
+
],
|
|
150
|
+
externalTasks: [
|
|
151
|
+
{
|
|
152
|
+
id: "et-1",
|
|
153
|
+
activityId: "charge",
|
|
154
|
+
activityInstanceId: "charge:ai-3",
|
|
155
|
+
executionId: P,
|
|
156
|
+
processInstanceId: P,
|
|
157
|
+
topicName: "workflow-charge",
|
|
158
|
+
workerId: null,
|
|
159
|
+
lockExpirationTime: null,
|
|
160
|
+
retries: null,
|
|
161
|
+
errorMessage: null,
|
|
162
|
+
createTime: "2026-10-09T13:38:31.059+0000",
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/** Waiting at the message catch event `paid`. */
|
|
168
|
+
export function paidStage() {
|
|
169
|
+
return activeData({
|
|
170
|
+
activityTrees: [
|
|
171
|
+
activityTree(P, PARENT_DEF, [
|
|
172
|
+
activity("paid:ai-4", "paid", "intermediateMessageCatch", ["ex-paid"]),
|
|
173
|
+
]),
|
|
174
|
+
],
|
|
175
|
+
subscriptions: [
|
|
176
|
+
{
|
|
177
|
+
id: "sub-1",
|
|
178
|
+
eventType: "message",
|
|
179
|
+
eventName: "WorkflowPaid",
|
|
180
|
+
executionId: "ex-paid",
|
|
181
|
+
processInstanceId: P,
|
|
182
|
+
activityId: "paid",
|
|
183
|
+
createdDate: "2026-10-09T13:38:31.270+0000",
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/** Waiting at the timer `cool-down`. */
|
|
189
|
+
export function coolDownStage() {
|
|
190
|
+
return activeData({
|
|
191
|
+
activityTrees: [
|
|
192
|
+
activityTree(P, PARENT_DEF, [
|
|
193
|
+
activity("cool-down:ai-5", "cool-down", "intermediateTimer", ["ex-timer"]),
|
|
194
|
+
]),
|
|
195
|
+
],
|
|
196
|
+
jobs: [
|
|
197
|
+
{
|
|
198
|
+
id: "job-timer",
|
|
199
|
+
jobDefinitionId: "jd-timer",
|
|
200
|
+
processInstanceId: P,
|
|
201
|
+
executionId: "ex-timer",
|
|
202
|
+
retries: 3,
|
|
203
|
+
dueDate: "2026-10-09T14:38:39.693+0000",
|
|
204
|
+
createTime: "2026-10-09T13:38:39.693+0000",
|
|
205
|
+
exceptionMessage: null,
|
|
206
|
+
},
|
|
207
|
+
],
|
|
208
|
+
timerJobIds: new Set(["job-timer"]),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
export const BOOK_ERROR = "Unknown property used in expression: ${failBooking ? missingBean.run() : true}. Cause: Cannot resolve identifier 'missingBean'";
|
|
212
|
+
/** The asynchronous `book` failed for good: a failedJob incident. */
|
|
213
|
+
export function bookFailedStage() {
|
|
214
|
+
return activeData({
|
|
215
|
+
activityTrees: [
|
|
216
|
+
activityTree(P, PARENT_DEF, [], [
|
|
217
|
+
{
|
|
218
|
+
id: "book:ti-1",
|
|
219
|
+
activityId: "book",
|
|
220
|
+
activityType: "serviceTask",
|
|
221
|
+
activityName: null,
|
|
222
|
+
executionId: P,
|
|
223
|
+
},
|
|
224
|
+
]),
|
|
225
|
+
],
|
|
226
|
+
jobs: [
|
|
227
|
+
{
|
|
228
|
+
id: "job-book",
|
|
229
|
+
jobDefinitionId: "jd-book",
|
|
230
|
+
processInstanceId: P,
|
|
231
|
+
executionId: P,
|
|
232
|
+
retries: 0,
|
|
233
|
+
dueDate: null,
|
|
234
|
+
createTime: "2026-10-09T13:38:39.700+0000",
|
|
235
|
+
exceptionMessage: BOOK_ERROR,
|
|
236
|
+
failedActivityId: "book",
|
|
237
|
+
},
|
|
238
|
+
],
|
|
239
|
+
incidents: [
|
|
240
|
+
{
|
|
241
|
+
id: "inc-1",
|
|
242
|
+
rootCauseIncidentId: "inc-1",
|
|
243
|
+
causeIncidentId: "inc-1",
|
|
244
|
+
incidentType: "failedJob",
|
|
245
|
+
activityId: "book",
|
|
246
|
+
failedActivityId: "book",
|
|
247
|
+
processInstanceId: P,
|
|
248
|
+
processDefinitionId: PARENT_DEF,
|
|
249
|
+
configuration: "job-book",
|
|
250
|
+
incidentMessage: BOOK_ERROR,
|
|
251
|
+
incidentTimestamp: "2026-10-09T13:38:39.877+0000",
|
|
252
|
+
annotation: null,
|
|
253
|
+
},
|
|
254
|
+
],
|
|
255
|
+
causes: new Map([
|
|
256
|
+
[
|
|
257
|
+
"inc-1",
|
|
258
|
+
{ rootCause: "PropertyNotFoundException: Cannot resolve identifier 'missingBean'" },
|
|
259
|
+
],
|
|
260
|
+
]),
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
/** Waiting at the receive task `wait-signal` (no message): an `other` wait state. */
|
|
264
|
+
export function waitSignalStage() {
|
|
265
|
+
return activeData({
|
|
266
|
+
activityTrees: [
|
|
267
|
+
activityTree(P, PARENT_DEF, [
|
|
268
|
+
activity("wait-signal:ai-6", "wait-signal", "receiveTask", [P]),
|
|
269
|
+
]),
|
|
270
|
+
],
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
/** The instance completed: no runtime, the history record and its timeline. */
|
|
274
|
+
export function endedStage() {
|
|
275
|
+
const active = omit(activeData(), "runtime");
|
|
276
|
+
return {
|
|
277
|
+
...active,
|
|
278
|
+
history: {
|
|
279
|
+
...historyDto,
|
|
280
|
+
endTime: "2026-10-09T13:38:58.766+0000",
|
|
281
|
+
durationInMillis: 43336,
|
|
282
|
+
state: "COMPLETED",
|
|
283
|
+
},
|
|
284
|
+
tree: [],
|
|
285
|
+
activityTrees: [],
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
//# sourceMappingURL=fixture.js.map
|