@t4h.framework/core 0.7.0 → 0.9.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 +103 -287
- package/.ai/skills/framework-workflow-creation/SKILL.md +108 -60
- package/.ai/skills/framework-workflow-testing/SKILL.md +165 -111
- package/README.md +123 -37
- package/dist/activities/StartWorkflowActivity.d.ts +52 -9
- package/dist/activities/StartWorkflowActivity.d.ts.map +1 -1
- package/dist/activities/StartWorkflowActivity.js +45 -5
- package/dist/activities/StartWorkflowActivity.js.map +1 -1
- package/dist/core.d.ts +2 -0
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -1
- package/dist/models/ContinueAsNew.d.ts +24 -0
- package/dist/models/ContinueAsNew.d.ts.map +1 -0
- package/dist/models/ContinueAsNew.js +28 -0
- package/dist/models/ContinueAsNew.js.map +1 -0
- package/dist/models/ExecutionContext.d.ts +8 -0
- package/dist/models/ExecutionContext.d.ts.map +1 -0
- package/dist/models/ExecutionContext.js +22 -0
- package/dist/models/ExecutionContext.js.map +1 -0
- package/dist/models/WorkflowBatchClaim.d.ts +10 -0
- package/dist/models/WorkflowBatchClaim.d.ts.map +1 -0
- package/dist/models/WorkflowBatchClaim.js +3 -0
- package/dist/models/WorkflowBatchClaim.js.map +1 -0
- package/dist/models/WorkflowBatchRef.d.ts +6 -0
- package/dist/models/WorkflowBatchRef.d.ts.map +1 -0
- package/dist/models/WorkflowBatchRef.js +9 -0
- package/dist/models/WorkflowBatchRef.js.map +1 -0
- package/dist/models/WorkflowRef.d.ts +2 -2
- package/dist/models/WorkflowRef.d.ts.map +1 -1
- package/dist/models/WorkflowRef.js.map +1 -1
- package/dist/testing/ActivityTesting.d.ts +25 -0
- package/dist/testing/ActivityTesting.d.ts.map +1 -0
- package/dist/testing/ActivityTesting.js +74 -0
- package/dist/testing/ActivityTesting.js.map +1 -0
- package/dist/testing/NonDeterministicWorkflowError.d.ts +4 -0
- package/dist/testing/NonDeterministicWorkflowError.d.ts.map +1 -0
- package/dist/testing/NonDeterministicWorkflowError.js +7 -0
- package/dist/testing/NonDeterministicWorkflowError.js.map +1 -0
- package/dist/testing/StrictGuard.d.ts +4 -0
- package/dist/testing/StrictGuard.d.ts.map +1 -0
- package/dist/testing/StrictGuard.js +26 -0
- package/dist/testing/StrictGuard.js.map +1 -0
- package/dist/testing/TestClock.d.ts +12 -0
- package/dist/testing/TestClock.d.ts.map +1 -0
- package/dist/testing/TestClock.js +64 -0
- package/dist/testing/TestClock.js.map +1 -0
- package/dist/testing/TestWorkflowEnvironment.d.ts +27 -0
- package/dist/testing/TestWorkflowEnvironment.d.ts.map +1 -0
- package/dist/testing/TestWorkflowEnvironment.js +64 -0
- package/dist/testing/TestWorkflowEnvironment.js.map +1 -0
- package/dist/testing/WorkflowTesting.d.ts +1 -1
- package/dist/testing/async-activity-results.d.ts +12 -0
- package/dist/testing/async-activity-results.d.ts.map +1 -0
- package/dist/testing/async-activity-results.js +10 -0
- package/dist/testing/async-activity-results.js.map +1 -0
- package/dist/testing/create-mock-claim.d.ts +11 -0
- package/dist/testing/create-mock-claim.d.ts.map +1 -0
- package/dist/testing/create-mock-claim.js +26 -0
- package/dist/testing/create-mock-claim.js.map +1 -0
- package/dist/testing/create-mock-claims.d.ts +13 -0
- package/dist/testing/create-mock-claims.d.ts.map +1 -0
- package/dist/testing/create-mock-claims.js +8 -0
- package/dist/testing/create-mock-claims.js.map +1 -0
- package/dist/testing/create-test-env.d.ts +10 -0
- package/dist/testing/create-test-env.d.ts.map +1 -0
- package/dist/testing/create-test-env.js +7 -0
- package/dist/testing/create-test-env.js.map +1 -0
- package/dist/testing/exceptions/NonDeterministicWorkflowError.d.ts +4 -0
- package/dist/testing/exceptions/NonDeterministicWorkflowError.d.ts.map +1 -0
- package/dist/testing/exceptions/NonDeterministicWorkflowError.js +7 -0
- package/dist/testing/exceptions/NonDeterministicWorkflowError.js.map +1 -0
- package/dist/testing/index.d.ts +8 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +8 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/mock-async.d.ts +48 -0
- package/dist/testing/mock-async.d.ts.map +1 -0
- package/dist/testing/mock-async.js +58 -0
- package/dist/testing/mock-async.js.map +1 -0
- package/dist/testing/outcomes.d.ts +12 -0
- package/dist/testing/outcomes.d.ts.map +1 -0
- package/dist/testing/outcomes.js +10 -0
- package/dist/testing/outcomes.js.map +1 -0
- package/dist/testing/run-workflow.d.ts +22 -21
- package/dist/testing/run-workflow.d.ts.map +1 -1
- package/dist/testing/run-workflow.js +47 -23
- package/dist/testing/run-workflow.js.map +1 -1
- package/dist/testing/tools/clone.d.ts +2 -0
- package/dist/testing/tools/clone.d.ts.map +1 -0
- package/dist/testing/tools/clone.js +42 -0
- package/dist/testing/tools/clone.js.map +1 -0
- package/dist/testing/tools/create-mock-claim.d.ts +5 -0
- package/dist/testing/tools/create-mock-claim.d.ts.map +1 -0
- package/dist/testing/tools/create-mock-claim.js +26 -0
- package/dist/testing/tools/create-mock-claim.js.map +1 -0
- package/dist/testing/tools/create-mock-claims.d.ts +8 -0
- package/dist/testing/tools/create-mock-claims.d.ts.map +1 -0
- package/dist/testing/tools/create-mock-claims.js +5 -0
- package/dist/testing/tools/create-mock-claims.js.map +1 -0
- package/dist/testing/tools/create-test-env.d.ts +4 -0
- package/dist/testing/tools/create-test-env.d.ts.map +1 -0
- package/dist/testing/tools/create-test-env.js +7 -0
- package/dist/testing/tools/create-test-env.js.map +1 -0
- package/dist/testing/tools/mock-async.d.ts +20 -0
- package/dist/testing/tools/mock-async.d.ts.map +1 -0
- package/dist/testing/tools/mock-async.js +57 -0
- package/dist/testing/tools/mock-async.js.map +1 -0
- package/dist/testing/tools/resolve-activity.d.ts +11 -0
- package/dist/testing/tools/resolve-activity.d.ts.map +1 -0
- package/dist/testing/tools/resolve-activity.js +23 -0
- package/dist/testing/tools/resolve-activity.js.map +1 -0
- package/dist/testing/tools/resolve-async-activity.d.ts +15 -0
- package/dist/testing/tools/resolve-async-activity.d.ts.map +1 -0
- package/dist/testing/tools/resolve-async-activity.js +69 -0
- package/dist/testing/tools/resolve-async-activity.js.map +1 -0
- package/dist/testing/tools/run-with-clock.d.ts +3 -0
- package/dist/testing/tools/run-with-clock.d.ts.map +1 -0
- package/dist/testing/tools/run-with-clock.js +7 -0
- package/dist/testing/tools/run-with-clock.js.map +1 -0
- package/dist/testing/tools/run-workflow-ticks.d.ts +8 -0
- package/dist/testing/tools/run-workflow-ticks.d.ts.map +1 -0
- package/dist/testing/tools/run-workflow-ticks.js +26 -0
- package/dist/testing/tools/run-workflow-ticks.js.map +1 -0
- package/dist/testing/tools/run-workflow.d.ts +25 -0
- package/dist/testing/tools/run-workflow.d.ts.map +1 -0
- package/dist/testing/tools/run-workflow.js +25 -0
- package/dist/testing/tools/run-workflow.js.map +1 -0
- package/dist/testing/tools/serializable-clone.d.ts +21 -0
- package/dist/testing/tools/serializable-clone.d.ts.map +1 -0
- package/dist/testing/tools/serializable-clone.js +77 -0
- package/dist/testing/tools/serializable-clone.js.map +1 -0
- package/dist/testing/types.d.ts +19 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing/types.js +2 -0
- package/dist/testing/types.js.map +1 -0
- package/dist/testing/typings/AsyncActivityResult.d.ts +10 -0
- package/dist/testing/typings/AsyncActivityResult.d.ts.map +1 -0
- package/dist/testing/typings/AsyncActivityResult.js +2 -0
- package/dist/testing/typings/AsyncActivityResult.js.map +1 -0
- package/dist/testing/typings/ClaimConstructor.d.ts +2 -0
- package/dist/testing/typings/ClaimConstructor.d.ts.map +1 -0
- package/dist/testing/typings/ClaimConstructor.js +2 -0
- package/dist/testing/typings/ClaimConstructor.js.map +1 -0
- package/dist/testing/typings/MockAsyncActivity.d.ts +10 -0
- package/dist/testing/typings/MockAsyncActivity.d.ts.map +1 -0
- package/dist/testing/typings/MockAsyncActivity.js +2 -0
- package/dist/testing/typings/MockAsyncActivity.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -356,66 +356,152 @@ single process), use the dedicated `testing` entrypoint. It is meant for tests a
|
|
|
356
356
|
local execution only and is not part of the runtime contract.
|
|
357
357
|
|
|
358
358
|
```typescript
|
|
359
|
-
import {
|
|
359
|
+
import {
|
|
360
|
+
TestWorkflowEnvironment,
|
|
361
|
+
mockAsync,
|
|
362
|
+
fulfilled,
|
|
363
|
+
createMockClaims,
|
|
364
|
+
mockClaim,
|
|
365
|
+
} from '@t4h.framework/core/testing'
|
|
360
366
|
|
|
361
|
-
const
|
|
367
|
+
const env = TestWorkflowEnvironment.create({ now: 0 })
|
|
368
|
+
|
|
369
|
+
const output = await env.execute(myWorkflow, input, {
|
|
362
370
|
env: { API_URL: 'https://api.example.com' },
|
|
363
|
-
claims: [
|
|
364
|
-
|
|
365
|
-
],
|
|
366
|
-
mockAsyncActivity: () => ({ status: 'fulfilled', output: true }),
|
|
371
|
+
claims: [{ provide: UserRepositoryClaim, value: new UserRepositoryClaimImpl() }],
|
|
372
|
+
mockAsyncActivity: mockAsync().on(WaitForApprovalActivity, fulfilled(true)),
|
|
367
373
|
})
|
|
368
374
|
```
|
|
369
375
|
|
|
376
|
+
`TestWorkflowEnvironment.create()` options:
|
|
377
|
+
|
|
378
|
+
| Option | Default | Purpose |
|
|
379
|
+
|--------|---------|---------|
|
|
380
|
+
| `now` | `0` | Pins `Date.now()` to this value at run start |
|
|
381
|
+
| `resolveActivityTimeouts` | `true` | Auto-advances clock to each activity's `timeoutAt` and resolves via `onTimeout` |
|
|
382
|
+
|
|
383
|
+
`execute()` options:
|
|
384
|
+
|
|
385
|
+
| Option | Type | Purpose |
|
|
386
|
+
|--------|------|---------|
|
|
387
|
+
| `claims` | `readonly ClaimProvider[]` | Claim implementations |
|
|
388
|
+
| `env` | `Env.Entries` | String env vars |
|
|
389
|
+
| `mockAsyncActivity` | `MockAsyncActivity` | Required when `bootstrap` returns `pending` and `resolveActivityTimeouts` doesn't cover it |
|
|
390
|
+
|
|
391
|
+
**Replay validation is automatic.** After each `execute()`, the environment
|
|
392
|
+
re-runs the workflow from the recorded history and from a fresh tick-by-tick
|
|
393
|
+
replay. A mismatch throws `NonDeterministicWorkflowError`.
|
|
394
|
+
|
|
370
395
|
### Driving async activities
|
|
371
396
|
|
|
372
397
|
The harness runs the real `bootstrap`. If it already settles (`done`/`rejected`),
|
|
373
|
-
that result is honored. If it returns `pending`,
|
|
374
|
-
`
|
|
375
|
-
|
|
398
|
+
that result is honored. If it returns `pending`, the `resolveActivityTimeouts`
|
|
399
|
+
option (default `true`) auto-advances the clock and resolves the activity via its
|
|
400
|
+
real `onTimeout` handler. When `resolveActivityTimeouts` is false or the activity
|
|
401
|
+
has no `timeoutAt`, you must provide `mockAsyncActivity`.
|
|
376
402
|
|
|
377
|
-
|
|
403
|
+
Use the `mockAsync()` builder to declare outcomes per activity type:
|
|
378
404
|
|
|
379
405
|
```typescript
|
|
380
|
-
|
|
381
|
-
|
|
406
|
+
import { mockAsync, fulfilled, rejected, timeout } from '@t4h.framework/core/testing'
|
|
407
|
+
|
|
408
|
+
// Static outcome per activity type
|
|
409
|
+
mockAsyncActivity: mockAsync()
|
|
410
|
+
.on(WaitForApprovalActivity, fulfilled(true))
|
|
411
|
+
.on(EmailActivity, fulfilled())
|
|
412
|
+
|
|
413
|
+
// Sequential outcomes per type (per-type call count)
|
|
414
|
+
mockAsyncActivity: mockAsync()
|
|
415
|
+
.on(WaitForApprovalActivity, [rejected(new Error('transient')), fulfilled(true)])
|
|
416
|
+
|
|
417
|
+
// Callback with per-type callCount
|
|
418
|
+
mockAsyncActivity: mockAsync()
|
|
419
|
+
.on(WaitForApprovalActivity, (activity, { callCount }) =>
|
|
420
|
+
callCount === 0 ? rejected() : fulfilled(true),
|
|
421
|
+
)
|
|
422
|
+
|
|
423
|
+
// Auto-resolve timeoutAt-based activities (e.g. SleepActivity)
|
|
424
|
+
mockAsyncActivity: mockAsync()
|
|
425
|
+
.on(WaitForApprovalActivity, fulfilled(true))
|
|
426
|
+
.timeout()
|
|
427
|
+
|
|
428
|
+
// Fallback for types not explicitly registered
|
|
429
|
+
mockAsyncActivity: mockAsync()
|
|
430
|
+
.on(WaitForApprovalActivity, fulfilled(true))
|
|
431
|
+
.fallback(() => timeout())
|
|
432
|
+
```
|
|
382
433
|
|
|
383
|
-
|
|
384
|
-
mockAsyncActivity: () => ({ status: 'rejected', reason: 'denied' })
|
|
434
|
+
Outcome helpers:
|
|
385
435
|
|
|
386
|
-
|
|
387
|
-
|
|
436
|
+
```typescript
|
|
437
|
+
fulfilled(output?) // { status: 'fulfilled', output }
|
|
438
|
+
rejected(reason?) // { status: 'rejected', reason }
|
|
439
|
+
timeout() // { status: 'timeout' } — runs the activity's real onTimeout()
|
|
388
440
|
```
|
|
389
441
|
|
|
390
|
-
|
|
391
|
-
|
|
442
|
+
### Mock claims
|
|
443
|
+
|
|
444
|
+
Use `mockClaim` and `createMockClaims` to build typed claim providers without
|
|
445
|
+
manual casts:
|
|
392
446
|
|
|
393
447
|
```typescript
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
]
|
|
448
|
+
import { createMockClaims, mockClaim } from '@t4h.framework/core/testing'
|
|
449
|
+
import { SftpClaim } from '@t4h.framework/sftp'
|
|
450
|
+
|
|
451
|
+
const list = vi.fn().mockResolvedValue([])
|
|
452
|
+
const claims = createMockClaims([mockClaim(SftpClaim, { list })])
|
|
399
453
|
```
|
|
400
454
|
|
|
401
|
-
|
|
402
|
-
|
|
455
|
+
Unimplemented claim methods throw with a clear error instead of returning
|
|
456
|
+
`undefined`.
|
|
457
|
+
|
|
458
|
+
For ready-made mocks, use each package's testing entrypoint — for example
|
|
459
|
+
`@t4h.framework/sftp/testing`, `@t4h.framework/http/testing`,
|
|
460
|
+
`@t4h.framework/orm/testing`.
|
|
461
|
+
|
|
462
|
+
### Controlling test time
|
|
463
|
+
|
|
464
|
+
The environment exposes a clock that stays synchronized with the pinned
|
|
465
|
+
`Date.now()` across runs:
|
|
403
466
|
|
|
404
467
|
```typescript
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
468
|
+
env.clock.now() // current pinned timestamp (ms)
|
|
469
|
+
env.clock.advance(ms) // advance the pinned clock
|
|
470
|
+
env.clock.set(now) // set clock to a Date | number
|
|
471
|
+
```
|
|
408
472
|
|
|
409
|
-
|
|
473
|
+
For direct clock control outside an environment, use `TestClock`:
|
|
410
474
|
|
|
411
|
-
|
|
412
|
-
}
|
|
475
|
+
```typescript
|
|
476
|
+
import { TestClock } from '@t4h.framework/core/testing'
|
|
477
|
+
|
|
478
|
+
await TestClock.run({ now: 0 }, async () => {
|
|
479
|
+
TestClock.advance(86_400_000) // advance 1 day
|
|
480
|
+
// Date.now() returns the pinned value here
|
|
481
|
+
})
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### Activity-level tests
|
|
485
|
+
|
|
486
|
+
The real `advance` logic is intentionally **not** exercised by `execute()`.
|
|
487
|
+
Test `advance` by calling it directly via `Internals.runActivity`:
|
|
488
|
+
|
|
489
|
+
```typescript
|
|
490
|
+
import { Internals } from '@t4h.framework/core'
|
|
491
|
+
|
|
492
|
+
await Internals.runActivity(
|
|
493
|
+
WaitForApprovalActivity,
|
|
494
|
+
{ env, claims },
|
|
495
|
+
activity => activity.advance({ approved: true }, pendingResult),
|
|
496
|
+
)
|
|
413
497
|
```
|
|
414
498
|
|
|
415
|
-
|
|
416
|
-
`resolveAsyncActivitiesInOrder([...])` from `@t4h.framework/core/testing`.
|
|
499
|
+
### Env helpers
|
|
417
500
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
501
|
+
Use `createTestEnv` to build env overrides:
|
|
502
|
+
|
|
503
|
+
```typescript
|
|
504
|
+
import { createTestEnv } from '@t4h.framework/core/testing'
|
|
505
|
+
|
|
506
|
+
const envEntries = createTestEnv({ API_URL: 'https://example.com' })
|
|
507
|
+
```
|
|
@@ -1,36 +1,79 @@
|
|
|
1
1
|
import Type from 'typebox';
|
|
2
|
+
import type { Binary } from '../core.js';
|
|
2
3
|
import { AsyncActivity } from '../models/AsyncActivity.js';
|
|
3
4
|
import { Claim } from '../models/Claim.js';
|
|
4
5
|
import type { Workflow, WorkflowInput } from '../models/Workflow.js';
|
|
6
|
+
import { WorkflowBatchRef } from '../models/WorkflowBatchRef.js';
|
|
5
7
|
import { WorkflowRef } from '../models/WorkflowRef.js';
|
|
6
8
|
import type { Serializable } from '../typings/Serializable.js';
|
|
7
9
|
declare const schema: Type.TObject<{
|
|
8
10
|
status: Type.TEnum<["fulfilled", "rejected"]>;
|
|
9
11
|
output: Type.TAny;
|
|
10
12
|
}>;
|
|
13
|
+
export declare const workflowBatchSchema: Type.TObject<{
|
|
14
|
+
batch: Type.TString;
|
|
15
|
+
count: Type.TNumber;
|
|
16
|
+
}>;
|
|
17
|
+
type StartManyWorkflowsResult = Type.Static<typeof workflowBatchSchema>;
|
|
11
18
|
export declare abstract class WorkflowClaim {
|
|
12
|
-
abstract start<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow,
|
|
19
|
+
abstract start<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow, parallel?: boolean): Serializable | Promise<Serializable>;
|
|
20
|
+
abstract start<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow, input: WorkflowInput<TWorkflow>, parallel?: boolean): Serializable | Promise<Serializable>;
|
|
21
|
+
abstract startMany<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow | string, inputs: WorkflowInput<TWorkflow>[] | Binary[], parallel?: boolean): Promise<WorkflowBatchRef>;
|
|
13
22
|
}
|
|
14
|
-
|
|
23
|
+
type StartWorkflowActivityInput = {
|
|
24
|
+
input?: Serializable;
|
|
15
25
|
parallel?: boolean;
|
|
16
26
|
};
|
|
27
|
+
type StartWorkflowArgs<TWorkflow extends Workflow<any, any>> = WorkflowInput<TWorkflow> extends undefined ? [parallel?: boolean] : [input: Serializable, parallel?: boolean];
|
|
17
28
|
export declare class StartWorkflowActivity extends AsyncActivity<[
|
|
18
29
|
workflow: Workflow<any, any>,
|
|
19
|
-
|
|
20
|
-
|
|
30
|
+
inputOrParallel?: Serializable | boolean,
|
|
31
|
+
parallel?: boolean
|
|
32
|
+
], StartWorkflowActivityInput, Serializable, WorkflowRef, StartWorkflowActivityInput, typeof schema> {
|
|
21
33
|
readonly claims: Claim<{
|
|
22
34
|
workflow: typeof WorkflowClaim;
|
|
23
35
|
}>;
|
|
24
|
-
bootstrap(input: StartWorkflowActivityInput
|
|
25
|
-
parallel?: boolean;
|
|
26
|
-
}, Type.TObject<{
|
|
36
|
+
bootstrap(input: StartWorkflowActivityInput): Promise<import("../core.js").AsyncActivityResultPending<StartWorkflowActivityInput, Type.TObject<{
|
|
27
37
|
status: Type.TEnum<["fulfilled", "rejected"]>;
|
|
28
38
|
output: Type.TAny;
|
|
29
39
|
}>> | import("../core.js").AsyncActivityResultFulfilled<Serializable>>;
|
|
30
40
|
advance(payload: Type.Static<typeof schema>): import("../core.js").AsyncActivityResultRejected<void | Serializable> | import("../core.js").AsyncActivityResultFulfilled<Serializable>;
|
|
31
|
-
toInput(workflow: Workflow<any, any>,
|
|
41
|
+
toInput(workflow: Workflow<any, any>, inputOrParallel?: Serializable | boolean, maybeParallel?: boolean): Promise<StartWorkflowActivityInput>;
|
|
32
42
|
toOutput(payload: Type.Static<typeof schema>): WorkflowRef;
|
|
33
43
|
}
|
|
34
|
-
export declare function startWorkflow<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow,
|
|
44
|
+
export declare function startWorkflow<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow, ...args: StartWorkflowArgs<TWorkflow>): Promise<import("../core.js").AsyncActivityAwaitable<StartWorkflowActivity>>;
|
|
45
|
+
type StartManyWorkflowsActivityInput = {
|
|
46
|
+
inputs: Serializable[];
|
|
47
|
+
parallel?: boolean;
|
|
48
|
+
batch: string;
|
|
49
|
+
count: number;
|
|
50
|
+
};
|
|
51
|
+
type StartWorkflowManyArgs<TWorkflow extends Workflow<any, any>> = [
|
|
52
|
+
inputs: WorkflowInput<TWorkflow>[],
|
|
53
|
+
parallel?: boolean
|
|
54
|
+
];
|
|
55
|
+
export declare class StartManyWorkflowsActivity extends AsyncActivity<[
|
|
56
|
+
workflow: Workflow<any, any>,
|
|
57
|
+
inputs: Serializable[],
|
|
58
|
+
parallel?: boolean
|
|
59
|
+
], StartManyWorkflowsActivityInput, StartManyWorkflowsResult, WorkflowBatchRef, StartManyWorkflowsActivityInput, typeof workflowBatchSchema> {
|
|
60
|
+
readonly claims: Claim<{
|
|
61
|
+
workflow: typeof WorkflowClaim;
|
|
62
|
+
}>;
|
|
63
|
+
bootstrap(input: StartManyWorkflowsActivityInput): Promise<import("../core.js").AsyncActivityResultPending<StartManyWorkflowsActivityInput, Type.TObject<{
|
|
64
|
+
batch: Type.TString;
|
|
65
|
+
count: Type.TNumber;
|
|
66
|
+
}>> | import("../core.js").AsyncActivityResultFulfilled<{
|
|
67
|
+
batch: string;
|
|
68
|
+
count: number;
|
|
69
|
+
} | undefined>>;
|
|
70
|
+
advance(payload: StartManyWorkflowsResult): import("../core.js").AsyncActivityResultFulfilled<{
|
|
71
|
+
batch: string;
|
|
72
|
+
count: number;
|
|
73
|
+
} | undefined>;
|
|
74
|
+
toInput(workflow: Workflow<any, any>, inputs: Serializable[], parallel?: boolean): Promise<StartManyWorkflowsActivityInput>;
|
|
75
|
+
toOutput(payload: StartManyWorkflowsResult): WorkflowBatchRef;
|
|
76
|
+
}
|
|
77
|
+
export declare function startWorkflowMany<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow, ...args: StartWorkflowManyArgs<TWorkflow>): Promise<import("../core.js").AsyncActivityAwaitable<StartManyWorkflowsActivity>>;
|
|
35
78
|
export {};
|
|
36
79
|
//# sourceMappingURL=StartWorkflowActivity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartWorkflowActivity.d.ts","sourceRoot":"","sources":["../../src/activities/StartWorkflowActivity.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAA;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,QAAA,MAAM,MAAM;;;EAGV,CAAA;AAEF,8BAAsB,aAAa;aACjB,KAAK,CAAC,SAAS,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EACxD,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"StartWorkflowActivity.d.ts","sourceRoot":"","sources":["../../src/activities/StartWorkflowActivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,16 @@ import Type from 'typebox';
|
|
|
2
2
|
import { AsyncActivity } from '../models/AsyncActivity.js';
|
|
3
3
|
import { Claim } from '../models/Claim.js';
|
|
4
4
|
import { History } from '../models/History.js';
|
|
5
|
+
import { WorkflowBatchRef } from '../models/WorkflowBatchRef.js';
|
|
5
6
|
import { WorkflowRef } from '../models/WorkflowRef.js';
|
|
6
7
|
const schema = Type.Object({
|
|
7
8
|
status: Type.Enum(['fulfilled', 'rejected']),
|
|
8
9
|
output: Type.Any(),
|
|
9
10
|
});
|
|
11
|
+
export const workflowBatchSchema = Type.Object({
|
|
12
|
+
batch: Type.String(),
|
|
13
|
+
count: Type.Number(),
|
|
14
|
+
});
|
|
10
15
|
export class WorkflowClaim {
|
|
11
16
|
}
|
|
12
17
|
export class StartWorkflowActivity extends AsyncActivity {
|
|
@@ -25,15 +30,50 @@ export class StartWorkflowActivity extends AsyncActivity {
|
|
|
25
30
|
return this.done(payload);
|
|
26
31
|
return this.rejected(payload);
|
|
27
32
|
}
|
|
28
|
-
async toInput(workflow,
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
async toInput(workflow, inputOrParallel, maybeParallel) {
|
|
34
|
+
const hasSchema = workflow.schema !== null;
|
|
35
|
+
const input = hasSchema
|
|
36
|
+
? inputOrParallel
|
|
37
|
+
: undefined;
|
|
38
|
+
const parallel = hasSchema
|
|
39
|
+
? maybeParallel
|
|
40
|
+
: inputOrParallel;
|
|
41
|
+
if (hasSchema)
|
|
42
|
+
await this.claims.workflow.start(workflow, input, parallel);
|
|
43
|
+
else
|
|
44
|
+
await this.claims.workflow.start(workflow, parallel);
|
|
45
|
+
return { input, parallel };
|
|
31
46
|
}
|
|
32
47
|
toOutput(payload) {
|
|
33
48
|
return new WorkflowRef(payload.status, payload.output);
|
|
34
49
|
}
|
|
35
50
|
}
|
|
36
|
-
export function startWorkflow(workflow,
|
|
37
|
-
return History.reconciler(StartWorkflowActivity, workflow,
|
|
51
|
+
export function startWorkflow(workflow, ...args) {
|
|
52
|
+
return History.reconciler(StartWorkflowActivity, workflow, ...args);
|
|
53
|
+
}
|
|
54
|
+
export class StartManyWorkflowsActivity extends AsyncActivity {
|
|
55
|
+
claims = new Claim({
|
|
56
|
+
workflow: WorkflowClaim,
|
|
57
|
+
});
|
|
58
|
+
async bootstrap(input) {
|
|
59
|
+
if (input.count <= 0 || input.parallel)
|
|
60
|
+
return this.done({ batch: input.batch, count: input.count });
|
|
61
|
+
return this.pending({
|
|
62
|
+
schema: workflowBatchSchema,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
advance(payload) {
|
|
66
|
+
return this.done(payload);
|
|
67
|
+
}
|
|
68
|
+
async toInput(workflow, inputs, parallel) {
|
|
69
|
+
const batch = await this.claims.workflow.startMany(workflow, inputs, parallel);
|
|
70
|
+
return { inputs, parallel, batch: batch.id, count: batch.count };
|
|
71
|
+
}
|
|
72
|
+
toOutput(payload) {
|
|
73
|
+
return new WorkflowBatchRef(payload.batch, payload.count);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export function startWorkflowMany(workflow, ...args) {
|
|
77
|
+
return History.reconciler(StartManyWorkflowsActivity, workflow, ...args);
|
|
38
78
|
}
|
|
39
79
|
//# sourceMappingURL=StartWorkflowActivity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartWorkflowActivity.js","sourceRoot":"","sources":["../../src/activities/StartWorkflowActivity.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"StartWorkflowActivity.js","sourceRoot":"","sources":["../../src/activities/StartWorkflowActivity.ts"],"names":[],"mappings":"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"}
|
package/dist/core.d.ts
CHANGED
|
@@ -18,6 +18,8 @@ export * from './models/PushWaitAsyncActivity.js';
|
|
|
18
18
|
export * from './models/SerializableHelper.js';
|
|
19
19
|
export * from './models/SyncActivity.js';
|
|
20
20
|
export * from './models/Workflow.js';
|
|
21
|
+
export * from './models/WorkflowBatchClaim.js';
|
|
22
|
+
export * from './models/WorkflowBatchRef.js';
|
|
21
23
|
export * from './models/WorkflowRef.js';
|
|
22
24
|
export * from './tools/Internals.js';
|
|
23
25
|
export * from './typings/PromiseLikeType.js';
|
package/dist/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAA;AAErD,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAE9C,cAAc,sBAAsB,CAAA;AACpC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,wCAAwC,CAAA;AACtD,cAAc,oCAAoC,CAAA;AAClD,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AAEvC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,2BAA2B,CAAA"}
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAA;AAErD,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAE9C,cAAc,sBAAsB,CAAA;AACpC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,wCAAwC,CAAA;AACtD,cAAc,oCAAoC,CAAA;AAClD,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AAEvC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,2BAA2B,CAAA"}
|
package/dist/core.js
CHANGED
|
@@ -18,6 +18,8 @@ export * from './models/PushWaitAsyncActivity.js';
|
|
|
18
18
|
export * from './models/SerializableHelper.js';
|
|
19
19
|
export * from './models/SyncActivity.js';
|
|
20
20
|
export * from './models/Workflow.js';
|
|
21
|
+
export * from './models/WorkflowBatchClaim.js';
|
|
22
|
+
export * from './models/WorkflowBatchRef.js';
|
|
21
23
|
export * from './models/WorkflowRef.js';
|
|
22
24
|
export * from './tools/Internals.js';
|
|
23
25
|
export * from './typings/PromiseLikeType.js';
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAA;AAErD,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAE9C,cAAc,sBAAsB,CAAA;AACpC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,wCAAwC,CAAA;AACtD,cAAc,oCAAoC,CAAA;AAClD,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AAEvC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,2BAA2B,CAAA"}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAA;AAErD,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAE9C,cAAc,sBAAsB,CAAA;AACpC,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,wCAAwC,CAAA;AACtD,cAAc,oCAAoC,CAAA;AAClD,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,mCAAmC,CAAA;AACjD,cAAc,gCAAgC,CAAA;AAC9C,cAAc,0BAA0B,CAAA;AACxC,cAAc,sBAAsB,CAAA;AACpC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AAEvC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,2BAA2B,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Serializable } from '../typings/Serializable.js';
|
|
2
|
+
import type { Workflow, WorkflowInput } from './Workflow.js';
|
|
3
|
+
/**
|
|
4
|
+
* Control-flow signal thrown by {@link continueAsNew}. Caught by the runtime
|
|
5
|
+
* loop, which terminates the current workflow run and starts a fresh run of
|
|
6
|
+
* `workflow` with `input` and an empty history. Not an `Error` subclass — it is
|
|
7
|
+
* a normal control-flow signal, like `PushActivity`/`PushWaitAsyncActivity`.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ContinueAsNew {
|
|
10
|
+
readonly workflow: Workflow<any, any>;
|
|
11
|
+
readonly input: Serializable | undefined;
|
|
12
|
+
constructor(workflow: Workflow<any, any>, input: Serializable | undefined);
|
|
13
|
+
}
|
|
14
|
+
export type ContinueAsNewArgs<TWorkflow extends Workflow<any, any>> = WorkflowInput<TWorkflow> extends undefined ? [] : [input: WorkflowInput<TWorkflow>];
|
|
15
|
+
/**
|
|
16
|
+
* Ends the current workflow run and restarts `workflow` with a fresh, empty
|
|
17
|
+
* history, carrying `input` forward as the successor's input. Never returns —
|
|
18
|
+
* it throws a {@link ContinueAsNew} signal that unwinds to the runtime loop.
|
|
19
|
+
*
|
|
20
|
+
* Use it to keep a run's history bounded when iterating over many items: process
|
|
21
|
+
* a batch, then `continueAsNew` with a cursor pointing at the next batch.
|
|
22
|
+
*/
|
|
23
|
+
export declare function continueAsNew<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow, ...args: ContinueAsNewArgs<TWorkflow>): Promise<never>;
|
|
24
|
+
//# sourceMappingURL=ContinueAsNew.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContinueAsNew.d.ts","sourceRoot":"","sources":["../../src/models/ContinueAsNew.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAE5D;;;;;GAKG;AACH,qBAAa,aAAa;aAEN,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;aAC5B,KAAK,EAAE,YAAY,GAAG,SAAS;gBAD/B,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAC5B,KAAK,EAAE,YAAY,GAAG,SAAS;CAElD;AAED,MAAM,MAAM,iBAAiB,CAAC,SAAS,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,IAChE,aAAa,CAAC,SAAS,CAAC,SAAS,SAAS,GACtC,EAAE,GACF,CAAC,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAA;AAEvC;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,SAAS,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAChE,QAAQ,EAAE,SAAS,EACnB,GAAG,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,GACpC,OAAO,CAAC,KAAK,CAAC,CAKhB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Control-flow signal thrown by {@link continueAsNew}. Caught by the runtime
|
|
3
|
+
* loop, which terminates the current workflow run and starts a fresh run of
|
|
4
|
+
* `workflow` with `input` and an empty history. Not an `Error` subclass — it is
|
|
5
|
+
* a normal control-flow signal, like `PushActivity`/`PushWaitAsyncActivity`.
|
|
6
|
+
*/
|
|
7
|
+
export class ContinueAsNew {
|
|
8
|
+
workflow;
|
|
9
|
+
input;
|
|
10
|
+
constructor(workflow, input) {
|
|
11
|
+
this.workflow = workflow;
|
|
12
|
+
this.input = input;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Ends the current workflow run and restarts `workflow` with a fresh, empty
|
|
17
|
+
* history, carrying `input` forward as the successor's input. Never returns —
|
|
18
|
+
* it throws a {@link ContinueAsNew} signal that unwinds to the runtime loop.
|
|
19
|
+
*
|
|
20
|
+
* Use it to keep a run's history bounded when iterating over many items: process
|
|
21
|
+
* a batch, then `continueAsNew` with a cursor pointing at the next batch.
|
|
22
|
+
*/
|
|
23
|
+
export function continueAsNew(workflow, ...args) {
|
|
24
|
+
if (!workflow.id)
|
|
25
|
+
throw new TypeError('Could not continue-as-new a workflow without an id');
|
|
26
|
+
throw new ContinueAsNew(workflow, args[0]);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ContinueAsNew.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContinueAsNew.js","sourceRoot":"","sources":["../../src/models/ContinueAsNew.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IAEN;IACA;IAFlB,YACkB,QAA4B,EAC5B,KAA+B;QAD/B,aAAQ,GAAR,QAAQ,CAAoB;QAC5B,UAAK,GAAL,KAAK,CAA0B;IAC9C,CAAC;CACL;AAOD;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAmB,EACnB,GAAG,IAAkC;IAErC,IAAI,CAAC,QAAQ,CAAC,EAAE;QACd,MAAM,IAAI,SAAS,CAAC,oDAAoD,CAAC,CAAA;IAE3E,MAAM,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAA6B,CAAC,CAAA;AACxE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ExecutionLayer = 'workflow' | 'activity';
|
|
2
|
+
export declare namespace ExecutionContext {
|
|
3
|
+
function run<T>(layer: ExecutionLayer, fn: () => T): T;
|
|
4
|
+
function getLayer(): ExecutionLayer | undefined;
|
|
5
|
+
function isWorkflow(): boolean;
|
|
6
|
+
function isActivity(): boolean;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=ExecutionContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionContext.d.ts","sourceRoot":"","sources":["../../src/models/ExecutionContext.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,UAAU,CAAA;AAQpD,yBAAiB,gBAAgB,CAAC;IAChC,SAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE5D;IAED,SAAgB,QAAQ,IAAI,cAAc,GAAG,SAAS,CAErD;IAED,SAAgB,UAAU,IAAI,OAAO,CAEpC;IAED,SAAgB,UAAU,IAAI,OAAO,CAEpC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
const storage = new AsyncLocalStorage();
|
|
3
|
+
export var ExecutionContext;
|
|
4
|
+
(function (ExecutionContext) {
|
|
5
|
+
function run(layer, fn) {
|
|
6
|
+
return storage.run({ layer }, fn);
|
|
7
|
+
}
|
|
8
|
+
ExecutionContext.run = run;
|
|
9
|
+
function getLayer() {
|
|
10
|
+
return storage.getStore()?.layer;
|
|
11
|
+
}
|
|
12
|
+
ExecutionContext.getLayer = getLayer;
|
|
13
|
+
function isWorkflow() {
|
|
14
|
+
return storage.getStore()?.layer === 'workflow';
|
|
15
|
+
}
|
|
16
|
+
ExecutionContext.isWorkflow = isWorkflow;
|
|
17
|
+
function isActivity() {
|
|
18
|
+
return storage.getStore()?.layer === 'activity';
|
|
19
|
+
}
|
|
20
|
+
ExecutionContext.isActivity = isActivity;
|
|
21
|
+
})(ExecutionContext || (ExecutionContext = {}));
|
|
22
|
+
//# sourceMappingURL=ExecutionContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExecutionContext.js","sourceRoot":"","sources":["../../src/models/ExecutionContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAQpD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAyB,CAAA;AAE9D,MAAM,KAAW,gBAAgB,CAgBhC;AAhBD,WAAiB,gBAAgB;IAC/B,SAAgB,GAAG,CAAI,KAAqB,EAAE,EAAW;QACvD,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;IACnC,CAAC;IAFe,oBAAG,MAElB,CAAA;IAED,SAAgB,QAAQ;QACtB,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAA;IAClC,CAAC;IAFe,yBAAQ,WAEvB,CAAA;IAED,SAAgB,UAAU;QACxB,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,KAAK,UAAU,CAAA;IACjD,CAAC;IAFe,2BAAU,aAEzB,CAAA;IAED,SAAgB,UAAU;QACxB,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,KAAK,UAAU,CAAA;IACjD,CAAC;IAFe,2BAAU,aAEzB,CAAA;AACH,CAAC,EAhBgB,gBAAgB,KAAhB,gBAAgB,QAgBhC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Serializable } from '../typings/Serializable.js';
|
|
2
|
+
export type WorkflowBatchOutput = {
|
|
3
|
+
index: number;
|
|
4
|
+
status: 'fulfilled' | 'rejected';
|
|
5
|
+
output: Serializable;
|
|
6
|
+
};
|
|
7
|
+
export declare abstract class WorkflowBatchClaim {
|
|
8
|
+
abstract outputs(batch: string): AsyncIterable<WorkflowBatchOutput>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=WorkflowBatchClaim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowBatchClaim.d.ts","sourceRoot":"","sources":["../../src/models/WorkflowBatchClaim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,GAAG,UAAU,CAAA;IAChC,MAAM,EAAE,YAAY,CAAA;CACrB,CAAA;AAED,8BAAsB,kBAAkB;aACtB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,mBAAmB,CAAC;CAC3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowBatchClaim.js","sourceRoot":"","sources":["../../src/models/WorkflowBatchClaim.ts"],"names":[],"mappings":"AAQA,MAAM,OAAgB,kBAAkB;CAEvC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowBatchRef.d.ts","sourceRoot":"","sources":["../../src/models/WorkflowBatchRef.ts"],"names":[],"mappings":"AAAA,qBAAa,gBAAgB;aAET,EAAE,EAAE,MAAM;aACV,KAAK,EAAE,MAAM;gBADb,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM;CAEhC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowBatchRef.js","sourceRoot":"","sources":["../../src/models/WorkflowBatchRef.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,gBAAgB;IAET;IACA;IAFlB,YACkB,EAAU,EACV,KAAa;QADb,OAAE,GAAF,EAAE,CAAQ;QACV,UAAK,GAAL,KAAK,CAAQ;IAC5B,CAAC;CACL"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Serializable } from '../typings/Serializable.js';
|
|
2
2
|
export declare class WorkflowRef {
|
|
3
3
|
readonly status: 'fulfilled' | 'rejected';
|
|
4
|
-
readonly output
|
|
5
|
-
constructor(status: 'fulfilled' | 'rejected', output
|
|
4
|
+
readonly output?: Serializable | null;
|
|
5
|
+
constructor(status: 'fulfilled' | 'rejected', output?: Serializable | null);
|
|
6
6
|
}
|
|
7
7
|
//# sourceMappingURL=WorkflowRef.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowRef.d.ts","sourceRoot":"","sources":["../../src/models/WorkflowRef.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,qBAAa,WAAW;aAEJ,MAAM,EAAE,WAAW,GAAG,UAAU;aAChC,MAAM,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"WorkflowRef.d.ts","sourceRoot":"","sources":["../../src/models/WorkflowRef.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,qBAAa,WAAW;aAEJ,MAAM,EAAE,WAAW,GAAG,UAAU;aAChC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI;gBAD5B,MAAM,EAAE,WAAW,GAAG,UAAU,EAChC,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI;CAE/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowRef.js","sourceRoot":"","sources":["../../src/models/WorkflowRef.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IAEJ;IACA;IAFlB,YACkB,MAAgC,EAChC,
|
|
1
|
+
{"version":3,"file":"WorkflowRef.js","sourceRoot":"","sources":["../../src/models/WorkflowRef.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IAEJ;IACA;IAFlB,YACkB,MAAgC,EAChC,MAA4B;QAD5B,WAAM,GAAN,MAAM,CAA0B;QAChC,WAAM,GAAN,MAAM,CAAsB;IAC3C,CAAC;CACL"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AsyncActivityOutcome } from './types.js';
|
|
2
|
+
import type { Activity } from '../models/Activity.js';
|
|
3
|
+
import type { ClaimProvider } from '../models/Claim.js';
|
|
4
|
+
import type { Env } from '../models/Env.js';
|
|
5
|
+
import type { Log } from '../models/Logger.js';
|
|
6
|
+
export interface ActivityTestingAsyncOptions {
|
|
7
|
+
/** Run the real advance handler when bootstrap returns pending. */
|
|
8
|
+
advance?: unknown;
|
|
9
|
+
/** Simulate runtime resolution without calling advance. */
|
|
10
|
+
outcome?: AsyncActivityOutcome;
|
|
11
|
+
}
|
|
12
|
+
export interface ActivityTestingOptions {
|
|
13
|
+
claims?: readonly ClaimProvider<any>[];
|
|
14
|
+
env?: Env.Entries;
|
|
15
|
+
logs?: Log[];
|
|
16
|
+
async?: ActivityTestingAsyncOptions;
|
|
17
|
+
}
|
|
18
|
+
export declare class ActivityTesting {
|
|
19
|
+
static run<T extends Activity>(ActivityClass: Activity.Constructor<T>, args?: Activity.Args<T>, options?: ActivityTestingOptions): Promise<Activity.Output<T>>;
|
|
20
|
+
}
|
|
21
|
+
export declare class AsyncActivityRejectedError extends Error {
|
|
22
|
+
readonly reason: unknown;
|
|
23
|
+
constructor(reason: unknown);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ActivityTesting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityTesting.d.ts","sourceRoot":"","sources":["../../src/testing/ActivityTesting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAUrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAI9C,MAAM,WAAW,2BAA2B;IAC1C,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,oBAAoB,CAAA;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAA;IACtC,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACZ,KAAK,CAAC,EAAE,2BAA2B,CAAA;CACpC;AAED,qBAAa,eAAe;WACN,GAAG,CAAC,CAAC,SAAS,QAAQ,EACxC,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EACtC,IAAI,GAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAqC,EAC1D,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CA6B/B;AAyFD,qBAAa,0BAA2B,SAAQ,KAAK;aACvB,MAAM,EAAE,OAAO;gBAAf,MAAM,EAAE,OAAO;CAQ5C"}
|