@effect/workflow 0.1.2 → 0.1.4
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/WorkflowProxy/package.json +6 -0
- package/WorkflowProxyServer/package.json +6 -0
- package/dist/cjs/Activity.js +17 -8
- package/dist/cjs/Activity.js.map +1 -1
- package/dist/cjs/DurableDeferred.js +40 -2
- package/dist/cjs/DurableDeferred.js.map +1 -1
- package/dist/cjs/Workflow.js +44 -21
- package/dist/cjs/Workflow.js.map +1 -1
- package/dist/cjs/WorkflowEngine.js +14 -1
- package/dist/cjs/WorkflowEngine.js.map +1 -1
- package/dist/cjs/WorkflowProxy.js +111 -0
- package/dist/cjs/WorkflowProxy.js.map +1 -0
- package/dist/cjs/WorkflowProxyServer.js +61 -0
- package/dist/cjs/WorkflowProxyServer.js.map +1 -0
- package/dist/cjs/index.js +5 -1
- package/dist/dts/Activity.d.ts +13 -6
- package/dist/dts/Activity.d.ts.map +1 -1
- package/dist/dts/DurableDeferred.d.ts +28 -1
- package/dist/dts/DurableDeferred.d.ts.map +1 -1
- package/dist/dts/Workflow.d.ts +28 -1
- package/dist/dts/Workflow.d.ts.map +1 -1
- package/dist/dts/WorkflowEngine.d.ts +6 -5
- package/dist/dts/WorkflowEngine.d.ts.map +1 -1
- package/dist/dts/WorkflowProxy.d.ts +90 -0
- package/dist/dts/WorkflowProxy.d.ts.map +1 -0
- package/dist/dts/WorkflowProxyServer.d.ts +27 -0
- package/dist/dts/WorkflowProxyServer.d.ts.map +1 -0
- package/dist/dts/index.d.ts +8 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/esm/Activity.js +15 -6
- package/dist/esm/Activity.js.map +1 -1
- package/dist/esm/DurableDeferred.js +38 -1
- package/dist/esm/DurableDeferred.js.map +1 -1
- package/dist/esm/Workflow.js +41 -19
- package/dist/esm/Workflow.js.map +1 -1
- package/dist/esm/WorkflowEngine.js +14 -1
- package/dist/esm/WorkflowEngine.js.map +1 -1
- package/dist/esm/WorkflowProxy.js +101 -0
- package/dist/esm/WorkflowProxy.js.map +1 -0
- package/dist/esm/WorkflowProxyServer.js +52 -0
- package/dist/esm/WorkflowProxyServer.js.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -1
- package/package.json +20 -2
- package/src/Activity.ts +47 -13
- package/src/DurableDeferred.ts +103 -2
- package/src/Workflow.ts +111 -22
- package/src/WorkflowEngine.ts +19 -10
- package/src/WorkflowProxy.ts +178 -0
- package/src/WorkflowProxyServer.ts +103 -0
- package/src/index.ts +10 -0
|
@@ -5,6 +5,7 @@ import * as Exit from "effect/Exit";
|
|
|
5
5
|
import { dual } from "effect/Function";
|
|
6
6
|
import * as Option from "effect/Option";
|
|
7
7
|
import * as Schema from "effect/Schema";
|
|
8
|
+
import * as Workflow from "./Workflow.js";
|
|
8
9
|
/**
|
|
9
10
|
* @since 1.0.0
|
|
10
11
|
* @category Symbols
|
|
@@ -30,7 +31,7 @@ const InstanceTag = /*#__PURE__*/Context.GenericTag("@effect/workflow/WorkflowEn
|
|
|
30
31
|
const await_ = /*#__PURE__*/Effect.fnUntraced(function* (self) {
|
|
31
32
|
const engine = yield* EngineTag;
|
|
32
33
|
const instance = yield* InstanceTag;
|
|
33
|
-
const oexit = yield* engine.deferredResult(self);
|
|
34
|
+
const oexit = yield* Workflow.wrapActivityResult(engine.deferredResult(self), Option.isNone);
|
|
34
35
|
if (Option.isNone(oexit)) {
|
|
35
36
|
instance.suspended = true;
|
|
36
37
|
return yield* Effect.interrupt;
|
|
@@ -43,6 +44,42 @@ export {
|
|
|
43
44
|
* @category Combinators
|
|
44
45
|
*/
|
|
45
46
|
await_ as await };
|
|
47
|
+
/**
|
|
48
|
+
* @since 1.0.0
|
|
49
|
+
* @category Combinators
|
|
50
|
+
*/
|
|
51
|
+
export const into = /*#__PURE__*/dual(2, (effect, self) => Effect.contextWithEffect(context => {
|
|
52
|
+
const engine = Context.get(context, EngineTag);
|
|
53
|
+
const instance = Context.get(context, InstanceTag);
|
|
54
|
+
return Effect.onExit(effect, Effect.fnUntraced(function* (exit) {
|
|
55
|
+
if (instance.suspended) return;
|
|
56
|
+
const encodedExit = yield* Effect.orDie(Schema.encode(self.exitSchema)(exit));
|
|
57
|
+
yield* engine.deferredDone({
|
|
58
|
+
workflowName: instance.workflow.name,
|
|
59
|
+
executionId: instance.executionId,
|
|
60
|
+
deferred: self,
|
|
61
|
+
exit: encodedExit
|
|
62
|
+
});
|
|
63
|
+
}));
|
|
64
|
+
}));
|
|
65
|
+
/**
|
|
66
|
+
* @since 1.0.0
|
|
67
|
+
* @category Racing
|
|
68
|
+
*/
|
|
69
|
+
export const raceAll = options => {
|
|
70
|
+
const deferred = make(`raceAll/${options.name}`, {
|
|
71
|
+
success: options.success,
|
|
72
|
+
error: options.error
|
|
73
|
+
});
|
|
74
|
+
return Effect.gen(function* () {
|
|
75
|
+
const engine = yield* EngineTag;
|
|
76
|
+
const oexit = yield* Workflow.wrapActivityResult(engine.deferredResult(deferred), Option.isNone);
|
|
77
|
+
if (Option.isSome(oexit)) {
|
|
78
|
+
return yield* Effect.flatten(Effect.orDie(Schema.decodeUnknown(deferred.exitSchema)(oexit.value)));
|
|
79
|
+
}
|
|
80
|
+
return yield* into(Effect.raceAll(options.effects), deferred);
|
|
81
|
+
});
|
|
82
|
+
};
|
|
46
83
|
/**
|
|
47
84
|
* @since 1.0.0
|
|
48
85
|
* @category Token
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DurableDeferred.js","names":["Context","Effect","Encoding","Exit","dual","Option","Schema","TypeId","Symbol","for","make","name","options","successSchema","success","Void","errorSchema","error","Never","exitSchema","failure","defect","Defect","EngineTag","GenericTag","InstanceTag","await_","fnUntraced","self","engine","instance","oexit","deferredResult","isNone","suspended","interrupt","flatten","orDie","decodeUnknown","value","await","
|
|
1
|
+
{"version":3,"file":"DurableDeferred.js","names":["Context","Effect","Encoding","Exit","dual","Option","Schema","Workflow","TypeId","Symbol","for","make","name","options","successSchema","success","Void","errorSchema","error","Never","exitSchema","failure","defect","Defect","EngineTag","GenericTag","InstanceTag","await_","fnUntraced","self","engine","instance","oexit","wrapActivityResult","deferredResult","isNone","suspended","interrupt","flatten","orDie","decodeUnknown","value","await","into","effect","contextWithEffect","context","get","onExit","exit","encodedExit","encode","deferredDone","workflowName","workflow","executionId","deferred","raceAll","gen","isSome","effects","TokenTypeId","Token","String","pipe","brand","TokenParsed","Class","deferredName","asToken","encodeBase64Url","JSON","stringify","FromString","StringFromBase64Url","compose","parseJson","Tuple","transform","decode","parsed","fromString","decodeSync","encodeSync","token","tokenFromExecutionId","tokenFromPayload","map","payload","done","succeed","fail","failCause","cause"],"sources":["../../src/DurableDeferred.ts"],"sourcesContent":[null],"mappings":"AAMA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,IAAI,MAAM,aAAa;AACnC,SAASC,IAAI,QAAQ,iBAAiB;AACtC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAGzC;;;;AAIA,OAAO,MAAMC,MAAM,gBAAkBC,MAAM,CAACC,GAAG,CAAC,kCAAkC,CAAC;AAmCnF;;;;AAIA,OAAO,MAAMC,IAAI,GAAGA,CAGlBC,IAAY,EAAEC,OAGf,MAAuC;EACtC,CAACL,MAAM,GAAGA,MAAM;EAChBI,IAAI;EACJE,aAAa,EAAED,OAAO,EAAEE,OAAO,IAAIT,MAAM,CAACU,IAAW;EACrDC,WAAW,EAAEJ,OAAO,EAAEK,KAAK,IAAIZ,MAAM,CAACa,KAAY;EAClDC,UAAU,EAAEd,MAAM,CAACH,IAAI,CAAC;IACtBY,OAAO,EAAEF,OAAO,EAAEE,OAAO,IAAIT,MAAM,CAACU,IAAW;IAC/CK,OAAO,EAAER,OAAO,EAAEK,KAAK,IAAIZ,MAAM,CAACa,KAAY;IAC9CG,MAAM,EAAEhB,MAAM,CAACiB;GAChB;CACF,CAAC;AAEF,MAAMC,SAAS,gBAAGxB,OAAO,CAACyB,UAAU,CAClC,iCAAqE,CACtE;AAED,MAAMC,WAAW,gBAAG1B,OAAO,CAACyB,UAAU,CACpC,kDAAwF,CACzF;AAED,MAAME,MAAM,gBAMR1B,MAAM,CAAC2B,UAAU,CAAC,WAGpBC,IAAqC;EACrC,MAAMC,MAAM,GAAG,OAAON,SAAS;EAC/B,MAAMO,QAAQ,GAAG,OAAOL,WAAW;EACnC,MAAMM,KAAK,GAAG,OAAOzB,QAAQ,CAAC0B,kBAAkB,CAACH,MAAM,CAACI,cAAc,CAACL,IAAI,CAAC,EAAExB,MAAM,CAAC8B,MAAM,CAAC;EAC5F,IAAI9B,MAAM,CAAC8B,MAAM,CAACH,KAAK,CAAC,EAAE;IACxBD,QAAQ,CAACK,SAAS,GAAG,IAAI;IACzB,OAAO,OAAOnC,MAAM,CAACoC,SAAS;EAChC;EACA,OAAO,OAAOpC,MAAM,CAACqC,OAAO,CAACrC,MAAM,CAACsC,KAAK,CACvCjC,MAAM,CAACkC,aAAa,CAACX,IAAI,CAACT,UAAU,CAAC,CAACY,KAAK,CAACS,KAAK,CAAC,CACnD,CAAC;AACJ,CAAC,CAAC;AAEF;AACE;;;;AAIAd,MAAM,IAAIe,KAAK;AAGjB;;;;AAIA,OAAO,MAAMC,IAAI,gBAsBbvC,IAAI,CAAC,CAAC,EAAE,CACVwC,MAAwD,EACxDf,IAAqC,KAMrC5B,MAAM,CAAC4C,iBAAiB,CAAEC,OAA2D,IAAI;EACvF,MAAMhB,MAAM,GAAG9B,OAAO,CAAC+C,GAAG,CAACD,OAAO,EAAEtB,SAAS,CAAC;EAC9C,MAAMO,QAAQ,GAAG/B,OAAO,CAAC+C,GAAG,CAACD,OAAO,EAAEpB,WAAW,CAAC;EAClD,OAAOzB,MAAM,CAAC+C,MAAM,CAClBJ,MAAM,EACN3C,MAAM,CAAC2B,UAAU,CAAC,WAAUqB,IAAI;IAC9B,IAAIlB,QAAQ,CAACK,SAAS,EAAE;IACxB,MAAMc,WAAW,GAAG,OAAOjD,MAAM,CAACsC,KAAK,CAACjC,MAAM,CAAC6C,MAAM,CAACtB,IAAI,CAACT,UAAU,CAAC,CAAC6B,IAAI,CAAC,CAAC;IAC7E,OAAOnB,MAAM,CAACsB,YAAY,CAAC;MACzBC,YAAY,EAAEtB,QAAQ,CAACuB,QAAQ,CAAC1C,IAAI;MACpC2C,WAAW,EAAExB,QAAQ,CAACwB,WAAW;MACjCC,QAAQ,EAAE3B,IAAI;MACdoB,IAAI,EAAEC;KACP,CAAC;EACJ,CAAC,CAAC,CACH;AACH,CAAC,CAAC,CAAC;AAEL;;;;AAIA,OAAO,MAAMO,OAAO,GAMlB5C,OAaD,IAQG;EACF,MAAM2C,QAAQ,GAAG7C,IAAI,CAAW,WAAWE,OAAO,CAACD,IAAI,EAAE,EAAE;IACzDG,OAAO,EAAEF,OAAO,CAACE,OAAO;IACxBG,KAAK,EAAEL,OAAO,CAACK;GAChB,CAAC;EACF,OAAOjB,MAAM,CAACyD,GAAG,CAAC,aAAS;IACzB,MAAM5B,MAAM,GAAG,OAAON,SAAS;IAC/B,MAAMQ,KAAK,GAAG,OAAOzB,QAAQ,CAAC0B,kBAAkB,CAACH,MAAM,CAACI,cAAc,CAACsB,QAAQ,CAAC,EAAEnD,MAAM,CAAC8B,MAAM,CAAC;IAChG,IAAI9B,MAAM,CAACsD,MAAM,CAAC3B,KAAK,CAAC,EAAE;MACxB,OAAO,OAAQ/B,MAAM,CAACqC,OAAO,CAACrC,MAAM,CAACsC,KAAK,CACxCjC,MAAM,CAACkC,aAAa,CAACgB,QAAQ,CAACpC,UAAU,CAAC,CAACY,KAAK,CAACS,KAAK,CAAC,CACvD,CAAkC;IACrC;IACA,OAAO,OAAOE,IAAI,CAAC1C,MAAM,CAACwD,OAAO,CAAC5C,OAAO,CAAC+C,OAAO,CAAC,EAAEJ,QAAQ,CAAC;EAC/D,CAAC,CAAC;AACJ,CAAC;AAED;;;;AAIA,OAAO,MAAMK,WAAW,gBAAkBpD,MAAM,CAACC,GAAG,CAAC,wCAAwC,CAAC;AAc9F;;;;AAIA,OAAO,MAAMoD,KAAK,gBAGdxD,MAAM,CAACyD,MAAM,CAACC,IAAI,cACpB1D,MAAM,CAAC2D,KAAK,CAACJ,WAAW,CAAC,CAC1B;AAED;;;;AAIA,OAAM,MAAOK,WAAY,sBAAQ5D,MAAM,CAAC6D,KAAK,CAAc,8CAA8C,CAAC,CAAC;EACzGd,YAAY,EAAE/C,MAAM,CAACyD,MAAM;EAC3BR,WAAW,EAAEjD,MAAM,CAACyD,MAAM;EAC1BK,YAAY,EAAE9D,MAAM,CAACyD;CACtB,CAAC;EACA;;;EAGA,IAAIM,OAAOA,CAAA;IACT,OAAOnE,QAAQ,CAACoE,eAAe,CAACC,IAAI,CAACC,SAAS,CAAC,CAAC,IAAI,CAACnB,YAAY,EAAE,IAAI,CAACE,WAAW,EAAE,IAAI,CAACa,YAAY,CAAC,CAAC,CAAU;EACpH;EAEA;;;EAGA,OAAgBK,UAAU,gBAGtBnE,MAAM,CAACoE,mBAAmB,CAACV,IAAI,cACjC1D,MAAM,CAACqE,OAAO,cAACrE,MAAM,CAACsE,SAAS,cAACtE,MAAM,CAACuE,KAAK,CAACvE,MAAM,CAACyD,MAAM,EAAEzD,MAAM,CAACyD,MAAM,EAAEzD,MAAM,CAACyD,MAAM,CAAC,CAAC,CAAC,eAC3FzD,MAAM,CAACwE,SAAS,CAACZ,WAAW,EAAE;IAC5Ba,MAAM,EAAEA,CAAC,CAAC1B,YAAY,EAAEE,WAAW,EAAEa,YAAY,CAAC,KAChD,IAAIF,WAAW,CAAC;MACdb,YAAY;MACZE,WAAW;MACXa;KACD,CAAC;IACJjB,MAAM,EAAG6B,MAAM,IAAK,CAACA,MAAM,CAAC3B,YAAY,EAAE2B,MAAM,CAACzB,WAAW,EAAEyB,MAAM,CAACZ,YAAY;GAClF,CAAC,CACH;EAED;;;EAGA,OAAgBa,UAAU,gBAAG3E,MAAM,CAAC4E,UAAU,CAAChB,WAAW,CAACO,UAAU,CAAC;EAEtE;;;EAGA,OAAgBtB,MAAM,gBAAG7C,MAAM,CAAC6E,UAAU,CAACjB,WAAW,CAACO,UAAU,CAAC;;AAGpE;;;;AAIA,OAAO,MAAMW,KAAK,gBAEmCnF,MAAM,CAAC2B,UAAU,CAAC,WAGrEC,IAAqC;EACrC,MAAME,QAAQ,GAAG,OAAOL,WAAW;EACnC,OAAO2D,oBAAoB,CAACxD,IAAI,EAAEE,QAAQ,CAAC;AAC7C,CAAC,CAAC;AAEF;;;;AAIA,OAAO,MAAMsD,oBAAoB,gBAqB7BjF,IAAI,CACN,CAAC,EACD,CACEyB,IAAqC,EACrChB,OAGC,KAED,IAAIqD,WAAW,CAAC;EACdb,YAAY,EAAExC,OAAO,CAACyC,QAAQ,CAAC1C,IAAI;EACnC2C,WAAW,EAAE1C,OAAO,CAAC0C,WAAW;EAChCa,YAAY,EAAEvC,IAAI,CAACjB;CACpB,CAAC,CAACyD,OAAO,CACb;AAED;;;;AAIA,OAAO,MAAMiB,gBAAgB,gBAwBzBlF,IAAI,CACN,CAAC,EACD,CACEyB,IAAqC,EACrChB,OAGC,KAEDZ,MAAM,CAACsF,GAAG,CAAC1E,OAAO,CAACyC,QAAQ,CAACC,WAAW,CAAC1C,OAAO,CAAC2E,OAAO,CAAC,EAAGjC,WAAW,IACpE8B,oBAAoB,CAACxD,IAAI,EAAE;EACzByB,QAAQ,EAAEzC,OAAO,CAACyC,QAAQ;EAC1BC;CACD,CAAC,CAAC,CACR;AAED;;;;AAIA,OAAO,MAAMkC,IAAI,gBA0BbrF,IAAI,CACN,CAAC,eACDH,MAAM,CAAC2B,UAAU,CAAC,WAChBC,IAAqC,EACrChB,OAGC;EAED,MAAMiB,MAAM,GAAG,OAAON,SAAS;EAC/B,MAAM4D,KAAK,GAAGlB,WAAW,CAACe,UAAU,CAACpE,OAAO,CAACuE,KAAK,CAAC;EACnD,MAAMnC,IAAI,GAAG,OAAO3C,MAAM,CAAC6C,MAAM,CAACtB,IAAI,CAACT,UAAU,CAAC,CAACP,OAAO,CAACoC,IAAI,CAAC;EAChE,OAAOnB,MAAM,CAACsB,YAAY,CAAC;IACzBC,YAAY,EAAE+B,KAAK,CAAC/B,YAAY;IAChCE,WAAW,EAAE6B,KAAK,CAAC7B,WAAW;IAC9BC,QAAQ,EAAE3B,IAAI;IACdoB,IAAI,EAAEA;GACP,CAAC;AACJ,CAAC,EAAEhD,MAAM,CAACsC,KAAK,CAAC,CACjB;AAED;;;;AAIA,OAAO,MAAMmD,OAAO,gBAsBhBtF,IAAI,CACN,CAAC,EACD,CACEyB,IAAqC,EACrChB,OAGC,KAED4E,IAAI,CAAC5D,IAAI,EAAE;EACTuD,KAAK,EAAEvE,OAAO,CAACuE,KAAK;EACpBnC,IAAI,EAAE9C,IAAI,CAACuF,OAAO,CAAC7E,OAAO,CAAC4B,KAAK;CACjC,CAAC,CACL;AAED;;;;AAIA,OAAO,MAAMkD,IAAI,gBAsBbvF,IAAI,CACN,CAAC,EACD,CACEyB,IAAqC,EACrChB,OAGC,KAED4E,IAAI,CAAC5D,IAAI,EAAE;EACTuD,KAAK,EAAEvE,OAAO,CAACuE,KAAK;EACpBnC,IAAI,EAAE9C,IAAI,CAACwF,IAAI,CAAC9E,OAAO,CAACK,KAAK;CAC9B,CAAC,CACL;AAED;;;;AAIA,OAAO,MAAM0E,SAAS,gBAsBlBxF,IAAI,CACN,CAAC,EACD,CACEyB,IAAqC,EACrChB,OAGC,KAED4E,IAAI,CAAC5D,IAAI,EAAE;EACTuD,KAAK,EAAEvE,OAAO,CAACuE,KAAK;EACpBnC,IAAI,EAAE9C,IAAI,CAACyF,SAAS,CAAC/E,OAAO,CAACgF,KAAK;CACnC,CAAC,CACL","ignoreList":[]}
|
package/dist/esm/Workflow.js
CHANGED
|
@@ -29,6 +29,19 @@ export const make = options => {
|
|
|
29
29
|
payloadSchema: Schema.isSchema(options.payload) ? options.payload : Schema.Struct(options.payload),
|
|
30
30
|
successSchema: options.success ?? Schema.Void,
|
|
31
31
|
errorSchema: options.error ?? Schema.Never,
|
|
32
|
+
annotations: options.annotations ?? Context.empty(),
|
|
33
|
+
annotate(tag, value) {
|
|
34
|
+
return make({
|
|
35
|
+
...options,
|
|
36
|
+
annotations: Context.add(self.annotations, tag, value)
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
annotateContext(context) {
|
|
40
|
+
return make({
|
|
41
|
+
...options,
|
|
42
|
+
annotations: Context.merge(self.annotations, context)
|
|
43
|
+
});
|
|
44
|
+
},
|
|
32
45
|
execute: Effect.fnUntraced(function* (fields, opts) {
|
|
33
46
|
const payload = self.payloadSchema.make(fields);
|
|
34
47
|
const engine = yield* EngineTag;
|
|
@@ -55,7 +68,6 @@ export const make = options => {
|
|
|
55
68
|
if (result._tag === "Complete") {
|
|
56
69
|
return yield* result.exit;
|
|
57
70
|
}
|
|
58
|
-
// @effect-diagnostics effect/floatingEffect:off
|
|
59
71
|
sleep ??= (yield* Schedule.driver(suspendedRetrySchedule)).next(void 0).pipe(Effect.catchAll(() => Effect.dieMessage(`${options.name}.execute: suspendedRetrySchedule exhausted`)));
|
|
60
72
|
yield* sleep;
|
|
61
73
|
}
|
|
@@ -168,17 +180,35 @@ export const Result = options => Schema.Union(Complete.Schema(options), Suspende
|
|
|
168
180
|
* @since 1.0.0
|
|
169
181
|
* @category Result
|
|
170
182
|
*/
|
|
171
|
-
export const intoResult = effect => Effect.
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
183
|
+
export const intoResult = effect => Effect.contextWithEffect(context => {
|
|
184
|
+
const instance = Context.get(context, InstanceTag);
|
|
185
|
+
return Effect.uninterruptibleMask(restore => restore(effect).pipe(Effect.scoped, Effect.matchCause({
|
|
186
|
+
onSuccess: value => new Complete({
|
|
187
|
+
exit: Exit.succeed(value)
|
|
188
|
+
}),
|
|
189
|
+
onFailure: cause => instance.suspended ? new Suspended() : new Complete({
|
|
178
190
|
exit: Exit.failCause(cause)
|
|
179
|
-
})
|
|
191
|
+
})
|
|
192
|
+
})));
|
|
193
|
+
});
|
|
194
|
+
/**
|
|
195
|
+
* @since 1.0.0
|
|
196
|
+
* @category Result
|
|
197
|
+
*/
|
|
198
|
+
export const wrapActivityResult = (effect, isSuspend) => Effect.contextWithEffect(context => {
|
|
199
|
+
const instance = Context.get(context, InstanceTag);
|
|
200
|
+
const state = instance.activityState;
|
|
201
|
+
if (instance.suspended) {
|
|
202
|
+
return state.count > 0 ? state.latch.await.pipe(Effect.andThen(Effect.yieldNow()), Effect.andThen(Effect.interrupt)) : Effect.interrupt;
|
|
180
203
|
}
|
|
181
|
-
|
|
204
|
+
if (state.count === 0) state.latch.unsafeClose();
|
|
205
|
+
state.count++;
|
|
206
|
+
return Effect.onExit(effect, exit => {
|
|
207
|
+
state.count--;
|
|
208
|
+
const isSuspended = Exit.isSuccess(exit) && isSuspend(exit.value);
|
|
209
|
+
return state.count === 0 ? state.latch.open : isSuspended ? state.latch.await : Effect.void;
|
|
210
|
+
});
|
|
211
|
+
});
|
|
182
212
|
/**
|
|
183
213
|
* Add compensation logic to an effect inside a Workflow. The compensation finalizer will be
|
|
184
214
|
* called if the entire workflow fails, allowing you to perform cleanup or
|
|
@@ -190,13 +220,5 @@ export const intoResult = effect => Effect.uninterruptibleMask(restore => Effect
|
|
|
190
220
|
* @since 1.0.0
|
|
191
221
|
* @category Compensation
|
|
192
222
|
*/
|
|
193
|
-
export const withCompensation = /*#__PURE__*/dual(2, (effect, compensation) => Effect.uninterruptibleMask(restore => Effect.contextWithEffect(context =>
|
|
194
|
-
const instance = Context.get(context, InstanceTag);
|
|
195
|
-
return Effect.tap(restore(effect), value => Effect.addFinalizer(exit => {
|
|
196
|
-
if (Exit.isSuccess(exit) || instance.suspended) {
|
|
197
|
-
return Effect.void;
|
|
198
|
-
}
|
|
199
|
-
return compensation(value, exit.cause);
|
|
200
|
-
}));
|
|
201
|
-
})));
|
|
223
|
+
export const withCompensation = /*#__PURE__*/dual(2, (effect, compensation) => Effect.uninterruptibleMask(restore => Effect.tap(restore(effect), value => Effect.contextWithEffect(context => Effect.addFinalizer(exit => Exit.isSuccess(exit) || Context.get(context, InstanceTag).suspended ? Effect.void : compensation(value, exit.cause))))));
|
|
202
224
|
//# sourceMappingURL=Workflow.js.map
|
package/dist/esm/Workflow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Workflow.js","names":["Context","Data","Effect","Exit","dual","Layer","Predicate","PrimaryKey","Schedule","Schema","makeHashDigest","TypeId","Symbol","for","EngineTag","GenericTag","InstanceTag","make","options","suspendedRetrySchedule","defaultRetrySchedule","makeExecutionId","payload","name","idempotencyKey","self","payloadSchema","isSchema","Struct","successSchema","success","Void","errorSchema","error","Never","execute","fnUntraced","fields","opts","engine","executionId","annotateCurrentSpan","discard","workflow","sleep","result","_tag","exit","driver","next","pipe","catchAll","dieMessage","withSpan","captureStackTrace","interrupt","effect","attributes","toLayer","effectContext","gen","
|
|
1
|
+
{"version":3,"file":"Workflow.js","names":["Context","Data","Effect","Exit","dual","Layer","Predicate","PrimaryKey","Schedule","Schema","makeHashDigest","TypeId","Symbol","for","EngineTag","GenericTag","InstanceTag","make","options","suspendedRetrySchedule","defaultRetrySchedule","makeExecutionId","payload","name","idempotencyKey","self","payloadSchema","isSchema","Struct","successSchema","success","Void","errorSchema","error","Never","annotations","empty","annotate","tag","value","add","annotateContext","context","merge","execute","fnUntraced","fields","opts","engine","executionId","annotateCurrentSpan","discard","workflow","sleep","result","_tag","exit","driver","next","pipe","catchAll","dieMessage","withSpan","captureStackTrace","interrupt","effect","attributes","toLayer","effectContext","gen","get","register","provide","withCompensation","exponential","union","spaced","fromTaggedRequest","schema","failure","ResultTypeId","isResult","u","hasProperty","Complete","TaggedClass","SchemaFromSelf","_options","declare","SchemaEncoded","defect","Defect","transform","decode","fromA","encode","toI","Suspended","Result","Union","intoResult","contextWithEffect","instance","uninterruptibleMask","restore","scoped","matchCause","onSuccess","succeed","onFailure","cause","suspended","failCause","wrapActivityResult","isSuspend","state","activityState","count","latch","await","andThen","yieldNow","unsafeClose","onExit","isSuspended","isSuccess","open","void","compensation","tap","addFinalizer"],"sources":["../../src/Workflow.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
4
|
import * as Context from "effect/Context";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
5
6
|
/**
|
|
6
7
|
* @since 1.0.0
|
|
7
8
|
* @category Services
|
|
@@ -11,5 +12,17 @@ export class WorkflowEngine extends /*#__PURE__*/Context.Tag("@effect/workflow/W
|
|
|
11
12
|
* @since 1.0.0
|
|
12
13
|
* @category Services
|
|
13
14
|
*/
|
|
14
|
-
export class WorkflowInstance extends /*#__PURE__*/Context.Tag("@effect/workflow/WorkflowEngine/WorkflowInstance")() {
|
|
15
|
+
export class WorkflowInstance extends /*#__PURE__*/Context.Tag("@effect/workflow/WorkflowEngine/WorkflowInstance")() {
|
|
16
|
+
static initial(workflow, executionId) {
|
|
17
|
+
return WorkflowInstance.of({
|
|
18
|
+
executionId,
|
|
19
|
+
workflow,
|
|
20
|
+
suspended: false,
|
|
21
|
+
activityState: {
|
|
22
|
+
count: 0,
|
|
23
|
+
latch: Effect.unsafeMakeLatch()
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
15
28
|
//# sourceMappingURL=WorkflowEngine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowEngine.js","names":["Context","WorkflowEngine","Tag","WorkflowInstance"],"sources":["../../src/WorkflowEngine.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;
|
|
1
|
+
{"version":3,"file":"WorkflowEngine.js","names":["Context","Effect","WorkflowEngine","Tag","WorkflowInstance","initial","workflow","executionId","of","suspended","activityState","count","latch","unsafeMakeLatch"],"sources":["../../src/WorkflowEngine.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAQvC;;;;AAIA,OAAM,MAAOC,cAAe,sBAAQF,OAAO,CAACG,GAAG,CAAC,iCAAiC,CAAC,EAyE/E;AAEH;;;;AAIA,OAAM,MAAOC,gBAAiB,sBAAQJ,OAAO,CAACG,GAAG,CAAC,kDAAkD,CAAC,EAuBlG;EACD,OAAOE,OAAOA,CAACC,QAAsB,EAAEC,WAAmB;IACxD,OAAOH,gBAAgB,CAACI,EAAE,CAAC;MACzBD,WAAW;MACXD,QAAQ;MACRG,SAAS,EAAE,KAAK;MAChBC,aAAa,EAAE;QACbC,KAAK,EAAE,CAAC;QACRC,KAAK,EAAEX,MAAM,CAACY,eAAe;;KAEhC,CAAC;EACJ","ignoreList":[]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @since 1.0.0
|
|
3
|
+
*/
|
|
4
|
+
import * as HttpApiEndpoint from "@effect/platform/HttpApiEndpoint";
|
|
5
|
+
import * as HttpApiGroup from "@effect/platform/HttpApiGroup";
|
|
6
|
+
import * as Rpc from "@effect/rpc/Rpc";
|
|
7
|
+
import * as RpcGroup from "@effect/rpc/RpcGroup";
|
|
8
|
+
/**
|
|
9
|
+
* Derives an `RpcGroup` from a list of workflows.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { RpcServer } from "@effect/rpc"
|
|
13
|
+
* import { Workflow, WorkflowProxy, WorkflowProxyServer } from "@effect/workflow"
|
|
14
|
+
* import { Layer, Schema } from "effect"
|
|
15
|
+
*
|
|
16
|
+
* const EmailWorkflow = Workflow.make({
|
|
17
|
+
* name: "EmailWorkflow",
|
|
18
|
+
* payload: {
|
|
19
|
+
* id: Schema.String,
|
|
20
|
+
* to: Schema.String
|
|
21
|
+
* },
|
|
22
|
+
* idempotencyKey: ({ id }) => id
|
|
23
|
+
* })
|
|
24
|
+
*
|
|
25
|
+
* const myWorkflows = [EmailWorkflow] as const
|
|
26
|
+
*
|
|
27
|
+
* // Use WorkflowProxy.toRpcGroup to create a `RpcGroup` from the
|
|
28
|
+
* // workflows
|
|
29
|
+
* class MyRpcs extends WorkflowProxy.toRpcGroup(myWorkflows) {}
|
|
30
|
+
*
|
|
31
|
+
* // Use WorkflowProxyServer.layerRpcHandlers to create a layer that implements
|
|
32
|
+
* // the rpc handlers
|
|
33
|
+
* const ApiLayer = RpcServer.layer(MyRpcs).pipe(
|
|
34
|
+
* Layer.provide(WorkflowProxyServer.layerRpcHandlers(myWorkflows))
|
|
35
|
+
* )
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @since 1.0.0
|
|
39
|
+
* @category Constructors
|
|
40
|
+
*/
|
|
41
|
+
export const toRpcGroup = (workflows, options) => {
|
|
42
|
+
const prefix = options?.prefix ?? "";
|
|
43
|
+
const rpcs = [];
|
|
44
|
+
for (const workflow of workflows) {
|
|
45
|
+
rpcs.push(Rpc.make(`${prefix}${workflow.name}`, {
|
|
46
|
+
payload: workflow.payloadSchema,
|
|
47
|
+
error: workflow.errorSchema,
|
|
48
|
+
success: workflow.successSchema
|
|
49
|
+
}).annotateContext(workflow.annotations), Rpc.make(`${prefix}${workflow.name}Discard`, {
|
|
50
|
+
payload: workflow.payloadSchema
|
|
51
|
+
}).annotateContext(workflow.annotations));
|
|
52
|
+
}
|
|
53
|
+
return RpcGroup.make(...rpcs);
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Derives an `HttpApiGroup` from a list of workflows.
|
|
57
|
+
*
|
|
58
|
+
* ```ts
|
|
59
|
+
* import { HttpApi, HttpApiBuilder } from "@effect/platform"
|
|
60
|
+
* import { Workflow, WorkflowProxy, WorkflowProxyServer } from "@effect/workflow"
|
|
61
|
+
* import { Layer, Schema } from "effect"
|
|
62
|
+
*
|
|
63
|
+
* const EmailWorkflow = Workflow.make({
|
|
64
|
+
* name: "EmailWorkflow",
|
|
65
|
+
* payload: {
|
|
66
|
+
* id: Schema.String,
|
|
67
|
+
* to: Schema.String
|
|
68
|
+
* },
|
|
69
|
+
* idempotencyKey: ({ id }) => id
|
|
70
|
+
* })
|
|
71
|
+
*
|
|
72
|
+
* const myWorkflows = [EmailWorkflow] as const
|
|
73
|
+
*
|
|
74
|
+
* // Use WorkflowProxy.toHttpApiGroup to create a `HttpApiGroup` from the
|
|
75
|
+
* // workflows
|
|
76
|
+
* class MyApi extends HttpApi.make("api")
|
|
77
|
+
* .add(WorkflowProxy.toHttpApiGroup("workflows", myWorkflows))
|
|
78
|
+
* {}
|
|
79
|
+
*
|
|
80
|
+
* // Use WorkflowProxyServer.layerHttpApi to create a layer that implements the
|
|
81
|
+
* // workflows HttpApiGroup
|
|
82
|
+
* const ApiLayer = HttpApiBuilder.api(MyApi).pipe(
|
|
83
|
+
* Layer.provide(WorkflowProxyServer.layerHttpApi(MyApi, "workflows", myWorkflows))
|
|
84
|
+
* )
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* @since 1.0.0
|
|
88
|
+
* @category Constructors
|
|
89
|
+
*/
|
|
90
|
+
export const toHttpApiGroup = (name, workflows) => {
|
|
91
|
+
let group = HttpApiGroup.make(name);
|
|
92
|
+
for (const workflow of workflows) {
|
|
93
|
+
const path = `/${tagToPath(workflow.name)}`;
|
|
94
|
+
group = group.add(HttpApiEndpoint.post(workflow.name, path).setPayload(workflow.payloadSchema).addSuccess(workflow.successSchema).addError(workflow.errorSchema).annotateContext(workflow.annotations)).add(HttpApiEndpoint.post(workflow.name + "Discard", `${path}/discard`).setPayload(workflow.payloadSchema).annotateContext(workflow.annotations));
|
|
95
|
+
}
|
|
96
|
+
return group;
|
|
97
|
+
};
|
|
98
|
+
const tagToPath = tag => tag.replace(/[^a-zA-Z0-9]+/g, "-") // Replace non-alphanumeric characters with hyphen
|
|
99
|
+
.replace(/([a-z])([A-Z])/g, "$1-$2") // Insert hyphen before uppercase letters
|
|
100
|
+
.toLowerCase();
|
|
101
|
+
//# sourceMappingURL=WorkflowProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowProxy.js","names":["HttpApiEndpoint","HttpApiGroup","Rpc","RpcGroup","toRpcGroup","workflows","options","prefix","rpcs","workflow","push","make","name","payload","payloadSchema","error","errorSchema","success","successSchema","annotateContext","annotations","toHttpApiGroup","group","path","tagToPath","add","post","setPayload","addSuccess","addError","tag","replace","toLowerCase"],"sources":["../../src/WorkflowProxy.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,eAAe,MAAM,kCAAkC;AACnE,OAAO,KAAKC,YAAY,MAAM,+BAA+B;AAC7D,OAAO,KAAKC,GAAG,MAAM,iBAAiB;AACtC,OAAO,KAAKC,QAAQ,MAAM,sBAAsB;AAIhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,OAAO,MAAMC,UAAU,GAAGA,CAIxBC,SAAoB,EACpBC,OAEC,KAC4D;EAC7D,MAAMC,MAAM,GAAGD,OAAO,EAAEC,MAAM,IAAI,EAAE;EACpC,MAAMC,IAAI,GAAmB,EAAE;EAC/B,KAAK,MAAMC,QAAQ,IAAIJ,SAAS,EAAE;IAChCG,IAAI,CAACE,IAAI,CACPR,GAAG,CAACS,IAAI,CAAC,GAAGJ,MAAM,GAAGE,QAAQ,CAACG,IAAI,EAAE,EAAE;MACpCC,OAAO,EAAEJ,QAAQ,CAACK,aAAa;MAC/BC,KAAK,EAAEN,QAAQ,CAACO,WAAW;MAC3BC,OAAO,EAAER,QAAQ,CAACS;KACnB,CAAC,CAACC,eAAe,CAACV,QAAQ,CAACW,WAAW,CAAC,EACxClB,GAAG,CAACS,IAAI,CAAC,GAAGJ,MAAM,GAAGE,QAAQ,CAACG,IAAI,SAAS,EAAE;MAC3CC,OAAO,EAAEJ,QAAQ,CAACK;KACnB,CAAC,CAACK,eAAe,CAACV,QAAQ,CAACW,WAAW,CAAC,CACzC;EACH;EACA,OAAOjB,QAAQ,CAACQ,IAAI,CAAC,GAAGH,IAAI,CAAQ;AACtC,CAAC;AAeD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,OAAO,MAAMa,cAAc,GAAGA,CAC5BT,IAAU,EACVP,SAAoB,KACkD;EACtE,IAAIiB,KAAK,GAAGrB,YAAY,CAACU,IAAI,CAACC,IAAI,CAAC;EACnC,KAAK,MAAMH,QAAQ,IAAIJ,SAAS,EAAE;IAChC,MAAMkB,IAAI,GAAG,IAAIC,SAAS,CAACf,QAAQ,CAACG,IAAI,CAAC,EAAW;IACpDU,KAAK,GAAGA,KAAK,CAACG,GAAG,CACfzB,eAAe,CAAC0B,IAAI,CAACjB,QAAQ,CAACG,IAAI,EAAEW,IAAI,CAAC,CACtCI,UAAU,CAAClB,QAAQ,CAACK,aAAa,CAAC,CAClCc,UAAU,CAACnB,QAAQ,CAACS,aAAa,CAAC,CAClCW,QAAQ,CAACpB,QAAQ,CAACO,WAAkB,CAAC,CACrCG,eAAe,CAACV,QAAQ,CAACW,WAAW,CAAC,CACzC,CAACK,GAAG,CACHzB,eAAe,CAAC0B,IAAI,CAACjB,QAAQ,CAACG,IAAI,GAAG,SAAS,EAAE,GAAGW,IAAI,UAAU,CAAC,CAC/DI,UAAU,CAAClB,QAAQ,CAACK,aAAa,CAAC,CAClCK,eAAe,CAACV,QAAQ,CAACW,WAAW,CAAC,CAClC;EACV;EACA,OAAOE,KAAY;AACrB,CAAC;AAED,MAAME,SAAS,GAAIM,GAAW,IAC5BA,GAAG,CACAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;AAAA,CAC/BA,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAAA,CACpCC,WAAW,EAAE","ignoreList":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as HttpApiBuilder from "@effect/platform/HttpApiBuilder";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
/**
|
|
6
|
+
* @since 1.0.0
|
|
7
|
+
* @category Layers
|
|
8
|
+
*/
|
|
9
|
+
export const layerHttpApi = (api, name, workflows) => HttpApiBuilder.group(api, name, Effect.fnUntraced(function* (handlers_) {
|
|
10
|
+
let handlers = handlers_;
|
|
11
|
+
for (const workflow_ of workflows) {
|
|
12
|
+
const workflow = workflow_;
|
|
13
|
+
handlers = handlers.handle(workflow.name, ({
|
|
14
|
+
payload
|
|
15
|
+
}) => workflow.execute(payload)).handle(workflow.name + "Discard", ({
|
|
16
|
+
payload
|
|
17
|
+
}) => workflow.execute(payload, {
|
|
18
|
+
discard: true
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
return handlers;
|
|
22
|
+
}));
|
|
23
|
+
/**
|
|
24
|
+
* @since 1.0.0
|
|
25
|
+
* @category Layers
|
|
26
|
+
*/
|
|
27
|
+
export const layerRpcHandlers = (workflows, options) => Layer.effectContext(Effect.gen(function* () {
|
|
28
|
+
const context = yield* Effect.context();
|
|
29
|
+
const prefix = options?.prefix ?? "";
|
|
30
|
+
const handlers = new Map();
|
|
31
|
+
for (const workflow_ of workflows) {
|
|
32
|
+
const workflow = workflow_;
|
|
33
|
+
const tag = `${prefix}${workflow.name}`;
|
|
34
|
+
const tagDiscard = `${tag}Discard`;
|
|
35
|
+
const key = `@effect/rpc/Rpc/${tag}`;
|
|
36
|
+
const keyDiscard = `${key}Discard`;
|
|
37
|
+
handlers.set(key, {
|
|
38
|
+
context,
|
|
39
|
+
tag,
|
|
40
|
+
handler: payload => workflow.execute(payload)
|
|
41
|
+
});
|
|
42
|
+
handlers.set(keyDiscard, {
|
|
43
|
+
context,
|
|
44
|
+
tag: tagDiscard,
|
|
45
|
+
handler: payload => workflow.execute(payload, {
|
|
46
|
+
discard: true
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return Context.unsafeMake(handlers);
|
|
51
|
+
}));
|
|
52
|
+
//# sourceMappingURL=WorkflowProxyServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowProxyServer.js","names":["HttpApiBuilder","Context","Effect","Layer","layerHttpApi","api","name","workflows","group","fnUntraced","handlers_","handlers","workflow_","workflow","handle","payload","execute","discard","layerRpcHandlers","options","effectContext","gen","context","prefix","Map","tag","tagDiscard","key","keyDiscard","set","handler","unsafeMake"],"sources":["../../src/WorkflowProxyServer.ts"],"sourcesContent":[null],"mappings":"AAIA,OAAO,KAAKA,cAAc,MAAM,iCAAiC;AAIjE,OAAO,KAAKC,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AAIrC;;;;AAIA,OAAO,MAAMC,YAAY,GAAGA,CAQ1BC,GAA+C,EAC/CC,IAAU,EACVC,SAAoB,KAMpBP,cAAc,CAACQ,KAAK,CAClBH,GAAG,EACHC,IAAI,EACJJ,MAAM,CAACO,UAAU,CAAC,WAAUC,SAAS;EACnC,IAAIC,QAAQ,GAAGD,SAAgB;EAC/B,KAAK,MAAME,SAAS,IAAIL,SAAS,EAAE;IACjC,MAAMM,QAAQ,GAAGD,SAAqD;IACtED,QAAQ,GAAGA,QAAQ,CAChBG,MAAM,CACLD,QAAQ,CAACP,IAAW,EACpB,CAAC;MAAES;IAAO,CAAoB,KAAKF,QAAQ,CAACG,OAAO,CAACD,OAAO,CAAC,CAC7D,CACAD,MAAM,CACLD,QAAQ,CAACP,IAAI,GAAG,SAAgB,EAChC,CAAC;MAAES;IAAO,CAAoB,KAAKF,QAAQ,CAACG,OAAO,CAACD,OAAO,EAAE;MAAEE,OAAO,EAAE;IAAI,CAAS,CAAC,CACvF;EACL;EACA,OAAON,QAAwD;AACjE,CAAC,CAAC,CACH;AAEH;;;;AAIA,OAAO,MAAMO,gBAAgB,GAAGA,CAG9BX,SAAoB,EAAEY,OAEvB,KAKChB,KAAK,CAACiB,aAAa,CAAClB,MAAM,CAACmB,GAAG,CAAC,aAAS;EACtC,MAAMC,OAAO,GAAG,OAAOpB,MAAM,CAACoB,OAAO,EAAS;EAC9C,MAAMC,MAAM,GAAGJ,OAAO,EAAEI,MAAM,IAAI,EAAE;EACpC,MAAMZ,QAAQ,GAAG,IAAIa,GAAG,EAA+B;EACvD,KAAK,MAAMZ,SAAS,IAAIL,SAAS,EAAE;IACjC,MAAMM,QAAQ,GAAGD,SAAqD;IACtE,MAAMa,GAAG,GAAG,GAAGF,MAAM,GAAGV,QAAQ,CAACP,IAAI,EAAE;IACvC,MAAMoB,UAAU,GAAG,GAAGD,GAAG,SAAS;IAClC,MAAME,GAAG,GAAG,mBAAmBF,GAAG,EAAE;IACpC,MAAMG,UAAU,GAAG,GAAGD,GAAG,SAAS;IAClChB,QAAQ,CAACkB,GAAG,CAACF,GAAG,EAAE;MAChBL,OAAO;MACPG,GAAG;MACHK,OAAO,EAAGf,OAAY,IAAKF,QAAQ,CAACG,OAAO,CAACD,OAAO;KAC7C,CAAC;IACTJ,QAAQ,CAACkB,GAAG,CAACD,UAAU,EAAE;MACvBN,OAAO;MACPG,GAAG,EAAEC,UAAU;MACfI,OAAO,EAAGf,OAAY,IAAKF,QAAQ,CAACG,OAAO,CAACD,OAAO,EAAE;QAAEE,OAAO,EAAE;MAAI,CAAS;KACvE,CAAC;EACX;EACA,OAAOhB,OAAO,CAAC8B,UAAU,CAACpB,QAAQ,CAAC;AACrC,CAAC,CAAC,CAAC","ignoreList":[]}
|
package/dist/esm/index.js
CHANGED
|
@@ -18,4 +18,12 @@ export * as Workflow from "./Workflow.js";
|
|
|
18
18
|
* @since 1.0.0
|
|
19
19
|
*/
|
|
20
20
|
export * as WorkflowEngine from "./WorkflowEngine.js";
|
|
21
|
+
/**
|
|
22
|
+
* @since 1.0.0
|
|
23
|
+
*/
|
|
24
|
+
export * as WorkflowProxy from "./WorkflowProxy.js";
|
|
25
|
+
/**
|
|
26
|
+
* @since 1.0.0
|
|
27
|
+
*/
|
|
28
|
+
export * as WorkflowProxyServer from "./WorkflowProxyServer.js";
|
|
21
29
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Activity","DurableClock","DurableDeferred","Workflow","WorkflowEngine"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AAEvD;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Activity","DurableClock","DurableDeferred","Workflow","WorkflowEngine","WorkflowProxy","WorkflowProxyServer"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AAEvD;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,mBAAmB,MAAM,0BAA0B","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/workflow",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Durable workflows for Effect",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
"sideEffects": [],
|
|
12
12
|
"homepage": "https://effect.website",
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"effect": "^3.16.
|
|
14
|
+
"effect": "^3.16.4",
|
|
15
|
+
"@effect/rpc": "^0.61.7",
|
|
16
|
+
"@effect/platform": "^0.84.7"
|
|
15
17
|
},
|
|
16
18
|
"publishConfig": {
|
|
17
19
|
"provenance": true
|
|
@@ -50,6 +52,16 @@
|
|
|
50
52
|
"types": "./dist/dts/WorkflowEngine.d.ts",
|
|
51
53
|
"import": "./dist/esm/WorkflowEngine.js",
|
|
52
54
|
"default": "./dist/cjs/WorkflowEngine.js"
|
|
55
|
+
},
|
|
56
|
+
"./WorkflowProxy": {
|
|
57
|
+
"types": "./dist/dts/WorkflowProxy.d.ts",
|
|
58
|
+
"import": "./dist/esm/WorkflowProxy.js",
|
|
59
|
+
"default": "./dist/cjs/WorkflowProxy.js"
|
|
60
|
+
},
|
|
61
|
+
"./WorkflowProxyServer": {
|
|
62
|
+
"types": "./dist/dts/WorkflowProxyServer.d.ts",
|
|
63
|
+
"import": "./dist/esm/WorkflowProxyServer.js",
|
|
64
|
+
"default": "./dist/cjs/WorkflowProxyServer.js"
|
|
53
65
|
}
|
|
54
66
|
},
|
|
55
67
|
"typesVersions": {
|
|
@@ -68,6 +80,12 @@
|
|
|
68
80
|
],
|
|
69
81
|
"WorkflowEngine": [
|
|
70
82
|
"./dist/dts/WorkflowEngine.d.ts"
|
|
83
|
+
],
|
|
84
|
+
"WorkflowProxy": [
|
|
85
|
+
"./dist/dts/WorkflowProxy.d.ts"
|
|
86
|
+
],
|
|
87
|
+
"WorkflowProxyServer": [
|
|
88
|
+
"./dist/dts/WorkflowProxyServer.d.ts"
|
|
71
89
|
]
|
|
72
90
|
}
|
|
73
91
|
}
|
package/src/Activity.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @since 1.0.0
|
|
3
3
|
*/
|
|
4
|
+
import type { NonEmptyReadonlyArray } from "effect/Array"
|
|
4
5
|
import * as Context from "effect/Context"
|
|
5
6
|
import * as Effect from "effect/Effect"
|
|
6
7
|
import * as Effectable from "effect/Effectable"
|
|
7
8
|
import type * as Exit from "effect/Exit"
|
|
8
9
|
import { dual } from "effect/Function"
|
|
9
10
|
import * as Schema from "effect/Schema"
|
|
11
|
+
import type { Scope } from "effect/Scope"
|
|
12
|
+
import * as DurableDeferred from "./DurableDeferred.js"
|
|
10
13
|
import { makeHashDigest } from "./internal/crypto.js"
|
|
14
|
+
import * as Workflow from "./Workflow.js"
|
|
11
15
|
import type { WorkflowEngine, WorkflowInstance } from "./WorkflowEngine.js"
|
|
12
16
|
|
|
13
17
|
/**
|
|
@@ -27,9 +31,9 @@ export type TypeId = typeof TypeId
|
|
|
27
31
|
* @category Models
|
|
28
32
|
*/
|
|
29
33
|
export interface Activity<
|
|
30
|
-
Success extends Schema.Schema.Any,
|
|
31
|
-
Error extends Schema.Schema.All,
|
|
32
|
-
R
|
|
34
|
+
Success extends Schema.Schema.Any = typeof Schema.Void,
|
|
35
|
+
Error extends Schema.Schema.All = typeof Schema.Never,
|
|
36
|
+
R = never
|
|
33
37
|
> extends
|
|
34
38
|
Effect.Effect<
|
|
35
39
|
Success["Type"],
|
|
@@ -49,12 +53,12 @@ export interface Activity<
|
|
|
49
53
|
readonly execute: Effect.Effect<
|
|
50
54
|
Success["Type"],
|
|
51
55
|
Error["Type"],
|
|
52
|
-
Success["Context"] | Error["Context"] | R | WorkflowEngine | WorkflowInstance
|
|
56
|
+
Success["Context"] | Error["Context"] | R | Scope | WorkflowEngine | WorkflowInstance
|
|
53
57
|
>
|
|
54
58
|
readonly executeEncoded: Effect.Effect<
|
|
55
59
|
Success["Encoded"],
|
|
56
60
|
Error["Encoded"],
|
|
57
|
-
Success["Context"] | Error["Context"] | R | WorkflowEngine | WorkflowInstance
|
|
61
|
+
Success["Context"] | Error["Context"] | R | Scope | WorkflowEngine | WorkflowInstance
|
|
58
62
|
>
|
|
59
63
|
}
|
|
60
64
|
|
|
@@ -80,10 +84,10 @@ export const make = <
|
|
|
80
84
|
Error extends Schema.Schema.All = typeof Schema.Never
|
|
81
85
|
>(options: {
|
|
82
86
|
readonly name: string
|
|
83
|
-
readonly success?: Success
|
|
84
|
-
readonly error?: Error
|
|
87
|
+
readonly success?: Success | undefined
|
|
88
|
+
readonly error?: Error | undefined
|
|
85
89
|
readonly execute: Effect.Effect<Success["Type"], Error["Type"], R>
|
|
86
|
-
}): Activity<Success, Error, Exclude<R, WorkflowInstance | WorkflowEngine>> => {
|
|
90
|
+
}): Activity<Success, Error, Exclude<R, WorkflowInstance | WorkflowEngine | Scope>> => {
|
|
87
91
|
const successSchema = options.success ?? Schema.Void as any as Success
|
|
88
92
|
const errorSchema = options.error ?? Schema.Never as any as Error
|
|
89
93
|
// eslint-disable-next-line prefer-const
|
|
@@ -132,7 +136,7 @@ export const retry: typeof Effect.retry = dual(
|
|
|
132
136
|
* @category Attempts
|
|
133
137
|
*/
|
|
134
138
|
export class CurrentAttempt extends Context.Reference<CurrentAttempt>()("@effect/workflow/Activity/CurrentAttempt", {
|
|
135
|
-
defaultValue: () =>
|
|
139
|
+
defaultValue: () => 1
|
|
136
140
|
}) {}
|
|
137
141
|
|
|
138
142
|
/**
|
|
@@ -149,6 +153,33 @@ export const executionIdWithAttempt: Effect.Effect<
|
|
|
149
153
|
return yield* makeHashDigest(`${instance.executionId}-${attempt}`)
|
|
150
154
|
})
|
|
151
155
|
|
|
156
|
+
/**
|
|
157
|
+
* @since 1.0.0
|
|
158
|
+
* @category Racing
|
|
159
|
+
*/
|
|
160
|
+
export const raceAll = <const Activities extends NonEmptyReadonlyArray<Any>>(
|
|
161
|
+
name: string,
|
|
162
|
+
activities: Activities
|
|
163
|
+
): Effect.Effect<
|
|
164
|
+
(Activities[number] extends Activity<infer _A, infer _E, infer _R> ? _A["Type"] : never),
|
|
165
|
+
(Activities[number] extends Activity<infer _A, infer _E, infer _R> ? _E["Type"] : never),
|
|
166
|
+
| (Activities[number] extends Activity<infer Success, infer Error, infer R>
|
|
167
|
+
? Success["Context"] | Error["Context"] | R
|
|
168
|
+
: never)
|
|
169
|
+
| WorkflowEngine
|
|
170
|
+
| WorkflowInstance
|
|
171
|
+
> =>
|
|
172
|
+
DurableDeferred.raceAll({
|
|
173
|
+
name: `Activity/${name}`,
|
|
174
|
+
success: Schema.Union(
|
|
175
|
+
...activities.map((activity) => activity.successSchema)
|
|
176
|
+
),
|
|
177
|
+
error: Schema.Union(
|
|
178
|
+
...activities.map((activity) => activity.errorSchema)
|
|
179
|
+
),
|
|
180
|
+
effects: activities as any
|
|
181
|
+
}) as any
|
|
182
|
+
|
|
152
183
|
// -----------------------------------------------------------------------------
|
|
153
184
|
// internal
|
|
154
185
|
// -----------------------------------------------------------------------------
|
|
@@ -168,10 +199,13 @@ const makeExecute = Effect.fnUntraced(function*<
|
|
|
168
199
|
const engine = yield* EngineTag
|
|
169
200
|
const instance = yield* InstanceTag
|
|
170
201
|
const attempt = yield* CurrentAttempt
|
|
171
|
-
const result = yield*
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
202
|
+
const result = yield* Workflow.wrapActivityResult(
|
|
203
|
+
engine.activityExecute({
|
|
204
|
+
activity,
|
|
205
|
+
attempt
|
|
206
|
+
}),
|
|
207
|
+
(_) => _._tag === "Suspended"
|
|
208
|
+
)
|
|
175
209
|
if (result._tag === "Suspended") {
|
|
176
210
|
instance.suspended = true
|
|
177
211
|
return yield* Effect.interrupt
|