@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 +15 -0
- package/_cjs/services/Operations.cjs +104 -10
- package/_cjs/services/Operations.cjs.map +1 -1
- package/dist/services/Operations.d.ts +64 -1
- package/dist/services/Operations.d.ts.map +1 -1
- package/dist/services/Operations.js +120 -2
- package/dist/services/RepositoryBase.d.ts +2 -2
- package/package.json +4 -24
- package/src/services/Operations.ts +184 -1
- package/_cjs/services/Operations/live.cjs +0 -79
- package/_cjs/services/Operations/live.cjs.map +0 -1
- package/_cjs/services/Operations/service.cjs +0 -47
- package/_cjs/services/Operations/service.cjs.map +0 -1
- package/dist/services/Operations/live.d.ts +0 -7
- package/dist/services/Operations/live.d.ts.map +0 -1
- package/dist/services/Operations/live.js +0 -86
- package/dist/services/Operations/service.d.ts +0 -61
- package/dist/services/Operations/service.d.ts.map +0 -1
- package/dist/services/Operations/service.js +0 -44
- package/src/services/Operations/live.ts +0 -119
- package/src/services/Operations/service.ts +0 -84
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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":["
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
2
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9PcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUU1RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDbkQsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDbkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUV2RCxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtBQUV4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQTtJQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBRXBELE1BQU0sT0FBTyxHQUFHLE1BQU07U0FDbkIsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNULE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUNyQztRQUFBLENBQUMsR0FBRyxHQUFHO2lCQUNMLE9BQU8sRUFBRSxDQUFDO2FBQ1YsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtZQUNoRyxJQUFJLFdBQVcsR0FBRyxNQUFNLEVBQUUsQ0FBQztnQkFDekIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUNoQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDLENBQUM7U0FDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUE7SUFFOUMsU0FBUyxLQUFLLENBQUMsRUFBZTtRQUM1QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3RCLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3BDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUNELFNBQVMsTUFBTSxDQUFDLEVBQWU7UUFDN0IsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUNELFNBQVMsUUFBUSxDQUFDLEVBQWUsRUFBRSxJQUE0QjtRQUM3RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUM5QixDQUFDO1lBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FDTCxFQUFFLEVBQ0YsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ1osU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQzFCLENBQUMsQ0FBQyxJQUFJLE9BQU8sRUFBRTtvQkFDZixDQUFDLENBQUMsSUFBSSxPQUFPLENBQUM7d0JBQ1osT0FBTyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzs0QkFDdEMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQzs0QkFDakMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQ0FDekIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQztnQ0FDbkMsQ0FBQyxDQUFDLEtBQUs7cUNBQ0osYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7cUNBQ3pCLElBQUksQ0FDSCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDbkIsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQ0FDeEYsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQ0FDeEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FDbEIsRUFDRCxNQUFNLENBQUMsU0FBUyxDQUNqQjtxQkFDTixDQUFDO2FBQ0wsQ0FBQyxDQUNILENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ1AsQ0FBQztJQUNELFNBQVMsTUFBTSxDQUFDLEVBQWUsRUFBRSxRQUEyQjtRQUMxRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUM5QixDQUFDO1lBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDakUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNQLENBQUM7SUFDRCxPQUFPO1FBQ0wsT0FBTztRQUNQLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUNsQixNQUFNLEVBQ04sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUNMLE1BQU0sQ0FBQyxPQUFPLENBQ1osaUJBQWlCLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxFQUNwQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDbEUsQ0FDSjtRQUVELElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTTtLQUNQLENBQUE7QUFDSCxDQUFDLENBQUMsQ0FBQTtBQUVGLE1BQU0sT0FBTyxVQUFXLFNBQVEsY0FBYyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxFQUFjO0lBQ3pGLE1BQU0sQ0FBVSxJQUFJLEdBQUcsSUFBSTtTQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNULENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNaLE1BQU0sQ0FBQyxJQUFJLEVBQ1gsTUFBTTtTQUNILE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFBO1FBQ3BCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2hDLENBQUM7SUFDSCxDQUFDLENBQUMsRUFDSixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQ3JELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQVUsQ0FBQyxFQUM3QixRQUFRLENBQUMsR0FBRyxDQUNiLENBQ0Y7U0FDQSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUE7O0FBR2hHOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBVSxJQUFxQjtJQUMxRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDL0MsTUFBTSxDQUFDLE9BQU8sQ0FDWixLQUFLLENBQUMsSUFBSSxFQUFFLEVBQ1osQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNSLFVBQVU7U0FDUCxRQUFRO1NBQ1IsSUFBSSxDQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQ25CLE1BQU07U0FDSCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsaUNBQWlDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUN4RSxDQUNOLENBQUMsQ0FBQTtBQUNOLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBZSxHQUFrQztJQUNwRixPQUFPLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0FBQ25ELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQVUsSUFBNEM7SUFDbEYsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQy9DLE1BQU0sQ0FBQyxPQUFPLENBQ1osS0FBSyxDQUFDLElBQUksRUFBRSxFQUNaLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDUixVQUFVO1NBQ1AsUUFBUTtTQUNSLElBQUksQ0FDSCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUNuQixNQUFNO1NBQ0gsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQzlFLENBQ04sQ0FBQyxDQUFBO0FBQ04sQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxJQUEwQyxFQUMxQyxHQUE0QztJQUU1QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDL0MsTUFBTSxDQUFDLE9BQU8sQ0FDWixLQUFLO1NBQ0YsSUFBSSxFQUFFLEVBQ1QsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNSLFVBQVU7U0FDUCxRQUFRO1NBQ1IsSUFBSSxDQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQ25CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDckYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FDbkcsQ0FDTixDQUFDLENBQUE7QUFDTixDQUFDIn0=
|
|
@@ -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,
|
|
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,
|
|
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.
|
|
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
|
-
"
|
|
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.
|
|
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
|
-
|
|
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 +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
|
-
}
|