@effect-app/infra 0.207.0 → 0.208.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 +13 -0
- package/_cjs/services/QueueMaker/memQueue.cjs +4 -2
- package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/sbqueue.cjs +2 -2
- package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/service.cjs.map +1 -1
- package/_cjs/services/RepositoryBase.cjs +2 -2
- package/_cjs/services/RepositoryBase.cjs.map +1 -1
- package/_cjs/services/query/dsl.cjs +3 -4
- package/_cjs/services/query/dsl.cjs.map +1 -1
- package/_cjs/services/query/new-kid-interpreter.cjs +1 -5
- package/_cjs/services/query/new-kid-interpreter.cjs.map +1 -1
- package/dist/services/QueueMaker/memQueue.d.ts +3 -3
- package/dist/services/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/memQueue.js +6 -7
- package/dist/services/QueueMaker/sbqueue.d.ts +2 -2
- package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/sbqueue.js +9 -7
- package/dist/services/QueueMaker/service.d.ts +3 -2
- package/dist/services/QueueMaker/service.d.ts.map +1 -1
- package/dist/services/QueueMaker/service.js +1 -1
- package/dist/services/RepositoryBase.d.ts +2 -2
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +8 -4
- package/dist/services/query/dsl.d.ts +1 -2
- package/dist/services/query/dsl.d.ts.map +1 -1
- package/dist/services/query/dsl.js +2 -7
- package/dist/services/query/new-kid-interpreter.d.ts +0 -1
- package/dist/services/query/new-kid-interpreter.d.ts.map +1 -1
- package/dist/services/query/new-kid-interpreter.js +2 -7
- package/package.json +3 -3
- package/src/services/QueueMaker/memQueue.ts +20 -23
- package/src/services/QueueMaker/sbqueue.ts +77 -75
- package/src/services/QueueMaker/service.ts +3 -2
- package/src/services/RepositoryBase.ts +18 -5
- package/src/services/query/dsl.ts +2 -12
- package/src/services/query/new-kid-interpreter.ts +1 -6
|
@@ -17,7 +17,7 @@ import { NonEmptyString255, struct } from "effect-app/schema"
|
|
|
17
17
|
import { pretty } from "effect-app/utils"
|
|
18
18
|
import { setupRequestContext } from "../../api/setupRequest.js"
|
|
19
19
|
import { RequestContextContainer } from "../RequestContextContainer.js"
|
|
20
|
-
import {
|
|
20
|
+
import { reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
|
|
21
21
|
import { type QueueBase, QueueMeta } from "./service.js"
|
|
22
22
|
|
|
23
23
|
/**
|
|
@@ -53,85 +53,87 @@ export function makeServiceBusQueue<
|
|
|
53
53
|
makeDrain: <DrainE, DrainR>(
|
|
54
54
|
handleEvent: (ks: DrainEvt) => Effect<void, DrainE, DrainR>
|
|
55
55
|
) =>
|
|
56
|
-
Effect
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
56
|
+
Effect
|
|
57
|
+
.gen(function*($) {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
+
function processMessage(messageBody: any) {
|
|
60
|
+
return Effect
|
|
61
|
+
.sync(() => JSON.parse(messageBody))
|
|
62
|
+
.pipe(
|
|
63
|
+
Effect.flatMap((x) => parseDrain(x)),
|
|
64
|
+
Effect.orDie,
|
|
65
|
+
Effect
|
|
66
|
+
.flatMap(({ body, meta }) =>
|
|
67
|
+
Effect
|
|
68
|
+
.logDebug(`$$ [${queueDrainName}] Processing incoming message`)
|
|
69
|
+
.pipe(
|
|
70
|
+
Effect.annotateLogs({
|
|
71
|
+
body: pretty(body),
|
|
72
|
+
meta: pretty(meta)
|
|
73
|
+
}),
|
|
74
|
+
Effect
|
|
75
|
+
.zipRight(handleEvent(body)),
|
|
76
|
+
Effect
|
|
77
|
+
.orDie
|
|
78
|
+
)
|
|
79
|
+
// we silenceAndReportError here, so that the error is reported, and moves into the Exit.
|
|
80
|
+
.pipe(
|
|
81
|
+
silenceAndReportError,
|
|
82
|
+
(_) =>
|
|
83
|
+
setupRequestContext(
|
|
84
|
+
_,
|
|
85
|
+
RequestContext.inherit(meta.requestContext, {
|
|
86
|
+
id: RequestId(body.id),
|
|
87
|
+
locale: "en" as const,
|
|
88
|
+
name: NonEmptyString255(body._tag)
|
|
89
|
+
})
|
|
90
|
+
),
|
|
91
|
+
Effect
|
|
92
|
+
.withSpan("queue.drain", {
|
|
93
|
+
attributes: { "queue.name": queueDrainName },
|
|
94
|
+
parent: meta.span
|
|
95
|
+
? Tracer.externalSpan(meta.span)
|
|
96
|
+
: undefined
|
|
88
97
|
})
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
})
|
|
97
|
-
)
|
|
98
|
-
),
|
|
99
|
-
Effect
|
|
100
|
-
// we reportError here, so that we report the error only, and keep flowing
|
|
101
|
-
.tapErrorCause(reportError)
|
|
102
|
-
)
|
|
103
|
-
}
|
|
98
|
+
)
|
|
99
|
+
),
|
|
100
|
+
Effect
|
|
101
|
+
// we reportError here, so that we report the error only, and keep flowing
|
|
102
|
+
.tapErrorCause(reportError)
|
|
103
|
+
)
|
|
104
|
+
}
|
|
104
105
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
106
|
+
return yield* $(
|
|
107
|
+
subscribe({
|
|
108
|
+
processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
|
|
109
|
+
processError: (err) => Effect.sync(() => captureException(err.error))
|
|
110
|
+
})
|
|
111
|
+
.pipe(Effect.provide(receiverLayer))
|
|
112
|
+
)
|
|
113
|
+
})
|
|
114
|
+
.pipe(Effect.andThen(Effect.never)),
|
|
113
115
|
|
|
114
116
|
publish: (...messages) =>
|
|
115
|
-
Effect
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
117
|
+
Effect
|
|
118
|
+
.gen(function*($) {
|
|
119
|
+
const requestContext = yield* $(rcc.requestContext)
|
|
120
|
+
const currentSpan = yield* $(Effect.currentSpan.pipe(Effect.orDie))
|
|
121
|
+
const span = Tracer.externalSpan(currentSpan)
|
|
122
|
+
return yield* $(
|
|
123
|
+
Effect
|
|
124
|
+
.promise(() =>
|
|
125
|
+
s.sendMessages(
|
|
126
|
+
messages.map((m) => ({
|
|
127
|
+
body: JSON.stringify(
|
|
128
|
+
S.encodeSync(wireSchema)({ body: m, meta: { requestContext, span } })
|
|
129
|
+
),
|
|
130
|
+
messageId: m.id, /* correllationid: requestId */
|
|
131
|
+
contentType: "application/json"
|
|
132
|
+
}))
|
|
133
|
+
)
|
|
130
134
|
)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
)
|
|
134
|
-
})
|
|
135
|
+
)
|
|
136
|
+
})
|
|
135
137
|
} satisfies QueueBase<Evt, DrainEvt>
|
|
136
138
|
})
|
|
137
139
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { struct } from "@effect-app/schema"
|
|
2
|
-
import {
|
|
2
|
+
import { S } from "effect-app"
|
|
3
|
+
import type { Effect, NonEmptyReadonlyArray, Scope } from "effect-app"
|
|
3
4
|
import { RequestContext } from "../../RequestContext.js"
|
|
4
5
|
import type { RequestContextContainer } from "../RequestContextContainer.js"
|
|
5
6
|
import type { ContextMapContainer } from "../Store/ContextMapContainer.js"
|
|
@@ -7,7 +8,7 @@ import type { ContextMapContainer } from "../Store/ContextMapContainer.js"
|
|
|
7
8
|
export interface QueueBase<Evt, DrainEvt> {
|
|
8
9
|
makeDrain: <DrainE, DrainR>(
|
|
9
10
|
makeHandleEvent: (ks: DrainEvt) => Effect<void, DrainE, DrainR>
|
|
10
|
-
) => Effect<
|
|
11
|
+
) => Effect<never, never, Scope | RequestContextContainer | ContextMapContainer | DrainR>
|
|
11
12
|
publish: (
|
|
12
13
|
...messages: NonEmptyReadonlyArray<Evt>
|
|
13
14
|
) => Effect<void>
|
|
@@ -87,8 +87,7 @@ export abstract class RepositoryBaseC<
|
|
|
87
87
|
parseMany: (a: readonly PM[]) => Effect<readonly T[]>
|
|
88
88
|
parseMany2: <A, R>(
|
|
89
89
|
a: readonly PM[],
|
|
90
|
-
schema: S.Schema<A, Omit<PM, "_etag">, R
|
|
91
|
-
batch?: boolean | "inherit" | undefined
|
|
90
|
+
schema: S.Schema<A, Omit<PM, "_etag">, R>
|
|
92
91
|
) => Effect<readonly A[], S.ParseResult.ParseError, R>
|
|
93
92
|
all: Effect<PM[]>
|
|
94
93
|
filter: FilterFunc<PM>
|
|
@@ -566,7 +565,10 @@ export function makeRepo<
|
|
|
566
565
|
Unify
|
|
567
566
|
.unify(
|
|
568
567
|
a.schema
|
|
569
|
-
? r.utils.parseMany2(
|
|
568
|
+
? r.utils.parseMany2(
|
|
569
|
+
_,
|
|
570
|
+
a.schema as any
|
|
571
|
+
)
|
|
570
572
|
: r.utils.parseMany(_)
|
|
571
573
|
)
|
|
572
574
|
)
|
|
@@ -604,11 +606,22 @@ export function makeRepo<
|
|
|
604
606
|
.flatMap(cms, (cm) =>
|
|
605
607
|
decodeMany(items.map((_) => mapReverse(_, cm.set)))
|
|
606
608
|
.pipe(Effect.orDie, Effect.withSpan("parseMany"))),
|
|
607
|
-
parseMany2: (items, schema
|
|
609
|
+
parseMany2: (items, schema) =>
|
|
608
610
|
Effect
|
|
609
611
|
.flatMap(cms, (cm) =>
|
|
610
612
|
S
|
|
611
|
-
.decode(
|
|
613
|
+
.decode(
|
|
614
|
+
S.array(schema).pipe(S.batching(
|
|
615
|
+
S
|
|
616
|
+
.AST
|
|
617
|
+
.getBatchingAnnotation(schema.ast)
|
|
618
|
+
.pipe(Option.getOrUndefined)
|
|
619
|
+
?.valueOf() as
|
|
620
|
+
| boolean
|
|
621
|
+
| "inherit" // somehow otherwise inefers as string ?
|
|
622
|
+
| undefined
|
|
623
|
+
))
|
|
624
|
+
)(
|
|
612
625
|
items.map((_) => mapReverse(_, cm.set) as unknown as Omit<PM, "_etag">)
|
|
613
626
|
)
|
|
614
627
|
.pipe(Effect.orDie, Effect.withSpan("parseMany2"))),
|
|
@@ -134,7 +134,6 @@ export class Project<A, TFieldValues extends FieldValues, R, TType extends "one"
|
|
|
134
134
|
current: Query<TFieldValues> | QueryWhere<TFieldValues> | QueryEnd<TFieldValues, TType>
|
|
135
135
|
schema: S.Schema<A, TFieldValues, R>
|
|
136
136
|
mode: "raw" | "transform"
|
|
137
|
-
batch?: boolean | "inherit" | undefined
|
|
138
137
|
}>
|
|
139
138
|
implements QueryProjection<TFieldValues, A, R>
|
|
140
139
|
{
|
|
@@ -210,20 +209,11 @@ export const project: {
|
|
|
210
209
|
R = never,
|
|
211
210
|
TType extends "one" | "many" = "many"
|
|
212
211
|
>(
|
|
213
|
-
schema: S.Schema<A, TFieldValues, R
|
|
214
|
-
batch?: boolean | "inherit" | undefined
|
|
212
|
+
schema: S.Schema<A, TFieldValues, R>
|
|
215
213
|
): (
|
|
216
214
|
current: Query<TFieldValues> | QueryWhere<TFieldValues> | QueryEnd<TFieldValues, TType>
|
|
217
215
|
) => QueryProjection<TFieldValues, A, R, TType>
|
|
218
|
-
} = (schema: any,
|
|
219
|
-
new Project(
|
|
220
|
-
{
|
|
221
|
-
current,
|
|
222
|
-
schema,
|
|
223
|
-
mode: batchOrMode === "raw" ? batchOrMode : "transform",
|
|
224
|
-
batch: batchOrMode !== "raw" ? batchOrMode : undefined
|
|
225
|
-
} as any
|
|
226
|
-
)
|
|
216
|
+
} = (schema: any, mode = "transform") => (current: any) => new Project({ current, /* TODO: why */ schema, mode } as any)
|
|
227
217
|
|
|
228
218
|
export type FilterWheres = {
|
|
229
219
|
<
|
|
@@ -16,7 +16,6 @@ type Result<TFieldValues extends FieldValues, A = TFieldValues, R = never> = {
|
|
|
16
16
|
order: { key: FieldPath<TFieldValues>; direction: "ASC" | "DESC" }[]
|
|
17
17
|
ttype: "one" | "many" | "count" | undefined
|
|
18
18
|
mode: "raw" | "transform" | undefined
|
|
19
|
-
batch: boolean | "inherit" | undefined
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
const interpret = <TFieldValues extends FieldValues, A = TFieldValues, R = never>(_: QAll<TFieldValues, A, R>) => {
|
|
@@ -29,8 +28,7 @@ const interpret = <TFieldValues extends FieldValues, A = TFieldValues, R = never
|
|
|
29
28
|
skip: undefined,
|
|
30
29
|
order: [],
|
|
31
30
|
ttype: undefined,
|
|
32
|
-
mode: undefined
|
|
33
|
-
batch: undefined
|
|
31
|
+
mode: undefined
|
|
34
32
|
}
|
|
35
33
|
|
|
36
34
|
const upd = (
|
|
@@ -43,7 +41,6 @@ const interpret = <TFieldValues extends FieldValues, A = TFieldValues, R = never
|
|
|
43
41
|
if (v.ttype !== undefined) data.ttype = v.ttype
|
|
44
42
|
if (v.schema !== undefined) data.schema = v.schema
|
|
45
43
|
if (v.mode !== undefined) data.mode = v.mode
|
|
46
|
-
if (v.batch !== undefined) data.batch = v.batch
|
|
47
44
|
}
|
|
48
45
|
|
|
49
46
|
pipe(
|
|
@@ -120,7 +117,6 @@ const interpret = <TFieldValues extends FieldValues, A = TFieldValues, R = never
|
|
|
120
117
|
upd(interpret(v.current))
|
|
121
118
|
data.schema = v.schema
|
|
122
119
|
data.mode = v.mode
|
|
123
|
-
data.batch = v.batch
|
|
124
120
|
}
|
|
125
121
|
})
|
|
126
122
|
)
|
|
@@ -155,7 +151,6 @@ export const toFilter = <
|
|
|
155
151
|
schema,
|
|
156
152
|
order: Option.getOrUndefined(toNonEmptyArray(a.order)),
|
|
157
153
|
ttype: a.ttype,
|
|
158
|
-
batch: a.batch,
|
|
159
154
|
mode: a.mode ?? "transform",
|
|
160
155
|
filter: a.filter.length
|
|
161
156
|
? {
|