@effect-app/infra 4.0.0-beta.15 → 4.0.0-beta.151
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 +992 -0
- package/dist/CUPS.d.ts +15 -7
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +10 -12
- package/dist/Emailer/Sendgrid.d.ts +14 -14
- package/dist/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/Emailer/Sendgrid.js +16 -15
- package/dist/Emailer/fake.d.ts +1 -1
- package/dist/Emailer/service.d.ts +9 -3
- package/dist/Emailer/service.d.ts.map +1 -1
- package/dist/Emailer/service.js +3 -3
- package/dist/Emailer.d.ts +1 -1
- package/dist/MainFiberSet.d.ts +5 -5
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +3 -3
- package/dist/Model/Repository/Registry.d.ts +20 -0
- package/dist/Model/Repository/Registry.d.ts.map +1 -0
- package/dist/Model/Repository/Registry.js +17 -0
- package/dist/Model/Repository/ext.d.ts +33 -15
- package/dist/Model/Repository/ext.d.ts.map +1 -1
- package/dist/Model/Repository/ext.js +54 -2
- package/dist/Model/Repository/internal/internal.d.ts +6 -6
- package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
- package/dist/Model/Repository/internal/internal.js +35 -24
- package/dist/Model/Repository/legacy.d.ts +1 -1
- package/dist/Model/Repository/makeRepo.d.ts +7 -6
- package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
- package/dist/Model/Repository/makeRepo.js +5 -1
- package/dist/Model/Repository/service.d.ts +28 -23
- package/dist/Model/Repository/service.d.ts.map +1 -1
- package/dist/Model/Repository/validation.d.ts +142 -17
- package/dist/Model/Repository/validation.d.ts.map +1 -1
- package/dist/Model/Repository/validation.js +5 -5
- package/dist/Model/Repository.d.ts +2 -1
- package/dist/Model/Repository.d.ts.map +1 -1
- package/dist/Model/Repository.js +2 -1
- package/dist/Model/dsl.d.ts +4 -4
- package/dist/Model/dsl.d.ts.map +1 -1
- package/dist/Model/filter/filterApi.d.ts +5 -5
- package/dist/Model/filter/filterApi.d.ts.map +1 -1
- package/dist/Model/filter/types/errors.d.ts +1 -1
- package/dist/Model/filter/types/fields.d.ts +1 -1
- package/dist/Model/filter/types/path/common.d.ts +1 -1
- package/dist/Model/filter/types/path/eager.d.ts +1 -1
- package/dist/Model/filter/types/path/eager.d.ts.map +1 -1
- package/dist/Model/filter/types/path/index.d.ts +1 -1
- package/dist/Model/filter/types/utils.d.ts +1 -1
- package/dist/Model/filter/types/validator.d.ts +1 -1
- package/dist/Model/filter/types.d.ts +1 -1
- package/dist/Model/query/dsl.d.ts +1 -1
- package/dist/Model/query/dsl.d.ts.map +1 -1
- package/dist/Model/query/new-kid-interpreter.d.ts +6 -6
- package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
- package/dist/Model/query/new-kid-interpreter.js +3 -3
- package/dist/Model/query.d.ts +1 -1
- package/dist/Model.d.ts +2 -1
- package/dist/Model.d.ts.map +1 -1
- package/dist/Model.js +2 -1
- package/dist/Operations.d.ts +6 -6
- package/dist/Operations.d.ts.map +1 -1
- package/dist/Operations.js +56 -59
- package/dist/OperationsRepo.d.ts +11 -29
- package/dist/OperationsRepo.d.ts.map +1 -1
- package/dist/OperationsRepo.js +3 -3
- package/dist/QueueMaker/SQLQueue.d.ts +5 -7
- package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
- package/dist/QueueMaker/SQLQueue.js +105 -114
- package/dist/QueueMaker/errors.d.ts +2 -2
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/QueueMaker/memQueue.d.ts +7 -4
- package/dist/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/QueueMaker/memQueue.js +51 -62
- package/dist/QueueMaker/sbqueue.d.ts +6 -3
- package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/QueueMaker/sbqueue.js +36 -52
- package/dist/QueueMaker/service.d.ts +1 -1
- package/dist/RequestContext.d.ts +114 -26
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +7 -7
- package/dist/RequestFiberSet.d.ts +7 -7
- package/dist/RequestFiberSet.d.ts.map +1 -1
- package/dist/RequestFiberSet.js +5 -5
- package/dist/Store/ContextMapContainer.d.ts +19 -3
- package/dist/Store/ContextMapContainer.d.ts.map +1 -1
- package/dist/Store/ContextMapContainer.js +13 -3
- package/dist/Store/Cosmos/query.d.ts +1 -1
- package/dist/Store/Cosmos/query.d.ts.map +1 -1
- package/dist/Store/Cosmos/query.js +8 -10
- package/dist/Store/Cosmos.d.ts +1 -1
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +308 -242
- package/dist/Store/Disk.d.ts +2 -2
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +25 -22
- package/dist/Store/Memory.d.ts +4 -4
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +27 -22
- package/dist/Store/SQL/Pg.d.ts +4 -0
- package/dist/Store/SQL/Pg.d.ts.map +1 -0
- package/dist/Store/SQL/Pg.js +189 -0
- package/dist/Store/SQL/query.d.ts +38 -0
- package/dist/Store/SQL/query.d.ts.map +1 -0
- package/dist/Store/SQL/query.js +367 -0
- package/dist/Store/SQL.d.ts +20 -0
- package/dist/Store/SQL.d.ts.map +1 -0
- package/dist/Store/SQL.js +381 -0
- package/dist/Store/codeFilter.d.ts +1 -1
- package/dist/Store/codeFilter.d.ts.map +1 -1
- package/dist/Store/codeFilter.js +2 -1
- package/dist/Store/index.d.ts +5 -2
- package/dist/Store/index.d.ts.map +1 -1
- package/dist/Store/index.js +15 -3
- package/dist/Store/service.d.ts +17 -6
- package/dist/Store/service.d.ts.map +1 -1
- package/dist/Store/service.js +24 -6
- package/dist/Store/utils.d.ts +1 -1
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +3 -4
- package/dist/Store.d.ts +1 -1
- package/dist/adapters/SQL/Model.d.ts +28 -42
- package/dist/adapters/SQL/Model.d.ts.map +1 -1
- package/dist/adapters/SQL/Model.js +2 -2
- package/dist/adapters/SQL.d.ts +1 -1
- package/dist/adapters/ServiceBus.d.ts +9 -9
- package/dist/adapters/ServiceBus.d.ts.map +1 -1
- package/dist/adapters/ServiceBus.js +13 -15
- package/dist/adapters/cosmos-client.d.ts +3 -3
- package/dist/adapters/cosmos-client.d.ts.map +1 -1
- package/dist/adapters/cosmos-client.js +3 -3
- package/dist/adapters/index.d.ts +8 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +8 -2
- package/dist/adapters/logger.d.ts +1 -1
- package/dist/adapters/logger.d.ts.map +1 -1
- package/dist/adapters/memQueue.d.ts +3 -3
- package/dist/adapters/memQueue.d.ts.map +1 -1
- package/dist/adapters/memQueue.js +3 -3
- package/dist/adapters/mongo-client.d.ts +3 -3
- package/dist/adapters/mongo-client.d.ts.map +1 -1
- package/dist/adapters/mongo-client.js +3 -3
- package/dist/adapters/redis-client.d.ts +3 -3
- package/dist/adapters/redis-client.d.ts.map +1 -1
- package/dist/adapters/redis-client.js +3 -3
- package/dist/api/ContextProvider.d.ts +7 -7
- package/dist/api/ContextProvider.d.ts.map +1 -1
- package/dist/api/ContextProvider.js +6 -6
- package/dist/api/codec.d.ts +1 -1
- package/dist/api/internal/RequestContextMiddleware.d.ts +2 -2
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
- package/dist/api/internal/RequestContextMiddleware.js +2 -2
- package/dist/api/internal/auth.d.ts +44 -6
- package/dist/api/internal/auth.d.ts.map +1 -1
- package/dist/api/internal/auth.js +160 -29
- package/dist/api/internal/events.d.ts +3 -3
- package/dist/api/internal/events.d.ts.map +1 -1
- package/dist/api/internal/events.js +9 -7
- package/dist/api/internal/health.d.ts +1 -1
- package/dist/api/layerUtils.d.ts +6 -6
- package/dist/api/layerUtils.d.ts.map +1 -1
- package/dist/api/layerUtils.js +5 -5
- package/dist/api/middlewares.d.ts +1 -1
- package/dist/api/reportError.d.ts +1 -1
- 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 +39 -3
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +45 -14
- package/dist/api/routing/middleware.d.ts +1 -2
- package/dist/api/routing/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware.js +1 -2
- 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/tsort.d.ts +1 -1
- package/dist/api/routing/tsort.d.ts.map +1 -1
- package/dist/api/routing/utils.d.ts +3 -3
- package/dist/api/routing/utils.d.ts.map +1 -1
- package/dist/api/routing.d.ts +12 -14
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +17 -6
- package/dist/api/setupRequest.d.ts +8 -5
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +12 -7
- package/dist/api/util.d.ts +1 -1
- package/dist/arbs.d.ts +1 -1
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +5 -3
- package/dist/errorReporter.d.ts +4 -4
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +16 -23
- package/dist/errors.d.ts +1 -1
- package/dist/fileUtil.d.ts +1 -1
- package/dist/fileUtil.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/logger/jsonLogger.d.ts +1 -1
- package/dist/logger/logFmtLogger.d.ts +1 -1
- package/dist/logger/shared.d.ts +1 -1
- package/dist/logger/shared.js +2 -2
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/rateLimit.d.ts +9 -3
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +5 -11
- package/dist/test.d.ts +1 -1
- package/dist/test.d.ts.map +1 -1
- package/dist/vitest.d.ts +1 -1
- package/eslint.config.mjs +1 -1
- package/examples/query.ts +39 -35
- package/package.json +42 -28
- package/src/CUPS.ts +9 -11
- package/src/Emailer/Sendgrid.ts +17 -14
- package/src/Emailer/service.ts +8 -2
- package/src/MainFiberSet.ts +3 -3
- package/src/Model/Repository/Registry.ts +33 -0
- package/src/Model/Repository/ext.ts +93 -6
- package/src/Model/Repository/internal/internal.ts +87 -80
- package/src/Model/Repository/makeRepo.ts +12 -10
- package/src/Model/Repository/service.ts +31 -22
- package/src/Model/Repository/validation.ts +4 -4
- package/src/Model/Repository.ts +1 -0
- package/src/Model/dsl.ts +3 -3
- package/src/Model/query/new-kid-interpreter.ts +2 -2
- package/src/Model.ts +1 -0
- package/src/Operations.ts +78 -113
- package/src/OperationsRepo.ts +2 -2
- package/src/QueueMaker/SQLQueue.ts +121 -151
- package/src/QueueMaker/memQueue.ts +82 -103
- package/src/QueueMaker/sbqueue.ts +55 -85
- package/src/RequestContext.ts +7 -7
- package/src/RequestFiberSet.ts +4 -4
- package/src/Store/ContextMapContainer.ts +41 -2
- package/src/Store/Cosmos/query.ts +9 -11
- package/src/Store/Cosmos.ts +437 -343
- package/src/Store/Disk.ts +52 -49
- package/src/Store/Memory.ts +54 -48
- package/src/Store/SQL/Pg.ts +318 -0
- package/src/Store/SQL/query.ts +409 -0
- package/src/Store/SQL.ts +668 -0
- package/src/Store/codeFilter.ts +1 -0
- package/src/Store/index.ts +17 -2
- package/src/Store/service.ts +31 -7
- package/src/Store/utils.ts +23 -22
- package/src/adapters/SQL/Model.ts +10 -4
- package/src/adapters/ServiceBus.ts +111 -115
- package/src/adapters/cosmos-client.ts +2 -2
- package/src/adapters/index.ts +7 -0
- package/src/adapters/memQueue.ts +2 -2
- package/src/adapters/mongo-client.ts +2 -2
- package/src/adapters/redis-client.ts +2 -2
- package/src/api/ContextProvider.ts +11 -11
- package/src/api/internal/RequestContextMiddleware.ts +1 -1
- package/src/api/internal/auth.ts +246 -44
- package/src/api/internal/events.ts +12 -8
- package/src/api/layerUtils.ts +8 -8
- package/src/api/routing/middleware/RouterMiddleware.ts +4 -4
- package/src/api/routing/middleware/middleware.ts +52 -12
- package/src/api/routing/middleware.ts +0 -2
- package/src/api/routing.ts +21 -7
- package/src/api/setupRequest.ts +28 -8
- package/src/arbs.ts +4 -2
- package/src/errorReporter.ts +58 -72
- package/src/logger/shared.ts +1 -1
- package/src/rateLimit.ts +30 -22
- package/test/auth.test.ts +101 -0
- package/test/contextProvider.test.ts +11 -11
- package/test/controller.test.ts +18 -14
- package/test/dist/auth.test.d.ts.map +1 -0
- package/test/dist/contextProvider.test.d.ts.map +1 -1
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/date-query.test.d.ts.map +1 -0
- package/test/dist/fixtures.d.ts +26 -12
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +12 -10
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/dist/rawQuery.test.d.ts.map +1 -1
- package/test/dist/repository-ext.test.d.ts.map +1 -0
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/router-generator.test.d.ts.map +1 -0
- package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/dist/sql-store.test.d.ts.map +1 -0
- package/test/fixtures.ts +11 -9
- package/test/query.test.ts +212 -34
- package/test/rawQuery.test.ts +23 -19
- package/test/repository-ext.test.ts +58 -0
- package/test/requires.test.ts +6 -6
- package/test/router-generator.test.ts +180 -0
- package/test/routing-interruptibility.test.ts +63 -0
- package/test/rpc-multi-middleware.test.ts +78 -9
- package/test/sql-store.test.ts +1064 -0
- package/test/validateSample.test.ts +15 -12
- package/tsconfig.json +0 -1
|
@@ -6,7 +6,7 @@ import { Receiver, Sender } from "../adapters/ServiceBus.js"
|
|
|
6
6
|
import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
|
|
7
7
|
import { InfraLogger } from "../logger.js"
|
|
8
8
|
import { reportNonInterruptedFailure, reportNonInterruptedFailureCause, reportQueueError } from "./errors.js"
|
|
9
|
-
import {
|
|
9
|
+
import { QueueMeta } from "./service.js"
|
|
10
10
|
|
|
11
11
|
export function makeServiceBusQueue<
|
|
12
12
|
Evt extends { id: StringId; _tag: string },
|
|
@@ -21,10 +21,10 @@ export function makeServiceBusQueue<
|
|
|
21
21
|
body: schema,
|
|
22
22
|
meta: QueueMeta
|
|
23
23
|
})
|
|
24
|
-
const wireSchemaJson = S.fromJsonString(wireSchema)
|
|
24
|
+
const wireSchemaJson = S.fromJsonString(S.toCodecJson(wireSchema))
|
|
25
25
|
const encodePublish = S.encodeEffect(wireSchemaJson)
|
|
26
26
|
const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
|
|
27
|
-
const drainWJson = S.fromJsonString(drainW)
|
|
27
|
+
const drainWJson = S.fromJsonString(S.toCodecJson(drainW))
|
|
28
28
|
const parseDrain = flow(S.decodeUnknownEffect(drainWJson), Effect.orDie)
|
|
29
29
|
|
|
30
30
|
return Effect.gen(function*() {
|
|
@@ -42,96 +42,66 @@ export function makeServiceBusQueue<
|
|
|
42
42
|
handleEvent: (ks: DrainEvt) => Effect.Effect<void, DrainE, DrainR>,
|
|
43
43
|
sessionId?: string
|
|
44
44
|
) => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
)
|
|
79
|
-
if (meta.span) {
|
|
80
|
-
effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
|
|
81
|
-
}
|
|
82
|
-
return effect
|
|
83
|
-
}),
|
|
84
|
-
Effect
|
|
85
|
-
// we reportError here, so that we report the error only, and keep flowing
|
|
86
|
-
.tapCause(reportError),
|
|
87
|
-
// we still need to flatten the Exit.
|
|
88
|
-
Effect.flatMap((_) => _)
|
|
89
|
-
)
|
|
90
|
-
}
|
|
45
|
+
const processMessage = Effect.fnUntraced(function*(messageBody: unknown) {
|
|
46
|
+
const { body, meta } = yield* parseDrain(messageBody).pipe(Effect.orDie)
|
|
47
|
+
let effect = InfraLogger
|
|
48
|
+
.logDebug(`[${receiver.name}] Processing incoming message`)
|
|
49
|
+
.pipe(
|
|
50
|
+
Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
|
|
51
|
+
Effect.andThen(handleEvent(body)),
|
|
52
|
+
Effect.orDie,
|
|
53
|
+
// we silenceAndReportError here, so that the error is reported, and moves into the Exit.
|
|
54
|
+
silenceAndReportError,
|
|
55
|
+
(_) =>
|
|
56
|
+
setupRequestContextWithCustomSpan(
|
|
57
|
+
_,
|
|
58
|
+
meta,
|
|
59
|
+
`queue.drain: ${receiver.name}${sessionId ? `#${sessionId}` : ""}.${body._tag}`,
|
|
60
|
+
{
|
|
61
|
+
captureStackTrace: false,
|
|
62
|
+
kind: "consumer",
|
|
63
|
+
attributes: {
|
|
64
|
+
"queue.name": receiver.name,
|
|
65
|
+
"queue.sessionId": sessionId,
|
|
66
|
+
"queue.input": body
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
if (meta.span) {
|
|
72
|
+
effect = Effect.withParentSpan(effect, Tracer.externalSpan(meta.span))
|
|
73
|
+
}
|
|
74
|
+
// we reportError here, so that we report the error only, and keep flowing
|
|
75
|
+
const exit = yield* Effect.tapCause(effect, reportError)
|
|
76
|
+
return yield* exit
|
|
77
|
+
})
|
|
91
78
|
|
|
92
79
|
return receiver
|
|
93
80
|
.subscribe({
|
|
94
81
|
processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
|
|
95
82
|
processError: (err) => reportQueueError(Cause.fail(err.error))
|
|
96
|
-
// Deferred.completeWith(
|
|
97
|
-
// deferred,
|
|
98
|
-
// reportFatalQueueError(Cause.fail(err.error))
|
|
99
|
-
// .pipe(Effect.andThen(Effect.fail(err.error)))
|
|
100
|
-
// )
|
|
101
83
|
}, sessionId)
|
|
102
|
-
|
|
103
|
-
.pipe(
|
|
104
|
-
Effect.andThen(Effect.never)
|
|
105
|
-
)
|
|
84
|
+
.pipe(Effect.andThen(Effect.never))
|
|
106
85
|
},
|
|
107
86
|
|
|
108
|
-
publish: (
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}))
|
|
126
|
-
))
|
|
127
|
-
.pipe(Effect.flatMap((msgs) => sender.sendMessages(msgs)))
|
|
128
|
-
),
|
|
129
|
-
Effect.withSpan("queue.publish: " + sender.name, {
|
|
130
|
-
kind: "producer",
|
|
131
|
-
attributes: { "message_tags": messages.map((_) => _._tag) }
|
|
132
|
-
}, { captureStackTrace: false })
|
|
133
|
-
)
|
|
87
|
+
publish: Effect.fn("queue.publish: " + sender.name, {
|
|
88
|
+
kind: "producer"
|
|
89
|
+
})(function*(...messages: NonEmptyReadonlyArray<Evt>) {
|
|
90
|
+
yield* Effect.annotateCurrentSpan({ "message_tags": messages.map((_) => _._tag) })
|
|
91
|
+
const requestContext = yield* getRequestContext
|
|
92
|
+
const msgs = yield* Effect.forEach(messages, (m) =>
|
|
93
|
+
encodePublish({ body: m, meta: requestContext }).pipe(
|
|
94
|
+
Effect.orDie,
|
|
95
|
+
Effect.map((body) => ({
|
|
96
|
+
body,
|
|
97
|
+
messageId: m.id, /* correllationid: requestId */
|
|
98
|
+
contentType: "application/json",
|
|
99
|
+
sessionId: "sessionId" in m ? m.sessionId as string : undefined as unknown as string // TODO: optional
|
|
100
|
+
}))
|
|
101
|
+
))
|
|
102
|
+
yield* sender.sendMessages(msgs)
|
|
103
|
+
})
|
|
134
104
|
}
|
|
135
|
-
return queue
|
|
105
|
+
return queue
|
|
136
106
|
})
|
|
137
107
|
}
|
package/src/RequestContext.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Context, S } from "effect-app"
|
|
2
2
|
import { UserProfileId } from "effect-app/ids"
|
|
3
3
|
import { NonEmptyString255 } from "effect-app/Schema"
|
|
4
4
|
|
|
5
|
-
export const Locale = S.
|
|
5
|
+
export const Locale = S.Literals(["en", "de"])
|
|
6
6
|
export type Locale = typeof Locale.Type
|
|
7
7
|
|
|
8
|
-
export class LocaleRef extends
|
|
8
|
+
export class LocaleRef extends Context.Reference("Locale", { defaultValue: (): Locale => "en" }) {}
|
|
9
9
|
|
|
10
|
-
export class RequestContext extends S.
|
|
10
|
+
export class RequestContext extends S.Opaque<
|
|
11
11
|
RequestContext,
|
|
12
12
|
RequestContext.Encoded
|
|
13
|
-
>(
|
|
13
|
+
>()(S.Struct({
|
|
14
14
|
span: S.Struct({
|
|
15
15
|
traceId: S.String,
|
|
16
16
|
spanId: S.String,
|
|
@@ -22,8 +22,8 @@ export class RequestContext extends S.ExtendedClass<
|
|
|
22
22
|
namespace: NonEmptyString255,
|
|
23
23
|
/** @deprecated */
|
|
24
24
|
userProfile: S.optional(S.Struct({ sub: UserProfileId })) //
|
|
25
|
-
}) {
|
|
26
|
-
// static Tag =
|
|
25
|
+
})) {
|
|
26
|
+
// static Tag = Context.Tag<RequestContext>()
|
|
27
27
|
|
|
28
28
|
static toMonitoring(this: void, self: RequestContext) {
|
|
29
29
|
return {
|
package/src/RequestFiberSet.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { Effect, Fiber, FiberSet, Layer,
|
|
2
|
+
import { Context, Effect, Fiber, FiberSet, Layer, Option, type Tracer } from "effect-app"
|
|
3
3
|
import { reportRequestError, reportUnknownRequestError } from "./api/reportError.js"
|
|
4
4
|
import { InfraLogger } from "./logger.js"
|
|
5
5
|
|
|
@@ -8,8 +8,8 @@ const getRootParentSpan = Effect.gen(function*() {
|
|
|
8
8
|
Effect.catchTag("NoSuchElementError", () => Effect.succeed(null))
|
|
9
9
|
)
|
|
10
10
|
if (!span) return span
|
|
11
|
-
while (span._tag === "Span" && span.parent
|
|
12
|
-
span = span.parent
|
|
11
|
+
while (span._tag === "Span" && Option.isSome(span.parent)) {
|
|
12
|
+
span = span.parent.value
|
|
13
13
|
}
|
|
14
14
|
return span
|
|
15
15
|
})
|
|
@@ -92,7 +92,7 @@ const make = Effect.gen(function*() {
|
|
|
92
92
|
* Whenever you fork a fiber for a Request, and you want to prevent dependent services to close prematurely on interruption,
|
|
93
93
|
* like the ServiceBus Sender, you should register these fibers in this FiberSet.
|
|
94
94
|
*/
|
|
95
|
-
export class RequestFiberSet extends
|
|
95
|
+
export class RequestFiberSet extends Context.Service<RequestFiberSet>()("RequestFiberSet", { make }) {
|
|
96
96
|
static readonly Live = Layer.effect(this, this.make)
|
|
97
97
|
static readonly register = <A, E, R>(self: Effect.Effect<A, E, R>) =>
|
|
98
98
|
this.asEffect().pipe(Effect.andThen((_) => _.register(self)))
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { Data, Effect, Layer,
|
|
1
|
+
import { Context, Data, Effect, Layer, RequestResolver } from "effect-app"
|
|
2
|
+
import { dual } from "effect/Function"
|
|
3
|
+
import type * as Request from "effect/Request"
|
|
2
4
|
import { ContextMap } from "./service.js"
|
|
3
5
|
|
|
4
6
|
// TODO: we have to create a new contextmap on every request.
|
|
@@ -7,7 +9,7 @@ import { ContextMap } from "./service.js"
|
|
|
7
9
|
// we can call another start after startup. but it would be even better if we could Die on accessing rootmap
|
|
8
10
|
// we could also make the ContextMap optional, and when missing, issue a warning instead?
|
|
9
11
|
|
|
10
|
-
export class ContextMapContainer extends
|
|
12
|
+
export class ContextMapContainer extends Context.Reference("ContextMapContainer", {
|
|
11
13
|
defaultValue: (): ContextMap | "root" => "root"
|
|
12
14
|
}) {
|
|
13
15
|
static readonly layer = Layer.effect(this, ContextMap.make.pipe(Effect.map(ContextMap.of)))
|
|
@@ -18,3 +20,40 @@ export class ContextMapNotStartedError extends Data.TaggedError("ContextMapNotSt
|
|
|
18
20
|
export const getContextMap = ContextMapContainer.asEffect().pipe(
|
|
19
21
|
Effect.filterOrFail((_) => _ !== "root", () => new ContextMapNotStartedError())
|
|
20
22
|
)
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Uses the official `RequestResolver.withCache` internally,
|
|
26
|
+
* creating one cached resolver per ContextMap (i.e. per request).
|
|
27
|
+
* Uses a shared semaphore in the ContextMap to ensure safe single initialization.
|
|
28
|
+
*/
|
|
29
|
+
export const withRequestResolverCache: {
|
|
30
|
+
<A extends Request.Request<any, any>>(options: {
|
|
31
|
+
readonly capacity: number
|
|
32
|
+
readonly strategy?: "lru" | "fifo" | undefined
|
|
33
|
+
}): (
|
|
34
|
+
self: RequestResolver.RequestResolver<A>
|
|
35
|
+
) => Effect.Effect<RequestResolver.RequestResolver<A>, ContextMapNotStartedError>
|
|
36
|
+
<A extends Request.Request<any, any>>(
|
|
37
|
+
self: RequestResolver.RequestResolver<A>,
|
|
38
|
+
options: {
|
|
39
|
+
readonly capacity: number
|
|
40
|
+
readonly strategy?: "lru" | "fifo" | undefined
|
|
41
|
+
}
|
|
42
|
+
): Effect.Effect<RequestResolver.RequestResolver<A>, ContextMapNotStartedError>
|
|
43
|
+
} = dual(2, <A extends Request.Request<any, any>>(
|
|
44
|
+
self: RequestResolver.RequestResolver<A>,
|
|
45
|
+
options: {
|
|
46
|
+
readonly capacity: number
|
|
47
|
+
readonly strategy?: "lru" | "fifo" | undefined
|
|
48
|
+
}
|
|
49
|
+
): Effect.Effect<RequestResolver.RequestResolver<A>, ContextMapNotStartedError> => {
|
|
50
|
+
const cacheKey = Symbol()
|
|
51
|
+
return getContextMap.pipe(
|
|
52
|
+
Effect.flatMap((ctxMap) =>
|
|
53
|
+
ctxMap.getOrCreateStoreEffect(
|
|
54
|
+
cacheKey,
|
|
55
|
+
RequestResolver.withCache(self, options)
|
|
56
|
+
)
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
})
|
|
@@ -296,16 +296,14 @@ export function buildWhereCosmosQuery3(
|
|
|
296
296
|
${filter.length ? `WHERE (${print(filter, values.map((_) => _.value), null, false)})` : ""}
|
|
297
297
|
${order ? `ORDER BY ${order.map((_) => `${dottedToAccess(`f.${_.key}`)} ${_.direction}`).join(", ")}` : ""}
|
|
298
298
|
${skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : ""}`,
|
|
299
|
-
parameters:
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
)
|
|
309
|
-
]
|
|
299
|
+
parameters: values
|
|
300
|
+
.flatMap((x, i) =>
|
|
301
|
+
[{
|
|
302
|
+
name: `@v${i}`,
|
|
303
|
+
value: x.value as any
|
|
304
|
+
}]
|
|
305
|
+
// TODO: only for arrays that are used with _ANY or _ALL
|
|
306
|
+
.concat(Array.isArray(x.value) ? x.value.map((_, i2) => ({ name: `@v${i}__${i2}`, value: _ as any })) : [])
|
|
307
|
+
)
|
|
310
308
|
}
|
|
311
309
|
}
|