@effect-app/infra 1.8.0 → 1.9.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 +12 -0
- package/_cjs/services/Operations.cjs +22 -39
- package/_cjs/services/Operations.cjs.map +1 -1
- package/_cjs/services/OperationsRepo.cjs +11 -0
- package/_cjs/services/OperationsRepo.cjs.map +1 -0
- package/dist/services/Operations.d.ts +19 -18
- package/dist/services/Operations.d.ts.map +1 -1
- package/dist/services/Operations.js +31 -49
- package/dist/services/OperationsRepo.d.ts +6 -0
- package/dist/services/OperationsRepo.d.ts.map +1 -0
- package/dist/services/OperationsRepo.js +5 -0
- package/dist/services/Repository/ext.d.ts +1 -1
- package/dist/services/query/new-kid-interpreter.d.ts +1 -1
- package/package.json +13 -3
- package/src/services/Operations.ts +45 -58
- package/src/services/OperationsRepo.ts +7 -0
package/CHANGELOG.md
CHANGED
|
@@ -16,60 +16,43 @@ var _Operations = require("effect-app/Operations");
|
|
|
16
16
|
var _MainFiberSet = require("effect-app/services/MainFiberSet");
|
|
17
17
|
var Scope = _interopRequireWildcard(require("effect/Scope"));
|
|
18
18
|
var _reportError = require("../api/reportError.cjs");
|
|
19
|
+
var _rateLimit = require("../rateLimit.cjs");
|
|
20
|
+
var _OperationsRepo = require("./OperationsRepo.cjs");
|
|
21
|
+
var _query = require("./query.cjs");
|
|
19
22
|
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); }
|
|
20
23
|
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 && {}.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; }
|
|
21
24
|
const reportAppError = (0, _errorReporter.reportError)("Operations.Cleanup");
|
|
22
|
-
const make = _effectApp.Effect.
|
|
23
|
-
const
|
|
25
|
+
const make = _effectApp.Effect.gen(function* () {
|
|
26
|
+
const repo = yield* _OperationsRepo.OperationsRepo;
|
|
24
27
|
const makeOp = _effectApp.Effect.sync(() => _Operations.OperationId.make());
|
|
25
|
-
const cleanup = _effectApp.Effect.sync(() =>
|
|
26
|
-
const before = (0, _dateFns.subHours)(new Date(), 1);
|
|
27
|
-
[...ops.entries()].forEach(([id, op]) => {
|
|
28
|
-
const lastChanged = _effectApp.Option.fromNullable(op.updatedAt).pipe(_effectApp.Option.getOrElse(() => op.createdAt));
|
|
29
|
-
if (lastChanged < before) {
|
|
30
|
-
ops.delete(id);
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
}).pipe(_effectApp.Effect.withSpan("Operations.cleanup"));
|
|
28
|
+
const cleanup = _effectApp.Effect.sync(() => (0, _dateFns.subHours)(new Date(), 1)).pipe(_effectApp.Effect.andThen(before => repo.query((0, _query.where)("updatedAt", "lt", before.toISOString()))), _effectApp.Effect.andThen(ops => (0, _Function.pipe)(ops, (0, _rateLimit.batch)(100, _effectApp.Effect.succeed, items => repo.removeAndPublish(items)))), _effectApp.Effect.withSpan("Operations.cleanup"));
|
|
34
29
|
function addOp(id, title) {
|
|
35
|
-
return
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}));
|
|
40
|
-
});
|
|
30
|
+
return repo.save(new _Operations.Operation({
|
|
31
|
+
id,
|
|
32
|
+
title
|
|
33
|
+
})).pipe(_effectApp.Effect.orDie);
|
|
41
34
|
}
|
|
42
35
|
function findOp(id) {
|
|
43
|
-
return
|
|
36
|
+
return repo.find(id);
|
|
44
37
|
}
|
|
45
38
|
function finishOp(id, exit) {
|
|
46
|
-
return _effectApp.Effect.flatMap(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
result: _effectApp.Exit.isSuccess(exit) ? new _Operations.Success() : new _Operations.Failure({
|
|
53
|
-
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)
|
|
54
|
-
})
|
|
55
|
-
}));
|
|
56
|
-
}));
|
|
39
|
+
return _effectApp.Effect.flatMap(repo.get(id).pipe(_effectApp.Effect.orDie), _ => repo.save((0, _effectApp.copy)(_, {
|
|
40
|
+
updatedAt: new Date(),
|
|
41
|
+
result: _effectApp.Exit.isSuccess(exit) ? new _Operations.Success() : new _Operations.Failure({
|
|
42
|
+
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)
|
|
43
|
+
})
|
|
44
|
+
})).pipe(_effectApp.Effect.orDie));
|
|
57
45
|
}
|
|
58
46
|
function update(id, progress) {
|
|
59
|
-
return _effectApp.Effect.flatMap(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
ops.set(id, (0, _effectApp.copy)(_.value, {
|
|
64
|
-
updatedAt: new Date(),
|
|
65
|
-
progress
|
|
66
|
-
}));
|
|
67
|
-
}));
|
|
47
|
+
return _effectApp.Effect.flatMap(repo.get(id).pipe(_effectApp.Effect.orDie), _ => repo.save((0, _effectApp.copy)(_, {
|
|
48
|
+
updatedAt: new Date(),
|
|
49
|
+
progress
|
|
50
|
+
})).pipe(_effectApp.Effect.orDie));
|
|
68
51
|
}
|
|
69
52
|
return {
|
|
70
53
|
cleanup,
|
|
71
54
|
register: title => _effectApp.Effect.tap(makeOp, id => _effectApp.Effect.andThen((0, _Effect.annotateLogscoped)("operationId", id), _effectApp.Effect.acquireRelease(addOp(id, title), (_, exit) => finishOp(id, exit)))),
|
|
72
|
-
all:
|
|
55
|
+
all: repo.all,
|
|
73
56
|
find: findOp,
|
|
74
57
|
update
|
|
75
58
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Operations.cjs","names":["_Effect","require","_Function","_errorReporter","_schema","_dateFns","_effectApp","_Operations","_MainFiberSet","Scope","_interopRequireWildcard","_reportError","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","reportAppError","reportError","make","Effect","
|
|
1
|
+
{"version":3,"file":"Operations.cjs","names":["_Effect","require","_Function","_errorReporter","_schema","_dateFns","_effectApp","_Operations","_MainFiberSet","Scope","_interopRequireWildcard","_reportError","_rateLimit","_OperationsRepo","_query","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","reportAppError","reportError","make","Effect","gen","repo","OperationsRepo","makeOp","sync","OperationId","cleanup","subHours","Date","pipe","andThen","before","query","where","toISOString","ops","batch","succeed","items","removeAndPublish","withSpan","addOp","id","title","save","Operation","orDie","findOp","find","finishOp","exit","flatMap","_","copy","updatedAt","result","Exit","isSuccess","Success","Failure","message","Cause","isInterrupted","cause","NonEmptyString2k","isDie","failureOption","Option","S","is","some","none","getOrNull","update","progress","register","tap","annotateLogscoped","acquireRelease","all","Operations","Context","TagMakeId","CleanupLive","use","void","schedule","Schedule","fixed","Duration","minutes","map","MainFiberSet","run","Layer","effectDiscard","provide","Live","provideMerge","toLayer","forkOperation","exports","dual","self","scope","extend","forkDaemonReportRequestUnexpected","fiber","forkOperationFunction","fnc","inp","forkOperation2","forkOperationWithEffect","interruptible","forkScoped"],"sources":["../../src/services/Operations.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.OperationsRepo = void 0;
|
|
7
|
+
var _Operations = require("effect-app/Operations");
|
|
8
|
+
var _RepositoryBase = require("./RepositoryBase.cjs");
|
|
9
|
+
class OperationsRepo extends (0, _RepositoryBase.RepositoryDefaultImpl)()("Operation", _Operations.Operation) {}
|
|
10
|
+
exports.OperationsRepo = OperationsRepo;
|
|
11
|
+
//# sourceMappingURL=OperationsRepo.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationsRepo.cjs","names":["_Operations","require","_RepositoryBase","OperationsRepo","RepositoryDefaultImpl","Operation","exports"],"sources":["../../src/services/OperationsRepo.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAEM,MAAOE,cAAe,SAAQ,IAAAC,qCAAqB,GAAkB,CACzE,WAAW,EACXC,qBAAS,CACV;AAAGC,OAAA,CAAAH,cAAA,GAAAA,cAAA","ignoreList":[]}
|
|
@@ -5,53 +5,54 @@ import { Context, Effect, Layer, Option, S } from "effect-app";
|
|
|
5
5
|
import type { OperationProgress } from "effect-app/Operations";
|
|
6
6
|
import { Operation, OperationId } from "effect-app/Operations";
|
|
7
7
|
import * as Scope from "effect/Scope";
|
|
8
|
+
import { OperationsRepo } from "./OperationsRepo.js";
|
|
8
9
|
declare const Operations_base: (abstract new (service: {
|
|
9
|
-
cleanup: Effect.Effect<void, never, never>;
|
|
10
|
+
cleanup: Effect.Effect<void[], never, never>;
|
|
10
11
|
register: (title: NonEmptyString2k) => Effect.Effect<S.StringId, never, Scope.Scope>;
|
|
11
|
-
all: Effect
|
|
12
|
-
find: (id: OperationId) => Effect
|
|
12
|
+
all: Effect<Operation[]>;
|
|
13
|
+
find: (id: OperationId) => Effect<Option<Operation>>;
|
|
13
14
|
update: (id: OperationId, progress: OperationProgress) => Effect.Effect<void, never, never>;
|
|
14
15
|
}) => Readonly<{
|
|
15
|
-
cleanup: Effect.Effect<void, never, never>;
|
|
16
|
+
cleanup: Effect.Effect<void[], never, never>;
|
|
16
17
|
register: (title: NonEmptyString2k) => Effect.Effect<S.StringId, never, Scope.Scope>;
|
|
17
|
-
all: Effect
|
|
18
|
-
find: (id: OperationId) => Effect
|
|
18
|
+
all: Effect<Operation[]>;
|
|
19
|
+
find: (id: OperationId) => Effect<Option<Operation>>;
|
|
19
20
|
update: (id: OperationId, progress: OperationProgress) => Effect.Effect<void, never, never>;
|
|
20
21
|
}> & Context.TagClassShape<"effect-app/Operations", {
|
|
21
|
-
cleanup: Effect.Effect<void, never, never>;
|
|
22
|
+
cleanup: Effect.Effect<void[], never, never>;
|
|
22
23
|
register: (title: NonEmptyString2k) => Effect.Effect<S.StringId, never, Scope.Scope>;
|
|
23
|
-
all: Effect
|
|
24
|
-
find: (id: OperationId) => Effect
|
|
24
|
+
all: Effect<Operation[]>;
|
|
25
|
+
find: (id: OperationId) => Effect<Option<Operation>>;
|
|
25
26
|
update: (id: OperationId, progress: OperationProgress) => Effect.Effect<void, never, never>;
|
|
26
27
|
}>) & {
|
|
27
28
|
toLayer: {
|
|
28
|
-
(): Layer<Operations, never,
|
|
29
|
+
(): Layer<Operations, never, OperationsRepo>;
|
|
29
30
|
<E_1, R_1>(eff: Effect<Omit<Operations, keyof Context.TagClassShape<any, any>>, E_1, R_1>): Layer<Operations, E_1, R_1>;
|
|
30
31
|
};
|
|
31
32
|
toLayerScoped: {
|
|
32
|
-
(): Layer<Operations, never, Exclude<
|
|
33
|
+
(): Layer<Operations, never, Exclude<OperationsRepo, import("effect-app").Scope>>;
|
|
33
34
|
<E_1, R_2>(eff: Effect<Context.TagClassShape<any, any>, E_1, R_2>): Layer<Operations, E_1, Exclude<R_2, import("effect-app").Scope>>;
|
|
34
35
|
};
|
|
35
36
|
of: (service: Context.TagClassShape<any, any>) => Operations;
|
|
36
|
-
make: Effect<Operations, never,
|
|
37
|
+
make: Effect<Operations, never, OperationsRepo>;
|
|
37
38
|
} & Context.Tag<Operations, Operations> & {
|
|
38
|
-
cleanup: Effect<void, never, Operations>;
|
|
39
|
+
cleanup: Effect<void[], never, Operations>;
|
|
39
40
|
register: (title: NonEmptyString2k) => Effect<S.StringId, never, Operations | Scope.Scope>;
|
|
40
41
|
all: Effect<Operation[], never, Operations>;
|
|
41
|
-
find: (id: S.StringId) => Effect<Option
|
|
42
|
+
find: (id: S.StringId) => Effect<Option<Operation>, never, Operations | never>;
|
|
42
43
|
update: (id: S.StringId, progress: OperationProgress) => Effect<void, never, Operations | never>;
|
|
43
44
|
} & {
|
|
44
45
|
use: <X>(body: (_: {
|
|
45
|
-
cleanup: Effect.Effect<void, never, never>;
|
|
46
|
+
cleanup: Effect.Effect<void[], never, never>;
|
|
46
47
|
register: (title: NonEmptyString2k) => Effect.Effect<S.StringId, never, Scope.Scope>;
|
|
47
|
-
all: Effect
|
|
48
|
-
find: (id: OperationId) => Effect
|
|
48
|
+
all: Effect<Operation[]>;
|
|
49
|
+
find: (id: OperationId) => Effect<Option<Operation>>;
|
|
49
50
|
update: (id: OperationId, progress: OperationProgress) => Effect.Effect<void, never, never>;
|
|
50
51
|
}) => X) => X extends Effect<infer A_1, infer E_2, infer R_4> ? Effect<A_1, E_2, R_4 | Operations> : Effect<X, never, Operations>;
|
|
51
52
|
};
|
|
52
53
|
export declare class Operations extends Operations_base {
|
|
53
54
|
private static readonly CleanupLive;
|
|
54
|
-
static readonly Live: Layer.Layer<Operations, never,
|
|
55
|
+
static readonly Live: Layer.Layer<Operations, never, OperationsRepo>;
|
|
55
56
|
}
|
|
56
57
|
export interface RunningOperation<A, E> {
|
|
57
58
|
id: OperationId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../../src/services/Operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAA;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,EAAS,OAAO,EAAkB,MAAM,EAAQ,KAAK,EAAE,MAAM,EAAE,CAAC,EAAY,MAAM,YAAY,CAAA;AACrG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAW,SAAS,EAAE,WAAW,EAAW,MAAM,uBAAuB,CAAA;AAEhF,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;;;
|
|
1
|
+
{"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../../src/services/Operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { annotateLogscoped, flatMap } from "@effect-app/core/Effect";
|
|
2
|
-
import { dual } from "@effect-app/core/Function";
|
|
2
|
+
import { dual, pipe } from "@effect-app/core/Function";
|
|
3
3
|
import { reportError } from "@effect-app/infra/errorReporter";
|
|
4
4
|
import { NonEmptyString2k } from "@effect-app/schema";
|
|
5
5
|
import { subHours } from "date-fns";
|
|
@@ -8,66 +8,48 @@ import { Failure, Operation, OperationId, Success } from "effect-app/Operations"
|
|
|
8
8
|
import { MainFiberSet } from "effect-app/services/MainFiberSet";
|
|
9
9
|
import * as Scope from "effect/Scope";
|
|
10
10
|
import { forkDaemonReportRequestUnexpected } from "../api/reportError.js";
|
|
11
|
+
import { batch } from "../rateLimit.js";
|
|
12
|
+
import { OperationsRepo } from "./OperationsRepo.js";
|
|
13
|
+
import { where } from "./query.js";
|
|
11
14
|
const reportAppError = reportError("Operations.Cleanup");
|
|
12
|
-
const make = Effect.
|
|
13
|
-
const
|
|
15
|
+
const make = Effect.gen(function* () {
|
|
16
|
+
const repo = yield* OperationsRepo;
|
|
14
17
|
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"));
|
|
18
|
+
const cleanup = Effect.sync(() => subHours(new Date(), 1)).pipe(Effect.andThen((before) => repo.query(where("updatedAt", "lt", before.toISOString()))), Effect.andThen((ops) => pipe(ops, batch(100, Effect.succeed, (items) => repo.removeAndPublish(items)))), Effect.withSpan("Operations.cleanup"));
|
|
28
19
|
function addOp(id, title) {
|
|
29
|
-
return
|
|
30
|
-
ops.set(id, new Operation({ id, title }));
|
|
31
|
-
});
|
|
20
|
+
return repo.save(new Operation({ id, title })).pipe(Effect.orDie);
|
|
32
21
|
}
|
|
33
22
|
function findOp(id) {
|
|
34
|
-
return
|
|
23
|
+
return repo.find(id);
|
|
35
24
|
}
|
|
36
25
|
function finishOp(id, exit) {
|
|
37
|
-
return Effect
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
? NonEmptyString2k("
|
|
48
|
-
: Cause
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}));
|
|
57
|
-
}));
|
|
26
|
+
return Effect
|
|
27
|
+
.flatMap(repo.get(id).pipe(Effect.orDie), (_) => repo
|
|
28
|
+
.save(copy(_, {
|
|
29
|
+
updatedAt: new Date(),
|
|
30
|
+
result: Exit.isSuccess(exit)
|
|
31
|
+
? new Success()
|
|
32
|
+
: new Failure({
|
|
33
|
+
message: Cause.isInterrupted(exit.cause)
|
|
34
|
+
? NonEmptyString2k("Interrupted")
|
|
35
|
+
: Cause.isDie(exit.cause)
|
|
36
|
+
? NonEmptyString2k("Unknown error")
|
|
37
|
+
: Cause
|
|
38
|
+
.failureOption(exit.cause)
|
|
39
|
+
.pipe(Option.flatMap((_) => typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
|
|
40
|
+
? Option.some(_.message)
|
|
41
|
+
: Option.none()), Option.getOrNull)
|
|
42
|
+
})
|
|
43
|
+
}))
|
|
44
|
+
.pipe(Effect.orDie));
|
|
58
45
|
}
|
|
59
46
|
function update(id, progress) {
|
|
60
|
-
return Effect.flatMap(
|
|
61
|
-
if (Option.isNone(_)) {
|
|
62
|
-
throw new Error("Not found");
|
|
63
|
-
}
|
|
64
|
-
ops.set(id, copy(_.value, { updatedAt: new Date(), progress }));
|
|
65
|
-
}));
|
|
47
|
+
return Effect.flatMap(repo.get(id).pipe(Effect.orDie), (_) => repo.save(copy(_, { updatedAt: new Date(), progress })).pipe(Effect.orDie));
|
|
66
48
|
}
|
|
67
49
|
return {
|
|
68
50
|
cleanup,
|
|
69
51
|
register: (title) => Effect.tap(makeOp, (id) => Effect.andThen(annotateLogscoped("operationId", id), Effect.acquireRelease(addOp(id, title), (_, exit) => finishOp(id, exit)))),
|
|
70
|
-
all:
|
|
52
|
+
all: repo.all,
|
|
71
53
|
find: findOp,
|
|
72
54
|
update
|
|
73
55
|
};
|
|
@@ -105,4 +87,4 @@ export function forkOperationWithEffect(self, fnc, title) {
|
|
|
105
87
|
.pipe(Scope.extend(scope), Effect.flatMap((id) => forkDaemonReportRequestUnexpected(Scope.use(self(id).pipe(Effect.withSpan(title)), scope))
|
|
106
88
|
.pipe(Effect.map((fiber) => ({ fiber, id })))), Effect.tap(({ id }) => Effect.interruptible(fnc(id)).pipe(Effect.forkScoped, Scope.extend(scope))))));
|
|
107
89
|
}
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9PcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNwRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBRXRELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRW5DLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFckcsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUMvRCxPQUFPLEtBQUssS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN6RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDdkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFbEMsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUE7QUFFeEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FB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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Operation } from "effect-app/Operations";
|
|
2
|
+
declare const OperationsRepo_base: (abstract new (impl: import("./Repository.js").Repository<Operation, Operation.From, never, "Operation">) => import("./RepositoryBase.js").RepositoryBaseC3<Operation, Operation.From, never, "Operation">) & import("effect/Context").Tag<OperationsRepo, OperationsRepo> & import("./RepositoryBase.js").Repos<Operation, Operation.From, never, never, "Operation"> & import("./RepositoryBase.js").RepoFunctions<Operation, Operation.From, never, "Operation", OperationsRepo>;
|
|
3
|
+
export declare class OperationsRepo extends OperationsRepo_base {
|
|
4
|
+
}
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=OperationsRepo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperationsRepo.d.ts","sourceRoot":"","sources":["../../src/services/OperationsRepo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;;AAGjD,qBAAa,cAAe,SAAQ,mBAGnC;CAAG"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Operation } from "effect-app/Operations";
|
|
2
|
+
import { RepositoryDefaultImpl } from "./RepositoryBase.js";
|
|
3
|
+
export class OperationsRepo extends RepositoryDefaultImpl()("Operation", Operation) {
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uc1JlcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvT3BlcmF0aW9uc1JlcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2pELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRTNELE1BQU0sT0FBTyxjQUFlLFNBQVEscUJBQXFCLEVBQWtCLENBQ3pFLFdBQVcsRUFDWCxTQUFTLENBQ1Y7Q0FBRyJ9
|
|
@@ -26,7 +26,7 @@ export declare function byIdAndSaveWithPure<T extends {
|
|
|
26
26
|
id: unknown;
|
|
27
27
|
}, Encoded extends {
|
|
28
28
|
id: string;
|
|
29
|
-
}, Evt, ItemType extends string>(self: RepositoryBaseC<T, Encoded, Evt, ItemType>, id: T["id"]): <R, A, E, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, T, S2>>) => Effect.Effect<A, import("effect-app/client/errors").OptimisticConcurrencyException | import("effect-app/client/errors").InvalidStateError | NotFoundError<ItemType
|
|
29
|
+
}, Evt, ItemType extends string>(self: RepositoryBaseC<T, Encoded, Evt, ItemType>, id: T["id"]): <R, A, E, S2 extends T>(pure: Effect<A, E, FixEnv<R, Evt, T, S2>>) => Effect.Effect<A, import("effect-app/client/errors").OptimisticConcurrencyException | import("effect-app/client/errors").InvalidStateError | E | NotFoundError<ItemType>, Exclude<R, {
|
|
30
30
|
env: import("effect-app/Pure").PureEnv<Evt, T, S2>;
|
|
31
31
|
}>>;
|
|
32
32
|
/**
|
|
@@ -14,7 +14,7 @@ export declare const toFilter: <TFieldValues extends FieldValues, A, R>(q: QAll<
|
|
|
14
14
|
key: import("../../filter/types/path/eager.js").Path<TFieldValues>;
|
|
15
15
|
direction: "ASC" | "DESC";
|
|
16
16
|
}[]];
|
|
17
|
-
ttype: "
|
|
17
|
+
ttype: "many" | "count" | "one";
|
|
18
18
|
mode: "project" | "collect" | "transform";
|
|
19
19
|
filter: FilterResult[];
|
|
20
20
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"proper-lockfile": "^4.1.2",
|
|
19
19
|
"pure-rand": "6.1.0",
|
|
20
20
|
"redlock": "^4.2.0",
|
|
21
|
-
"@effect-app/infra-adapters": "1.4.0",
|
|
22
|
-
"effect-app": "1.6.0",
|
|
23
21
|
"@effect-app/core": "1.4.0",
|
|
22
|
+
"effect-app": "1.6.0",
|
|
23
|
+
"@effect-app/infra-adapters": "1.4.0",
|
|
24
24
|
"@effect-app/schema": "1.4.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
@@ -384,6 +384,16 @@
|
|
|
384
384
|
"default": "./_cjs/services/Operations.cjs"
|
|
385
385
|
}
|
|
386
386
|
},
|
|
387
|
+
"./services/OperationsRepo": {
|
|
388
|
+
"import": {
|
|
389
|
+
"types": "./dist/services/OperationsRepo.d.ts",
|
|
390
|
+
"default": "./dist/services/OperationsRepo.js"
|
|
391
|
+
},
|
|
392
|
+
"require": {
|
|
393
|
+
"types": "./dist/services/OperationsRepo.d.ts",
|
|
394
|
+
"default": "./_cjs/services/OperationsRepo.cjs"
|
|
395
|
+
}
|
|
396
|
+
},
|
|
387
397
|
"./services/QueueMaker/errors": {
|
|
388
398
|
"import": {
|
|
389
399
|
"types": "./dist/services/QueueMaker/errors.d.ts",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { annotateLogscoped, flatMap } from "@effect-app/core/Effect"
|
|
2
|
-
import { dual } from "@effect-app/core/Function"
|
|
2
|
+
import { dual, pipe } from "@effect-app/core/Function"
|
|
3
3
|
import type { RequestFiberSet } from "@effect-app/infra-adapters/RequestFiberSet"
|
|
4
4
|
import { reportError } from "@effect-app/infra/errorReporter"
|
|
5
5
|
import { NonEmptyString2k } from "@effect-app/schema"
|
|
@@ -11,75 +11,62 @@ import { Failure, Operation, OperationId, Success } from "effect-app/Operations"
|
|
|
11
11
|
import { MainFiberSet } from "effect-app/services/MainFiberSet"
|
|
12
12
|
import * as Scope from "effect/Scope"
|
|
13
13
|
import { forkDaemonReportRequestUnexpected } from "../api/reportError.js"
|
|
14
|
+
import { batch } from "../rateLimit.js"
|
|
15
|
+
import { OperationsRepo } from "./OperationsRepo.js"
|
|
16
|
+
import { where } from "./query.js"
|
|
14
17
|
|
|
15
18
|
const reportAppError = reportError("Operations.Cleanup")
|
|
16
19
|
|
|
17
|
-
const make = Effect.
|
|
18
|
-
const
|
|
20
|
+
const make = Effect.gen(function*() {
|
|
21
|
+
const repo = yield* OperationsRepo
|
|
19
22
|
const makeOp = Effect.sync(() => OperationId.make())
|
|
20
23
|
|
|
21
|
-
const cleanup = Effect
|
|
22
|
-
.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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"))
|
|
24
|
+
const cleanup = Effect.sync(() => subHours(new Date(), 1)).pipe(
|
|
25
|
+
Effect.andThen((before) => repo.query(where("updatedAt", "lt", before.toISOString()))),
|
|
26
|
+
Effect.andThen((ops) => pipe(ops, batch(100, Effect.succeed, (items) => repo.removeAndPublish(items)))),
|
|
27
|
+
Effect.withSpan("Operations.cleanup")
|
|
28
|
+
)
|
|
34
29
|
|
|
35
30
|
function addOp(id: OperationId, title: NonEmptyString2k) {
|
|
36
|
-
return
|
|
37
|
-
ops.set(id, new Operation({ id, title }))
|
|
38
|
-
})
|
|
31
|
+
return repo.save(new Operation({ id, title })).pipe(Effect.orDie)
|
|
39
32
|
}
|
|
40
33
|
function findOp(id: OperationId) {
|
|
41
|
-
return
|
|
34
|
+
return repo.find(id)
|
|
42
35
|
}
|
|
43
36
|
function finishOp(id: OperationId, exit: Exit<unknown, unknown>) {
|
|
44
|
-
return Effect
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
})
|
|
72
|
-
)
|
|
73
|
-
}))
|
|
37
|
+
return Effect
|
|
38
|
+
.flatMap(repo.get(id).pipe(Effect.orDie), (_) =>
|
|
39
|
+
repo
|
|
40
|
+
.save(
|
|
41
|
+
copy(_, {
|
|
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(
|
|
53
|
+
Option.flatMap((_) =>
|
|
54
|
+
typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
|
|
55
|
+
? Option.some(_.message)
|
|
56
|
+
: Option.none()
|
|
57
|
+
),
|
|
58
|
+
Option.getOrNull
|
|
59
|
+
)
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
)
|
|
63
|
+
.pipe(Effect.orDie))
|
|
74
64
|
}
|
|
75
65
|
function update(id: OperationId, progress: OperationProgress) {
|
|
76
|
-
return Effect.flatMap(
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
ops.set(id, copy(_.value, { updatedAt: new Date(), progress }))
|
|
82
|
-
}))
|
|
66
|
+
return Effect.flatMap(
|
|
67
|
+
repo.get(id).pipe(Effect.orDie),
|
|
68
|
+
(_) => repo.save(copy(_, { updatedAt: new Date(), progress })).pipe(Effect.orDie)
|
|
69
|
+
)
|
|
83
70
|
}
|
|
84
71
|
return {
|
|
85
72
|
cleanup,
|
|
@@ -93,7 +80,7 @@ const make = Effect.sync(() => {
|
|
|
93
80
|
)
|
|
94
81
|
),
|
|
95
82
|
|
|
96
|
-
all:
|
|
83
|
+
all: repo.all,
|
|
97
84
|
find: findOp,
|
|
98
85
|
update
|
|
99
86
|
}
|