@effect-app/infra 4.0.0-beta.20 → 4.0.0-beta.200
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 +1378 -0
- package/_check.sh +1 -1
- 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 +10 -4
- 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 +9 -9
- 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 +43 -32
- 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/eager.js +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 +16 -16
- 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/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 +37 -53
- package/dist/QueueMaker/service.d.ts +1 -1
- package/dist/RequestContext.d.ts +112 -26
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +7 -8
- 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 +10 -12
- package/dist/Store/Cosmos.d.ts +1 -1
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +318 -240
- 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 +18 -7
- 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 +11 -11
- 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 +2 -2
- 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 +8 -8
- 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 +50 -4
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +79 -17
- 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 +25 -26
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +83 -35
- 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 +20 -25
- 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 +2 -2
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +1 -1
- package/dist/vitest.d.ts +1 -1
- package/examples/query.ts +39 -35
- package/package.json +41 -37
- package/src/CUPS.ts +9 -11
- package/src/Emailer/Sendgrid.ts +17 -14
- package/src/Emailer/service.ts +9 -3
- package/src/MainFiberSet.ts +5 -6
- package/src/Model/Repository/Registry.ts +33 -0
- package/src/Model/Repository/ext.ts +96 -10
- package/src/Model/Repository/internal/internal.ts +97 -88
- 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/filter/types/path/eager.ts +1 -2
- package/src/Model/query/dsl.ts +18 -18
- package/src/Model/query/new-kid-interpreter.ts +2 -2
- package/src/Model.ts +1 -0
- package/src/QueueMaker/SQLQueue.ts +121 -151
- package/src/QueueMaker/memQueue.ts +82 -103
- package/src/QueueMaker/sbqueue.ts +56 -86
- package/src/RequestContext.ts +8 -10
- package/src/RequestFiberSet.ts +4 -4
- package/src/Store/ContextMapContainer.ts +41 -2
- package/src/Store/Cosmos/query.ts +16 -20
- package/src/Store/Cosmos.ts +452 -342
- 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 +32 -8
- package/src/Store/utils.ts +23 -22
- package/src/adapters/SQL/Model.ts +10 -4
- package/src/adapters/ServiceBus.ts +112 -116
- 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 +12 -13
- 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 +112 -15
- package/src/api/routing/middleware.ts +0 -2
- package/src/api/routing.ts +142 -63
- package/src/api/setupRequest.ts +28 -8
- package/src/arbs.ts +4 -2
- package/src/errorReporter.ts +62 -74
- package/src/logger/shared.ts +1 -1
- package/src/rateLimit.ts +30 -22
- package/src/test.ts +1 -1
- package/test/auth.test.ts +101 -0
- package/test/contextProvider.test.ts +11 -11
- package/test/controller.test.ts +18 -16
- 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/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-e2e-invalidation.test.d.ts.map +1 -0
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
- package/test/dist/sql-store.test.d.ts.map +1 -0
- package/test/fixtures.ts +11 -9
- package/test/query.test.ts +216 -34
- package/test/rawQuery.test.ts +23 -19
- package/test/repository-ext.test.ts +60 -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-e2e-invalidation.test.ts +507 -0
- package/test/rpc-multi-middleware.test.ts +78 -9
- package/test/rpc-stream-fullstack.test.ts +325 -0
- package/test/sql-store.test.ts +1064 -0
- package/test/validateSample.test.ts +15 -12
- package/tsconfig.examples.json +1 -1
- package/tsconfig.json +0 -1
- package/tsconfig.json.bak +2 -2
- package/tsconfig.src.json +35 -35
- package/tsconfig.test.json +2 -2
- package/dist/Operations.d.ts +0 -55
- package/dist/Operations.d.ts.map +0 -1
- package/dist/Operations.js +0 -102
- package/dist/OperationsRepo.d.ts +0 -41
- package/dist/OperationsRepo.d.ts.map +0 -1
- package/dist/OperationsRepo.js +0 -14
- package/eslint.config.mjs +0 -24
- package/src/Operations.ts +0 -235
- package/src/OperationsRepo.ts +0 -16
|
@@ -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,11 +21,11 @@ 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)
|
|
28
|
-
const parseDrain = flow(S.
|
|
27
|
+
const drainWJson = S.fromJsonString(S.toCodecJson(drainW))
|
|
28
|
+
const parseDrain = flow(S.decodeUnknownEffectConcurrently(drainWJson), Effect.orDie)
|
|
29
29
|
|
|
30
30
|
return Effect.gen(function*() {
|
|
31
31
|
const sender = yield* Sender
|
|
@@ -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 {
|
|
@@ -53,11 +53,9 @@ export const spanAttributes = (ctx: Pick<RequestContext, "locale" | "namespace">
|
|
|
53
53
|
|
|
54
54
|
// codegen:start {preset: model}
|
|
55
55
|
//
|
|
56
|
-
/* eslint-disable */
|
|
57
56
|
export namespace RequestContext {
|
|
58
|
-
export interface Encoded extends S.
|
|
57
|
+
export interface Encoded extends S.StructNestedEncoded<typeof RequestContext> {}
|
|
59
58
|
}
|
|
60
|
-
/* eslint-enable */
|
|
61
59
|
//
|
|
62
60
|
// codegen:end
|
|
63
61
|
//
|
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
|
+
})
|
|
@@ -279,16 +279,14 @@ export function buildWhereCosmosQuery3(
|
|
|
279
279
|
query: `
|
|
280
280
|
SELECT ${
|
|
281
281
|
select
|
|
282
|
-
?
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
: `ARRAY (SELECT ${s.subKeys.map((_) => dottedToAccess(`t.${_}`)).join(",")}
|
|
282
|
+
? select
|
|
283
|
+
.map((s) =>
|
|
284
|
+
typeof s === "string"
|
|
285
|
+
? dottedToAccess(s === idKey ? "f.id" : `f.${s}`) // x["y"} vs x.y, helps with reserved keywords like "value"
|
|
286
|
+
: `ARRAY (SELECT ${s.subKeys.map((_) => dottedToAccess(`t.${_}`)).join(",")}
|
|
288
287
|
FROM t in ${dottedToAccess(`f.${s.key}`)}) AS ${s.key}`
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
}`
|
|
288
|
+
)
|
|
289
|
+
.join(", ")
|
|
292
290
|
: "f"
|
|
293
291
|
}
|
|
294
292
|
FROM ${name} f
|
|
@@ -296,16 +294,14 @@ export function buildWhereCosmosQuery3(
|
|
|
296
294
|
${filter.length ? `WHERE (${print(filter, values.map((_) => _.value), null, false)})` : ""}
|
|
297
295
|
${order ? `ORDER BY ${order.map((_) => `${dottedToAccess(`f.${_.key}`)} ${_.direction}`).join(", ")}` : ""}
|
|
298
296
|
${skip !== undefined || limit !== undefined ? `OFFSET ${skip ?? 0} LIMIT ${limit ?? 999999}` : ""}`,
|
|
299
|
-
parameters:
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
)
|
|
309
|
-
]
|
|
297
|
+
parameters: values
|
|
298
|
+
.flatMap((x, i) =>
|
|
299
|
+
[{
|
|
300
|
+
name: `@v${i}`,
|
|
301
|
+
value: x.value as any
|
|
302
|
+
}]
|
|
303
|
+
// TODO: only for arrays that are used with _ANY or _ALL
|
|
304
|
+
.concat(Array.isArray(x.value) ? x.value.map((_, i2) => ({ name: `@v${i}__${i2}`, value: _ as any })) : [])
|
|
305
|
+
)
|
|
310
306
|
}
|
|
311
307
|
}
|