@effect-app/infra 0.85.0-next.3 → 0.85.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 +3 -25
- package/_cjs/_ext/Array.cjs +2 -3
- package/_cjs/_ext/Array.cjs.map +1 -1
- package/_cjs/api/defaultErrorHandler.cjs +10 -11
- package/_cjs/api/defaultErrorHandler.cjs.map +1 -1
- package/_cjs/api/express/makeJsonSchema.cjs +2 -3
- package/_cjs/api/express/makeJsonSchema.cjs.map +1 -1
- package/_cjs/api/express/makeJsonSchema.test.cjs +2 -2
- package/_cjs/api/express/makeJsonSchema.test.cjs.map +1 -1
- package/_cjs/api/express/makeOpenApiSpecs.cjs +4 -6
- package/_cjs/api/express/makeOpenApiSpecs.cjs.map +1 -1
- package/_cjs/api/express/schema/routing.cjs +22 -23
- package/_cjs/api/express/schema/routing.cjs.map +1 -1
- package/_cjs/api/reportError.cjs +2 -2
- package/_cjs/api/setupRequest.cjs +4 -5
- package/_cjs/api/setupRequest.cjs.map +1 -1
- package/_cjs/api/writeDocs.cjs +4 -6
- package/_cjs/api/writeDocs.cjs.map +1 -1
- package/_cjs/errorReporter.cjs +11 -12
- package/_cjs/errorReporter.cjs.map +1 -1
- package/_cjs/errors.cjs +8 -8
- package/_cjs/errors.cjs.map +1 -1
- package/_cjs/instrument.cjs +1 -2
- package/_cjs/instrument.cjs.map +1 -1
- package/_cjs/logger/jsonLogger.cjs +10 -11
- package/_cjs/logger/jsonLogger.cjs.map +1 -1
- package/_cjs/logger/logFmtLogger.cjs +5 -5
- package/_cjs/logger/logFmtLogger.cjs.map +1 -1
- package/_cjs/logger/shared.cjs +4 -4
- package/_cjs/logger/shared.cjs.map +1 -1
- package/_cjs/rateLimit.cjs +7 -8
- package/_cjs/rateLimit.cjs.map +1 -1
- package/_cjs/services/Emailer/Sendgrid.cjs +12 -14
- package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -1
- package/_cjs/services/Emailer/fake.cjs +4 -5
- package/_cjs/services/Emailer/fake.cjs.map +1 -1
- package/_cjs/services/Operations/live.cjs +29 -31
- package/_cjs/services/Operations/live.cjs.map +1 -1
- package/_cjs/services/Operations/service.cjs +5 -6
- package/_cjs/services/Operations/service.cjs.map +1 -1
- package/_cjs/services/QueueMaker/errors.cjs +6 -7
- package/_cjs/services/QueueMaker/errors.cjs.map +1 -1
- package/_cjs/services/QueueMaker/memQueue.cjs +17 -18
- package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
- package/_cjs/services/QueueMaker/sbqueue.cjs +15 -16
- package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
- package/_cjs/services/Repository.cjs +16 -17
- package/_cjs/services/Repository.cjs.map +1 -1
- package/_cjs/services/RepositoryBase.cjs +33 -35
- package/_cjs/services/RepositoryBase.cjs.map +1 -1
- package/_cjs/services/RequestContextContainer.cjs +20 -15
- package/_cjs/services/RequestContextContainer.cjs.map +1 -1
- package/_cjs/services/Store/Cosmos.cjs +46 -49
- package/_cjs/services/Store/Cosmos.cjs.map +1 -1
- package/_cjs/services/Store/Disk.cjs +18 -19
- package/_cjs/services/Store/Disk.cjs.map +1 -1
- package/_cjs/services/Store/Memory.cjs +39 -43
- package/_cjs/services/Store/Memory.cjs.map +1 -1
- package/_cjs/services/Store/Redis.cjs +14 -16
- package/_cjs/services/Store/Redis.cjs.map +1 -1
- package/_cjs/services/Store/codeFilter.test.cjs +1 -1
- package/_cjs/services/Store/index.cjs +6 -7
- package/_cjs/services/Store/index.cjs.map +1 -1
- package/_cjs/services/Store/service.cjs +1 -1
- package/_cjs/services/Store/service.cjs.map +1 -1
- package/_cjs/services/Store/utils.cjs +13 -13
- package/_cjs/services/Store/utils.cjs.map +1 -1
- package/_cjs/services/simpledb/cosmosdb.cjs +17 -19
- package/_cjs/services/simpledb/cosmosdb.cjs.map +1 -1
- package/_cjs/services/simpledb/diskdb.cjs +8 -9
- package/_cjs/services/simpledb/diskdb.cjs.map +1 -1
- package/_cjs/services/simpledb/memdb.cjs +9 -11
- package/_cjs/services/simpledb/memdb.cjs.map +1 -1
- package/_cjs/services/simpledb/mongodb.cjs +18 -20
- package/_cjs/services/simpledb/mongodb.cjs.map +1 -1
- package/_cjs/services/simpledb/redisdb.cjs +10 -11
- package/_cjs/services/simpledb/redisdb.cjs.map +1 -1
- package/_cjs/services/simpledb/shared.cjs +5 -5
- package/_cjs/services/simpledb/shared.cjs.map +1 -1
- package/_cjs/services/simpledb/simpledb.cjs +17 -18
- package/_cjs/services/simpledb/simpledb.cjs.map +1 -1
- package/_src/api/authorization.jwt.ts +1 -1
- package/_src/api/defaultErrorHandler.ts +2 -2
- package/_src/api/express/routing.ts.bak +8 -8
- package/_src/api/express/schema/routing.ts +59 -37
- package/_src/api/setupRequest.ts +11 -10
- package/_src/errorReporter.ts +1 -1
- package/_src/services/Emailer/Sendgrid.ts +1 -1
- package/_src/services/Operations/live.ts +5 -5
- package/_src/services/QueueMaker/errors.ts +1 -1
- package/_src/services/QueueMaker/memQueue.ts +2 -2
- package/_src/services/QueueMaker/sbqueue.ts +1 -1
- package/_src/services/Repository.ts +9 -9
- package/_src/services/RepositoryBase.ts +6 -8
- package/_src/services/RequestContextContainer.ts +12 -7
- package/_src/services/Store/Cosmos.ts +12 -17
- package/_src/services/Store/Disk.ts +4 -4
- package/_src/services/Store/Memory.ts +4 -4
- package/_src/services/Store/Redis.ts +1 -1
- package/_src/services/Store/index.test.ts.bak +5 -5
- package/_src/services/Store/index.ts +1 -1
- package/_src/services/Store/utils.ts +16 -16
- package/_src/services/simpledb/diskdb.ts +1 -1
- package/_src/services/simpledb/memdb.ts +1 -1
- package/_src/services/simpledb/redisdb.ts +1 -1
- package/_src/services/simpledb/shared.ts +1 -1
- package/_src/services/simpledb/simpledb.ts +3 -3
- package/dist/RequestContext.d.ts +4 -4
- package/dist/_ext/Array.d.ts +1 -1
- package/dist/_ext/Array.d.ts.map +1 -1
- package/dist/_ext/Array.js +3 -4
- package/dist/api/codec.d.ts +1 -1
- package/dist/api/codec.d.ts.map +1 -1
- package/dist/api/defaultErrorHandler.d.ts +2 -2
- package/dist/api/defaultErrorHandler.d.ts.map +1 -1
- package/dist/api/defaultErrorHandler.js +11 -13
- package/dist/api/express/makeJsonSchema.d.ts +2 -2
- package/dist/api/express/makeJsonSchema.d.ts.map +1 -1
- package/dist/api/express/makeJsonSchema.js +3 -4
- package/dist/api/express/makeOpenApiSpecs.d.ts +1 -1
- package/dist/api/express/makeOpenApiSpecs.js +5 -7
- package/dist/api/express/schema/routing.d.ts +22 -7
- package/dist/api/express/schema/routing.d.ts.map +1 -1
- package/dist/api/express/schema/routing.js +23 -24
- package/dist/api/reportError.d.ts +5 -5
- package/dist/api/reportError.d.ts.map +1 -1
- package/dist/api/reportError.js +2 -2
- package/dist/api/setupRequest.d.ts +2 -2
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +7 -7
- package/dist/api/writeDocs.d.ts +1 -1
- package/dist/api/writeDocs.d.ts.map +1 -1
- package/dist/api/writeDocs.js +5 -7
- package/dist/errorReporter.d.ts +3 -3
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +12 -13
- package/dist/errors.d.ts +7 -7
- package/dist/errors.js +9 -9
- package/dist/instrument.d.ts +1 -1
- package/dist/instrument.d.ts.map +1 -1
- package/dist/instrument.js +2 -3
- package/dist/logger/jsonLogger.d.ts +2 -2
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +11 -12
- package/dist/logger/logFmtLogger.d.ts +2 -2
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +6 -6
- package/dist/logger/shared.d.ts +1 -1
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +5 -5
- package/dist/rateLimit.d.ts +3 -3
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +8 -9
- package/dist/services/Emailer/Sendgrid.d.ts +1 -1
- package/dist/services/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/services/Emailer/Sendgrid.js +15 -17
- package/dist/services/Emailer/fake.d.ts +1 -1
- package/dist/services/Emailer/fake.d.ts.map +1 -1
- package/dist/services/Emailer/fake.js +5 -6
- package/dist/services/Emailer/service.d.ts +3 -3
- package/dist/services/Operations/live.d.ts +1 -1
- package/dist/services/Operations/live.d.ts.map +1 -1
- package/dist/services/Operations/live.js +37 -39
- package/dist/services/Operations/service.d.ts +8 -8
- package/dist/services/Operations/service.d.ts.map +1 -1
- package/dist/services/Operations/service.js +12 -13
- package/dist/services/QueueMaker/errors.d.ts +3 -3
- package/dist/services/QueueMaker/errors.d.ts.map +1 -1
- package/dist/services/QueueMaker/errors.js +6 -7
- package/dist/services/QueueMaker/memQueue.d.ts +3 -3
- package/dist/services/QueueMaker/memQueue.js +16 -17
- package/dist/services/QueueMaker/sbqueue.d.ts +4 -4
- package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/services/QueueMaker/sbqueue.js +15 -16
- package/dist/services/Repository.d.ts +31 -31
- package/dist/services/Repository.d.ts.map +1 -1
- package/dist/services/Repository.js +17 -18
- package/dist/services/RepositoryBase.d.ts +12 -11
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +35 -37
- package/dist/services/RequestContextContainer.d.ts +14 -11
- package/dist/services/RequestContextContainer.d.ts.map +1 -1
- package/dist/services/RequestContextContainer.js +19 -18
- package/dist/services/Store/Cosmos.d.ts +3 -3
- package/dist/services/Store/Cosmos.d.ts.map +1 -1
- package/dist/services/Store/Cosmos.js +51 -54
- package/dist/services/Store/Disk.d.ts +3 -3
- package/dist/services/Store/Disk.d.ts.map +1 -1
- package/dist/services/Store/Disk.js +19 -20
- package/dist/services/Store/Memory.d.ts +5 -5
- package/dist/services/Store/Memory.d.ts.map +1 -1
- package/dist/services/Store/Memory.js +41 -45
- package/dist/services/Store/Redis.d.ts +3 -3
- package/dist/services/Store/Redis.d.ts.map +1 -1
- package/dist/services/Store/Redis.js +15 -17
- package/dist/services/Store/index.d.ts +1 -1
- package/dist/services/Store/index.d.ts.map +1 -1
- package/dist/services/Store/index.js +7 -8
- package/dist/services/Store/service.d.ts +8 -8
- package/dist/services/Store/service.d.ts.map +1 -1
- package/dist/services/Store/service.js +2 -2
- package/dist/services/Store/utils.d.ts +2 -2
- package/dist/services/Store/utils.d.ts.map +1 -1
- package/dist/services/Store/utils.js +21 -21
- package/dist/services/simpledb/cosmosdb.d.ts +5 -5
- package/dist/services/simpledb/cosmosdb.js +17 -19
- package/dist/services/simpledb/diskdb.d.ts +4 -4
- package/dist/services/simpledb/diskdb.js +9 -10
- package/dist/services/simpledb/memdb.d.ts +4 -4
- package/dist/services/simpledb/memdb.js +11 -13
- package/dist/services/simpledb/mongodb.d.ts +5 -5
- package/dist/services/simpledb/mongodb.js +14 -16
- package/dist/services/simpledb/redisdb.d.ts +4 -4
- package/dist/services/simpledb/redisdb.js +11 -12
- package/dist/services/simpledb/shared.d.ts +4 -4
- package/dist/services/simpledb/shared.js +6 -6
- package/dist/services/simpledb/simpledb.d.ts +6 -6
- package/dist/services/simpledb/simpledb.d.ts.map +1 -1
- package/dist/services/simpledb/simpledb.js +15 -16
- package/package.json +5 -25
- package/_cjs/api/express/schema/requestHandler.cjs +0 -172
- package/_cjs/api/express/schema/requestHandler.cjs.map +0 -1
- package/_cjs/api/routing.cjs +0 -278
- package/_cjs/api/routing.cjs.map +0 -1
- package/_src/api/express/schema/requestHandler.ts +0 -372
- package/_src/api/routing.ts +0 -660
- package/dist/api/express/schema/requestHandler.d.ts +0 -71
- package/dist/api/express/schema/requestHandler.d.ts.map +0 -1
- package/dist/api/express/schema/requestHandler.js +0 -140
- package/dist/api/routing.d.ts +0 -103
- package/dist/api/routing.d.ts.map +0 -1
- package/dist/api/routing.js +0 -265
package/dist/api/routing.js
DELETED
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
import * as tsplus_module_1 from "effect/FiberRef";
|
|
2
|
-
import * as tsplus_module_2 from "effect/Option";
|
|
3
|
-
import * as tsplus_module_3 from "effect/impl/Option";
|
|
4
|
-
import * as tsplus_module_4 from "effect/Effect";
|
|
5
|
-
import * as tsplus_module_5 from "@effect-app/core/EffectX";
|
|
6
|
-
import * as tsplus_module_6 from "effect/impl/Effect";
|
|
7
|
-
import * as tsplus_module_7 from "@effect-app/schema/ext";
|
|
8
|
-
import * as tsplus_module_8 from "@effect-app/prelude/utils";
|
|
9
|
-
import * as tsplus_module_9 from "effect/impl/FiberRef";
|
|
10
|
-
import * as tsplus_module_10 from "@effect-app/core/OptionX";
|
|
11
|
-
import * as tsplus_module_11 from "@effect-app/infra/api/setupRequest";
|
|
12
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
13
|
-
import * as Ex from "@effect-app/infra-adapters/express";
|
|
14
|
-
import { RequestId } from "@effect-app/prelude/ids";
|
|
15
|
-
import { extractSchema, SchemaNamed } from "@effect-app/prelude/schema";
|
|
16
|
-
import * as MO from "@effect-app/prelude/schema";
|
|
17
|
-
import { pretty } from "@effect-app/prelude/utils";
|
|
18
|
-
import { RequestContext } from "../RequestContext.js";
|
|
19
|
-
import { RequestContextContainer, RequestContextContainerImpl } from "../services/RequestContextContainer.js";
|
|
20
|
-
import { restoreFromRequestContext } from "../services/Store/Memory.js";
|
|
21
|
-
import { defaultBasicErrorHandler } from "./defaultErrorHandler.js";
|
|
22
|
-
import { parseRequestParams } from "./express/schema/requestHandler.js";
|
|
23
|
-
import { makeRouteDescriptor } from "./express/schema/routing.js";
|
|
24
|
-
import { reportRequestError } from "./reportError.js";
|
|
25
|
-
import { snipString } from "./util.js";
|
|
26
|
-
export const RequestSettings = tsplus_module_1.FiberRef.unsafeMake({
|
|
27
|
-
verbose: false
|
|
28
|
-
});
|
|
29
|
-
export function makeRequestParsers(Request) {
|
|
30
|
-
const ph = tsplus_module_4.Effect.sync(() => tsplus_module_3.map(tsplus_module_3.map(tsplus_module_3.map(tsplus_module_2.Option.fromNullable(Request.Headers), (s) => s), MO.Parser.for), MO.condemnFail));
|
|
31
|
-
const parseHeaders = (u) => tsplus_module_5.flatMapOption(ph, (d) => d(u));
|
|
32
|
-
const pq = tsplus_module_4.Effect.sync(() => tsplus_module_3.map(tsplus_module_3.map(tsplus_module_3.map(tsplus_module_2.Option.fromNullable(Request.Query), (s) => s), MO.Parser.for), MO.condemnFail));
|
|
33
|
-
const parseQuery = (u) => tsplus_module_5.flatMapOption(pq, (d) => d(u));
|
|
34
|
-
const pb = tsplus_module_4.Effect.sync(() => tsplus_module_3.map(tsplus_module_3.map(tsplus_module_3.map(tsplus_module_2.Option.fromNullable(Request.Body), (s) => s), MO.Parser.for), MO.condemnFail));
|
|
35
|
-
const parseBody = (u) => tsplus_module_5.flatMapOption(pb, (d) => d(u));
|
|
36
|
-
const pp = tsplus_module_4.Effect.sync(() => tsplus_module_3.map(tsplus_module_3.map(tsplus_module_3.map(tsplus_module_2.Option.fromNullable(Request.Path), (s) => s), MO.Parser.for), MO.condemnFail));
|
|
37
|
-
const parsePath = (u) => tsplus_module_5.flatMapOption(pp, (d) => d(u));
|
|
38
|
-
const pc = tsplus_module_4.Effect.sync(() => tsplus_module_3.map(tsplus_module_3.map(tsplus_module_3.map(tsplus_module_2.Option.fromNullable(Request.Cookie), (s) => s), MO.Parser.for), MO.condemnFail));
|
|
39
|
-
const parseCookie = (u) => tsplus_module_5.flatMapOption(pc, (d) => d(u));
|
|
40
|
-
return {
|
|
41
|
-
parseBody,
|
|
42
|
-
parseCookie,
|
|
43
|
-
parseHeaders,
|
|
44
|
-
parsePath,
|
|
45
|
-
parseQuery
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
export function match(requestHandler, errorHandler, middleware) {
|
|
49
|
-
let makeMiddlewareContext = undefined;
|
|
50
|
-
if (middleware) {
|
|
51
|
-
const { handler, makeContext } = middleware(requestHandler);
|
|
52
|
-
requestHandler = handler;
|
|
53
|
-
makeMiddlewareContext = makeContext;
|
|
54
|
-
}
|
|
55
|
-
return tsplus_module_6.zipRight(Ex
|
|
56
|
-
.match(requestHandler.Request.method.toLowerCase())(requestHandler.Request.path.split("?")[0], makeRequestHandler(requestHandler, errorHandler, makeMiddlewareContext)), tsplus_module_4.Effect.sync(() => makeRouteDescriptor(requestHandler.Request.path, requestHandler.Request.method, requestHandler)));
|
|
57
|
-
}
|
|
58
|
-
export function respondSuccess(encodeResponse) {
|
|
59
|
-
return (req, res, a) => tsplus_module_6.flatMap(tsplus_module_4.Effect.sync(() => encodeResponse(req)(a)), (r) => tsplus_module_4.Effect.sync(() => {
|
|
60
|
-
r === undefined
|
|
61
|
-
? res.status(204).send()
|
|
62
|
-
: res
|
|
63
|
-
.status(200)
|
|
64
|
-
.send(JSON.stringify(r));
|
|
65
|
-
}));
|
|
66
|
-
}
|
|
67
|
-
export function makeRequestHandler(handler, errorHandler, makeMiddlewareContext) {
|
|
68
|
-
const { Request, Response, adaptResponse, h: handle } = handler;
|
|
69
|
-
const response = Response ? extractSchema(Response) : MO.Void;
|
|
70
|
-
const encoder = MO.Encoder.for(response);
|
|
71
|
-
const encodeResponse = adaptResponse
|
|
72
|
-
? (req) => MO.Encoder.for(adaptResponse(req))
|
|
73
|
-
: () => encoder;
|
|
74
|
-
const requestParsers = makeRequestParsers(Request);
|
|
75
|
-
const parseRequest = parseRequestParams(requestParsers);
|
|
76
|
-
const respond = respondSuccess(encodeResponse);
|
|
77
|
-
function getParams(req) {
|
|
78
|
-
return tsplus_module_4.Effect.sync(() => ({
|
|
79
|
-
path: req.params,
|
|
80
|
-
query: req.query,
|
|
81
|
-
body: req.body,
|
|
82
|
-
headers: req.headers,
|
|
83
|
-
cookies: req.cookies
|
|
84
|
-
}));
|
|
85
|
-
}
|
|
86
|
-
function makeContext(req) {
|
|
87
|
-
const start = new Date();
|
|
88
|
-
const supported = ["en", "de"];
|
|
89
|
-
const desiredLocale = req.headers["x-locale"];
|
|
90
|
-
const locale = desiredLocale && supported.includes(desiredLocale)
|
|
91
|
-
? desiredLocale
|
|
92
|
-
: "en";
|
|
93
|
-
// const context = getAppInsightsContext()
|
|
94
|
-
// if (!context) {
|
|
95
|
-
// throw new Error("AI Context missing")
|
|
96
|
-
// }
|
|
97
|
-
const requestId = req.headers["request-id"];
|
|
98
|
-
const rootId = requestId ? tsplus_module_7.parseUnsafe(RequestId)(requestId) : RequestId.make();
|
|
99
|
-
const storeId = req.headers["x-store-id"];
|
|
100
|
-
const namespace = MO.ReasonableString((storeId && (Array.isArray(storeId) ? storeId[0] : storeId)) || "primary");
|
|
101
|
-
const requestContext = new RequestContext({
|
|
102
|
-
rootId,
|
|
103
|
-
name: MO.ReasonableString(Request.Model instanceof SchemaNamed ? Request.Model.name : Request.name),
|
|
104
|
-
locale,
|
|
105
|
-
createdAt: start,
|
|
106
|
-
namespace
|
|
107
|
-
// ...(context.operation.parentId
|
|
108
|
-
// ? {
|
|
109
|
-
// parent: new RequestContextParent({
|
|
110
|
-
// id: RequestId(context.operation.parentId),
|
|
111
|
-
// locale,
|
|
112
|
-
// name: ReasonableString("API Request")
|
|
113
|
-
// })
|
|
114
|
-
// }
|
|
115
|
-
// : {})
|
|
116
|
-
});
|
|
117
|
-
// context.requestContext = requestContext
|
|
118
|
-
return requestContext;
|
|
119
|
-
}
|
|
120
|
-
return (req, res) => {
|
|
121
|
-
return tsplus_module_6.flatMap(tsplus_module_4.Effect.all({
|
|
122
|
-
requestContext: tsplus_module_4.Effect.sync(() => {
|
|
123
|
-
const requestContext = makeContext(req);
|
|
124
|
-
if (req.method === "GET") {
|
|
125
|
-
res.setHeader("Cache-Control", "no-store");
|
|
126
|
-
}
|
|
127
|
-
res.setHeader("Content-Language", requestContext.locale);
|
|
128
|
-
return requestContext;
|
|
129
|
-
}),
|
|
130
|
-
pars: getParams(req)
|
|
131
|
-
}), ({ pars, requestContext }) => tsplus_module_6.provideService(tsplus_module_11.withRequestSpan(tsplus_module_6.tap(tsplus_module_6.tapErrorCause(tsplus_module_6.zipRight(tsplus_module_6.flatMap(tsplus_module_9.get(RequestSettings), (s) => tsplus_module_4.Effect.annotateLogs({
|
|
132
|
-
method: req.method,
|
|
133
|
-
path: req.originalUrl,
|
|
134
|
-
...s.verbose
|
|
135
|
-
? {
|
|
136
|
-
reqPath: tsplus_module_8.RecordPretty(tsplus_module_8.object$(pars.path)),
|
|
137
|
-
reqQuery: tsplus_module_8.RecordPretty(tsplus_module_8.object$(pars.query)),
|
|
138
|
-
reqBody: pretty(pars.body),
|
|
139
|
-
reqCookies: pretty(pars.cookies),
|
|
140
|
-
reqHeaders: tsplus_module_8.RecordPretty(tsplus_module_8.object$(pars.headers))
|
|
141
|
-
}
|
|
142
|
-
: undefined
|
|
143
|
-
})(
|
|
144
|
-
// TODO: we don;t have access to user id here cause context is not yet created
|
|
145
|
-
tsplus_module_4.Effect.logInfo("Incoming request"))), tsplus_module_4.Effect.suspend(() => {
|
|
146
|
-
const handleRequest = tsplus_module_6.flatMap(tsplus_module_6.map(parseRequest(req), ({ body, path, query }) => {
|
|
147
|
-
const hn = {
|
|
148
|
-
...tsplus_module_10.getOrUndefined(body),
|
|
149
|
-
...tsplus_module_10.getOrUndefined(query),
|
|
150
|
-
...tsplus_module_10.getOrUndefined(path)
|
|
151
|
-
};
|
|
152
|
-
return hn;
|
|
153
|
-
}), (parsedReq) => tsplus_module_6.flatMap(handle(parsedReq), (r) => respond(parsedReq, res, r)));
|
|
154
|
-
// Commands should not be interruptable.
|
|
155
|
-
const r = req.method !== "GET" ? tsplus_module_6.uninterruptible(handleRequest) : handleRequest; // .instrument("Performance.RequestResponse")
|
|
156
|
-
// the first log entry should be of the request start.
|
|
157
|
-
const r2 = makeMiddlewareContext
|
|
158
|
-
? tsplus_module_6.zipRight(restoreFromRequestContext, tsplus_module_5.provideSomeContextEffect(makeMiddlewareContext(req, res))(r
|
|
159
|
-
// the db namespace must be restored, before calling provide here
|
|
160
|
-
))
|
|
161
|
-
: tsplus_module_6.zipRight(restoreFromRequestContext
|
|
162
|
-
// PR is not relevant here
|
|
163
|
-
, r);
|
|
164
|
-
return errorHandler(req, res, r2);
|
|
165
|
-
})), (cause) => tsplus_module_6.tapErrorCause(tsplus_module_4.Effect.all([
|
|
166
|
-
tsplus_module_4.Effect.sync(() => res.status(500).send()),
|
|
167
|
-
tsplus_module_4.Effect.sync(() => reportRequestError(cause, {
|
|
168
|
-
path: req.originalUrl,
|
|
169
|
-
method: req.method
|
|
170
|
-
})),
|
|
171
|
-
tsplus_module_4.Effect.suspend(() => {
|
|
172
|
-
const headers = res.getHeaders();
|
|
173
|
-
return tsplus_module_4.Effect.annotateLogs({
|
|
174
|
-
method: req.method,
|
|
175
|
-
path: req.originalUrl,
|
|
176
|
-
statusCode: res.statusCode.toString(),
|
|
177
|
-
reqPath: tsplus_module_8.RecordPretty(tsplus_module_8.object$(pars.path)),
|
|
178
|
-
reqQuery: tsplus_module_8.RecordPretty(tsplus_module_8.object$(pars.query)),
|
|
179
|
-
reqBody: pretty(pars.body),
|
|
180
|
-
reqCookies: pretty(pars.cookies),
|
|
181
|
-
reqHeaders: tsplus_module_8.RecordPretty(tsplus_module_8.object$(pars.headers)),
|
|
182
|
-
resHeaders: tsplus_module_8.RecordPretty(tsplus_module_8.object$(Object
|
|
183
|
-
.entries(headers)
|
|
184
|
-
.reduce((prev, [key, value]) => {
|
|
185
|
-
prev[key] = value && typeof value === "string" ? snipString(value) : value;
|
|
186
|
-
return prev;
|
|
187
|
-
}, {})))
|
|
188
|
-
})(tsplus_module_4.Effect.logError("Finished request", cause));
|
|
189
|
-
})
|
|
190
|
-
], { concurrency: "inherit" }), (cause) => tsplus_module_4.Effect.sync(() => console.error("Error occurred while reporting error", cause)))), () => tsplus_module_6.flatMap(tsplus_module_9.get(RequestSettings), (s) => {
|
|
191
|
-
const headers = res.getHeaders();
|
|
192
|
-
return tsplus_module_4.Effect.annotateLogs({
|
|
193
|
-
method: req.method,
|
|
194
|
-
path: req.originalUrl,
|
|
195
|
-
statusCode: res.statusCode.toString(),
|
|
196
|
-
...s.verbose
|
|
197
|
-
? {
|
|
198
|
-
resHeaders: tsplus_module_8.RecordPretty(tsplus_module_8.object$(headers))
|
|
199
|
-
}
|
|
200
|
-
: undefined
|
|
201
|
-
})(tsplus_module_4.Effect.logInfo("Finished request"));
|
|
202
|
-
}))), RequestContextContainer, new RequestContextContainerImpl(requestContext)) // otherwise external error reporter breaks.
|
|
203
|
-
);
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Gather all handlers of a module and attach them to the Server.
|
|
208
|
-
* Requires no login.
|
|
209
|
-
*/
|
|
210
|
-
export function matchAll(handlers) {
|
|
211
|
-
const mapped = tsplus_module_8.RecordKeys(tsplus_module_8.object$(handlers)).reduce((prev, cur) => {
|
|
212
|
-
prev[cur] = match(handlers[cur], defaultBasicErrorHandler);
|
|
213
|
-
return prev;
|
|
214
|
-
}, {});
|
|
215
|
-
return mapped;
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Gather all handlers of a module and attach them to the Server.
|
|
219
|
-
* Requires no login.
|
|
220
|
-
*/
|
|
221
|
-
export function matchAllAlt(handlers) {
|
|
222
|
-
const mapped = tsplus_module_8.RecordKeys(tsplus_module_8.object$(handlers)).reduce((prev, cur) => {
|
|
223
|
-
const matches = matchAll(handlers[cur]);
|
|
224
|
-
tsplus_module_8.RecordKeys(tsplus_module_8.object$(matches)).forEach((key) => prev[`${cur}.${key}`] = matches[key]);
|
|
225
|
-
return prev;
|
|
226
|
-
}, {});
|
|
227
|
-
return mapped;
|
|
228
|
-
}
|
|
229
|
-
export function handle(_, adaptResponse) {
|
|
230
|
-
// TODO: Prevent over providing // no strict/shrink yet.
|
|
231
|
-
const Request = MO.extractRequest(_);
|
|
232
|
-
const Response = MO.extractResponse(_);
|
|
233
|
-
return (h) => ({
|
|
234
|
-
adaptResponse,
|
|
235
|
-
h,
|
|
236
|
-
Request,
|
|
237
|
-
Response,
|
|
238
|
-
ResponseOpenApi: _.ResponseOpenApi ?? Response
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Provided a module with resources, and provided an Object with resource handlers, will prepare route handlers to be attached to server.
|
|
243
|
-
* @param mod The module with Resources you want to match.
|
|
244
|
-
* @returns A function that must be called with an Object with a handler "Request -> Effect<R, E, Response>" for each resource defined in the Module.
|
|
245
|
-
*
|
|
246
|
-
* Example:
|
|
247
|
-
* ```
|
|
248
|
-
* class SayHelloRequest extends Get("/say-hello")<SayHelloRequest>()({ name: prop(ReasonableString) }) {}
|
|
249
|
-
* class SayHelloResponse extends Model<SayHelloRequest>()({ message: prop(LongString) }) {}
|
|
250
|
-
*
|
|
251
|
-
* export const SayHelloControllers = matchResource({ SayHello: { SayHelloRequest, SayHelloResponse } })({
|
|
252
|
-
* SayHello: (req) => Effect.sync(() => { message: `Hi ${req.name}` })
|
|
253
|
-
* })
|
|
254
|
-
* ```
|
|
255
|
-
*/
|
|
256
|
-
export function matchResource(mod) {
|
|
257
|
-
return (handlers) => {
|
|
258
|
-
const handler = tsplus_module_8.RecordKeys(tsplus_module_8.object$(mod)).reduce((prev, cur) => {
|
|
259
|
-
prev[cur] = handle(mod[cur])(handlers[cur]);
|
|
260
|
-
return prev;
|
|
261
|
-
}, {});
|
|
262
|
-
return handler;
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL19zcmMvYXBpL3JvdXRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUd4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFFbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUN2RSxPQUFPLEtBQUssRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUdsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDckQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFDN0csT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDdkUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFFdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUV0QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsZ0JBQUEsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNqRCxPQUFPLEVBQUUsS0FBSztDQUNmLENBQUMsQ0FBQTtBQUVGLE1BQU0sVUFBVSxrQkFBa0IsQ0FXaEMsT0FVWTtJQUVaLE1BQU0sRUFBRSxHQUFHLGdCQUFBLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENB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
|