@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.
@@ -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 1.0.0
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 1.0.0
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.12.4",
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.3",
15
- "@effect/experimental": "^0.57.1",
16
- "@effect/platform": "^0.93.2",
17
- "@effect/rpc": "^0.72.1"
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
- const exit = yield* Effect.orDie(
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
@@ -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
  })
@@ -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 Option from "effect/Option"
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.Exit<Success, Error, typeof Schema.Defect>
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.Exit<any, any, any>
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.Exit({
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 oexit = yield* Workflow.wrapActivityResult(engine.deferredResult(self), Option.isNone)
115
- if (Option.isNone(oexit)) {
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* Effect.flatten(Effect.orDie(
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
- effect,
170
- Effect.fnUntraced(function*(exit) {
171
- if (instance.suspended) return
172
- const encodedExit = yield* Effect.orDie(Schema.encode(self.exitSchema)(exit))
173
- yield* engine.deferredDone({
174
- workflowName: instance.workflow.name,
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 oexit = yield* Workflow.wrapActivityResult(engine.deferredResult(deferred), Option.isNone)
222
- if (Option.isSome(oexit)) {
223
- return yield* (Effect.flatten(Effect.orDie(
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
- const exit = yield* Schema.encode(self.exitSchema)(options.exit)
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 as any
445
+ exit: options.exit
452
446
  })
453
- }, Effect.orDie)
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
- WorkflowEngine,
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: false,
335
- parent: Option.getOrUndefined(parentInstance)
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({ workflow: self, executionId })
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.scopedContext(Effect.gen(function*() {
398
- const context = yield* Effect.context<WorkflowEngine>()
399
- const engine = Context.get(context, EngineTag)
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