@effect-app/infra 2.21.4 → 2.22.0
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 +12 -0
- package/_cjs/api/routing6.cjs.map +1 -1
- package/_cjs/api/routing7.cjs +216 -0
- package/_cjs/api/routing7.cjs.map +1 -0
- package/dist/api/routing6.d.ts +10 -4
- package/dist/api/routing6.d.ts.map +1 -1
- package/dist/api/routing6.js +1 -1
- package/dist/api/routing7.d.ts +244 -0
- package/dist/api/routing7.d.ts.map +1 -0
- package/dist/api/routing7.js +234 -0
- package/package.json +11 -1
- package/src/api/routing6.ts +28 -22
- package/src/api/routing7.ts +875 -0
- package/test/controller7.test.ts +216 -0
- package/test/dist/controller6.test.d.ts.map +1 -1
- package/test/dist/controller7.test.d.ts.map +1 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
2
|
+
import { makeMiddleware, makeRouter } from "@effect-app/infra/api/routing7"
|
|
3
|
+
import type { RequestContext } from "@effect-app/infra/RequestContext"
|
|
4
|
+
import { Rpc } from "@effect/rpc"
|
|
5
|
+
import type { Request } from "effect-app"
|
|
6
|
+
import { Context, Effect, FiberRef, Layer, S, Schedule } from "effect-app"
|
|
7
|
+
import { type GetEffectContext, makeRpcClient, type RPCContextMap, UnauthorizedError } from "effect-app/client"
|
|
8
|
+
import { HttpHeaders, HttpServerRequest } from "effect-app/http"
|
|
9
|
+
import type * as EffectRequest from "effect/Request"
|
|
10
|
+
import { it } from "vitest"
|
|
11
|
+
|
|
12
|
+
const optimisticConcurrencySchedule = Schedule.once
|
|
13
|
+
&& Schedule.recurWhile<any>((a) => a?._tag === "OptimisticConcurrencyException")
|
|
14
|
+
|
|
15
|
+
export interface CTX {
|
|
16
|
+
context: RequestContext
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type CTXMap = {
|
|
20
|
+
// allowAnonymous: RPCContextMap.Inverted<"userProfile", UserProfile, typeof NotLoggedInError>
|
|
21
|
+
// TODO: not boolean but `string[]`
|
|
22
|
+
requireRoles: RPCContextMap.Custom<"", never, typeof UnauthorizedError, Array<string>>
|
|
23
|
+
}
|
|
24
|
+
const middleware = makeMiddleware({
|
|
25
|
+
contextMap: null as unknown as CTXMap,
|
|
26
|
+
// helper to deal with nested generic lmitations
|
|
27
|
+
context: null as any as HttpServerRequest.HttpServerRequest,
|
|
28
|
+
execute: Effect.gen(function*() {
|
|
29
|
+
return <T extends { config?: { [K in keyof CTXMap]?: any } }, Req extends S.TaggedRequest.All, R>(
|
|
30
|
+
_schema: T & S.Schema<Req, any, never>,
|
|
31
|
+
handler: (request: Req) => Effect.Effect<EffectRequest.Request.Success<Req>, EffectRequest.Request.Error<Req>, R>,
|
|
32
|
+
moduleName?: string
|
|
33
|
+
) =>
|
|
34
|
+
(
|
|
35
|
+
req: Req
|
|
36
|
+
): Effect.Effect<
|
|
37
|
+
Request.Request.Success<Req>,
|
|
38
|
+
Request.Request.Error<Req>,
|
|
39
|
+
| HttpServerRequest.HttpServerRequest
|
|
40
|
+
| Exclude<R, GetEffectContext<CTXMap, T["config"]>>
|
|
41
|
+
> =>
|
|
42
|
+
Effect
|
|
43
|
+
.gen(function*() {
|
|
44
|
+
// const headers = yield* Rpc.currentHeaders
|
|
45
|
+
const ctx = Context.empty()
|
|
46
|
+
|
|
47
|
+
// const config = "config" in schema ? schema.config : undefined
|
|
48
|
+
|
|
49
|
+
// Check JWT
|
|
50
|
+
// TODO
|
|
51
|
+
// if (!fakeLogin && !request.allowAnonymous) {
|
|
52
|
+
// yield* Effect.catchAll(
|
|
53
|
+
// checkJWTI({
|
|
54
|
+
// ...authConfig,
|
|
55
|
+
// issuer: authConfig.issuer + "/",
|
|
56
|
+
// jwksUri: `${authConfig.issuer}/.well-known/jwks.json`
|
|
57
|
+
// }),
|
|
58
|
+
// (err) => Effect.fail(new JWTError({ error: err }))
|
|
59
|
+
// )
|
|
60
|
+
// }
|
|
61
|
+
|
|
62
|
+
// const fakeLogin = true
|
|
63
|
+
// const r = (fakeLogin
|
|
64
|
+
// ? makeUserProfileFromUserHeader(headers["x-user"])
|
|
65
|
+
// : makeUserProfileFromAuthorizationHeader(
|
|
66
|
+
// headers["authorization"]
|
|
67
|
+
// ))
|
|
68
|
+
// .pipe(Effect.exit, basicRuntime.runSync)
|
|
69
|
+
// if (!Exit.isSuccess(r)) {
|
|
70
|
+
// yield* Effect.logWarning("Parsing userInfo failed").pipe(Effect.annotateLogs("r", r))
|
|
71
|
+
// }
|
|
72
|
+
// const userProfile = Option.fromNullable(Exit.isSuccess(r) ? r.value : undefined)
|
|
73
|
+
// if (Option.isSome(userProfile)) {
|
|
74
|
+
// // yield* rcc.update((_) => ({ ..._, userPorfile: userProfile.value }))
|
|
75
|
+
// ctx = ctx.pipe(Context.add(UserProfile, userProfile.value))
|
|
76
|
+
// } else if (!config?.allowAnonymous) {
|
|
77
|
+
// return yield* new NotLoggedInError({ message: "no auth" })
|
|
78
|
+
// }
|
|
79
|
+
|
|
80
|
+
// if (config?.requireRoles) {
|
|
81
|
+
// // TODO
|
|
82
|
+
// if (
|
|
83
|
+
// !userProfile.value
|
|
84
|
+
// || !config.requireRoles.every((role: any) => userProfile.value!.roles.includes(role))
|
|
85
|
+
// ) {
|
|
86
|
+
// return yield* new UnauthorizedError()
|
|
87
|
+
// }
|
|
88
|
+
// }
|
|
89
|
+
|
|
90
|
+
return yield* handler(req).pipe(
|
|
91
|
+
Effect.retry(optimisticConcurrencySchedule),
|
|
92
|
+
Effect.provide(ctx as Context.Context<GetEffectContext<CTXMap, T["config"]>>)
|
|
93
|
+
)
|
|
94
|
+
})
|
|
95
|
+
.pipe(
|
|
96
|
+
Effect.provide(
|
|
97
|
+
Effect
|
|
98
|
+
.gen(function*() {
|
|
99
|
+
yield* Effect.annotateCurrentSpan("request.name", moduleName ? `${moduleName}.${req._tag}` : req._tag)
|
|
100
|
+
// yield* RequestContextContainer.update((_) => ({
|
|
101
|
+
// ..._,
|
|
102
|
+
// name: NonEmptyString255(moduleName ? `${moduleName}.${req._tag}` : req._tag)
|
|
103
|
+
// }))
|
|
104
|
+
const httpReq = yield* HttpServerRequest.HttpServerRequest
|
|
105
|
+
// TODO: only pass Authentication etc, or move headers to actual Rpc Headers
|
|
106
|
+
yield* FiberRef.update(
|
|
107
|
+
Rpc.currentHeaders,
|
|
108
|
+
(headers) =>
|
|
109
|
+
HttpHeaders.merge(
|
|
110
|
+
httpReq.headers,
|
|
111
|
+
headers
|
|
112
|
+
)
|
|
113
|
+
)
|
|
114
|
+
})
|
|
115
|
+
.pipe(Layer.effectDiscard)
|
|
116
|
+
)
|
|
117
|
+
)
|
|
118
|
+
// .pipe(Effect.provide(RequestCacheLayers)) as any
|
|
119
|
+
})
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
export const { Router, matchAll, matchFor } = makeRouter(middleware, true)
|
|
123
|
+
|
|
124
|
+
export type RequestConfig = {
|
|
125
|
+
/** Disable authentication requirement */
|
|
126
|
+
allowAnonymous?: true
|
|
127
|
+
/** Control the roles that are required to access the resource */
|
|
128
|
+
allowRoles?: readonly string[]
|
|
129
|
+
}
|
|
130
|
+
export const { TaggedRequest: Req } = makeRpcClient<RequestConfig, CTXMap>({
|
|
131
|
+
// allowAnonymous: NotLoggedInError,
|
|
132
|
+
requireRoles: UnauthorizedError
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
export class GetSomething extends Req<GetSomething>()("GetSomething", {
|
|
136
|
+
id: S.String
|
|
137
|
+
}, { success: S.Void }) {}
|
|
138
|
+
|
|
139
|
+
export class GetSomethingElse extends Req<GetSomethingElse>()("GetSomethingElse", {
|
|
140
|
+
id: S.String
|
|
141
|
+
}, { success: S.String }) {}
|
|
142
|
+
|
|
143
|
+
const Something = { GetSomething, GetSomethingElse, meta: { moduleName: "Something" as const } }
|
|
144
|
+
|
|
145
|
+
export class SomethingService extends Effect.Service<SomethingService>()("SomethingService", {
|
|
146
|
+
dependencies: [],
|
|
147
|
+
effect: Effect.gen(function*() {
|
|
148
|
+
return {}
|
|
149
|
+
})
|
|
150
|
+
}) {}
|
|
151
|
+
|
|
152
|
+
declare const a: {
|
|
153
|
+
(opt: { a: 1 }): void
|
|
154
|
+
(opt: { a: 2 }): void
|
|
155
|
+
(opt: { b: 3 }): void
|
|
156
|
+
(opt: { b: 3 }): void
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export class SomethingRepo extends Effect.Service<SomethingRepo>()("SomethingRepo", {
|
|
160
|
+
dependencies: [SomethingService.Default],
|
|
161
|
+
effect: Effect.gen(function*() {
|
|
162
|
+
const smth = yield* SomethingService
|
|
163
|
+
console.log({ smth })
|
|
164
|
+
return {}
|
|
165
|
+
})
|
|
166
|
+
}) {}
|
|
167
|
+
|
|
168
|
+
export class SomethingService2 extends Effect.Service<SomethingService2>()("SomethingService2", {
|
|
169
|
+
dependencies: [],
|
|
170
|
+
effect: Effect.gen(function*() {
|
|
171
|
+
return {}
|
|
172
|
+
})
|
|
173
|
+
}) {}
|
|
174
|
+
|
|
175
|
+
it("router6", () => {
|
|
176
|
+
const routes = Router(Something)({
|
|
177
|
+
dependencies: [
|
|
178
|
+
SomethingRepo.Default,
|
|
179
|
+
SomethingService.Default,
|
|
180
|
+
SomethingService2.Default
|
|
181
|
+
],
|
|
182
|
+
effect: Effect.gen(function*() {
|
|
183
|
+
const repo = yield* SomethingRepo
|
|
184
|
+
const smth = yield* SomethingService
|
|
185
|
+
const smth2 = yield* SomethingService2
|
|
186
|
+
|
|
187
|
+
console.log({ repo, smth, smth2 })
|
|
188
|
+
|
|
189
|
+
return matchFor(Something)({
|
|
190
|
+
GetSomething: Effect.void,
|
|
191
|
+
GetSomethingElse: Effect.succeed("12")
|
|
192
|
+
})
|
|
193
|
+
})
|
|
194
|
+
})
|
|
195
|
+
console.log({ routes })
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
export default Router(Something)({
|
|
199
|
+
dependencies: [
|
|
200
|
+
SomethingRepo.Default,
|
|
201
|
+
SomethingService.Default,
|
|
202
|
+
SomethingService2.Default
|
|
203
|
+
],
|
|
204
|
+
effect: Effect.gen(function*() {
|
|
205
|
+
const repo = yield* SomethingRepo
|
|
206
|
+
const smth = yield* SomethingService
|
|
207
|
+
const smth2 = yield* SomethingService2
|
|
208
|
+
|
|
209
|
+
console.log({ repo, smth, smth2 })
|
|
210
|
+
|
|
211
|
+
return matchFor(Something)({
|
|
212
|
+
GetSomething: Effect.void,
|
|
213
|
+
GetSomethingElse: Effect.succeed("12")
|
|
214
|
+
})
|
|
215
|
+
})
|
|
216
|
+
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller6.test.d.ts","sourceRoot":"","sources":["../controller6.test.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAW,MAAM,EAAY,KAAK,EAAE,CAAC,EAAY,MAAM,YAAY,CAAA;AAC1E,OAAO,EAAwC,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC/G,OAAO,EAAe,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAOhE,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,MAAM,MAAM,GAAG;IAGnB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CACvF,CAAA;AAmGD,eAAO,MAAQ,QAAQ;;;;;
|
|
1
|
+
{"version":3,"file":"controller6.test.d.ts","sourceRoot":"","sources":["../controller6.test.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAW,MAAM,EAAY,KAAK,EAAE,CAAC,EAAY,MAAM,YAAY,CAAA;AAC1E,OAAO,EAAwC,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC/G,OAAO,EAAe,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAOhE,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,MAAM,MAAM,GAAG;IAGnB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CACvF,CAAA;AAmGD,eAAO,MAAQ,QAAQ;;;;;gBA0EqxD,MAAO,KAAK;;;;;;GA1E/xD,QAAQ;;;;;;iDA0E01F,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;iDAAk0D,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;iDAAk0D,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;iDAAk0D,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;iDAA6xD,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CA1EvmU,CAAA;AAElE,MAAM,MAAM,aAAa,GAAG;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,IAAI,CAAA;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B,CAAA;AACD,eAAO,MAAuB,GAAG;yCAxEE,EAAG,MAAM,CAAC,MAAM;iBAgCzC,EAAA,MA9BD,CA8BC,GA9BG,GA8BH,EAAA,MA5BF,CA4BE,MA5BK;iBA4BL,EAAA,MA3BA,CAAC,GAAG,GAAE,EAAG,MAAM,CAAC,MAAM;;;;;;2CASkB,EAAG,MAAM,CAAC,MAAM;iBAkBxD,EAjBC,MAAM,CAAC,GAAG,GAAE,EAAG,MAAM,CAAC,MAAM;;;;;;2CAUtB,EAAE,MAAM,CAAC,MAAM;iBACA,EAAG,MAAM,CAAC,GAAG,GAAE,EAAG,MAAM,CAAC,MAAM;;;;;;2CAcjD,EAAA,MAAE,CAAC,MAAM;;;;;2CAMqC,EAAG,MAAM,CAAC,MACrE;;;CA4BC,CAAA;;;;;;;;;;AAEF,qBAAa,YAAa,SAAQ,iBAEX;CAAG;;;;;;;;;;AAE1B,qBAAa,gBAAiB,SAAQ,qBAEb;CAAG;;;;;AAI5B,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG;;;;;AASL,qBAAa,aAAc,SAAQ,kBAOjC;CAAG;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller7.test.d.ts","sourceRoot":"","sources":["../controller7.test.ts"],"names":[],"mappings":"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"}
|