@t4h.framework/core 0.11.0 → 0.12.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 +4 -6
- package/.ai/skills/framework-workflow-creation/SKILL.md +4 -6
- package/.ai/skills/framework-workflow-testing/SKILL.md +1 -9
- package/CHANGELOG.md +10 -0
- package/README.md +0 -8
- package/dist/core.d.ts +0 -1
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +0 -1
- package/dist/core.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/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/LICENSE +0 -21
- 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
|
@@ -36,8 +36,7 @@ Node `>=22`. Schemas use TypeBox (`typebox`). See [README.md](../../../README.md
|
|
|
36
36
|
|
|
37
37
|
- **Workflow** — an orchestration entrypoint: a plain async function wrapped in `new Workflow(...)`. It coordinates steps; it does not implement the steps.
|
|
38
38
|
- **App** — registers workflows so the runtime can discover and run them.
|
|
39
|
-
- **Replay & determinism** — the runtime re-
|
|
40
|
-
- **Time & randomness** — inside a workflow, `Date.now()`, `new Date()`, `Math.random()` and `crypto.randomUUID()` are deterministic and safe to use. The clock follows the history: it starts when the run was created and only moves forward as steps are recorded (a step's request time, or the moment an awaited step settled), so it stands still between two steps. Randomness is seeded by the run id. `setTimeout`/`setInterval` throw `TimerNotAllowedException` — use `sleep` to wait.
|
|
39
|
+
- **Replay & determinism** — the runtime may re-run a workflow from its recorded history. Keep the body deterministic: branch on inputs and on the results of the steps you call, never on `Date.now()`, `Math.random()`, or ambient state. Use framework primitives (e.g. `sleep`) when you need time to pass.
|
|
41
40
|
- **env** — configuration values supplied by the runtime; the single source for URLs, tokens, and tenants.
|
|
42
41
|
- **Composition** — external work is performed by calling primitives from the other framework packages inside the workflow body.
|
|
43
42
|
|
|
@@ -168,7 +167,7 @@ const output = await env.execute(workflow, input, {
|
|
|
168
167
|
|
|
169
168
|
| Option | Default | Purpose |
|
|
170
169
|
|--------|---------|---------|
|
|
171
|
-
| `now` | `0` |
|
|
170
|
+
| `now` | `0` | Pins `Date.now()` to this value at run start |
|
|
172
171
|
| `resolveActivityTimeouts` | `true` | Auto-advances the clock through time-based steps (e.g. `sleep`) and resolves them |
|
|
173
172
|
|
|
174
173
|
`execute()` options:
|
|
@@ -202,8 +201,7 @@ Do **not** import `@t4h.framework/core/testing` in production app code.
|
|
|
202
201
|
- Reading `process.env` directly, or reading the raw `env` proxy when the project should declare an `EnvDesign` in `constants/environments.ts`.
|
|
203
202
|
- Inlining URLs/secrets/tenants in workflow code instead of pulling them from the shared `EnvDesign`.
|
|
204
203
|
- Accessing an `EnvDesign` key at module top level (throws — no env storage outside a run); read keys inside the workflow body/functions.
|
|
205
|
-
-
|
|
206
|
-
- Branching on ambient state (`process.env`, module-level mutable variables) or measuring elapsed time between steps — the workflow clock stands still between steps, so such measurements are always `0`.
|
|
204
|
+
- Non-deterministic workflow bodies (`Date.now()`, `Math.random()`, ambient state) — they break replay.
|
|
207
205
|
- Non-`Serializable` workflow input, output, or step values.
|
|
208
206
|
- Duplicate `workflow.id` within an `App`.
|
|
209
207
|
- Importing `@t4h.framework/core/testing` from production code.
|
|
@@ -213,7 +211,7 @@ Do **not** import `@t4h.framework/core/testing` in production app code.
|
|
|
213
211
|
|
|
214
212
|
## Exports
|
|
215
213
|
|
|
216
|
-
**Main (`@t4h.framework/core`):** `Workflow`, `App`, `startWorkflow`, `WorkflowRef`, `env`, `EnvDesign`, `Authorization`, `Binary`, `Serializable
|
|
214
|
+
**Main (`@t4h.framework/core`):** `Workflow`, `App`, `startWorkflow`, `WorkflowRef`, `env`, `EnvDesign`, `Authorization`, `Binary`, `Serializable`.
|
|
217
215
|
|
|
218
216
|
**Testing (`@t4h.framework/core/testing`):** `TestWorkflowEnvironment`, `TestClock`, `createTestEnv`, `createTestEnvEntries`, `NonDeterministicWorkflowError`.
|
|
219
217
|
|
|
@@ -39,7 +39,7 @@ Create workflows that:
|
|
|
39
39
|
| Configuration | `environments.MY_KEY` from a shared `EnvDesign` | `@t4h.framework/core` |
|
|
40
40
|
| Branching / mapping | plain TypeScript | — |
|
|
41
41
|
|
|
42
|
-
Keep the body **deterministic** so it replays safely: branch on inputs and step results, never on
|
|
42
|
+
Keep the body **deterministic** so it replays safely: branch on inputs and step results, never on `Date.now()`, `Math.random()`, or ambient state. Use `sleep` when you need time to pass.
|
|
43
43
|
|
|
44
44
|
## Expected project shape
|
|
45
45
|
|
|
@@ -106,7 +106,7 @@ One `environments` object is the single source of configuration for the whole pr
|
|
|
106
106
|
3. Define workflow metadata with a stable `id`.
|
|
107
107
|
4. Add a `schema` when input validation is needed.
|
|
108
108
|
5. Import all configuration from the shared `EnvDesign` in `constants/environments.ts` — never raw `env` or `process.env`.
|
|
109
|
-
6. Keep the body deterministic so replay produces the same result.
|
|
109
|
+
6. Keep the body deterministic so replay produces the same result.
|
|
110
110
|
7. Obtain a `Binary` from the framework — an HTTP response body, `sftp.get`, `write`, `join` — never by implementing one.
|
|
111
111
|
|
|
112
112
|
## Hard constraints
|
|
@@ -114,9 +114,7 @@ One `environments` object is the single source of configuration for the whole pr
|
|
|
114
114
|
- Do not hardcode URLs, client IDs, client secrets, API keys, tenants, or tokens.
|
|
115
115
|
- Do not initialize third-party clients with inline credentials inside workflow files.
|
|
116
116
|
- Do not read `process.env` or the raw `env` proxy directly — declare configuration in the shared `EnvDesign` (`constants/environments.ts`).
|
|
117
|
-
- Do not call `fetch`/`axios` or other non-framework I/O directly — that breaks replay safety
|
|
118
|
-
- Do not call `setTimeout` / `setInterval` inside a workflow — it throws `TimerNotAllowedException`. Wait with `sleep` from `@t4h.framework/sleep`.
|
|
119
|
-
- Do not measure elapsed time between steps with `Date.now()` — the workflow clock only moves when a step is recorded, so the difference is always `0`.
|
|
117
|
+
- Do not call `fetch`/`axios` or other non-framework I/O directly — that breaks replay safety.
|
|
120
118
|
- **Do not declare a class that extends `Binary`** (`BufferBinary`, `StringBinary`, `stringToBinary` helpers, …). To hand content to a primitive that takes a `Binary` — `sftp.put`, `sftp.append`, an HTTP body — build it with `write` from `@t4h.framework/fs`:
|
|
121
119
|
|
|
122
120
|
```ts
|
|
@@ -153,7 +151,7 @@ Required keys declared in the `EnvDesign` fail fast automatically: accessing an
|
|
|
153
151
|
|
|
154
152
|
### Step 4: make it test-friendly
|
|
155
153
|
|
|
156
|
-
- Keep outputs deterministic
|
|
154
|
+
- Keep outputs deterministic.
|
|
157
155
|
- Avoid hidden global state.
|
|
158
156
|
- Drive external effects through package primitives so tests can supply their providers (see **framework-core** testing and each package's skill).
|
|
159
157
|
|
|
@@ -66,7 +66,7 @@ env.clock.set(now) // set pinned clock to a Date | number
|
|
|
66
66
|
|
|
67
67
|
| Option | Default | Purpose |
|
|
68
68
|
|--------|---------|---------|
|
|
69
|
-
| `now` | `0` |
|
|
69
|
+
| `now` | `0` | Pins `Date.now()` to this value at start |
|
|
70
70
|
| `resolveActivityTimeouts` | `true` | Auto-advances clock to each activity's `timeoutAt` and resolves it via `onTimeout` |
|
|
71
71
|
|
|
72
72
|
`execute()` options:
|
|
@@ -80,14 +80,6 @@ env.clock.set(now) // set pinned clock to a Date | number
|
|
|
80
80
|
After `execute()` returns, the clock is advanced to wherever the run left it.
|
|
81
81
|
Subsequent `env.clock.advance()` calls build on that value between tests.
|
|
82
82
|
|
|
83
|
-
Inside the workflow, `Date.now()` is the history clock, not the virtual clock
|
|
84
|
-
directly: it equals `now` until the first step is recorded, then moves to each
|
|
85
|
-
step's stamp (request time, or settle time for an awaited async step). It never
|
|
86
|
-
moves backwards and stands still between steps. `Math.random()` and
|
|
87
|
-
`crypto.randomUUID()` are seeded by the run and replay identically, so asserting
|
|
88
|
-
on them is safe. A workflow that calls `setTimeout` / `setInterval` rejects with
|
|
89
|
-
`TimerNotAllowedException`.
|
|
90
|
-
|
|
91
83
|
Async activities are resolved in tests through `mockAsyncActivity` (which returns
|
|
92
84
|
a final outcome directly). Workflow tests never drive an activity's internal
|
|
93
85
|
`advance` method — you only assert the workflow's observable output and effects.
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @t4h.framework/core
|
|
2
2
|
|
|
3
|
+
## 0.12.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#165](https://github.com/tech4humans-brasil/framework/pull/165) [`72e08ff`](https://github.com/tech4humans-brasil/framework/commit/72e08ff86e0ce735ef73ccdf33b0dc01cdb8b6f5) Thanks [@gusteycamargo](https://github.com/gusteycamargo)! - Revert deterministic time, randomness and timers in workflow code ([#155](https://github.com/tech4humans-brasil/framework/issues/155)).
|
|
8
|
+
- `Date`, `Math.random`, `crypto.randomUUID` and the timer functions are no longer patched. Workflow code must not call `Date.now()` / `Math.random()`; wait with `@t4h.framework/sleep`.
|
|
9
|
+
- `TimerNotAllowedException` is removed.
|
|
10
|
+
- **Hosts:** `Internals.runWorkflow` no longer takes `id` / `createdAt`, and `HistoryItem` no longer carries `createdAt` / `settledAt`.
|
|
11
|
+
- Testing: `runWorkflow` no longer accepts or returns `seed` / `createdAt`; `TestClock` patches `Date` itself again.
|
|
12
|
+
|
|
3
13
|
## 0.11.0
|
|
4
14
|
|
|
5
15
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -302,8 +302,6 @@ The runtime is responsible for executing workflows and activities by providing t
|
|
|
302
302
|
import { Internals } from '@t4h.framework/core'
|
|
303
303
|
|
|
304
304
|
Internals.runWorkflow(myWorkflow, {
|
|
305
|
-
id: run.id, // seeds Math.random / randomUUID inside the workflow
|
|
306
|
-
createdAt: run.createdAt.getTime(), // where the workflow clock starts
|
|
307
305
|
input: { userId: '123', amount: 100 },
|
|
308
306
|
env: { API_URL: 'https://api.example.com' },
|
|
309
307
|
claims: [
|
|
@@ -346,8 +344,6 @@ Env.run → Claim.run → fn(activity)
|
|
|
346
344
|
|
|
347
345
|
**History** handles reconciliation: when an activity has been executed before, the previous result is returned directly (deterministic replay). When there is no history, the activity runs and the result is stored.
|
|
348
346
|
|
|
349
|
-
**History** also owns the workflow clock. Each `HistoryItem` carries `createdAt` (when the activity was requested) and async items `settledAt` (when they settled); `Date.now()` inside the workflow reads the last of those the replay walked past, starting from the run's `createdAt`. `History.run` also patches `Date`, `Math.random` and `randomUUID` for workflow code and forbids `setTimeout` / `setInterval` there (`TimerNotAllowedException`). Hosts must stamp those fields when building the history.
|
|
350
|
-
|
|
351
347
|
---
|
|
352
348
|
|
|
353
349
|
## Testing
|
|
@@ -482,10 +478,6 @@ await TestClock.run({ now: 0 }, async () => {
|
|
|
482
478
|
})
|
|
483
479
|
```
|
|
484
480
|
|
|
485
|
-
`TestClock` acts as the host clock: activities are stamped with it and the
|
|
486
|
-
workflow reads those stamps back through `Date.now()`, exactly as in
|
|
487
|
-
production.
|
|
488
|
-
|
|
489
481
|
### Activity-level tests
|
|
490
482
|
|
|
491
483
|
The real `advance` logic is intentionally **not** exercised by `execute()`.
|
package/dist/core.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export * from './activities/StartWorkflowActivity.js';
|
|
2
2
|
export * from './exceptions/ActivityException.js';
|
|
3
3
|
export * from './exceptions/ClaimException.js';
|
|
4
|
-
export * from './exceptions/TimerNotAllowedException.js';
|
|
5
4
|
export * from './models/Activity.js';
|
|
6
5
|
export * from './models/Authorization.js';
|
|
7
6
|
export * from './models/App.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;
|
|
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,uCAAuC,CAAA;AACrD,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
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export * from './activities/StartWorkflowActivity.js';
|
|
2
2
|
export * from './exceptions/ActivityException.js';
|
|
3
3
|
export * from './exceptions/ClaimException.js';
|
|
4
|
-
export * from './exceptions/TimerNotAllowedException.js';
|
|
5
4
|
export * from './models/Activity.js';
|
|
6
5
|
export * from './models/Authorization.js';
|
|
7
6
|
export * from './models/App.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;
|
|
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,uCAAuC,CAAA;AACrD,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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Activity } from './Activity.js';
|
|
2
2
|
import type { AnyAsyncActivity } from './AsyncActivity.js';
|
|
3
|
-
import {
|
|
3
|
+
import type { IHistoryItemAsync } from './History.js';
|
|
4
4
|
export declare class AsyncActivityAwaitable<T extends AnyAsyncActivity> {
|
|
5
5
|
private readonly activity;
|
|
6
6
|
private readonly item;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsyncActivityAwaitable.d.ts","sourceRoot":"","sources":["../../src/models/AsyncActivityAwaitable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,
|
|
1
|
+
{"version":3,"file":"AsyncActivityAwaitable.d.ts","sourceRoot":"","sources":["../../src/models/AsyncActivityAwaitable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAGrD,qBAAa,sBAAsB,CAAC,CAAC,SAAS,gBAAgB;IAE1D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,QAAQ,EAAE,CAAC,EACX,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,SAAS,GAAG,EAAE;IAG1B,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAMjD"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {} from './Activity.js';
|
|
2
|
-
import { History } from './History.js';
|
|
3
2
|
import { PushWaitAsyncActivity } from './PushWaitAsyncActivity.js';
|
|
4
3
|
export class AsyncActivityAwaitable {
|
|
5
4
|
activity;
|
|
@@ -13,7 +12,6 @@ export class AsyncActivityAwaitable {
|
|
|
13
12
|
async wait() {
|
|
14
13
|
if (this.item.status === 'pending')
|
|
15
14
|
throw new PushWaitAsyncActivity(this.activity, this.item.timeoutAt);
|
|
16
|
-
History.advanceClock(this.item.settledAt);
|
|
17
15
|
return this.activity.toOutput(this.item.output, ...this.args);
|
|
18
16
|
}
|
|
19
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AsyncActivityAwaitable.js","sourceRoot":"","sources":["../../src/models/AsyncActivityAwaitable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"AsyncActivityAwaitable.js","sourceRoot":"","sources":["../../src/models/AsyncActivityAwaitable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,eAAe,CAAA;AAG7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,MAAM,OAAO,sBAAsB;IAEd;IACA;IACA;IAHnB,YACmB,QAAW,EACX,IAAuB,EACvB,IAAoB;QAFpB,aAAQ,GAAR,QAAQ,CAAG;QACX,SAAI,GAAJ,IAAI,CAAmB;QACvB,SAAI,GAAJ,IAAI,CAAgB;IACpC,CAAC;IAEG,KAAK,CAAC,IAAI;QACf,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;YAChC,MAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAErE,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;CACF"}
|
package/dist/models/History.d.ts
CHANGED
|
@@ -1,40 +1,25 @@
|
|
|
1
1
|
import { type Activity } from './Activity.js';
|
|
2
2
|
import { type AnyAsyncActivity } from './AsyncActivity.js';
|
|
3
|
-
import
|
|
3
|
+
import { AsyncActivityAwaitable } from './AsyncActivityAwaitable.js';
|
|
4
4
|
export type HistoryItemType = 'sync' | 'async';
|
|
5
5
|
interface IHistoryItem<T extends HistoryItemType> {
|
|
6
6
|
id: string;
|
|
7
7
|
type: T;
|
|
8
8
|
output: any;
|
|
9
|
-
createdAt: number;
|
|
10
9
|
}
|
|
11
10
|
export interface IHistoryItemSync extends IHistoryItem<'sync'> {
|
|
12
11
|
}
|
|
13
12
|
export interface IHistoryItemAsync extends IHistoryItem<'async'> {
|
|
14
13
|
status: 'pending' | 'fulfilled' | 'rejected';
|
|
15
14
|
timeoutAt?: Date | null;
|
|
16
|
-
settledAt?: number;
|
|
17
15
|
}
|
|
18
16
|
export type HistoryItem = IHistoryItemSync | IHistoryItemAsync;
|
|
19
|
-
export interface HistoryRunOptions {
|
|
20
|
-
history: readonly HistoryItem[];
|
|
21
|
-
seed: string;
|
|
22
|
-
createdAt: number;
|
|
23
|
-
}
|
|
24
|
-
export interface HistoryStore {
|
|
25
|
-
readonly items: HistoryItem[];
|
|
26
|
-
readonly seed: string;
|
|
27
|
-
clock: number;
|
|
28
|
-
randomCalls: number;
|
|
29
|
-
}
|
|
30
17
|
export declare namespace History {
|
|
31
18
|
type ReconcilerOutput<T extends Activity> = T extends AnyAsyncActivity ? AsyncActivityAwaitable<T> : Activity.Output<T>;
|
|
32
19
|
function bind<T extends Activity>(Activity: new () => T): (...args: Activity.Args<T>) => Promise<ReconcilerOutput<T>>;
|
|
33
20
|
function reconciler<T extends Activity>(Activity: new () => T, ...args: Activity.Args<T>): Promise<ReconcilerOutput<T>>;
|
|
34
21
|
function isReplaying(): boolean;
|
|
35
|
-
function
|
|
36
|
-
function advanceClock(at: number | undefined): void;
|
|
37
|
-
function run<T>(options: HistoryRunOptions, fn: () => T): T;
|
|
22
|
+
function run<T>(history: readonly HistoryItem[], fn: () => T): T;
|
|
38
23
|
}
|
|
39
24
|
export {};
|
|
40
25
|
//# sourceMappingURL=History.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"History.d.ts","sourceRoot":"","sources":["../../src/models/History.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,
|
|
1
|
+
{"version":3,"file":"History.d.ts","sourceRoot":"","sources":["../../src/models/History.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAGpE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,OAAO,CAAA;AAE9C,UAAU,YAAY,CAAC,CAAC,SAAS,eAAe;IAC9C,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,CAAC,CAAA;IACP,MAAM,EAAE,GAAG,CAAA;CACZ;AAGD,MAAM,WAAW,gBAAiB,SAAQ,YAAY,CAAC,MAAM,CAAC;CAAG;AAEjE,MAAM,WAAW,iBAAkB,SAAQ,YAAY,CAAC,OAAO,CAAC;IAC9D,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,CAAA;IAC5C,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,iBAAiB,CAAA;AAE9D,yBAAiB,OAAO,CAAC;IACvB,KAAY,gBAAgB,CAAC,CAAC,SAAS,QAAQ,IAAI,CAAC,SAAS,gBAAgB,GACzE,sBAAsB,CAAC,CAAC,CAAC,GACzB,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAItB,SAAgB,IAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,IACpD,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,kCAClC;IAED,SAAsB,UAAU,CAAC,CAAC,SAAS,QAAQ,EACjD,QAAQ,EAAE,UAAU,CAAC,EACrB,GAAG,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CA4B9B;IAED,SAAgB,WAAW,IAAI,OAAO,CAMrC;IAED,SAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,KAElE;CACF"}
|
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":"AAAA,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,2BAA2B,EAC3B,SAAS,GAGV,MAAM,eAAe,CAAA;AActB,KAAK,UAAU,aAAa,CAC1B,OAAoC,EACpC,OAA4B,EAC5B,OAAmC;IAEnC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW;QAChC,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;YACvB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAA;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU;QAC/B,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;YACvB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAA;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAEpE,IAAI,CAAC,SAAS;YACZ,MAAM,IAAI,KAAK,CACb,mBAAmB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,8CAA8C,CACnG,CAAA;QAEH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CACzE,SAAS,CAAC,OAAO,CAAC,CACnB,CAAA;QAED,IAAI,MAAM,YAAY,4BAA4B;YAChD,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACvB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,MAAM,CAAC,OAAO;aACvB,CAAA;QAEH,IAAI,MAAM,YAAY,2BAA2B;YAC/C,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACvB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,MAAM,CAAC,OAAO;aACvB,CAAA;QAEH,MAAM,IAAI,KAAK,CACb,mBAAmB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,kCAAkC,CACvF,CAAA;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,uCAAuC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAC5E,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAoC,EACpC,KAAc,EACd,OAAqC;IAErC,IAAI,OAAO,CAAC,SAAS,YAAY,4BAA4B;QAC3D,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;YACvB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO;SAClC,CAAA;IAEH,IAAI,OAAO,CAAC,SAAS,YAAY,2BAA2B;QAC1D,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;YACvB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO;SAClC,CAAA;IAEH,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,YAAY,0BAA0B,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAElD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAA;IAE9C,IAAI,CAAC,OAAO,EAAE,IAAI;QAChB,MAAM,IAAI,KAAK,CACb,mBAAmB,IAAI,oDAAoD,CAC5E,CAAA;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;QACnD,KAAK;QACL,OAAO,EAAE,OAAO,CAAC,SAAS;QAC1B,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC;KACzC,CAAC,CAAA;IAEF,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,CAAA;IAE5C,OAAO,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;AAC3D,CAAC"}
|
|
@@ -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"}
|
|
@@ -6,8 +6,6 @@ import { type Log } from '../models/Logger.js';
|
|
|
6
6
|
import type { Workflow, WorkflowInput } from '../models/Workflow.js';
|
|
7
7
|
export declare namespace Internals {
|
|
8
8
|
interface WorkflowRunContext<TWorkflow extends Workflow<any, any>> {
|
|
9
|
-
id: string;
|
|
10
|
-
createdAt: number;
|
|
11
9
|
claims: readonly ClaimProvider<any>[];
|
|
12
10
|
history: readonly HistoryItem[];
|
|
13
11
|
env: Env.Entries;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Internals.d.ts","sourceRoot":"","sources":["../../src/tools/Internals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAS,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAU,KAAK,GAAG,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAEpE,yBAAiB,SAAS,CAAC;IACzB,UAAiB,kBAAkB,CAAC,SAAS,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;QACtE,
|
|
1
|
+
{"version":3,"file":"Internals.d.ts","sourceRoot":"","sources":["../../src/tools/Internals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAS,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAU,KAAK,GAAG,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAEpE,yBAAiB,SAAS,CAAC;IACzB,UAAiB,kBAAkB,CAAC,SAAS,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;QACtE,MAAM,EAAE,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAA;QACrC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAA;QAC/B,GAAG,EAAE,GAAG,CAAC,OAAO,CAAA;QAChB,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;QAC/B,IAAI,EAAE,GAAG,EAAE,CAAA;KACZ;IAED,SAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EACtD,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,OAS/B;IAED,UAAiB,kBAAkB;QACjC,EAAE,EAAE,MAAM,CAAA;QACV,MAAM,EAAE,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAA;QACrC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAA;KACjB;IAED,SAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,EAC/C,6BAA6B,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,EACzD,OAAO,EAAE,kBAAkB,EAC3B,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAYvB;CACF"}
|
package/dist/tools/Internals.js
CHANGED
|
@@ -5,11 +5,7 @@ import { Logger } from '../models/Logger.js';
|
|
|
5
5
|
export var Internals;
|
|
6
6
|
(function (Internals) {
|
|
7
7
|
function runWorkflow(workflow, context) {
|
|
8
|
-
return Env.run(context.env, () => Claim.run(context.claims, () => History.run(
|
|
9
|
-
history: context.history,
|
|
10
|
-
seed: context.id,
|
|
11
|
-
createdAt: context.createdAt,
|
|
12
|
-
}, () => Logger.run(context.logs, () => workflow.fn(context.input)))));
|
|
8
|
+
return Env.run(context.env, () => Claim.run(context.claims, () => History.run(context.history, () => Logger.run(context.logs, () => workflow.fn(context.input)))));
|
|
13
9
|
}
|
|
14
10
|
Internals.runWorkflow = runWorkflow;
|
|
15
11
|
function runActivity(activityOrActivityConstructor, context, fn) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Internals.js","sourceRoot":"","sources":["../../src/tools/Internals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAsB,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,OAAO,EAAoB,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,MAAM,EAAY,MAAM,qBAAqB,CAAA;AAGtD,MAAM,KAAW,SAAS,
|
|
1
|
+
{"version":3,"file":"Internals.js","sourceRoot":"","sources":["../../src/tools/Internals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAsB,MAAM,oBAAoB,CAAA;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,OAAO,EAAoB,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,MAAM,EAAY,MAAM,qBAAqB,CAAA;AAGtD,MAAM,KAAW,SAAS,CA4CzB;AA5CD,WAAiB,SAAS;IASxB,SAAgB,WAAW,CACzB,QAAW,EACX,OAA8B;QAE9B,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAC/B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAChC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAC3D,CACF,CACF,CAAA;IACH,CAAC;IAXe,qBAAW,cAW1B,CAAA;IAQD,SAAgB,WAAW,CACzB,6BAAyD,EACzD,OAA2B,EAC3B,EAAsB;QAEtB,MAAM,QAAQ,GACZ,OAAO,6BAA6B,KAAK,UAAU;YACjD,CAAC,CAAC,IAAI,6BAA6B,EAAE;YACrC,CAAC,CAAC,6BAA6B,CAAA;QAEnC,QAAQ,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAA;QAExB,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAC/B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAC9C,CAAA;IACH,CAAC;IAfe,qBAAW,cAe1B,CAAA;AACH,CAAC,EA5CgB,SAAS,KAAT,SAAS,QA4CzB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t4h.framework/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Core module for the T4H Framework",
|
|
5
5
|
"homepage": "https://github.com/tech4humans-brasil/framework/tree/main/packages/core",
|
|
6
6
|
"bugs": "https://github.com/tech4humans-brasil/framework/issues",
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Tech for humans
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TimerNotAllowedException.d.ts","sourceRoot":"","sources":["../../src/exceptions/TimerNotAllowedException.ts"],"names":[],"mappings":"AAAA,qBAAa,wBAAyB,SAAQ,KAAK;aACd,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM;CAKjD"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export class TimerNotAllowedException extends Error {
|
|
2
|
-
timer;
|
|
3
|
-
constructor(timer) {
|
|
4
|
-
super(`${timer}() cannot be used inside a workflow.`);
|
|
5
|
-
this.timer = timer;
|
|
6
|
-
this.name = 'TimerNotAllowedException';
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=TimerNotAllowedException.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TimerNotAllowedException.js","sourceRoot":"","sources":["../../src/exceptions/TimerNotAllowedException.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACd;IAAnC,YAAmC,KAAa;QAC9C,KAAK,CAAC,GAAG,KAAK,sCAAsC,CAAC,CAAA;QADpB,UAAK,GAAL,KAAK,CAAQ;QAG9C,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Deterministic.d.ts","sourceRoot":"","sources":["../../src/tools/Deterministic.ts"],"names":[],"mappings":"AAOA,yBAAiB,aAAa,CAAC;IAU7B,SAAgB,OAAO,IAAI,MAAM,CAEhC;IAED,SAAgB,OAAO,IAAI,MAAM,CAEhC;IAED,SAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,MAAM,GAAG,SAAS,QAE1D;IAUD,SAAgB,OAAO,SAUtB;CAgGF"}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { createRequire, syncBuiltinESMExports } from 'node:module';
|
|
2
|
-
import { softNow } from './clock.js';
|
|
3
|
-
import { random, uuid } from './random.js';
|
|
4
|
-
import { TimerNotAllowedException } from '../exceptions/TimerNotAllowedException.js';
|
|
5
|
-
import { History } from '../models/History.js';
|
|
6
|
-
export var Deterministic;
|
|
7
|
-
(function (Deterministic) {
|
|
8
|
-
const require = createRequire(import.meta.url);
|
|
9
|
-
const OriginalDate = globalThis.Date;
|
|
10
|
-
const originalRandom = Math.random;
|
|
11
|
-
let installed = false;
|
|
12
|
-
let hostClock = () => undefined;
|
|
13
|
-
function realNow() {
|
|
14
|
-
return OriginalDate.now();
|
|
15
|
-
}
|
|
16
|
-
Deterministic.realNow = realNow;
|
|
17
|
-
function hostNow() {
|
|
18
|
-
return hostClock() ?? OriginalDate.now();
|
|
19
|
-
}
|
|
20
|
-
Deterministic.hostNow = hostNow;
|
|
21
|
-
function useHostClock(read) {
|
|
22
|
-
hostClock = read;
|
|
23
|
-
}
|
|
24
|
-
Deterministic.useHostClock = useHostClock;
|
|
25
|
-
function nextRandom() {
|
|
26
|
-
const store = History.peek();
|
|
27
|
-
if (!store)
|
|
28
|
-
return undefined;
|
|
29
|
-
return random(store.seed, store.randomCalls++);
|
|
30
|
-
}
|
|
31
|
-
function install() {
|
|
32
|
-
if (installed)
|
|
33
|
-
return;
|
|
34
|
-
installed = true;
|
|
35
|
-
patchDate();
|
|
36
|
-
patchRandom();
|
|
37
|
-
patchRandomUUID();
|
|
38
|
-
patchNodeRandomUUID();
|
|
39
|
-
patchTimers();
|
|
40
|
-
}
|
|
41
|
-
Deterministic.install = install;
|
|
42
|
-
function patchDate() {
|
|
43
|
-
class DeterministicDate extends OriginalDate {
|
|
44
|
-
constructor(...args) {
|
|
45
|
-
if (args.length === 0)
|
|
46
|
-
super(softNow() ?? hostNow());
|
|
47
|
-
else
|
|
48
|
-
super(...args);
|
|
49
|
-
}
|
|
50
|
-
static now() {
|
|
51
|
-
return softNow() ?? hostNow();
|
|
52
|
-
}
|
|
53
|
-
static [Symbol.hasInstance](value) {
|
|
54
|
-
return value instanceof OriginalDate;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
globalThis.Date = DeterministicDate;
|
|
58
|
-
}
|
|
59
|
-
function patchRandom() {
|
|
60
|
-
Math.random = () => nextRandom() ?? originalRandom();
|
|
61
|
-
}
|
|
62
|
-
function nextUUID() {
|
|
63
|
-
const store = History.peek();
|
|
64
|
-
if (!store)
|
|
65
|
-
return undefined;
|
|
66
|
-
return uuid(() => random(store.seed, store.randomCalls++));
|
|
67
|
-
}
|
|
68
|
-
function patchRandomUUID() {
|
|
69
|
-
const target = globalThis.crypto;
|
|
70
|
-
if (!target?.randomUUID)
|
|
71
|
-
return;
|
|
72
|
-
const original = target.randomUUID.bind(target);
|
|
73
|
-
target.randomUUID = () => nextUUID() ?? original();
|
|
74
|
-
}
|
|
75
|
-
function patchNodeRandomUUID() {
|
|
76
|
-
const nodeCrypto = require('node:crypto');
|
|
77
|
-
const original = nodeCrypto.randomUUID;
|
|
78
|
-
nodeCrypto.randomUUID = (options => nextUUID() ??
|
|
79
|
-
original(options));
|
|
80
|
-
syncBuiltinESMExports();
|
|
81
|
-
}
|
|
82
|
-
function patchTimers() {
|
|
83
|
-
globalThis.setTimeout = forbid('setTimeout', globalThis.setTimeout);
|
|
84
|
-
globalThis.setInterval = forbid('setInterval', globalThis.setInterval);
|
|
85
|
-
const timers = require('node:timers');
|
|
86
|
-
timers.setTimeout = forbid('setTimeout', timers.setTimeout);
|
|
87
|
-
timers.setInterval = forbid('setInterval', timers.setInterval);
|
|
88
|
-
const promises = require('node:timers/promises');
|
|
89
|
-
promises.setTimeout = forbid('setTimeout', promises.setTimeout);
|
|
90
|
-
promises.setInterval = forbid('setInterval', promises.setInterval);
|
|
91
|
-
syncBuiltinESMExports();
|
|
92
|
-
}
|
|
93
|
-
function forbid(name, original) {
|
|
94
|
-
const patched = function (...args) {
|
|
95
|
-
if (History.peek())
|
|
96
|
-
throw new TimerNotAllowedException(name);
|
|
97
|
-
return original.apply(this, args);
|
|
98
|
-
};
|
|
99
|
-
for (const key of Reflect.ownKeys(original)) {
|
|
100
|
-
if (key === 'length' || key === 'name' || key === 'prototype')
|
|
101
|
-
continue;
|
|
102
|
-
Object.defineProperty(patched, key, Object.getOwnPropertyDescriptor(original, key));
|
|
103
|
-
}
|
|
104
|
-
return patched;
|
|
105
|
-
}
|
|
106
|
-
})(Deterministic || (Deterministic = {}));
|
|
107
|
-
//# sourceMappingURL=Deterministic.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Deterministic.js","sourceRoot":"","sources":["../../src/tools/Deterministic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAElE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAA;AACpF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE9C,MAAM,KAAW,aAAa,CAwI7B;AAxID,WAAiB,aAAa;IAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE9C,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAA;IACpC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAA;IAElC,IAAI,SAAS,GAAG,KAAK,CAAA;IAErB,IAAI,SAAS,GAA6B,GAAG,EAAE,CAAC,SAAS,CAAA;IAEzD,SAAgB,OAAO;QACrB,OAAO,YAAY,CAAC,GAAG,EAAE,CAAA;IAC3B,CAAC;IAFe,qBAAO,UAEtB,CAAA;IAED,SAAgB,OAAO;QACrB,OAAO,SAAS,EAAE,IAAI,YAAY,CAAC,GAAG,EAAE,CAAA;IAC1C,CAAC;IAFe,qBAAO,UAEtB,CAAA;IAED,SAAgB,YAAY,CAAC,IAA8B;QACzD,SAAS,GAAG,IAAI,CAAA;IAClB,CAAC;IAFe,0BAAY,eAE3B,CAAA;IAED,SAAS,UAAU;QACjB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;QAE5B,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAE5B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,SAAgB,OAAO;QACrB,IAAI,SAAS;YAAE,OAAM;QAErB,SAAS,GAAG,IAAI,CAAA;QAEhB,SAAS,EAAE,CAAA;QACX,WAAW,EAAE,CAAA;QACb,eAAe,EAAE,CAAA;QACjB,mBAAmB,EAAE,CAAA;QACrB,WAAW,EAAE,CAAA;IACf,CAAC;IAVe,qBAAO,UAUtB,CAAA;IAED,SAAS,SAAS;QAChB,MAAM,iBAAkB,SAAQ,YAAY;YAC1C,YAAY,GAAG,IAAoB;gBACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,KAAK,CAAC,OAAO,EAAE,IAAI,OAAO,EAAE,CAAC,CAAA;;oBAC/C,KAAK,CAAC,GAAI,IAAW,CAAC,CAAA;YAC7B,CAAC;YAEM,MAAM,CAAU,GAAG;gBACxB,OAAO,OAAO,EAAE,IAAI,OAAO,EAAE,CAAA;YAC/B,CAAC;YAEM,MAAM,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAc;gBAC/C,OAAO,KAAK,YAAY,YAAY,CAAA;YACtC,CAAC;SACF;QAED,UAAU,CAAC,IAAI,GAAG,iBAA+C,CAAA;IACnE,CAAC;IAED,SAAS,WAAW;QAClB,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,EAAE,IAAI,cAAc,EAAE,CAAA;IACtD,CAAC;IAED,SAAS,QAAQ;QACf,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;QAE5B,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAA;QAE5B,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,SAAS,eAAe;QACtB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAEhC,IAAI,CAAC,MAAM,EAAE,UAAU;YAAE,OAAM;QAE/B,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE/C,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,CACtB,QAAQ,EAA8C,IAAI,QAAQ,EAAE,CAAA;IACzE,CAAC;IAED,SAAS,mBAAmB;QAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAiC,CAAA;QAEzE,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAA;QAEtC,UAAU,CAAC,UAAU,GAAG,CAAC,OAAO,CAAC,EAAE,CAChC,QAAQ,EAA8C;YACvD,QAAQ,CAAC,OAAO,CAAC,CAAoB,CAAA;QAEvC,qBAAqB,EAAE,CAAA;IACzB,CAAC;IAED,SAAS,WAAW;QAClB,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,UAAU,CAAC,CAAA;QACnE,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,WAAW,CAAC,CAAA;QAEtE,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAiC,CAAA;QAErE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;QAC3D,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;QAE9D,MAAM,QAAQ,GACZ,OAAO,CAAC,sBAAsB,CAA0C,CAAA;QAE1E,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC/D,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;QAElE,qBAAqB,EAAE,CAAA;IACzB,CAAC;IAED,SAAS,MAAM,CACb,IAAY,EACZ,QAAW;QAEX,MAAM,OAAO,GAAG,UAAyB,GAAG,IAAe;YACzD,IAAI,OAAO,CAAC,IAAI,EAAE;gBAAE,MAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAA;YAE5D,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACnC,CAAC,CAAA;QAED,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,WAAW;gBAAE,SAAQ;YAEvE,MAAM,CAAC,cAAc,CACnB,OAAO,EACP,GAAG,EACH,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,GAAG,CAAE,CAChD,CAAA;QACH,CAAC;QAED,OAAO,OAAuB,CAAA;IAChC,CAAC;AACH,CAAC,EAxIgB,aAAa,KAAb,aAAa,QAwI7B"}
|
package/dist/tools/clock.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../src/tools/clock.ts"],"names":[],"mappings":"AAEA,wBAAgB,GAAG,IAAI,MAAM,CAO5B;AAED,wBAAgB,OAAO,IAAI,MAAM,GAAG,SAAS,CAE5C"}
|
package/dist/tools/clock.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { History } from '../models/History.js';
|
|
2
|
-
export function now() {
|
|
3
|
-
const value = softNow();
|
|
4
|
-
if (value === undefined)
|
|
5
|
-
throw new Error('Clock read outside of a workflow execution');
|
|
6
|
-
return value;
|
|
7
|
-
}
|
|
8
|
-
export function softNow() {
|
|
9
|
-
return History.peek()?.clock;
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=clock.js.map
|
package/dist/tools/clock.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/tools/clock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE9C,MAAM,UAAU,GAAG;IACjB,MAAM,KAAK,GAAG,OAAO,EAAE,CAAA;IAEvB,IAAI,KAAK,KAAK,SAAS;QACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAE/D,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,CAAA;AAC9B,CAAC"}
|
package/dist/tools/random.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../src/tools/random.ts"],"names":[],"mappings":"AAWA,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOzD;AAMD,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,MAAM,GAAG,MAAM,CAe/C"}
|
package/dist/tools/random.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
function hash(text) {
|
|
2
|
-
let value = 0x811c9dc5;
|
|
3
|
-
for (let index = 0; index < text.length; index++) {
|
|
4
|
-
value ^= text.charCodeAt(index);
|
|
5
|
-
value = Math.imul(value, 0x01000193);
|
|
6
|
-
}
|
|
7
|
-
return value >>> 0;
|
|
8
|
-
}
|
|
9
|
-
export function random(seed, call) {
|
|
10
|
-
let state = (hash(seed) + Math.imul(call + 1, 0x6d2b79f5)) >>> 0;
|
|
11
|
-
state = Math.imul(state ^ (state >>> 15), state | 1);
|
|
12
|
-
state ^= state + Math.imul(state ^ (state >>> 7), state | 61);
|
|
13
|
-
return ((state ^ (state >>> 14)) >>> 0) / 4294967296;
|
|
14
|
-
}
|
|
15
|
-
const hex = Array.from({ length: 256 }, (_, byte) => byte.toString(16).padStart(2, '0'));
|
|
16
|
-
export function uuid(next) {
|
|
17
|
-
const bytes = Array.from({ length: 16 }, () => Math.floor(next() * 256));
|
|
18
|
-
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
19
|
-
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
20
|
-
const text = bytes.map(byte => hex[byte]).join('');
|
|
21
|
-
return [
|
|
22
|
-
text.slice(0, 8),
|
|
23
|
-
text.slice(8, 12),
|
|
24
|
-
text.slice(12, 16),
|
|
25
|
-
text.slice(16, 20),
|
|
26
|
-
text.slice(20),
|
|
27
|
-
].join('-');
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=random.js.map
|
package/dist/tools/random.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/tools/random.ts"],"names":[],"mappings":"AAAA,SAAS,IAAI,CAAC,IAAY;IACxB,IAAI,KAAK,GAAG,UAAU,CAAA;IAEtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAC/B,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,KAAK,KAAK,CAAC,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,IAAY;IAC/C,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,CAAA;IAEhE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;IACpD,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAA;IAE7D,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAA;AACtD,CAAC;AAED,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAClD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CACnC,CAAA;AAED,MAAM,UAAU,IAAI,CAAC,IAAkB;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;IAExE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IACpC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IAEpC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAElD,OAAO;QACL,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;KACf,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACb,CAAC"}
|