@effect/workflow 0.12.4 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Activity.js +2 -6
- package/dist/cjs/Activity.js.map +1 -1
- package/dist/cjs/DurableClock.js +1 -2
- package/dist/cjs/DurableClock.js.map +1 -1
- package/dist/cjs/DurableDeferred.js +16 -18
- package/dist/cjs/DurableDeferred.js.map +1 -1
- package/dist/cjs/Workflow.js +8 -57
- package/dist/cjs/Workflow.js.map +1 -1
- package/dist/cjs/WorkflowEngine.js +234 -3
- package/dist/cjs/WorkflowEngine.js.map +1 -1
- package/dist/dts/Activity.d.ts +1 -0
- package/dist/dts/Activity.d.ts.map +1 -1
- package/dist/dts/DurableClock.d.ts.map +1 -1
- package/dist/dts/DurableDeferred.d.ts +2 -2
- package/dist/dts/DurableDeferred.d.ts.map +1 -1
- package/dist/dts/Workflow.d.ts +2 -2
- package/dist/dts/Workflow.d.ts.map +1 -1
- package/dist/dts/WorkflowEngine.d.ts +59 -30
- package/dist/dts/WorkflowEngine.d.ts.map +1 -1
- package/dist/esm/Activity.js +2 -6
- package/dist/esm/Activity.js.map +1 -1
- package/dist/esm/DurableClock.js +1 -2
- package/dist/esm/DurableClock.js.map +1 -1
- package/dist/esm/DurableDeferred.js +16 -18
- package/dist/esm/DurableDeferred.js.map +1 -1
- package/dist/esm/Workflow.js +7 -56
- package/dist/esm/Workflow.js.map +1 -1
- package/dist/esm/WorkflowEngine.js +232 -2
- package/dist/esm/WorkflowEngine.js.map +1 -1
- package/package.json +5 -5
- package/src/Activity.ts +3 -8
- package/src/DurableClock.ts +1 -2
- package/src/DurableDeferred.ts +24 -30
- package/src/Workflow.ts +9 -65
- package/src/WorkflowEngine.ts +509 -44
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import * as Context from "effect/Context";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Exit from "effect/Exit";
|
|
4
|
+
import * as Fiber from "effect/Fiber";
|
|
5
|
+
import * as FiberMap from "effect/FiberMap";
|
|
6
|
+
import * as Layer from "effect/Layer";
|
|
7
|
+
import * as Option from "effect/Option";
|
|
8
|
+
import * as Schedule from "effect/Schedule";
|
|
9
|
+
import * as Schema from "effect/Schema";
|
|
10
|
+
import * as Workflow from "./Workflow.js";
|
|
3
11
|
/**
|
|
4
|
-
* @since
|
|
12
|
+
* @since 4.0.0
|
|
5
13
|
* @category Services
|
|
6
14
|
*/
|
|
7
15
|
export class WorkflowEngine extends /*#__PURE__*/Context.Tag("@effect/workflow/WorkflowEngine")() {}
|
|
8
16
|
/**
|
|
9
|
-
* @since
|
|
17
|
+
* @since 4.0.0
|
|
10
18
|
* @category Services
|
|
11
19
|
*/
|
|
12
20
|
export class WorkflowInstance extends /*#__PURE__*/Context.Tag("@effect/workflow/WorkflowEngine/WorkflowInstance")() {
|
|
@@ -24,4 +32,226 @@ export class WorkflowInstance extends /*#__PURE__*/Context.Tag("@effect/workflow
|
|
|
24
32
|
});
|
|
25
33
|
}
|
|
26
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* @since 4.0.0
|
|
37
|
+
* @category Constructors
|
|
38
|
+
*/
|
|
39
|
+
export const makeUnsafe = options => WorkflowEngine.of({
|
|
40
|
+
register: Effect.fnUntraced(function* (workflow, execute) {
|
|
41
|
+
const context = yield* Effect.context();
|
|
42
|
+
yield* options.register(workflow, (payload, executionId) => Effect.suspend(() => execute(payload, executionId)).pipe(Effect.mapInputContext(input => Context.merge(context, input))));
|
|
43
|
+
}),
|
|
44
|
+
execute: Effect.fnUntraced(function* (self, opts) {
|
|
45
|
+
const payload = opts.payload;
|
|
46
|
+
const executionId = opts.executionId;
|
|
47
|
+
const suspendedRetrySchedule = opts.suspendedRetrySchedule ?? defaultRetrySchedule;
|
|
48
|
+
yield* Effect.annotateCurrentSpan({
|
|
49
|
+
executionId
|
|
50
|
+
});
|
|
51
|
+
let result;
|
|
52
|
+
// link interruption with parent workflow
|
|
53
|
+
const parentInstance = yield* Effect.serviceOption(WorkflowInstance);
|
|
54
|
+
if (Option.isSome(parentInstance)) {
|
|
55
|
+
const instance = parentInstance.value;
|
|
56
|
+
yield* Effect.addFinalizer(() => {
|
|
57
|
+
if (!instance.interrupted || result?._tag === "Complete") {
|
|
58
|
+
return Effect.void;
|
|
59
|
+
}
|
|
60
|
+
return options.interrupt(self, executionId);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (opts.discard) {
|
|
64
|
+
yield* options.execute(self, {
|
|
65
|
+
executionId,
|
|
66
|
+
payload: payload,
|
|
67
|
+
discard: true
|
|
68
|
+
});
|
|
69
|
+
return executionId;
|
|
70
|
+
}
|
|
71
|
+
const run = options.execute(self, {
|
|
72
|
+
executionId,
|
|
73
|
+
payload: payload,
|
|
74
|
+
discard: false,
|
|
75
|
+
parent: Option.getOrUndefined(parentInstance)
|
|
76
|
+
});
|
|
77
|
+
if (Option.isSome(parentInstance)) {
|
|
78
|
+
result = yield* Workflow.wrapActivityResult(run, result => result._tag === "Suspended");
|
|
79
|
+
if (result._tag === "Suspended") {
|
|
80
|
+
return yield* Workflow.suspend(parentInstance.value);
|
|
81
|
+
}
|
|
82
|
+
return yield* result.exit;
|
|
83
|
+
}
|
|
84
|
+
let sleep;
|
|
85
|
+
while (true) {
|
|
86
|
+
result = yield* run;
|
|
87
|
+
if (result._tag === "Complete") {
|
|
88
|
+
return yield* result.exit;
|
|
89
|
+
}
|
|
90
|
+
sleep ??= (yield* Schedule.driver(suspendedRetrySchedule)).next(void 0).pipe(Effect.catchAll(() => Effect.dieMessage(`${self.name}.execute: suspendedRetrySchedule exhausted`)));
|
|
91
|
+
yield* sleep;
|
|
92
|
+
}
|
|
93
|
+
}),
|
|
94
|
+
poll: options.poll,
|
|
95
|
+
interrupt: options.interrupt,
|
|
96
|
+
resume: options.resume,
|
|
97
|
+
activityExecute: Effect.fnUntraced(function* (activity, attempt) {
|
|
98
|
+
const result = yield* options.activityExecute(activity, attempt);
|
|
99
|
+
if (result._tag === "Suspended") {
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
const exit = yield* Effect.orDie(Schema.decode(activity.exitSchema)(result.exit));
|
|
103
|
+
return new Workflow.Complete({
|
|
104
|
+
exit
|
|
105
|
+
});
|
|
106
|
+
}),
|
|
107
|
+
deferredResult: Effect.fnUntraced(function* (deferred) {
|
|
108
|
+
const instance = yield* WorkflowInstance;
|
|
109
|
+
yield* Effect.annotateCurrentSpan({
|
|
110
|
+
executionId: instance.executionId
|
|
111
|
+
});
|
|
112
|
+
const exit = yield* options.deferredResult(deferred);
|
|
113
|
+
if (exit === undefined) {
|
|
114
|
+
return exit;
|
|
115
|
+
}
|
|
116
|
+
return yield* Effect.orDie(Schema.decodeUnknown(deferred.exitSchema)(exit));
|
|
117
|
+
}),
|
|
118
|
+
deferredDone: Effect.fnUntraced(function* (deferred, opts) {
|
|
119
|
+
return yield* options.deferredDone({
|
|
120
|
+
workflowName: opts.workflowName,
|
|
121
|
+
executionId: opts.executionId,
|
|
122
|
+
deferredName: opts.deferredName,
|
|
123
|
+
exit: yield* Schema.encode(deferred.exitSchema)(opts.exit)
|
|
124
|
+
});
|
|
125
|
+
}),
|
|
126
|
+
scheduleClock: options.scheduleClock
|
|
127
|
+
});
|
|
128
|
+
const defaultRetrySchedule = /*#__PURE__*/Schedule.exponential(200, 1.5).pipe(/*#__PURE__*/Schedule.either(/*#__PURE__*/Schedule.spaced(30000)));
|
|
129
|
+
/**
|
|
130
|
+
* @since 1.0.0
|
|
131
|
+
* @category In-memory
|
|
132
|
+
*/
|
|
133
|
+
export const layerMemory = /*#__PURE__*/Layer.scoped(WorkflowEngine, /*#__PURE__*/Effect.gen(function* () {
|
|
134
|
+
const scope = yield* Effect.scope;
|
|
135
|
+
const workflows = new Map();
|
|
136
|
+
const executions = new Map();
|
|
137
|
+
const activities = new Map();
|
|
138
|
+
const resume = Effect.fnUntraced(function* (executionId) {
|
|
139
|
+
const state = executions.get(executionId);
|
|
140
|
+
if (!state) return;
|
|
141
|
+
const exit = state.fiber?.unsafePoll();
|
|
142
|
+
if (exit && exit._tag === "Success" && exit.value._tag === "Complete") {
|
|
143
|
+
return;
|
|
144
|
+
} else if (state.fiber && !exit) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const entry = workflows.get(state.instance.workflow.name);
|
|
148
|
+
const instance = WorkflowInstance.initial(state.instance.workflow, state.instance.executionId);
|
|
149
|
+
instance.interrupted = state.instance.interrupted;
|
|
150
|
+
state.instance = instance;
|
|
151
|
+
state.fiber = yield* state.execute(state.payload, state.instance.executionId).pipe(Effect.onExit(() => {
|
|
152
|
+
if (!instance.interrupted) {
|
|
153
|
+
return Effect.void;
|
|
154
|
+
}
|
|
155
|
+
instance.suspended = false;
|
|
156
|
+
return Effect.withFiberRuntime(fiber => Effect.interruptible(Fiber.interrupt(fiber)));
|
|
157
|
+
}), Workflow.intoResult, Effect.provideService(WorkflowInstance, instance), Effect.provideService(WorkflowEngine, engine), Effect.tap(result => {
|
|
158
|
+
if (!state.parent || result._tag !== "Complete") {
|
|
159
|
+
return Effect.void;
|
|
160
|
+
}
|
|
161
|
+
return Effect.forkIn(resume(state.parent), scope);
|
|
162
|
+
}), Effect.forkIn(entry.scope));
|
|
163
|
+
});
|
|
164
|
+
const deferredResults = new Map();
|
|
165
|
+
const clocks = yield* FiberMap.make();
|
|
166
|
+
const engine = makeUnsafe({
|
|
167
|
+
register: Effect.fnUntraced(function* (workflow, execute) {
|
|
168
|
+
workflows.set(workflow.name, {
|
|
169
|
+
workflow,
|
|
170
|
+
execute,
|
|
171
|
+
scope: yield* Effect.scope
|
|
172
|
+
});
|
|
173
|
+
}),
|
|
174
|
+
execute: Effect.fnUntraced(function* (workflow, options) {
|
|
175
|
+
const entry = workflows.get(workflow.name);
|
|
176
|
+
if (!entry) {
|
|
177
|
+
return yield* Effect.die(`Workflow ${workflow.name} is not registered`);
|
|
178
|
+
}
|
|
179
|
+
let state = executions.get(options.executionId);
|
|
180
|
+
if (!state) {
|
|
181
|
+
state = {
|
|
182
|
+
payload: options.payload,
|
|
183
|
+
execute: entry.execute,
|
|
184
|
+
instance: WorkflowInstance.initial(workflow, options.executionId),
|
|
185
|
+
fiber: undefined,
|
|
186
|
+
parent: options.parent?.executionId
|
|
187
|
+
};
|
|
188
|
+
executions.set(options.executionId, state);
|
|
189
|
+
yield* resume(options.executionId);
|
|
190
|
+
}
|
|
191
|
+
if (options.discard) return;
|
|
192
|
+
return yield* Fiber.join(state.fiber);
|
|
193
|
+
}),
|
|
194
|
+
interrupt: Effect.fnUntraced(function* (_workflow, executionId) {
|
|
195
|
+
const state = executions.get(executionId);
|
|
196
|
+
if (!state) return;
|
|
197
|
+
state.instance.interrupted = true;
|
|
198
|
+
yield* resume(executionId);
|
|
199
|
+
}),
|
|
200
|
+
resume(_workflow, executionId) {
|
|
201
|
+
return resume(executionId);
|
|
202
|
+
},
|
|
203
|
+
activityExecute: Effect.fnUntraced(function* (activity, attempt) {
|
|
204
|
+
const instance = yield* WorkflowInstance;
|
|
205
|
+
const activityId = `${instance.executionId}/${activity.name}/${attempt}`;
|
|
206
|
+
let state = activities.get(activityId);
|
|
207
|
+
if (state) {
|
|
208
|
+
const exit = state.exit;
|
|
209
|
+
if (exit && exit._tag === "Success" && exit.value._tag === "Suspended") {
|
|
210
|
+
state.exit = undefined;
|
|
211
|
+
} else if (exit) {
|
|
212
|
+
return yield* exit;
|
|
213
|
+
}
|
|
214
|
+
} else {
|
|
215
|
+
state = {
|
|
216
|
+
exit: undefined
|
|
217
|
+
};
|
|
218
|
+
activities.set(activityId, state);
|
|
219
|
+
}
|
|
220
|
+
const activityInstance = WorkflowInstance.initial(instance.workflow, instance.executionId);
|
|
221
|
+
activityInstance.interrupted = instance.interrupted;
|
|
222
|
+
return yield* activity.executeEncoded.pipe(Workflow.intoResult, Effect.provideService(WorkflowInstance, activityInstance), Effect.onExit(exit => {
|
|
223
|
+
state.exit = exit;
|
|
224
|
+
return Effect.void;
|
|
225
|
+
}));
|
|
226
|
+
}),
|
|
227
|
+
poll: (_workflow, executionId) => Effect.suspend(() => {
|
|
228
|
+
const state = executions.get(executionId);
|
|
229
|
+
if (!state) {
|
|
230
|
+
return Effect.succeed(undefined);
|
|
231
|
+
}
|
|
232
|
+
const exit = state.fiber?.unsafePoll();
|
|
233
|
+
return exit ?? Effect.succeed(undefined);
|
|
234
|
+
}),
|
|
235
|
+
deferredResult: Effect.fnUntraced(function* (deferred) {
|
|
236
|
+
const instance = yield* WorkflowInstance;
|
|
237
|
+
const id = `${instance.executionId}/${deferred.name}`;
|
|
238
|
+
return deferredResults.get(id);
|
|
239
|
+
}),
|
|
240
|
+
deferredDone: options => Effect.suspend(() => {
|
|
241
|
+
const id = `${options.executionId}/${options.deferredName}`;
|
|
242
|
+
if (deferredResults.has(id)) return Effect.void;
|
|
243
|
+
deferredResults.set(id, options.exit);
|
|
244
|
+
return resume(options.executionId);
|
|
245
|
+
}),
|
|
246
|
+
scheduleClock: (workflow, options) => engine.deferredDone(options.clock.deferred, {
|
|
247
|
+
workflowName: workflow.name,
|
|
248
|
+
executionId: options.executionId,
|
|
249
|
+
deferredName: options.clock.deferred.name,
|
|
250
|
+
exit: Exit.void
|
|
251
|
+
}).pipe(Effect.delay(options.clock.duration), FiberMap.run(clocks, `${options.executionId}/${options.clock.name}`, {
|
|
252
|
+
onlyIfMissing: true
|
|
253
|
+
}), Effect.asVoid)
|
|
254
|
+
});
|
|
255
|
+
return engine;
|
|
256
|
+
}));
|
|
27
257
|
//# sourceMappingURL=WorkflowEngine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowEngine.js","names":["Context","Effect","WorkflowEngine","Tag","WorkflowInstance","initial","workflow","executionId","of","suspended","interrupted","cause","undefined","activityState","count","latch","unsafeMakeLatch"],"sources":["../../src/WorkflowEngine.ts"],"sourcesContent":[null],"mappings":"AAIA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AASvC;;;;AAIA,OAAM,MAAOC,cAAe,sBAAQF,OAAO,CAACG,GAAG,CAAC,iCAAiC,CAAC,EA+F/E;AAEH;;;;AAIA,OAAM,MAAOC,gBAAiB,sBAAQJ,OAAO,CAACG,GAAG,CAAC,kDAAkD,CAAC,EAkClG;EACD,OAAOE,OAAOA,CAACC,QAAsB,EAAEC,WAAmB;IACxD,OAAOH,gBAAgB,CAACI,EAAE,CAAC;MACzBD,WAAW;MACXD,QAAQ;MACRG,SAAS,EAAE,KAAK;MAChBC,WAAW,EAAE,KAAK;MAClBC,KAAK,EAAEC,SAAS;MAChBC,aAAa,EAAE;QACbC,KAAK,EAAE,CAAC;QACRC,KAAK,EAAEd,MAAM,CAACe,eAAe;;KAEhC,CAAC;EACJ","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"WorkflowEngine.js","names":["Context","Effect","Exit","Fiber","FiberMap","Layer","Option","Schedule","Schema","Workflow","WorkflowEngine","Tag","WorkflowInstance","initial","workflow","executionId","of","suspended","interrupted","cause","undefined","activityState","count","latch","unsafeMakeLatch","makeUnsafe","options","register","fnUntraced","execute","context","payload","suspend","pipe","mapInputContext","input","merge","self","opts","suspendedRetrySchedule","defaultRetrySchedule","annotateCurrentSpan","result","parentInstance","serviceOption","isSome","instance","value","addFinalizer","_tag","void","interrupt","discard","run","parent","getOrUndefined","wrapActivityResult","exit","sleep","driver","next","catchAll","dieMessage","name","poll","resume","activityExecute","activity","attempt","orDie","decode","exitSchema","Complete","deferredResult","deferred","decodeUnknown","deferredDone","workflowName","deferredName","encode","scheduleClock","exponential","either","spaced","layerMemory","scoped","gen","scope","workflows","Map","executions","activities","state","get","fiber","unsafePoll","entry","onExit","withFiberRuntime","interruptible","intoResult","provideService","engine","tap","forkIn","deferredResults","clocks","make","set","die","join","_workflow","activityId","activityInstance","executeEncoded","succeed","id","has","clock","delay","duration","onlyIfMissing","asVoid"],"sources":["../../src/WorkflowEngine.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/workflow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Durable workflows for Effect",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -11,10 +11,10 @@
|
|
|
11
11
|
"sideEffects": [],
|
|
12
12
|
"homepage": "https://effect.website",
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"effect": "^3.19.
|
|
15
|
-
"@effect/experimental": "^0.57.
|
|
16
|
-
"@effect/platform": "^0.93.
|
|
17
|
-
"@effect/rpc": "^0.72.
|
|
14
|
+
"effect": "^3.19.5",
|
|
15
|
+
"@effect/experimental": "^0.57.3",
|
|
16
|
+
"@effect/platform": "^0.93.3",
|
|
17
|
+
"@effect/rpc": "^0.72.2"
|
|
18
18
|
},
|
|
19
19
|
"publishConfig": {
|
|
20
20
|
"provenance": true
|
package/src/Activity.ts
CHANGED
|
@@ -73,6 +73,7 @@ export interface Any {
|
|
|
73
73
|
readonly name: string
|
|
74
74
|
readonly successSchema: Schema.Schema.Any
|
|
75
75
|
readonly errorSchema: Schema.Schema.All
|
|
76
|
+
readonly execute: Effect.Effect<any, any, any>
|
|
76
77
|
readonly executeEncoded: Effect.Effect<any, any, any>
|
|
77
78
|
}
|
|
78
79
|
|
|
@@ -228,19 +229,13 @@ const makeExecute = Effect.fnUntraced(function*<
|
|
|
228
229
|
const attempt = yield* CurrentAttempt
|
|
229
230
|
yield* Effect.annotateCurrentSpan({ executionId: instance.executionId })
|
|
230
231
|
const result = yield* Workflow.wrapActivityResult(
|
|
231
|
-
engine.activityExecute(
|
|
232
|
-
activity,
|
|
233
|
-
attempt
|
|
234
|
-
}),
|
|
232
|
+
engine.activityExecute(activity, attempt),
|
|
235
233
|
(_) => _._tag === "Suspended"
|
|
236
234
|
)
|
|
237
235
|
if (result._tag === "Suspended") {
|
|
238
236
|
return yield* Workflow.suspend(instance)
|
|
239
237
|
}
|
|
240
|
-
|
|
241
|
-
Schema.decode(activity.exitSchema)(result.exit)
|
|
242
|
-
)
|
|
243
|
-
return yield* exit
|
|
238
|
+
return yield* result.exit
|
|
244
239
|
}, (effect, activity) =>
|
|
245
240
|
Effect.withSpan(effect, activity.name, {
|
|
246
241
|
captureStackTrace: false
|
package/src/DurableClock.ts
CHANGED
|
@@ -98,8 +98,7 @@ export const sleep: (
|
|
|
98
98
|
const engine = yield* EngineTag
|
|
99
99
|
const instance = yield* InstanceTag
|
|
100
100
|
const clock = make(options)
|
|
101
|
-
yield* engine.scheduleClock({
|
|
102
|
-
workflow: instance.workflow,
|
|
101
|
+
yield* engine.scheduleClock(instance.workflow, {
|
|
103
102
|
executionId: instance.executionId,
|
|
104
103
|
clock
|
|
105
104
|
})
|
package/src/DurableDeferred.ts
CHANGED
|
@@ -9,7 +9,7 @@ import * as Effect from "effect/Effect"
|
|
|
9
9
|
import * as Encoding from "effect/Encoding"
|
|
10
10
|
import * as Exit from "effect/Exit"
|
|
11
11
|
import { dual } from "effect/Function"
|
|
12
|
-
import * as
|
|
12
|
+
import * as Predicate from "effect/Predicate"
|
|
13
13
|
import * as Schema from "effect/Schema"
|
|
14
14
|
import type * as Activity from "./Activity.js"
|
|
15
15
|
import * as Workflow from "./Workflow.js"
|
|
@@ -39,7 +39,7 @@ export interface DurableDeferred<
|
|
|
39
39
|
readonly name: string
|
|
40
40
|
readonly successSchema: Success
|
|
41
41
|
readonly errorSchema: Error
|
|
42
|
-
readonly exitSchema: Schema.
|
|
42
|
+
readonly exitSchema: Schema.ExitFromSelf<Success, Error, typeof Schema.Defect>
|
|
43
43
|
readonly withActivityAttempt: Effect.Effect<DurableDeferred<Success, Error>>
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -52,7 +52,7 @@ export interface Any {
|
|
|
52
52
|
readonly name: string
|
|
53
53
|
readonly successSchema: Schema.Schema.Any
|
|
54
54
|
readonly errorSchema: Schema.Schema.All
|
|
55
|
-
readonly exitSchema: Schema.
|
|
55
|
+
readonly exitSchema: Schema.ExitFromSelf<any, any, any>
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
/**
|
|
@@ -70,7 +70,7 @@ export const make = <
|
|
|
70
70
|
name,
|
|
71
71
|
successSchema: options?.success ?? Schema.Void as any,
|
|
72
72
|
errorSchema: options?.error ?? Schema.Never as any,
|
|
73
|
-
exitSchema: Schema.
|
|
73
|
+
exitSchema: Schema.ExitFromSelf({
|
|
74
74
|
success: options?.success ?? Schema.Void as any,
|
|
75
75
|
failure: options?.error ?? Schema.Never as any,
|
|
76
76
|
defect: Schema.Defect
|
|
@@ -111,13 +111,14 @@ const await_: <Success extends Schema.Schema.Any, Error extends Schema.Schema.Al
|
|
|
111
111
|
>(self: DurableDeferred<Success, Error>) {
|
|
112
112
|
const engine = yield* EngineTag
|
|
113
113
|
const instance = yield* InstanceTag
|
|
114
|
-
const
|
|
115
|
-
|
|
114
|
+
const exit = yield* Workflow.wrapActivityResult(
|
|
115
|
+
engine.deferredResult(self),
|
|
116
|
+
Predicate.isUndefined
|
|
117
|
+
)
|
|
118
|
+
if (exit === undefined) {
|
|
116
119
|
return yield* Workflow.suspend(instance)
|
|
117
120
|
}
|
|
118
|
-
return yield*
|
|
119
|
-
Schema.decodeUnknown(self.exitSchema)(oexit.value)
|
|
120
|
-
))
|
|
121
|
+
return yield* exit
|
|
121
122
|
})
|
|
122
123
|
|
|
123
124
|
export {
|
|
@@ -165,19 +166,15 @@ export const into: {
|
|
|
165
166
|
Effect.contextWithEffect((context: Context.Context<WorkflowEngine | WorkflowInstance>) => {
|
|
166
167
|
const engine = Context.get(context, EngineTag)
|
|
167
168
|
const instance = Context.get(context, InstanceTag)
|
|
168
|
-
return Effect.onExit(
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
executionId: instance.executionId,
|
|
176
|
-
deferredName: self.name,
|
|
177
|
-
exit: encodedExit as any
|
|
178
|
-
})
|
|
169
|
+
return Effect.onExit(effect, (exit) => {
|
|
170
|
+
if (instance.suspended) return Effect.void
|
|
171
|
+
return engine.deferredDone(self, {
|
|
172
|
+
workflowName: instance.workflow.name,
|
|
173
|
+
executionId: instance.executionId,
|
|
174
|
+
deferredName: self.name,
|
|
175
|
+
exit
|
|
179
176
|
})
|
|
180
|
-
)
|
|
177
|
+
})
|
|
181
178
|
}))
|
|
182
179
|
|
|
183
180
|
/**
|
|
@@ -218,11 +215,9 @@ export const raceAll = <
|
|
|
218
215
|
})
|
|
219
216
|
return Effect.gen(function*() {
|
|
220
217
|
const engine = yield* EngineTag
|
|
221
|
-
const
|
|
222
|
-
if (
|
|
223
|
-
return yield* (Effect.flatten(Effect.
|
|
224
|
-
Schema.decodeUnknown(deferred.exitSchema)(oexit.value)
|
|
225
|
-
)) as Effect.Effect<any, any, any>)
|
|
218
|
+
const exit = yield* Workflow.wrapActivityResult(engine.deferredResult(deferred), Predicate.isUndefined)
|
|
219
|
+
if (exit) {
|
|
220
|
+
return yield* (Effect.flatten(exit) as Effect.Effect<any, any, any>)
|
|
226
221
|
}
|
|
227
222
|
return yield* into(Effect.raceAll(options.effects), deferred)
|
|
228
223
|
})
|
|
@@ -443,14 +438,13 @@ export const done: {
|
|
|
443
438
|
) {
|
|
444
439
|
const engine = yield* EngineTag
|
|
445
440
|
const token = TokenParsed.fromString(options.token)
|
|
446
|
-
|
|
447
|
-
yield* engine.deferredDone({
|
|
441
|
+
yield* engine.deferredDone(self, {
|
|
448
442
|
workflowName: token.workflowName,
|
|
449
443
|
executionId: token.executionId,
|
|
450
444
|
deferredName: token.deferredName,
|
|
451
|
-
exit: exit
|
|
445
|
+
exit: options.exit
|
|
452
446
|
})
|
|
453
|
-
}
|
|
447
|
+
})
|
|
454
448
|
)
|
|
455
449
|
|
|
456
450
|
/**
|
package/src/Workflow.ts
CHANGED
|
@@ -13,7 +13,7 @@ import * as Option from "effect/Option"
|
|
|
13
13
|
import type { Pipeable } from "effect/Pipeable"
|
|
14
14
|
import * as Predicate from "effect/Predicate"
|
|
15
15
|
import * as PrimaryKey from "effect/PrimaryKey"
|
|
16
|
-
import * as Schedule from "effect/Schedule"
|
|
16
|
+
import type * as Schedule from "effect/Schedule"
|
|
17
17
|
import * as Schema from "effect/Schema"
|
|
18
18
|
import type * as AST from "effect/SchemaAST"
|
|
19
19
|
import type * as Scope from "effect/Scope"
|
|
@@ -151,7 +151,7 @@ export interface Workflow<
|
|
|
151
151
|
executionId: string
|
|
152
152
|
) => Effect.Effect<Success["Type"], Error["Type"], R>
|
|
153
153
|
) => Layer.Layer<
|
|
154
|
-
|
|
154
|
+
never,
|
|
155
155
|
never,
|
|
156
156
|
| WorkflowEngine
|
|
157
157
|
| Exclude<R, WorkflowEngine | WorkflowInstance | Execution<Name> | Scope.Scope>
|
|
@@ -278,7 +278,6 @@ export const make = <
|
|
|
278
278
|
readonly annotations?: Context.Context<never>
|
|
279
279
|
}
|
|
280
280
|
): Workflow<Name, Payload extends Schema.Struct.Fields ? Schema.Struct<Payload> : Payload, Success, Error> => {
|
|
281
|
-
const suspendedRetrySchedule = options.suspendedRetrySchedule ?? defaultRetrySchedule
|
|
282
281
|
const makeExecutionId = (payload: any) => makeHashDigest(`${options.name}-${options.idempotencyKey(payload)}`)
|
|
283
282
|
const self: Workflow<Name, any, Success, Error> = {
|
|
284
283
|
[TypeId]: TypeId,
|
|
@@ -305,65 +304,19 @@ export const make = <
|
|
|
305
304
|
const engine = yield* EngineTag
|
|
306
305
|
const executionId = yield* makeExecutionId(payload)
|
|
307
306
|
yield* Effect.annotateCurrentSpan({ executionId })
|
|
308
|
-
|
|
309
|
-
const parentInstance = yield* Effect.serviceOption(InstanceTag)
|
|
310
|
-
let result: Result<unknown, unknown>
|
|
311
|
-
if (Option.isSome(parentInstance)) {
|
|
312
|
-
const instance = parentInstance.value
|
|
313
|
-
yield* Effect.addFinalizer(() => {
|
|
314
|
-
if (!instance.interrupted || result?._tag === "Complete") {
|
|
315
|
-
return Effect.void
|
|
316
|
-
}
|
|
317
|
-
return engine.interrupt(self, executionId)
|
|
318
|
-
})
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
if (opts?.discard) {
|
|
322
|
-
yield* engine.execute({
|
|
323
|
-
workflow: self,
|
|
324
|
-
executionId,
|
|
325
|
-
payload,
|
|
326
|
-
discard: true
|
|
327
|
-
})
|
|
328
|
-
return executionId
|
|
329
|
-
}
|
|
330
|
-
const run = engine.execute({
|
|
331
|
-
workflow: self,
|
|
307
|
+
return yield* engine.execute(self, {
|
|
332
308
|
executionId,
|
|
333
309
|
payload,
|
|
334
|
-
discard:
|
|
335
|
-
|
|
310
|
+
discard: opts?.discard,
|
|
311
|
+
suspendedRetrySchedule: options.suspendedRetrySchedule
|
|
336
312
|
})
|
|
337
|
-
if (Option.isSome(parentInstance)) {
|
|
338
|
-
result = yield* run
|
|
339
|
-
if (result._tag === "Suspended" && !result.cause) {
|
|
340
|
-
yield* engine.resume(self, executionId)
|
|
341
|
-
result = yield* wrapActivityResult(run, (result) => result._tag === "Suspended")
|
|
342
|
-
}
|
|
343
|
-
if (result._tag === "Suspended") {
|
|
344
|
-
return yield* suspend(parentInstance.value)
|
|
345
|
-
}
|
|
346
|
-
return yield* result.exit as Exit.Exit<Success["Type"], Error["Type"]>
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
let sleep: Effect.Effect<any> | undefined
|
|
350
|
-
while (true) {
|
|
351
|
-
result = yield* run
|
|
352
|
-
if (result._tag === "Complete") {
|
|
353
|
-
return yield* result.exit as Exit.Exit<Success["Type"], Error["Type"]>
|
|
354
|
-
}
|
|
355
|
-
sleep ??= (yield* Schedule.driver(suspendedRetrySchedule)).next(void 0).pipe(
|
|
356
|
-
Effect.catchAll(() => Effect.dieMessage(`${options.name}.execute: suspendedRetrySchedule exhausted`))
|
|
357
|
-
)
|
|
358
|
-
yield* sleep
|
|
359
|
-
}
|
|
360
313
|
},
|
|
361
314
|
Effect.withSpan(`${options.name}.execute`, { captureStackTrace: false })
|
|
362
315
|
),
|
|
363
316
|
poll: Effect.fnUntraced(
|
|
364
317
|
function*(executionId: string) {
|
|
365
318
|
const engine = yield* EngineTag
|
|
366
|
-
return yield* engine.poll(
|
|
319
|
+
return yield* engine.poll(self, executionId)
|
|
367
320
|
},
|
|
368
321
|
(effect, executionId) =>
|
|
369
322
|
Effect.withSpan(effect, `${options.name}.poll`, {
|
|
@@ -394,14 +347,9 @@ export const make = <
|
|
|
394
347
|
})
|
|
395
348
|
),
|
|
396
349
|
toLayer: (execute) =>
|
|
397
|
-
Layer.
|
|
398
|
-
const
|
|
399
|
-
|
|
400
|
-
yield* engine.register(self, (payload, executionId) =>
|
|
401
|
-
Effect.suspend(() => execute(payload, executionId)).pipe(
|
|
402
|
-
Effect.mapInputContext((input) => Context.merge(context, input))
|
|
403
|
-
) as any)
|
|
404
|
-
return EngineTag.context(engine)
|
|
350
|
+
Layer.scopedDiscard(Effect.gen(function*() {
|
|
351
|
+
const engine = yield* EngineTag
|
|
352
|
+
return yield* engine.register(self, execute)
|
|
405
353
|
})) as any,
|
|
406
354
|
executionId: (payload) => makeExecutionId(self.payloadSchema.make(payload)),
|
|
407
355
|
withCompensation
|
|
@@ -410,10 +358,6 @@ export const make = <
|
|
|
410
358
|
return self
|
|
411
359
|
}
|
|
412
360
|
|
|
413
|
-
const defaultRetrySchedule = Schedule.exponential(200, 1.5).pipe(
|
|
414
|
-
Schedule.union(Schedule.spaced(30000))
|
|
415
|
-
)
|
|
416
|
-
|
|
417
361
|
/**
|
|
418
362
|
* @since 1.0.0
|
|
419
363
|
* @category Constructors
|