@effect-app/infra 3.9.0 → 4.0.0-beta.0
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 +22 -0
- package/_check.sh +3 -0
- package/dist/CUPS.d.ts +22 -12
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +28 -29
- package/dist/Emailer/Sendgrid.js +13 -12
- package/dist/Emailer/service.d.ts +3 -13
- package/dist/Emailer/service.d.ts.map +1 -1
- package/dist/Emailer/service.js +3 -3
- package/dist/MainFiberSet.d.ts +18 -41
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +10 -10
- package/dist/Model/Repository/ext.d.ts.map +1 -1
- package/dist/Model/Repository/ext.js +13 -10
- package/dist/Model/Repository/internal/internal.d.ts +5 -5
- package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
- package/dist/Model/Repository/internal/internal.js +52 -42
- package/dist/Model/Repository/legacy.d.ts +9 -9
- package/dist/Model/Repository/legacy.d.ts.map +1 -1
- package/dist/Model/Repository/makeRepo.d.ts +4 -4
- package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
- package/dist/Model/Repository/makeRepo.js +1 -1
- package/dist/Model/Repository/service.d.ts +11 -11
- package/dist/Model/Repository/service.d.ts.map +1 -1
- package/dist/Model/Repository/validation.d.ts +17 -47
- package/dist/Model/Repository/validation.d.ts.map +1 -1
- package/dist/Model/Repository/validation.js +2 -2
- package/dist/Model/query/dsl.d.ts +22 -22
- package/dist/Model/query/dsl.d.ts.map +1 -1
- package/dist/Model/query/dsl.js +1 -1
- package/dist/Model/query/new-kid-interpreter.d.ts +1 -1
- package/dist/Model/query/new-kid-interpreter.js +7 -7
- package/dist/Operations.d.ts +22 -63
- package/dist/Operations.d.ts.map +1 -1
- package/dist/Operations.js +14 -14
- package/dist/OperationsRepo.d.ts +23 -7
- package/dist/OperationsRepo.d.ts.map +1 -1
- package/dist/OperationsRepo.js +4 -5
- package/dist/QueueMaker/SQLQueue.d.ts +6 -8
- package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
- package/dist/QueueMaker/SQLQueue.js +20 -24
- package/dist/QueueMaker/errors.js +1 -1
- package/dist/QueueMaker/memQueue.d.ts +2 -5
- package/dist/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/QueueMaker/memQueue.js +22 -26
- package/dist/QueueMaker/sbqueue.d.ts +2 -5
- package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/QueueMaker/sbqueue.js +24 -28
- package/dist/RequestContext.d.ts +28 -41
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +4 -4
- package/dist/RequestFiberSet.d.ts +23 -50
- package/dist/RequestFiberSet.d.ts.map +1 -1
- package/dist/RequestFiberSet.js +14 -14
- package/dist/Store/ContextMapContainer.d.ts +4 -4
- package/dist/Store/ContextMapContainer.d.ts.map +1 -1
- package/dist/Store/ContextMapContainer.js +5 -5
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +21 -28
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +12 -16
- package/dist/Store/Memory.d.ts +2 -2
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +25 -33
- package/dist/Store/index.js +2 -2
- package/dist/Store/service.d.ts +9 -34
- package/dist/Store/service.d.ts.map +1 -1
- package/dist/Store/service.js +4 -4
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +10 -2
- package/dist/adapters/SQL/Model.d.ts +106 -162
- package/dist/adapters/SQL/Model.d.ts.map +1 -1
- package/dist/adapters/SQL/Model.js +92 -130
- package/dist/adapters/ServiceBus.d.ts +13 -44
- package/dist/adapters/ServiceBus.d.ts.map +1 -1
- package/dist/adapters/ServiceBus.js +13 -15
- package/dist/adapters/cosmos-client.d.ts +7 -3
- package/dist/adapters/cosmos-client.d.ts.map +1 -1
- package/dist/adapters/cosmos-client.js +5 -4
- package/dist/adapters/logger.d.ts +1 -1
- package/dist/adapters/logger.d.ts.map +1 -1
- package/dist/adapters/memQueue.d.ts +8 -21
- package/dist/adapters/memQueue.d.ts.map +1 -1
- package/dist/adapters/memQueue.js +4 -4
- package/dist/adapters/mongo-client.d.ts +6 -6
- package/dist/adapters/mongo-client.d.ts.map +1 -1
- package/dist/adapters/mongo-client.js +5 -4
- package/dist/adapters/redis-client.d.ts +14 -4
- package/dist/adapters/redis-client.d.ts.map +1 -1
- package/dist/adapters/redis-client.js +19 -18
- package/dist/api/ContextProvider.d.ts +10 -15
- package/dist/api/ContextProvider.d.ts.map +1 -1
- package/dist/api/ContextProvider.js +8 -8
- package/dist/api/codec.d.ts +1 -1
- package/dist/api/codec.d.ts.map +1 -1
- package/dist/api/codec.js +1 -1
- package/dist/api/internal/RequestContextMiddleware.d.ts +1 -1
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
- package/dist/api/internal/auth.d.ts +3 -3
- package/dist/api/internal/auth.d.ts.map +1 -1
- package/dist/api/internal/auth.js +8 -8
- package/dist/api/internal/events.d.ts +2 -2
- package/dist/api/internal/events.d.ts.map +1 -1
- package/dist/api/internal/events.js +9 -9
- package/dist/api/internal/health.d.ts +1 -1
- package/dist/api/internal/health.d.ts.map +1 -1
- package/dist/api/internal/health.js +2 -2
- package/dist/api/layerUtils.d.ts +14 -14
- package/dist/api/layerUtils.d.ts.map +1 -1
- package/dist/api/layerUtils.js +5 -5
- package/dist/api/middlewares.d.ts +0 -75
- package/dist/api/middlewares.d.ts.map +1 -1
- package/dist/api/middlewares.js +6 -51
- package/dist/api/reportError.js +4 -4
- package/dist/api/routing/middleware/RouterMiddleware.d.ts +4 -4
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.d.ts +6 -7
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +9 -13
- package/dist/api/routing/schema/jwt.d.ts +1 -1
- package/dist/api/routing/schema/jwt.d.ts.map +1 -1
- package/dist/api/routing/schema/jwt.js +5 -4
- package/dist/api/routing/utils.d.ts +2 -2
- package/dist/api/routing/utils.d.ts.map +1 -1
- package/dist/api/routing/utils.js +10 -8
- package/dist/api/routing.d.ts +39 -37
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +17 -21
- package/dist/api/setupRequest.d.ts +4 -6
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +10 -9
- package/dist/arbs.d.ts +3 -3
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +2 -2
- package/dist/errorReporter.d.ts +1 -1
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +12 -12
- package/dist/fileUtil.d.ts +6 -6
- package/dist/fileUtil.d.ts.map +1 -1
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +19 -18
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +11 -13
- package/dist/logger/shared.d.ts +2 -2
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +7 -9
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/rateLimit.d.ts +2 -2
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +5 -5
- package/dist/test.d.ts +2 -2
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +6 -24
- package/package.json +24 -27
- package/src/CUPS.ts +15 -14
- package/src/Emailer/Sendgrid.ts +15 -13
- package/src/Emailer/service.ts +3 -3
- package/src/MainFiberSet.ts +16 -12
- package/src/Model/Repository/ext.ts +18 -16
- package/src/Model/Repository/internal/internal.ts +80 -69
- package/src/Model/Repository/legacy.ts +9 -9
- package/src/Model/Repository/makeRepo.ts +5 -5
- package/src/Model/Repository/service.ts +12 -12
- package/src/Model/Repository/validation.ts +1 -1
- package/src/Model/query/dsl.ts +13 -13
- package/src/Model/query/new-kid-interpreter.ts +8 -8
- package/src/Operations.ts +17 -14
- package/src/OperationsRepo.ts +3 -4
- package/src/QueueMaker/SQLQueue.ts +86 -89
- package/src/QueueMaker/errors.ts +1 -1
- package/src/QueueMaker/memQueue.ts +90 -91
- package/src/QueueMaker/sbqueue.ts +90 -92
- package/src/RequestContext.ts +3 -3
- package/src/RequestFiberSet.ts +17 -15
- package/src/Store/ContextMapContainer.ts +4 -4
- package/src/Store/Cosmos.ts +20 -27
- package/src/Store/Disk.ts +13 -17
- package/src/Store/Memory.ts +28 -34
- package/src/Store/index.ts +1 -1
- package/src/Store/service.ts +4 -4
- package/src/Store/utils.ts +9 -5
- package/src/adapters/SQL/Model.ts +255 -268
- package/src/adapters/ServiceBus.ts +17 -20
- package/src/adapters/cosmos-client.ts +5 -5
- package/src/adapters/memQueue.ts +3 -3
- package/src/adapters/mongo-client.ts +5 -5
- package/src/adapters/redis-client.ts +25 -19
- package/src/api/ContextProvider.ts +24 -34
- package/src/api/codec.ts +1 -1
- package/src/api/internal/auth.ts +11 -13
- package/src/api/internal/events.ts +11 -11
- package/src/api/internal/health.ts +1 -1
- package/src/api/layerUtils.ts +20 -20
- package/src/api/middlewares.ts +0 -97
- package/src/api/reportError.ts +3 -3
- package/src/api/routing/middleware/RouterMiddleware.ts +5 -6
- package/src/api/routing/middleware/middleware.ts +13 -25
- package/src/api/routing/schema/jwt.ts +9 -7
- package/src/api/routing/utils.ts +12 -10
- package/src/api/routing.ts +77 -79
- package/src/api/setupRequest.ts +9 -8
- package/src/arbs.ts +3 -3
- package/src/errorReporter.ts +12 -12
- package/src/logger/jsonLogger.ts +18 -17
- package/src/logger/logFmtLogger.ts +10 -12
- package/src/logger/shared.ts +6 -8
- package/src/rateLimit.ts +7 -7
- package/src/test.ts +7 -29
- package/test/contextProvider.test.ts +77 -70
- package/test/controller.test.ts +51 -39
- package/test/dist/contextProvider.test.d.ts.map +1 -1
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/fixtures.d.ts +33 -81
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +9 -8
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/dist/rawQuery.test.d.ts.map +1 -1
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/fixtures.ts +9 -7
- package/test/query.test.ts +49 -41
- package/test/rawQuery.test.ts +44 -40
- package/test/requires.test.ts +40 -31
- package/test/rpc-multi-middleware.test.ts +13 -14
- package/test/validateSample.test.ts +2 -2
- package/tsconfig.json +1 -25
- package/dist/api/internal/middlewares.d.ts +0 -15
- package/dist/api/internal/middlewares.d.ts.map +0 -1
- package/dist/api/internal/middlewares.js +0 -168
- package/src/api/internal/middlewares.ts +0 -279
package/src/CUPS.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type FileOptions, tempFile } from "@effect-app/infra/fileUtil"
|
|
2
2
|
import cp from "child_process"
|
|
3
|
-
import { Config, Effect, Layer, Predicate, S } from "effect-app"
|
|
3
|
+
import { Config, Effect, Layer, Option, Predicate, S, ServiceMap } from "effect-app"
|
|
4
4
|
import { pretty } from "effect-app/utils"
|
|
5
5
|
import fs from "fs"
|
|
6
6
|
import os from "os"
|
|
@@ -79,7 +79,7 @@ function getAvailablePrinters(host?: string) {
|
|
|
79
79
|
const { stdout } = yield* exec(["lpstat", ...buildListArgs({ host }), "-s"].join(" "))
|
|
80
80
|
return [...stdout.matchAll(/device for (\w+):/g)]
|
|
81
81
|
.map((_) => _[1])
|
|
82
|
-
.filter(Predicate.
|
|
82
|
+
.filter(Predicate.isNotNullish)
|
|
83
83
|
.map((_) => S.NonEmptyString255(_))
|
|
84
84
|
})
|
|
85
85
|
}
|
|
@@ -100,13 +100,14 @@ export const CUPSConfig = Config.all({
|
|
|
100
100
|
)
|
|
101
101
|
})
|
|
102
102
|
|
|
103
|
-
export class CUPS extends
|
|
104
|
-
|
|
103
|
+
export class CUPS extends ServiceMap.Service<CUPS>()("effect-app/CUPS", {
|
|
104
|
+
make: Effect.gen(function*() {
|
|
105
105
|
const config = yield* CUPSConfig
|
|
106
|
+
const serverUrl = Option.getOrUndefined(config.server)
|
|
106
107
|
function print(buffer: ArrayBuffer, printerId: PrinterId, ...options: string[]) {
|
|
107
108
|
const _print = printBuffer({
|
|
108
109
|
id: printerId,
|
|
109
|
-
url:
|
|
110
|
+
url: serverUrl
|
|
110
111
|
}, options)
|
|
111
112
|
return _print(buffer)
|
|
112
113
|
}
|
|
@@ -115,21 +116,21 @@ export class CUPS extends Effect.Service<CUPS>()("effect-app/CUPS", {
|
|
|
115
116
|
printFile: (filePath: string, printerId: PrinterId, ...options: string[]) =>
|
|
116
117
|
printFile({
|
|
117
118
|
id: printerId,
|
|
118
|
-
url:
|
|
119
|
+
url: serverUrl
|
|
119
120
|
}, options)(filePath),
|
|
120
|
-
getAvailablePrinters: getAvailablePrinters(
|
|
121
|
+
getAvailablePrinters: getAvailablePrinters(serverUrl?.host)
|
|
121
122
|
}
|
|
122
123
|
})
|
|
123
124
|
}) {
|
|
124
125
|
static readonly Fake = Layer.effect(
|
|
125
126
|
this,
|
|
126
|
-
Effect.sync(() =>
|
|
127
|
-
|
|
128
|
-
print: (buffer, printerId, ...options) =>
|
|
127
|
+
Effect.sync(() =>
|
|
128
|
+
CUPS.of({
|
|
129
|
+
print: (buffer: ArrayBuffer, printerId: PrinterId, ...options: string[]) =>
|
|
129
130
|
InfraLogger
|
|
130
131
|
.logInfo("Printing to fake printer")
|
|
131
132
|
.pipe(
|
|
132
|
-
Effect.
|
|
133
|
+
Effect.andThen(Effect.sync(() => ({ stdout: "fake", stderr: "" }))),
|
|
133
134
|
Effect
|
|
134
135
|
.annotateLogs({
|
|
135
136
|
printerId,
|
|
@@ -137,11 +138,11 @@ export class CUPS extends Effect.Service<CUPS>()("effect-app/CUPS", {
|
|
|
137
138
|
"bufferSize": buffer.byteLength.toString()
|
|
138
139
|
})
|
|
139
140
|
),
|
|
140
|
-
printFile: (filePath, printerId, ...options) =>
|
|
141
|
+
printFile: (filePath: string, printerId: PrinterId, ...options: string[]) =>
|
|
141
142
|
InfraLogger
|
|
142
143
|
.logInfo("Printing to fake printer")
|
|
143
144
|
.pipe(
|
|
144
|
-
Effect.
|
|
145
|
+
Effect.andThen(Effect.sync(() => ({ stdout: "fake", stderr: "" }))),
|
|
145
146
|
Effect
|
|
146
147
|
.annotateLogs({
|
|
147
148
|
printerId,
|
|
@@ -151,6 +152,6 @@ export class CUPS extends Effect.Service<CUPS>()("effect-app/CUPS", {
|
|
|
151
152
|
),
|
|
152
153
|
getAvailablePrinters: Effect.sync(() => [])
|
|
153
154
|
})
|
|
154
|
-
|
|
155
|
+
)
|
|
155
156
|
)
|
|
156
157
|
}
|
package/src/Emailer/Sendgrid.ts
CHANGED
|
@@ -31,18 +31,18 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
|
|
|
31
31
|
yield* InfraLogger.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5)))
|
|
32
32
|
|
|
33
33
|
const ret = yield* Effect
|
|
34
|
-
.
|
|
34
|
+
.callback<
|
|
35
35
|
[sgMail.ClientResponse, Record<string, unknown>],
|
|
36
36
|
Error | sgMail.ResponseError
|
|
37
37
|
>(
|
|
38
|
-
(
|
|
38
|
+
(resume) =>
|
|
39
39
|
void sgMail.send(
|
|
40
40
|
renderedMsg as any, // sue me
|
|
41
41
|
msg.isMultiple ?? true,
|
|
42
42
|
(err, result) =>
|
|
43
43
|
err
|
|
44
|
-
?
|
|
45
|
-
:
|
|
44
|
+
? resume(Effect.fail(err))
|
|
45
|
+
: resume(Effect.sync(() => result!))
|
|
46
46
|
)
|
|
47
47
|
)
|
|
48
48
|
.pipe(Effect.mapError((raw) => new SendMailError({ raw })))
|
|
@@ -107,26 +107,28 @@ function renderFake(addr: EmailData | readonly EmailData[], makeId: () => number
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
const eq = Equivalence.mapInput(
|
|
110
|
-
Equivalence.
|
|
110
|
+
Equivalence.String,
|
|
111
111
|
(to: { name?: string; email: string } | string) => typeof to === "string" ? to.toLowerCase() : to.email.toLowerCase()
|
|
112
112
|
)
|
|
113
113
|
|
|
114
|
+
function isEmailDataArray(md: EmailData | readonly EmailData[]): md is readonly EmailData[] {
|
|
115
|
+
return globalThis.Array.isArray(md)
|
|
116
|
+
}
|
|
117
|
+
|
|
114
118
|
// TODO: should just not add any already added email address
|
|
115
119
|
// https://stackoverflow.com/a/53603076/11595834
|
|
116
120
|
function renderFakeIfTest(addr: EmailData | readonly EmailData[], makeId: () => number) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
addr
|
|
120
|
-
.map((x) => (isTestAddress(x) ? renderFake(x, makeId) : x)),
|
|
121
|
+
if (isEmailDataArray(addr)) {
|
|
122
|
+
return Array.dedupeWith(
|
|
123
|
+
addr.map((x) => (isTestAddress(x) ? renderFake(x, makeId) : x)),
|
|
121
124
|
eq
|
|
122
125
|
)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
: addr
|
|
126
|
+
}
|
|
127
|
+
return isTestAddress(addr) ? renderFake(addr, makeId) : addr
|
|
126
128
|
}
|
|
127
129
|
|
|
128
130
|
function renderMailData(md: EmailData | readonly EmailData[]): string {
|
|
129
|
-
if (
|
|
131
|
+
if (isEmailDataArray(md)) {
|
|
130
132
|
return md.map(renderMailData).join(", ")
|
|
131
133
|
}
|
|
132
134
|
if (typeof md === "string") {
|
package/src/Emailer/service.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import type { MailContent, MailData } from "@sendgrid/helpers/classes/mail.js"
|
|
2
2
|
import type { ResponseError } from "@sendgrid/mail"
|
|
3
|
-
import {
|
|
3
|
+
import { Data, type Effect, type NonEmptyReadonlyArray, type Redacted, ServiceMap } from "effect-app"
|
|
4
4
|
import type { Email } from "effect-app/Schema"
|
|
5
5
|
|
|
6
6
|
export class SendMailError extends Data.TaggedError("SendMailError")<{
|
|
7
7
|
readonly raw: Error | ResponseError
|
|
8
8
|
}> {}
|
|
9
9
|
|
|
10
|
-
export class Emailer extends
|
|
10
|
+
export class Emailer extends ServiceMap.Opaque<Emailer, {
|
|
11
11
|
sendMail: (msg: EmailMsgOptionalFrom) => Effect.Effect<void, SendMailError>
|
|
12
|
-
}>() {}
|
|
12
|
+
}>()("effect-app/Emailer") {}
|
|
13
13
|
|
|
14
14
|
export type EmailData = Email | {
|
|
15
15
|
name?: string
|
package/src/MainFiberSet.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Effect, Fiber, FiberSet, Layer, ServiceMap } from "effect-app"
|
|
2
2
|
import type {} from "effect/Scope"
|
|
3
|
-
import type {} from "effect/Context"
|
|
4
3
|
import { InfraLogger } from "./logger.js"
|
|
5
4
|
import { reportNonInterruptedFailureCause } from "./QueueMaker/errors.js"
|
|
6
5
|
import { setRootParentSpan } from "./RequestFiberSet.js"
|
|
7
6
|
|
|
8
7
|
const make = Effect.gen(function*() {
|
|
9
8
|
const set = yield* FiberSet.make<unknown, never>()
|
|
10
|
-
const add = (...fibers: Fiber.
|
|
11
|
-
Effect.sync(() => fibers.forEach((_) => FiberSet.
|
|
12
|
-
const addAll = (fibers: readonly Fiber.
|
|
13
|
-
Effect.sync(() => fibers.forEach((_) => FiberSet.
|
|
9
|
+
const add = (...fibers: Fiber.Fiber<never, never>[]) =>
|
|
10
|
+
Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
|
|
11
|
+
const addAll = (fibers: readonly Fiber.Fiber<never, never>[]) =>
|
|
12
|
+
Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
|
|
14
13
|
const join = FiberSet.size(set).pipe(
|
|
15
14
|
Effect.andThen((count) => InfraLogger.logDebug(`Joining ${count} current fibers on the MainFiberSet`)),
|
|
16
15
|
Effect.andThen(FiberSet.join(set))
|
|
@@ -42,7 +41,7 @@ const make = Effect.gen(function*() {
|
|
|
42
41
|
function forkDaemonReport<A, E, R>(self: Effect.Effect<A, E, R>) {
|
|
43
42
|
return self.pipe(
|
|
44
43
|
Effect.asVoid,
|
|
45
|
-
Effect.
|
|
44
|
+
Effect.catchCause(reportNonInterruptedFailureCause({})),
|
|
46
45
|
setRootParentSpan,
|
|
47
46
|
Effect.uninterruptible,
|
|
48
47
|
run
|
|
@@ -63,10 +62,15 @@ const make = Effect.gen(function*() {
|
|
|
63
62
|
* you should register these long running fibers in a FiberSet, and join them at the end of your main program.
|
|
64
63
|
* This way any errors will blow up the main program instead of fibers dying unknowingly.
|
|
65
64
|
*/
|
|
66
|
-
export class MainFiberSet extends
|
|
67
|
-
static readonly Live = this.
|
|
68
|
-
static readonly JoinLive = this.
|
|
69
|
-
|
|
65
|
+
export class MainFiberSet extends ServiceMap.Service<MainFiberSet>()("MainFiberSet", { make }) {
|
|
66
|
+
static readonly Live = Layer.effect(this, this.make)
|
|
67
|
+
static readonly JoinLive = this.asEffect().pipe(
|
|
68
|
+
Effect.andThen((_) => _.join),
|
|
69
|
+
Layer.effectDiscard,
|
|
70
|
+
Layer.provide(this.Live)
|
|
71
|
+
)
|
|
72
|
+
static readonly run = <A, R>(self: Effect.Effect<A, never, R>) =>
|
|
73
|
+
this.asEffect().pipe(Effect.andThen((_) => _.run(self)))
|
|
70
74
|
static readonly forkDaemonReport = <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
71
|
-
this.
|
|
75
|
+
this.asEffect().pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
|
|
72
76
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
|
3
|
-
import { Array, Effect, Exit, type NonEmptyArray,
|
|
3
|
+
import { Array, Effect, Exit, type NonEmptyArray, Option, Request, RequestResolver } from "effect-app"
|
|
4
4
|
import { type InvalidStateError, NotFoundError, type OptimisticConcurrencyException } from "effect-app/client/errors"
|
|
5
5
|
import { type FixEnv, type PureEnv, runTerm } from "effect-app/Pure"
|
|
6
6
|
import { AnyPureDSL } from "../dsl.js"
|
|
@@ -21,9 +21,11 @@ export const extendRepo = <
|
|
|
21
21
|
repo: Repository<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish>
|
|
22
22
|
) => {
|
|
23
23
|
const get = (id: T[IdKey]) =>
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
repo.find(id).pipe(
|
|
25
|
+
Effect.flatMap(Option.match({
|
|
26
|
+
onNone: () => Effect.fail(new NotFoundError<ItemType>({ type: repo.itemType, id })),
|
|
27
|
+
onSome: Effect.succeed
|
|
28
|
+
}))
|
|
27
29
|
)
|
|
28
30
|
function saveManyWithPure_<
|
|
29
31
|
R,
|
|
@@ -80,7 +82,7 @@ export const extendRepo = <
|
|
|
80
82
|
batchSize = 100
|
|
81
83
|
) {
|
|
82
84
|
return Effect.forEach(
|
|
83
|
-
Array.
|
|
85
|
+
Array.chunksOf(items, batchSize),
|
|
84
86
|
(batch) =>
|
|
85
87
|
saveAllWithEffectInt(
|
|
86
88
|
runTerm(pure, batch)
|
|
@@ -176,7 +178,7 @@ export const extendRepo = <
|
|
|
176
178
|
} = (items, pure, batch?: "batched" | number) =>
|
|
177
179
|
batch
|
|
178
180
|
? Effect.forEach(
|
|
179
|
-
Array.
|
|
181
|
+
Array.chunksOf(items, batch === "batched" ? 100 : batch),
|
|
180
182
|
(batch) =>
|
|
181
183
|
saveAllWithEffectInt(
|
|
182
184
|
runTerm(pure, batch)
|
|
@@ -207,30 +209,30 @@ export const extendRepo = <
|
|
|
207
209
|
const _request = Request.tagged<Req>(`Get${repo.itemType}`)
|
|
208
210
|
|
|
209
211
|
const requestResolver = RequestResolver
|
|
210
|
-
.
|
|
211
|
-
|
|
212
|
+
.make((
|
|
213
|
+
entries: NonEmptyArray<Request.Entry<Req>>,
|
|
214
|
+
_key: unknown
|
|
212
215
|
) =>
|
|
213
|
-
(repo.query(Q.where(repo.idKey as any, "in" as any,
|
|
216
|
+
(repo.query(Q.where(repo.idKey as any, "in" as any, entries.map((_) => _.request.id)) as any) as Effect.Effect<
|
|
214
217
|
readonly T[],
|
|
215
218
|
never
|
|
216
219
|
>)
|
|
217
220
|
// TODO
|
|
218
221
|
.pipe(
|
|
219
222
|
Effect.andThen((items) =>
|
|
220
|
-
Effect.forEach(
|
|
223
|
+
Effect.forEach(entries, (entry) =>
|
|
221
224
|
Request.complete(
|
|
222
|
-
r,
|
|
223
225
|
Array
|
|
224
|
-
.findFirst(items, (_) => _[repo.idKey] ===
|
|
226
|
+
.findFirst(items, (_) => _[repo.idKey] === entry.request.id)
|
|
225
227
|
.pipe(Option.match({
|
|
226
|
-
onNone: () => Exit.fail(new NotFoundError({ type: repo.itemType, id:
|
|
228
|
+
onNone: () => Exit.fail(new NotFoundError({ type: repo.itemType, id: entry.request.id })),
|
|
227
229
|
onSome: Exit.succeed
|
|
228
230
|
}))
|
|
229
|
-
), { discard: true })
|
|
231
|
+
)(entry), { discard: true })
|
|
230
232
|
),
|
|
231
233
|
Effect
|
|
232
|
-
.
|
|
233
|
-
Effect.forEach(
|
|
234
|
+
.catchCause((cause) =>
|
|
235
|
+
Effect.forEach(entries, (entry) => Request.complete(Exit.failCause(cause))(entry), { discard: true })
|
|
234
236
|
)
|
|
235
237
|
)
|
|
236
238
|
)
|