@t4h.framework/core 0.11.0 → 0.13.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/.ai/skills/framework-core/SKILL.md +5 -7
- package/.ai/skills/framework-workflow-creation/SKILL.md +4 -6
- package/.ai/skills/framework-workflow-testing/SKILL.md +1 -9
- package/CHANGELOG.md +68 -0
- package/README.md +77 -8
- package/dist/core.d.ts +2 -1
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +2 -1
- package/dist/core.js.map +1 -1
- package/dist/exceptions/AsyncActivityCallbackException.d.ts +13 -0
- package/dist/exceptions/AsyncActivityCallbackException.d.ts.map +1 -0
- package/dist/exceptions/AsyncActivityCallbackException.js +20 -0
- package/dist/exceptions/AsyncActivityCallbackException.js.map +1 -0
- package/dist/models/AsyncActivity.d.ts +2 -0
- package/dist/models/AsyncActivity.d.ts.map +1 -1
- package/dist/models/AsyncActivity.js.map +1 -1
- package/dist/models/AsyncActivityAdvanceResult.d.ts +3 -1
- package/dist/models/AsyncActivityAdvanceResult.d.ts.map +1 -1
- package/dist/models/AsyncActivityAdvanceResult.js +3 -1
- package/dist/models/AsyncActivityAdvanceResult.js.map +1 -1
- package/dist/models/AsyncActivityAwaitable.d.ts +1 -1
- package/dist/models/AsyncActivityAwaitable.d.ts.map +1 -1
- package/dist/models/AsyncActivityAwaitable.js +0 -2
- package/dist/models/AsyncActivityAwaitable.js.map +1 -1
- package/dist/models/History.d.ts +2 -17
- package/dist/models/History.d.ts.map +1 -1
- package/dist/models/History.js +8 -26
- package/dist/models/History.js.map +1 -1
- package/dist/models/Logger.d.ts.map +1 -1
- package/dist/models/Logger.js +1 -2
- package/dist/models/Logger.js.map +1 -1
- package/dist/testing/TestClock.d.ts.map +1 -1
- package/dist/testing/TestClock.js +35 -6
- package/dist/testing/TestClock.js.map +1 -1
- package/dist/testing/TestWorkflowEnvironment.d.ts.map +1 -1
- package/dist/testing/TestWorkflowEnvironment.js +4 -6
- package/dist/testing/TestWorkflowEnvironment.js.map +1 -1
- package/dist/testing/tools/resolve-activity.d.ts.map +1 -1
- package/dist/testing/tools/resolve-activity.js +1 -4
- package/dist/testing/tools/resolve-activity.js.map +1 -1
- package/dist/testing/tools/resolve-async-activity.d.ts +2 -3
- package/dist/testing/tools/resolve-async-activity.d.ts.map +1 -1
- package/dist/testing/tools/resolve-async-activity.js +36 -17
- package/dist/testing/tools/resolve-async-activity.js.map +1 -1
- package/dist/testing/tools/run-workflow-ticks.d.ts.map +1 -1
- package/dist/testing/tools/run-workflow-ticks.js +0 -6
- package/dist/testing/tools/run-workflow-ticks.js.map +1 -1
- package/dist/testing/tools/run-workflow.d.ts +0 -4
- package/dist/testing/tools/run-workflow.d.ts.map +1 -1
- package/dist/testing/tools/run-workflow.js +7 -17
- package/dist/testing/tools/run-workflow.js.map +1 -1
- package/dist/tools/AsyncActivityCallback.d.ts +32 -0
- package/dist/tools/AsyncActivityCallback.d.ts.map +1 -0
- package/dist/tools/AsyncActivityCallback.js +137 -0
- package/dist/tools/AsyncActivityCallback.js.map +1 -0
- package/dist/tools/Internals.d.ts +0 -2
- package/dist/tools/Internals.d.ts.map +1 -1
- package/dist/tools/Internals.js +1 -5
- package/dist/tools/Internals.js.map +1 -1
- package/package.json +1 -1
- package/dist/exceptions/TimerNotAllowedException.d.ts +0 -5
- package/dist/exceptions/TimerNotAllowedException.d.ts.map +0 -1
- package/dist/exceptions/TimerNotAllowedException.js +0 -9
- package/dist/exceptions/TimerNotAllowedException.js.map +0 -1
- package/dist/tools/Deterministic.d.ts +0 -7
- package/dist/tools/Deterministic.d.ts.map +0 -1
- package/dist/tools/Deterministic.js +0 -107
- package/dist/tools/Deterministic.js.map +0 -1
- package/dist/tools/clock.d.ts +0 -3
- package/dist/tools/clock.d.ts.map +0 -1
- package/dist/tools/clock.js +0 -11
- package/dist/tools/clock.js.map +0 -1
- package/dist/tools/random.d.ts +0 -3
- package/dist/tools/random.d.ts.map +0 -1
- package/dist/tools/random.js +0 -29
- package/dist/tools/random.js.map +0 -1
package/dist/models/History.js
CHANGED
|
@@ -2,8 +2,8 @@ import { AsyncLocalStorage } from 'node:async_hooks';
|
|
|
2
2
|
import { uuidv7 } from 'uuidv7';
|
|
3
3
|
import {} from './Activity.js';
|
|
4
4
|
import { AsyncActivity } from './AsyncActivity.js';
|
|
5
|
+
import { AsyncActivityAwaitable } from './AsyncActivityAwaitable.js';
|
|
5
6
|
import { PushActivity } from './PushActivity.js';
|
|
6
|
-
import { Deterministic } from '../tools/Deterministic.js';
|
|
7
7
|
export var History;
|
|
8
8
|
(function (History) {
|
|
9
9
|
const storage = new AsyncLocalStorage();
|
|
@@ -12,18 +12,17 @@ export var History;
|
|
|
12
12
|
}
|
|
13
13
|
History.bind = bind;
|
|
14
14
|
async function reconciler(Activity, ...args) {
|
|
15
|
-
const
|
|
16
|
-
if (!
|
|
15
|
+
const history = storage.getStore();
|
|
16
|
+
if (!history)
|
|
17
17
|
throw new Error('No activities in storage');
|
|
18
|
-
const value =
|
|
18
|
+
const value = history.shift();
|
|
19
19
|
const activity = new Activity();
|
|
20
20
|
if (!value) {
|
|
21
21
|
activity.id = uuidv7();
|
|
22
|
-
const input = await
|
|
22
|
+
const input = await activity.toInput(...args);
|
|
23
23
|
throw new PushActivity(activity, input);
|
|
24
24
|
}
|
|
25
25
|
activity.id = value.id;
|
|
26
|
-
advanceClock(value.createdAt);
|
|
27
26
|
if (activity instanceof AsyncActivity) {
|
|
28
27
|
if (value.type !== 'async')
|
|
29
28
|
throw new Error('Invalid history item type');
|
|
@@ -37,28 +36,11 @@ export var History;
|
|
|
37
36
|
const store = storage.getStore();
|
|
38
37
|
if (!store)
|
|
39
38
|
return false;
|
|
40
|
-
return store.
|
|
39
|
+
return store.length > 0;
|
|
41
40
|
}
|
|
42
41
|
History.isReplaying = isReplaying;
|
|
43
|
-
function
|
|
44
|
-
return storage.
|
|
45
|
-
}
|
|
46
|
-
History.peek = peek;
|
|
47
|
-
function advanceClock(at) {
|
|
48
|
-
const store = storage.getStore();
|
|
49
|
-
if (!store || at === undefined)
|
|
50
|
-
return;
|
|
51
|
-
store.clock = Math.max(store.clock, at);
|
|
52
|
-
}
|
|
53
|
-
History.advanceClock = advanceClock;
|
|
54
|
-
function run(options, fn) {
|
|
55
|
-
Deterministic.install();
|
|
56
|
-
return storage.run({
|
|
57
|
-
items: options.history.slice(),
|
|
58
|
-
seed: options.seed,
|
|
59
|
-
clock: options.createdAt,
|
|
60
|
-
randomCalls: 0,
|
|
61
|
-
}, fn);
|
|
42
|
+
function run(history, fn) {
|
|
43
|
+
return storage.run(history.slice(), () => fn());
|
|
62
44
|
}
|
|
63
45
|
History.run = run;
|
|
64
46
|
})(History || (History = {}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"History.js","sourceRoot":"","sources":["../../src/models/History.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAiB,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAyB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"History.js","sourceRoot":"","sources":["../../src/models/History.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAiB,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAyB,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAoBhD,MAAM,KAAW,OAAO,CAuDvB;AAvDD,WAAiB,OAAO;IAKtB,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAiB,CAAA;IAEtD,SAAgB,IAAI,CAAqB,QAAqB;QAC5D,OAAO,CAAC,GAAG,IAAsB,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAA;IACrE,CAAC;IAFe,YAAI,OAEnB,CAAA;IAEM,KAAK,UAAU,UAAU,CAC9B,QAAqB,EACrB,GAAG,IAAsB;QAEzB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QAElC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAEzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAA;QAE7B,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAE/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,CAAA;YAEtB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;YAE7C,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACzC,CAAC;QAED,QAAQ,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAA;QAEtB,IAAI,QAAQ,YAAY,aAAa,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;YAExE,OAAO,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAwB,CAAA;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAE3B,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,IAAI,CAAwB,CAAA;IAClE,CAAC;IA/BqB,kBAAU,aA+B/B,CAAA;IAED,SAAgB,WAAW;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QAEhC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QAExB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;IACzB,CAAC;IANe,mBAAW,cAM1B,CAAA;IAED,SAAgB,GAAG,CAAI,OAA+B,EAAE,EAAW;QACjE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACjD,CAAC;IAFe,WAAG,MAElB,CAAA;AACH,CAAC,EAvDgB,OAAO,KAAP,OAAO,QAuDvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/models/Logger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/models/Logger.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAElE,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,QAAQ,CAAA;IACf,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;CACX;AAMD,yBAAiB,MAAM,CAAC;IAetB,SAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,KAI9C;CAuBF"}
|
package/dist/models/Logger.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
2
|
import { History } from './History.js';
|
|
3
|
-
import { Deterministic } from '../tools/Deterministic.js';
|
|
4
3
|
export var Logger;
|
|
5
4
|
(function (Logger) {
|
|
6
5
|
const storage = new AsyncLocalStorage();
|
|
@@ -32,7 +31,7 @@ export var Logger;
|
|
|
32
31
|
return original[level](...args);
|
|
33
32
|
if (History.isReplaying())
|
|
34
33
|
return;
|
|
35
|
-
context.logs.push({ level, args, at:
|
|
34
|
+
context.logs.push({ level, args, at: Date.now() });
|
|
36
35
|
original[level](...args);
|
|
37
36
|
}
|
|
38
37
|
})(Logger || (Logger = {}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/models/Logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../src/models/Logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AActC,MAAM,KAAW,MAAM,CA0CtB;AA1CD,WAAiB,MAAM;IACrB,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAiB,CAAA;IAEtD,MAAM,MAAM,GAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IAE7E,MAAM,QAAQ,GAAmD;QAC/D,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QAClC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;KACnC,CAAA;IAED,IAAI,aAAa,GAAG,KAAK,CAAA;IAEzB,SAAgB,GAAG,CAAI,IAAW,EAAE,EAAW;QAC7C,gBAAgB,EAAE,CAAA;QAElB,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;IAClC,CAAC;IAJe,UAAG,MAIlB,CAAA;IAED,SAAS,gBAAgB;QACvB,IAAI,aAAa;YAAE,OAAM;QAEzB,aAAa,GAAG,IAAI,CAAA;QAEpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;IAED,SAAS,MAAM,CAAC,KAAe,EAAE,IAAe;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QAElC,IAAI,CAAC,OAAO;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QAE7C,IAAI,OAAO,CAAC,WAAW,EAAE;YAAE,OAAM;QAEjC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAElD,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC,EA1CgB,MAAM,KAAN,MAAM,QA0CtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestClock.d.ts","sourceRoot":"","sources":["../../src/testing/TestClock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TestClock.d.ts","sourceRoot":"","sources":["../../src/testing/TestClock.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;CACpB;AAwBD,qBAAa,SAAS;WACN,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;WA+BpD,QAAQ,IAAI,OAAO;WAInB,GAAG,IAAI,MAAM;WAIb,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;WAWzB,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;WAW7B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAGtC"}
|
|
@@ -1,20 +1,49 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
-
import { Deterministic } from '../tools/Deterministic.js';
|
|
3
2
|
const storage = new AsyncLocalStorage();
|
|
3
|
+
const OriginalDate = globalThis.Date;
|
|
4
|
+
function createPatchedDateConstructor() {
|
|
5
|
+
return class extends OriginalDate {
|
|
6
|
+
constructor(...args) {
|
|
7
|
+
if (args.length === 0) {
|
|
8
|
+
super(TestClock.now());
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
super(...args);
|
|
12
|
+
}
|
|
13
|
+
static now() {
|
|
14
|
+
return TestClock.now();
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
4
18
|
export class TestClock {
|
|
5
19
|
static run(options, fn) {
|
|
6
|
-
Deterministic.install();
|
|
7
|
-
Deterministic.useHostClock(() => storage.getStore()?.now);
|
|
8
20
|
const now = options.now instanceof Date
|
|
9
21
|
? options.now.getTime()
|
|
10
|
-
: (options.now ??
|
|
11
|
-
return storage.run({ now },
|
|
22
|
+
: (options.now ?? OriginalDate.now());
|
|
23
|
+
return storage.run({ now }, () => {
|
|
24
|
+
const PatchedDate = createPatchedDateConstructor();
|
|
25
|
+
globalThis.Date = PatchedDate;
|
|
26
|
+
const finish = () => {
|
|
27
|
+
globalThis.Date = OriginalDate;
|
|
28
|
+
};
|
|
29
|
+
try {
|
|
30
|
+
const result = fn();
|
|
31
|
+
if (result instanceof Promise)
|
|
32
|
+
return result.finally(finish);
|
|
33
|
+
finish();
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
finish();
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
12
41
|
}
|
|
13
42
|
static isActive() {
|
|
14
43
|
return storage.getStore() !== undefined;
|
|
15
44
|
}
|
|
16
45
|
static now() {
|
|
17
|
-
return storage.getStore()?.now ??
|
|
46
|
+
return storage.getStore()?.now ?? OriginalDate.now();
|
|
18
47
|
}
|
|
19
48
|
static advance(ms) {
|
|
20
49
|
const state = storage.getStore();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestClock.js","sourceRoot":"","sources":["../../src/testing/TestClock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"TestClock.js","sourceRoot":"","sources":["../../src/testing/TestClock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAUpD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAkB,CAAA;AAEvD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAA;AAEpC,SAAS,4BAA4B;IACnC,OAAO,KAAM,SAAQ,YAAY;QAC/B,YAAY,GAAG,IAAmC;YAChD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAA;gBAEtB,OAAM;YACR,CAAC;YAED,KAAK,CAAC,GAAI,IAAmD,CAAC,CAAA;QAChE,CAAC;QAEM,MAAM,CAAC,GAAG;YACf,OAAO,SAAS,CAAC,GAAG,EAAE,CAAA;QACxB,CAAC;KACiB,CAAA;AACtB,CAAC;AAED,MAAM,OAAO,SAAS;IACb,MAAM,CAAC,GAAG,CAAI,OAA4B,EAAE,EAAW;QAC5D,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,YAAY,IAAI;YACzB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;YACvB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC,CAAA;QAEzC,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE;YAC/B,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAA;YAElD,UAAU,CAAC,IAAI,GAAG,WAAW,CAAA;YAE7B,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,UAAU,CAAC,IAAI,GAAG,YAAY,CAAA;YAChC,CAAC,CAAA;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,EAAE,EAAE,CAAA;gBAEnB,IAAI,MAAM,YAAY,OAAO;oBAAE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAM,CAAA;gBAEjE,MAAM,EAAE,CAAA;gBAER,OAAO,MAAM,CAAA;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,EAAE,CAAA;gBAER,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,MAAM,CAAC,QAAQ;QACpB,OAAO,OAAO,CAAC,QAAQ,EAAE,KAAK,SAAS,CAAA;IACzC,CAAC;IAEM,MAAM,CAAC,GAAG;QACf,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,CAAA;IACtD,CAAC;IAEM,MAAM,CAAC,OAAO,CAAC,EAAU;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QAEhC,IAAI,CAAC,KAAK;YACR,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAA;QAEH,KAAK,CAAC,GAAG,IAAI,EAAE,CAAA;IACjB,CAAC;IAEM,MAAM,CAAC,GAAG,CAAC,GAAkB;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QAEhC,IAAI,CAAC,KAAK;YACR,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAA;QAEH,KAAK,CAAC,GAAG,GAAG,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;IACvD,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,EAAU;QAC5B,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestWorkflowEnvironment.d.ts","sourceRoot":"","sources":["../../src/testing/TestWorkflowEnvironment.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TestWorkflowEnvironment.d.ts","sourceRoot":"","sources":["../../src/testing/TestWorkflowEnvironment.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,WAAW,8BAA8B;IAC7C,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAA;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,MAAM,WAAW,qCAAqC;IACpD,MAAM,CAAC,EAAE,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAA;IACtC,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACjB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;CACtC;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,OAAO,CAAC,GAAG,CAAY;IAEvB,OAAO;WASO,MAAM,CAClB,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB;IAI1B,SAAgB,KAAK;;sBAGL,MAAM;mBAMT,IAAI,GAAG,MAAM;MAKzB;IAEY,OAAO,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAC/C,QAAQ,EAAE,CAAC,EACX,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,OAAO,GAAE,qCAA0C;YAgCvC,qBAAqB;CAwBpC"}
|
|
@@ -2,7 +2,7 @@ import { isDeepStrictEqual } from 'node:util';
|
|
|
2
2
|
import { NonDeterministicWorkflowError } from './exceptions/NonDeterministicWorkflowError.js';
|
|
3
3
|
import { TestClock } from './TestClock.js';
|
|
4
4
|
import { clone } from './tools/clone.js';
|
|
5
|
-
import { runWorkflow
|
|
5
|
+
import { runWorkflow } from './tools/run-workflow.js';
|
|
6
6
|
import { Internals } from '../tools/Internals.js';
|
|
7
7
|
export class TestWorkflowEnvironment {
|
|
8
8
|
resolveActivityTimeouts = true;
|
|
@@ -44,21 +44,19 @@ export class TestWorkflowEnvironment {
|
|
|
44
44
|
const result = await runWorkflow(workflow, input, runWorkflowOptions);
|
|
45
45
|
if (result.clockNow !== undefined)
|
|
46
46
|
this.now = result.clockNow;
|
|
47
|
-
await this.assertWorkflowReplays(workflow, input, result, runWorkflowOptions);
|
|
47
|
+
await this.assertWorkflowReplays(workflow, input, result.output, runWorkflowOptions);
|
|
48
48
|
return result.output;
|
|
49
49
|
}
|
|
50
|
-
async assertWorkflowReplays(workflow, input,
|
|
50
|
+
async assertWorkflowReplays(workflow, input, output, context) {
|
|
51
51
|
const history = await clone(context.history);
|
|
52
52
|
const replay = await TestClock.run({ now: this.now }, () => Internals.runWorkflow(workflow, {
|
|
53
|
-
id: result.seed,
|
|
54
|
-
createdAt: result.createdAt,
|
|
55
53
|
input,
|
|
56
54
|
claims: context.claims,
|
|
57
55
|
env: context.env,
|
|
58
56
|
history,
|
|
59
57
|
logs: [],
|
|
60
58
|
}));
|
|
61
|
-
if (isDeepStrictEqual(
|
|
59
|
+
if (isDeepStrictEqual(output, replay))
|
|
62
60
|
return;
|
|
63
61
|
throw new NonDeterministicWorkflowError('Replay from recorded history produced a different workflow output.');
|
|
64
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestWorkflowEnvironment.js","sourceRoot":"","sources":["../../src/testing/TestWorkflowEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAA;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,
|
|
1
|
+
{"version":3,"file":"TestWorkflowEnvironment.js","sourceRoot":"","sources":["../../src/testing/TestWorkflowEnvironment.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-activity.d.ts","sourceRoot":"","sources":["../../../src/testing/tools/resolve-activity.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,YAAY,EAElB,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"resolve-activity.d.ts","sourceRoot":"","sources":["../../../src/testing/tools/resolve-activity.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,SAAS,EACT,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,YAAY,EAElB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,UAAU,sBAAsB;IAC9B,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,KAAK,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9B;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC,EAC5B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,EACjD,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,WAAW,CAAC,CAqCtB"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { resolveAsyncActivity } from './resolve-async-activity.js';
|
|
2
2
|
import { SyncActivity, Internals, AsyncActivity, } from '../../core.js';
|
|
3
|
-
import { TestClock } from '../TestClock.js';
|
|
4
3
|
export async function resolveActivity(push, context, options) {
|
|
5
4
|
const activity = push.activity;
|
|
6
|
-
const createdAt = TestClock.now();
|
|
7
5
|
const activityContext = {
|
|
8
6
|
...context,
|
|
9
7
|
id: activity.id,
|
|
10
8
|
};
|
|
11
9
|
if (activity instanceof SyncActivity) {
|
|
12
10
|
const output = await Internals.runActivity(activity, activityContext, instance => instance.run(push.input));
|
|
13
|
-
return { id: activity.id, type: 'sync', output
|
|
11
|
+
return { id: activity.id, type: 'sync', output };
|
|
14
12
|
}
|
|
15
13
|
if (activity instanceof AsyncActivity) {
|
|
16
14
|
const bootstrap = await Internals.runActivity(activity, activityContext, instance => instance.bootstrap(push.input));
|
|
@@ -18,7 +16,6 @@ export async function resolveActivity(push, context, options) {
|
|
|
18
16
|
...activityContext,
|
|
19
17
|
activity,
|
|
20
18
|
bootstrap,
|
|
21
|
-
createdAt,
|
|
22
19
|
}, push.input, options);
|
|
23
20
|
}
|
|
24
21
|
throw new Error('Unknown activity type');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-activity.js","sourceRoot":"","sources":["../../../src/testing/tools/resolve-activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EACL,YAAY,EACZ,SAAS,EAIT,aAAa,GACd,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"resolve-activity.js","sourceRoot":"","sources":["../../../src/testing/tools/resolve-activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EACL,YAAY,EACZ,SAAS,EAIT,aAAa,GACd,MAAM,eAAe,CAAA;AAQtB,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAA4B,EAC5B,OAAiD,EACjD,OAAgC;IAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAE9B,MAAM,eAAe,GAAiC;QACpD,GAAG,OAAO;QACV,EAAE,EAAE,QAAQ,CAAC,EAAE;KAChB,CAAA;IAED,IAAI,QAAQ,YAAY,YAAY,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CACxC,QAAQ,EACR,eAAe,EACf,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CACrC,CAAA;QAED,OAAO,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAClD,CAAC;IAED,IAAI,QAAQ,YAAY,aAAa,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,WAAW,CAC3C,QAAQ,EACR,eAAe,EACf,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAC3C,CAAA;QAED,OAAO,oBAAoB,CACzB;YACE,GAAG,eAAe;YAClB,QAAQ;YACR,SAAS;SACV,EACD,IAAI,CAAC,KAAK,EACV,OAAO,CACR,CAAA;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;AAC1C,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Internals, type AnyAsyncActivity, type
|
|
1
|
+
import { Internals, type AnyAsyncActivity, type HistoryItem } from '../../core.js';
|
|
2
2
|
import type { MockAsyncActivity } from '../typings/MockAsyncActivity.js';
|
|
3
3
|
interface ResolveAsyncActivityOptions {
|
|
4
4
|
mock?: MockAsyncActivity;
|
|
@@ -9,8 +9,7 @@ interface ResolveAsyncActivityOptions {
|
|
|
9
9
|
interface ResolveAsyncActivityContext extends Internals.ActivityRunContext {
|
|
10
10
|
activity: AnyAsyncActivity;
|
|
11
11
|
bootstrap: unknown;
|
|
12
|
-
createdAt: number;
|
|
13
12
|
}
|
|
14
|
-
export declare function resolveAsyncActivity(context: ResolveAsyncActivityContext, input: unknown, options?: ResolveAsyncActivityOptions): Promise<
|
|
13
|
+
export declare function resolveAsyncActivity(context: ResolveAsyncActivityContext, input: unknown, options?: ResolveAsyncActivityOptions): Promise<HistoryItem>;
|
|
15
14
|
export {};
|
|
16
15
|
//# sourceMappingURL=resolve-async-activity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-async-activity.d.ts","sourceRoot":"","sources":["../../../src/testing/tools/resolve-async-activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,
|
|
1
|
+
{"version":3,"file":"resolve-async-activity.d.ts","sourceRoot":"","sources":["../../../src/testing/tools/resolve-async-activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,SAAS,EACT,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,UAAU,2BAA2B;IACnC,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,KAAK,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9B;AAED,UAAU,2BAA4B,SAAQ,SAAS,CAAC,kBAAkB;IACxE,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,SAAS,EAAE,OAAO,CAAA;CACnB;AA6DD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,EACpC,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,WAAW,CAAC,CAoCtB"}
|
|
@@ -1,38 +1,57 @@
|
|
|
1
1
|
import { AsyncActivityResultFulfilled, AsyncActivityResultPending, AsyncActivityResultRejected, Internals, } from '../../core.js';
|
|
2
|
-
import { TestClock } from '../TestClock.js';
|
|
3
|
-
function settled(context, status, output) {
|
|
4
|
-
return {
|
|
5
|
-
id: context.activity.id,
|
|
6
|
-
type: 'async',
|
|
7
|
-
status,
|
|
8
|
-
output,
|
|
9
|
-
createdAt: context.createdAt,
|
|
10
|
-
settledAt: TestClock.now(),
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
2
|
async function toHistoryItem(context, outcome, pending) {
|
|
14
3
|
if (outcome.status === 'fulfilled')
|
|
15
|
-
return
|
|
4
|
+
return {
|
|
5
|
+
id: context.activity.id,
|
|
6
|
+
type: 'async',
|
|
7
|
+
status: 'fulfilled',
|
|
8
|
+
output: outcome.output,
|
|
9
|
+
};
|
|
16
10
|
if (outcome.status === 'rejected')
|
|
17
|
-
return
|
|
11
|
+
return {
|
|
12
|
+
id: context.activity.id,
|
|
13
|
+
type: 'async',
|
|
14
|
+
status: 'rejected',
|
|
15
|
+
output: outcome.reason,
|
|
16
|
+
};
|
|
18
17
|
if (outcome.status === 'timeout') {
|
|
19
18
|
const onTimeout = context.activity.onTimeout?.bind(context.activity);
|
|
20
19
|
if (!onTimeout)
|
|
21
20
|
throw new Error(`Async activity "${context.activity.constructor.name}" timed out but defines no onTimeout handler`);
|
|
22
21
|
const result = await Internals.runActivity(context.activity, context, () => onTimeout(pending));
|
|
23
22
|
if (result instanceof AsyncActivityResultFulfilled)
|
|
24
|
-
return
|
|
23
|
+
return {
|
|
24
|
+
id: context.activity.id,
|
|
25
|
+
type: 'async',
|
|
26
|
+
status: 'fulfilled',
|
|
27
|
+
output: result.payload,
|
|
28
|
+
};
|
|
25
29
|
if (result instanceof AsyncActivityResultRejected)
|
|
26
|
-
return
|
|
30
|
+
return {
|
|
31
|
+
id: context.activity.id,
|
|
32
|
+
type: 'async',
|
|
33
|
+
status: 'rejected',
|
|
34
|
+
output: result.payload,
|
|
35
|
+
};
|
|
27
36
|
throw new Error(`Async activity "${context.activity.constructor.name}" stayed pending after onTimeout`);
|
|
28
37
|
}
|
|
29
38
|
throw new Error(`Unknown async activity outcome for "${context.activity.constructor.name}"`);
|
|
30
39
|
}
|
|
31
40
|
export async function resolveAsyncActivity(context, input, options) {
|
|
32
41
|
if (context.bootstrap instanceof AsyncActivityResultFulfilled)
|
|
33
|
-
return
|
|
42
|
+
return {
|
|
43
|
+
id: context.activity.id,
|
|
44
|
+
type: 'async',
|
|
45
|
+
status: 'fulfilled',
|
|
46
|
+
output: context.bootstrap.payload,
|
|
47
|
+
};
|
|
34
48
|
if (context.bootstrap instanceof AsyncActivityResultRejected)
|
|
35
|
-
return
|
|
49
|
+
return {
|
|
50
|
+
id: context.activity.id,
|
|
51
|
+
type: 'async',
|
|
52
|
+
status: 'rejected',
|
|
53
|
+
output: context.bootstrap.payload,
|
|
54
|
+
};
|
|
36
55
|
if (!(context.bootstrap instanceof AsyncActivityResultPending))
|
|
37
56
|
throw new Error('Unknown async activity result');
|
|
38
57
|
const name = context.activity.constructor.name;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-async-activity.js","sourceRoot":"","sources":["../../../src/testing/tools/resolve-async-activity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,SAAS,GAGV,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"resolve-async-activity.js","sourceRoot":"","sources":["../../../src/testing/tools/resolve-async-activity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-workflow-ticks.d.ts","sourceRoot":"","sources":["../../../src/testing/tools/run-workflow-ticks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-workflow-ticks.d.ts","sourceRoot":"","sources":["../../../src/testing/tools/run-workflow-ticks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAGL,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,aAAa,EACnB,MAAM,eAAe,CAAA;AAEtB,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,IAAI,EAAE,GAAG,EAAE,CAAA;CACZ;AAED,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EACjE,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,OAAO,EAAE,uBAAuB,gBA8BjC"}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
1
|
import { resolveActivity } from './resolve-activity.js';
|
|
3
2
|
import { Internals, PushActivity, Workflow, } from '../../core.js';
|
|
4
|
-
import { TestClock } from '../TestClock.js';
|
|
5
3
|
export async function runWorkflowTicks(workflow, input, options) {
|
|
6
4
|
const maxTicks = options.maxTicks ?? 10_000;
|
|
7
5
|
const state = { callCount: 0 };
|
|
8
6
|
const { history, logs, claims = [], env = {} } = options;
|
|
9
|
-
const seed = options.seed ?? randomUUID();
|
|
10
|
-
const createdAt = options.createdAt ?? TestClock.now();
|
|
11
7
|
for (let tick = 0; tick < maxTicks; tick++) {
|
|
12
8
|
try {
|
|
13
9
|
return await Internals.runWorkflow(workflow, {
|
|
14
|
-
id: seed,
|
|
15
|
-
createdAt,
|
|
16
10
|
input,
|
|
17
11
|
claims,
|
|
18
12
|
env,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-workflow-ticks.js","sourceRoot":"","sources":["../../../src/testing/tools/run-workflow-ticks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run-workflow-ticks.js","sourceRoot":"","sources":["../../../src/testing/tools/run-workflow-ticks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EACL,SAAS,EACT,YAAY,EACZ,QAAQ,GAIT,MAAM,eAAe,CAAA;AAOtB,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAW,EACX,KAAuB,EACvB,OAAgC;IAEhC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAA;IAC3C,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;IAE9B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,OAAO,CAAA;IAExD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE;gBAC3C,KAAK;gBACL,MAAM;gBACN,GAAG;gBACH,OAAO;gBACP,IAAI;aACL,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,WAAW,YAAY,YAAY,CAAC;gBAAE,MAAM,WAAW,CAAA;YAE7D,MAAM,IAAI,GAAG,MAAM,eAAe,CAChC,WAAW,EACX,EAAE,MAAM,EAAE,GAAG,EAAE,EACf,EAAE,IAAI,EAAE,OAAO,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAC3C,CAAA;YAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,QAAQ,CAAC,CAAA;AACrE,CAAC"}
|
|
@@ -14,16 +14,12 @@ export interface RunWorkflowOptions {
|
|
|
14
14
|
maxTicks?: number;
|
|
15
15
|
clock?: TestClockRunOptions | false;
|
|
16
16
|
resolveActivityTimeouts?: boolean;
|
|
17
|
-
seed?: string;
|
|
18
|
-
createdAt?: number;
|
|
19
17
|
}
|
|
20
18
|
export interface RunWorkflowResult<TOutput = unknown> {
|
|
21
19
|
output: TOutput;
|
|
22
20
|
history: readonly HistoryItem[];
|
|
23
21
|
logs: readonly Log[];
|
|
24
22
|
clockNow?: number;
|
|
25
|
-
seed: string;
|
|
26
|
-
createdAt: number;
|
|
27
23
|
}
|
|
28
24
|
export declare function runWorkflow<T extends Workflow<any, any>>(workflow: T, input: WorkflowInput<T>, options: RunWorkflowOptions): Promise<RunWorkflowResult>;
|
|
29
25
|
//# sourceMappingURL=run-workflow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-workflow.d.ts","sourceRoot":"","sources":["../../../src/testing/tools/run-workflow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-workflow.d.ts","sourceRoot":"","sources":["../../../src/testing/tools/run-workflow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAAa,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAExE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAA;IACrC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAA;IAChB,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAA;IACnC,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,GAAG,OAAO;IAClD,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,SAAS,WAAW,EAAE,CAAA;IAC/B,IAAI,EAAE,SAAS,GAAG,EAAE,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAYD,wBAAsB,WAAW,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAC5D,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAe5B"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
1
|
import { mockAsync } from './mock-async.js';
|
|
3
2
|
import { runWithClock } from './run-with-clock.js';
|
|
4
3
|
import { TestClock } from '../TestClock.js';
|
|
@@ -11,25 +10,16 @@ function resolveMockAsyncActivity(options) {
|
|
|
11
10
|
return undefined;
|
|
12
11
|
}
|
|
13
12
|
export async function runWorkflow(workflow, input, options) {
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const output = await runWorkflowTicks(workflow, input, {
|
|
13
|
+
let clockNow;
|
|
14
|
+
const output = await runWithClock(options.clock, async () => {
|
|
15
|
+
const result = await runWorkflowTicks(workflow, input, {
|
|
18
16
|
...options,
|
|
19
|
-
seed,
|
|
20
|
-
createdAt,
|
|
21
17
|
mockAsyncActivity: resolveMockAsyncActivity(options),
|
|
22
18
|
});
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
if (TestClock.isActive())
|
|
20
|
+
clockNow = TestClock.now();
|
|
21
|
+
return result;
|
|
25
22
|
});
|
|
26
|
-
return {
|
|
27
|
-
output,
|
|
28
|
-
history: options.history,
|
|
29
|
-
logs: options.logs,
|
|
30
|
-
clockNow,
|
|
31
|
-
seed,
|
|
32
|
-
createdAt,
|
|
33
|
-
};
|
|
23
|
+
return { output, history: options.history, logs: options.logs, clockNow };
|
|
34
24
|
}
|
|
35
25
|
//# sourceMappingURL=run-workflow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-workflow.js","sourceRoot":"","sources":["../../../src/testing/tools/run-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run-workflow.js","sourceRoot":"","sources":["../../../src/testing/tools/run-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAMlD,OAAO,EAAE,SAAS,EAA4B,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAqB1D,SAAS,wBAAwB,CAC/B,OAA2B;IAE3B,IAAI,OAAO,CAAC,iBAAiB,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,iBAAiB,CAAA;IAE7E,IAAI,OAAO,CAAC,uBAAuB;QAAE,OAAO,SAAS,EAAE,CAAC,OAAO,EAAE,CAAA;IAEjE,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAW,EACX,KAAuB,EACvB,OAA2B;IAE3B,IAAI,QAA4B,CAAA;IAEhC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE;YACrD,GAAG,OAAO;YACV,iBAAiB,EAAE,wBAAwB,CAAC,OAAO,CAAC;SACrD,CAAC,CAAA;QAEF,IAAI,SAAS,CAAC,QAAQ,EAAE;YAAE,QAAQ,GAAG,SAAS,CAAC,GAAG,EAAE,CAAA;QAEpD,OAAO,MAAM,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC3E,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AsyncActivityCallbackAuth } from '../models/AsyncActivityCallbackAuth.js';
|
|
2
|
+
export declare namespace AsyncActivityCallback {
|
|
3
|
+
type Headers = Record<string, string | string[] | undefined>;
|
|
4
|
+
interface Delivery {
|
|
5
|
+
method: string;
|
|
6
|
+
headers: Headers;
|
|
7
|
+
rawBody: string;
|
|
8
|
+
}
|
|
9
|
+
type Json = string | number | boolean | null | readonly Json[] | {
|
|
10
|
+
readonly [key: string]: Json | undefined;
|
|
11
|
+
};
|
|
12
|
+
interface Event {
|
|
13
|
+
method: string;
|
|
14
|
+
headers: Record<string, string>;
|
|
15
|
+
body: Json | undefined;
|
|
16
|
+
rawBody: string;
|
|
17
|
+
}
|
|
18
|
+
type AuthType = AsyncActivityCallbackAuth['type'];
|
|
19
|
+
type Authorizer<TAuth extends AsyncActivityCallbackAuth = AsyncActivityCallbackAuth> = (auth: TAuth, delivery: Delivery) => boolean | Promise<boolean>;
|
|
20
|
+
type Authorizers = {
|
|
21
|
+
[TAuth in AsyncActivityCallbackAuth as TAuth['type']]?: Authorizer<TAuth>;
|
|
22
|
+
};
|
|
23
|
+
function deriveToken(secret: string, activityId: string): string;
|
|
24
|
+
function isTokenValid(secret: string, activityId: string, token: string): boolean;
|
|
25
|
+
function getHeader(headers: Headers, name: string): string | undefined;
|
|
26
|
+
function getBearerToken(headers: Headers, name?: string): string | undefined;
|
|
27
|
+
function flattenHeaders(headers: Headers): Record<string, string>;
|
|
28
|
+
function parseBody(contentType: string | undefined, rawBody: string): Json | undefined;
|
|
29
|
+
function toEvent(delivery: Delivery): Event;
|
|
30
|
+
function authorize(auth: AsyncActivityCallbackAuth | undefined, delivery: Delivery, authorizers?: Authorizers): Promise<boolean>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=AsyncActivityCallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsyncActivityCallback.d.ts","sourceRoot":"","sources":["../../src/tools/AsyncActivityCallback.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,yBAAyB,EAI1B,MAAM,wCAAwC,CAAA;AAE/C,yBAAiB,qBAAqB,CAAC;IACrC,KAAY,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;IAEnE,UAAiB,QAAQ;QACvB,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,OAAO,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;KAChB;IAED,KAAY,IAAI,GACZ,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,IAAI,EAAE,GACf;QAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;KAAE,CAAA;IAEhD,UAAiB,KAAK;QACpB,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/B,IAAI,EAAE,IAAI,GAAG,SAAS,CAAA;QACtB,OAAO,EAAE,MAAM,CAAA;KAChB;IAED,KAAY,QAAQ,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;IAExD,KAAY,UAAU,CACpB,KAAK,SAAS,yBAAyB,GAAG,yBAAyB,IACjE,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAEnE,KAAY,WAAW,GAAG;SACvB,KAAK,IAAI,yBAAyB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC;KAC1E,CAAA;IAED,SAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAK7D;IAED,SAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,WASd;IAED,SAAgB,SAAS,CACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAYpB;IAID,SAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,IAAI,SAAkB,GACrB,MAAM,GAAG,SAAS,CAMpB;IAED,SAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYvE;IAMD,SAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,GACd,IAAI,GAAG,SAAS,CA2BlB;IAED,SAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,CASjD;IA8DD,SAAsB,SAAS,CAC7B,IAAI,EAAE,yBAAyB,GAAG,SAAS,EAC3C,QAAQ,EAAE,QAAQ,EAClB,WAAW,GAAE,WAAgB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAkBlB;CACF"}
|