@effect-app/infra 2.94.0 → 3.0.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 +19 -0
- package/dist/Emailer/service.d.ts +1 -1
- package/dist/MainFiberSet.d.ts +1 -1
- package/dist/Operations.d.ts +1 -1
- package/dist/QueueMaker/errors.d.ts +1 -1
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/RequestFiberSet.d.ts +1 -1
- package/dist/Store/service.d.ts +2 -2
- package/dist/adapters/SQL/Model.d.ts +6 -6
- package/dist/adapters/ServiceBus.d.ts +2 -2
- package/dist/adapters/ServiceBus.d.ts.map +1 -1
- package/dist/adapters/ServiceBus.js +13 -10
- package/dist/adapters/memQueue.d.ts +1 -1
- package/dist/api/routing/middleware/RouterMiddleware.d.ts +7 -7
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.d.ts +6 -27
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +72 -88
- package/dist/api/routing/middleware.d.ts +0 -3
- package/dist/api/routing/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware.js +1 -4
- package/dist/api/routing.d.ts +1 -2
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +2 -8
- package/package.json +3 -15
- package/src/adapters/ServiceBus.ts +7 -5
- package/src/api/routing/middleware/RouterMiddleware.ts +10 -9
- package/src/api/routing/middleware/middleware.ts +35 -40
- package/src/api/routing/middleware.ts +0 -3
- package/src/api/routing.ts +3 -9
- package/test/controller.test.ts +33 -9
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/fixtures.d.ts +48 -32
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +76 -47
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -0
- package/test/fixtures.ts +70 -16
- package/test/requires.test.ts +16 -51
- package/test/rpc-multi-middleware.test.ts +134 -0
- package/dist/api/routing/middleware/RpcMiddleware.d.ts +0 -199
- package/dist/api/routing/middleware/RpcMiddleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/RpcMiddleware.js +0 -14
- package/dist/api/routing/middleware/generic-middleware.d.ts +0 -41
- package/dist/api/routing/middleware/generic-middleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/generic-middleware.js +0 -70
- package/dist/api/routing/middleware/middleware-api.d.ts +0 -88
- package/dist/api/routing/middleware/middleware-api.d.ts.map +0 -1
- package/dist/api/routing/middleware/middleware-api.js +0 -58
- package/src/api/routing/middleware/RpcMiddleware.ts +0 -301
- package/src/api/routing/middleware/generic-middleware.ts +0 -163
- package/src/api/routing/middleware/middleware-api.ts +0 -226
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { type AnyWithProps } from "@effect/rpc/Rpc"
|
|
3
|
-
import { Context, type Effect, type NonEmptyArray, type NonEmptyReadonlyArray, S } from "effect-app"
|
|
4
|
-
import { type GetContextConfig, type RPCContextMap } from "effect-app/client"
|
|
5
|
-
import { type TypeTestId } from "../../routing.js"
|
|
6
|
-
import { type MiddlewareMaker, middlewareMaker } from "./generic-middleware.js"
|
|
7
|
-
import { type AnyDynamic, type RpcDynamic, Tag, type TagClassAny } from "./RpcMiddleware.js"
|
|
8
|
-
|
|
9
|
-
/** Adapter used when setting the dynamic prop on a middleware implementation */
|
|
10
|
-
export const contextMap = <
|
|
11
|
-
RequestContextMap extends Record<string, RPCContextMap.Any>,
|
|
12
|
-
Key extends (keyof RequestContextMap) & string
|
|
13
|
-
>(rcm: RequestContextMap, key: Key): RpcDynamic<Key, RequestContextMap[Key]> => ({
|
|
14
|
-
key,
|
|
15
|
-
settings: { service: rcm[key]!["service"] } as RequestContextMap[Key]
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
/** Retrieves RequestContextConfig out of the RPC annotations */
|
|
19
|
-
export const getConfig = <
|
|
20
|
-
RequestContextMap extends Record<string, RPCContextMap.Any>
|
|
21
|
-
>() =>
|
|
22
|
-
(rpc: AnyWithProps): GetContextConfig<RequestContextMap> => {
|
|
23
|
-
return Context.unsafeGet(rpc.annotations, Context.GenericTag("RequestContextConfig"))
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// the following implements sort of builder pattern
|
|
27
|
-
// we support both sideways and upwards elimination of dependencies
|
|
28
|
-
|
|
29
|
-
// it's for dynamic middlewares
|
|
30
|
-
type GetDependsOnKeys<MW extends MiddlewareMaker> = MW extends { dependsOn: NonEmptyReadonlyArray<TagClassAny> } ? {
|
|
31
|
-
[K in keyof MW["dependsOn"]]: MW["dependsOn"][K] extends AnyDynamic ? MW["dependsOn"][K]["dynamic"]["key"]
|
|
32
|
-
: never
|
|
33
|
-
}[keyof MW["dependsOn"]]
|
|
34
|
-
: never
|
|
35
|
-
|
|
36
|
-
type FilterInDynamicMiddlewares<
|
|
37
|
-
MWs extends ReadonlyArray<MiddlewareMaker>,
|
|
38
|
-
RequestContextMap extends Record<string, RPCContextMap.Any>
|
|
39
|
-
> = {
|
|
40
|
-
[K in keyof MWs]: MWs[K] extends { dynamic: RpcDynamic<any, RequestContextMap[keyof RequestContextMap]> } ? MWs[K]
|
|
41
|
-
: never
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
type RecursiveHandleMWsSideways<
|
|
45
|
-
MWs,
|
|
46
|
-
R extends {
|
|
47
|
-
rcm: Record<string, RPCContextMap.Any>
|
|
48
|
-
provided: keyof R["rcm"] // that's fine
|
|
49
|
-
middlewares: ReadonlyArray<MiddlewareMaker>
|
|
50
|
-
dmp: any
|
|
51
|
-
middlewareR: any
|
|
52
|
-
}
|
|
53
|
-
> = MWs extends [
|
|
54
|
-
infer F extends MiddlewareMaker,
|
|
55
|
-
...infer Rest extends ReadonlyArray<MiddlewareMaker>
|
|
56
|
-
] ? RecursiveHandleMWsSideways<Rest, {
|
|
57
|
-
rcm: R["rcm"]
|
|
58
|
-
// when one dynamic middleware depends on another, subtract the key to enforce the dependency to be provided after
|
|
59
|
-
// (if already provided, it would have to be re-provided anyway, so better to provide it after)
|
|
60
|
-
provided: Exclude<
|
|
61
|
-
R["provided"] | FilterInDynamicMiddlewares<[F], R["rcm"]>[number]["dynamic"]["key"],
|
|
62
|
-
// F is fine here because only dynamic middlewares will have 'dependsOn' prop
|
|
63
|
-
GetDependsOnKeys<F>
|
|
64
|
-
>
|
|
65
|
-
middlewares: [...R["middlewares"], F]
|
|
66
|
-
dmp: [FilterInDynamicMiddlewares<[F], R["rcm"]>[number]] extends [never] ? R["dmp"]
|
|
67
|
-
:
|
|
68
|
-
& R["dmp"]
|
|
69
|
-
& {
|
|
70
|
-
[U in FilterInDynamicMiddlewares<[F], R["rcm"]>[number] as U["dynamic"]["key"]]: U
|
|
71
|
-
}
|
|
72
|
-
middlewareR: MiddlewareMaker.ApplyManyServices<[F], R["middlewareR"]>
|
|
73
|
-
}>
|
|
74
|
-
: R
|
|
75
|
-
|
|
76
|
-
export interface BuildingMiddleware<
|
|
77
|
-
RequestContextMap extends Record<string, RPCContextMap.Any>,
|
|
78
|
-
Provided extends keyof RequestContextMap,
|
|
79
|
-
Middlewares extends ReadonlyArray<MiddlewareMaker>,
|
|
80
|
-
DynamicMiddlewareProviders,
|
|
81
|
-
out MiddlewareR extends { _tag: string } = never
|
|
82
|
-
> {
|
|
83
|
-
middleware<MWs extends NonEmptyArray<MiddlewareMaker>>(
|
|
84
|
-
...mw: MWs
|
|
85
|
-
): RecursiveHandleMWsSideways<MWs, {
|
|
86
|
-
rcm: RequestContextMap
|
|
87
|
-
provided: Provided
|
|
88
|
-
middlewares: Middlewares
|
|
89
|
-
dmp: DynamicMiddlewareProviders
|
|
90
|
-
middlewareR: MiddlewareR
|
|
91
|
-
}> extends infer Res extends {
|
|
92
|
-
rcm: RequestContextMap
|
|
93
|
-
provided: keyof RequestContextMap
|
|
94
|
-
middlewares: ReadonlyArray<MiddlewareMaker>
|
|
95
|
-
dmp: any
|
|
96
|
-
middlewareR: any
|
|
97
|
-
} ? MiddlewaresBuilder<
|
|
98
|
-
Res["rcm"],
|
|
99
|
-
Res["provided"],
|
|
100
|
-
Res["middlewares"],
|
|
101
|
-
Res["dmp"],
|
|
102
|
-
Res["middlewareR"]
|
|
103
|
-
>
|
|
104
|
-
: never
|
|
105
|
-
|
|
106
|
-
// helps debugging what are the missing requirements (type only)
|
|
107
|
-
readonly [TypeTestId]: {
|
|
108
|
-
missingDynamicMiddlewares: Exclude<keyof RequestContextMap, Provided>
|
|
109
|
-
missingContext: MiddlewareR
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export type MiddlewaresBuilder<
|
|
114
|
-
RequestContextMap extends Record<string, RPCContextMap.Any>,
|
|
115
|
-
Provided extends keyof RequestContextMap = never,
|
|
116
|
-
Middlewares extends ReadonlyArray<MiddlewareMaker> = [],
|
|
117
|
-
DynamicMiddlewareProviders = unknown,
|
|
118
|
-
MiddlewareR extends { _tag: string } = never
|
|
119
|
-
> =
|
|
120
|
-
& BuildingMiddleware<
|
|
121
|
-
RequestContextMap,
|
|
122
|
-
Provided,
|
|
123
|
-
Middlewares,
|
|
124
|
-
DynamicMiddlewareProviders,
|
|
125
|
-
MiddlewareR
|
|
126
|
-
>
|
|
127
|
-
& // keyof Omit<RequestContextMap, Provided> extends never is true when all the dynamic middlewares are provided
|
|
128
|
-
// MiddlewareR is never when all the required services from generic & dynamic middlewares are provided
|
|
129
|
-
(keyof Omit<RequestContextMap, Provided> extends never ? [MiddlewareR] extends [never] ? ReturnType<
|
|
130
|
-
typeof makeMiddlewareBasic<
|
|
131
|
-
RequestContextMap,
|
|
132
|
-
Middlewares
|
|
133
|
-
>
|
|
134
|
-
>
|
|
135
|
-
: {}
|
|
136
|
-
: {})
|
|
137
|
-
|
|
138
|
-
export const makeMiddleware: <
|
|
139
|
-
RequestContextMap extends Record<string, RPCContextMap.Any>
|
|
140
|
-
>(rcm: RequestContextMap) => MiddlewaresBuilder<RequestContextMap> = (rcm) => {
|
|
141
|
-
let allMiddleware: MiddlewareMaker[] = []
|
|
142
|
-
const it = {
|
|
143
|
-
middleware: (...middlewares: any[]) => {
|
|
144
|
-
for (const mw of middlewares) {
|
|
145
|
-
// recall that we run middlewares in reverse order
|
|
146
|
-
allMiddleware = [mw, ...allMiddleware]
|
|
147
|
-
}
|
|
148
|
-
return allMiddleware.filter((m) => !!m.dynamic).length !== Object.keys(rcm).length
|
|
149
|
-
// for sure, until all the dynamic middlewares are provided it's non sensical to call makeMiddlewareBasic
|
|
150
|
-
? it
|
|
151
|
-
// actually, we don't know yet if MiddlewareR is never, but we can't easily check it at runtime
|
|
152
|
-
: Object.assign(makeMiddlewareBasic<any, any>(rcm, ...allMiddleware), it)
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return it as any
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
//
|
|
159
|
-
export interface MiddlewareMakerId {
|
|
160
|
-
readonly _id: unique symbol
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// TODO: actually end up with [Tag<A, A>, Tag<B, B>, ...]
|
|
164
|
-
type MakeTags<A> = Context.Tag<A, A>
|
|
165
|
-
|
|
166
|
-
const makeMiddlewareBasic =
|
|
167
|
-
// by setting RequestContextMap beforehand, execute contextual typing does not fuck up itself to anys
|
|
168
|
-
<
|
|
169
|
-
RequestContextMap extends Record<string, RPCContextMap.Any>,
|
|
170
|
-
MiddlewareProviders extends ReadonlyArray<MiddlewareMaker>
|
|
171
|
-
>(
|
|
172
|
-
_rcm: RequestContextMap,
|
|
173
|
-
...make: MiddlewareProviders
|
|
174
|
-
) => {
|
|
175
|
-
// reverse middlewares and wrap one after the other
|
|
176
|
-
const middleware = middlewareMaker(make)
|
|
177
|
-
|
|
178
|
-
const failures = make.map((_) => _.failure).filter(Boolean)
|
|
179
|
-
const provides = make.flatMap((_) => !_.provides ? [] : Array.isArray(_.provides) ? _.provides : [_.provides])
|
|
180
|
-
const requires = make
|
|
181
|
-
.flatMap((_) => !_.requires ? [] : Array.isArray(_.requires) ? _.requires : [_.requires])
|
|
182
|
-
.filter((_) => !provides.includes(_))
|
|
183
|
-
|
|
184
|
-
const MiddlewareMaker = Tag<MiddlewareMakerId>()("MiddlewareMaker", {
|
|
185
|
-
failure: (failures.length > 0
|
|
186
|
-
? S.Union(...failures)
|
|
187
|
-
: S.Never) as unknown as MiddlewareMaker.ManyErrors<MiddlewareProviders> extends never ? never
|
|
188
|
-
: S.Schema<MiddlewareMaker.ManyErrors<MiddlewareProviders>>,
|
|
189
|
-
requires: (requires.length > 0
|
|
190
|
-
? requires
|
|
191
|
-
: undefined) as unknown as Exclude<
|
|
192
|
-
MiddlewareMaker.ManyRequired<MiddlewareProviders>,
|
|
193
|
-
MiddlewareMaker.ManyProvided<MiddlewareProviders>
|
|
194
|
-
> extends never ? never : [
|
|
195
|
-
MakeTags<
|
|
196
|
-
Exclude<
|
|
197
|
-
MiddlewareMaker.ManyRequired<MiddlewareProviders>,
|
|
198
|
-
MiddlewareMaker.ManyProvided<MiddlewareProviders>
|
|
199
|
-
>
|
|
200
|
-
>
|
|
201
|
-
],
|
|
202
|
-
provides: (provides.length > 0
|
|
203
|
-
? provides
|
|
204
|
-
: undefined) as unknown as MiddlewareMaker.ManyProvided<MiddlewareProviders> extends never ? never : [
|
|
205
|
-
MakeTags<MiddlewareMaker.ManyProvided<MiddlewareProviders>>
|
|
206
|
-
],
|
|
207
|
-
wrap: true
|
|
208
|
-
})(
|
|
209
|
-
middleware as {
|
|
210
|
-
dependencies: typeof middleware["dependencies"]
|
|
211
|
-
effect: Effect<
|
|
212
|
-
any, // TODO: why ?
|
|
213
|
-
Effect.Error<typeof middleware["effect"]>,
|
|
214
|
-
Effect.Context<typeof middleware["effect"]>
|
|
215
|
-
>
|
|
216
|
-
}
|
|
217
|
-
)
|
|
218
|
-
|
|
219
|
-
// add to the tag a default implementation
|
|
220
|
-
return Object.assign(MiddlewareMaker, {
|
|
221
|
-
// tag to be used to retrieve the RequestContextConfig from RPC annotations
|
|
222
|
-
requestContext: Context.GenericTag<"RequestContextConfig", GetContextConfig<RequestContextMap>>(
|
|
223
|
-
"RequestContextConfig"
|
|
224
|
-
)
|
|
225
|
-
})
|
|
226
|
-
}
|