@effect-app/infra 4.0.0-beta.187 → 4.0.0-beta.188

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 4.0.0-beta.188
4
+
5
+ ### Patch Changes
6
+
7
+ - b2e438f: Remove Operations service and repo
8
+ - Updated dependencies [b2e438f]
9
+ - effect-app@4.0.0-beta.188
10
+
3
11
  ## 4.0.0-beta.187
4
12
 
5
13
  ### Patch Changes
package/_check.sh CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/bin/bash
2
2
  cd /home/patroza/pj/effect-app/libs
3
- ./node_modules/.bin/tsc -p packages/infra/tsconfig.src.json --noEmit 2>&1 | grep -E "(internal\.ts|Operations\.ts|SQLQueue\.ts|memQueue\.ts|sbqueue\.ts)" | head -100
3
+ ./node_modules/.bin/tsc -p packages/infra/tsconfig.src.json --noEmit 2>&1 | grep -E "(internal\.ts|SQLQueue\.ts|memQueue\.ts|sbqueue\.ts)" | head -100
@@ -2,7 +2,7 @@ export declare const InfraLogger: {
2
2
  logWarning: (...message: ReadonlyArray<any>) => import("effect/Effect").Effect<void, never, never>;
3
3
  logError: (...message: ReadonlyArray<any>) => import("effect/Effect").Effect<void, never, never>;
4
4
  logFatal: (...message: ReadonlyArray<any>) => import("effect/Effect").Effect<void, never, never>;
5
- logInfo: (...message: ReadonlyArray<any>) => import("effect/Effect").Effect<void, never, never>;
5
+ logInfo: (...message: readonly any[]) => import("effect/Effect").Effect<void, never, never>;
6
6
  logDebug: (...message: ReadonlyArray<any>) => import("effect/Effect").Effect<void, never, never>;
7
7
  logWithLevel: (level: import("effect/LogLevel").Severity, ...message: ReadonlyArray<any>) => import("effect/Effect").Effect<void, never, never>;
8
8
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/infra",
3
- "version": "4.0.0-beta.187",
3
+ "version": "4.0.0-beta.188",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
@@ -13,7 +13,7 @@
13
13
  "proper-lockfile": "^4.1.2",
14
14
  "pure-rand": "8.4.0",
15
15
  "query-string": "^9.3.1",
16
- "effect-app": "4.0.0-beta.187"
16
+ "effect-app": "4.0.0-beta.188"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@azure/cosmos": "^4.9.3",
@@ -168,14 +168,6 @@
168
168
  "types": "./dist/Model/query/new-kid-interpreter.d.ts",
169
169
  "default": "./dist/Model/query/new-kid-interpreter.js"
170
170
  },
171
- "./Operations": {
172
- "types": "./dist/Operations.d.ts",
173
- "default": "./dist/Operations.js"
174
- },
175
- "./OperationsRepo": {
176
- "types": "./dist/OperationsRepo.d.ts",
177
- "default": "./dist/OperationsRepo.js"
178
- },
179
171
  "./QueueMaker/SQLQueue": {
180
172
  "types": "./dist/QueueMaker/SQLQueue.d.ts",
181
173
  "default": "./dist/QueueMaker/SQLQueue.js"
@@ -1,55 +0,0 @@
1
- import { Context, Effect, type Fiber, Layer, Option, S } from "effect-app";
2
- import { Operation, OperationId, type OperationProgress } from "effect-app/Operations";
3
- import { NonEmptyString2k } from "effect-app/Schema";
4
- import * as Scope from "effect/Scope";
5
- import { OperationsRepo } from "./OperationsRepo.js";
6
- import { RequestFiberSet } from "./RequestFiberSet.js";
7
- declare const Operations_base: Context.OpaqueClass<Operations, "effect-app/Operations", {
8
- cleanup: Effect.Effect<void[], never, never>;
9
- register: (title: NonEmptyString2k) => Effect.Effect<S.StringId, never, Scope.Scope>;
10
- fork: <R, R2, E, E2, A, A2>(self: (id: OperationId) => Effect.Effect<A, E, R>, fnc: (id: OperationId) => Effect.Effect<A2, E2, R2>, title: NonEmptyString2k) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope> | Exclude<R2, Scope.Scope>>;
11
- fork2: {
12
- (title: NonEmptyString2k): <R, E, A>(self: (opId: OperationId) => Effect.Effect<A, E, R>) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
13
- <R, E, A>(self: (opId: OperationId) => Effect.Effect<A, E, R>, title: NonEmptyString2k): Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
14
- };
15
- forkOperation: {
16
- (title: NonEmptyString2k): <R, E, A>(self: Effect.Effect<A, E, R>) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
17
- <R, E, A>(self: Effect.Effect<A, E, R>, title: NonEmptyString2k): Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
18
- };
19
- forkOperationFunction: <R, E, A, Inp>(fnc: (inp: Inp) => Effect.Effect<A, E, R>, title: NonEmptyString2k) => (inp: Inp) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
20
- all: Effect.Effect<Operation[], never, never>;
21
- find: (id: OperationId) => Effect.Effect<Option.Option<Operation>, never, never>;
22
- update: (id: S.StringId, progress: OperationProgress) => Effect.Effect<void, never, never>;
23
- }> & {
24
- readonly make: Effect.Effect<{
25
- cleanup: Effect.Effect<void[], never, never>;
26
- register: (title: NonEmptyString2k) => Effect.Effect<S.StringId, never, Scope.Scope>;
27
- fork: <R, R2, E, E2, A, A2>(self: (id: OperationId) => Effect.Effect<A, E, R>, fnc: (id: OperationId) => Effect.Effect<A2, E2, R2>, title: NonEmptyString2k) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope> | Exclude<R2, Scope.Scope>>;
28
- fork2: {
29
- (title: NonEmptyString2k): <R, E, A>(self: (opId: OperationId) => Effect.Effect<A, E, R>) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
30
- <R, E, A>(self: (opId: OperationId) => Effect.Effect<A, E, R>, title: NonEmptyString2k): Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
31
- };
32
- forkOperation: {
33
- (title: NonEmptyString2k): <R, E, A>(self: Effect.Effect<A, E, R>) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
34
- <R, E, A>(self: Effect.Effect<A, E, R>, title: NonEmptyString2k): Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
35
- };
36
- forkOperationFunction: <R, E, A, Inp>(fnc: (inp: Inp) => Effect.Effect<A, E, R>, title: NonEmptyString2k) => (inp: Inp) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>;
37
- all: Effect.Effect<Operation[], never, never>;
38
- find: (id: OperationId) => Effect.Effect<Option.Option<Operation>, never, never>;
39
- update: (id: S.StringId, progress: OperationProgress) => Effect.Effect<void, never, never>;
40
- }, never, OperationsRepo | RequestFiberSet>;
41
- };
42
- export declare class Operations extends Operations_base {
43
- private static readonly CleanupLive;
44
- static readonly Live: Layer.Layer<Operations, never, OperationsRepo>;
45
- static readonly forkOperation: (title: NonEmptyString2k) => <R, E, A>(self: Effect.Effect<A, E, R>) => Effect.Effect<RunningOperation<A, E>, never, Operations | Exclude<R, Scope.Scope>>;
46
- static readonly forkOperationFunction: <R, E, A, Inp>(fnc: (inp: Inp) => Effect.Effect<A, E, R>, title: NonEmptyString2k) => (inp: Inp) => Effect.Effect<RunningOperation<A, E>, never, Operations | Exclude<R, Scope.Scope>>;
47
- static readonly fork: <R, R2, E, E2, A, A2>(self: (id: OperationId) => Effect.Effect<A, E, R>, fnc: (id: OperationId) => Effect.Effect<A2, E2, R2>, title: NonEmptyString2k) => Effect.Effect<RunningOperation<A, E>, never, Operations | Exclude<R, Scope.Scope> | Exclude<R2, Scope.Scope>>;
48
- static readonly fork2: (title: NonEmptyString2k) => <R, E, A>(self: (opId: OperationId) => Effect.Effect<A, E, R>) => Effect.Effect<RunningOperation<A, E>, never, Operations | Exclude<R, Scope.Scope>>;
49
- }
50
- export interface RunningOperation<A, E> {
51
- id: OperationId;
52
- fiber: Fiber.Fiber<A, E>;
53
- }
54
- export {};
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9ucy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL09wZXJhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFTLE9BQU8sRUFBa0IsTUFBTSxFQUFRLEtBQUssS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFZLE1BQU0sWUFBWSxDQUFBO0FBR2pILE9BQU8sRUFBRSxTQUFTLEVBQW9CLFdBQVcsRUFBRSxLQUFLLGlCQUFpQixFQUFvQixNQUFNLHVCQUF1QixDQUFBO0FBQzFILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sY0FBYyxDQUFBO0FBSXJDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7OztzQkFvQzNCLGdCQUFnQjtXQXlCM0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLFFBQ3pCLENBQUMsRUFBRSxFQUFFLFdBQVcsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQzVDLENBQUMsRUFBRSxFQUFFLFdBQVcsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQzVDLGdCQUFnQixLQUN0QixNQUFNLENBQUMsTUFBTSxDQUNkLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDdEIsS0FBSyxFQUNMLE9BQU8sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUNuRDs7Z0JBZ0JTLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxFQUFF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
@@ -1 +0,0 @@
1
- {"version":3,"file":"Operations.d.ts","sourceRoot":"","sources":["../src/Operations.ts"],"names":[],"mappings":"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"}
@@ -1,99 +0,0 @@
1
- import { reportError } from "@effect-app/infra/errorReporter";
2
- import { subHours } from "date-fns";
3
- import { Cause, Context, copy, Duration, Effect, Exit, Layer, Option, S, Schedule } from "effect-app";
4
- import { annotateLogscoped } from "effect-app/Effect";
5
- import { dual, pipe } from "effect-app/Function";
6
- import { Operation, OperationFailure, OperationId, OperationSuccess } from "effect-app/Operations";
7
- import { NonEmptyString2k } from "effect-app/Schema";
8
- import * as Scope from "effect/Scope";
9
- import { setupRequestContextFromCurrent } from "./api/setupRequest.js";
10
- import { MainFiberSet } from "./MainFiberSet.js";
11
- import { where } from "./Model/query.js";
12
- import { OperationsRepo } from "./OperationsRepo.js";
13
- import { batch } from "./rateLimit.js";
14
- import { RequestFiberSet } from "./RequestFiberSet.js";
15
- const reportAppError = reportError("Operations.Cleanup");
16
- const make = Effect.gen(function* () {
17
- const repo = yield* OperationsRepo;
18
- const reqFiberSet = yield* RequestFiberSet;
19
- const makeOp = Effect.sync(() => OperationId.make());
20
- const addOp = Effect.fnUntraced(function* (id, title) {
21
- return yield* repo.save(Operation.make({ id, title })).pipe(Effect.orDie);
22
- });
23
- const finishOp = Effect.fnUntraced(function* (id, exit) {
24
- const op = yield* repo.get(id).pipe(Effect.orDie);
25
- const result = Exit.isSuccess(exit)
26
- ? OperationSuccess.make({})
27
- : OperationFailure.make({
28
- message: Cause.hasInterruptsOnly(exit.cause)
29
- ? NonEmptyString2k("Interrupted")
30
- : Cause.hasDies(exit.cause)
31
- ? NonEmptyString2k("Unknown error")
32
- : Cause
33
- .findErrorOption(exit.cause)
34
- .pipe(Option.flatMap((_) => typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
35
- ? Option.some(_.message)
36
- : Option.none()), Option.getOrNull)
37
- });
38
- return yield* repo.save(copy(op, { updatedAt: new Date(), result })).pipe(Effect.orDie);
39
- });
40
- const register = (title) => Effect.tap(makeOp, (id) => Effect.andThen(annotateLogscoped("operationId", id), Effect.acquireRelease(addOp(id, title), (_, exit) => finishOp(id, exit))));
41
- const cleanup = Effect
42
- .gen(function* () {
43
- const before = subHours(new Date(), 1);
44
- const ops = yield* repo.query(where("updatedAt", "lt", before.toISOString()));
45
- return yield* pipe(ops, batch(100, Effect.succeed, (items) => repo.removeAndPublish(items)));
46
- })
47
- .pipe(setupRequestContextFromCurrent("Operations.cleanup"));
48
- const findOp = (id) => repo.find(id);
49
- const update = Effect.fnUntraced(function* (id, progress) {
50
- const op = yield* repo.get(id).pipe(Effect.orDie);
51
- return yield* repo.save(copy(op, { updatedAt: new Date(), progress })).pipe(Effect.orDie);
52
- });
53
- function fork(self, fnc, title) {
54
- return Effect.gen(function* () {
55
- const scope = yield* Scope.make();
56
- const id = yield* Scope.provide(register(title), scope);
57
- const fiber = yield* reqFiberSet.forkDaemonReportUnexpected(Scope.use(self(id).pipe(Effect.withSpan(title, {}, { captureStackTrace: false })), scope));
58
- yield* Scope.provide(Effect.forkScoped(Effect.interruptible(fnc(id))), scope);
59
- return { fiber, id };
60
- });
61
- }
62
- const fork2 = dual(2, Effect.fnUntraced(function* (self, title) {
63
- const scope = yield* Scope.make();
64
- const id = yield* Scope.provide(register(title), scope);
65
- const fiber = yield* reqFiberSet.forkDaemonReportUnexpected(Scope.use(self(id).pipe(Effect.withSpan(title, {}, { captureStackTrace: false })), scope));
66
- return { fiber, id };
67
- }));
68
- const forkOperation = dual(2, Effect.fnUntraced(function* (self, title) {
69
- const scope = yield* Scope.make();
70
- const id = yield* Scope.provide(register(title), scope);
71
- const fiber = yield* reqFiberSet.forkDaemonReportUnexpected(Scope.use(self.pipe(Effect.withSpan(title, {}, { captureStackTrace: false })), scope));
72
- return { fiber, id };
73
- }));
74
- function forkOperationFunction(fnc, title) {
75
- return (inp) => forkOperation(fnc(inp), title);
76
- }
77
- return {
78
- cleanup,
79
- register,
80
- fork,
81
- fork2,
82
- forkOperation,
83
- forkOperationFunction,
84
- all: repo.all,
85
- find: findOp,
86
- update
87
- };
88
- });
89
- export class Operations extends Context.Opaque()("effect-app/Operations", { make }) {
90
- static CleanupLive = this
91
- .use((_) => _.cleanup.pipe(Effect.exit, Effect.flatMap((exit) => Exit.isSuccess(exit) ? Effect.void : reportAppError(exit.cause)), Effect.schedule(Schedule.fixed(Duration.minutes(20))), Effect.map((_) => _), MainFiberSet.run))
92
- .pipe(Layer.effectDiscard, Layer.provide(MainFiberSet.Live));
93
- static Live = this.CleanupLive.pipe(Layer.provideMerge(this.toLayer(this.make)), Layer.provide(RequestFiberSet.Live));
94
- static forkOperation = (title) => (self) => this.use((_) => _.forkOperation(self, title));
95
- static forkOperationFunction = (fnc, title) => (inp) => this.use((_) => _.forkOperationFunction(fnc, title)(inp));
96
- static fork = (self, fnc, title) => this.use((_) => _.fork(self, fnc, title));
97
- static fork2 = (title) => (self) => this.use((_) => _.fork2(self, title));
98
- }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9PcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBYyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDakgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDckQsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBMEIsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUMxSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNwRCxPQUFPLEtBQUssS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDaEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXRELE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO0FBRXhELE1BQU0s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
@@ -1,23 +0,0 @@
1
- import { Context, Effect } from "effect-app";
2
- import { Operation } from "effect-app/Operations";
3
- declare const OperationsRepo_base: Context.ServiceClass<OperationsRepo, "OperationRepo", import("./Model/Repository.js").ExtendedRepository<Operation, {
4
- readonly createdAt: string;
5
- readonly id: string;
6
- readonly progress?: import("effect-app/Operations").OperationProgress.Encoded | undefined;
7
- readonly result?: import("effect-app/Operations").OperationSuccess.Encoded | import("effect-app/Operations").OperationFailure.Encoded | undefined;
8
- readonly title: string;
9
- readonly updatedAt: string | null;
10
- }, never, "Operation", "id", never, never, never>> & {
11
- readonly make: Effect.Effect<import("./Model/Repository.js").ExtendedRepository<Operation, {
12
- readonly createdAt: string;
13
- readonly id: string;
14
- readonly progress?: import("effect-app/Operations").OperationProgress.Encoded | undefined;
15
- readonly result?: import("effect-app/Operations").OperationSuccess.Encoded | import("effect-app/Operations").OperationFailure.Encoded | undefined;
16
- readonly title: string;
17
- readonly updatedAt: string | null;
18
- }, never, "Operation", "id", never, never, never>, never, import("./Model.js").RepositoryRegistry | import("./Store.js").StoreMaker>;
19
- };
20
- export declare class OperationsRepo extends OperationsRepo_base {
21
- }
22
- export {};
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uc1JlcG8uZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9PcGVyYXRpb25zUmVwby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdqRCxxQkFBYSxjQUFlLFNBQVEsbUJBV25DO0NBQUcifQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperationsRepo.d.ts","sourceRoot":"","sources":["../src/OperationsRepo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;;;;;;;;;;;;;;;;;;AAGjD,qBAAa,cAAe,SAAQ,mBAWnC;CAAG"}
@@ -1,14 +0,0 @@
1
- import { Context, Effect } from "effect-app";
2
- import { Operation } from "effect-app/Operations";
3
- import { makeRepo } from "./Model.js";
4
- export class OperationsRepo extends Context.Service()("OperationRepo", {
5
- make: Effect.gen(function* () {
6
- return yield* makeRepo("Operation", Operation, {
7
- config: {
8
- allowNamespace: () => true
9
- }
10
- });
11
- })
12
- }) {
13
- }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3BlcmF0aW9uc1JlcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvT3BlcmF0aW9uc1JlcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFckMsTUFBTSxPQUFPLGNBQWUsU0FBUSxPQUFPLENBQUMsT0FBTyxFQUFrQixDQUNuRSxlQUFlLEVBQ2Y7SUFDRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDeEIsT0FBTyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRTtZQUM3QyxNQUFNLEVBQUU7Z0JBQ04sY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUk7YUFDM0I7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDLENBQUM7Q0FDSCxDQUNGO0NBQUcifQ==
package/src/Operations.ts DELETED
@@ -1,200 +0,0 @@
1
- import { reportError } from "@effect-app/infra/errorReporter"
2
- import { subHours } from "date-fns"
3
- import { Cause, Context, copy, Duration, Effect, Exit, type Fiber, Layer, Option, S, Schedule } from "effect-app"
4
- import { annotateLogscoped } from "effect-app/Effect"
5
- import { dual, pipe } from "effect-app/Function"
6
- import { Operation, OperationFailure, OperationId, type OperationProgress, OperationSuccess } from "effect-app/Operations"
7
- import { NonEmptyString2k } from "effect-app/Schema"
8
- import * as Scope from "effect/Scope"
9
- import { setupRequestContextFromCurrent } from "./api/setupRequest.js"
10
- import { MainFiberSet } from "./MainFiberSet.js"
11
- import { where } from "./Model/query.js"
12
- import { OperationsRepo } from "./OperationsRepo.js"
13
- import { batch } from "./rateLimit.js"
14
- import { RequestFiberSet } from "./RequestFiberSet.js"
15
-
16
- const reportAppError = reportError("Operations.Cleanup")
17
-
18
- const make = Effect.gen(function*() {
19
- const repo = yield* OperationsRepo
20
- const reqFiberSet = yield* RequestFiberSet
21
- const makeOp = Effect.sync(() => OperationId.make())
22
-
23
- const addOp = Effect.fnUntraced(function*(id: OperationId, title: NonEmptyString2k) {
24
- return yield* repo.save(Operation.make({ id, title })).pipe(Effect.orDie)
25
- })
26
-
27
- const finishOp = Effect.fnUntraced(function*(id: OperationId, exit: Exit.Exit<unknown, unknown>) {
28
- const op = yield* repo.get(id).pipe(Effect.orDie)
29
- const result = Exit.isSuccess(exit)
30
- ? OperationSuccess.make({})
31
- : OperationFailure.make({
32
- message: Cause.hasInterruptsOnly(exit.cause)
33
- ? NonEmptyString2k("Interrupted")
34
- : Cause.hasDies(exit.cause)
35
- ? NonEmptyString2k("Unknown error")
36
- : Cause
37
- .findErrorOption(exit.cause)
38
- .pipe(
39
- Option.flatMap((_) =>
40
- typeof _ === "object" && _ !== null && "message" in _ && S.is(NonEmptyString2k)(_.message)
41
- ? Option.some(_.message)
42
- : Option.none()
43
- ),
44
- Option.getOrNull
45
- )
46
- })
47
- return yield* repo.save(copy(op, { updatedAt: new Date(), result })).pipe(Effect.orDie)
48
- })
49
-
50
- const register = (title: NonEmptyString2k) =>
51
- Effect.tap(
52
- makeOp,
53
- (id) =>
54
- Effect.andThen(
55
- annotateLogscoped("operationId", id),
56
- Effect.acquireRelease(addOp(id, title), (_, exit) => finishOp(id, exit))
57
- )
58
- )
59
-
60
- const cleanup = Effect
61
- .gen(function*() {
62
- const before = subHours(new Date(), 1)
63
- const ops = yield* repo.query(where("updatedAt", "lt", before.toISOString()))
64
- return yield* pipe(ops, batch(100, Effect.succeed, (items) => repo.removeAndPublish(items)))
65
- })
66
- .pipe(setupRequestContextFromCurrent("Operations.cleanup"))
67
-
68
- const findOp = (id: OperationId) => repo.find(id)
69
-
70
- const update = Effect.fnUntraced(function*(id: OperationId, progress: OperationProgress) {
71
- const op = yield* repo.get(id).pipe(Effect.orDie)
72
- return yield* repo.save(copy(op, { updatedAt: new Date(), progress })).pipe(Effect.orDie)
73
- })
74
-
75
- function fork<R, R2, E, E2, A, A2>(
76
- self: (id: OperationId) => Effect.Effect<A, E, R>,
77
- fnc: (id: OperationId) => Effect.Effect<A2, E2, R2>,
78
- title: NonEmptyString2k
79
- ): Effect.Effect<
80
- RunningOperation<A, E>,
81
- never,
82
- Exclude<R, Scope.Scope> | Exclude<R2, Scope.Scope>
83
- > {
84
- return Effect.gen(function*() {
85
- const scope = yield* Scope.make()
86
- const id = yield* Scope.provide(register(title), scope)
87
- const fiber = yield* reqFiberSet.forkDaemonReportUnexpected(
88
- Scope.use(
89
- self(id).pipe(Effect.withSpan(title, {}, { captureStackTrace: false })),
90
- scope
91
- )
92
- )
93
- yield* Scope.provide(Effect.forkScoped(Effect.interruptible(fnc(id))), scope)
94
- return { fiber, id } satisfies RunningOperation<A, E>
95
- })
96
- }
97
-
98
- const fork2: {
99
- (title: NonEmptyString2k): <R, E, A>(
100
- self: (opId: OperationId) => Effect.Effect<A, E, R>
101
- ) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>
102
- <R, E, A>(
103
- self: (opId: OperationId) => Effect.Effect<A, E, R>,
104
- title: NonEmptyString2k
105
- ): Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>
106
- } = dual(
107
- 2,
108
- Effect.fnUntraced(function*<R, E, A>(
109
- self: (opId: OperationId) => Effect.Effect<A, E, R>,
110
- title: NonEmptyString2k
111
- ) {
112
- const scope = yield* Scope.make()
113
- const id = yield* Scope.provide(register(title), scope)
114
- const fiber = yield* reqFiberSet.forkDaemonReportUnexpected(
115
- Scope.use(
116
- self(id).pipe(Effect.withSpan(title, {}, { captureStackTrace: false })),
117
- scope
118
- )
119
- )
120
- return { fiber, id } satisfies RunningOperation<A, E>
121
- })
122
- )
123
-
124
- const forkOperation: {
125
- (title: NonEmptyString2k): <R, E, A>(
126
- self: Effect.Effect<A, E, R>
127
- ) => Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>
128
- <R, E, A>(
129
- self: Effect.Effect<A, E, R>,
130
- title: NonEmptyString2k
131
- ): Effect.Effect<RunningOperation<A, E>, never, Exclude<R, Scope.Scope>>
132
- } = dual(
133
- 2,
134
- Effect.fnUntraced(function*<R, E, A>(self: Effect.Effect<A, E, R>, title: NonEmptyString2k) {
135
- const scope = yield* Scope.make()
136
- const id = yield* Scope.provide(register(title), scope)
137
- const fiber = yield* reqFiberSet.forkDaemonReportUnexpected(
138
- Scope.use(
139
- self.pipe(Effect.withSpan(title, {}, { captureStackTrace: false })),
140
- scope
141
- )
142
- )
143
- return { fiber, id } satisfies RunningOperation<A, E>
144
- })
145
- )
146
-
147
- function forkOperationFunction<R, E, A, Inp>(fnc: (inp: Inp) => Effect.Effect<A, E, R>, title: NonEmptyString2k) {
148
- return (inp: Inp) => forkOperation(fnc(inp), title)
149
- }
150
-
151
- return {
152
- cleanup,
153
- register,
154
- fork,
155
- fork2,
156
- forkOperation,
157
- forkOperationFunction,
158
- all: repo.all,
159
- find: findOp,
160
- update
161
- }
162
- })
163
-
164
- export class Operations extends Context.Opaque<Operations>()("effect-app/Operations", { make }) {
165
- private static readonly CleanupLive = this
166
- .use((_) =>
167
- _.cleanup.pipe(
168
- Effect.exit,
169
- Effect.flatMap((exit) => Exit.isSuccess(exit) ? Effect.void : reportAppError(exit.cause)),
170
- Effect.schedule(Schedule.fixed(Duration.minutes(20))),
171
- Effect.map((_) => _ as never),
172
- MainFiberSet.run
173
- )
174
- )
175
- .pipe(Layer.effectDiscard, Layer.provide(MainFiberSet.Live))
176
-
177
- static readonly Live = this.CleanupLive.pipe(
178
- Layer.provideMerge(this.toLayer(this.make)),
179
- Layer.provide(RequestFiberSet.Live)
180
- )
181
-
182
- static readonly forkOperation = (title: NonEmptyString2k) => <R, E, A>(self: Effect.Effect<A, E, R>) =>
183
- this.use((_) => _.forkOperation(self, title))
184
- static readonly forkOperationFunction =
185
- <R, E, A, Inp>(fnc: (inp: Inp) => Effect.Effect<A, E, R>, title: NonEmptyString2k) => (inp: Inp) =>
186
- this.use((_) => _.forkOperationFunction(fnc, title)(inp))
187
- static readonly fork = <R, R2, E, E2, A, A2>(
188
- self: (id: OperationId) => Effect.Effect<A, E, R>,
189
- fnc: (id: OperationId) => Effect.Effect<A2, E2, R2>,
190
- title: NonEmptyString2k
191
- ) => this.use((_) => _.fork(self, fnc, title))
192
-
193
- static readonly fork2 = (title: NonEmptyString2k) => <R, E, A>(self: (opId: OperationId) => Effect.Effect<A, E, R>) =>
194
- this.use((_) => _.fork2(self, title))
195
- }
196
-
197
- export interface RunningOperation<A, E> {
198
- id: OperationId
199
- fiber: Fiber.Fiber<A, E>
200
- }
@@ -1,16 +0,0 @@
1
- import { Context, Effect } from "effect-app"
2
- import { Operation } from "effect-app/Operations"
3
- import { makeRepo } from "./Model.js"
4
-
5
- export class OperationsRepo extends Context.Service<OperationsRepo>()(
6
- "OperationRepo",
7
- {
8
- make: Effect.gen(function*() {
9
- return yield* makeRepo("Operation", Operation, {
10
- config: {
11
- allowNamespace: () => true
12
- }
13
- })
14
- })
15
- }
16
- ) {}