@effect-app/infra 0.133.0-next.9 → 0.133.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 +494 -0
- package/_cjs/RequestContext.cjs +8 -9
- package/_cjs/RequestContext.cjs.map +1 -1
- package/_cjs/_ext/Array.cjs +4 -3
- package/_cjs/_ext/Array.cjs.map +1 -1
- package/_cjs/_global.ext.cjs +0 -25
- package/_cjs/_global.ext.cjs.map +1 -1
- package/_cjs/api/codec.cjs +1 -1
- package/_cjs/api/codec.cjs.map +1 -1
- package/_cjs/api/http.cjs +42 -0
- package/_cjs/api/http.cjs.map +1 -0
- package/_cjs/api/routing/base.cjs +169 -0
- package/_cjs/api/routing/base.cjs.map +1 -0
- package/_cjs/api/routing/defaultErrorHandler.cjs +50 -0
- package/_cjs/api/routing/defaultErrorHandler.cjs.map +1 -0
- package/_cjs/api/routing/makeRequestHandler.cjs +134 -0
- package/_cjs/api/routing/makeRequestHandler.cjs.map +1 -0
- package/_cjs/api/routing/match.cjs +45 -0
- package/_cjs/api/routing/match.cjs.map +1 -0
- package/_cjs/api/routing.cjs +50 -0
- package/_cjs/api/routing.cjs.map +1 -0
- package/_cjs/api/setupRequest.cjs +31 -30
- package/_cjs/api/setupRequest.cjs.map +1 -1
- package/_cjs/errorReporter.cjs +4 -2
- package/_cjs/errorReporter.cjs.map +1 -1
- package/_cjs/errors.cjs +18 -66
- package/_cjs/errors.cjs.map +1 -1
- package/_cjs/services/Operations/live.cjs +11 -12
- package/_cjs/services/Operations/live.cjs.map +1 -1
- package/_cjs/services/QueueMaker/memQueue.cjs +9 -10
- package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/sbqueue.cjs +4 -4
- package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
- package/_cjs/services/Repository.cjs +3 -3
- package/_cjs/services/Repository.cjs.map +1 -1
- package/_cjs/services/RepositoryBase.cjs +14 -6
- package/_cjs/services/RepositoryBase.cjs.map +1 -1
- package/_cjs/services/RequestContextContainer.cjs +3 -3
- package/_cjs/services/RequestContextContainer.cjs.map +1 -1
- package/_cjs/services/Store/Redis.cjs.map +1 -1
- package/_cjs/test.arbs.cjs +24 -1
- package/_cjs/test.arbs.cjs.map +1 -1
- package/_src/RequestContext.ts +9 -12
- package/_src/_ext/Array.ts +4 -4
- package/_src/_global.ext.ts +0 -23
- package/_src/api/codec.ts +1 -1
- package/_src/api/http.ts +26 -0
- package/_src/api/routing/base.ts +476 -0
- package/_src/api/routing/defaultErrorHandler.ts +83 -0
- package/_src/api/routing/makeRequestHandler.ts +278 -0
- package/_src/api/routing/match.ts +119 -0
- package/_src/api/routing.ts +11 -0
- package/_src/api/setupRequest.ts +39 -34
- package/_src/errorReporter.ts +4 -2
- package/_src/errors.ts +1 -58
- package/_src/services/QueueMaker/memQueue.ts +3 -3
- package/_src/services/QueueMaker/sbqueue.ts +3 -3
- package/_src/services/Repository.ts +40 -43
- package/_src/services/RepositoryBase.ts +26 -20
- package/_src/services/Store/Redis.ts +1 -1
- package/_src/services/Store/service.ts +4 -4
- package/_src/test.arbs.ts +17 -14
- package/dist/RequestContext.d.ts +72 -24
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +10 -11
- package/dist/_ext/Array.d.ts +2 -2
- package/dist/_ext/Array.d.ts.map +1 -1
- package/dist/_ext/Array.js +5 -4
- package/dist/_global.ext.d.ts +0 -22
- package/dist/_global.ext.d.ts.map +1 -1
- package/dist/_global.ext.js +1 -18
- package/dist/api/codec.d.ts +1 -1
- package/dist/api/codec.d.ts.map +1 -1
- package/dist/api/codec.js +2 -2
- package/dist/api/http.d.ts +16 -0
- package/dist/api/http.d.ts.map +1 -0
- package/dist/api/http.js +12 -0
- package/dist/api/routing/base.d.ts +117 -0
- package/dist/api/routing/base.d.ts.map +1 -0
- package/dist/api/routing/base.js +137 -0
- package/dist/api/routing/defaultErrorHandler.d.ts +16 -0
- package/dist/api/routing/defaultErrorHandler.d.ts.map +1 -0
- package/dist/api/routing/defaultErrorHandler.js +42 -0
- package/dist/api/routing/makeRequestHandler.d.ts +20 -0
- package/dist/api/routing/makeRequestHandler.d.ts.map +1 -0
- package/dist/api/routing/makeRequestHandler.js +121 -0
- package/dist/api/routing/match.d.ts +12 -0
- package/dist/api/routing/match.d.ts.map +1 -0
- package/dist/api/routing/match.js +31 -0
- package/dist/api/routing.d.ts +5 -0
- package/dist/api/routing.d.ts.map +1 -0
- package/dist/api/routing.js +8 -0
- package/dist/api/setupRequest.d.ts +4 -4
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +31 -37
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +5 -3
- package/dist/errors.d.ts +1 -81
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +4 -46
- package/dist/services/Operations/live.js +16 -17
- 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 +9 -10
- package/dist/services/QueueMaker/sbqueue.d.ts +3 -3
- package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/sbqueue.js +4 -4
- package/dist/services/QueueMaker/service.d.ts +1 -1
- package/dist/services/Repository.d.ts +37 -38
- package/dist/services/Repository.d.ts.map +1 -1
- package/dist/services/Repository.js +4 -4
- package/dist/services/RepositoryBase.d.ts +16 -16
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +12 -7
- package/dist/services/RequestContextContainer.d.ts +1 -1
- package/dist/services/RequestContextContainer.js +3 -3
- package/dist/services/Store/Redis.js +1 -1
- package/dist/services/Store/service.d.ts +4 -4
- package/dist/services/Store/service.d.ts.map +1 -1
- package/dist/services/simpledb/cosmosdb.d.ts +2 -2
- package/dist/services/simpledb/diskdb.d.ts +2 -2
- package/dist/services/simpledb/memdb.d.ts +2 -2
- package/dist/services/simpledb/mongodb.d.ts +2 -2
- package/dist/services/simpledb/redisdb.d.ts +10 -6
- package/dist/services/simpledb/redisdb.d.ts.map +1 -1
- package/dist/services/simpledb/shared.d.ts +10 -6
- package/dist/services/simpledb/shared.d.ts.map +1 -1
- package/dist/services/simpledb/simpledb.d.ts +3 -3
- package/dist/test.arbs.d.ts +12 -1
- package/dist/test.arbs.d.ts.map +1 -1
- package/dist/test.arbs.js +18 -2
- package/package.json +73 -11
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as tsplus_module_1 from "effect/Effect";
|
|
2
|
+
import * as tsplus_module_2 from "effect/Exit";
|
|
3
|
+
import * as tsplus_module_3 from "effect/Cause";
|
|
4
|
+
import * as tsplus_module_4 from "@effect-app/core/Function";
|
|
5
|
+
import * as tsplus_module_5 from "effect/Option";
|
|
6
|
+
import * as tsplus_module_6 from "@effect-app/core/Effect";
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
8
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
9
|
+
import * as S from "@effect-app/schema";
|
|
10
|
+
import { ValidationError } from "@effect-app/infra/errors";
|
|
11
|
+
// function getErrorMessage(current: ContextEntry) {
|
|
12
|
+
// switch (current.type.name) {
|
|
13
|
+
// case "NonEmptyString":
|
|
14
|
+
// return "Must not be empty"
|
|
15
|
+
// }
|
|
16
|
+
// if (current.type.name?.startsWith("NonEmptyReadonlyArray<")) {
|
|
17
|
+
// return "Must not be empty"
|
|
18
|
+
// }
|
|
19
|
+
// return `Invalid value specified`
|
|
20
|
+
// }
|
|
21
|
+
export function decodeErrors(x) {
|
|
22
|
+
return [x];
|
|
23
|
+
}
|
|
24
|
+
// const ValidationApplicative = Effect.getValidationApplicative(
|
|
25
|
+
// makeAssociative<ReadonlyArray<{ type: string; errors: ReturnType<typeof decodeErrors> }>>(
|
|
26
|
+
// (l, r) => l.concat(r)
|
|
27
|
+
// )
|
|
28
|
+
// )
|
|
29
|
+
// const structValidation = DSL.structF(ValidationApplicative)
|
|
30
|
+
export function parseRequestParams(parsers) {
|
|
31
|
+
return ({ body, cookies, headers, params, query }) => tsplus_module_1.flatMap(tsplus_module_1.all({
|
|
32
|
+
body: tsplus_module_1.flatMap(tsplus_module_1.exit(parsers
|
|
33
|
+
.parseBody(body)), (_) => tsplus_module_2.isFailure(_) && !tsplus_module_3.isFailure(_.cause)
|
|
34
|
+
? tsplus_module_1.failCauseSync(() => _.cause)
|
|
35
|
+
: tsplus_module_1.sync(() => tsplus_module_2.isSuccess(_)
|
|
36
|
+
? { _tag: "Success", value: _.value }
|
|
37
|
+
: { _tag: "Failure", errors: tsplus_module_3.failures(_.cause) })),
|
|
38
|
+
cookie: tsplus_module_1.flatMap(tsplus_module_1.exit(parsers
|
|
39
|
+
.parseCookie(cookies)), (_) => tsplus_module_2.isFailure(_) && !tsplus_module_3.isFailure(_.cause)
|
|
40
|
+
? tsplus_module_1.failCauseSync(() => _.cause)
|
|
41
|
+
: tsplus_module_1.sync(() => tsplus_module_2.isSuccess(_)
|
|
42
|
+
? { _tag: "Success", value: _.value }
|
|
43
|
+
: { _tag: "Failure", errors: tsplus_module_3.failures(_.cause) })),
|
|
44
|
+
headers: tsplus_module_1.flatMap(tsplus_module_1.exit(parsers
|
|
45
|
+
.parseHeaders(headers)), (_) => tsplus_module_2.isFailure(_) && !tsplus_module_3.isFailure(_.cause)
|
|
46
|
+
? tsplus_module_1.failCauseSync(() => _.cause)
|
|
47
|
+
: tsplus_module_1.sync(() => tsplus_module_2.isSuccess(_)
|
|
48
|
+
? { _tag: "Success", value: _.value }
|
|
49
|
+
: { _tag: "Failure", errors: tsplus_module_3.failures(_.cause) })),
|
|
50
|
+
query: tsplus_module_1.flatMap(tsplus_module_1.exit(parsers
|
|
51
|
+
.parseQuery(query)), (_) => tsplus_module_2.isFailure(_) && !tsplus_module_3.isFailure(_.cause)
|
|
52
|
+
? tsplus_module_1.failCauseSync(() => _.cause)
|
|
53
|
+
: tsplus_module_1.sync(() => tsplus_module_2.isSuccess(_)
|
|
54
|
+
? { _tag: "Success", value: _.value }
|
|
55
|
+
: { _tag: "Failure", errors: tsplus_module_3.failures(_.cause) })),
|
|
56
|
+
path: tsplus_module_1.flatMap(tsplus_module_1.exit(parsers
|
|
57
|
+
.parsePath(params)), (_) => tsplus_module_2.isFailure(_) && !tsplus_module_3.isFailure(_.cause)
|
|
58
|
+
? tsplus_module_1.failCauseSync(() => _.cause)
|
|
59
|
+
: tsplus_module_1.sync(() => tsplus_module_2.isSuccess(_)
|
|
60
|
+
? { _tag: "Success", value: _.value }
|
|
61
|
+
: { _tag: "Failure", errors: tsplus_module_3.failures(_.cause) }))
|
|
62
|
+
}), ({ body, cookie, headers, path, query }) => {
|
|
63
|
+
const errors = [];
|
|
64
|
+
if (body._tag === "Failure") {
|
|
65
|
+
errors.push(makeError("body")(body.errors));
|
|
66
|
+
}
|
|
67
|
+
if (cookie._tag === "Failure") {
|
|
68
|
+
errors.push(makeError("cookie")(cookie.errors));
|
|
69
|
+
}
|
|
70
|
+
if (headers._tag === "Failure") {
|
|
71
|
+
errors.push(makeError("headers")(headers.errors));
|
|
72
|
+
}
|
|
73
|
+
if (path._tag === "Failure") {
|
|
74
|
+
errors.push(makeError("path")(path.errors));
|
|
75
|
+
}
|
|
76
|
+
if (query._tag === "Failure") {
|
|
77
|
+
errors.push(makeError("query")(query.errors));
|
|
78
|
+
}
|
|
79
|
+
if (errors.length) {
|
|
80
|
+
return new ValidationError({ errors });
|
|
81
|
+
}
|
|
82
|
+
return tsplus_module_1.sync(() => ({
|
|
83
|
+
body: body.value,
|
|
84
|
+
cookie: cookie.value,
|
|
85
|
+
headers: headers.value,
|
|
86
|
+
path: path.value,
|
|
87
|
+
query: query.value
|
|
88
|
+
}));
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
92
|
+
// function mapErrors_<E, NE, NER extends Record<string, Effect<any, E, any>>>(
|
|
93
|
+
// t: NER, // TODO: enforce non empty
|
|
94
|
+
// mapErrors: (k: keyof NER) => (err: E) => NE
|
|
95
|
+
// ): {
|
|
96
|
+
// [K in keyof NER]: Effect<_R<NER[K]>, NE, Effect.Success<NER[K]>>
|
|
97
|
+
// } {
|
|
98
|
+
// return typedKeysOf(t).reduce(
|
|
99
|
+
// (prev, cur) => {
|
|
100
|
+
// prev[cur] = t[cur].mapError(mapErrors(cur))
|
|
101
|
+
// return prev
|
|
102
|
+
// },
|
|
103
|
+
// {} as {
|
|
104
|
+
// [K in keyof NER]: Effect<_R<NER[K]>, NE, Effect.Success<NER[K]>>
|
|
105
|
+
// }
|
|
106
|
+
// )
|
|
107
|
+
// }
|
|
108
|
+
function makeError(type) {
|
|
109
|
+
return (e) => [{ type, errors: decodeErrors(e) }];
|
|
110
|
+
}
|
|
111
|
+
export function respondSuccess(encodeResponse) {
|
|
112
|
+
return (req, res) => tsplus_module_4.flow(encodeResponse(req), tsplus_module_1.succeed, (_) => tsplus_module_1.flatMap(_, (r) => tsplus_module_1.sync(() => {
|
|
113
|
+
r === undefined
|
|
114
|
+
? res.status(204).send()
|
|
115
|
+
: res.status(200).send(JSON.stringify(r));
|
|
116
|
+
})));
|
|
117
|
+
}
|
|
118
|
+
export function makeRequestParsers(Request) {
|
|
119
|
+
const ph = tsplus_module_1.sync(() => tsplus_module_5.map(tsplus_module_5.map(tsplus_module_5.fromNullable(Request.Headers), (s) => s), S.parse));
|
|
120
|
+
const parseHeaders = (u) => tsplus_module_6.flatMapOption(ph, (d) => d(u));
|
|
121
|
+
const pq = tsplus_module_1.sync(() => tsplus_module_5.map(tsplus_module_5.map(tsplus_module_5.fromNullable(Request.Query), (s) => s), S.parse));
|
|
122
|
+
const parseQuery = (u) => tsplus_module_6.flatMapOption(pq, (d) => d(u));
|
|
123
|
+
const pb = tsplus_module_1.sync(() => tsplus_module_5.map(tsplus_module_5.map(tsplus_module_5.fromNullable(Request.Body), (s) => s), S.parse));
|
|
124
|
+
const parseBody = (u) => tsplus_module_6.flatMapOption(pb, (d) => d(u));
|
|
125
|
+
const pp = tsplus_module_1.sync(() => tsplus_module_5.map(tsplus_module_5.map(tsplus_module_5.fromNullable(Request.Path), (s) => s), S.parse));
|
|
126
|
+
const parsePath = (u) => tsplus_module_6.flatMapOption(pp, (d) => d(u));
|
|
127
|
+
const pc = tsplus_module_1.sync(() => tsplus_module_5.map(tsplus_module_5.map(tsplus_module_5.fromNullable(Request.Cookie), (s) => s), S.parse));
|
|
128
|
+
const parseCookie = (u) => tsplus_module_6.flatMapOption(pc, (d) => d(u));
|
|
129
|
+
return {
|
|
130
|
+
parseBody,
|
|
131
|
+
parseCookie,
|
|
132
|
+
parseHeaders,
|
|
133
|
+
parsePath,
|
|
134
|
+
parseQuery
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL19zcmMvYXBpL3JvdXRpbmcvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1REFBdUQ7QUFFdkQsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxDQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFHdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFBO0FBb0cxRCxvREFBb0Q7QUFDcEQsaUNBQWlDO0FBQ2pDLDZCQUE2QjtBQUM3QixtQ0FBbUM7QUFDbkMsTUFBTTtBQUNOLG1FQUFtRTtBQUNuRSxpQ0FBaUM7QUFDakMsTUFBTTtBQUNOLHFDQUFxQztBQUNyQyxJQUFJO0FBQ0osTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFVO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNaLENBQUM7QUFFRCxpRUFBaUU7QUFDakUsK0ZBQStGO0FBQy9GLDRCQUE0QjtBQUM1QixNQUFNO0FBQ04sSUFBSTtBQUVKLDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsa0JBQWtCLENBT2hDLE9BQStEO0lBRS9ELE9BQU8sQ0FDTCxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBTXRDLEVBQ0QsRUFBRSxDQUNGLHdCQUFBLG9CQUNPO1FBQ0gsSUFBSSxFQUFFLDZDQUFBLE9BQU87YUFDVixTQUFTLENBQUMsSUFBSSxDQUFDLEdBRVAsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNiLDBCQUFBLENBQUMsQ0FBWSxJQUFJLENBQUMsMEJBQUEsQ0FBQyxDQUFDLEtBQUssQ0FBWTtZQUNuQyxDQUFDLENBQUUsOEJBQXFCLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQTJDO1lBQ2hGLENBQUMsQ0FBQywyQkFDQSwwQkFBQSxDQUFDLENBQVk7Z0JBQ1gsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQWtCLEVBQUUs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QyxPQWVZO0lBRVosTUFBTSxFQUFFLEdBQUcsMkJBQ1Qsb0JBQUEsb0JBQUEsNkJBQ2dCLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFDekIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQWdDLENBQUMsRUFDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUNoQixDQUFBO0lBQ0QsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFVLEVBQUUsRUFBRSxDQUFDLDhCQUFBLEVBQUUsRUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFL0QsTUFBTSxFQUFFLEdBQUcsMkJBQ1Qsb0JBQUEsb0JBQUEsNkJBQ2dCLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFDdkIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQWdDLENBQUMsRUFDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUNoQixDQUFBO0lBQ0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFVLEVBQUUsRUFBRSxDQUFDLDhCQUFBLEVBQUUsRUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFN0QsTUFBTSxFQUFFLEdBQUcsMkJBQ1Qsb0JBQUEsb0JBQUEsNkJBQ2dCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDdEIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQWdDLENBQUMsRUFDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUNoQixDQUFBO0lBQ0QsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFVLEVBQUUsRUFBRSxDQUFDLDhCQUFBLEVBQUUsRUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFNUQsTUFBTSxFQUFFLEdBQUcsMkJBQ1Qsb0JBQUEsb0JBQUEsNkJBQ2dCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDdEIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQWdDLENBQUMsRUFDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUNoQixDQUFBO0lBQ0QsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFVLEVBQUUsRUFBRSxDQUFDLDhCQUFBLEVBQUUsRUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFNUQsTUFBTSxFQUFFLEdBQUcsMkJBQ1Qsb0JBQUEsb0JBQUEsNkJBQ2dCLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDeEIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQWdDLENBQUMsRUFDeEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUNoQixDQUFBO0lBQ0QsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFVLEVBQUUsRUFBRSxDQUFDLDhCQUFBLEVBQUUsRUFBWSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFOUQsT0FBTztRQUNMLFNBQVM7UUFDVCxXQUFXO1FBQ1gsWUFBWTtRQUNaLFNBQVM7UUFDVCxVQUFVO0tBQ1gsQ0FBQTtBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Data } from "effect/Data";
|
|
2
|
+
import { Effect } from "effect/Effect";
|
|
3
|
+
import type { SupportedErrors, ValidationError } from "@effect-app/prelude/client/errors";
|
|
4
|
+
import { type HttpServerRequest, type HttpServerResponse } from "../http.js";
|
|
5
|
+
import type { InsufficientScopeError, InvalidRequestError, InvalidTokenError, UnauthorizedError as JWTUnauthorizedError } from "express-oauth2-jwt-bearer";
|
|
6
|
+
declare const JWTError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<Omit<A, keyof import("effect/Equal").Equal>, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" | keyof import("effect/Equal").Equal ? never : P]: A[P]; }) => import("effect/Data").Data<Readonly<A> & {
|
|
7
|
+
readonly _tag: "JWTError";
|
|
8
|
+
}>;
|
|
9
|
+
export declare class JWTError extends JWTError_base<{
|
|
10
|
+
error: InsufficientScopeError | InvalidRequestError | InvalidTokenError | JWTUnauthorizedError;
|
|
11
|
+
}> {
|
|
12
|
+
}
|
|
13
|
+
export declare function defaultBasicErrorHandler<R>(_req: HttpServerRequest, res: HttpServerResponse, r2: Effect<R, ValidationError, HttpServerResponse>): import("effect/Effect").Effect<R, never, HttpServerResponse>;
|
|
14
|
+
export declare function defaultErrorHandler<R>(req: HttpServerRequest, res: HttpServerResponse, r2: Effect<R, SupportedErrors | JWTError, HttpServerResponse>): import("effect/Effect").Effect<R, never, HttpServerResponse>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=defaultErrorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultErrorHandler.d.ts","sourceRoot":"","sources":["../../../_src/api/routing/defaultErrorHandler.ts"],"names":[],"mappings":";;AACA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AACzF,OAAO,EAAyB,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEnG,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,IAAI,oBAAoB,EAC1C,MAAM,2BAA2B,CAAA;;;;AAElC,qBAAa,QAAS,SAAQ,cAA6B;IACzD,KAAK,EACD,sBAAsB,GACtB,mBAAmB,GACnB,iBAAiB,GACjB,oBAAoB,CAAA;CACzB,CAAC;CAAG;AAIL,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,IAAI,EAAE,iBAAiB,EACvB,GAAG,EAAE,kBAAkB,EACvB,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,eAAe,EAAE,kBAAkB,CAAC,gEAenD;AAKD,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,kBAAkB,EACvB,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,eAAe,GAAG,QAAQ,EAAE,kBAAkB,CAAC,gEAmC9D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as tsplus_module_1 from "effect/Data";
|
|
2
|
+
import * as tsplus_module_2 from "@effect/platform/Http/Body";
|
|
3
|
+
import * as tsplus_module_3 from "@effect/platform/Http/ServerResponse";
|
|
4
|
+
import * as tsplus_module_4 from "effect/Effect";
|
|
5
|
+
import * as tsplus_module_5 from "effect/Cause";
|
|
6
|
+
import * as tsplus_module_6 from "effect/Schedule";
|
|
7
|
+
import { logError } from "@effect-app/infra/errorReporter";
|
|
8
|
+
import { HttpHeaders } from "../http.js";
|
|
9
|
+
export class JWTError extends tsplus_module_1.TaggedClass("JWTError") {
|
|
10
|
+
}
|
|
11
|
+
const logRequestError = logError("Request");
|
|
12
|
+
export function defaultBasicErrorHandler(_req, res, r2) {
|
|
13
|
+
const sendError = (code) => (body) => tsplus_module_4.sync(() => tsplus_module_3.setStatus(code)(tsplus_module_3.setBody(res, tsplus_module_2.unsafeJson(body))));
|
|
14
|
+
return tsplus_module_4.catchAll(tsplus_module_4.catchTag(tsplus_module_4.tapErrorCause(r2, (cause) => tsplus_module_5.isFailure(cause) ? logRequestError(cause) : tsplus_module_4.unit), "ValidationError", (err) => sendError(400)(err.errors))
|
|
15
|
+
// final catch all; expecting never so that unhandled known errors will show up
|
|
16
|
+
, (err) => tsplus_module_4.flatMap(tsplus_module_4.map(tsplus_module_4.logError("Program error, compiler probably silenced, got an unsupported Error in Error Channel of Effect" + err), () => err), tsplus_module_4.die));
|
|
17
|
+
}
|
|
18
|
+
const optimisticConcurrencySchedule = tsplus_module_6.intersect(tsplus_module_6.recurWhile((a) => a._tag === "OptimisticConcurrencyException"))(tsplus_module_6.once);
|
|
19
|
+
export function defaultErrorHandler(req, res, r2) {
|
|
20
|
+
const r3 = req.method === "PATCH"
|
|
21
|
+
? tsplus_module_4.retry(r2, optimisticConcurrencySchedule)
|
|
22
|
+
: r2;
|
|
23
|
+
const sendError = (code) => (body) => tsplus_module_4.sync(() => tsplus_module_3.setBody(tsplus_module_3.setStatus(code)(res), tsplus_module_2.unsafeJson(body)));
|
|
24
|
+
return tsplus_module_4.catchAll(tsplus_module_4.catchTags(tsplus_module_4.tapErrorCause(r3, (cause) => tsplus_module_5.isFailure(cause) ? logRequestError(cause) : tsplus_module_4.unit), {
|
|
25
|
+
"JWTError": (err) => tsplus_module_4.succeed(tsplus_module_3.unsafeJson({ message: err.error.message }, {
|
|
26
|
+
status: err
|
|
27
|
+
.error
|
|
28
|
+
.status,
|
|
29
|
+
headers: HttpHeaders.fromInput(err.error.headers)
|
|
30
|
+
})),
|
|
31
|
+
"ValidationError": (err) => sendError(400)(err.errors),
|
|
32
|
+
"NotFoundError": sendError(404),
|
|
33
|
+
"NotLoggedInError": sendError(401),
|
|
34
|
+
"UnauthorizedError": sendError(403),
|
|
35
|
+
"InvalidStateError": sendError(422),
|
|
36
|
+
// 412 or 409.. https://stackoverflow.com/questions/19122088/which-http-status-code-to-use-to-reject-a-put-due-to-optimistic-locking-failure
|
|
37
|
+
"OptimisticConcurrencyException": sendError(412)
|
|
38
|
+
})
|
|
39
|
+
// final catch all; expecting never so that unhandled known errors will show up
|
|
40
|
+
, (err) => tsplus_module_4.flatMap(tsplus_module_4.map(tsplus_module_4.logError("Program error, compiler probably silenced, got an unsupported Error in Error Channel of Effect" + err), () => err), tsplus_module_4.die));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdEVycm9ySGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL19zcmMvYXBpL3JvdXRpbmcvZGVmYXVsdEVycm9ySGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFFMUQsT0FBTyxFQUFZLFdBQVcsRUFBbUQsTUFBTSxZQUFZLENBQUE7QUFTbkcsTUFBTSxPQUFPLFFBQVMsU0FBUSw0QkFBaUIsVUFBVSxDQU12RDtDQUFHO0FBRUwsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBRTNDLE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsSUFBdUIsRUFDdkIsR0FBdUIsRUFDdkIsRUFBa0Q7SUFFbEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBYSxFQUFFLEVBQUUsQ0FBQywyQkFBTywwQkFBaUQsSUFBSSxFQUFyRCx3QkFBQSxHQUFHLEVBQVMsMkJBQW9CLElBQUksQ0FBQyxDQUFDLENBQWdCLENBQUMsQ0FBQTtJQUNySCxPQUFPLHlCQUFBLHlCQUFBLDhCQUFBLEVBQUUsRUFDUSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsMEJBQUEsS0FBSyxDQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHFCQUFZLENBQUMsRUFDekUsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakUsK0VBQStFO01BQ3JFLENBQUMsR0FBVSxFQUFFLEVBQUUsQ0FDdkIsd0JBQUEsb0JBQUEseUJBRUksZ0dBQWdHLEdBQUcsR0FBRyxDQUN2RyxFQUNJLEdBQUcsRUFBRSxDQUFDLEdBQWMsQ0FBQyxzQkFDTixDQUN2QixDQUFBO0FBQ0wsQ0FBQztBQUVELE1BQU0sNkJBQTZCLDZCQUM5QiwyQkFBZ0QsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssZ0NBQWdDLENBQUMsdUJBQUEsQ0FBQTtBQUV4RyxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEdBQXNCLEVBQ3RCLEdBQXVCLEVBQ3ZCLEVBQTZEO0lBRTdELE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEtBQUssT0FBTztRQUMvQixDQUFDLENBQUMsc0JBQUEsRUFBRSxFQUFPLDZCQUE2QixDQUFDO1FBQ3pDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDTixNQUFNLFNBQVMsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFhLEVBQUUsRUFBRSxDQUFDLDJCQUFPLHdCQUFBLDBCQUFjLElBQUksRUFBbEIsR0FBRyxDQUFnQixFQUFTLDJCQUFvQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckgsT0FBTyx5QkFBQSwwQkFBQSw4QkFBQSxFQUFFLEVBQ1EsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLDBCQUFBLEtBQUssQ0FBWSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxxQkFBWSxDQUFDLEVBQ3hFO1FBQ1QsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDbEIsd0JBQ0UsMkJBQThCLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDNUQsTUFBTSxFQUFFLEdBQUc7aUJBQ1IsS0FBSztpQkFDTCxNQUFNO1lBQ1QsT0FBTyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDbEQsQ0FBQyxDQUNIO1FBQ0gsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ3RELGVBQWUsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQy9CLGtCQUFrQixFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDbEMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUNuQyxtQkFBbUIsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ25DLDRJQUE0STtRQUM1SSxnQ0FBZ0MsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDO0tBQ2pELENBQUM7SUFDRiwrRUFBK0U7TUFDckUsQ0FBQyxHQUFVLEVBQUUsRUFBRSxDQUN2Qix3QkFBQSxvQkFBQSx5QkFFSSxnR0FBZ0csR0FBRyxHQUFHLENBQ3ZHLEVBQ0ksR0FBRyxFQUFFLENBQUMsR0FBYyxDQUFDLHNCQUNOLENBQ3ZCLENBQUE7QUFDTCxDQUFDIn0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Layer } from "effect/Layer";
|
|
2
|
+
import { Effect } from "effect/Effect";
|
|
3
|
+
import { Schema } from "@effect-app/schema";
|
|
4
|
+
import type { EnforceNonEmptyRecord } from "@effect-app/core/utils";
|
|
5
|
+
import type { ValidationError } from "@effect-app/infra/errors";
|
|
6
|
+
import type { RequestContextContainer } from "@effect-app/infra/services/RequestContextContainer";
|
|
7
|
+
import type { ContextMapContainer } from "@effect-app/infra/services/Store/ContextMapContainer";
|
|
8
|
+
import type { StructFields } from "@effect-app/schema";
|
|
9
|
+
import type { HttpRequestError } from "../http.js";
|
|
10
|
+
import { HttpRouteContext, HttpServerRequest, HttpServerResponse } from "../http.js";
|
|
11
|
+
import type { RequestHandler, RequestHandlerBase } from "./base.js";
|
|
12
|
+
export declare const RequestSettings: import("effect/FiberRef").FiberRef<{
|
|
13
|
+
verbose: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
export type Middleware<R, M, PathA extends StructFields, CookieA extends StructFields, QueryA extends StructFields, BodyA extends StructFields, HeaderA extends StructFields, ReqA extends PathA & QueryA & BodyA, ResA extends StructFields, ResE, MiddlewareE, PPath extends `/${string}`, R2, PR, CTX, Context, Config> = (handler: RequestHandler<R, M, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, ResE, PPath, CTX, Context, Config>) => {
|
|
16
|
+
handler: RequestHandler<Exclude<R2, HttpServerRequest> | PR | RequestContextContainer | ContextMapContainer, M, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, ResE, PPath, CTX, Context, Config>;
|
|
17
|
+
makeRequestLayer: Layer<R2, MiddlewareE, PR>;
|
|
18
|
+
};
|
|
19
|
+
export declare function makeRequestHandler<R, M, PathA extends StructFields, CookieA extends StructFields, QueryA extends StructFields, BodyA extends StructFields, HeaderA extends StructFields, ReqA extends PathA & QueryA & BodyA, ResA extends StructFields, ResE, MiddlewareE, R2, PR, RErr, PPath extends `/${string}`, Config>(handler: RequestHandlerBase<R, M, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, ResE, PPath, Config>, errorHandler: <R>(req: HttpServerRequest, res: HttpServerResponse, r2: Effect<R, ValidationError | ResE | MiddlewareE, HttpServerResponse>) => Effect<RErr | R, never, HttpServerResponse>, middlewareLayer?: Layer<R2, MiddlewareE, PR>): Effect<HttpRouteContext | HttpServerRequest | RequestContextContainer | ContextMapContainer | RErr | Exclude<Exclude<R, EnforceNonEmptyRecord<M>>, PR> | R2, HttpRequestError, HttpServerResponse>;
|
|
20
|
+
//# sourceMappingURL=makeRequestHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"makeRequestHandler.d.ts","sourceRoot":"","sources":["../../../_src/api/routing/makeRequestHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import * as tsplus_module_1 from "effect/FiberRef";
|
|
2
|
+
import * as tsplus_module_2 from "@effect-app/schema";
|
|
3
|
+
import * as tsplus_module_3 from "@effect/schema/Parser";
|
|
4
|
+
import * as tsplus_module_4 from "effect/Effect";
|
|
5
|
+
import * as tsplus_module_5 from "@effect-app/core/Option";
|
|
6
|
+
import * as tsplus_module_6 from "@effect-app/prelude/utils";
|
|
7
|
+
import * as tsplus_module_7 from "@effect/platform/Http/ServerResponse";
|
|
8
|
+
import * as tsplus_module_8 from "@effect/platform/Http/Body";
|
|
9
|
+
import * as tsplus_module_9 from "@effect-app/infra/api/setupRequest";
|
|
10
|
+
import { pretty } from "@effect-app/core/utils";
|
|
11
|
+
import { snipString } from "@effect-app/infra/api/util";
|
|
12
|
+
import { reportError } from "@effect-app/infra/errorReporter";
|
|
13
|
+
import { AST } from "@effect-app/schema";
|
|
14
|
+
import { HttpRouteContext, HttpServerRequest } from "../http.js";
|
|
15
|
+
import { makeRequestParsers, parseRequestParams } from "./base.js";
|
|
16
|
+
export const RequestSettings = tsplus_module_1.unsafeMake({
|
|
17
|
+
verbose: false
|
|
18
|
+
});
|
|
19
|
+
export function makeRequestHandler(handler, errorHandler, middlewareLayer) {
|
|
20
|
+
const { Request, Response, h: handle } = handler;
|
|
21
|
+
const response = Response ? Response : tsplus_module_2.Void;
|
|
22
|
+
const resp = response;
|
|
23
|
+
// TODO: consider if the alternative of using the struct schema is perhaps just better.
|
|
24
|
+
const encoder = "struct" in resp && resp.struct
|
|
25
|
+
? tsplus_module_3.encodeSync(resp.struct)
|
|
26
|
+
// ? (i: any) => {
|
|
27
|
+
// if (i instanceof (response as any)) return response.encodeSync(i)
|
|
28
|
+
// else return response.encodeSync(new (response as any)(i))
|
|
29
|
+
// }
|
|
30
|
+
: tsplus_module_3.encodeSync(resp);
|
|
31
|
+
// const encodeResponse = adaptResponse
|
|
32
|
+
// ? (req: ReqA) => Encoder.for(adaptResponse(req))
|
|
33
|
+
// : () => encoder
|
|
34
|
+
const requestParsers = makeRequestParsers(Request);
|
|
35
|
+
const parseRequest = parseRequestParams(requestParsers);
|
|
36
|
+
const getParams = tsplus_module_4.map(tsplus_module_4.all({
|
|
37
|
+
rcx: HttpRouteContext,
|
|
38
|
+
req: tsplus_module_4.flatMap(HttpServerRequest, (req) => tsplus_module_4.map(req.json, (body) => ({ body, headers: req.headers })))
|
|
39
|
+
}), ({ rcx, req }) => ({
|
|
40
|
+
params: rcx.params,
|
|
41
|
+
query: rcx.searchParams,
|
|
42
|
+
body: req.body,
|
|
43
|
+
headers: req.headers,
|
|
44
|
+
cookies: {} // req.cookies
|
|
45
|
+
}));
|
|
46
|
+
return tsplus_module_9.updateRequestContext(tsplus_module_4.gen(function* ($) {
|
|
47
|
+
const req = yield* $(HttpServerRequest);
|
|
48
|
+
const res = tsplus_module_7.empty()
|
|
49
|
+
.pipe((_) => req.method === "GET" ? tsplus_module_7.setHeader(_, "Cache-Control", "no-store") : _);
|
|
50
|
+
const pars = yield* $(getParams);
|
|
51
|
+
const settings = yield* $(tsplus_module_1.get(RequestSettings));
|
|
52
|
+
const eff =
|
|
53
|
+
// TODO: we don;t have access to user id here cause context is not yet created
|
|
54
|
+
tsplus_module_4.tap(tsplus_module_4.catchAllCause(tsplus_module_4.andThen(tsplus_module_4.annotateLogs(tsplus_module_4.logInfo("Incoming request"), {
|
|
55
|
+
method: req.method,
|
|
56
|
+
path: req.originalUrl,
|
|
57
|
+
...settings.verbose
|
|
58
|
+
? {
|
|
59
|
+
reqPath: tsplus_module_6.RecordPretty(tsplus_module_6.object$(pars.params)),
|
|
60
|
+
reqQuery: tsplus_module_6.RecordPretty(tsplus_module_6.object$(pars.query)),
|
|
61
|
+
reqBody: pretty(pars.body),
|
|
62
|
+
reqCookies: pretty(pars.cookies),
|
|
63
|
+
reqHeaders: pretty(pars.headers)
|
|
64
|
+
}
|
|
65
|
+
: undefined
|
|
66
|
+
}), tsplus_module_4.suspend(() => {
|
|
67
|
+
const handleRequest = tsplus_module_4.flatMap(tsplus_module_4.map(parseRequest(pars), ({ body, path, query }) => {
|
|
68
|
+
const hn = {
|
|
69
|
+
...tsplus_module_5.getOrUndefined(body),
|
|
70
|
+
...tsplus_module_5.getOrUndefined(query),
|
|
71
|
+
...tsplus_module_5.getOrUndefined(path)
|
|
72
|
+
};
|
|
73
|
+
return hn;
|
|
74
|
+
}), (parsedReq) => tsplus_module_4.map(tsplus_module_4.map(tsplus_module_4.provideService(handle(parsedReq), handler.Request.Tag, parsedReq), encoder), (r) => tsplus_module_7.setStatus(r === undefined ? 204 : 200)(tsplus_module_7.setBody(res, tsplus_module_8.unsafeJson(r)))));
|
|
75
|
+
// Commands should not be interruptable.
|
|
76
|
+
const r = req.method !== "GET" ? tsplus_module_4.uninterruptible(handleRequest) : handleRequest; // .instrument("Performance.RequestResponse")
|
|
77
|
+
const r2 = middlewareLayer
|
|
78
|
+
? tsplus_module_4.provide(r, middlewareLayer)
|
|
79
|
+
// PR is not relevant here
|
|
80
|
+
: r;
|
|
81
|
+
return errorHandler(req, res, r2);
|
|
82
|
+
})), (cause) => tsplus_module_4.tapErrorCause(tsplus_module_4.tap(tsplus_module_4.sync(() => tsplus_module_7.setStatus(500)(res)), (res) => tsplus_module_4.all([
|
|
83
|
+
reportError("request")(cause, {
|
|
84
|
+
path: req.originalUrl,
|
|
85
|
+
method: req.method
|
|
86
|
+
}),
|
|
87
|
+
tsplus_module_4.suspend(() => {
|
|
88
|
+
const headers = res.headers;
|
|
89
|
+
return tsplus_module_4.annotateLogs(tsplus_module_4.logError("Finished request", cause), {
|
|
90
|
+
method: req.method,
|
|
91
|
+
path: req.originalUrl,
|
|
92
|
+
statusCode: res.status.toString(),
|
|
93
|
+
reqPath: tsplus_module_6.RecordPretty(tsplus_module_6.object$(pars.params)),
|
|
94
|
+
reqQuery: tsplus_module_6.RecordPretty(tsplus_module_6.object$(pars.query)),
|
|
95
|
+
reqBody: pretty(pars.body),
|
|
96
|
+
reqCookies: pretty(pars.cookies),
|
|
97
|
+
reqHeaders: pretty(pars.headers),
|
|
98
|
+
resHeaders: tsplus_module_6.RecordPretty(tsplus_module_6.object$(Object
|
|
99
|
+
.entries(headers)
|
|
100
|
+
.reduce((prev, [key, value]) => {
|
|
101
|
+
prev[key] = value && typeof value === "string" ? snipString(value) : value;
|
|
102
|
+
return prev;
|
|
103
|
+
}, {})))
|
|
104
|
+
});
|
|
105
|
+
})
|
|
106
|
+
], { concurrency: "inherit" })), (cause) => tsplus_module_4.sync(() => console.error("Error occurred while reporting error", cause)))), tsplus_module_4.annotateLogs(tsplus_module_4.logInfo("Finished request"), {
|
|
107
|
+
method: req.method,
|
|
108
|
+
path: req.originalUrl,
|
|
109
|
+
statusCode: res.status.toString(),
|
|
110
|
+
...settings.verbose
|
|
111
|
+
? {
|
|
112
|
+
resHeaders: pretty(res.headers)
|
|
113
|
+
}
|
|
114
|
+
: undefined
|
|
115
|
+
}));
|
|
116
|
+
return yield* $(eff);
|
|
117
|
+
}), (_) => tsplus_module_6.$copy(tsplus_module_6.object$(_), {
|
|
118
|
+
name: tsplus_module_2.NonEmptyString255(tsplus_module_5.getOrUndefined(AST.getTitleAnnotation(Request.ast)) ?? "TODO")
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZVJlcXVlc3RIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vX3NyYy9hcGkvcm91dGluZy9tYWtlUmVxdWVzdEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFLN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXhDLE9BQU8sRUFBWSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBc0IsTUFBTSxZQUFZLENBQUE7QUFDOUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFBO0FBR2xFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywyQkFBb0I7SUFDakQsT0FBTyxFQUFFLEtBQUs7Q0FDZixDQUFDLENBQUE7QUEwQ0YsTUFBTSxVQUFVLGtCQUFrQixDQWtCaEMsT0FhQyxFQUNELFlBSWdELEVBQ2hELGVBQTRDO0lBWTVDLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFFaEQsTUFBTSxRQUFRLEdBQTBCLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsaUJBQUMsSUFBSSxDQUFBO0lBQ2xFLE1BQU0sSUFBSSxHQUFHLFFBQTJELENBQUE7SUFDeEUsdUZBQXVGO0lBQ3ZGLE1BQU0sT0FBTyxHQUFHLFFBQVEsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU07UUFDN0MsQ0FBQyw0QkFBQyxJQUFJLENBQUMsTUFBTTtJQUNiLGtCQUFrQjtJQUNsQixzRUFBc0U7SUFDdEUsOERBQThEO0lBQzlELElBQUk7SUFDSixD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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Ref } from "effect/Ref";
|
|
2
|
+
import { Effect } from "effect/Effect";
|
|
3
|
+
import { Layer } from "effect/Layer";
|
|
4
|
+
import { type RouteDescriptorAny } from "@effect-app/infra/api/express/schema/routing";
|
|
5
|
+
import type { ValidationError } from "@effect-app/infra/errors";
|
|
6
|
+
import type { StructFields } from "@effect-app/schema";
|
|
7
|
+
import { type HttpServerRequest, type HttpServerResponse } from "../http.js";
|
|
8
|
+
import type { RequestHandler } from "./base.js";
|
|
9
|
+
import type { Middleware } from "./makeRequestHandler.js";
|
|
10
|
+
export declare const RouteDescriptors: import("effect/Context").Tag<import("effect/Ref").Ref<RouteDescriptorAny[]>, import("effect/Ref").Ref<RouteDescriptorAny[]>>;
|
|
11
|
+
export declare function match<R, M, PathA extends StructFields, CookieA extends StructFields, QueryA extends StructFields, BodyA extends StructFields, HeaderA extends StructFields, ReqA extends PathA & QueryA & BodyA, ResA extends StructFields, ResE, MiddlewareE, PPath extends `/${string}`, R2, PR, RErr, CTX, Context, Config>(requestHandler: RequestHandler<R, M, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, ResE, PPath, CTX, Context, Config>, errorHandler: <R>(req: HttpServerRequest, res: HttpServerResponse, r2: Effect<R, ValidationError | MiddlewareE | ResE, HttpServerResponse>) => Effect<RErr | R, never, HttpServerResponse>, middleware?: Middleware<R, M, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, ResE, MiddlewareE, PPath, R2, PR, CTX, Context, Config>): import("effect/Effect").Effect<never, never, import("@effect/platform/Http/Router").Route<import("../../services/RequestContextContainer.js").RequestContextContainer | import("../../services/Store/ContextMapContainer.js").ContextMapContainer | Exclude<R2, import("effect/Scope").Scope | HttpServerRequest | import("@effect/platform/Http/Router").RouteContext> | Exclude<RErr, import("effect/Scope").Scope | HttpServerRequest | import("@effect/platform/Http/Router").RouteContext> | Exclude<Exclude<Exclude<R, import("@effect-app/core/utils").EnforceNonEmptyRecord<M>>, PR>, import("effect/Scope").Scope | HttpServerRequest | import("@effect/platform/Http/Router").RouteContext>, import("@effect/platform/Http/ServerError").RequestError>>;
|
|
12
|
+
//# sourceMappingURL=match.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../../_src/api/routing/match.ts"],"names":[],"mappings":";;;AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,8CAA8C,CAAA;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAc,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEzD,eAAO,MAAM,gBAAgB,8HAAmC,CAAA;AAEhE,wBAAgB,KAAK,CACnB,CAAC,EACD,CAAC,EACD,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,EAC5B,MAAM,SAAS,YAAY,EAC3B,KAAK,SAAS,YAAY,EAC1B,OAAO,SAAS,YAAY,EAC5B,IAAI,SAAS,KAAK,GAAG,MAAM,GAAG,KAAK,EACnC,IAAI,SAAS,YAAY,EACzB,IAAI,EACJ,WAAW,EACX,KAAK,SAAS,IAAI,MAAM,EAAE,EAC1B,EAAE,EACF,EAAE,EACF,IAAI,EACJ,GAAG,EACH,OAAO,EACP,MAAM,EAEN,cAAc,EAAE,cAAc,CAC5B,CAAC,EACD,CAAC,EACD,KAAK,EACL,OAAO,EACP,MAAM,EACN,KAAK,EACL,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,GAAG,EACH,OAAO,EACP,MAAM,CACP,EACD,YAAY,EAAE,CAAC,CAAC,EACd,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,kBAAkB,EACvB,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI,EAAE,kBAAkB,CAAC,KACpE,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,EAChD,UAAU,CAAC,EAAE,UAAU,CACrB,CAAC,EACD,CAAC,EACD,KAAK,EACL,OAAO,EACP,MAAM,EACN,KAAK,EACL,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,WAAW,EACX,KAAK,EACL,EAAE,EACF,EAAE,EACF,GAAG,EACH,OAAO,EACP,MAAM,CACP,quBA+CF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as tsplus_module_1 from "effect/Context";
|
|
2
|
+
import * as tsplus_module_2 from "@effect/platform/Http/Router";
|
|
3
|
+
import * as tsplus_module_3 from "effect/Effect";
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
6
|
+
import "@effect-app/infra/api/express/schema/routing";
|
|
7
|
+
import "../http.js";
|
|
8
|
+
import { makeRequestHandler } from "./makeRequestHandler.js";
|
|
9
|
+
export const RouteDescriptors = tsplus_module_1.Tag();
|
|
10
|
+
export function match(requestHandler, errorHandler, middleware) {
|
|
11
|
+
let middlewareLayer = undefined;
|
|
12
|
+
if (middleware) {
|
|
13
|
+
const { handler, makeRequestLayer } = middleware(requestHandler);
|
|
14
|
+
requestHandler = handler; // todo
|
|
15
|
+
middlewareLayer = makeRequestLayer;
|
|
16
|
+
}
|
|
17
|
+
return tsplus_module_3.gen(function* () {
|
|
18
|
+
// const rdesc = yield* $(RouteDescriptors.flatMap((_) => _.get))
|
|
19
|
+
const handler = makeRequestHandler(requestHandler, // one argument if no middleware, 2 if has middleware. TODO: clean this shit up
|
|
20
|
+
errorHandler, middlewareLayer);
|
|
21
|
+
const route = tsplus_module_2.makeRoute(requestHandler.Request.method, requestHandler.Request.path, handler);
|
|
22
|
+
// TODO
|
|
23
|
+
// rdesc.push(makeRouteDescriptor(
|
|
24
|
+
// requestHandler.Request.path,
|
|
25
|
+
// requestHandler.Request.method,
|
|
26
|
+
// requestHandler
|
|
27
|
+
// ))
|
|
28
|
+
return route;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9fc3JjL2FwaS9yb3V0aW5nL21hdGNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUF1RDtBQUN2RCxpREFBaUQ7QUFDakQsT0FBd0MsOENBQThDLENBQUE7QUFHdEYsT0FBNEUsWUFBWSxDQUFBO0FBRXhGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRzVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGdCQUFBLEdBQUcsRUFBNkIsQ0FBQTtBQUVoRSxNQUFNLFVBQVUsS0FBSyxDQW9CbkIsY0FlQyxFQUNELFlBSWdELEVBQ2hELFVBa0JDO0lBRUQsSUFBSSxlQUFlLEdBQTJDLFNBQVMsQ0FBQTtJQUN2RSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUNoRSxjQUFjLEdBQUcsT0FBYyxDQUFBLENBQUMsT0FBTztRQUN2QyxlQUFlLEdBQUcsZ0JBQWdCLENBQUE7SUFDcEMsQ0FBQztJQUNELE9BQU8sb0JBQVcsUUFBUSxDQUFDO1FBQ3pCLGlFQUFpRTtRQUVqRSxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FrQmhDLGNBQXFCLEVBQUUsK0VBQStFO1FBQ3RHLFlBQVksRUFDWixlQUFlLENBQ2hCLENBQUE7UUFFRCxNQUFNLEtBQUssR0FBRywwQkFDWixjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFDN0IsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQzNCLE9BQU8sQ0FDUixDQUFBO1FBQ0QsT0FBTztRQUNQLGtDQUFrQztRQUNsQyxpQ0FBaUM7UUFDakMsbUNBQW1DO1FBQ25DLG1CQUFtQjtRQUNuQixLQUFLO1FBQ0wsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../_src/api/routing.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAA;AACjC,cAAc,kCAAkC,CAAA;AAChD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
3
|
+
// codegen:start {preset: barrel, include: routing/*.ts }
|
|
4
|
+
export * from "./routing/base.js";
|
|
5
|
+
export * from "./routing/defaultErrorHandler.js";
|
|
6
|
+
export * from "./routing/makeRequestHandler.js";
|
|
7
|
+
export * from "./routing/match.js";
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL19zcmMvYXBpL3JvdXRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELGlEQUFpRDtBQUVqRCx5REFBeUQ7QUFDekQsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxjQUFjLGtDQUFrQyxDQUFBO0FBQ2hELGNBQWMsaUNBQWlDLENBQUE7QUFDL0MsY0FBYyxvQkFBb0IsQ0FBQSJ9
|
|
@@ -3,13 +3,13 @@ import { RequestContext } from "../RequestContext.js";
|
|
|
3
3
|
import { RequestContextContainer } from "../services/RequestContextContainer.js";
|
|
4
4
|
import { ContextMapContainer } from "../services/Store/ContextMapContainer.js";
|
|
5
5
|
/**
|
|
6
|
-
* @tsplus fluent effect/io/Effect
|
|
6
|
+
* @tsplus fluent effect/io/Effect setupRequestContext
|
|
7
7
|
* @tsplus location "@effect-app/infra/api/setupRequest"
|
|
8
8
|
*/
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function setupRequestContext<R, E, A>(self: Effect<R, E, A>, requestContext: RequestContext | string): import("effect/Effect").Effect<RequestContextContainer | ContextMapContainer | Exclude<Exclude<R, import("effect/Tracer").ParentSpan>, never>, E, A>;
|
|
10
10
|
/**
|
|
11
|
-
* @tsplus fluent effect/io/Effect
|
|
11
|
+
* @tsplus fluent effect/io/Effect updateRequestContext
|
|
12
12
|
* @tsplus location "@effect-app/infra/api/setupRequest"
|
|
13
13
|
*/
|
|
14
|
-
export declare function
|
|
14
|
+
export declare function updateRequestContext<R, E, A>(self: Effect<R, E, A>, f: (rc: RequestContext) => RequestContext): import("effect/Effect").Effect<RequestContextContainer | Exclude<R, never>, E, A>;
|
|
15
15
|
//# sourceMappingURL=setupRequest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupRequest.d.ts","sourceRoot":"","sources":["../../_src/api/setupRequest.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;;;;;
|
|
1
|
+
{"version":3,"file":"setupRequest.d.ts","sourceRoot":"","sources":["../../_src/api/setupRequest.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAA;;;;;AAiD9E,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,cAAc,GAAG,MAAM,wJAI1G;;;;;AAQD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,cAAc,qFAI7G"}
|
package/dist/api/setupRequest.js
CHANGED
|
@@ -1,56 +1,50 @@
|
|
|
1
|
-
import * as tsplus_module_1 from "effect/
|
|
2
|
-
import * as tsplus_module_2 from "
|
|
3
|
-
|
|
1
|
+
import * as tsplus_module_1 from "@effect-app/schema";
|
|
2
|
+
import * as tsplus_module_2 from "effect/Effect";
|
|
3
|
+
import * as tsplus_module_3 from "@effect-app/infra/services/RequestContextContainer";
|
|
4
|
+
import * as tsplus_module_4 from "effect/Layer";
|
|
4
5
|
import { RequestId } from "@effect-app/prelude/ids";
|
|
5
6
|
import { RequestContext } from "../RequestContext.js";
|
|
6
7
|
import { RequestContextContainer } from "../services/RequestContextContainer.js";
|
|
7
8
|
import { ContextMapContainer } from "../services/Store/ContextMapContainer.js";
|
|
8
|
-
/**
|
|
9
|
-
* @tsplus fluent effect/io/Effect setupRequestContextFromName
|
|
10
|
-
*/
|
|
11
|
-
export function setupRequestContextFromName(self, name) {
|
|
12
|
-
return tsplus_module_1.flatMap(makeInternalRequestContext(name), (rc) => setupRequestContext_1(self, rc));
|
|
13
|
-
}
|
|
14
9
|
function makeInternalRequestContext(name) {
|
|
15
|
-
return
|
|
10
|
+
return tsplus_module_2.sync(() => {
|
|
16
11
|
const id = RequestId.make();
|
|
17
12
|
return new RequestContext({
|
|
18
13
|
id,
|
|
19
14
|
rootId: id,
|
|
20
15
|
locale: "en",
|
|
21
|
-
name:
|
|
16
|
+
name: tsplus_module_1.NonEmptyString255(name)
|
|
22
17
|
});
|
|
23
18
|
});
|
|
24
19
|
}
|
|
25
|
-
const withRequestSpan = (f) =>
|
|
26
|
-
.get, (ctx) =>
|
|
27
|
-
attributes: {
|
|
28
|
-
"request.id": ctx.id,
|
|
29
|
-
"request.name": ctx.name,
|
|
30
|
-
"request.locale": ctx.locale,
|
|
31
|
-
"request.namespace": ctx.namespace,
|
|
32
|
-
...ctx.userProfile?.sub
|
|
33
|
-
? {
|
|
34
|
-
"request.user.sub": ctx
|
|
35
|
-
.userProfile
|
|
36
|
-
.sub,
|
|
37
|
-
"request.user.roles": "roles" in ctx
|
|
38
|
-
.userProfile
|
|
39
|
-
? ctx.userProfile.roles
|
|
40
|
-
: undefined
|
|
41
|
-
}
|
|
42
|
-
: {}
|
|
43
|
-
}
|
|
44
|
-
})
|
|
20
|
+
const withRequestSpan = (f) => tsplus_module_2.andThen(RequestContextContainer
|
|
21
|
+
.get, (ctx) => tsplus_module_2.withLogSpan(tsplus_module_2.withSpan(f, "request", { attributes: tsplus_module_3.spanAttributes(ctx) })
|
|
45
22
|
// request context info is picked up directly in the logger for annotations.
|
|
46
23
|
, "request"));
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
24
|
+
const setupContextMap = tsplus_module_4.effectDiscard(tsplus_module_2.andThen(ContextMapContainer, (_) => _.start));
|
|
25
|
+
// const RequestContextLiveFromRequestContext = (requestContext: RequestContext) =>
|
|
26
|
+
// RequestContext.Tag.makeLayer(requestContext)
|
|
27
|
+
// memoization problem
|
|
28
|
+
// const RequestContextLive = RequestContextContainer.get.toLayer(RequestContext.Tag)
|
|
29
|
+
const RequestContextStartLiveFromRequestContext = (requestContext) => tsplus_module_4.provideMerge(setupContextMap
|
|
30
|
+
// .provideMerge(RequestContextLiveFromRequestContext(requestContext))
|
|
31
|
+
, tsplus_module_4.effectDiscard(tsplus_module_2.andThen(RequestContextContainer, (_) => _.start(requestContext))));
|
|
32
|
+
const RequestContextStartLive = (requestContext) => typeof requestContext === "string"
|
|
33
|
+
? tsplus_module_4.unwrapEffect(tsplus_module_2.andThen(makeInternalRequestContext(requestContext), RequestContextStartLiveFromRequestContext)) : RequestContextStartLiveFromRequestContext(requestContext);
|
|
50
34
|
/**
|
|
51
35
|
* @tsplus fluent effect/io/Effect setupRequestContext
|
|
52
36
|
*/
|
|
53
|
-
function
|
|
54
|
-
return
|
|
37
|
+
export function setupRequestContext(self, requestContext) {
|
|
38
|
+
return tsplus_module_2.provide(self
|
|
39
|
+
.pipe(withRequestSpan), RequestContextStartLive(requestContext));
|
|
40
|
+
}
|
|
41
|
+
const UpdateRequestContextLive = (f) => tsplus_module_4.effectDiscard(tsplus_module_2.andThen(RequestContextContainer, (rcc) => rcc.update(f)));
|
|
42
|
+
/**
|
|
43
|
+
* @tsplus fluent effect/io/Effect updateRequestContext
|
|
44
|
+
*/
|
|
45
|
+
export function updateRequestContext(self, f) {
|
|
46
|
+
return tsplus_module_2.provide(self
|
|
47
|
+
// .provideServiceEffect(RequestContext.Tag, RequestContextContainer.get)
|
|
48
|
+
, UpdateRequestContextLive(f));
|
|
55
49
|
}
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBSZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vX3NyYy9hcGkvc2V0dXBSZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFBO0FBQ2hGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFBO0FBRTlFLFNBQVMsMEJBQTBCLENBQUMsSUFBWTtJQUM5QyxPQUFPLHFCQUFZLEdBQUcsRUFBRTtRQUN0QixNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDM0IsT0FBTyxJQUFJLGNBQWMsQ0FBQztZQUN4QixFQUFFO1lBQ0YsTUFBTSxFQUFFLEVBQUU7WUFDVixNQUFNLEVBQUUsSUFBSTtZQUNaLElBQUksRUFBRSxnQkFBQSxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7U0FDOUIsQ0FBQyxDQUFBO0lBQ0osQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDO0FBRUQsTUFBTSxlQUFlLEdBQUcsQ0FBVSxDQUFrQixFQUFFLEVBQUUsQ0FDdEQsd0JBQUEsdUJBQXVCO0tBQ3BCLEdBQUcsRUFDSyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ2YsNEJBQUEseUJBQUEsQ0FBQyxFQUNXLFNBQVMsRUFBRSxFQUFFLFVBQVUsaUNBQUUsR0FBRyxDQUFlLEVBQUUsQ0FBQztBQUN4RCw0RUFBNEU7RUFDL0QsU0FBUyxDQUFDLENBQzFCLENBQUE7QUFFTCxNQUFNLGVBQWUsaUNBQUcsd0JBQUEsbUJBQW1CLEVBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBZSxDQUFBO0FBRWxGLG1GQUFtRjtBQUNuRixpREFBaUQ7QUFDakQsc0JBQXNCO0FBQ3RCLHFGQUFxRjtBQUNyRixNQUFNLHlDQUF5QyxHQUFHLENBQUMsY0FBOEIsRUFBRSxFQUFFLENBQ25GLDZCQUFBLGVBQWU7QUFDYixzRUFBc0U7Z0NBRXBFLHdCQUFBLHVCQUF1QixFQUNaLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBRTNDLENBQUE7QUFFTCxNQUFNLHVCQUF1QixHQUFHLENBQUMsY0FBdUMsRUFBRSxFQUFFLENBQzFFLE9BQU8sY0FBYyxLQUFLLFFBQVE7SUFDaEMsQ0FBQyw4QkFBQyx3QkFBQSwwQkFBMEIsQ0FBQyxjQUFjLENBQUMsRUFDakMseUNBQXlDLENBQUMsRUFFckQsQ0FBQyxDQUFDLHlDQUF5QyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0FBRS9EOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFVLElBQXFCLEVBQUUsY0FBdUM7SUFDekcsT0FBTyx3QkFBQSxJQUFJO1NBQ1IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUNiLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7QUFDckQsQ0FBQztBQUVELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUF5QyxFQUFFLEVBQUUsK0JBQzdFLHdCQUFBLHVCQUF1QixFQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQWUsQ0FBQTtBQUV4RTs7R0FFRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBVSxJQUFxQixFQUFFLENBQXlDO0lBQzVHLE9BQU8sd0JBQUEsSUFBSTtJQUNULHlFQUF5RTtNQUNoRSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3pDLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorReporter.d.ts","sourceRoot":"","sources":["../_src/errorReporter.ts"],"names":[],"mappings":";AAKA,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,WAEG,MAAM,OAAO,CAAC,WAAW,OAAO,MAAM,EAAE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"errorReporter.d.ts","sourceRoot":"","sources":["../_src/errorReporter.ts"],"names":[],"mappings":";AAKA,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,WAEG,MAAM,OAAO,CAAC,WAAW,OAAO,MAAM,EAAE,OAAO,CAAC,wDAkBhE;AAkBD,wBAAgB,QAAQ,CAAC,CAAC,EACxB,IAAI,EAAE,MAAM,WAEG,MAAM,CAAC,CAAC,WAAW,OAAO,MAAM,EAAE,OAAO,CAAC,wDAiB1D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,QAG9C;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,QAI5C;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,sDAE7C"}
|