@t4h.framework/core 0.0.0-experimental-c0d4325
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +336 -0
- package/dist/activities/StartWorkflowActivity.d.ts +21 -0
- package/dist/activities/StartWorkflowActivity.d.ts.map +1 -0
- package/dist/activities/StartWorkflowActivity.js +24 -0
- package/dist/activities/StartWorkflowActivity.js.map +1 -0
- package/dist/core.d.ts +23 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +23 -0
- package/dist/core.js.map +1 -0
- package/dist/exceptions/ActivityException.d.ts +7 -0
- package/dist/exceptions/ActivityException.d.ts.map +1 -0
- package/dist/exceptions/ActivityException.js +6 -0
- package/dist/exceptions/ActivityException.js.map +1 -0
- package/dist/exceptions/ClaimException.d.ts +20 -0
- package/dist/exceptions/ClaimException.d.ts.map +1 -0
- package/dist/exceptions/ClaimException.js +34 -0
- package/dist/exceptions/ClaimException.js.map +1 -0
- package/dist/models/Activity.d.ts +13 -0
- package/dist/models/Activity.d.ts.map +1 -0
- package/dist/models/Activity.js +2 -0
- package/dist/models/Activity.js.map +1 -0
- package/dist/models/ActivityClaim.d.ts +15 -0
- package/dist/models/ActivityClaim.d.ts.map +1 -0
- package/dist/models/ActivityClaim.js +33 -0
- package/dist/models/ActivityClaim.js.map +1 -0
- package/dist/models/ActivityHistory.d.ts +15 -0
- package/dist/models/ActivityHistory.d.ts.map +1 -0
- package/dist/models/ActivityHistory.js +36 -0
- package/dist/models/ActivityHistory.js.map +1 -0
- package/dist/models/ActivityHistoryReconciler.d.ts +14 -0
- package/dist/models/ActivityHistoryReconciler.d.ts.map +1 -0
- package/dist/models/ActivityHistoryReconciler.js +32 -0
- package/dist/models/ActivityHistoryReconciler.js.map +1 -0
- package/dist/models/App.d.ts +27 -0
- package/dist/models/App.d.ts.map +1 -0
- package/dist/models/App.js +35 -0
- package/dist/models/App.js.map +1 -0
- package/dist/models/AsyncActivity.d.ts +17 -0
- package/dist/models/AsyncActivity.d.ts.map +1 -0
- package/dist/models/AsyncActivity.js +17 -0
- package/dist/models/AsyncActivity.js.map +1 -0
- package/dist/models/AsyncActivityAdvanceQuery.d.ts +12 -0
- package/dist/models/AsyncActivityAdvanceQuery.d.ts.map +1 -0
- package/dist/models/AsyncActivityAdvanceQuery.js +15 -0
- package/dist/models/AsyncActivityAdvanceQuery.js.map +1 -0
- package/dist/models/AsyncActivityAdvanceResult.d.ts +23 -0
- package/dist/models/AsyncActivityAdvanceResult.d.ts.map +1 -0
- package/dist/models/AsyncActivityAdvanceResult.js +23 -0
- package/dist/models/AsyncActivityAdvanceResult.js.map +1 -0
- package/dist/models/AsyncActivityAwaitable.d.ts +11 -0
- package/dist/models/AsyncActivityAwaitable.d.ts.map +1 -0
- package/dist/models/AsyncActivityAwaitable.js +18 -0
- package/dist/models/AsyncActivityAwaitable.js.map +1 -0
- package/dist/models/Binary.d.ts +7 -0
- package/dist/models/Binary.d.ts.map +1 -0
- package/dist/models/Binary.js +4 -0
- package/dist/models/Binary.js.map +1 -0
- package/dist/models/Claim.d.ts +21 -0
- package/dist/models/Claim.d.ts.map +1 -0
- package/dist/models/Claim.js +37 -0
- package/dist/models/Claim.js.map +1 -0
- package/dist/models/Env.d.ts +12 -0
- package/dist/models/Env.d.ts.map +1 -0
- package/dist/models/Env.js +28 -0
- package/dist/models/Env.js.map +1 -0
- package/dist/models/EnvDesign.d.ts +16 -0
- package/dist/models/EnvDesign.d.ts.map +1 -0
- package/dist/models/EnvDesign.js +48 -0
- package/dist/models/EnvDesign.js.map +1 -0
- package/dist/models/History.d.ts +16 -0
- package/dist/models/History.d.ts.map +1 -0
- package/dist/models/History.js +34 -0
- package/dist/models/History.js.map +1 -0
- package/dist/models/Page.d.ts +13 -0
- package/dist/models/Page.d.ts.map +1 -0
- package/dist/models/Page.js +18 -0
- package/dist/models/Page.js.map +1 -0
- package/dist/models/PushActivity.d.ts +7 -0
- package/dist/models/PushActivity.d.ts.map +1 -0
- package/dist/models/PushActivity.js +9 -0
- package/dist/models/PushActivity.js.map +1 -0
- package/dist/models/PushWaitAsyncActivity.d.ts +6 -0
- package/dist/models/PushWaitAsyncActivity.d.ts.map +1 -0
- package/dist/models/PushWaitAsyncActivity.js +7 -0
- package/dist/models/PushWaitAsyncActivity.js.map +1 -0
- package/dist/models/SerializableHelper.d.ts +10 -0
- package/dist/models/SerializableHelper.d.ts.map +1 -0
- package/dist/models/SerializableHelper.js +8 -0
- package/dist/models/SerializableHelper.js.map +1 -0
- package/dist/models/SyncActivity.d.ts +7 -0
- package/dist/models/SyncActivity.d.ts.map +1 -0
- package/dist/models/SyncActivity.js +3 -0
- package/dist/models/SyncActivity.js.map +1 -0
- package/dist/models/Variable.d.ts +23 -0
- package/dist/models/Variable.d.ts.map +1 -0
- package/dist/models/Variable.js +47 -0
- package/dist/models/Variable.js.map +1 -0
- package/dist/models/Workflow.d.ts +24 -0
- package/dist/models/Workflow.d.ts.map +1 -0
- package/dist/models/Workflow.js +35 -0
- package/dist/models/Workflow.js.map +1 -0
- package/dist/models/WorkflowRef.d.ts +6 -0
- package/dist/models/WorkflowRef.d.ts.map +1 -0
- package/dist/models/WorkflowRef.js +7 -0
- package/dist/models/WorkflowRef.js.map +1 -0
- package/dist/models/env.d.ts +11 -0
- package/dist/models/env.d.ts.map +1 -0
- package/dist/models/env.js +25 -0
- package/dist/models/env.js.map +1 -0
- package/dist/tools/Internals.d.ts +20 -0
- package/dist/tools/Internals.d.ts.map +1 -0
- package/dist/tools/Internals.js +18 -0
- package/dist/tools/Internals.js.map +1 -0
- package/dist/tools/activity.d.ts +15 -0
- package/dist/tools/activity.d.ts.map +1 -0
- package/dist/tools/activity.js +21 -0
- package/dist/tools/activity.js.map +1 -0
- package/dist/tools/inMemoryEnvDesignToManifest.d.ts +3 -0
- package/dist/tools/inMemoryEnvDesignToManifest.d.ts.map +1 -0
- package/dist/tools/inMemoryEnvDesignToManifest.js +27 -0
- package/dist/tools/inMemoryEnvDesignToManifest.js.map +1 -0
- package/dist/tools/isActivity.d.ts +4 -0
- package/dist/tools/isActivity.d.ts.map +1 -0
- package/dist/tools/isActivity.js +13 -0
- package/dist/tools/isActivity.js.map +1 -0
- package/dist/typings/AppManifest.d.ts +17 -0
- package/dist/typings/AppManifest.d.ts.map +1 -0
- package/dist/typings/AppManifest.js +2 -0
- package/dist/typings/AppManifest.js.map +1 -0
- package/dist/typings/PromiseLikeType.d.ts +2 -0
- package/dist/typings/PromiseLikeType.d.ts.map +1 -0
- package/dist/typings/PromiseLikeType.js +2 -0
- package/dist/typings/PromiseLikeType.js.map +1 -0
- package/dist/typings/Serializable.d.ts +7 -0
- package/dist/typings/Serializable.d.ts.map +1 -0
- package/dist/typings/Serializable.js +2 -0
- package/dist/typings/Serializable.js.map +1 -0
- package/package.json +48 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Tech four 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.
|
package/README.md
ADDED
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
# @t4h.framework/core
|
|
2
|
+
|
|
3
|
+
Core primitives for modeling automation workflows and activities.
|
|
4
|
+
|
|
5
|
+
## Concepts
|
|
6
|
+
|
|
7
|
+
- **Workflow** -- business logic abstraction. The workflow author focuses on orchestration and rules, not infrastructure. It composes Activities to get work done.
|
|
8
|
+
- **Activity** -- pre-defined systemic unit of work. Activities define _what_ operations are available (HTTP request, save file, query DB) with a structured lifecycle. The activity author defines the contract; the runtime fulfills it.
|
|
9
|
+
- **Claim** -- the bridge between an activity and the runtime. An activity declares what it needs (e.g. a file storage accessor, an HTTP client) as abstract dependencies. The runtime provides concrete implementations when executing.
|
|
10
|
+
|
|
11
|
+
```mermaid
|
|
12
|
+
flowchart LR
|
|
13
|
+
Workflow -->|"composes"| Activity
|
|
14
|
+
Activity -->|"declares"| Claim
|
|
15
|
+
Runtime -->|"provides"| Claim
|
|
16
|
+
Runtime -->|"executes with env, history, claims"| Workflow
|
|
17
|
+
Runtime -->|"executes with env, claims"| Activity
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Creating a Workflow
|
|
23
|
+
|
|
24
|
+
A workflow is a function that orchestrates activities and business logic.
|
|
25
|
+
|
|
26
|
+
### Simple workflow (no validation)
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
import { Workflow } from '@t4h.framework/core'
|
|
30
|
+
|
|
31
|
+
const myWorkflow = new Workflow(async () => {
|
|
32
|
+
// orchestration here
|
|
33
|
+
return { ok: true }
|
|
34
|
+
})
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Workflow with id and description
|
|
38
|
+
|
|
39
|
+
```javascript
|
|
40
|
+
const myWorkflow = new Workflow(
|
|
41
|
+
{ id: 'cashback/v1', description: 'Process cashback' },
|
|
42
|
+
async input => {
|
|
43
|
+
return { value: input.amount * 0.05 }
|
|
44
|
+
},
|
|
45
|
+
)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Workflow with JSON Schema validation
|
|
49
|
+
|
|
50
|
+
The `schema` field accepts any valid JSON Schema.
|
|
51
|
+
|
|
52
|
+
```javascript
|
|
53
|
+
const myWorkflow = new Workflow(
|
|
54
|
+
{
|
|
55
|
+
id: 'cashback/v1',
|
|
56
|
+
schema: {
|
|
57
|
+
type: 'object',
|
|
58
|
+
properties: {
|
|
59
|
+
userId: { type: 'string' },
|
|
60
|
+
amount: { type: 'number' },
|
|
61
|
+
},
|
|
62
|
+
required: ['userId', 'amount'],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
async input => {
|
|
66
|
+
// input is validated: { userId: string, amount: number }
|
|
67
|
+
return { value: input.amount * 0.05 }
|
|
68
|
+
},
|
|
69
|
+
)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
You can also use libraries like [TypeBox](https://github.com/sinclairzx81/typebox) to generate the schema with type inference:
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import Type from 'typebox'
|
|
76
|
+
|
|
77
|
+
const schema = Type.Object({
|
|
78
|
+
userId: Type.String(),
|
|
79
|
+
amount: Type.Number(),
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
const myWorkflow = new Workflow({ id: 'cashback/v1', schema }, async input => {
|
|
83
|
+
return { value: input.amount * 0.05 }
|
|
84
|
+
})
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Using environment variables
|
|
88
|
+
|
|
89
|
+
```javascript
|
|
90
|
+
import { Workflow, env } from '@t4h.framework/core'
|
|
91
|
+
|
|
92
|
+
const myWorkflow = new Workflow({ id: 'notify/v1' }, async () => {
|
|
93
|
+
console.log(env.API_URL)
|
|
94
|
+
console.log(env.API_SECRET)
|
|
95
|
+
})
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Registering workflows in an App
|
|
99
|
+
|
|
100
|
+
```javascript
|
|
101
|
+
import { App, Workflow } from '@t4h.framework/core'
|
|
102
|
+
|
|
103
|
+
const app = new App({
|
|
104
|
+
id: 'my-automation',
|
|
105
|
+
description: 'Cashback automation',
|
|
106
|
+
workflows: [myWorkflow],
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
// or add later
|
|
110
|
+
app.addWorkflow(anotherWorkflow)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Creating Activities
|
|
116
|
+
|
|
117
|
+
Activities are reusable units of work. There are two types: `SyncActivity` (synchronous) and `AsyncActivity` (long-running).
|
|
118
|
+
|
|
119
|
+
Each activity method runs in a specific context:
|
|
120
|
+
|
|
121
|
+
**SyncActivity lifecycle:**
|
|
122
|
+
|
|
123
|
+
```mermaid
|
|
124
|
+
flowchart LR
|
|
125
|
+
subgraph core [Core]
|
|
126
|
+
toInput["toInput"]
|
|
127
|
+
toOutput["toOutput"]
|
|
128
|
+
end
|
|
129
|
+
subgraph runtime [Runtime]
|
|
130
|
+
run["run"]
|
|
131
|
+
end
|
|
132
|
+
toInput --> run --> toOutput
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
- `toInput` -- core context, little or no claim dependency. Converts designer arguments into serializable input.
|
|
136
|
+
- `run` -- runtime context, strong claim dependency. Performs the actual work.
|
|
137
|
+
- `toOutput` -- core context, no claim dependency. Transforms the raw result back for the designer.
|
|
138
|
+
|
|
139
|
+
**AsyncActivity lifecycle:**
|
|
140
|
+
|
|
141
|
+
```mermaid
|
|
142
|
+
flowchart LR
|
|
143
|
+
subgraph core [Core]
|
|
144
|
+
toInput["toInput"]
|
|
145
|
+
toOutput["toOutput"]
|
|
146
|
+
end
|
|
147
|
+
subgraph runtime [Runtime]
|
|
148
|
+
bootstrap["bootstrap"]
|
|
149
|
+
advance["advance"]
|
|
150
|
+
end
|
|
151
|
+
toInput --> bootstrap --> advance --> toOutput
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
- `toInput` -- same as sync.
|
|
155
|
+
- `bootstrap` -- runtime context, starts the long-running operation and returns a `AsyncActivityAdvanceResultPending`.
|
|
156
|
+
- `advance` -- runtime context, called when an external event resumes the activity. It returns one of:
|
|
157
|
+
- `AsyncActivityAdvanceResultPending` (still waiting),
|
|
158
|
+
- `AsyncActivityAdvanceResultFulfilled` (completed),
|
|
159
|
+
- `AsyncActivityAdvanceResultRejected` (failed).
|
|
160
|
+
- `toOutput` -- same as sync.
|
|
161
|
+
|
|
162
|
+
### SyncActivity
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import { SyncActivity } from '@t4h.framework/core'
|
|
166
|
+
|
|
167
|
+
class CalculateCashbackActivity extends SyncActivity<
|
|
168
|
+
[transaction: { amount: number }], // designer arguments
|
|
169
|
+
{ amount: number }, // serializable input
|
|
170
|
+
number // designer output
|
|
171
|
+
> {
|
|
172
|
+
public async toInput(transaction: { amount: number }) {
|
|
173
|
+
return { amount: transaction.amount }
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public run(input: { amount: number }) {
|
|
177
|
+
return Math.floor(input.amount * 0.05)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
public toOutput(output: number) {
|
|
181
|
+
return output
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### AsyncActivity
|
|
187
|
+
|
|
188
|
+
For long-running operations that need a bootstrap/advance cycle (e.g. waiting for human approval, external webhook).
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
import Type from 'typebox'
|
|
192
|
+
import {
|
|
193
|
+
AsyncActivity,
|
|
194
|
+
AsyncActivityAdvanceResultFulfilled,
|
|
195
|
+
AsyncActivityAdvanceResultPending,
|
|
196
|
+
AsyncActivityAdvanceResultRejected,
|
|
197
|
+
} from '@t4h.framework/core'
|
|
198
|
+
|
|
199
|
+
const ApprovalSchema = Type.Object({
|
|
200
|
+
approved: Type.Boolean(),
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
class WaitForApprovalActivity extends AsyncActivity<
|
|
204
|
+
[orderId: string],
|
|
205
|
+
{ orderId: string },
|
|
206
|
+
{ approved: boolean },
|
|
207
|
+
{ requestId: string; orderId: string },
|
|
208
|
+
typeof ApprovalSchema
|
|
209
|
+
> {
|
|
210
|
+
public async toInput(orderId: string) {
|
|
211
|
+
return { orderId }
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
public async bootstrap(input: { orderId: string }) {
|
|
215
|
+
// triggers the approval request and stores correlation data
|
|
216
|
+
return new AsyncActivityAdvanceResultPending({
|
|
217
|
+
output: {
|
|
218
|
+
requestId: 'req-123',
|
|
219
|
+
orderId: input.orderId,
|
|
220
|
+
},
|
|
221
|
+
schema: ApprovalSchema,
|
|
222
|
+
})
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
public async advance(
|
|
226
|
+
payload: Type.Static<typeof ApprovalSchema>,
|
|
227
|
+
bootstrap: AsyncActivityAdvanceResultPending<{
|
|
228
|
+
requestId: string
|
|
229
|
+
orderId: string
|
|
230
|
+
}>,
|
|
231
|
+
) {
|
|
232
|
+
if (payload.approved) {
|
|
233
|
+
return new AsyncActivityAdvanceResultFulfilled({
|
|
234
|
+
approved: true,
|
|
235
|
+
})
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return new AsyncActivityAdvanceResultRejected({
|
|
239
|
+
approved: false,
|
|
240
|
+
requestId: bootstrap.output?.requestId,
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
public toOutput(output: { approved: boolean }) {
|
|
245
|
+
return output
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Activities with Claims (dependencies)
|
|
251
|
+
|
|
252
|
+
A Claim is an abstract dependency that an Activity declares. For example, an activity that saves files declares it needs a "file storage" claim -- it doesn't know whether the implementation uses S3, local disk, or anything else. The runtime must provide a concrete implementation for each declared claim via `ClaimProvider`. This decouples the activity definition from the infrastructure.
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
import { SyncActivity, Claim } from '@t4h.framework/core'
|
|
256
|
+
|
|
257
|
+
abstract class UserRepositoryClaim {
|
|
258
|
+
abstract findById(id: string): Promise<any>
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
class FetchUserActivity extends SyncActivity<
|
|
262
|
+
[id: string],
|
|
263
|
+
{ id: string },
|
|
264
|
+
any
|
|
265
|
+
> {
|
|
266
|
+
private readonly claims = new Claim({
|
|
267
|
+
repo: UserRepositoryClaim,
|
|
268
|
+
})
|
|
269
|
+
|
|
270
|
+
public async toInput(id: string) {
|
|
271
|
+
return { id }
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
public async run(input: { id: string }) {
|
|
275
|
+
return await this.claims.repo.findById(input.id)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
public toOutput(output: any) {
|
|
279
|
+
return output
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Runtime Execution
|
|
287
|
+
|
|
288
|
+
The runtime is responsible for executing workflows and activities by providing the necessary context (env, claims, history).
|
|
289
|
+
|
|
290
|
+
### Running a Workflow
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
import { Internals } from '@t4h.framework/core'
|
|
294
|
+
|
|
295
|
+
Internals.runWorkflow(myWorkflow, {
|
|
296
|
+
input: { userId: '123', amount: 100 },
|
|
297
|
+
env: { API_URL: 'https://api.example.com' },
|
|
298
|
+
claims: [
|
|
299
|
+
{ provide: UserRepositoryClaim, value: new UserRepositoryClaimImpl() },
|
|
300
|
+
],
|
|
301
|
+
history: [],
|
|
302
|
+
})
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Running an Activity
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
Internals.runActivity(
|
|
309
|
+
FetchUserActivity,
|
|
310
|
+
{
|
|
311
|
+
env: { API_URL: 'https://api.example.com' },
|
|
312
|
+
claims: [
|
|
313
|
+
{ provide: UserRepositoryClaim, value: new UserRepositoryClaimImpl() },
|
|
314
|
+
],
|
|
315
|
+
},
|
|
316
|
+
activity => {
|
|
317
|
+
return activity.run({ id: '123' })
|
|
318
|
+
},
|
|
319
|
+
)
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### How it works internally
|
|
323
|
+
|
|
324
|
+
`runWorkflow` composes three context layers via `AsyncLocalStorage`:
|
|
325
|
+
|
|
326
|
+
```
|
|
327
|
+
Env.run → Claim.run → History.run → workflow.fn(input)
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
`runActivity` composes two:
|
|
331
|
+
|
|
332
|
+
```
|
|
333
|
+
Env.run → Claim.run → fn(activity)
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**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.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Claim } from '../models/Claim.js';
|
|
2
|
+
import { SyncActivity } from '../models/SyncActivity.js';
|
|
3
|
+
import type { Workflow, WorkflowInput } from '../models/Workflow.js';
|
|
4
|
+
import { WorkflowRef } from '../models/WorkflowRef.js';
|
|
5
|
+
import type { Serializable } from '../typings/Serializable.js';
|
|
6
|
+
export declare abstract class WorkflowClaim {
|
|
7
|
+
abstract start<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow, input: WorkflowInput<TWorkflow>): Serializable | Promise<Serializable>;
|
|
8
|
+
}
|
|
9
|
+
export declare class StartWorkflowActivity extends SyncActivity<[
|
|
10
|
+
workflow: Workflow,
|
|
11
|
+
input: any
|
|
12
|
+
], Serializable, Serializable, WorkflowRef> {
|
|
13
|
+
readonly claims: Claim<{
|
|
14
|
+
workflow: typeof WorkflowClaim;
|
|
15
|
+
}>;
|
|
16
|
+
toInput(workflow: Workflow<any, any>, input: any): Promise<Serializable>;
|
|
17
|
+
run(payload: Serializable): Serializable;
|
|
18
|
+
toOutput(payload: Serializable): WorkflowRef;
|
|
19
|
+
}
|
|
20
|
+
export declare function startWorkflow<TWorkflow extends Workflow<any, any>>(workflow: TWorkflow, input: WorkflowInput<TWorkflow>): Promise<WorkflowRef>;
|
|
21
|
+
//# sourceMappingURL=StartWorkflowActivity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StartWorkflowActivity.d.ts","sourceRoot":"","sources":["../../src/activities/StartWorkflowActivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,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,8BAAsB,aAAa;aACjB,KAAK,CAAC,SAAS,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EACxD,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,GAC9B,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;CACxC;AAED,qBAAa,qBAAsB,SAAQ,YAAY,CACrD;IAAC,QAAQ,EAAE,QAAQ;IAAE,KAAK,EAAE,GAAG;CAAC,EAChC,YAAY,EACZ,YAAY,EACZ,WAAW,CACZ;IACC,SAAgB,MAAM;;OAEpB;IAEW,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG;IAItD,GAAG,CAAC,OAAO,EAAE,YAAY;IAIzB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,WAAW;CAGpD;AAED,wBAAgB,aAAa,CAAC,SAAS,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAChE,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,wBAGhC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Claim } from '../models/Claim.js';
|
|
2
|
+
import { History } from '../models/History.js';
|
|
3
|
+
import { SyncActivity } from '../models/SyncActivity.js';
|
|
4
|
+
import { WorkflowRef } from '../models/WorkflowRef.js';
|
|
5
|
+
export class WorkflowClaim {
|
|
6
|
+
}
|
|
7
|
+
export class StartWorkflowActivity extends SyncActivity {
|
|
8
|
+
claims = new Claim({
|
|
9
|
+
workflow: WorkflowClaim,
|
|
10
|
+
});
|
|
11
|
+
async toInput(workflow, input) {
|
|
12
|
+
return await this.claims.workflow.start(workflow, input);
|
|
13
|
+
}
|
|
14
|
+
run(payload) {
|
|
15
|
+
return payload;
|
|
16
|
+
}
|
|
17
|
+
toOutput(payload) {
|
|
18
|
+
return new WorkflowRef(payload);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function startWorkflow(workflow, input) {
|
|
22
|
+
return History.reconciler(StartWorkflowActivity, workflow, input);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=StartWorkflowActivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StartWorkflowActivity.js","sourceRoot":"","sources":["../../src/activities/StartWorkflowActivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAGtD,MAAM,OAAgB,aAAa;CAKlC;AAED,MAAM,OAAO,qBAAsB,SAAQ,YAK1C;IACiB,MAAM,GAAG,IAAI,KAAK,CAAC;QACjC,QAAQ,EAAE,aAAa;KACxB,CAAC,CAAA;IAEK,KAAK,CAAC,OAAO,CAAC,QAA4B,EAAE,KAAU;QAC3D,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC1D,CAAC;IAEM,GAAG,CAAC,OAAqB;QAC9B,OAAO,OAAO,CAAA;IAChB,CAAC;IAEM,QAAQ,CAAC,OAAqB;QACnC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAC3B,QAAmB,EACnB,KAA+B;IAE/B,OAAO,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;AACnE,CAAC"}
|
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export * from './activities/StartWorkflowActivity.js';
|
|
2
|
+
export * from './exceptions/ActivityException.js';
|
|
3
|
+
export * from './exceptions/ClaimException.js';
|
|
4
|
+
export * from './models/Activity.js';
|
|
5
|
+
export * from './models/App.js';
|
|
6
|
+
export * from './models/AsyncActivity.js';
|
|
7
|
+
export * from './models/AsyncActivityAdvanceResult.js';
|
|
8
|
+
export * from './models/AsyncActivityAwaitable.js';
|
|
9
|
+
export * from './models/Binary.js';
|
|
10
|
+
export * from './models/Claim.js';
|
|
11
|
+
export * from './models/Env.js';
|
|
12
|
+
export * from './models/EnvDesign.js';
|
|
13
|
+
export * from './models/History.js';
|
|
14
|
+
export * from './models/PushActivity.js';
|
|
15
|
+
export * from './models/PushWaitAsyncActivity.js';
|
|
16
|
+
export * from './models/SerializableHelper.js';
|
|
17
|
+
export * from './models/SyncActivity.js';
|
|
18
|
+
export * from './models/Workflow.js';
|
|
19
|
+
export * from './models/WorkflowRef.js';
|
|
20
|
+
export * from './tools/Internals.js';
|
|
21
|
+
export * from './typings/PromiseLikeType.js';
|
|
22
|
+
export * from './typings/Serializable.js';
|
|
23
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +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,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,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"}
|
package/dist/core.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export * from './activities/StartWorkflowActivity.js';
|
|
2
|
+
export * from './exceptions/ActivityException.js';
|
|
3
|
+
export * from './exceptions/ClaimException.js';
|
|
4
|
+
export * from './models/Activity.js';
|
|
5
|
+
export * from './models/App.js';
|
|
6
|
+
export * from './models/AsyncActivity.js';
|
|
7
|
+
export * from './models/AsyncActivityAdvanceResult.js';
|
|
8
|
+
export * from './models/AsyncActivityAwaitable.js';
|
|
9
|
+
export * from './models/Binary.js';
|
|
10
|
+
export * from './models/Claim.js';
|
|
11
|
+
export * from './models/Env.js';
|
|
12
|
+
export * from './models/EnvDesign.js';
|
|
13
|
+
export * from './models/History.js';
|
|
14
|
+
export * from './models/PushActivity.js';
|
|
15
|
+
export * from './models/PushWaitAsyncActivity.js';
|
|
16
|
+
export * from './models/SerializableHelper.js';
|
|
17
|
+
export * from './models/SyncActivity.js';
|
|
18
|
+
export * from './models/Workflow.js';
|
|
19
|
+
export * from './models/WorkflowRef.js';
|
|
20
|
+
export * from './tools/Internals.js';
|
|
21
|
+
export * from './typings/PromiseLikeType.js';
|
|
22
|
+
export * from './typings/Serializable.js';
|
|
23
|
+
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
ADDED
|
@@ -0,0 +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,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,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityException.d.ts","sourceRoot":"","sources":["../../src/exceptions/ActivityException.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAyB,SAAQ,YAAY;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAG3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityException.js","sourceRoot":"","sources":["../../src/exceptions/ActivityException.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAmB,OAAe,EAAE,OAAsB;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare class ClaimException extends Error {
|
|
2
|
+
constructor(message: string, options?: ErrorOptions);
|
|
3
|
+
}
|
|
4
|
+
export declare class ClaimKeyNotFoundException extends ClaimException {
|
|
5
|
+
readonly key: string | symbol;
|
|
6
|
+
constructor(key: string | symbol);
|
|
7
|
+
}
|
|
8
|
+
export declare class ClaimConstructorNotFoundException extends ClaimException {
|
|
9
|
+
readonly key: string | symbol;
|
|
10
|
+
constructor(key: string | symbol);
|
|
11
|
+
}
|
|
12
|
+
export declare class ClaimStorageNotActiveException extends ClaimException {
|
|
13
|
+
constructor();
|
|
14
|
+
}
|
|
15
|
+
export declare class ClaimProviderNotFoundException extends ClaimException {
|
|
16
|
+
readonly key: string | symbol;
|
|
17
|
+
readonly constructorName: string;
|
|
18
|
+
constructor(constructorName: string, key: string | symbol);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ClaimException.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaimException.d.ts","sourceRoot":"","sources":["../../src/exceptions/ClaimException.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;gBACpB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAG3D;AAED,qBAAa,yBAA0B,SAAQ,cAAc;IAC3D,SAAgB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;gBAEjB,GAAG,EAAE,MAAM,GAAG,MAAM;CAIxC;AAED,qBAAa,iCAAkC,SAAQ,cAAc;IACnE,SAAgB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;gBAEjB,GAAG,EAAE,MAAM,GAAG,MAAM;CAIxC;AAED,qBAAa,8BAA+B,SAAQ,cAAc;;CAMjE;AAED,qBAAa,8BAA+B,SAAQ,cAAc;IAChE,SAAgB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;IACpC,SAAgB,eAAe,EAAE,MAAM,CAAA;gBAEpB,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CAOjE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export class ClaimException extends Error {
|
|
2
|
+
constructor(message, options) {
|
|
3
|
+
super(message, options);
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
export class ClaimKeyNotFoundException extends ClaimException {
|
|
7
|
+
key;
|
|
8
|
+
constructor(key) {
|
|
9
|
+
super(`Claim key "${key.toString()}" is not mapped`);
|
|
10
|
+
this.key = key;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ClaimConstructorNotFoundException extends ClaimException {
|
|
14
|
+
key;
|
|
15
|
+
constructor(key) {
|
|
16
|
+
super(`No constructor mapped for claim key "${key.toString()}"`);
|
|
17
|
+
this.key = key;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class ClaimStorageNotActiveException extends ClaimException {
|
|
21
|
+
constructor() {
|
|
22
|
+
super('Claim storage is not active. Ensure you are inside an Claim.run() context');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class ClaimProviderNotFoundException extends ClaimException {
|
|
26
|
+
key;
|
|
27
|
+
constructorName;
|
|
28
|
+
constructor(constructorName, key) {
|
|
29
|
+
super(`No provider for "${constructorName}" found for claim key "${key.toString()}"`);
|
|
30
|
+
this.constructorName = constructorName;
|
|
31
|
+
this.key = key;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=ClaimException.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaimException.js","sourceRoot":"","sources":["../../src/exceptions/ClaimException.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAmB,OAAe,EAAE,OAAsB;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACzB,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,cAAc;IAC3C,GAAG,CAAiB;IAEpC,YAAmB,GAAoB;QACrC,KAAK,CAAC,cAAc,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;QACpD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;CACF;AAED,MAAM,OAAO,iCAAkC,SAAQ,cAAc;IACnD,GAAG,CAAiB;IAEpC,YAAmB,GAAoB;QACrC,KAAK,CAAC,wCAAwC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAChE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;CACF;AAED,MAAM,OAAO,8BAA+B,SAAQ,cAAc;IAChE;QACE,KAAK,CACH,2EAA2E,CAC5E,CAAA;IACH,CAAC;CACF;AAED,MAAM,OAAO,8BAA+B,SAAQ,cAAc;IAChD,GAAG,CAAiB;IACpB,eAAe,CAAQ;IAEvC,YAAmB,eAAuB,EAAE,GAAoB;QAC9D,KAAK,CACH,oBAAoB,eAAe,0BAA0B,GAAG,CAAC,QAAQ,EAAE,GAAG,CAC/E,CAAA;QACD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;QACtC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AsyncActivity } from './AsyncActivity.js';
|
|
2
|
+
import type { SyncActivity } from './SyncActivity.js';
|
|
3
|
+
import type { Serializable } from '../typings/Serializable.js';
|
|
4
|
+
export type AnyActivity = Activity<readonly any[], any, any, any>;
|
|
5
|
+
export type Activity<TArgs extends readonly any[] = readonly any[], TInput extends Serializable = any, TSerializableOutput extends Serializable = any, TOutput = any> = AsyncActivity<TArgs, TInput, TSerializableOutput, TOutput, any, any> | SyncActivity<TArgs, TInput, TSerializableOutput, TOutput>;
|
|
6
|
+
export type ActivityConstructor<T extends Activity> = new () => T;
|
|
7
|
+
export declare namespace Activity {
|
|
8
|
+
type Constructor<T extends Activity> = new () => T;
|
|
9
|
+
type Args<T extends Activity> = T extends Activity<infer TArgs> ? Exclude<TArgs, []> : never;
|
|
10
|
+
type Input<T extends Activity> = T extends Activity<any, infer TInput> ? TInput : never;
|
|
11
|
+
type Output<T extends Activity> = T extends Activity<any, any, any, infer TOutput> ? TOutput : never;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=Activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Activity.d.ts","sourceRoot":"","sources":["../../src/models/Activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE9D,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAEjE,MAAM,MAAM,QAAQ,CAClB,KAAK,SAAS,SAAS,GAAG,EAAE,GAAG,SAAS,GAAG,EAAE,EAC7C,MAAM,SAAS,YAAY,GAAG,GAAG,EACjC,mBAAmB,SAAS,YAAY,GAAG,GAAG,EAC9C,OAAO,GAAG,GAAG,IAEX,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GACpE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAA;AAE7D,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,QAAQ,IAAI,UAAU,CAAC,CAAA;AAEjE,yBAAiB,QAAQ,CAAC;IACxB,KAAY,WAAW,CAAC,CAAC,SAAS,QAAQ,IAAI,UAAU,CAAC,CAAA;IAEzD,KAAY,IAAI,CAAC,CAAC,SAAS,QAAQ,IACjC,CAAC,SAAS,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAA;IAE9D,KAAY,KAAK,CAAC,CAAC,SAAS,QAAQ,IAClC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAA;IAExD,KAAY,MAAM,CAAC,CAAC,SAAS,QAAQ,IACnC,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,GAAG,OAAO,GAAG,KAAK,CAAA;CACrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Activity.js","sourceRoot":"","sources":["../../src/models/Activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type ActivityClaimMap = Record<keyof any, abstract new (...args: readonly any[]) => any>;
|
|
2
|
+
export type ClaimProvider<T> = {
|
|
3
|
+
provide: abstract new (...args: readonly any[]) => any;
|
|
4
|
+
value: T;
|
|
5
|
+
};
|
|
6
|
+
export type ActivityClaim<TMap extends ActivityClaimMap> = {
|
|
7
|
+
[K in keyof TMap]: InstanceType<TMap[K]>;
|
|
8
|
+
};
|
|
9
|
+
export interface ActivityClaimConstructor {
|
|
10
|
+
new <TMap extends ActivityClaimMap>(map: TMap): ActivityClaim<TMap>;
|
|
11
|
+
run<T>(claims: readonly ClaimProvider<any>[], fn: () => T): T;
|
|
12
|
+
getClaims(): readonly ClaimProvider<any>[];
|
|
13
|
+
}
|
|
14
|
+
export declare const ActivityClaim: ActivityClaimConstructor;
|
|
15
|
+
//# sourceMappingURL=ActivityClaim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityClaim.d.ts","sourceRoot":"","sources":["../../src/models/ActivityClaim.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,gBAAgB,GAAG,MAAM,CACnC,MAAM,GAAG,EACT,QAAQ,MAAM,GAAG,IAAI,EAAE,SAAS,GAAG,EAAE,KAAK,GAAG,CAC9C,CAAA;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC7B,OAAO,EAAE,QAAQ,MAAM,GAAG,IAAI,EAAE,SAAS,GAAG,EAAE,KAAK,GAAG,CAAA;IACtD,KAAK,EAAE,CAAC,CAAA;CACT,CAAA;AAED,MAAM,MAAM,aAAa,CAAC,IAAI,SAAS,gBAAgB,IAAI;KACxD,CAAC,IAAI,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;CACzC,CAAA;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,IAAI,SAAS,gBAAgB,EAAE,GAAG,EAAE,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACnE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IAC7D,SAAS,IAAI,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAA;CAC3C;AAED,eAAO,MAAM,aAAa,EAqCV,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { ClaimConstructorNotFoundException, ClaimKeyNotFoundException, ClaimProviderNotFoundException, ClaimStorageNotActiveException, } from '../exceptions/ClaimException.js';
|
|
3
|
+
export const ActivityClaim = function (map) {
|
|
4
|
+
return new Proxy({}, {
|
|
5
|
+
get(target, propertyKey) {
|
|
6
|
+
if (!(propertyKey in map))
|
|
7
|
+
throw new ClaimKeyNotFoundException(propertyKey);
|
|
8
|
+
if (!map[propertyKey])
|
|
9
|
+
throw new ClaimConstructorNotFoundException(propertyKey);
|
|
10
|
+
const store = storage.getStore();
|
|
11
|
+
if (!store)
|
|
12
|
+
throw new ClaimStorageNotActiveException();
|
|
13
|
+
const { providers: claims, cache } = store;
|
|
14
|
+
if (cache.has(propertyKey))
|
|
15
|
+
return cache.get(propertyKey);
|
|
16
|
+
const constructor = map[propertyKey];
|
|
17
|
+
const claimProvider = claims.find(claim => claim.provide === constructor);
|
|
18
|
+
if (!claimProvider)
|
|
19
|
+
throw new ClaimProviderNotFoundException(constructor.name, propertyKey);
|
|
20
|
+
cache.set(propertyKey, claimProvider.value);
|
|
21
|
+
return claimProvider.value;
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
ActivityClaim.run = (claims, fn) => storage.run({ providers: claims, cache: new Map() }, fn);
|
|
26
|
+
ActivityClaim.getClaims = () => {
|
|
27
|
+
const store = storage.getStore();
|
|
28
|
+
if (!store)
|
|
29
|
+
throw new ClaimStorageNotActiveException();
|
|
30
|
+
return store.providers;
|
|
31
|
+
};
|
|
32
|
+
const storage = new AsyncLocalStorage();
|
|
33
|
+
//# sourceMappingURL=ActivityClaim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityClaim.js","sourceRoot":"","sources":["../../src/models/ActivityClaim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EACL,iCAAiC,EACjC,yBAAyB,EACzB,8BAA8B,EAC9B,8BAA8B,GAC/B,MAAM,iCAAiC,CAAA;AAsBxC,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,GAAqB;IAC1D,OAAO,IAAI,KAAK,CACd,EAAE,EACF;QACE,GAAG,CAAC,MAAM,EAAE,WAAW;YACrB,IAAI,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC;gBACvB,MAAM,IAAI,yBAAyB,CAAC,WAAW,CAAC,CAAA;YAElD,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;gBACnB,MAAM,IAAI,iCAAiC,CAAC,WAAW,CAAC,CAAA;YAE1D,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;YAEhC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,8BAA8B,EAAE,CAAA;YAEtD,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;YAE1C,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAC,WAAW,CAAE,CAAA;YAE1D,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;YAEpC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAC/B,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,WAAW,CACvC,CAAA;YAED,IAAI,CAAC,aAAa;gBAChB,MAAM,IAAI,8BAA8B,CACtC,WAAW,CAAC,IAAI,EAChB,WAAW,CACZ,CAAA;YAEH,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;YAE3C,OAAO,aAAa,CAAC,KAAK,CAAA;QAC5B,CAAC;KACF,CAC+B,CAAA;AACpC,CAAwC,CAAA;AAExC,aAAa,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CACjC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;AAE1D,aAAa,CAAC,SAAS,GAAG,GAAG,EAAE;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;IAEhC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,8BAA8B,EAAE,CAAA;IAEtD,OAAO,KAAK,CAAC,SAAS,CAAA;AACxB,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAGjC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Activity } from './Activity.js';
|
|
2
|
+
export interface IActivityHistory {
|
|
3
|
+
output: any;
|
|
4
|
+
}
|
|
5
|
+
export declare class PushActivity<T extends Activity> {
|
|
6
|
+
readonly activity: T;
|
|
7
|
+
readonly input: Activity.Input<T>;
|
|
8
|
+
constructor(activity: T, input: Activity.Input<T>);
|
|
9
|
+
}
|
|
10
|
+
export declare namespace ActivityHistory {
|
|
11
|
+
function bind<T extends Activity>(Activity: new () => T): (...args: Activity.Args<T>) => Promise<Activity.Output<T>>;
|
|
12
|
+
function reconciler<T extends Activity>(Activity: new () => T, ...args: Activity.Args<T>): Promise<Activity.Output<T>>;
|
|
13
|
+
function run<T>(history: readonly IActivityHistory[], fn: () => T): T;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=ActivityHistory.d.ts.map
|