@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.
- package/DurableRateLimiter/package.json +6 -0
- package/dist/cjs/DurableClock.js +13 -0
- package/dist/cjs/DurableClock.js.map +1 -1
- package/dist/cjs/DurableRateLimiter.js +36 -0
- package/dist/cjs/DurableRateLimiter.js.map +1 -0
- package/dist/cjs/index.js +3 -1
- package/dist/dts/DurableClock.d.ts +7 -0
- package/dist/dts/DurableClock.d.ts.map +1 -1
- package/dist/dts/DurableRateLimiter.d.ts +20 -0
- package/dist/dts/DurableRateLimiter.d.ts.map +1 -0
- package/dist/dts/index.d.ts +4 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/esm/DurableClock.js +13 -0
- package/dist/esm/DurableClock.js.map +1 -1
- package/dist/esm/DurableRateLimiter.js +27 -0
- package/dist/esm/DurableRateLimiter.js.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/package.json +12 -3
- package/src/DurableClock.ts +27 -0
- package/src/DurableRateLimiter.ts +43 -0
- package/src/index.ts +5 -0
package/dist/cjs/DurableClock.js
CHANGED
|
@@ -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,
|
|
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;
|
|
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"}
|
package/dist/dts/index.d.ts
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
|
*/
|
package/dist/dts/index.d.ts.map
CHANGED
|
@@ -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"}
|
package/dist/esm/DurableClock.js
CHANGED
|
@@ -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,
|
|
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
|
*/
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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.
|
|
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.
|
|
15
|
-
"@effect/
|
|
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
|
],
|
package/src/DurableClock.ts
CHANGED
|
@@ -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