@duplojs/http 0.8.4 → 0.9.5
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/dist/core/builders/preflight/builder.d.ts +5 -6
- package/dist/core/builders/preflight/process.d.ts +3 -4
- package/dist/core/builders/preflight/route.d.ts +4 -5
- package/dist/core/builders/process/builder.d.ts +4 -5
- package/dist/core/builders/process/checker.d.ts +2 -3
- package/dist/core/builders/process/cut.d.ts +4 -5
- package/dist/core/builders/process/exports.d.ts +3 -4
- package/dist/core/builders/process/extract.d.ts +2 -3
- package/dist/core/builders/process/presetChecker.d.ts +2 -3
- package/dist/core/builders/process/process.d.ts +3 -4
- package/dist/core/builders/route/builder.d.ts +6 -6
- package/dist/core/builders/route/checker.d.ts +2 -3
- package/dist/core/builders/route/cut.d.ts +4 -5
- package/dist/core/builders/route/extract.d.ts +3 -3
- package/dist/core/builders/route/handler.d.ts +3 -4
- package/dist/core/builders/route/presetChecker.d.ts +2 -3
- package/dist/core/builders/route/process.d.ts +3 -4
- package/dist/core/defaultHooks/index.d.ts +1 -1
- package/dist/core/functionsBuilders/index.cjs +1 -0
- package/dist/core/functionsBuilders/index.d.ts +1 -0
- package/dist/core/functionsBuilders/index.mjs +1 -0
- package/dist/core/functionsBuilders/route/build.d.ts +5 -2
- package/dist/core/functionsBuilders/route/create.d.ts +3 -5
- package/dist/core/functionsBuilders/route/{hook.cjs → default/hook.cjs} +16 -7
- package/dist/core/functionsBuilders/route/{hook.d.ts → default/hook.d.ts} +5 -5
- package/dist/core/functionsBuilders/route/{hook.mjs → default/hook.mjs} +16 -7
- package/dist/core/functionsBuilders/route/{default.cjs → default/index.cjs} +22 -34
- package/dist/core/functionsBuilders/route/default/index.d.ts +2 -0
- package/dist/core/functionsBuilders/route/{default.mjs → default/index.mjs} +11 -29
- package/dist/core/functionsBuilders/route/index.cjs +2 -9
- package/dist/core/functionsBuilders/route/index.d.ts +0 -1
- package/dist/core/functionsBuilders/route/index.mjs +1 -2
- package/dist/core/functionsBuilders/router/build.cjs +7 -0
- package/dist/core/functionsBuilders/router/build.d.ts +14 -0
- package/dist/core/functionsBuilders/router/build.mjs +5 -0
- package/dist/core/functionsBuilders/router/create.cjs +7 -0
- package/dist/core/functionsBuilders/router/create.d.ts +15 -0
- package/dist/core/functionsBuilders/router/create.mjs +5 -0
- package/dist/core/functionsBuilders/router/default/index.cjs +52 -0
- package/dist/core/functionsBuilders/router/default/index.d.ts +1 -0
- package/dist/core/functionsBuilders/router/default/index.mjs +50 -0
- package/dist/core/functionsBuilders/router/index.cjs +11 -0
- package/dist/core/functionsBuilders/router/index.d.ts +3 -0
- package/dist/core/functionsBuilders/router/index.mjs +3 -0
- package/dist/core/functionsBuilders/steps/create.d.ts +3 -6
- package/dist/core/hub/defaultMalformedUrlHandler.d.ts +1 -1
- package/dist/core/hub/defaultNotfoundHandler.d.ts +1 -1
- package/dist/core/hub/hooks.d.ts +2 -2
- package/dist/core/hub/index.cjs +5 -0
- package/dist/core/hub/index.d.ts +6 -3
- package/dist/core/hub/index.mjs +5 -0
- package/dist/core/implementHttpServer.cjs +1 -1
- package/dist/core/implementHttpServer.d.ts +2 -2
- package/dist/core/implementHttpServer.mjs +2 -2
- package/dist/core/index.cjs +15 -14
- package/dist/core/index.mjs +8 -6
- package/dist/core/process/index.d.ts +0 -7
- package/dist/core/request/bodyController/formData.cjs +1 -0
- package/dist/core/request/bodyController/formData.d.ts +2 -0
- package/dist/core/request/bodyController/formData.mjs +1 -0
- package/dist/core/route/hooks.cjs +2 -17
- package/dist/core/route/hooks.d.ts +15 -32
- package/dist/core/route/hooks.mjs +3 -17
- package/dist/core/route/index.cjs +0 -1
- package/dist/core/route/index.mjs +1 -1
- package/dist/core/router/{buildSystemRoute.cjs → createRouterElementSystem.cjs} +4 -3
- package/dist/core/router/createRouterElementSystem.d.ts +9 -0
- package/dist/core/router/{buildSystemRoute.mjs → createRouterElementSystem.mjs} +4 -3
- package/dist/core/router/index.cjs +19 -60
- package/dist/core/router/index.d.ts +3 -4
- package/dist/core/router/index.mjs +17 -56
- package/dist/core/router/types/buildedRouter.d.ts +2 -12
- package/dist/core/router/types/index.cjs +4 -0
- package/dist/core/router/types/index.d.ts +4 -0
- package/dist/core/router/types/index.mjs +4 -0
- package/dist/core/router/types/router.cjs +2 -0
- package/dist/core/router/types/router.d.ts +12 -0
- package/dist/core/router/types/router.mjs +1 -0
- package/dist/core/router/types/routerElement.cjs +2 -0
- package/dist/core/router/types/routerElement.d.ts +8 -0
- package/dist/core/router/types/routerElement.mjs +1 -0
- package/dist/core/router/types/routerElementSystem.cjs +2 -0
- package/dist/core/router/types/routerElementSystem.d.ts +6 -0
- package/dist/core/router/types/routerElementSystem.mjs +1 -0
- package/dist/core/router/types/routerElementWrapper.cjs +2 -0
- package/dist/core/router/types/routerElementWrapper.d.ts +2 -0
- package/dist/core/router/types/routerElementWrapper.mjs +1 -0
- package/dist/core/steps/cut.d.ts +1 -2
- package/dist/core/steps/handler.d.ts +1 -2
- package/dist/core/steps/types/stepFunctionParams.d.ts +2 -2
- package/dist/interfaces/node/bodyReaders/formData/index.cjs +1 -0
- package/dist/interfaces/node/bodyReaders/formData/index.mjs +1 -0
- package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.cjs +10 -1
- package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.d.ts +2 -1
- package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.mjs +10 -1
- package/dist/interfaces/node/createHttpServer.cjs +2 -2
- package/dist/interfaces/node/createHttpServer.mjs +2 -2
- package/dist/interfaces/node/hooks/index.d.ts +3 -3
- package/dist/plugins/cacheController/hooks.cjs +2 -1
- package/dist/plugins/cacheController/hooks.d.ts +1 -1
- package/dist/plugins/cacheController/hooks.mjs +2 -1
- package/dist/plugins/cors/headerFunctions/allowHeaders.cjs +11 -0
- package/dist/plugins/cors/headerFunctions/allowHeaders.d.ts +5 -0
- package/dist/plugins/cors/headerFunctions/allowHeaders.mjs +9 -0
- package/dist/plugins/cors/headerFunctions/allowMethods.cjs +16 -0
- package/dist/plugins/cors/headerFunctions/allowMethods.d.ts +6 -0
- package/dist/plugins/cors/headerFunctions/allowMethods.mjs +14 -0
- package/dist/plugins/cors/headerFunctions/allowOrigin.cjs +24 -0
- package/dist/plugins/cors/headerFunctions/allowOrigin.d.ts +7 -0
- package/dist/plugins/cors/headerFunctions/allowOrigin.mjs +22 -0
- package/dist/plugins/cors/headerFunctions/credentials.cjs +11 -0
- package/dist/plugins/cors/headerFunctions/credentials.d.ts +5 -0
- package/dist/plugins/cors/headerFunctions/credentials.mjs +9 -0
- package/dist/plugins/cors/headerFunctions/exposeHeaders.cjs +11 -0
- package/dist/plugins/cors/headerFunctions/exposeHeaders.d.ts +5 -0
- package/dist/plugins/cors/headerFunctions/exposeHeaders.mjs +9 -0
- package/dist/plugins/cors/headerFunctions/index.cjs +19 -0
- package/dist/plugins/cors/headerFunctions/index.d.ts +7 -0
- package/dist/plugins/cors/headerFunctions/index.mjs +7 -0
- package/dist/plugins/cors/headerFunctions/maxAge.cjs +11 -0
- package/dist/plugins/cors/headerFunctions/maxAge.d.ts +5 -0
- package/dist/plugins/cors/headerFunctions/maxAge.mjs +9 -0
- package/dist/plugins/cors/headerFunctions/vary.cjs +35 -0
- package/dist/plugins/cors/headerFunctions/vary.d.ts +5 -0
- package/dist/plugins/cors/headerFunctions/vary.mjs +33 -0
- package/dist/plugins/cors/index.cjs +9 -0
- package/dist/plugins/cors/index.d.ts +2 -0
- package/dist/plugins/cors/index.mjs +2 -0
- package/dist/plugins/cors/metadata.cjs +8 -0
- package/dist/plugins/cors/metadata.d.ts +1 -0
- package/dist/plugins/cors/metadata.mjs +6 -0
- package/dist/plugins/cors/plugin.cjs +108 -0
- package/dist/plugins/cors/plugin.d.ts +12 -0
- package/dist/plugins/cors/plugin.mjs +106 -0
- package/dist/plugins/openApiGenerator/makeOpenApiRoute.d.ts +1 -1
- package/dist/plugins/static/makeRouteFile.d.ts +2 -2
- package/dist/plugins/static/makeRouteFolder.cjs +1 -1
- package/dist/plugins/static/makeRouteFolder.d.ts +2 -2
- package/dist/plugins/static/makeRouteFolder.mjs +1 -1
- package/dist/plugins/static/plugin.d.ts +1 -1
- package/package.json +30 -5
- package/dist/core/functionsBuilders/route/default.d.ts +0 -1
- package/dist/core/router/buildSystemRoute.d.ts +0 -11
- /package/dist/core/{router/decodeUrl.cjs → decodeUrl.cjs} +0 -0
- /package/dist/core/{router/decodeUrl.d.ts → decodeUrl.d.ts} +0 -0
- /package/dist/core/{router/decodeUrl.mjs → decodeUrl.mjs} +0 -0
|
@@ -2,14 +2,11 @@ import '../hub/index.mjs';
|
|
|
2
2
|
import { pipe, A, isType, G, E, unwrap, justReturn, O, forward } from '@duplojs/utils';
|
|
3
3
|
import { pathToRegExp } from './pathToRegExp.mjs';
|
|
4
4
|
import { RouterBuildError } from './buildError.mjs';
|
|
5
|
-
import '../functionsBuilders/route/index.mjs';
|
|
6
|
-
import { decodeUrl } from './decodeUrl.mjs';
|
|
7
|
-
export { regexQueryAnalyser, regexUrlAnalyser } from './decodeUrl.mjs';
|
|
8
5
|
import { NotFoundBodyReaderImplementationError } from './notFoundBodyReaderImplementationError.mjs';
|
|
9
6
|
import '../functionsBuilders/index.mjs';
|
|
10
|
-
import {
|
|
7
|
+
import { createRouterElementSystem } from './createRouterElementSystem.mjs';
|
|
11
8
|
import './types/index.mjs';
|
|
12
|
-
import { defaultRouteFunctionBuilder } from '../functionsBuilders/route/default.mjs';
|
|
9
|
+
import { defaultRouteFunctionBuilder } from '../functionsBuilders/route/default/index.mjs';
|
|
13
10
|
import { defaultCheckerStepFunctionBuilder } from '../functionsBuilders/steps/defaults/checkerStep.mjs';
|
|
14
11
|
import { defaultCutStepFunctionBuilder } from '../functionsBuilders/steps/defaults/cutStep.mjs';
|
|
15
12
|
import { defaultHandlerStepFunctionBuilder } from '../functionsBuilders/steps/defaults/handlerStep.mjs';
|
|
@@ -17,8 +14,10 @@ import { defaultExtractStepFunctionBuilder } from '../functionsBuilders/steps/de
|
|
|
17
14
|
import { defaultProcessStepFunctionBuilder } from '../functionsBuilders/steps/defaults/processStep.mjs';
|
|
18
15
|
import { launchHookBeforeBuildRoute } from '../hub/hooks.mjs';
|
|
19
16
|
import { buildRouteFunction } from '../functionsBuilders/route/build.mjs';
|
|
17
|
+
import { buildRouterFunction } from '../functionsBuilders/router/build.mjs';
|
|
18
|
+
import { defaultRouterFunctionBuilder } from '../functionsBuilders/router/default/index.mjs';
|
|
20
19
|
|
|
21
|
-
async function
|
|
20
|
+
async function createRouter(hub) {
|
|
22
21
|
const { environment } = hub.config;
|
|
23
22
|
const { hooksRouteLifeCycle, routes, hooksHubLifeCycle, bodyReaderImplementations, } = hub;
|
|
24
23
|
const routeFunctionBuilders = [
|
|
@@ -41,7 +40,7 @@ async function buildRouter(hub) {
|
|
|
41
40
|
routeFunctionBuilders,
|
|
42
41
|
defaultExtractContract: hub.defaultExtractContract,
|
|
43
42
|
};
|
|
44
|
-
const
|
|
43
|
+
const routerElementWrapper = await G.asyncReduce(routes, G.reduceFrom({}), async ({ lastValue, element: route, nextWithObject, }) => {
|
|
45
44
|
const routeAfterHook = await launchHookBeforeBuildRoute(hooksBeforeBuildRoute, route);
|
|
46
45
|
const buildedRoute = await buildRouteFunction(routeAfterHook, buildParams);
|
|
47
46
|
if (E.isLeft(buildedRoute)) {
|
|
@@ -61,61 +60,23 @@ async function buildRouter(hub) {
|
|
|
61
60
|
}))),
|
|
62
61
|
});
|
|
63
62
|
});
|
|
64
|
-
const
|
|
63
|
+
const notfoundRouterElement = await createRouterElementSystem({
|
|
65
64
|
handlerStep: hub.notfoundHandler,
|
|
66
65
|
buildParams,
|
|
67
66
|
});
|
|
68
|
-
const
|
|
67
|
+
const malformedUrlRouterElement = await createRouterElementSystem({
|
|
69
68
|
handlerStep: hub.malformedUrlHandler,
|
|
70
69
|
buildParams,
|
|
71
70
|
});
|
|
72
|
-
const Request = hub.classRequest;
|
|
73
71
|
return {
|
|
74
|
-
exec: (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
query: {},
|
|
83
|
-
matchedPath: null,
|
|
84
|
-
bodyReader: defaultMalformedUrlRoute.bodyReader,
|
|
85
|
-
}));
|
|
86
|
-
}
|
|
87
|
-
if (!routerElements) {
|
|
88
|
-
return defaultNotfoundRoute.buildedRoute(new Request({
|
|
89
|
-
...initializationData,
|
|
90
|
-
...decodedUrl,
|
|
91
|
-
params: {},
|
|
92
|
-
matchedPath: null,
|
|
93
|
-
bodyReader: defaultNotfoundRoute.bodyReader,
|
|
94
|
-
}));
|
|
95
|
-
}
|
|
96
|
-
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
|
97
|
-
for (let index = 0; index < routerElements.length; index++) {
|
|
98
|
-
const routerElement = routerElements[index];
|
|
99
|
-
const result = routerElement.pattern.exec(decodedUrl.path);
|
|
100
|
-
if (!result) {
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
return routerElement.buildedRoute(new Request({
|
|
104
|
-
...initializationData,
|
|
105
|
-
...decodedUrl,
|
|
106
|
-
params: result.groups ?? {},
|
|
107
|
-
matchedPath: routerElement.matchedPath,
|
|
108
|
-
bodyReader: routerElement.bodyReader,
|
|
109
|
-
}));
|
|
110
|
-
}
|
|
111
|
-
return defaultNotfoundRoute.buildedRoute(new Request({
|
|
112
|
-
...initializationData,
|
|
113
|
-
...decodedUrl,
|
|
114
|
-
params: {},
|
|
115
|
-
matchedPath: null,
|
|
116
|
-
bodyReader: defaultNotfoundRoute.bodyReader,
|
|
117
|
-
}));
|
|
118
|
-
},
|
|
72
|
+
exec: await buildRouterFunction({
|
|
73
|
+
environment: hub.config.environment,
|
|
74
|
+
routerElementWrapper,
|
|
75
|
+
notfoundRouterElement: notfoundRouterElement,
|
|
76
|
+
malformedUrlRouterElement: malformedUrlRouterElement,
|
|
77
|
+
classRequest: hub.classRequest,
|
|
78
|
+
routerFunctionBuilder: hub.routerFunctionBuilder ?? defaultRouterFunctionBuilder,
|
|
79
|
+
}),
|
|
119
80
|
hooksRouteLifeCycle,
|
|
120
81
|
routeFunctionBuilders,
|
|
121
82
|
routes,
|
|
@@ -124,4 +85,4 @@ async function buildRouter(hub) {
|
|
|
124
85
|
};
|
|
125
86
|
}
|
|
126
87
|
|
|
127
|
-
export { NotFoundBodyReaderImplementationError, RouterBuildError,
|
|
88
|
+
export { NotFoundBodyReaderImplementationError, RouterBuildError, createRouter, createRouterElementSystem, pathToRegExp };
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
import { type createStepFunctionBuilder, type createRouteFunctionBuilder } from "../../functionsBuilders";
|
|
2
|
-
import { type HookHubLifeCycle } from "../../hub";
|
|
3
1
|
import { type RequestInitializationData } from "../../request";
|
|
4
|
-
|
|
5
|
-
export type
|
|
6
|
-
export interface BuildedRouter {
|
|
7
|
-
exec(initializationData: RouterInitializationData): Promise<void>;
|
|
8
|
-
readonly routes: ReadonlySet<Route>;
|
|
9
|
-
readonly hooksRouteLifeCycle: readonly HookRouteLifeCycle[];
|
|
10
|
-
readonly routeFunctionBuilders: readonly ReturnType<typeof createRouteFunctionBuilder>[];
|
|
11
|
-
readonly stepFunctionBuilders: readonly ReturnType<typeof createStepFunctionBuilder>[];
|
|
12
|
-
readonly hooksHubLifeCycle: readonly HookHubLifeCycle[];
|
|
13
|
-
}
|
|
2
|
+
export type RouterParams = Omit<RequestInitializationData, "matchedPath" | "bodyReader" | "params" | "path" | "query">;
|
|
3
|
+
export type BuildedRouter = (params: RouterParams) => Promise<void>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type createRouteFunctionBuilder, type createStepFunctionBuilder } from "../../functionsBuilders";
|
|
2
|
+
import { type HookHubLifeCycle } from "../../hub";
|
|
3
|
+
import { type HookRouteLifeCycle, type Route } from "../../route";
|
|
4
|
+
import { type BuildedRouter } from "./buildedRouter";
|
|
5
|
+
export interface Router {
|
|
6
|
+
exec: BuildedRouter;
|
|
7
|
+
readonly routes: ReadonlySet<Route>;
|
|
8
|
+
readonly hooksRouteLifeCycle: readonly HookRouteLifeCycle[];
|
|
9
|
+
readonly routeFunctionBuilders: readonly ReturnType<typeof createRouteFunctionBuilder>[];
|
|
10
|
+
readonly stepFunctionBuilders: readonly ReturnType<typeof createStepFunctionBuilder>[];
|
|
11
|
+
readonly hooksHubLifeCycle: readonly HookHubLifeCycle[];
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type BodyReader } from "../../request";
|
|
2
|
+
import { type BuildedRoute } from "../../route/types";
|
|
3
|
+
export interface RouterElement {
|
|
4
|
+
readonly pattern: RegExp;
|
|
5
|
+
readonly matchedPath: string;
|
|
6
|
+
readonly bodyReader: BodyReader;
|
|
7
|
+
readonly buildedRoute: BuildedRoute;
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
package/dist/core/steps/cut.d.ts
CHANGED
|
@@ -3,12 +3,11 @@ import { type StepKind } from "./kind";
|
|
|
3
3
|
import { type Floor } from "../floor";
|
|
4
4
|
import { type StepFunctionParams } from "./types";
|
|
5
5
|
import { type PredictedResponse, type ResponseContract } from "../response";
|
|
6
|
-
import { type Request } from "../request";
|
|
7
6
|
import { type Metadata } from "../metadata";
|
|
8
7
|
export declare const cutStepOutputKind: import("@duplojs/utils").KindHandler<import("@duplojs/utils").KindDefinition<"@DuplojsHttpCore/cut-output", unknown>>;
|
|
9
8
|
export interface CutStepFunctionOutput<GenericData extends Record<string, unknown> = Record<string, unknown>> extends Kind<typeof cutStepOutputKind.definition>, WrappedValue<GenericData> {
|
|
10
9
|
}
|
|
11
|
-
export interface CutStepFunctionParams<
|
|
10
|
+
export interface CutStepFunctionParams<GenericResponse extends PredictedResponse = PredictedResponse> extends StepFunctionParams<GenericResponse> {
|
|
12
11
|
output<GenericData extends Record<string, unknown> = never>(data?: GenericData): CutStepFunctionOutput<NeverCoalescing<GenericData, {}>>;
|
|
13
12
|
}
|
|
14
13
|
export interface CutStepDefinition {
|
|
@@ -2,7 +2,6 @@ import { type MaybePromise, type Kind, type MaybeArray } from "@duplojs/utils";
|
|
|
2
2
|
import { type StepKind } from "./kind";
|
|
3
3
|
import { type Floor } from "../floor";
|
|
4
4
|
import { type ServerSentEventsPredictedResponse, type PredictedResponse, type ResponseContract } from "../response";
|
|
5
|
-
import { type Request } from "../request";
|
|
6
5
|
import { type StepFunctionParams } from "./types";
|
|
7
6
|
import { type Metadata } from "../metadata";
|
|
8
7
|
interface HandlerStepFunctionParamsServerSentEventsResponse<GenericResponse extends ServerSentEventsPredictedResponse> {
|
|
@@ -10,7 +9,7 @@ interface HandlerStepFunctionParamsServerSentEventsResponse<GenericResponse exte
|
|
|
10
9
|
information: GenericInformation;
|
|
11
10
|
}>>(information: GenericInformation, startSendingEvents: GenericFilteredResponse["startSendingEvents"]): GenericFilteredResponse;
|
|
12
11
|
}
|
|
13
|
-
export interface HandlerStepFunctionParams<
|
|
12
|
+
export interface HandlerStepFunctionParams<GenericResponse extends PredictedResponse | ServerSentEventsPredictedResponse = PredictedResponse | ServerSentEventsPredictedResponse> extends StepFunctionParams<Extract<GenericResponse, PredictedResponse>>, HandlerStepFunctionParamsServerSentEventsResponse<Extract<GenericResponse, ServerSentEventsPredictedResponse>> {
|
|
14
13
|
}
|
|
15
14
|
export interface HandlerStepDefinition {
|
|
16
15
|
theFunction(floor: Floor, params: HandlerStepFunctionParams): MaybePromise<PredictedResponse | ServerSentEventsPredictedResponse>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type Request } from "../../request";
|
|
2
2
|
import { type PredictedResponse } from "../../response";
|
|
3
3
|
import { type IsEqual, type Or } from "@duplojs/utils";
|
|
4
|
-
export interface StepFunctionParams<
|
|
5
|
-
request:
|
|
4
|
+
export interface StepFunctionParams<GenericResponse extends PredictedResponse = PredictedResponse> {
|
|
5
|
+
request: Request;
|
|
6
6
|
response<GenericInformation extends GenericResponse["information"], GenericFilteredResponse extends Extract<GenericResponse, {
|
|
7
7
|
information: GenericInformation;
|
|
8
8
|
}>>(information: GenericInformation, ...args: Or<[
|
|
@@ -55,6 +55,7 @@ function createFormDataBodyReaderImplementation(serverParams) {
|
|
|
55
55
|
const result = await readRequestFormData.readRequestFormData(request.raw.request, new Map(), {
|
|
56
56
|
maxBodySize: params.bodyMaxSize ?? serverMaxBodySize,
|
|
57
57
|
fileMaxSize: params.fileMaxSize ?? Infinity,
|
|
58
|
+
textFieldMaxSize: params.textFieldMaxSize ?? Infinity,
|
|
58
59
|
maxFileQuantity: params.maxFileQuantity,
|
|
59
60
|
mimeType: params.mimeType,
|
|
60
61
|
maxBufferSize: params.maxBufferSize,
|
|
@@ -53,6 +53,7 @@ function createFormDataBodyReaderImplementation(serverParams) {
|
|
|
53
53
|
const result = await readRequestFormData(request.raw.request, new Map(), {
|
|
54
54
|
maxBodySize: params.bodyMaxSize ?? serverMaxBodySize,
|
|
55
55
|
fileMaxSize: params.fileMaxSize ?? Infinity,
|
|
56
|
+
textFieldMaxSize: params.textFieldMaxSize ?? Infinity,
|
|
56
57
|
maxFileQuantity: params.maxFileQuantity,
|
|
57
58
|
mimeType: params.mimeType,
|
|
58
59
|
maxBufferSize: params.maxBufferSize,
|
|
@@ -32,6 +32,7 @@ async function readRequestFormData(request, firstValueAccumulator, params, onRec
|
|
|
32
32
|
let currentStream = undefined;
|
|
33
33
|
let fileQuantity = 0;
|
|
34
34
|
let currentFileSize = undefined;
|
|
35
|
+
let currentTextFieldSize = undefined;
|
|
35
36
|
const checkSize = (receivedChunk) => {
|
|
36
37
|
size += receivedChunk.length;
|
|
37
38
|
return size > params.maxBodySize
|
|
@@ -61,6 +62,7 @@ async function readRequestFormData(request, firstValueAccumulator, params, onRec
|
|
|
61
62
|
}
|
|
62
63
|
if (header.filename !== undefined) {
|
|
63
64
|
currentFileSize = 0;
|
|
65
|
+
currentTextFieldSize = undefined;
|
|
64
66
|
fileQuantity++;
|
|
65
67
|
if (fileQuantity > params.maxFileQuantity) {
|
|
66
68
|
return new error.BodyParseFormDataError("File quantity exceeds limit.");
|
|
@@ -72,6 +74,7 @@ async function readRequestFormData(request, firstValueAccumulator, params, onRec
|
|
|
72
74
|
}
|
|
73
75
|
else {
|
|
74
76
|
currentFileSize = undefined;
|
|
77
|
+
currentTextFieldSize = 0;
|
|
75
78
|
}
|
|
76
79
|
const newStream = await onReceiveHeader(header);
|
|
77
80
|
if (newStream instanceof Error) {
|
|
@@ -93,10 +96,16 @@ async function readRequestFormData(request, firstValueAccumulator, params, onRec
|
|
|
93
96
|
}
|
|
94
97
|
if (typeof currentFileSize === "number") {
|
|
95
98
|
currentFileSize += chunk.length;
|
|
96
|
-
if (
|
|
99
|
+
if (currentFileSize > params.fileMaxSize) {
|
|
97
100
|
return new error.BodyParseFormDataError("File size exceeds limit.");
|
|
98
101
|
}
|
|
99
102
|
}
|
|
103
|
+
if (typeof currentTextFieldSize === "number") {
|
|
104
|
+
currentTextFieldSize += chunk.length;
|
|
105
|
+
if (currentTextFieldSize > params.textFieldMaxSize) {
|
|
106
|
+
return new error.BodyParseFormDataError("Text field size exceeds limit.");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
100
109
|
await currentStream.onReceiveChunk(chunk);
|
|
101
110
|
return true;
|
|
102
111
|
};
|
|
@@ -14,7 +14,8 @@ export interface ReadRequestFormDataParams {
|
|
|
14
14
|
maxFileQuantity: number;
|
|
15
15
|
maxBufferSize: number;
|
|
16
16
|
maxKeyLength: number;
|
|
17
|
-
fileMaxSize
|
|
17
|
+
fileMaxSize: number;
|
|
18
|
+
textFieldMaxSize: number;
|
|
18
19
|
mimeType?: RegExp;
|
|
19
20
|
}
|
|
20
21
|
export declare function readRequestFormData<GenericValueAccumulator extends unknown, GenericOutputHeader extends E.Left = never>(request: http.IncomingMessage, firstValueAccumulator: GenericValueAccumulator, params: ReadRequestFormDataParams, onReceiveHeader: (header: HeaderPartInformation) => MaybePromise<ReadRequestFormDataStreamChunkEvent<GenericValueAccumulator> | Error>): Promise<E.Left<"server-error", unknown> | GenericOutputHeader | E.Error<Error> | GenericValueAccumulator>;
|
|
@@ -30,6 +30,7 @@ async function readRequestFormData(request, firstValueAccumulator, params, onRec
|
|
|
30
30
|
let currentStream = undefined;
|
|
31
31
|
let fileQuantity = 0;
|
|
32
32
|
let currentFileSize = undefined;
|
|
33
|
+
let currentTextFieldSize = undefined;
|
|
33
34
|
const checkSize = (receivedChunk) => {
|
|
34
35
|
size += receivedChunk.length;
|
|
35
36
|
return size > params.maxBodySize
|
|
@@ -59,6 +60,7 @@ async function readRequestFormData(request, firstValueAccumulator, params, onRec
|
|
|
59
60
|
}
|
|
60
61
|
if (header.filename !== undefined) {
|
|
61
62
|
currentFileSize = 0;
|
|
63
|
+
currentTextFieldSize = undefined;
|
|
62
64
|
fileQuantity++;
|
|
63
65
|
if (fileQuantity > params.maxFileQuantity) {
|
|
64
66
|
return new BodyParseFormDataError("File quantity exceeds limit.");
|
|
@@ -70,6 +72,7 @@ async function readRequestFormData(request, firstValueAccumulator, params, onRec
|
|
|
70
72
|
}
|
|
71
73
|
else {
|
|
72
74
|
currentFileSize = undefined;
|
|
75
|
+
currentTextFieldSize = 0;
|
|
73
76
|
}
|
|
74
77
|
const newStream = await onReceiveHeader(header);
|
|
75
78
|
if (newStream instanceof Error) {
|
|
@@ -91,10 +94,16 @@ async function readRequestFormData(request, firstValueAccumulator, params, onRec
|
|
|
91
94
|
}
|
|
92
95
|
if (typeof currentFileSize === "number") {
|
|
93
96
|
currentFileSize += chunk.length;
|
|
94
|
-
if (
|
|
97
|
+
if (currentFileSize > params.fileMaxSize) {
|
|
95
98
|
return new BodyParseFormDataError("File size exceeds limit.");
|
|
96
99
|
}
|
|
97
100
|
}
|
|
101
|
+
if (typeof currentTextFieldSize === "number") {
|
|
102
|
+
currentTextFieldSize += chunk.length;
|
|
103
|
+
if (currentTextFieldSize > params.textFieldMaxSize) {
|
|
104
|
+
return new BodyParseFormDataError("Text field size exceeds limit.");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
98
107
|
await currentStream.onReceiveChunk(chunk);
|
|
99
108
|
return true;
|
|
100
109
|
};
|
|
@@ -24,8 +24,8 @@ function createHttpServer(hub, params) {
|
|
|
24
24
|
index.createTextBodyReaderImplementation(httpServerParams),
|
|
25
25
|
index$1.createFormDataBodyReaderImplementation(httpServerParams),
|
|
26
26
|
]);
|
|
27
|
-
function whenUncaughtError(error,
|
|
28
|
-
const serverResponse =
|
|
27
|
+
function whenUncaughtError(error, routerParams) {
|
|
28
|
+
const serverResponse = routerParams.raw.response;
|
|
29
29
|
if (!serverResponse.headersSent && !serverResponse.writableEnded) {
|
|
30
30
|
serverResponse.writeHead(500, {
|
|
31
31
|
[httpServerParams.informationHeaderKey]: "critical-server-error",
|
|
@@ -22,8 +22,8 @@ function createHttpServer(hub, params) {
|
|
|
22
22
|
createTextBodyReaderImplementation(httpServerParams),
|
|
23
23
|
createFormDataBodyReaderImplementation(httpServerParams),
|
|
24
24
|
]);
|
|
25
|
-
function whenUncaughtError(error,
|
|
26
|
-
const serverResponse =
|
|
25
|
+
function whenUncaughtError(error, routerParams) {
|
|
26
|
+
const serverResponse = routerParams.raw.response;
|
|
27
27
|
if (!serverResponse.headersSent && !serverResponse.writableEnded) {
|
|
28
28
|
serverResponse.writeHead(500, {
|
|
29
29
|
[httpServerParams.informationHeaderKey]: "critical-server-error",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Hub } from "../../../core/hub";
|
|
2
2
|
import { type HttpServerParams } from "../../../core/types";
|
|
3
3
|
export declare function initNodeHook(hub: Hub, serverParams: HttpServerParams): {
|
|
4
|
-
readonly beforeSendResponse: ({ request, currentResponse, exit }: import("../../../core/route").RouteHookParamsAfter
|
|
5
|
-
readonly sendResponse: ({ request, currentResponse, exit }: import("../../../core/route").RouteHookParamsAfter
|
|
6
|
-
readonly afterSendResponse: ({ request, next }: import("../../../core/route").RouteHookParamsAfter
|
|
4
|
+
readonly beforeSendResponse: ({ request, currentResponse, exit }: import("../../../core/route").RouteHookParamsAfter) => import("../../../core/route").RouteHookExit;
|
|
5
|
+
readonly sendResponse: ({ request, currentResponse, exit }: import("../../../core/route").RouteHookParamsAfter) => Promise<import("../../../core/route").RouteHookExit>;
|
|
6
|
+
readonly afterSendResponse: ({ request, next }: import("../../../core/route").RouteHookParamsAfter) => Promise<import("../../../core/route").RouteHookNext>;
|
|
7
7
|
};
|
|
@@ -12,7 +12,8 @@ function createCacheControllerHooks(params) {
|
|
|
12
12
|
return hooks.createHookRouteLifeCycle({
|
|
13
13
|
beforeSendResponse: ({ currentResponse, next }) => {
|
|
14
14
|
if (cacheControl
|
|
15
|
-
&& eligibleCodeRegex.test(currentResponse.code)
|
|
15
|
+
&& eligibleCodeRegex.test(currentResponse.code)
|
|
16
|
+
&& currentResponse.headers?.["cache-control"] === undefined) {
|
|
16
17
|
currentResponse.setHeader("cache-control", cacheControl);
|
|
17
18
|
}
|
|
18
19
|
return next();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { CacheControlDirectives } from "./types";
|
|
2
2
|
export declare function createCacheControllerHooks(params?: CacheControlDirectives): {
|
|
3
|
-
readonly beforeSendResponse: ({ currentResponse, next }: import("../../core/route").RouteHookParamsAfter
|
|
3
|
+
readonly beforeSendResponse: ({ currentResponse, next }: import("../../core/route").RouteHookParamsAfter) => import("../../core/route").RouteHookNext;
|
|
4
4
|
};
|
|
@@ -10,7 +10,8 @@ function createCacheControllerHooks(params) {
|
|
|
10
10
|
return createHookRouteLifeCycle({
|
|
11
11
|
beforeSendResponse: ({ currentResponse, next }) => {
|
|
12
12
|
if (cacheControl
|
|
13
|
-
&& eligibleCodeRegex.test(currentResponse.code)
|
|
13
|
+
&& eligibleCodeRegex.test(currentResponse.code)
|
|
14
|
+
&& currentResponse.headers?.["cache-control"] === undefined) {
|
|
14
15
|
currentResponse.setHeader("cache-control", cacheControl);
|
|
15
16
|
}
|
|
16
17
|
return next();
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const allowMethodsFunction = {
|
|
4
|
+
default(methods) {
|
|
5
|
+
return (request, response) => {
|
|
6
|
+
response.setHeader("access-control-allow-methods", methods);
|
|
7
|
+
};
|
|
8
|
+
},
|
|
9
|
+
isBool(allowMethods) {
|
|
10
|
+
return (request, response) => {
|
|
11
|
+
response.setHeader("access-control-allow-methods", allowMethods[request.path]);
|
|
12
|
+
};
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
exports.allowMethodsFunction = allowMethodsFunction;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Request } from "../../../core/request";
|
|
2
|
+
import type { Response } from "../../../core/response";
|
|
3
|
+
export declare const allowMethodsFunction: {
|
|
4
|
+
default(methods: string): (request: Request, response: Response) => void;
|
|
5
|
+
isBool(allowMethods: Record<string, string>): (request: Request, response: Response) => void;
|
|
6
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const allowMethodsFunction = {
|
|
2
|
+
default(methods) {
|
|
3
|
+
return (request, response) => {
|
|
4
|
+
response.setHeader("access-control-allow-methods", methods);
|
|
5
|
+
};
|
|
6
|
+
},
|
|
7
|
+
isBool(allowMethods) {
|
|
8
|
+
return (request, response) => {
|
|
9
|
+
response.setHeader("access-control-allow-methods", allowMethods[request.path]);
|
|
10
|
+
};
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { allowMethodsFunction };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const allowOriginFunction = {
|
|
4
|
+
default(allowOrigin) {
|
|
5
|
+
return (request, response) => {
|
|
6
|
+
if (allowOrigin.test(request.origin)) {
|
|
7
|
+
response.setHeader("access-control-allow-origin", request.origin);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
},
|
|
11
|
+
isFunction(allowOrigin) {
|
|
12
|
+
return async (request, response) => {
|
|
13
|
+
let result = allowOrigin(request.origin);
|
|
14
|
+
if (result instanceof Promise) {
|
|
15
|
+
result = await result;
|
|
16
|
+
}
|
|
17
|
+
if (result === true) {
|
|
18
|
+
response.setHeader("access-control-allow-origin", request.origin);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
exports.allowOriginFunction = allowOriginFunction;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Request } from "../../../core/request";
|
|
2
|
+
import type { Response } from "../../../core/response";
|
|
3
|
+
import type { MaybePromise } from "@duplojs/utils";
|
|
4
|
+
export declare const allowOriginFunction: {
|
|
5
|
+
default(allowOrigin: RegExp): (request: Request, response: Response) => void;
|
|
6
|
+
isFunction(allowOrigin: (origin: string) => MaybePromise<boolean>): (request: Request, response: Response) => Promise<void>;
|
|
7
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const allowOriginFunction = {
|
|
2
|
+
default(allowOrigin) {
|
|
3
|
+
return (request, response) => {
|
|
4
|
+
if (allowOrigin.test(request.origin)) {
|
|
5
|
+
response.setHeader("access-control-allow-origin", request.origin);
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
},
|
|
9
|
+
isFunction(allowOrigin) {
|
|
10
|
+
return async (request, response) => {
|
|
11
|
+
let result = allowOrigin(request.origin);
|
|
12
|
+
if (result instanceof Promise) {
|
|
13
|
+
result = await result;
|
|
14
|
+
}
|
|
15
|
+
if (result === true) {
|
|
16
|
+
response.setHeader("access-control-allow-origin", request.origin);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { allowOriginFunction };
|