@effect-app/infra 0.48.0 → 0.49.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 +21 -0
- package/_cjs/_ext/Array.cjs.map +1 -1
- package/_cjs/api/defaultErrorHandler.cjs.map +1 -1
- package/_cjs/api/express/makeJsonSchema.cjs +2 -2
- package/_cjs/api/express/makeJsonSchema.cjs.map +1 -1
- package/_cjs/api/express/schema/jwt.cjs.map +1 -1
- package/_cjs/api/express/schema/requestHandler.cjs.map +1 -1
- package/_cjs/api/express/schema/routing.cjs.map +1 -1
- package/_cjs/api/reportError.cjs.map +1 -1
- package/_cjs/api/routing.cjs.map +1 -1
- package/_cjs/api/setupRequest.cjs.map +1 -1
- package/_cjs/api/writeDocs.cjs.map +1 -1
- package/_cjs/rateLimit.cjs.map +1 -1
- package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -1
- package/_cjs/services/Emailer/fake.cjs.map +1 -1
- package/_cjs/services/Operations/live.cjs.map +1 -1
- package/_cjs/services/Operations/service.cjs.map +1 -1
- package/_cjs/services/QueueMaker/errors.cjs.map +1 -1
- package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
- package/_cjs/services/Repository.cjs +8 -8
- package/_cjs/services/Repository.cjs.map +1 -1
- package/_cjs/services/RepositoryBase.cjs +13 -13
- package/_cjs/services/RepositoryBase.cjs.map +1 -1
- package/_cjs/services/RequestContextContainer.cjs.map +1 -1
- package/_cjs/services/Store/Cosmos.cjs +9 -9
- package/_cjs/services/Store/Cosmos.cjs.map +1 -1
- package/_cjs/services/Store/Cosmos.test.cjs.map +1 -1
- package/_cjs/services/Store/Disk.cjs.map +1 -1
- package/_cjs/services/Store/Memory.cjs +42 -42
- package/_cjs/services/Store/Memory.cjs.map +1 -1
- package/_cjs/services/Store/Redis.cjs +13 -13
- package/_cjs/services/Store/Redis.cjs.map +1 -1
- package/_cjs/services/Store/codeFilter.test.cjs.map +1 -1
- package/_cjs/services/Store/index.cjs.map +1 -1
- package/_cjs/services/Store/service.cjs.map +1 -1
- package/_cjs/services/Store/utils.cjs +2 -3
- package/_cjs/services/Store/utils.cjs.map +1 -1
- package/_cjs/services/simpledb/cosmosdb.cjs +12 -4
- package/_cjs/services/simpledb/cosmosdb.cjs.map +1 -1
- package/_cjs/services/simpledb/diskdb.cjs.map +1 -1
- package/_cjs/services/simpledb/memdb.cjs.map +1 -1
- package/_cjs/services/simpledb/mongodb.cjs +15 -5
- package/_cjs/services/simpledb/mongodb.cjs.map +1 -1
- package/_cjs/services/simpledb/redisdb.cjs +13 -7
- package/_cjs/services/simpledb/redisdb.cjs.map +1 -1
- package/_cjs/services/simpledb/simpledb.cjs.map +1 -1
- package/_src/_ext/Array.ts +3 -2
- package/_src/api/defaultErrorHandler.ts +14 -12
- package/_src/api/express/makeJsonSchema.ts +6 -5
- package/_src/api/express/schema/jwt.ts +1 -1
- package/_src/api/express/schema/requestHandler.ts +112 -100
- package/_src/api/express/schema/routing.ts +61 -55
- package/_src/api/reportError.ts +16 -12
- package/_src/api/routing.ts +157 -135
- package/_src/api/setupRequest.ts +3 -1
- package/_src/api/writeDocs.ts +4 -3
- package/_src/rateLimit.ts +21 -14
- package/_src/services/Emailer/Sendgrid.ts +11 -10
- package/_src/services/Emailer/fake.ts +2 -1
- package/_src/services/Operations/live.ts +18 -12
- package/_src/services/Operations/service.ts +26 -17
- package/_src/services/QueueMaker/errors.ts +7 -6
- package/_src/services/QueueMaker/memQueue.ts +13 -11
- package/_src/services/QueueMaker/sbqueue.ts +16 -14
- package/_src/services/Repository.ts +53 -51
- package/_src/services/RepositoryBase.ts +33 -28
- package/_src/services/RequestContextContainer.ts +4 -3
- package/_src/services/Store/Cosmos.test.ts +31 -29
- package/_src/services/Store/Cosmos.ts +203 -180
- package/_src/services/Store/Disk.ts +19 -18
- package/_src/services/Store/Memory.ts +37 -32
- package/_src/services/Store/Redis.ts +31 -27
- package/_src/services/Store/codeFilter.test.ts +26 -16
- package/_src/services/Store/index.ts +26 -24
- package/_src/services/Store/service.ts +5 -5
- package/_src/services/Store/utils.ts +27 -24
- package/_src/services/simpledb/cosmosdb.ts +61 -51
- package/_src/services/simpledb/diskdb.ts +38 -31
- package/_src/services/simpledb/memdb.ts +25 -21
- package/_src/services/simpledb/mongodb.ts +40 -35
- package/_src/services/simpledb/redisdb.ts +66 -55
- package/_src/services/simpledb/simpledb.ts +32 -30
- package/dist/_ext/Array.d.ts.map +1 -1
- package/dist/_ext/Array.js +2 -2
- package/dist/api/defaultErrorHandler.d.ts.map +1 -1
- package/dist/api/defaultErrorHandler.js +5 -5
- package/dist/api/express/makeJsonSchema.d.ts +0 -1
- package/dist/api/express/makeJsonSchema.d.ts.map +1 -1
- package/dist/api/express/makeJsonSchema.js +4 -4
- package/dist/api/express/schema/jwt.js +2 -2
- package/dist/api/express/schema/requestHandler.d.ts.map +1 -1
- package/dist/api/express/schema/requestHandler.js +17 -17
- package/dist/api/express/schema/routing.d.ts.map +1 -1
- package/dist/api/express/schema/routing.js +13 -11
- package/dist/api/reportError.d.ts.map +1 -1
- package/dist/api/reportError.js +6 -6
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +29 -25
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +2 -2
- package/dist/api/writeDocs.d.ts.map +1 -1
- package/dist/api/writeDocs.js +5 -4
- package/dist/rateLimit.d.ts +4 -4
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +5 -4
- package/dist/services/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/services/Emailer/Sendgrid.js +9 -9
- package/dist/services/Emailer/fake.d.ts.map +1 -1
- package/dist/services/Emailer/fake.js +1 -1
- package/dist/services/Operations/live.d.ts.map +1 -1
- package/dist/services/Operations/live.js +11 -8
- package/dist/services/Operations/service.d.ts.map +1 -1
- package/dist/services/Operations/service.js +10 -4
- package/dist/services/QueueMaker/errors.d.ts.map +1 -1
- package/dist/services/QueueMaker/errors.js +5 -5
- package/dist/services/QueueMaker/memQueue.d.ts +1 -1
- package/dist/services/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/memQueue.js +5 -4
- package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/sbqueue.js +5 -5
- package/dist/services/Repository.d.ts +34 -35
- package/dist/services/Repository.d.ts.map +1 -1
- package/dist/services/Repository.js +16 -16
- package/dist/services/RepositoryBase.d.ts +4 -4
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +25 -22
- package/dist/services/RequestContextContainer.d.ts.map +1 -1
- package/dist/services/RequestContextContainer.js +3 -3
- package/dist/services/Store/Cosmos.d.ts +3 -3
- package/dist/services/Store/Cosmos.d.ts.map +1 -1
- package/dist/services/Store/Cosmos.js +53 -39
- package/dist/services/Store/Disk.d.ts.map +1 -1
- package/dist/services/Store/Disk.js +18 -18
- package/dist/services/Store/Memory.d.ts +2 -3
- package/dist/services/Store/Memory.d.ts.map +1 -1
- package/dist/services/Store/Memory.js +44 -44
- package/dist/services/Store/Redis.d.ts +4 -4
- package/dist/services/Store/Redis.d.ts.map +1 -1
- package/dist/services/Store/Redis.js +19 -17
- package/dist/services/Store/index.d.ts.map +1 -1
- package/dist/services/Store/index.js +4 -4
- package/dist/services/Store/service.d.ts +4 -5
- package/dist/services/Store/service.d.ts.map +1 -1
- package/dist/services/Store/service.js +3 -3
- package/dist/services/Store/utils.d.ts +2 -2
- package/dist/services/Store/utils.d.ts.map +1 -1
- package/dist/services/Store/utils.js +16 -14
- package/dist/services/simpledb/cosmosdb.d.ts.map +1 -1
- package/dist/services/simpledb/cosmosdb.js +16 -12
- package/dist/services/simpledb/diskdb.d.ts.map +1 -1
- package/dist/services/simpledb/diskdb.js +15 -15
- package/dist/services/simpledb/memdb.d.ts.map +1 -1
- package/dist/services/simpledb/memdb.js +6 -6
- package/dist/services/simpledb/mongodb.d.ts +5 -5
- package/dist/services/simpledb/mongodb.d.ts.map +1 -1
- package/dist/services/simpledb/mongodb.js +9 -9
- package/dist/services/simpledb/redisdb.d.ts +4 -4
- package/dist/services/simpledb/redisdb.d.ts.map +1 -1
- package/dist/services/simpledb/redisdb.js +18 -18
- package/dist/services/simpledb/simpledb.d.ts.map +1 -1
- package/dist/services/simpledb/simpledb.js +9 -9
- package/package.json +7 -7
|
@@ -19,10 +19,13 @@ export abstract class Operations extends ServiceTaggedClass<Operations>()(Operat
|
|
|
19
19
|
export function forkOperation<R, E, A>(self: Effect<R, E, A>) {
|
|
20
20
|
return Debug.untraced(() =>
|
|
21
21
|
Operations.flatMap(
|
|
22
|
-
Operations =>
|
|
23
|
-
Scope
|
|
24
|
-
.
|
|
25
|
-
|
|
22
|
+
(Operations) =>
|
|
23
|
+
Scope
|
|
24
|
+
.make()
|
|
25
|
+
.flatMap((scope) =>
|
|
26
|
+
Operations
|
|
27
|
+
.register
|
|
28
|
+
.extend(scope)
|
|
26
29
|
.tap(() => self.use(scope).forkDaemonReportRequestUnexpected)
|
|
27
30
|
)
|
|
28
31
|
)
|
|
@@ -40,13 +43,16 @@ export function forkOperationFunction<R, E, A, Inp>(fnc: (inp: Inp) => Effect<R,
|
|
|
40
43
|
* @tsplus static effect/io/Effect.Ops forkOperation
|
|
41
44
|
*/
|
|
42
45
|
export function forkOperation2<R, E, A>(self: (opId: OperationId) => Effect<R, E, A>) {
|
|
43
|
-
return Debug.untraced(restore =>
|
|
46
|
+
return Debug.untraced((restore) =>
|
|
44
47
|
Operations.flatMap(
|
|
45
|
-
Operations =>
|
|
46
|
-
Scope
|
|
47
|
-
.
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
(Operations) =>
|
|
49
|
+
Scope
|
|
50
|
+
.make()
|
|
51
|
+
.flatMap((scope) =>
|
|
52
|
+
Operations
|
|
53
|
+
.register
|
|
54
|
+
.extend(scope)
|
|
55
|
+
.tap((id) => restore(self)(id).use(scope).forkDaemonReportRequestUnexpected)
|
|
50
56
|
)
|
|
51
57
|
)
|
|
52
58
|
)
|
|
@@ -59,14 +65,17 @@ export function forkOperationWithEffect<R, R2, E, E2, A, A2>(
|
|
|
59
65
|
self: (id: OperationId) => Effect<R, E, A>,
|
|
60
66
|
fnc: (id: OperationId) => Effect<R2, E2, A2>
|
|
61
67
|
) {
|
|
62
|
-
return Debug.untraced(restore =>
|
|
68
|
+
return Debug.untraced((restore) =>
|
|
63
69
|
Operations.flatMap(
|
|
64
|
-
Operations =>
|
|
65
|
-
Scope
|
|
66
|
-
.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
.
|
|
70
|
+
(Operations) =>
|
|
71
|
+
Scope
|
|
72
|
+
.make()
|
|
73
|
+
.flatMap((scope) =>
|
|
74
|
+
Operations
|
|
75
|
+
.register
|
|
76
|
+
.extend(scope)
|
|
77
|
+
.tap((opId) => restore(self)(opId).use(scope).forkDaemonReportRequestUnexpected)
|
|
78
|
+
.tap((opId) => restore(fnc)(opId).interruptible.forkScoped.extend(scope))
|
|
70
79
|
)
|
|
71
80
|
)
|
|
72
81
|
)
|
|
@@ -14,10 +14,10 @@ export class FatalQueueException<E> extends CauseException<E> {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
const reportQueueError_ = reportError(cause => new MessageException(cause))
|
|
17
|
+
const reportQueueError_ = reportError((cause) => new MessageException(cause))
|
|
18
18
|
|
|
19
19
|
export const reportQueueError = <E>(cause: Cause<E>, context?: Record<string, unknown> | undefined) =>
|
|
20
|
-
RequestContextContainer.getOption.flatMap(requestContext =>
|
|
20
|
+
RequestContextContainer.getOption.flatMap((requestContext) =>
|
|
21
21
|
reportQueueError_(cause, { requestContext: requestContext.value, ...context })
|
|
22
22
|
)
|
|
23
23
|
|
|
@@ -35,16 +35,17 @@ export function forkDaemonReportQueue<R, E, A>(self: Effect<R, E, A>) {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export const reportFatalQueueError = reportError(
|
|
38
|
-
cause => new FatalQueueException(cause)
|
|
38
|
+
(cause) => new FatalQueueException(cause)
|
|
39
39
|
)
|
|
40
40
|
|
|
41
41
|
export function reportNonInterruptedFailure(context?: Record<string, unknown>) {
|
|
42
42
|
const report = reportNonInterruptedFailureCause(context)
|
|
43
43
|
return <R, E, A>(inp: Effect<R, E, A>): Effect<R, never, Exit<E, A>> =>
|
|
44
|
-
inp
|
|
45
|
-
.
|
|
44
|
+
inp
|
|
45
|
+
.exit
|
|
46
|
+
.flatMap((result) =>
|
|
46
47
|
result.match(
|
|
47
|
-
cause => report(cause).map(() => result),
|
|
48
|
+
(cause) => report(cause).map(() => result),
|
|
48
49
|
() => Effect(result)
|
|
49
50
|
)
|
|
50
51
|
)
|
|
@@ -39,17 +39,18 @@ export function makeMemQueue<
|
|
|
39
39
|
Effect.gen(function*($) {
|
|
40
40
|
const requestContext = yield* $(RequestContextContainer.get)
|
|
41
41
|
return yield* $(
|
|
42
|
-
messages
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
messages
|
|
43
|
+
.forEachEffect((m) =>
|
|
44
|
+
// we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
45
|
+
Effect(
|
|
46
|
+
JSON.stringify(
|
|
47
|
+
encoder({ body: m, meta: requestContext })
|
|
48
|
+
)
|
|
47
49
|
)
|
|
50
|
+
// .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
|
|
51
|
+
.flatMap((_) => q.offer(_))
|
|
52
|
+
.asUnit
|
|
48
53
|
)
|
|
49
|
-
// .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
|
|
50
|
-
.flatMap(_ => q.offer(_))
|
|
51
|
-
.asUnit
|
|
52
|
-
)
|
|
53
54
|
.forkDaemonReportQueue
|
|
54
55
|
)
|
|
55
56
|
}),
|
|
@@ -79,8 +80,9 @@ export function makeMemQueue<
|
|
|
79
80
|
)
|
|
80
81
|
)
|
|
81
82
|
return yield* $(
|
|
82
|
-
qDrain
|
|
83
|
-
.
|
|
83
|
+
qDrain
|
|
84
|
+
.take()
|
|
85
|
+
.flatMap((x) => processMessage(x).uninterruptible.fork.flatMap((_) => _.join))
|
|
84
86
|
// TODO: normally a failed item would be returned to the queue and retried up to X times.
|
|
85
87
|
// .flatMap(_ => _._tag === "Failure" && !isInterrupted ? qDrain.offer(x) : Effect.unit) // TODO: retry count tracking and max retries.
|
|
86
88
|
.apply(silenceAndReportError)
|
|
@@ -50,8 +50,9 @@ export function makeServiceBusQueue<
|
|
|
50
50
|
const handleEvent = yield* $(makeHandleEvent)
|
|
51
51
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
52
|
function processMessage(messageBody: any) {
|
|
53
|
-
return Effect
|
|
54
|
-
.
|
|
53
|
+
return Effect
|
|
54
|
+
.sync(() => JSON.parse(messageBody))
|
|
55
|
+
.flatMap((x) => parseDrain(x))
|
|
55
56
|
.orDie
|
|
56
57
|
.flatMap(({ body, meta }) =>
|
|
57
58
|
Effect
|
|
@@ -78,8 +79,8 @@ export function makeServiceBusQueue<
|
|
|
78
79
|
|
|
79
80
|
return yield* $(
|
|
80
81
|
subscribe({
|
|
81
|
-
processMessage: x => processMessage(x.body).uninterruptible.flatMap(_ => _.done),
|
|
82
|
-
processError: err => Effect(captureException(err.error))
|
|
82
|
+
processMessage: (x) => processMessage(x.body).uninterruptible.flatMap((_) => _.done),
|
|
83
|
+
processError: (err) => Effect(captureException(err.error))
|
|
83
84
|
})
|
|
84
85
|
.provideSomeLayer(receiverLayer)
|
|
85
86
|
)
|
|
@@ -89,17 +90,18 @@ export function makeServiceBusQueue<
|
|
|
89
90
|
Effect.gen(function*($) {
|
|
90
91
|
const requestContext = yield* $(RequestContextContainer.get)
|
|
91
92
|
return yield* $(
|
|
92
|
-
Effect
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
93
|
+
Effect
|
|
94
|
+
.promise(() =>
|
|
95
|
+
s.sendMessages(
|
|
96
|
+
messages.map((x) => ({
|
|
97
|
+
body: JSON.stringify(
|
|
98
|
+
encoder({ body: x, meta: requestContext })
|
|
99
|
+
),
|
|
100
|
+
messageId: x.id, /* correllationid: requestId */
|
|
101
|
+
contentType: "application/json"
|
|
102
|
+
}))
|
|
103
|
+
)
|
|
101
104
|
)
|
|
102
|
-
)
|
|
103
105
|
.forkDaemonReportQueue
|
|
104
106
|
)
|
|
105
107
|
})
|
|
@@ -20,7 +20,7 @@ export interface Repository<
|
|
|
20
20
|
> {
|
|
21
21
|
itemType: ItemType
|
|
22
22
|
find: (id: T["id"]) => Effect<ContextMap | RequestContextContainer, never, Option<T>>
|
|
23
|
-
all: Effect<ContextMap, never,
|
|
23
|
+
all: Effect<ContextMap, never, T[]>
|
|
24
24
|
saveAndPublish: (
|
|
25
25
|
items: Iterable<T>,
|
|
26
26
|
events?: Iterable<Evt>
|
|
@@ -32,8 +32,8 @@ export interface Repository<
|
|
|
32
32
|
setEtag: (id: string, eTag: string | undefined) => void
|
|
33
33
|
) => unknown // TODO
|
|
34
34
|
parse: (a: unknown, env?: ParserEnv | undefined) => T
|
|
35
|
-
all: Effect<ContextMap, never,
|
|
36
|
-
filter: (filter: Filter<PM>, cursor?: { limit?: number; skip?: number }) => Effect<ContextMap, never,
|
|
35
|
+
all: Effect<ContextMap, never, PM[]>
|
|
36
|
+
filter: (filter: Filter<PM>, cursor?: { limit?: number; skip?: number }) => Effect<ContextMap, never, PM[]>
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -61,7 +61,7 @@ export function get<
|
|
|
61
61
|
self: Repository<T, PM, Evt, ItemType>,
|
|
62
62
|
id: T["id"]
|
|
63
63
|
) {
|
|
64
|
-
return self.find(id).flatMap(_ => _.encaseInEffect(() => new NotFoundError(self.itemType, id)))
|
|
64
|
+
return self.find(id).flatMap((_) => _.encaseInEffect(() => new NotFoundError(self.itemType, id)))
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
/**
|
|
@@ -73,7 +73,7 @@ export function filter<
|
|
|
73
73
|
Evt,
|
|
74
74
|
ItemType extends string
|
|
75
75
|
>(self: Repository<T, PM, Evt, ItemType>, filter: Predicate<T>) {
|
|
76
|
-
return self.all.map(_ => _.filter(filter))
|
|
76
|
+
return self.all.map((_) => _.filter(filter))
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
/**
|
|
@@ -85,7 +85,7 @@ export function filterAll<
|
|
|
85
85
|
Evt,
|
|
86
86
|
ItemType extends string,
|
|
87
87
|
S extends T
|
|
88
|
-
>(self: Repository<T, PM, Evt, ItemType>, map: (items:
|
|
88
|
+
>(self: Repository<T, PM, Evt, ItemType>, map: (items: T[]) => S[]) {
|
|
89
89
|
return self.all.map(map)
|
|
90
90
|
}
|
|
91
91
|
|
|
@@ -99,7 +99,7 @@ export function collect<
|
|
|
99
99
|
ItemType extends string,
|
|
100
100
|
S extends T
|
|
101
101
|
>(self: Repository<T, PM, Evt, ItemType>, collect: (item: T) => Option<S>) {
|
|
102
|
-
return self.all.map(_ => _.filterMap(collect))
|
|
102
|
+
return self.all.map((_) => _.filterMap(collect))
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
/**
|
|
@@ -131,9 +131,9 @@ export function projectEffect<
|
|
|
131
131
|
map: Effect<R, E, { filter?: Filter<PM>; collect?: (t: PM) => Option<S>; limit?: number; skip?: number }>
|
|
132
132
|
) {
|
|
133
133
|
// TODO: a projection that gets sent to the db instead.
|
|
134
|
-
return map.flatMap(f =>
|
|
134
|
+
return map.flatMap((f) =>
|
|
135
135
|
(f.filter ? self.utils.filter(f.filter, { limit: f.limit, skip: f.skip }) : self.utils.all)
|
|
136
|
-
.map(_ => f.collect ? _.filterMap(f.collect) : _ as unknown as
|
|
136
|
+
.map((_) => f.collect ? _.filterMap(f.collect) : _ as unknown as S[])
|
|
137
137
|
)
|
|
138
138
|
}
|
|
139
139
|
|
|
@@ -170,16 +170,16 @@ export function queryEffect<
|
|
|
170
170
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
171
171
|
map: Effect<R, E, { filter?: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }>
|
|
172
172
|
) {
|
|
173
|
-
return map.flatMap(f =>
|
|
173
|
+
return map.flatMap((f) =>
|
|
174
174
|
(f.filter ? self.utils.filter(f.filter, { limit: f.limit, skip: f.skip }) : self.utils.all)
|
|
175
|
-
.flatMap(items =>
|
|
176
|
-
Do($ => {
|
|
175
|
+
.flatMap((items) =>
|
|
176
|
+
Do(($) => {
|
|
177
177
|
const { set } = $(ContextMap)
|
|
178
|
-
return items.map(_ => self.utils.mapReverse(_, set))
|
|
178
|
+
return items.map((_) => self.utils.mapReverse(_, set))
|
|
179
179
|
})
|
|
180
180
|
)
|
|
181
|
-
.map(_ => _.map(_ => self.utils.parse(_)))
|
|
182
|
-
.map(_ => f.collect ? _.filterMap(f.collect) : _ as unknown as
|
|
181
|
+
.map((_) => _.map((_) => self.utils.parse(_)))
|
|
182
|
+
.map((_) => f.collect ? _.filterMap(f.collect) : _ as unknown as S[])
|
|
183
183
|
)
|
|
184
184
|
}
|
|
185
185
|
|
|
@@ -199,20 +199,20 @@ export function queryOneEffect<
|
|
|
199
199
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
200
200
|
map: Effect<R, E, { filter?: Filter<PM>; collect?: (t: T) => Option<S> }>
|
|
201
201
|
) {
|
|
202
|
-
return map.flatMap(f =>
|
|
202
|
+
return map.flatMap((f) =>
|
|
203
203
|
(f.filter ? self.utils.filter(f.filter, { limit: 1 }) : self.utils.all)
|
|
204
|
-
.flatMap(items =>
|
|
205
|
-
Do($ => {
|
|
204
|
+
.flatMap((items) =>
|
|
205
|
+
Do(($) => {
|
|
206
206
|
const { set } = $(ContextMap)
|
|
207
|
-
return items.map(_ => self.utils.mapReverse(_, set))
|
|
207
|
+
return items.map((_) => self.utils.mapReverse(_, set))
|
|
208
208
|
})
|
|
209
209
|
)
|
|
210
|
-
.map(_ => _.map(_ => self.utils.parse(_)))
|
|
211
|
-
.flatMap(_ =>
|
|
212
|
-
(f.collect ? _.filterMap(f.collect) : _ as unknown as
|
|
213
|
-
.
|
|
214
|
-
|
|
215
|
-
)
|
|
210
|
+
.map((_) => _.map((_) => self.utils.parse(_)))
|
|
211
|
+
.flatMap((_) =>
|
|
212
|
+
(f.collect ? _.filterMap(f.collect) : _ as unknown as S[])
|
|
213
|
+
.toNonEmpty
|
|
214
|
+
.encaseInEffect(() => new NotFoundError(self.itemType, JSON.stringify(f.filter)))
|
|
215
|
+
.map((_) => _[0])
|
|
216
216
|
)
|
|
217
217
|
)
|
|
218
218
|
}
|
|
@@ -267,10 +267,10 @@ export function queryAndSavePureEffect<
|
|
|
267
267
|
// TODO: think about collectPM, collectE, and collect(Parsed)
|
|
268
268
|
map: Effect<R, E, { filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }>
|
|
269
269
|
) {
|
|
270
|
-
return <R2, A, E2, S2 extends T>(pure: Effect<FixEnv<R2, Evt,
|
|
271
|
-
Debug.untraced(restore =>
|
|
270
|
+
return <R2, A, E2, S2 extends T>(pure: Effect<FixEnv<R2, Evt, S[], S2[]>, E2, A>) =>
|
|
271
|
+
Debug.untraced((restore) =>
|
|
272
272
|
queryEffect(self, map)
|
|
273
|
-
.flatMap(restore(_ => self.saveManyWithPure_(_, pure)))
|
|
273
|
+
.flatMap(restore((_) => self.saveManyWithPure_(_, pure)))
|
|
274
274
|
)
|
|
275
275
|
}
|
|
276
276
|
|
|
@@ -300,7 +300,7 @@ export function saveManyWithPure<
|
|
|
300
300
|
Evt,
|
|
301
301
|
ItemType extends string
|
|
302
302
|
>(self: Repository<T, PM, Evt, ItemType>) {
|
|
303
|
-
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<FixEnv<R, Evt,
|
|
303
|
+
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<FixEnv<R, Evt, S1[], S2[]>, E, A>) =>
|
|
304
304
|
(items: Iterable<S1>) => saveManyWithPure_(self, items, pure)
|
|
305
305
|
}
|
|
306
306
|
|
|
@@ -314,7 +314,7 @@ export function byIdAndSaveWithPure<
|
|
|
314
314
|
ItemType extends string
|
|
315
315
|
>(self: Repository<T, PM, Evt, ItemType>, id: T["id"]) {
|
|
316
316
|
return <R, A, E, S2 extends T>(pure: Effect<FixEnv<R, Evt, T, S2>, E, A>) =>
|
|
317
|
-
get(self, id).flatMap(item => saveWithPure_(self, item, pure))
|
|
317
|
+
get(self, id).flatMap((item) => saveWithPure_(self, item, pure))
|
|
318
318
|
}
|
|
319
319
|
|
|
320
320
|
/**
|
|
@@ -350,11 +350,11 @@ export function saveManyWithPure_<
|
|
|
350
350
|
>(
|
|
351
351
|
self: Repository<T, PM, Evt, ItemType>,
|
|
352
352
|
items: Iterable<S1>,
|
|
353
|
-
pure: Effect<FixEnv<R, Evt,
|
|
353
|
+
pure: Effect<FixEnv<R, Evt, S1[], S2[]>, E, A>
|
|
354
354
|
) {
|
|
355
355
|
return saveAllWithEffectInt(
|
|
356
356
|
self,
|
|
357
|
-
pure.runTerm(items
|
|
357
|
+
pure.runTerm([...items])
|
|
358
358
|
)
|
|
359
359
|
}
|
|
360
360
|
|
|
@@ -379,7 +379,8 @@ export function saveWithPure_<
|
|
|
379
379
|
) {
|
|
380
380
|
return saveAllWithEffectInt(
|
|
381
381
|
self,
|
|
382
|
-
pure
|
|
382
|
+
pure
|
|
383
|
+
.runTerm(item)
|
|
383
384
|
.map(([item, events, a]) => [[item], events, a])
|
|
384
385
|
)
|
|
385
386
|
}
|
|
@@ -397,7 +398,7 @@ export function saveAllWithEffectInt<
|
|
|
397
398
|
self: Repository<T, PM, Evt, ItemType>,
|
|
398
399
|
gen: Effect<R, E, readonly [Iterable<P>, Iterable<Evt>, A]>
|
|
399
400
|
) {
|
|
400
|
-
return Debug.untraced(restore =>
|
|
401
|
+
return Debug.untraced((restore) =>
|
|
401
402
|
gen
|
|
402
403
|
.flatMap(
|
|
403
404
|
([items, events, a]) => restore(() => self.saveAndPublish(items, events))().map(() => a)
|
|
@@ -422,9 +423,9 @@ export function queryAndSavePureEffectBatched<
|
|
|
422
423
|
map: Effect<R, E, { filter: Filter<PM>; collect?: (t: T) => Option<S>; limit?: number; skip?: number }>,
|
|
423
424
|
batchSize = 100
|
|
424
425
|
) {
|
|
425
|
-
return <R2, A, E2, S2 extends T>(pure: Effect<FixEnv<R2, Evt,
|
|
426
|
+
return <R2, A, E2, S2 extends T>(pure: Effect<FixEnv<R2, Evt, S[], S2[]>, E2, A>) =>
|
|
426
427
|
queryEffect(self, map)
|
|
427
|
-
.flatMap(_ => self.saveManyWithPureBatched_(_, pure, batchSize))
|
|
428
|
+
.flatMap((_) => self.saveManyWithPureBatched_(_, pure, batchSize))
|
|
428
429
|
}
|
|
429
430
|
|
|
430
431
|
/**
|
|
@@ -454,7 +455,7 @@ export function saveManyWithPureBatched<
|
|
|
454
455
|
Evt,
|
|
455
456
|
ItemType extends string
|
|
456
457
|
>(self: Repository<T, PM, Evt, ItemType>, batchSize = 100) {
|
|
457
|
-
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<FixEnv<R, Evt,
|
|
458
|
+
return <R, A, E, S1 extends T, S2 extends T>(pure: Effect<FixEnv<R, Evt, S1[], S2[]>, E, A>) =>
|
|
458
459
|
(items: Iterable<S1>) => saveManyWithPureBatched_(self, items, pure, batchSize)
|
|
459
460
|
}
|
|
460
461
|
|
|
@@ -475,14 +476,15 @@ export function saveManyWithPureBatched_<
|
|
|
475
476
|
>(
|
|
476
477
|
self: Repository<T, PM, Evt, ItemType>,
|
|
477
478
|
items: Iterable<S1>,
|
|
478
|
-
pure: Effect<FixEnv<R, Evt,
|
|
479
|
+
pure: Effect<FixEnv<R, Evt, S1[], S2[]>, E, A>,
|
|
479
480
|
batchSize = 100
|
|
480
481
|
) {
|
|
481
|
-
return items
|
|
482
|
-
.
|
|
482
|
+
return items
|
|
483
|
+
.chunk(batchSize)
|
|
484
|
+
.forEachEffect((batch) =>
|
|
483
485
|
saveAllWithEffectInt(
|
|
484
486
|
self,
|
|
485
|
-
pure.runTerm(batch
|
|
487
|
+
pure.runTerm(batch)
|
|
486
488
|
)
|
|
487
489
|
)
|
|
488
490
|
}
|
|
@@ -491,8 +493,8 @@ const anyDSL = makeDSL<any, any, any>()
|
|
|
491
493
|
|
|
492
494
|
export type AllDSL<T, Evt> =
|
|
493
495
|
& (<R, A, E, S1 extends T, S2 extends T>(
|
|
494
|
-
pure: (dsl: PureDSL<
|
|
495
|
-
) => Effect<FixEnv<R, Evt,
|
|
496
|
+
pure: (dsl: PureDSL<S1[], S2[], Evt>) => Effect<R, E, A>
|
|
497
|
+
) => Effect<FixEnv<R, Evt, S1[], S2[]>, E, A>)
|
|
496
498
|
& AllDSLExt<T, Evt>
|
|
497
499
|
|
|
498
500
|
/**
|
|
@@ -500,11 +502,11 @@ export type AllDSL<T, Evt> =
|
|
|
500
502
|
*/
|
|
501
503
|
export interface AllDSLExt<T, Evt> {
|
|
502
504
|
modify: <R, E, A, S1 extends T, S2 extends T>(
|
|
503
|
-
pure: (items:
|
|
504
|
-
) => Effect<FixEnv<R, Evt,
|
|
505
|
+
pure: (items: S1[], dsl: PureDSL<S1[], S2[], Evt>) => Effect<R, E, A>
|
|
506
|
+
) => Effect<FixEnv<R, Evt, S1[], S2[]>, E, A>
|
|
505
507
|
update: <R, E, S1 extends T, S2 extends T>(
|
|
506
|
-
pure: (items:
|
|
507
|
-
) => Effect<FixEnv<R, Evt,
|
|
508
|
+
pure: (items: S1[], log: (...evt: Evt[]) => PureLogT<Evt>) => Effect<R, E, S2[]>
|
|
509
|
+
) => Effect<FixEnv<R, Evt, S1[], S2[]>, E, S2[]>
|
|
508
510
|
}
|
|
509
511
|
|
|
510
512
|
export function makeAllDSL<T, Evt>() {
|
|
@@ -542,9 +544,9 @@ export function updateWithOne<T, Evt, S1 extends T, S2 extends T>(self: OneDSL<T
|
|
|
542
544
|
*/
|
|
543
545
|
export function updateWith<T, Evt, S1 extends T, S2 extends T>(
|
|
544
546
|
self: AllDSL<T, Evt>,
|
|
545
|
-
upd: (item:
|
|
547
|
+
upd: (item: S1[]) => S2[]
|
|
546
548
|
) {
|
|
547
|
-
return self.update((_:
|
|
549
|
+
return self.update((_: S1[]) => Effect(upd(_)))
|
|
548
550
|
}
|
|
549
551
|
|
|
550
552
|
export function makeOneDSL<T, Evt>(): OneDSL<T, Evt> {
|
|
@@ -564,7 +566,7 @@ export function makeDSL<S1, S2, Evt>() {
|
|
|
564
566
|
dsl: PureDSL<S1, S2, Evt>
|
|
565
567
|
) => Effect<R, E, A>
|
|
566
568
|
): Effect<FixEnv<R, Evt, S1, S2>, E, A> {
|
|
567
|
-
return dsl.get.flatMap(items => pure(items, dsl)) as any
|
|
569
|
+
return dsl.get.flatMap((items) => pure(items, dsl)) as any
|
|
568
570
|
}
|
|
569
571
|
|
|
570
572
|
function update<
|
|
@@ -576,7 +578,7 @@ export function makeDSL<S1, S2, Evt>() {
|
|
|
576
578
|
log: (...evt: Evt[]) => PureLogT<Evt>
|
|
577
579
|
) => Effect<R, E, S2>
|
|
578
580
|
): Effect<FixEnv<R, Evt, S1, S2>, E, S2> {
|
|
579
|
-
return dsl.get.flatMap(items => pure(items, dsl.log).tap(dsl.set)) as any
|
|
581
|
+
return dsl.get.flatMap((items) => pure(items, dsl.log).tap(dsl.set)) as any
|
|
580
582
|
}
|
|
581
583
|
|
|
582
584
|
function withDSL<
|
|
@@ -8,7 +8,7 @@ import type {} from "@effect/data/Hash"
|
|
|
8
8
|
import type { Opt } from "@effect-app/core/Option"
|
|
9
9
|
import { makeCodec } from "@effect-app/infra/api/codec"
|
|
10
10
|
import { makeFilters } from "@effect-app/infra/filter"
|
|
11
|
-
import type {
|
|
11
|
+
import type { Schema } from "@effect-app/prelude"
|
|
12
12
|
import { EParserFor } from "@effect-app/prelude/schema"
|
|
13
13
|
import type { InvalidStateError, OptimisticConcurrencyException } from "../errors.js"
|
|
14
14
|
|
|
@@ -22,7 +22,7 @@ export const RepositoryBase = <Service>() => {
|
|
|
22
22
|
abstract class RepositoryBaseC implements Repository<T, PM, Evt, ItemType> {
|
|
23
23
|
itemType: ItemType = itemType
|
|
24
24
|
abstract find: (id: T["id"]) => Effect<ContextMap | RequestContextContainer, never, Opt<T>>
|
|
25
|
-
abstract all: Effect<ContextMap, never,
|
|
25
|
+
abstract all: Effect<ContextMap, never, T[]>
|
|
26
26
|
abstract saveAndPublish: (
|
|
27
27
|
items: Iterable<T>,
|
|
28
28
|
events?: Iterable<Evt>
|
|
@@ -33,8 +33,8 @@ export const RepositoryBase = <Service>() => {
|
|
|
33
33
|
setEtag: (id: string, eTag: string | undefined) => void
|
|
34
34
|
) => unknown // TODO
|
|
35
35
|
parse: (a: unknown, env?: ParserEnv | undefined) => T
|
|
36
|
-
all: Effect<ContextMap, never,
|
|
37
|
-
filter: (filter: Filter<PM>, cursor?: { limit?: number; skip?: number }) => Effect<ContextMap, never,
|
|
36
|
+
all: Effect<ContextMap, never, PM[]>
|
|
37
|
+
filter: (filter: Filter<PM>, cursor?: { limit?: number; skip?: number }) => Effect<ContextMap, never, PM[]>
|
|
38
38
|
}
|
|
39
39
|
abstract remove: (item: T) => Effect<ContextMap, never, void>
|
|
40
40
|
static where = makeWhere<PM>()
|
|
@@ -94,24 +94,25 @@ export function makeRepo<
|
|
|
94
94
|
partitionValue?: (a: PM) => string
|
|
95
95
|
}
|
|
96
96
|
) {
|
|
97
|
-
return Do($ => {
|
|
97
|
+
return Do(($) => {
|
|
98
98
|
const store = $(mkStore(makeInitial, config))
|
|
99
99
|
|
|
100
|
-
const allE = store.all.flatMap(items =>
|
|
101
|
-
Do($ => {
|
|
100
|
+
const allE = store.all.flatMap((items) =>
|
|
101
|
+
Do(($) => {
|
|
102
102
|
const { set } = $(ContextMap)
|
|
103
|
-
return items.map(_ => mapReverse(_, set))
|
|
103
|
+
return items.map((_) => mapReverse(_, set))
|
|
104
104
|
})
|
|
105
105
|
)
|
|
106
106
|
|
|
107
|
-
const all = allE.flatMap(_ => _.forEachEffect(EParserFor(schema).condemnDie))
|
|
107
|
+
const all = allE.flatMap((_) => _.forEachEffect(EParserFor(schema).condemnDie))
|
|
108
108
|
|
|
109
109
|
function findE(id: T["id"]) {
|
|
110
|
-
return store
|
|
111
|
-
.
|
|
112
|
-
|
|
110
|
+
return store
|
|
111
|
+
.find(id)
|
|
112
|
+
.flatMap((items) =>
|
|
113
|
+
Do(($) => {
|
|
113
114
|
const { set } = $(ContextMap)
|
|
114
|
-
return items.map(_ => mapReverse(_, set))
|
|
115
|
+
return items.map((_) => mapReverse(_, set))
|
|
115
116
|
})
|
|
116
117
|
)
|
|
117
118
|
}
|
|
@@ -122,12 +123,12 @@ export function makeRepo<
|
|
|
122
123
|
|
|
123
124
|
const saveAllE = (a: Iterable<E>) =>
|
|
124
125
|
Effect(a.toNonEmptyArray)
|
|
125
|
-
.flatMapOpt(a =>
|
|
126
|
-
Do($ => {
|
|
126
|
+
.flatMapOpt((a) =>
|
|
127
|
+
Do(($) => {
|
|
127
128
|
const { get, set } = $(ContextMap)
|
|
128
|
-
const items = a.mapNonEmpty(_ => mapToPersistenceModel(_, get))
|
|
129
|
+
const items = a.mapNonEmpty((_) => mapToPersistenceModel(_, get))
|
|
129
130
|
const ret = $(store.batchSet(items))
|
|
130
|
-
ret.forEach(_ => set(_.id, _._etag))
|
|
131
|
+
ret.forEach((_) => set(_.id, _._etag))
|
|
131
132
|
})
|
|
132
133
|
)
|
|
133
134
|
|
|
@@ -141,7 +142,7 @@ export function makeRepo<
|
|
|
141
142
|
|
|
142
143
|
const encode = Encoder.for(schema)
|
|
143
144
|
function remove(item: T) {
|
|
144
|
-
return Do($ => {
|
|
145
|
+
return Do(($) => {
|
|
145
146
|
const { get, set } = $(ContextMap)
|
|
146
147
|
const e = encode(item)
|
|
147
148
|
$(store.remove(mapToPersistenceModel(e, get)))
|
|
@@ -156,9 +157,10 @@ export function makeRepo<
|
|
|
156
157
|
utils: {
|
|
157
158
|
mapReverse,
|
|
158
159
|
parse: Parser.for(schema).unsafe,
|
|
159
|
-
filter: store
|
|
160
|
-
.
|
|
161
|
-
|
|
160
|
+
filter: store
|
|
161
|
+
.filter
|
|
162
|
+
.flow((_) => _.tap((items) => ContextMap.map(({ set }) => items.forEach((_) => set(_.id, _._etag))))),
|
|
163
|
+
all: store.all.tap((items) => ContextMap.map(({ set }) => items.forEach((_) => set(_.id, _._etag))))
|
|
162
164
|
},
|
|
163
165
|
itemType: name,
|
|
164
166
|
find,
|
|
@@ -189,7 +191,7 @@ export function removeById<
|
|
|
189
191
|
self: Repository<T, PM, Evt, ItemType>,
|
|
190
192
|
id: T["id"]
|
|
191
193
|
) {
|
|
192
|
-
return self.get(id).flatMap(_ => self.remove(_))
|
|
194
|
+
return self.get(id).flatMap((_) => self.remove(_))
|
|
193
195
|
}
|
|
194
196
|
|
|
195
197
|
export function makeWhere<PM extends { id: string; _etag: string | undefined }>() {
|
|
@@ -206,7 +208,7 @@ export function makeWhere<PM extends { id: string; _etag: string | undefined }>(
|
|
|
206
208
|
) => Where | readonly [Where, ...Where[]],
|
|
207
209
|
mode?: "or" | "and"
|
|
208
210
|
) {
|
|
209
|
-
return makeFilter_(f => {
|
|
211
|
+
return makeFilter_((f) => {
|
|
210
212
|
const m = makeWhere ? makeWhere(f) : []
|
|
211
213
|
return ({
|
|
212
214
|
mode,
|
|
@@ -241,7 +243,7 @@ export function makeStore<
|
|
|
241
243
|
const [_dec, encode] = makeCodec(schema)
|
|
242
244
|
function encodeToPM() {
|
|
243
245
|
const getEtag = () => undefined
|
|
244
|
-
return flow(encode, v => mapToPersistenceModel(v, getEtag))
|
|
246
|
+
return flow(encode, (v) => mapToPersistenceModel(v, getEtag))
|
|
245
247
|
}
|
|
246
248
|
|
|
247
249
|
function mapToPersistenceModel(
|
|
@@ -257,7 +259,7 @@ export function makeStore<
|
|
|
257
259
|
partitionValue?: (a: PM) => string
|
|
258
260
|
}
|
|
259
261
|
) {
|
|
260
|
-
return Do($ => {
|
|
262
|
+
return Do(($) => {
|
|
261
263
|
const { make } = $(StoreMaker)
|
|
262
264
|
|
|
263
265
|
const store = $(
|
|
@@ -265,11 +267,12 @@ export function makeStore<
|
|
|
265
267
|
pluralize(name),
|
|
266
268
|
makeInitial
|
|
267
269
|
? makeInitial
|
|
268
|
-
.map(_ => _.map(encodeToPM()))
|
|
270
|
+
.map((_) => _.map(encodeToPM()))
|
|
269
271
|
: undefined,
|
|
270
272
|
{
|
|
271
273
|
...config,
|
|
272
|
-
partitionValue: config?.partitionValue
|
|
274
|
+
partitionValue: config?.partitionValue
|
|
275
|
+
?? ((_) => "primary") /*(isIntegrationEvent(r) ? r.companyId : r.id*/
|
|
273
276
|
}
|
|
274
277
|
)
|
|
275
278
|
)
|
|
@@ -352,7 +355,9 @@ export const RepositoryDefaultImpl = <Service>() => {
|
|
|
352
355
|
partitionValue?: (a: PM) => string
|
|
353
356
|
}
|
|
354
357
|
) {
|
|
355
|
-
return this.make(publishEvents, makeInitial, config).map(impl => new this(impl) as any as Service).toLayer(
|
|
358
|
+
return this.make(publishEvents, makeInitial, config).map((impl) => new this(impl) as any as Service).toLayer(
|
|
359
|
+
this
|
|
360
|
+
)
|
|
356
361
|
}
|
|
357
362
|
static repo: any
|
|
358
363
|
constructor(
|
|
@@ -7,11 +7,12 @@ export abstract class RequestContextContainer extends TagClass<RequestContextCon
|
|
|
7
7
|
abstract readonly requestContext: Effect<never, never, RequestContext>
|
|
8
8
|
abstract readonly update: (f: (rc: RequestContext) => RequestContext) => Effect<never, never, void>
|
|
9
9
|
static get get(): Effect<RequestContextContainer, never, RequestContext> {
|
|
10
|
-
return RequestContextContainer.flatMap(_ => _.requestContext)
|
|
10
|
+
return RequestContextContainer.flatMap((_) => _.requestContext)
|
|
11
11
|
}
|
|
12
12
|
static get getOption() {
|
|
13
|
-
return Effect
|
|
14
|
-
.
|
|
13
|
+
return Effect
|
|
14
|
+
.contextWith((_: Context<never>) => Context.getOption(_, RequestContextContainer))
|
|
15
|
+
.flatMap((requestContext) =>
|
|
15
16
|
requestContext.isSome()
|
|
16
17
|
? requestContext.value.requestContext.map(Option.some)
|
|
17
18
|
: Effect(Option.none)
|