@effect-app/infra 0.215.1 → 0.216.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 0.216.1
4
+
5
+ ### Patch Changes
6
+
7
+ - c7b8007: bag it
8
+ - Updated dependencies [c7b8007]
9
+ - effect-app@0.183.2
10
+ - @effect-app/infra-adapters@0.138.4
11
+
12
+ ## 0.216.0
13
+
14
+ ### Minor Changes
15
+
16
+ - 5f9bb34: improve Operations service definition
17
+
3
18
  ## 0.215.1
4
19
 
5
20
  ### Patch Changes
@@ -3,15 +3,109 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- var _service = require("./Operations/service.cjs");
7
- Object.keys(_service).forEach(function (key) {
8
- if (key === "default" || key === "__esModule") return;
9
- if (key in exports && exports[key] === _service[key]) return;
10
- Object.defineProperty(exports, key, {
11
- enumerable: true,
12
- get: function () {
13
- return _service[key];
14
- }
15
- });
6
+ exports.Operations = void 0;
7
+ exports.forkOperation = forkOperation;
8
+ exports.forkOperation2 = forkOperation2;
9
+ exports.forkOperationFunction = forkOperationFunction;
10
+ exports.forkOperationWithEffect = forkOperationWithEffect;
11
+ var _effectApp = require("effect-app");
12
+ var _service = require("effect-app/service");
13
+ var Scope = _interopRequireWildcard(require("effect/Scope"));
14
+ var _reportError = require("../api/reportError.cjs");
15
+ var _Effect = require("@effect-app/core/Effect");
16
+ var _errorReporter = require("@effect-app/infra/errorReporter");
17
+ var _schema = require("@effect-app/schema");
18
+ var _dateFns = require("date-fns");
19
+ var _Operations = require("effect-app/Operations");
20
+ var _FiberBag = require("effect-app/services/FiberBag");
21
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
22
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
23
+ const reportAppError = (0, _errorReporter.reportError)("Operations.Cleanup");
24
+ const make = _effectApp.Effect.sync(() => {
25
+ const ops = new Map();
26
+ const makeOp = _effectApp.Effect.sync(() => _Operations.OperationId.make());
27
+ const cleanup = _effectApp.Effect.sync(() => {
28
+ const before = (0, _dateFns.subHours)(new Date(), 1);
29
+ [...ops.entries()].forEach(([id, op]) => {
30
+ const lastChanged = _effectApp.Option.fromNullable(op.updatedAt).pipe(_effectApp.Option.getOrElse(() => op.createdAt));
31
+ if (lastChanged < before) {
32
+ ops.delete(id);
33
+ }
34
+ });
35
+ }).pipe(_effectApp.Effect.withSpan("Operations.cleanup"));
36
+ function addOp(id) {
37
+ return _effectApp.Effect.sync(() => {
38
+ ops.set(id, new _Operations.Operation({
39
+ id
40
+ }));
41
+ });
42
+ }
43
+ function findOp(id) {
44
+ return _effectApp.Effect.sync(() => _effectApp.Option.fromNullable(ops.get(id)));
45
+ }
46
+ function finishOp(id, exit) {
47
+ return _effectApp.Effect.flatMap(findOp(id), _ => _effectApp.Effect.sync(() => {
48
+ if (_effectApp.Option.isNone(_)) {
49
+ throw new Error("Not found");
50
+ }
51
+ ops.set(id, (0, _effectApp.copy)(_.value, {
52
+ updatedAt: new Date(),
53
+ result: _effectApp.Exit.isSuccess(exit) ? new _Operations.Success() : new _Operations.Failure({
54
+ message: _effectApp.Cause.isInterrupted(exit.cause) ? (0, _schema.NonEmptyString2k)("Interrupted") : _effectApp.Cause.isDie(exit.cause) ? (0, _schema.NonEmptyString2k)("Unknown error") : _effectApp.Cause.failureOption(exit.cause).pipe(_effectApp.Option.flatMap(_ => typeof _ === "object" && _ !== null && "message" in _ && _effectApp.S.is(_schema.NonEmptyString2k)(_.message) ? _effectApp.Option.some(_.message) : _effectApp.Option.none()), _effectApp.Option.getOrNull)
55
+ })
56
+ }));
57
+ }));
58
+ }
59
+ function update(id, progress) {
60
+ return _effectApp.Effect.flatMap(findOp(id), _ => _effectApp.Effect.sync(() => {
61
+ if (_effectApp.Option.isNone(_)) {
62
+ throw new Error("Not found");
63
+ }
64
+ ops.set(id, (0, _effectApp.copy)(_.value, {
65
+ updatedAt: new Date(),
66
+ progress
67
+ }));
68
+ }));
69
+ }
70
+ return {
71
+ cleanup,
72
+ register: _effectApp.Effect.tap(makeOp, id => _effectApp.Effect.andThen((0, _Effect.annotateLogscoped)("operationId", id), _effectApp.Effect.acquireRelease(addOp(id), (_, exit) => finishOp(id, exit)))),
73
+ find: findOp,
74
+ update
75
+ };
16
76
  });
77
+ class Operations extends (0, _service.TagClassMakeId)("effect-app/Operations", make)() {
78
+ static Live = this.use(_ => _.cleanup.pipe(_effectApp.Effect.exit, _effectApp.Effect.flatMap(_ => {
79
+ if (_effectApp.Exit.isSuccess(_)) {
80
+ return _effectApp.Effect.unit;
81
+ } else {
82
+ return reportAppError(_.cause);
83
+ }
84
+ }), _effectApp.Effect.schedule(_effectApp.Schedule.fixed(_effectApp.Duration.minutes(20))), _effectApp.Effect.map(_ => _), _FiberBag.FiberBag.run)).pipe(_effectApp.Layer.effectDiscard, _effectApp.Layer.provide(_FiberBag.FiberBag.Live), _effectApp.Layer.provideMerge(this.toLayer()));
85
+ }
86
+ /**
87
+ * @tsplus getter effect/io/Effect forkOperation
88
+ */
89
+ exports.Operations = Operations;
90
+ function forkOperation(self) {
91
+ return _effectApp.Effect.flatMap(Operations, Operations => _effectApp.Effect.flatMap(Scope.make(), scope => Operations.register.pipe(Scope.extend(scope), _effectApp.Effect.tap(() => (0, _reportError.forkDaemonReportRequestUnexpected)(Scope.use(self, scope))))));
92
+ }
93
+ /**
94
+ * @tsplus getter function forkOperation
95
+ */
96
+ function forkOperationFunction(fnc) {
97
+ return inp => fnc(inp).pipe(forkOperation);
98
+ }
99
+ /**
100
+ * @tsplus static effect/io/Effect.Ops forkOperation
101
+ */
102
+ function forkOperation2(self) {
103
+ return _effectApp.Effect.flatMap(Operations, Operations => _effectApp.Effect.flatMap(Scope.make(), scope => Operations.register.pipe(Scope.extend(scope), _effectApp.Effect.tap(id => (0, _reportError.forkDaemonReportRequestUnexpected)(Scope.use(self(id), scope))))));
104
+ }
105
+ /**
106
+ * @tsplus static effect/io/Effect.Ops forkOperationWithEffect
107
+ */
108
+ function forkOperationWithEffect(self, fnc) {
109
+ return _effectApp.Effect.flatMap(Operations, Operations => _effectApp.Effect.flatMap(Scope.make(), scope => Operations.register.pipe(Scope.extend(scope), _effectApp.Effect.tap(opId => (0, _reportError.forkDaemonReportRequestUnexpected)(Scope.use(self(opId), scope))), _effectApp.Effect.tap(opId => _effectApp.Effect.interruptible(fnc(opId)).pipe(_effectApp.Effect.forkScoped, Scope.extend(scope))))));
110
+ }
17
111
  //# sourceMappingURL=Operations.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Operations.cjs","names":["_service","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get"],"sources":["../../src/services/Operations.ts"],"sourcesContent":[null],"mappings":";;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,QAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,QAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAT,QAAA,CAAAK,GAAA;IAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"Operations.cjs","names":["_effectApp","require","_service","Scope","_interopRequireWildcard","_reportError","_Effect","_errorReporter","_schema","_dateFns","_Operations","_FiberBag","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","reportAppError","reportError","make","Effect","sync","ops","Map","makeOp","OperationId","cleanup","before","subHours","Date","entries","forEach","id","op","lastChanged","Option","fromNullable","updatedAt","pipe","getOrElse","createdAt","delete","withSpan","addOp","Operation","findOp","finishOp","exit","flatMap","_","isNone","Error","copy","value","result","Exit","isSuccess","Success","Failure","message","Cause","isInterrupted","cause","NonEmptyString2k","isDie","failureOption","S","is","some","none","getOrNull","update","progress","register","tap","andThen","annotateLogscoped","acquireRelease","find","Operations","TagClassMakeId","Live","use","unit","schedule","Schedule","fixed","Duration","minutes","map","FiberBag","run","Layer","effectDiscard","provide","provideMerge","toLayer","exports","forkOperation","self","scope","extend","forkDaemonReportRequestUnexpected","forkOperationFunction","fnc","inp","forkOperation2","forkOperationWithEffect","opId","interruptible","forkScoped"],"sources":["../../src/services/Operations.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -1,2 +1,65 @@
1
- export * from "./Operations/service.js";
1
+ import type { StringId } from "@effect-app/schema";
2
+ import { Effect, Layer, Option, S } from "effect-app";
3
+ import type { OperationProgress } from "effect-app/Operations";
4
+ import * as Scope from "effect/Scope";
5
+ import { Operation, OperationId } from "effect-app/Operations";
6
+ declare const Operations_base: (abstract new (service: {
7
+ cleanup: Effect.Effect<void, never, never>;
8
+ register: Effect.Effect<StringId, never, Scope.Scope>;
9
+ find: (id: StringId) => Effect.Effect<Option.Option<Operation>, never, never>;
10
+ update: (id: StringId, progress: OperationProgress) => Effect.Effect<void, never, never>;
11
+ }) => Readonly<{
12
+ cleanup: Effect.Effect<void, never, never>;
13
+ register: Effect.Effect<StringId, never, Scope.Scope>;
14
+ find: (id: StringId) => Effect.Effect<Option.Option<Operation>, never, never>;
15
+ update: (id: StringId, progress: OperationProgress) => Effect.Effect<void, never, never>;
16
+ }> & import("effect/Context").TagClassShape<"effect-app/Operations", {
17
+ cleanup: Effect.Effect<void, never, never>;
18
+ register: Effect.Effect<StringId, never, Scope.Scope>;
19
+ find: (id: StringId) => Effect.Effect<Option.Option<Operation>, never, never>;
20
+ update: (id: StringId, progress: OperationProgress) => Effect.Effect<void, never, never>;
21
+ }>) & {
22
+ toLayer: {
23
+ (): Layer<Operations, never, never>;
24
+ <E_1, R_1>(eff: Effect<Omit<Operations, keyof import("effect/Context").TagClassShape<any, any>>, E_1, R_1>): Layer<Operations, E_1, R_1>;
25
+ };
26
+ toLayerScoped: {
27
+ (): Layer<Operations, never, never>;
28
+ <E_2, R_2>(eff: Effect<import("effect/Context").TagClassShape<any, any>, E_2, R_2>): Layer<Operations, E_2, Exclude<R_2, Scope.Scope>>;
29
+ };
30
+ of: (service: import("effect/Context").TagClassShape<any, any>) => Operations;
31
+ make: Effect<Operations, never, never>;
32
+ } & import("effect/Context").Tag<Operations, Operations> & {
33
+ cleanup: Effect<void, never, Operations>;
34
+ register: Effect<StringId, never, Scope.Scope | Operations>;
35
+ find: (id: StringId) => Effect<Option.Option<Operation>, never, Operations>;
36
+ update: (id: StringId, progress: OperationProgress) => Effect<void, never, Operations>;
37
+ } & {
38
+ use: <X>(body: (_: {
39
+ cleanup: Effect.Effect<void, never, never>;
40
+ register: Effect.Effect<StringId, never, Scope.Scope>;
41
+ find: (id: StringId) => Effect.Effect<Option.Option<Operation>, never, never>;
42
+ update: (id: StringId, progress: OperationProgress) => Effect.Effect<void, never, never>;
43
+ }) => X) => X extends Effect<infer A_3, infer E_5, infer R_5> ? Effect<A_3, E_5, R_5 | Operations> : Effect<X, never, Operations>;
44
+ };
45
+ export declare class Operations extends Operations_base {
46
+ static readonly Live: Layer.Layer<Operations, never, never>;
47
+ }
48
+ /**
49
+ * @tsplus getter effect/io/Effect forkOperation
50
+ */
51
+ export declare function forkOperation<R, E, A>(self: Effect<A, E, R>): Effect.Effect<string & S.StringIdBrand, never, Operations | Exclude<R, Scope.Scope>>;
52
+ /**
53
+ * @tsplus getter function forkOperation
54
+ */
55
+ export declare function forkOperationFunction<R, E, A, Inp>(fnc: (inp: Inp) => Effect<A, E, R>): (inp: Inp) => Effect.Effect<string & S.StringIdBrand, never, Operations | Exclude<R, Scope.Scope>>;
56
+ /**
57
+ * @tsplus static effect/io/Effect.Ops forkOperation
58
+ */
59
+ export declare function forkOperation2<R, E, A>(self: (opId: OperationId) => Effect<A, E, R>): Effect.Effect<string & S.StringIdBrand, never, Operations | Exclude<R, Scope.Scope>>;
60
+ /**
61
+ * @tsplus static effect/io/Effect.Ops forkOperationWithEffect
62
+ */
63
+ export declare function forkOperationWithEffect<R, R2, E, E2, A, A2>(self: (id: OperationId) => Effect<A, E, R>, fnc: (id: OperationId) => Effect<A2, E2, R2>): Effect<StringId, never, Operations | Exclude<R, Scope.Scope> | Exclude<R2, Scope.Scope>>;
64
+ export {};
2
65
  //# sourceMappingURL=Operations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../../src/services/Operations.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA"}
1
+ {"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../../src/services/Operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAyB,MAAM,EAAQ,KAAK,EAAE,MAAM,EAAE,CAAC,EAAY,MAAM,YAAY,CAAA;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAOrC,OAAO,EAAW,SAAS,EAAE,WAAW,EAAW,MAAM,uBAAuB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwFhF,qBAAa,UAAW,SAAQ,eAA2D;IACzF,MAAM,CAAC,QAAQ,CAAC,IAAI,wCAiB0E;CAC/F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,wFAa3D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SACvE,GAAG,0FACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,wFAanF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EACzD,IAAI,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1C,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAC3C,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAc1F"}
@@ -1,2 +1,120 @@
1
- export * from "./Operations/service.js";
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9PcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUEifQ==
1
+ import { Cause, copy, Duration, Effect, Exit, Layer, Option, S, Schedule } from "effect-app";
2
+ import { TagClassMakeId } from "effect-app/service";
3
+ import * as Scope from "effect/Scope";
4
+ import { forkDaemonReportRequestUnexpected } from "../api/reportError.js";
5
+ import { annotateLogscoped } from "@effect-app/core/Effect";
6
+ import { reportError } from "@effect-app/infra/errorReporter";
7
+ import { NonEmptyString2k } from "@effect-app/schema";
8
+ import { subHours } from "date-fns";
9
+ import { Failure, Operation, OperationId, Success } from "effect-app/Operations";
10
+ import { FiberBag } from "effect-app/services/FiberBag";
11
+ const reportAppError = reportError("Operations.Cleanup");
12
+ const make = Effect.sync(() => {
13
+ const ops = new Map();
14
+ const makeOp = Effect.sync(() => OperationId.make());
15
+ const cleanup = Effect
16
+ .sync(() => {
17
+ const before = subHours(new Date(), 1);
18
+ [...ops
19
+ .entries()]
20
+ .forEach(([id, op]) => {
21
+ const lastChanged = Option.fromNullable(op.updatedAt).pipe(Option.getOrElse(() => op.createdAt));
22
+ if (lastChanged < before) {
23
+ ops.delete(id);
24
+ }
25
+ });
26
+ })
27
+ .pipe(Effect.withSpan("Operations.cleanup"));
28
+ function addOp(id) {
29
+ return Effect.sync(() => {
30
+ ops.set(id, new Operation({ id }));
31
+ });
32
+ }
33
+ function findOp(id) {
34
+ return Effect.sync(() => Option.fromNullable(ops.get(id)));
35
+ }
36
+ function finishOp(id, exit) {
37
+ return Effect.flatMap(findOp(id), (_) => Effect.sync(() => {
38
+ if (Option.isNone(_)) {
39
+ throw new Error("Not found");
40
+ }
41
+ ops.set(id, copy(_.value, {
42
+ updatedAt: new Date(),
43
+ result: Exit.isSuccess(exit)
44
+ ? new Success()
45
+ : new Failure({
46
+ message: Cause.isInterrupted(exit.cause)
47
+ ? NonEmptyString2k("Interrupted")
48
+ : Cause.isDie(exit.cause)
49
+ ? NonEmptyString2k("Unknown error")
50
+ : Cause
51
+ .failureOption(exit.cause)
52
+ .pipe(Option.flatMap((_) => typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
53
+ ? Option.some(_.message)
54
+ : Option.none()), Option.getOrNull)
55
+ })
56
+ }));
57
+ }));
58
+ }
59
+ function update(id, progress) {
60
+ return Effect.flatMap(findOp(id), (_) => Effect.sync(() => {
61
+ if (Option.isNone(_)) {
62
+ throw new Error("Not found");
63
+ }
64
+ ops.set(id, copy(_.value, { updatedAt: new Date(), progress }));
65
+ }));
66
+ }
67
+ return {
68
+ cleanup,
69
+ register: Effect.tap(makeOp, (id) => Effect.andThen(annotateLogscoped("operationId", id), Effect.acquireRelease(addOp(id), (_, exit) => finishOp(id, exit)))),
70
+ find: findOp,
71
+ update
72
+ };
73
+ });
74
+ export class Operations extends TagClassMakeId("effect-app/Operations", make)() {
75
+ static Live = this
76
+ .use((_) => _.cleanup.pipe(Effect.exit, Effect
77
+ .flatMap((_) => {
78
+ if (Exit.isSuccess(_)) {
79
+ return Effect.unit;
80
+ }
81
+ else {
82
+ return reportAppError(_.cause);
83
+ }
84
+ }), Effect.schedule(Schedule.fixed(Duration.minutes(20))), Effect.map((_) => _), FiberBag.run))
85
+ .pipe(Layer.effectDiscard, Layer.provide(FiberBag.Live), Layer.provideMerge(this.toLayer()));
86
+ }
87
+ /**
88
+ * @tsplus getter effect/io/Effect forkOperation
89
+ */
90
+ export function forkOperation(self) {
91
+ return Effect.flatMap(Operations, (Operations) => Effect.flatMap(Scope.make(), (scope) => Operations
92
+ .register
93
+ .pipe(Scope.extend(scope), Effect
94
+ .tap(() => forkDaemonReportRequestUnexpected(Scope.use(self, scope))))));
95
+ }
96
+ /**
97
+ * @tsplus getter function forkOperation
98
+ */
99
+ export function forkOperationFunction(fnc) {
100
+ return (inp) => fnc(inp).pipe(forkOperation);
101
+ }
102
+ /**
103
+ * @tsplus static effect/io/Effect.Ops forkOperation
104
+ */
105
+ export function forkOperation2(self) {
106
+ return Effect.flatMap(Operations, (Operations) => Effect.flatMap(Scope.make(), (scope) => Operations
107
+ .register
108
+ .pipe(Scope.extend(scope), Effect
109
+ .tap((id) => forkDaemonReportRequestUnexpected(Scope.use(self(id), scope))))));
110
+ }
111
+ /**
112
+ * @tsplus static effect/io/Effect.Ops forkOperationWithEffect
113
+ */
114
+ export function forkOperationWithEffect(self, fnc) {
115
+ return Effect.flatMap(Operations, (Operations) => Effect.flatMap(Scope
116
+ .make(), (scope) => Operations
117
+ .register
118
+ .pipe(Scope.extend(scope), Effect.tap((opId) => forkDaemonReportRequestUnexpected(Scope.use(self(opId), scope))), Effect.tap((opId) => Effect.interruptible(fnc(opId)).pipe(Effect.forkScoped, Scope.extend(scope))))));
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9PcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUU1RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDbkQsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUV2RCxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtBQUV4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQTtJQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRXBELE1BQU0sT0FBTyxH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
@@ -146,7 +146,7 @@ export declare function makeRepo<PM extends {
146
146
  config?: Omit<StoreConfig<PM>, "partitionValue"> & {
147
147
  partitionValue?: (a: PM) => string;
148
148
  };
149
- }) => Effect.Effect<Repository<T, PM, Evt, ItemType>, E, R | StoreMaker | ContextMapContainer | RInitial | R2>;
149
+ }) => Effect.Effect<Repository<T, PM, Evt, ItemType>, E, StoreMaker | ContextMapContainer | R | RInitial | R2>;
150
150
  Q: Query<Omit<PM, "_etag">>;
151
151
  };
152
152
  export declare function makeStore<PM extends {
@@ -158,7 +158,7 @@ export declare function makeStore<PM extends {
158
158
  id: unknown;
159
159
  }>(name: ItemType, schema: S.Schema<T, E, R>, mapTo: (e: E, etag: string | undefined) => PM) => <RInitial = never, EInitial = never>(makeInitial?: Effect<readonly T[], EInitial, RInitial>, config?: (Omit<StoreConfig<PM>, "partitionValue"> & {
160
160
  partitionValue?: (a: PM) => string;
161
- }) | undefined) => Effect.Effect<import("src/services/Store/service.js").Store<PM, string>, EInitial, R | StoreMaker | RInitial>;
161
+ }) | undefined) => Effect.Effect<import("src/services/Store/service.js").Store<PM, string>, EInitial, StoreMaker | R | RInitial>;
162
162
  export interface Repos<T extends {
163
163
  id: unknown;
164
164
  }, PM extends {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/infra",
3
- "version": "0.215.1",
3
+ "version": "0.216.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -19,14 +19,14 @@
19
19
  "pure-rand": "6.0.4",
20
20
  "redlock": "^4.2.0",
21
21
  "@effect-app/core": "0.151.1",
22
- "effect-app": "0.183.1",
23
22
  "@effect-app/fluent-extensions": "0.144.0",
24
- "@effect-app/infra-adapters": "0.138.3",
23
+ "effect-app": "0.183.2",
24
+ "@effect-app/infra-adapters": "0.138.4",
25
25
  "@effect-app/schema": "0.204.1"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@babel/cli": "^7.23.9",
29
- "@sentry/node": "^7.105.0",
29
+ "@sentry/node": "^7.106.0",
30
30
  "@types/express": "^4.17.21",
31
31
  "@types/node": "~20.11.25",
32
32
  "@types/proper-lockfile": "^4.1.4",
@@ -385,26 +385,6 @@
385
385
  "default": "./_cjs/services/Operations.cjs"
386
386
  }
387
387
  },
388
- "./services/Operations/live": {
389
- "import": {
390
- "types": "./dist/services/Operations/live.d.ts",
391
- "default": "./dist/services/Operations/live.js"
392
- },
393
- "require": {
394
- "types": "./dist/services/Operations/live.d.ts",
395
- "default": "./_cjs/services/Operations/live.cjs"
396
- }
397
- },
398
- "./services/Operations/service": {
399
- "import": {
400
- "types": "./dist/services/Operations/service.d.ts",
401
- "default": "./dist/services/Operations/service.js"
402
- },
403
- "require": {
404
- "types": "./dist/services/Operations/service.d.ts",
405
- "default": "./_cjs/services/Operations/service.cjs"
406
- }
407
- },
408
388
  "./services/QueueMaker/errors": {
409
389
  "import": {
410
390
  "types": "./dist/services/QueueMaker/errors.d.ts",
@@ -1 +1,184 @@
1
- export * from "./Operations/service.js"
1
+ import type { StringId } from "@effect-app/schema"
2
+ import { Cause, copy, Duration, Effect, Exit, Layer, Option, S, Schedule } from "effect-app"
3
+ import type { OperationProgress } from "effect-app/Operations"
4
+ import { TagClassMakeId } from "effect-app/service"
5
+ import * as Scope from "effect/Scope"
6
+ import { forkDaemonReportRequestUnexpected } from "../api/reportError.js"
7
+
8
+ import { annotateLogscoped } from "@effect-app/core/Effect"
9
+ import { reportError } from "@effect-app/infra/errorReporter"
10
+ import { NonEmptyString2k } from "@effect-app/schema"
11
+ import { subHours } from "date-fns"
12
+ import { Failure, Operation, OperationId, Success } from "effect-app/Operations"
13
+ import { FiberBag } from "effect-app/services/FiberBag"
14
+
15
+ const reportAppError = reportError("Operations.Cleanup")
16
+
17
+ const make = Effect.sync(() => {
18
+ const ops = new Map<OperationId, Operation>()
19
+ const makeOp = Effect.sync(() => OperationId.make())
20
+
21
+ const cleanup = Effect
22
+ .sync(() => {
23
+ const before = subHours(new Date(), 1)
24
+ ;[...ops
25
+ .entries()]
26
+ .forEach(([id, op]) => {
27
+ const lastChanged = Option.fromNullable(op.updatedAt).pipe(Option.getOrElse(() => op.createdAt))
28
+ if (lastChanged < before) {
29
+ ops.delete(id)
30
+ }
31
+ })
32
+ })
33
+ .pipe(Effect.withSpan("Operations.cleanup"))
34
+
35
+ function addOp(id: OperationId) {
36
+ return Effect.sync(() => {
37
+ ops.set(id, new Operation({ id }))
38
+ })
39
+ }
40
+ function findOp(id: OperationId) {
41
+ return Effect.sync(() => Option.fromNullable(ops.get(id)))
42
+ }
43
+ function finishOp(id: OperationId, exit: Exit<unknown, unknown>) {
44
+ return Effect.flatMap(findOp(id), (_) =>
45
+ Effect.sync(() => {
46
+ if (Option.isNone(_)) {
47
+ throw new Error("Not found")
48
+ }
49
+ ops.set(
50
+ id,
51
+ copy(_.value, {
52
+ updatedAt: new Date(),
53
+ result: Exit.isSuccess(exit)
54
+ ? new Success()
55
+ : new Failure({
56
+ message: Cause.isInterrupted(exit.cause)
57
+ ? NonEmptyString2k("Interrupted")
58
+ : Cause.isDie(exit.cause)
59
+ ? NonEmptyString2k("Unknown error")
60
+ : Cause
61
+ .failureOption(exit.cause)
62
+ .pipe(
63
+ Option.flatMap((_) =>
64
+ typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
65
+ ? Option.some(_.message)
66
+ : Option.none()
67
+ ),
68
+ Option.getOrNull
69
+ )
70
+ })
71
+ })
72
+ )
73
+ }))
74
+ }
75
+ function update(id: OperationId, progress: OperationProgress) {
76
+ return Effect.flatMap(findOp(id), (_) =>
77
+ Effect.sync(() => {
78
+ if (Option.isNone(_)) {
79
+ throw new Error("Not found")
80
+ }
81
+ ops.set(id, copy(_.value, { updatedAt: new Date(), progress }))
82
+ }))
83
+ }
84
+ return {
85
+ cleanup,
86
+ register: Effect.tap(
87
+ makeOp,
88
+ (id) =>
89
+ Effect.andThen(
90
+ annotateLogscoped("operationId", id),
91
+ Effect.acquireRelease(addOp(id), (_, exit) => finishOp(id, exit))
92
+ )
93
+ ),
94
+
95
+ find: findOp,
96
+ update
97
+ }
98
+ })
99
+
100
+ export class Operations extends TagClassMakeId("effect-app/Operations", make)<Operations>() {
101
+ static readonly Live = this
102
+ .use((_) =>
103
+ _.cleanup.pipe(
104
+ Effect.exit,
105
+ Effect
106
+ .flatMap((_) => {
107
+ if (Exit.isSuccess(_)) {
108
+ return Effect.unit
109
+ } else {
110
+ return reportAppError(_.cause)
111
+ }
112
+ }),
113
+ Effect.schedule(Schedule.fixed(Duration.minutes(20))),
114
+ Effect.map((_) => _ as never),
115
+ FiberBag.run
116
+ )
117
+ )
118
+ .pipe(Layer.effectDiscard, Layer.provide(FiberBag.Live), Layer.provideMerge(this.toLayer()))
119
+ }
120
+
121
+ /**
122
+ * @tsplus getter effect/io/Effect forkOperation
123
+ */
124
+ export function forkOperation<R, E, A>(self: Effect<A, E, R>) {
125
+ return Effect.flatMap(Operations, (Operations) =>
126
+ Effect.flatMap(
127
+ Scope.make(),
128
+ (scope) =>
129
+ Operations
130
+ .register
131
+ .pipe(
132
+ Scope.extend(scope),
133
+ Effect
134
+ .tap(() => forkDaemonReportRequestUnexpected(Scope.use(self, scope)))
135
+ )
136
+ ))
137
+ }
138
+
139
+ /**
140
+ * @tsplus getter function forkOperation
141
+ */
142
+ export function forkOperationFunction<R, E, A, Inp>(fnc: (inp: Inp) => Effect<A, E, R>) {
143
+ return (inp: Inp) => fnc(inp).pipe(forkOperation)
144
+ }
145
+
146
+ /**
147
+ * @tsplus static effect/io/Effect.Ops forkOperation
148
+ */
149
+ export function forkOperation2<R, E, A>(self: (opId: OperationId) => Effect<A, E, R>) {
150
+ return Effect.flatMap(Operations, (Operations) =>
151
+ Effect.flatMap(
152
+ Scope.make(),
153
+ (scope) =>
154
+ Operations
155
+ .register
156
+ .pipe(
157
+ Scope.extend(scope),
158
+ Effect
159
+ .tap((id) => forkDaemonReportRequestUnexpected(Scope.use(self(id), scope)))
160
+ )
161
+ ))
162
+ }
163
+
164
+ /**
165
+ * @tsplus static effect/io/Effect.Ops forkOperationWithEffect
166
+ */
167
+ export function forkOperationWithEffect<R, R2, E, E2, A, A2>(
168
+ self: (id: OperationId) => Effect<A, E, R>,
169
+ fnc: (id: OperationId) => Effect<A2, E2, R2>
170
+ ): Effect<StringId, never, Operations | Exclude<R, Scope.Scope> | Exclude<R2, Scope.Scope>> {
171
+ return Effect.flatMap(Operations, (Operations) =>
172
+ Effect.flatMap(
173
+ Scope
174
+ .make(),
175
+ (scope) =>
176
+ Operations
177
+ .register
178
+ .pipe(
179
+ Scope.extend(scope),
180
+ Effect.tap((opId) => forkDaemonReportRequestUnexpected(Scope.use(self(opId), scope))),
181
+ Effect.tap((opId) => Effect.interruptible(fnc(opId)).pipe(Effect.forkScoped, Scope.extend(scope)))
182
+ )
183
+ ))
184
+ }
@@ -1,79 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.Live = void 0;
7
- var _Effect = require("@effect-app/core/Effect");
8
- var _errorReporter = require("@effect-app/infra/errorReporter");
9
- var _schema = require("@effect-app/schema");
10
- var _dateFns = require("date-fns");
11
- var _effectApp = require("effect-app");
12
- var _Operations = require("effect-app/Operations");
13
- var _service = require("./service.cjs");
14
- const reportAppError = (0, _errorReporter.reportError)("Operations.Cleanup");
15
- const make = _effectApp.Effect.sync(() => {
16
- const ops = new Map();
17
- const makeOp = _effectApp.Effect.sync(() => _Operations.OperationId.make());
18
- const cleanup = _effectApp.Effect.sync(() => {
19
- const before = (0, _dateFns.subHours)(new Date(), 1);
20
- [...ops.entries()].forEach(([id, op]) => {
21
- const lastChanged = _effectApp.Option.fromNullable(op.updatedAt).pipe(_effectApp.Option.getOrElse(() => op.createdAt));
22
- if (lastChanged < before) {
23
- ops.delete(id);
24
- }
25
- });
26
- }).pipe(_effectApp.Effect.withSpan("Operations.cleanup"));
27
- function addOp(id) {
28
- return _effectApp.Effect.sync(() => {
29
- ops.set(id, new _Operations.Operation({
30
- id
31
- }));
32
- });
33
- }
34
- function findOp(id) {
35
- return _effectApp.Effect.sync(() => _effectApp.Option.fromNullable(ops.get(id)));
36
- }
37
- function finishOp(id, exit) {
38
- return _effectApp.Effect.flatMap(findOp(id), _ => _effectApp.Effect.sync(() => {
39
- if (_effectApp.Option.isNone(_)) {
40
- throw new Error("Not found");
41
- }
42
- ops.set(id, (0, _effectApp.copy)(_.value, {
43
- updatedAt: new Date(),
44
- result: _effectApp.Exit.isSuccess(exit) ? new _Operations.Success() : new _Operations.Failure({
45
- message: _effectApp.Cause.isInterrupted(exit.cause) ? (0, _schema.NonEmptyString2k)("Interrupted") : _effectApp.Cause.isDie(exit.cause) ? (0, _schema.NonEmptyString2k)("Unknown error") : _effectApp.Cause.failureOption(exit.cause).pipe(_effectApp.Option.flatMap(_ => typeof _ === "object" && _ !== null && "message" in _ && _effectApp.S.is(_schema.NonEmptyString2k)(_.message) ? _effectApp.Option.some(_.message) : _effectApp.Option.none()), _effectApp.Option.getOrNull)
46
- })
47
- }));
48
- }));
49
- }
50
- function update(id, progress) {
51
- return _effectApp.Effect.flatMap(findOp(id), _ => _effectApp.Effect.sync(() => {
52
- if (_effectApp.Option.isNone(_)) {
53
- throw new Error("Not found");
54
- }
55
- ops.set(id, (0, _effectApp.copy)(_.value, {
56
- updatedAt: new Date(),
57
- progress
58
- }));
59
- }));
60
- }
61
- return _service.Operations.of({
62
- cleanup,
63
- register: _effectApp.Effect.tap(makeOp, id => _effectApp.Effect.andThen((0, _Effect.annotateLogscoped)("operationId", id), _effectApp.Effect.acquireRelease(addOp(id), (_, exit) => finishOp(id, exit)))),
64
- find: findOp,
65
- update
66
- });
67
- });
68
- const cleanupLoop = _service.Operations.use(_ => _.cleanup.pipe(_effectApp.Effect.exit, _effectApp.Effect.flatMap(_ => {
69
- if (_effectApp.Exit.isSuccess(_)) {
70
- return _effectApp.Effect.unit;
71
- } else {
72
- return reportAppError(_.cause);
73
- }
74
- }), _effectApp.Effect.schedule(_effectApp.Schedule.fixed(_effectApp.Duration.minutes(20))), _effectApp.Effect.forkScoped));
75
- /**
76
- * @tsplus static Operations.Ops Live
77
- */
78
- const Live = exports.Live = cleanupLoop.pipe(_effectApp.Layer.scopedDiscard, _effectApp.Layer.provideMerge(_effectApp.Layer.effect(_service.Operations, make)));
79
- //# sourceMappingURL=live.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"live.cjs","names":["_Effect","require","_errorReporter","_schema","_dateFns","_effectApp","_Operations","_service","reportAppError","reportError","make","Effect","sync","ops","Map","makeOp","OperationId","cleanup","before","subHours","Date","entries","forEach","id","op","lastChanged","Option","fromNullable","updatedAt","pipe","getOrElse","createdAt","delete","withSpan","addOp","set","Operation","findOp","get","finishOp","exit","flatMap","_","isNone","Error","copy","value","result","Exit","isSuccess","Success","Failure","message","Cause","isInterrupted","cause","NonEmptyString2k","isDie","failureOption","S","is","some","none","getOrNull","update","progress","Operations","of","register","tap","andThen","annotateLogscoped","acquireRelease","find","cleanupLoop","use","unit","schedule","Schedule","fixed","Duration","minutes","forkScoped","Live","exports","Layer","scopedDiscard","provideMerge","effect"],"sources":["../../../src/services/Operations/live.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -1,47 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.Operations = void 0;
7
- exports.forkOperation = forkOperation;
8
- exports.forkOperation2 = forkOperation2;
9
- exports.forkOperationFunction = forkOperationFunction;
10
- exports.forkOperationWithEffect = forkOperationWithEffect;
11
- var _effectApp = require("effect-app");
12
- var _service = require("effect-app/service");
13
- var Scope = _interopRequireWildcard(require("effect/Scope"));
14
- var _reportError = require("../../api/reportError.cjs");
15
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
16
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
- /**
18
- * @tsplus type Operations
19
- * @tsplus companion Operations.Ops
20
- */
21
- class Operations extends (0, _service.TagClassId)("effect-app/Operations")() {}
22
- /**
23
- * @tsplus getter effect/io/Effect forkOperation
24
- */
25
- exports.Operations = Operations;
26
- function forkOperation(self) {
27
- return _effectApp.Effect.flatMap(Operations, Operations => _effectApp.Effect.flatMap(Scope.make(), scope => Operations.register.pipe(Scope.extend(scope), _effectApp.Effect.tap(() => (0, _reportError.forkDaemonReportRequestUnexpected)(Scope.use(self, scope))))));
28
- }
29
- /**
30
- * @tsplus getter function forkOperation
31
- */
32
- function forkOperationFunction(fnc) {
33
- return inp => fnc(inp).pipe(forkOperation);
34
- }
35
- /**
36
- * @tsplus static effect/io/Effect.Ops forkOperation
37
- */
38
- function forkOperation2(self) {
39
- return _effectApp.Effect.flatMap(Operations, Operations => _effectApp.Effect.flatMap(Scope.make(), scope => Operations.register.pipe(Scope.extend(scope), _effectApp.Effect.tap(id => (0, _reportError.forkDaemonReportRequestUnexpected)(Scope.use(self(id), scope))))));
40
- }
41
- /**
42
- * @tsplus static effect/io/Effect.Ops forkOperationWithEffect
43
- */
44
- function forkOperationWithEffect(self, fnc) {
45
- return _effectApp.Effect.flatMap(Operations, Operations => _effectApp.Effect.flatMap(Scope.make(), scope => Operations.register.pipe(Scope.extend(scope), _effectApp.Effect.tap(opId => (0, _reportError.forkDaemonReportRequestUnexpected)(Scope.use(self(opId), scope))), _effectApp.Effect.tap(opId => _effectApp.Effect.interruptible(fnc(opId)).pipe(_effectApp.Effect.forkScoped, Scope.extend(scope))))));
46
- }
47
- //# sourceMappingURL=service.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.cjs","names":["_effectApp","require","_service","Scope","_interopRequireWildcard","_reportError","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","Operations","TagClassId","exports","forkOperation","self","Effect","flatMap","make","scope","register","pipe","extend","tap","forkDaemonReportRequestUnexpected","use","forkOperationFunction","fnc","inp","forkOperation2","id","forkOperationWithEffect","opId","interruptible","forkScoped"],"sources":["../../../src/services/Operations/service.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import { Layer } from "effect-app";
2
- import { Operations } from "./service.js";
3
- /**
4
- * @tsplus static Operations.Ops Live
5
- */
6
- export declare const Live: Layer.Layer<Operations, never, never>;
7
- //# sourceMappingURL=live.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../../src/services/Operations/live.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuC,KAAK,EAAuB,MAAM,YAAY,CAAA;AAG5F,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAwGzC;;GAEG;AACH,eAAO,MAAM,IAAI,uCAId,CAAA"}
@@ -1,86 +0,0 @@
1
- import { annotateLogscoped } from "@effect-app/core/Effect";
2
- import { reportError } from "@effect-app/infra/errorReporter";
3
- import { NonEmptyString2k } from "@effect-app/schema";
4
- import { subHours } from "date-fns";
5
- import { Cause, copy, Duration, Effect, Exit, Layer, Option, S, Schedule } from "effect-app";
6
- import { Failure, Operation, OperationId, Success } from "effect-app/Operations";
7
- import { Operations } from "./service.js";
8
- const reportAppError = reportError("Operations.Cleanup");
9
- const make = Effect.sync(() => {
10
- const ops = new Map();
11
- const makeOp = Effect.sync(() => OperationId.make());
12
- const cleanup = Effect
13
- .sync(() => {
14
- const before = subHours(new Date(), 1);
15
- [...ops
16
- .entries()]
17
- .forEach(([id, op]) => {
18
- const lastChanged = Option.fromNullable(op.updatedAt).pipe(Option.getOrElse(() => op.createdAt));
19
- if (lastChanged < before) {
20
- ops.delete(id);
21
- }
22
- });
23
- })
24
- .pipe(Effect.withSpan("Operations.cleanup"));
25
- function addOp(id) {
26
- return Effect.sync(() => {
27
- ops.set(id, new Operation({ id }));
28
- });
29
- }
30
- function findOp(id) {
31
- return Effect.sync(() => Option.fromNullable(ops.get(id)));
32
- }
33
- function finishOp(id, exit) {
34
- return Effect.flatMap(findOp(id), (_) => Effect.sync(() => {
35
- if (Option.isNone(_)) {
36
- throw new Error("Not found");
37
- }
38
- ops.set(id, copy(_.value, {
39
- updatedAt: new Date(),
40
- result: Exit.isSuccess(exit)
41
- ? new Success()
42
- : new Failure({
43
- message: Cause.isInterrupted(exit.cause)
44
- ? NonEmptyString2k("Interrupted")
45
- : Cause.isDie(exit.cause)
46
- ? NonEmptyString2k("Unknown error")
47
- : Cause
48
- .failureOption(exit.cause)
49
- .pipe(Option.flatMap((_) => typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
50
- ? Option.some(_.message)
51
- : Option.none()), Option.getOrNull)
52
- })
53
- }));
54
- }));
55
- }
56
- function update(id, progress) {
57
- return Effect.flatMap(findOp(id), (_) => Effect.sync(() => {
58
- if (Option.isNone(_)) {
59
- throw new Error("Not found");
60
- }
61
- ops.set(id, copy(_.value, { updatedAt: new Date(), progress }));
62
- }));
63
- }
64
- return Operations.of({
65
- cleanup,
66
- register: Effect.tap(makeOp, (id) => Effect.andThen(annotateLogscoped("operationId", id), Effect.acquireRelease(addOp(id), (_, exit) => finishOp(id, exit)))),
67
- find: findOp,
68
- update
69
- });
70
- });
71
- const cleanupLoop = Operations
72
- .use((_) => _.cleanup.pipe(Effect.exit, Effect
73
- .flatMap((_) => {
74
- if (Exit.isSuccess(_)) {
75
- return Effect.unit;
76
- }
77
- else {
78
- return reportAppError(_.cause);
79
- }
80
- }), Effect.schedule(Schedule.fixed(Duration.minutes(20))), Effect.forkScoped));
81
- /**
82
- * @tsplus static Operations.Ops Live
83
- */
84
- export const Live = cleanupLoop
85
- .pipe(Layer.scopedDiscard, Layer.provideMerge(Layer.effect(Operations, make)));
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9PcGVyYXRpb25zL2xpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRTVGLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXpDLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0FBRXhELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUEwQixDQUFBO0lBQzdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7SUFFcEQsTUFBTSxPQUFPLEdBQUcsTUFBTTtTQUNuQixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQ3JDO1FBQUEsQ0FBQyxHQUFHLEdBQUc7aUJB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
@@ -1,61 +0,0 @@
1
- import type { StringId } from "@effect-app/schema";
2
- import type { Option } from "effect-app";
3
- import { Effect } from "effect-app";
4
- import type { Operation, OperationId, OperationProgress } from "effect-app/Operations";
5
- import * as Scope from "effect/Scope";
6
- declare const Operations_base: (abstract new (service: {
7
- register: Effect<OperationId, never, Scope.Scope>;
8
- update: (id: OperationId, progress: OperationProgress) => Effect<void>;
9
- find: (id: OperationId) => Effect<Option<Operation>>;
10
- cleanup: Effect<void>;
11
- }) => Readonly<{
12
- register: Effect<OperationId, never, Scope.Scope>;
13
- update: (id: OperationId, progress: OperationProgress) => Effect<void>;
14
- find: (id: OperationId) => Effect<Option<Operation>>;
15
- cleanup: Effect<void>;
16
- }> & import("effect/Context").TagClassShape<"effect-app/Operations", {
17
- register: Effect<OperationId, never, Scope.Scope>;
18
- update: (id: OperationId, progress: OperationProgress) => Effect<void>;
19
- find: (id: OperationId) => Effect<Option<Operation>>;
20
- cleanup: Effect<void>;
21
- }>) & {
22
- toLayer: <E, R>(eff: Effect<Omit<Operations, keyof import("effect/Context").TagClassShape<any, any>>, E, R>) => import("effect-app").Layer<Operations, E, R>;
23
- toLayerScoped: <E_1, R_1>(eff: Effect<Omit<Operations, keyof import("effect/Context").TagClassShape<any, any>>, E_1, R_1>) => import("effect-app").Layer<Operations, E_1, Exclude<R_1, Scope.Scope>>;
24
- of: (service: Omit<Operations, keyof import("effect/Context").TagClassShape<any, any>>) => Operations;
25
- } & import("effect/Context").Tag<Operations, Operations> & {
26
- register: Effect<StringId, never, Scope.Scope | Operations>;
27
- update: (id: StringId, progress: OperationProgress) => Effect<void, never, Operations>;
28
- find: (id: StringId) => Effect<Option<Operation>, never, Operations>;
29
- cleanup: Effect<void, never, Operations>;
30
- } & {
31
- use: <X>(body: (_: {
32
- register: Effect<OperationId, never, Scope.Scope>;
33
- update: (id: OperationId, progress: OperationProgress) => Effect<void>;
34
- find: (id: OperationId) => Effect<Option<Operation>>;
35
- cleanup: Effect<void>;
36
- }) => X) => X extends Effect<infer A_3, infer E_4, infer R_4> ? Effect<A_3, E_4, R_4 | Operations> : Effect<X, never, Operations>;
37
- };
38
- /**
39
- * @tsplus type Operations
40
- * @tsplus companion Operations.Ops
41
- */
42
- export declare class Operations extends Operations_base {
43
- }
44
- /**
45
- * @tsplus getter effect/io/Effect forkOperation
46
- */
47
- export declare function forkOperation<R, E, A>(self: Effect<A, E, R>): Effect.Effect<string & import("@effect-app/schema").StringIdBrand, never, Operations | Exclude<R, Scope.Scope>>;
48
- /**
49
- * @tsplus getter function forkOperation
50
- */
51
- export declare function forkOperationFunction<R, E, A, Inp>(fnc: (inp: Inp) => Effect<A, E, R>): (inp: Inp) => Effect.Effect<string & import("@effect-app/schema").StringIdBrand, never, Operations | Exclude<R, Scope.Scope>>;
52
- /**
53
- * @tsplus static effect/io/Effect.Ops forkOperation
54
- */
55
- export declare function forkOperation2<R, E, A>(self: (opId: OperationId) => Effect<A, E, R>): Effect.Effect<string & import("@effect-app/schema").StringIdBrand, never, Operations | Exclude<R, Scope.Scope>>;
56
- /**
57
- * @tsplus static effect/io/Effect.Ops forkOperationWithEffect
58
- */
59
- export declare function forkOperationWithEffect<R, R2, E, E2, A, A2>(self: (id: OperationId) => Effect<A, E, R>, fnc: (id: OperationId) => Effect<A2, E2, R2>): Effect<StringId, never, Operations | Exclude<R, Scope.Scope> | Exclude<R2, Scope.Scope>>;
60
- export {};
61
- //# sourceMappingURL=service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/Operations/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAEtF,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;;cAQzB,OAAO,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC;iBACpC,WAAW,YAAY,iBAAiB,KAAK,OAAO,IAAI,CAAC;eAC3D,WAAW,KAAK,OAAO,OAAO,SAAS,CAAC,CAAC;aAC3C,OAAO,IAAI,CAAC;;cAHX,OAAO,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC;iBACpC,WAAW,YAAY,iBAAiB,KAAK,OAAO,IAAI,CAAC;eAC3D,WAAW,KAAK,OAAO,OAAO,SAAS,CAAC,CAAC;aAC3C,OAAO,IAAI,CAAC;;cAHX,OAAO,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC;iBACpC,WAAW,YAAY,iBAAiB,KAAK,OAAO,IAAI,CAAC;eAC3D,WAAW,KAAK,OAAO,OAAO,SAAS,CAAC,CAAC;aAC3C,OAAO,IAAI,CAAC;;;;;;;;;;;;kBAHX,OAAO,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC;qBACpC,WAAW,YAAY,iBAAiB,KAAK,OAAO,IAAI,CAAC;mBAC3D,WAAW,KAAK,OAAO,OAAO,SAAS,CAAC,CAAC;iBAC3C,OAAO,IAAI,CAAC;;;AARvB;;;GAGG;AACH,qBAAa,UAAW,SAAQ,eAK5B;CACH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,mHAa3D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,SACvE,GAAG,qHACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,mHAanF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EACzD,IAAI,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1C,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAC3C,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAc1F"}
@@ -1,44 +0,0 @@
1
- import { Effect } from "effect-app";
2
- import { TagClassId } from "effect-app/service";
3
- import * as Scope from "effect/Scope";
4
- import { forkDaemonReportRequestUnexpected } from "../../api/reportError.js";
5
- /**
6
- * @tsplus type Operations
7
- * @tsplus companion Operations.Ops
8
- */
9
- export class Operations extends TagClassId("effect-app/Operations")() {
10
- }
11
- /**
12
- * @tsplus getter effect/io/Effect forkOperation
13
- */
14
- export function forkOperation(self) {
15
- return Effect.flatMap(Operations, (Operations) => Effect.flatMap(Scope.make(), (scope) => Operations
16
- .register
17
- .pipe(Scope.extend(scope), Effect
18
- .tap(() => forkDaemonReportRequestUnexpected(Scope.use(self, scope))))));
19
- }
20
- /**
21
- * @tsplus getter function forkOperation
22
- */
23
- export function forkOperationFunction(fnc) {
24
- return (inp) => fnc(inp).pipe(forkOperation);
25
- }
26
- /**
27
- * @tsplus static effect/io/Effect.Ops forkOperation
28
- */
29
- export function forkOperation2(self) {
30
- return Effect.flatMap(Operations, (Operations) => Effect.flatMap(Scope.make(), (scope) => Operations
31
- .register
32
- .pipe(Scope.extend(scope), Effect
33
- .tap((id) => forkDaemonReportRequestUnexpected(Scope.use(self(id), scope))))));
34
- }
35
- /**
36
- * @tsplus static effect/io/Effect.Ops forkOperationWithEffect
37
- */
38
- export function forkOperationWithEffect(self, fnc) {
39
- return Effect.flatMap(Operations, (Operations) => Effect.flatMap(Scope
40
- .make(), (scope) => Operations
41
- .register
42
- .pipe(Scope.extend(scope), Effect.tap((opId) => forkDaemonReportRequestUnexpected(Scope.use(self(opId), scope))), Effect.tap((opId) => Effect.interruptible(fnc(opId)).pipe(Effect.forkScoped, Scope.extend(scope))))));
43
- }
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9PcGVyYXRpb25zL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDL0MsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFNUU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFVBQVcsU0FBUSxVQUFVLENBQUMsdUJBQXVCLENBQUMsRUFLL0Q7Q0FDSDtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBVSxJQUFxQjtJQUMxRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDL0MsTUFBTSxDQUFDLE9BQU8sQ0FDWixLQUFLLENBQUMsSUFBSSxFQUFFLEVBQ1osQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNSLFVBQVU7U0FDUCxRQUFRO1NBQ1IsSUFBSSxDQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQ25CLE1BQU07U0FDSCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsaUNBQWlDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUN4RSxDQUNOLENBQUMsQ0FBQTtBQUNOLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBZSxHQUFrQztJQUNwRixPQUFPLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0FBQ25ELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQVUsSUFBNEM7SUFDbEYsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQy9DLE1BQU0sQ0FBQyxPQUFPLENBQ1osS0FBSyxDQUFDLElBQUksRUFBRSxFQUNaLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDUixVQUFVO1NBQ1AsUUFBUTtTQUNSLElBQUksQ0FDSCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUNuQixNQUFNO1NBQ0gsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQzlFLENBQ04sQ0FBQyxDQUFBO0FBQ04sQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxJQUEwQyxFQUMxQyxHQUE0QztJQUU1QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDL0MsTUFBTSxDQUFDLE9BQU8sQ0FDWixLQUFLO1NBQ0YsSUFBSSxFQUFFLEVBQ1QsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNSLFVBQVU7U0FDUCxRQUFRO1NBQ1IsSUFBSSxDQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQ25CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDckYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDbkcsQ0FDTixDQUFDLENBQUE7QUFDTixDQUFDIn0=
@@ -1,119 +0,0 @@
1
- import { annotateLogscoped } from "@effect-app/core/Effect"
2
- import { reportError } from "@effect-app/infra/errorReporter"
3
- import { NonEmptyString2k } from "@effect-app/schema"
4
- import { subHours } from "date-fns"
5
- import { Cause, copy, Duration, Effect, Exit, Layer, Option, S, Schedule } from "effect-app"
6
- import type { OperationProgress } from "effect-app/Operations"
7
- import { Failure, Operation, OperationId, Success } from "effect-app/Operations"
8
- import { Operations } from "./service.js"
9
-
10
- const reportAppError = reportError("Operations.Cleanup")
11
-
12
- const make = Effect.sync(() => {
13
- const ops = new Map<OperationId, Operation>()
14
- const makeOp = Effect.sync(() => OperationId.make())
15
-
16
- const cleanup = Effect
17
- .sync(() => {
18
- const before = subHours(new Date(), 1)
19
- ;[...ops
20
- .entries()]
21
- .forEach(([id, op]) => {
22
- const lastChanged = Option.fromNullable(op.updatedAt).pipe(Option.getOrElse(() => op.createdAt))
23
- if (lastChanged < before) {
24
- ops.delete(id)
25
- }
26
- })
27
- })
28
- .pipe(Effect.withSpan("Operations.cleanup"))
29
-
30
- function addOp(id: OperationId) {
31
- return Effect.sync(() => {
32
- ops.set(id, new Operation({ id }))
33
- })
34
- }
35
- function findOp(id: OperationId) {
36
- return Effect.sync(() => Option.fromNullable(ops.get(id)))
37
- }
38
- function finishOp(id: OperationId, exit: Exit<unknown, unknown>) {
39
- return Effect.flatMap(findOp(id), (_) =>
40
- Effect.sync(() => {
41
- if (Option.isNone(_)) {
42
- throw new Error("Not found")
43
- }
44
- ops.set(
45
- id,
46
- copy(_.value, {
47
- updatedAt: new Date(),
48
- result: Exit.isSuccess(exit)
49
- ? new Success()
50
- : new Failure({
51
- message: Cause.isInterrupted(exit.cause)
52
- ? NonEmptyString2k("Interrupted")
53
- : Cause.isDie(exit.cause)
54
- ? NonEmptyString2k("Unknown error")
55
- : Cause
56
- .failureOption(exit.cause)
57
- .pipe(
58
- Option.flatMap((_) =>
59
- typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
60
- ? Option.some(_.message)
61
- : Option.none()
62
- ),
63
- Option.getOrNull
64
- )
65
- })
66
- })
67
- )
68
- }))
69
- }
70
- function update(id: OperationId, progress: OperationProgress) {
71
- return Effect.flatMap(findOp(id), (_) =>
72
- Effect.sync(() => {
73
- if (Option.isNone(_)) {
74
- throw new Error("Not found")
75
- }
76
- ops.set(id, copy(_.value, { updatedAt: new Date(), progress }))
77
- }))
78
- }
79
- return Operations.of({
80
- cleanup,
81
- register: Effect.tap(
82
- makeOp,
83
- (id) =>
84
- Effect.andThen(
85
- annotateLogscoped("operationId", id),
86
- Effect.acquireRelease(addOp(id), (_, exit) => finishOp(id, exit))
87
- )
88
- ),
89
-
90
- find: findOp,
91
- update
92
- })
93
- })
94
-
95
- const cleanupLoop = Operations
96
- .use((_) =>
97
- _.cleanup.pipe(
98
- Effect.exit,
99
- Effect
100
- .flatMap((_) => {
101
- if (Exit.isSuccess(_)) {
102
- return Effect.unit
103
- } else {
104
- return reportAppError(_.cause)
105
- }
106
- }),
107
- Effect.schedule(Schedule.fixed(Duration.minutes(20))),
108
- Effect.forkScoped
109
- )
110
- )
111
-
112
- /**
113
- * @tsplus static Operations.Ops Live
114
- */
115
- export const Live = cleanupLoop
116
- .pipe(
117
- Layer.scopedDiscard,
118
- Layer.provideMerge(Layer.effect(Operations, make))
119
- )
@@ -1,84 +0,0 @@
1
- import type { StringId } from "@effect-app/schema"
2
- import type { Option } from "effect-app"
3
- import { Effect } from "effect-app"
4
- import type { Operation, OperationId, OperationProgress } from "effect-app/Operations"
5
- import { TagClassId } from "effect-app/service"
6
- import * as Scope from "effect/Scope"
7
- import { forkDaemonReportRequestUnexpected } from "../../api/reportError.js"
8
-
9
- /**
10
- * @tsplus type Operations
11
- * @tsplus companion Operations.Ops
12
- */
13
- export class Operations extends TagClassId("effect-app/Operations")<Operations, {
14
- register: Effect<OperationId, never, Scope.Scope>
15
- update: (id: OperationId, progress: OperationProgress) => Effect<void>
16
- find: (id: OperationId) => Effect<Option<Operation>>
17
- cleanup: Effect<void>
18
- }>() {
19
- }
20
-
21
- /**
22
- * @tsplus getter effect/io/Effect forkOperation
23
- */
24
- export function forkOperation<R, E, A>(self: Effect<A, E, R>) {
25
- return Effect.flatMap(Operations, (Operations) =>
26
- Effect.flatMap(
27
- Scope.make(),
28
- (scope) =>
29
- Operations
30
- .register
31
- .pipe(
32
- Scope.extend(scope),
33
- Effect
34
- .tap(() => forkDaemonReportRequestUnexpected(Scope.use(self, scope)))
35
- )
36
- ))
37
- }
38
-
39
- /**
40
- * @tsplus getter function forkOperation
41
- */
42
- export function forkOperationFunction<R, E, A, Inp>(fnc: (inp: Inp) => Effect<A, E, R>) {
43
- return (inp: Inp) => fnc(inp).pipe(forkOperation)
44
- }
45
-
46
- /**
47
- * @tsplus static effect/io/Effect.Ops forkOperation
48
- */
49
- export function forkOperation2<R, E, A>(self: (opId: OperationId) => Effect<A, E, R>) {
50
- return Effect.flatMap(Operations, (Operations) =>
51
- Effect.flatMap(
52
- Scope.make(),
53
- (scope) =>
54
- Operations
55
- .register
56
- .pipe(
57
- Scope.extend(scope),
58
- Effect
59
- .tap((id) => forkDaemonReportRequestUnexpected(Scope.use(self(id), scope)))
60
- )
61
- ))
62
- }
63
-
64
- /**
65
- * @tsplus static effect/io/Effect.Ops forkOperationWithEffect
66
- */
67
- export function forkOperationWithEffect<R, R2, E, E2, A, A2>(
68
- self: (id: OperationId) => Effect<A, E, R>,
69
- fnc: (id: OperationId) => Effect<A2, E2, R2>
70
- ): Effect<StringId, never, Operations | Exclude<R, Scope.Scope> | Exclude<R2, Scope.Scope>> {
71
- return Effect.flatMap(Operations, (Operations) =>
72
- Effect.flatMap(
73
- Scope
74
- .make(),
75
- (scope) =>
76
- Operations
77
- .register
78
- .pipe(
79
- Scope.extend(scope),
80
- Effect.tap((opId) => forkDaemonReportRequestUnexpected(Scope.use(self(opId), scope))),
81
- Effect.tap((opId) => Effect.interruptible(fnc(opId)).pipe(Effect.forkScoped, Scope.extend(scope)))
82
- )
83
- ))
84
- }