@effect/workflow 0.12.2 → 0.12.3

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.
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../dist/cjs/DurableRateLimiter.js",
3
+ "module": "../dist/esm/DurableRateLimiter.js",
4
+ "types": "../dist/dts/DurableRateLimiter.d.ts",
5
+ "sideEffects": []
6
+ }
@@ -7,6 +7,7 @@ exports.sleep = exports.make = exports.TypeId = void 0;
7
7
  var Context = _interopRequireWildcard(require("effect/Context"));
8
8
  var Duration = _interopRequireWildcard(require("effect/Duration"));
9
9
  var Effect = _interopRequireWildcard(require("effect/Effect"));
10
+ var Activity = _interopRequireWildcard(require("./Activity.js"));
10
11
  var DurableDeferred = _interopRequireWildcard(require("./DurableDeferred.js"));
11
12
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
13
  /**
@@ -36,6 +37,17 @@ const InstanceTag = /*#__PURE__*/Context.GenericTag("@effect/workflow/WorkflowEn
36
37
  * @category Sleeping
37
38
  */
38
39
  const sleep = exports.sleep = /*#__PURE__*/Effect.fnUntraced(function* (options) {
40
+ const duration = Duration.decode(options.duration);
41
+ if (Duration.isZero(duration)) {
42
+ return;
43
+ }
44
+ const inMemoryThreshold = options.inMemoryThreshold ? Duration.decode(options.inMemoryThreshold) : defaultInMemoryThreshold;
45
+ if (Duration.lessThanOrEqualTo(duration, inMemoryThreshold)) {
46
+ return yield* Activity.make({
47
+ name: `DurableClock/${options.name}`,
48
+ execute: Effect.sleep(duration)
49
+ });
50
+ }
39
51
  const engine = yield* EngineTag;
40
52
  const instance = yield* InstanceTag;
41
53
  const clock = make(options);
@@ -46,4 +58,5 @@ const sleep = exports.sleep = /*#__PURE__*/Effect.fnUntraced(function* (options)
46
58
  });
47
59
  return yield* DurableDeferred.await(clock.deferred);
48
60
  });
61
+ const defaultInMemoryThreshold = /*#__PURE__*/Duration.seconds(60);
49
62
  //# sourceMappingURL=DurableClock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DurableClock.js","names":["Context","_interopRequireWildcard","require","Duration","Effect","DurableDeferred","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","TypeId","exports","Symbol","for","make","options","name","duration","decode","deferred","EngineTag","GenericTag","InstanceTag","sleep","fnUntraced","engine","instance","clock","scheduleClock","workflow","executionId","await"],"sources":["../../src/DurableClock.ts"],"sourcesContent":[null],"mappings":";;;;;;AAGA,IAAAA,OAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAF,uBAAA,CAAAC,OAAA;AACA,IAAAE,MAAA,GAAAH,uBAAA,CAAAC,OAAA;AAEA,IAAAG,eAAA,GAAAJ,uBAAA,CAAAC,OAAA;AAAuD,SAAAD,wBAAAK,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAP,uBAAA,YAAAA,CAAAK,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAPvD;;;;AAUA;;;;AAIO,MAAMkB,MAAM,GAAAC,OAAA,CAAAD,MAAA,gBAAkBE,MAAM,CAACC,GAAG,CAAC,+BAA+B,CAAC;AAmBhF;;;;AAIO,MAAMC,IAAI,GAAIC,OAGpB,KAAoB;EACnB,CAACL,MAAM,GAAGA,MAAM;EAChBM,IAAI,EAAED,OAAO,CAACC,IAAI;EAClBC,QAAQ,EAAE7B,QAAQ,CAAC8B,MAAM,CAACH,OAAO,CAACE,QAAQ,CAAC;EAC3CE,QAAQ,EAAE7B,eAAe,CAACwB,IAAI,CAAC,gBAAgBC,OAAO,CAACC,IAAI,EAAE;CAC9D,CAAC;AAAAL,OAAA,CAAAG,IAAA,GAAAA,IAAA;AAEF,MAAMM,SAAS,gBAAGnC,OAAO,CAACoC,UAAU,CAClC,iCAAqE,CACtE;AAED,MAAMC,WAAW,gBAAGrC,OAAO,CAACoC,UAAU,CACpC,kDAAwF,CACzF;AAED;;;;AAIO,MAAME,KAAK,GAAAZ,OAAA,CAAAY,KAAA,gBASdlC,MAAM,CAACmC,UAAU,CAAC,WAAUT,OAG/B;EACC,MAAMU,MAAM,GAAG,OAAOL,SAAS;EAC/B,MAAMM,QAAQ,GAAG,OAAOJ,WAAW;EACnC,MAAMK,KAAK,GAAGb,IAAI,CAACC,OAAO,CAAC;EAC3B,OAAOU,MAAM,CAACG,aAAa,CAAC;IAC1BC,QAAQ,EAAEH,QAAQ,CAACG,QAAQ;IAC3BC,WAAW,EAAEJ,QAAQ,CAACI,WAAW;IACjCH;GACD,CAAC;EACF,OAAO,OAAOrC,eAAe,CAACyC,KAAK,CAACJ,KAAK,CAACR,QAAQ,CAAC;AACrD,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"DurableClock.js","names":["Context","_interopRequireWildcard","require","Duration","Effect","Activity","DurableDeferred","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","TypeId","exports","Symbol","for","make","options","name","duration","decode","deferred","EngineTag","GenericTag","InstanceTag","sleep","fnUntraced","isZero","inMemoryThreshold","defaultInMemoryThreshold","lessThanOrEqualTo","execute","engine","instance","clock","scheduleClock","workflow","executionId","await","seconds"],"sources":["../../src/DurableClock.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.rateLimit = void 0;
7
+ var RateLimiter = _interopRequireWildcard(require("@effect/experimental/RateLimiter"));
8
+ var Effect = _interopRequireWildcard(require("effect/Effect"));
9
+ var Activity = _interopRequireWildcard(require("./Activity.js"));
10
+ var DurableClock = _interopRequireWildcard(require("./DurableClock.js"));
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
+ /**
13
+ * @since 1.0.0
14
+ */
15
+
16
+ /**
17
+ * @since 1.0.0
18
+ * @category Accessors
19
+ */
20
+ const rateLimit = options => Activity.make({
21
+ name: `DurableRateLimiter/${options.name}`,
22
+ error: RateLimiter.RateLimitStoreError,
23
+ execute: Effect.gen(function* () {
24
+ const limiter = yield* RateLimiter.RateLimiter;
25
+ const result = yield* limiter.consume({
26
+ onExceeded: "delay",
27
+ ...options
28
+ }).pipe(Effect.catchIf(e => e.reason === "Exceeded", Effect.die));
29
+ return yield* DurableClock.sleep({
30
+ name: `DurableRateLimiter/${options.name}`,
31
+ duration: result.delay
32
+ });
33
+ })
34
+ });
35
+ exports.rateLimit = rateLimit;
36
+ //# sourceMappingURL=DurableRateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurableRateLimiter.js","names":["RateLimiter","_interopRequireWildcard","require","Effect","Activity","DurableClock","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","rateLimit","options","make","name","error","RateLimitStoreError","execute","gen","limiter","result","consume","onExceeded","pipe","catchIf","reason","die","sleep","duration","delay","exports"],"sources":["../../src/DurableRateLimiter.ts"],"sourcesContent":[null],"mappings":";;;;;;AAGA,IAAAA,WAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAF,uBAAA,CAAAC,OAAA;AAEA,IAAAE,QAAA,GAAAH,uBAAA,CAAAC,OAAA;AACA,IAAAG,YAAA,GAAAJ,uBAAA,CAAAC,OAAA;AAAiD,SAAAD,wBAAAK,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAP,uBAAA,YAAAA,CAAAK,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AARjD;;;;AAUA;;;;AAIO,MAAMkB,SAAS,GAAIC,OAOzB,IAKCtB,QAAQ,CAACuB,IAAI,CAAC;EACZC,IAAI,EAAE,sBAAsBF,OAAO,CAACE,IAAI,EAAE;EAC1CC,KAAK,EAAE7B,WAAW,CAAC8B,mBAAmB;EACtCC,OAAO,EAAE5B,MAAM,CAAC6B,GAAG,CAAC,aAAS;IAC3B,MAAMC,OAAO,GAAG,OAAOjC,WAAW,CAACA,WAAW;IAC9C,MAAMkC,MAAM,GAAG,OAAOD,OAAO,CAACE,OAAO,CAAC;MACpCC,UAAU,EAAE,OAAO;MACnB,GAAGV;KACJ,CAAC,CAACW,IAAI,CACLlC,MAAM,CAACmC,OAAO,CAAEhC,CAAC,IAAKA,CAAC,CAACiC,MAAM,KAAK,UAAU,EAAEpC,MAAM,CAACqC,GAAG,CAAC,CAC3D;IACD,OAAO,OAAOnC,YAAY,CAACoC,KAAK,CAAC;MAC/Bb,IAAI,EAAE,sBAAsBF,OAAO,CAACE,IAAI,EAAE;MAC1Cc,QAAQ,EAAER,MAAM,CAACS;KAClB,CAAC;EACJ,CAAC;CACF,CAAC;AAAAC,OAAA,CAAAnB,SAAA,GAAAA,SAAA","ignoreList":[]}
package/dist/cjs/index.js CHANGED
@@ -3,13 +3,15 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WorkflowProxyServer = exports.WorkflowProxy = exports.WorkflowEngine = exports.Workflow = exports.DurableDeferred = exports.DurableClock = exports.Activity = void 0;
6
+ exports.WorkflowProxyServer = exports.WorkflowProxy = exports.WorkflowEngine = exports.Workflow = exports.DurableRateLimiter = exports.DurableDeferred = exports.DurableClock = exports.Activity = void 0;
7
7
  var _Activity = _interopRequireWildcard(require("./Activity.js"));
8
8
  exports.Activity = _Activity;
9
9
  var _DurableClock = _interopRequireWildcard(require("./DurableClock.js"));
10
10
  exports.DurableClock = _DurableClock;
11
11
  var _DurableDeferred = _interopRequireWildcard(require("./DurableDeferred.js"));
12
12
  exports.DurableDeferred = _DurableDeferred;
13
+ var _DurableRateLimiter = _interopRequireWildcard(require("./DurableRateLimiter.js"));
14
+ exports.DurableRateLimiter = _DurableRateLimiter;
13
15
  var _Workflow = _interopRequireWildcard(require("./Workflow.js"));
14
16
  exports.Workflow = _Workflow;
15
17
  var _WorkflowEngine = _interopRequireWildcard(require("./WorkflowEngine.js"));
@@ -38,5 +38,12 @@ export declare const make: (options: {
38
38
  export declare const sleep: (options: {
39
39
  readonly name: string;
40
40
  readonly duration: Duration.DurationInput;
41
+ /**
42
+ * If the duration is less than or equal to this threshold, the clock will
43
+ * be executed in memory.
44
+ *
45
+ * Defaults to 60 seconds.
46
+ */
47
+ readonly inMemoryThreshold?: Duration.DurationInput | undefined;
41
48
  }) => Effect.Effect<void, never, WorkflowEngine | WorkflowInstance>;
42
49
  //# sourceMappingURL=DurableClock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DurableClock.d.ts","sourceRoot":"","sources":["../../src/DurableClock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE3E;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,OAAO,MAAoD,CAAA;AAEhF;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAA;AAElC;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,eAAe,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;CACvE;AAED;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,SAAS;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAA;CAC1C,KAAG,YAKF,CAAA;AAUF;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,CAClB,OAAO,EAAE;IACP,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAA;CAC1C,KACE,MAAM,CAAC,MAAM,CAChB,IAAI,EACJ,KAAK,EACL,cAAc,GAAG,gBAAgB,CAcjC,CAAA"}
1
+ {"version":3,"file":"DurableClock.d.ts","sourceRoot":"","sources":["../../src/DurableClock.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAE5C,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAE3E;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,OAAO,MAAoD,CAAA;AAEhF;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAA;AAElC;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,eAAe,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;CACvE;AAED;;;GAGG;AACH,eAAO,MAAM,IAAI,GAAI,SAAS;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAA;CAC1C,KAAG,YAKF,CAAA;AAUF;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,CAClB,OAAO,EAAE;IACP,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAA;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,aAAa,GAAG,SAAS,CAAA;CAChE,KACE,MAAM,CAAC,MAAM,CAChB,IAAI,EACJ,KAAK,EACL,cAAc,GAAG,gBAAgB,CA+BjC,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as RateLimiter from "@effect/experimental/RateLimiter";
5
+ import type * as Duration from "effect/Duration";
6
+ import type * as Schema from "effect/Schema";
7
+ import * as Activity from "./Activity.js";
8
+ /**
9
+ * @since 1.0.0
10
+ * @category Accessors
11
+ */
12
+ export declare const rateLimit: (options: {
13
+ readonly name: string;
14
+ readonly algorithm?: "fixed-window" | "token-bucket" | undefined;
15
+ readonly window: Duration.DurationInput;
16
+ readonly limit: number;
17
+ readonly key: string;
18
+ readonly tokens?: number | undefined;
19
+ }) => Activity.Activity<typeof Schema.Void, typeof RateLimiter.RateLimitStoreError, RateLimiter.RateLimiter>;
20
+ //# sourceMappingURL=DurableRateLimiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurableRateLimiter.d.ts","sourceRoot":"","sources":["../../src/DurableRateLimiter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAA;AAC/D,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAEhD,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAGzC;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,GAAG,cAAc,GAAG,SAAS,CAAA;IAChE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAA;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,QAAQ,CAAC,QAAQ,CACnB,OAAO,MAAM,CAAC,IAAI,EAClB,OAAO,WAAW,CAAC,mBAAmB,EACtC,WAAW,CAAC,WAAW,CAkBrB,CAAA"}
@@ -10,6 +10,10 @@ export * as DurableClock from "./DurableClock.js";
10
10
  * @since 1.0.0
11
11
  */
12
12
  export * as DurableDeferred from "./DurableDeferred.js";
13
+ /**
14
+ * @since 1.0.0
15
+ */
16
+ export * as DurableRateLimiter from "./DurableRateLimiter.js";
13
17
  /**
14
18
  * @since 1.0.0
15
19
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD;;GAEG;AACH,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAEvD;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AAEjD;;GAEG;AACH,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAEvD;;GAEG;AACH,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAA;AAE7D;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAA"}
@@ -4,6 +4,7 @@
4
4
  import * as Context from "effect/Context";
5
5
  import * as Duration from "effect/Duration";
6
6
  import * as Effect from "effect/Effect";
7
+ import * as Activity from "./Activity.js";
7
8
  import * as DurableDeferred from "./DurableDeferred.js";
8
9
  /**
9
10
  * @since 1.0.0
@@ -27,6 +28,17 @@ const InstanceTag = /*#__PURE__*/Context.GenericTag("@effect/workflow/WorkflowEn
27
28
  * @category Sleeping
28
29
  */
29
30
  export const sleep = /*#__PURE__*/Effect.fnUntraced(function* (options) {
31
+ const duration = Duration.decode(options.duration);
32
+ if (Duration.isZero(duration)) {
33
+ return;
34
+ }
35
+ const inMemoryThreshold = options.inMemoryThreshold ? Duration.decode(options.inMemoryThreshold) : defaultInMemoryThreshold;
36
+ if (Duration.lessThanOrEqualTo(duration, inMemoryThreshold)) {
37
+ return yield* Activity.make({
38
+ name: `DurableClock/${options.name}`,
39
+ execute: Effect.sleep(duration)
40
+ });
41
+ }
30
42
  const engine = yield* EngineTag;
31
43
  const instance = yield* InstanceTag;
32
44
  const clock = make(options);
@@ -37,4 +49,5 @@ export const sleep = /*#__PURE__*/Effect.fnUntraced(function* (options) {
37
49
  });
38
50
  return yield* DurableDeferred.await(clock.deferred);
39
51
  });
52
+ const defaultInMemoryThreshold = /*#__PURE__*/Duration.seconds(60);
40
53
  //# sourceMappingURL=DurableClock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DurableClock.js","names":["Context","Duration","Effect","DurableDeferred","TypeId","Symbol","for","make","options","name","duration","decode","deferred","EngineTag","GenericTag","InstanceTag","sleep","fnUntraced","engine","instance","clock","scheduleClock","workflow","executionId","await"],"sources":["../../src/DurableClock.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AAGvD;;;;AAIA,OAAO,MAAMC,MAAM,gBAAkBC,MAAM,CAACC,GAAG,CAAC,+BAA+B,CAAC;AAmBhF;;;;AAIA,OAAO,MAAMC,IAAI,GAAIC,OAGpB,KAAoB;EACnB,CAACJ,MAAM,GAAGA,MAAM;EAChBK,IAAI,EAAED,OAAO,CAACC,IAAI;EAClBC,QAAQ,EAAET,QAAQ,CAACU,MAAM,CAACH,OAAO,CAACE,QAAQ,CAAC;EAC3CE,QAAQ,EAAET,eAAe,CAACI,IAAI,CAAC,gBAAgBC,OAAO,CAACC,IAAI,EAAE;CAC9D,CAAC;AAEF,MAAMI,SAAS,gBAAGb,OAAO,CAACc,UAAU,CAClC,iCAAqE,CACtE;AAED,MAAMC,WAAW,gBAAGf,OAAO,CAACc,UAAU,CACpC,kDAAwF,CACzF;AAED;;;;AAIA,OAAO,MAAME,KAAK,gBASdd,MAAM,CAACe,UAAU,CAAC,WAAUT,OAG/B;EACC,MAAMU,MAAM,GAAG,OAAOL,SAAS;EAC/B,MAAMM,QAAQ,GAAG,OAAOJ,WAAW;EACnC,MAAMK,KAAK,GAAGb,IAAI,CAACC,OAAO,CAAC;EAC3B,OAAOU,MAAM,CAACG,aAAa,CAAC;IAC1BC,QAAQ,EAAEH,QAAQ,CAACG,QAAQ;IAC3BC,WAAW,EAAEJ,QAAQ,CAACI,WAAW;IACjCH;GACD,CAAC;EACF,OAAO,OAAOjB,eAAe,CAACqB,KAAK,CAACJ,KAAK,CAACR,QAAQ,CAAC;AACrD,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"DurableClock.js","names":["Context","Duration","Effect","Activity","DurableDeferred","TypeId","Symbol","for","make","options","name","duration","decode","deferred","EngineTag","GenericTag","InstanceTag","sleep","fnUntraced","isZero","inMemoryThreshold","defaultInMemoryThreshold","lessThanOrEqualTo","execute","engine","instance","clock","scheduleClock","workflow","executionId","await","seconds"],"sources":["../../src/DurableClock.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,OAAO,KAAKC,QAAQ,MAAM,eAAe;AACzC,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AAGvD;;;;AAIA,OAAO,MAAMC,MAAM,gBAAkBC,MAAM,CAACC,GAAG,CAAC,+BAA+B,CAAC;AAmBhF;;;;AAIA,OAAO,MAAMC,IAAI,GAAIC,OAGpB,KAAoB;EACnB,CAACJ,MAAM,GAAGA,MAAM;EAChBK,IAAI,EAAED,OAAO,CAACC,IAAI;EAClBC,QAAQ,EAAEV,QAAQ,CAACW,MAAM,CAACH,OAAO,CAACE,QAAQ,CAAC;EAC3CE,QAAQ,EAAET,eAAe,CAACI,IAAI,CAAC,gBAAgBC,OAAO,CAACC,IAAI,EAAE;CAC9D,CAAC;AAEF,MAAMI,SAAS,gBAAGd,OAAO,CAACe,UAAU,CAClC,iCAAqE,CACtE;AAED,MAAMC,WAAW,gBAAGhB,OAAO,CAACe,UAAU,CACpC,kDAAwF,CACzF;AAED;;;;AAIA,OAAO,MAAME,KAAK,gBAgBdf,MAAM,CAACgB,UAAU,CAAC,WAAUT,OAI/B;EACC,MAAME,QAAQ,GAAGV,QAAQ,CAACW,MAAM,CAACH,OAAO,CAACE,QAAQ,CAAC;EAClD,IAAIV,QAAQ,CAACkB,MAAM,CAACR,QAAQ,CAAC,EAAE;IAC7B;EACF;EAEA,MAAMS,iBAAiB,GAAGX,OAAO,CAACW,iBAAiB,GAC/CnB,QAAQ,CAACW,MAAM,CAACH,OAAO,CAACW,iBAAiB,CAAC,GAC1CC,wBAAwB;EAE5B,IAAIpB,QAAQ,CAACqB,iBAAiB,CAACX,QAAQ,EAAES,iBAAiB,CAAC,EAAE;IAC3D,OAAO,OAAOjB,QAAQ,CAACK,IAAI,CAAC;MAC1BE,IAAI,EAAE,gBAAgBD,OAAO,CAACC,IAAI,EAAE;MACpCa,OAAO,EAAErB,MAAM,CAACe,KAAK,CAACN,QAAQ;KAC/B,CAAC;EACJ;EAEA,MAAMa,MAAM,GAAG,OAAOV,SAAS;EAC/B,MAAMW,QAAQ,GAAG,OAAOT,WAAW;EACnC,MAAMU,KAAK,GAAGlB,IAAI,CAACC,OAAO,CAAC;EAC3B,OAAOe,MAAM,CAACG,aAAa,CAAC;IAC1BC,QAAQ,EAAEH,QAAQ,CAACG,QAAQ;IAC3BC,WAAW,EAAEJ,QAAQ,CAACI,WAAW;IACjCH;GACD,CAAC;EACF,OAAO,OAAOtB,eAAe,CAAC0B,KAAK,CAACJ,KAAK,CAACb,QAAQ,CAAC;AACrD,CAAC,CAAC;AAEF,MAAMQ,wBAAwB,gBAAGpB,QAAQ,CAAC8B,OAAO,CAAC,EAAE,CAAC","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as RateLimiter from "@effect/experimental/RateLimiter";
5
+ import * as Effect from "effect/Effect";
6
+ import * as Activity from "./Activity.js";
7
+ import * as DurableClock from "./DurableClock.js";
8
+ /**
9
+ * @since 1.0.0
10
+ * @category Accessors
11
+ */
12
+ export const rateLimit = options => Activity.make({
13
+ name: `DurableRateLimiter/${options.name}`,
14
+ error: RateLimiter.RateLimitStoreError,
15
+ execute: Effect.gen(function* () {
16
+ const limiter = yield* RateLimiter.RateLimiter;
17
+ const result = yield* limiter.consume({
18
+ onExceeded: "delay",
19
+ ...options
20
+ }).pipe(Effect.catchIf(e => e.reason === "Exceeded", Effect.die));
21
+ return yield* DurableClock.sleep({
22
+ name: `DurableRateLimiter/${options.name}`,
23
+ duration: result.delay
24
+ });
25
+ })
26
+ });
27
+ //# sourceMappingURL=DurableRateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurableRateLimiter.js","names":["RateLimiter","Effect","Activity","DurableClock","rateLimit","options","make","name","error","RateLimitStoreError","execute","gen","limiter","result","consume","onExceeded","pipe","catchIf","e","reason","die","sleep","duration","delay"],"sources":["../../src/DurableRateLimiter.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,WAAW,MAAM,kCAAkC;AAE/D,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,OAAO,KAAKC,QAAQ,MAAM,eAAe;AACzC,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;;AAIA,OAAO,MAAMC,SAAS,GAAIC,OAOzB,IAKCH,QAAQ,CAACI,IAAI,CAAC;EACZC,IAAI,EAAE,sBAAsBF,OAAO,CAACE,IAAI,EAAE;EAC1CC,KAAK,EAAER,WAAW,CAACS,mBAAmB;EACtCC,OAAO,EAAET,MAAM,CAACU,GAAG,CAAC,aAAS;IAC3B,MAAMC,OAAO,GAAG,OAAOZ,WAAW,CAACA,WAAW;IAC9C,MAAMa,MAAM,GAAG,OAAOD,OAAO,CAACE,OAAO,CAAC;MACpCC,UAAU,EAAE,OAAO;MACnB,GAAGV;KACJ,CAAC,CAACW,IAAI,CACLf,MAAM,CAACgB,OAAO,CAAEC,CAAC,IAAKA,CAAC,CAACC,MAAM,KAAK,UAAU,EAAElB,MAAM,CAACmB,GAAG,CAAC,CAC3D;IACD,OAAO,OAAOjB,YAAY,CAACkB,KAAK,CAAC;MAC/Bd,IAAI,EAAE,sBAAsBF,OAAO,CAACE,IAAI,EAAE;MAC1Ce,QAAQ,EAAET,MAAM,CAACU;KAClB,CAAC;EACJ,CAAC;CACF,CAAC","ignoreList":[]}
package/dist/esm/index.js CHANGED
@@ -10,6 +10,10 @@ export * as DurableClock from "./DurableClock.js";
10
10
  * @since 1.0.0
11
11
  */
12
12
  export * as DurableDeferred from "./DurableDeferred.js";
13
+ /**
14
+ * @since 1.0.0
15
+ */
16
+ export * as DurableRateLimiter from "./DurableRateLimiter.js";
13
17
  /**
14
18
  * @since 1.0.0
15
19
  */
@@ -1 +1 @@
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":[]}
1
+ {"version":3,"file":"index.js","names":["Activity","DurableClock","DurableDeferred","DurableRateLimiter","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,kBAAkB,MAAM,yBAAyB;AAE7D;;;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.12.2",
3
+ "version": "0.12.3",
4
4
  "description": "Durable workflows for Effect",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -11,8 +11,9 @@
11
11
  "sideEffects": [],
12
12
  "homepage": "https://effect.website",
13
13
  "peerDependencies": {
14
- "effect": "^3.19.1",
15
- "@effect/platform": "^0.93.0",
14
+ "effect": "^3.19.3",
15
+ "@effect/experimental": "^0.57.1",
16
+ "@effect/platform": "^0.93.1",
16
17
  "@effect/rpc": "^0.72.1"
17
18
  },
18
19
  "publishConfig": {
@@ -43,6 +44,11 @@
43
44
  "import": "./dist/esm/DurableDeferred.js",
44
45
  "default": "./dist/cjs/DurableDeferred.js"
45
46
  },
47
+ "./DurableRateLimiter": {
48
+ "types": "./dist/dts/DurableRateLimiter.d.ts",
49
+ "import": "./dist/esm/DurableRateLimiter.js",
50
+ "default": "./dist/cjs/DurableRateLimiter.js"
51
+ },
46
52
  "./Workflow": {
47
53
  "types": "./dist/dts/Workflow.d.ts",
48
54
  "import": "./dist/esm/Workflow.js",
@@ -75,6 +81,9 @@
75
81
  "DurableDeferred": [
76
82
  "./dist/dts/DurableDeferred.d.ts"
77
83
  ],
84
+ "DurableRateLimiter": [
85
+ "./dist/dts/DurableRateLimiter.d.ts"
86
+ ],
78
87
  "Workflow": [
79
88
  "./dist/dts/Workflow.d.ts"
80
89
  ],
@@ -5,6 +5,7 @@ import * as Context from "effect/Context"
5
5
  import * as Duration from "effect/Duration"
6
6
  import * as Effect from "effect/Effect"
7
7
  import type * as Schema from "effect/Schema"
8
+ import * as Activity from "./Activity.js"
8
9
  import * as DurableDeferred from "./DurableDeferred.js"
9
10
  import type { WorkflowEngine, WorkflowInstance } from "./WorkflowEngine.js"
10
11
 
@@ -61,6 +62,13 @@ export const sleep: (
61
62
  options: {
62
63
  readonly name: string
63
64
  readonly duration: Duration.DurationInput
65
+ /**
66
+ * If the duration is less than or equal to this threshold, the clock will
67
+ * be executed in memory.
68
+ *
69
+ * Defaults to 60 seconds.
70
+ */
71
+ readonly inMemoryThreshold?: Duration.DurationInput | undefined
64
72
  }
65
73
  ) => Effect.Effect<
66
74
  void,
@@ -69,7 +77,24 @@ export const sleep: (
69
77
  > = Effect.fnUntraced(function*(options: {
70
78
  readonly name: string
71
79
  readonly duration: Duration.DurationInput
80
+ readonly inMemoryThreshold?: Duration.DurationInput | undefined
72
81
  }) {
82
+ const duration = Duration.decode(options.duration)
83
+ if (Duration.isZero(duration)) {
84
+ return
85
+ }
86
+
87
+ const inMemoryThreshold = options.inMemoryThreshold
88
+ ? Duration.decode(options.inMemoryThreshold)
89
+ : defaultInMemoryThreshold
90
+
91
+ if (Duration.lessThanOrEqualTo(duration, inMemoryThreshold)) {
92
+ return yield* Activity.make({
93
+ name: `DurableClock/${options.name}`,
94
+ execute: Effect.sleep(duration)
95
+ })
96
+ }
97
+
73
98
  const engine = yield* EngineTag
74
99
  const instance = yield* InstanceTag
75
100
  const clock = make(options)
@@ -80,3 +105,5 @@ export const sleep: (
80
105
  })
81
106
  return yield* DurableDeferred.await(clock.deferred)
82
107
  })
108
+
109
+ const defaultInMemoryThreshold = Duration.seconds(60)
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as RateLimiter from "@effect/experimental/RateLimiter"
5
+ import type * as Duration from "effect/Duration"
6
+ import * as Effect from "effect/Effect"
7
+ import type * as Schema from "effect/Schema"
8
+ import * as Activity from "./Activity.js"
9
+ import * as DurableClock from "./DurableClock.js"
10
+
11
+ /**
12
+ * @since 1.0.0
13
+ * @category Accessors
14
+ */
15
+ export const rateLimit = (options: {
16
+ readonly name: string
17
+ readonly algorithm?: "fixed-window" | "token-bucket" | undefined
18
+ readonly window: Duration.DurationInput
19
+ readonly limit: number
20
+ readonly key: string
21
+ readonly tokens?: number | undefined
22
+ }): Activity.Activity<
23
+ typeof Schema.Void,
24
+ typeof RateLimiter.RateLimitStoreError,
25
+ RateLimiter.RateLimiter
26
+ > =>
27
+ Activity.make({
28
+ name: `DurableRateLimiter/${options.name}`,
29
+ error: RateLimiter.RateLimitStoreError,
30
+ execute: Effect.gen(function*() {
31
+ const limiter = yield* RateLimiter.RateLimiter
32
+ const result = yield* limiter.consume({
33
+ onExceeded: "delay",
34
+ ...options
35
+ }).pipe(
36
+ Effect.catchIf((e) => e.reason === "Exceeded", Effect.die)
37
+ )
38
+ return yield* DurableClock.sleep({
39
+ name: `DurableRateLimiter/${options.name}`,
40
+ duration: result.delay
41
+ })
42
+ })
43
+ })
package/src/index.ts CHANGED
@@ -13,6 +13,11 @@ export * as DurableClock from "./DurableClock.js"
13
13
  */
14
14
  export * as DurableDeferred from "./DurableDeferred.js"
15
15
 
16
+ /**
17
+ * @since 1.0.0
18
+ */
19
+ export * as DurableRateLimiter from "./DurableRateLimiter.js"
20
+
16
21
  /**
17
22
  * @since 1.0.0
18
23
  */