@duplojs/http 0.7.4 → 0.8.4
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/client/getBody.cjs +3 -3
- package/dist/client/getBody.mjs +3 -3
- package/dist/client/hooks.cjs +45 -0
- package/dist/client/hooks.d.ts +6 -1
- package/dist/client/hooks.mjs +41 -1
- package/dist/client/httpClient.cjs +25 -1
- package/dist/client/httpClient.d.ts +8 -3
- package/dist/client/httpClient.mjs +25 -1
- package/dist/client/index.cjs +7 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.mjs +2 -1
- package/dist/client/insertParamsInPath.cjs +1 -1
- package/dist/client/insertParamsInPath.mjs +1 -1
- package/dist/client/promiseRequest.cjs +83 -26
- package/dist/client/promiseRequest.d.ts +46 -29
- package/dist/client/promiseRequest.mjs +83 -26
- package/dist/client/queryToString.cjs +1 -1
- package/dist/client/queryToString.mjs +1 -1
- package/dist/client/serverSentEvents.cjs +231 -0
- package/dist/client/serverSentEvents.d.ts +2 -0
- package/dist/client/serverSentEvents.mjs +208 -0
- package/dist/client/types/clientRequestParams.d.ts +2 -0
- package/dist/client/types/clientResponse.d.ts +34 -3
- package/dist/client/types/hooks.d.ts +17 -7
- package/dist/client/types/promiseRequestParams.d.ts +1 -0
- package/dist/client/types/serverRoute.d.ts +2 -0
- package/dist/core/builders/route/handler.d.ts +5 -2
- package/dist/core/defaultHooks/index.cjs +8 -0
- package/dist/core/defaultHooks/index.d.ts +1 -1
- package/dist/core/defaultHooks/index.mjs +8 -0
- package/dist/core/functionsBuilders/route/default.cjs +9 -13
- package/dist/core/functionsBuilders/route/default.mjs +2 -6
- package/dist/core/functionsBuilders/steps/create.d.ts +2 -2
- package/dist/core/functionsBuilders/steps/defaults/cutStep.cjs +1 -1
- package/dist/core/functionsBuilders/steps/defaults/cutStep.mjs +1 -1
- package/dist/core/functionsBuilders/steps/defaults/handlerStep.cjs +37 -17
- package/dist/core/functionsBuilders/steps/defaults/handlerStep.mjs +37 -17
- package/dist/core/functionsBuilders/steps/defaults/processStep.cjs +3 -3
- package/dist/core/functionsBuilders/steps/defaults/processStep.mjs +3 -3
- package/dist/core/hub/defaultEmptyReaderImplementation.cjs +9 -0
- package/dist/core/hub/defaultEmptyReaderImplementation.d.ts +1 -0
- package/dist/core/hub/defaultEmptyReaderImplementation.mjs +7 -0
- package/dist/core/hub/defaultMalformedUrlHandler.cjs +14 -0
- package/dist/core/hub/defaultMalformedUrlHandler.d.ts +10 -0
- package/dist/core/hub/defaultMalformedUrlHandler.mjs +12 -0
- package/dist/core/hub/defaultNotfoundHandler.d.ts +1 -1
- package/dist/core/hub/index.cjs +14 -1
- package/dist/core/hub/index.d.ts +4 -0
- package/dist/core/hub/index.mjs +13 -2
- package/dist/core/implementHttpServer.cjs +7 -2
- package/dist/core/implementHttpServer.d.ts +7 -1
- package/dist/core/implementHttpServer.mjs +5 -0
- package/dist/core/index.cjs +18 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.mjs +8 -2
- package/dist/core/request/bodyController/base.cjs +24 -6
- package/dist/core/request/bodyController/base.d.ts +9 -0
- package/dist/core/request/bodyController/base.mjs +25 -8
- package/dist/core/request/bodyController/empty.cjs +11 -0
- package/dist/core/request/bodyController/empty.d.ts +3 -0
- package/dist/core/request/bodyController/empty.mjs +8 -0
- package/dist/core/request/bodyController/formData.d.ts +2 -2
- package/dist/core/request/bodyController/index.cjs +4 -0
- package/dist/core/request/bodyController/index.d.ts +1 -0
- package/dist/core/request/bodyController/index.mjs +2 -1
- package/dist/core/request/index.cjs +5 -0
- package/dist/core/request/index.d.ts +1 -1
- package/dist/core/request/index.mjs +6 -1
- package/dist/core/response/contract.cjs +17 -4
- package/dist/core/response/contract.d.ts +19 -4
- package/dist/core/response/contract.mjs +17 -4
- package/dist/core/response/index.cjs +2 -0
- package/dist/core/response/index.d.ts +1 -0
- package/dist/core/response/index.mjs +1 -0
- package/dist/core/response/serverSentEventsPredicted.cjs +23 -0
- package/dist/core/response/serverSentEventsPredicted.d.ts +14 -0
- package/dist/core/response/serverSentEventsPredicted.mjs +21 -0
- package/dist/core/route/hooks.cjs +9 -0
- package/dist/core/route/hooks.d.ts +10 -9
- package/dist/core/route/hooks.mjs +9 -1
- package/dist/core/route/index.cjs +1 -0
- package/dist/core/route/index.mjs +1 -1
- package/dist/core/router/buildSystemRoute.cjs +33 -0
- package/dist/core/router/buildSystemRoute.d.ts +11 -0
- package/dist/core/router/buildSystemRoute.mjs +31 -0
- package/dist/core/router/decodeUrl.cjs +5 -4
- package/dist/core/router/decodeUrl.d.ts +1 -1
- package/dist/core/router/decodeUrl.mjs +5 -4
- package/dist/core/router/index.cjs +24 -23
- package/dist/core/router/index.d.ts +1 -0
- package/dist/core/router/index.mjs +25 -25
- package/dist/core/serverSentEvents.cjs +96 -0
- package/dist/core/serverSentEvents.d.ts +33 -0
- package/dist/core/serverSentEvents.mjs +96 -0
- package/dist/core/steps/cut.d.ts +2 -2
- package/dist/core/steps/handler.d.ts +10 -5
- package/dist/interfaces/node/bodyReaders/formData/index.cjs +33 -14
- package/dist/interfaces/node/bodyReaders/formData/index.mjs +34 -15
- package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.cjs +8 -11
- package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.mjs +8 -11
- package/dist/interfaces/node/createHttpServer.cjs +2 -3
- package/dist/interfaces/node/createHttpServer.mjs +2 -3
- package/dist/interfaces/node/hooks/index.cjs +61 -38
- package/dist/interfaces/node/hooks/index.d.ts +6 -4
- package/dist/interfaces/node/hooks/index.mjs +61 -38
- package/dist/interfaces/node/index.cjs +1 -1
- package/dist/interfaces/node/index.mjs +1 -1
- package/dist/plugins/cacheController/createResponseHeader.cjs +43 -0
- package/dist/plugins/cacheController/createResponseHeader.d.ts +2 -0
- package/dist/plugins/cacheController/createResponseHeader.mjs +41 -0
- package/dist/plugins/cacheController/hooks.cjs +23 -0
- package/dist/plugins/cacheController/hooks.d.ts +4 -0
- package/dist/plugins/cacheController/hooks.mjs +21 -0
- package/dist/plugins/cacheController/index.cjs +10 -0
- package/dist/plugins/cacheController/index.d.ts +3 -0
- package/dist/plugins/cacheController/index.mjs +3 -0
- package/dist/plugins/cacheController/types/cacheControlDirectives.cjs +2 -0
- package/dist/plugins/cacheController/types/cacheControlDirectives.d.ts +16 -0
- package/dist/plugins/cacheController/types/cacheControlDirectives.mjs +1 -0
- package/dist/plugins/cacheController/types/index.cjs +4 -0
- package/dist/plugins/cacheController/types/index.d.ts +1 -0
- package/dist/plugins/cacheController/types/index.mjs +1 -0
- package/dist/plugins/codeGenerator/aggregateStepContract.cjs +9 -2
- package/dist/plugins/codeGenerator/aggregateStepContract.d.ts +1 -1
- package/dist/plugins/codeGenerator/aggregateStepContract.mjs +10 -3
- package/dist/plugins/codeGenerator/plugin.cjs +4 -4
- package/dist/plugins/codeGenerator/plugin.mjs +1 -1
- package/dist/plugins/openApiGenerator/aggregateStepContract.d.ts +2 -7
- package/dist/plugins/openApiGenerator/routeToOpenApi.cjs +46 -8
- package/dist/plugins/openApiGenerator/routeToOpenApi.d.ts +2 -2
- package/dist/plugins/openApiGenerator/routeToOpenApi.mjs +46 -8
- package/dist/plugins/openApiGenerator/types/endpointResponse.d.ts +7 -3
- package/dist/plugins/static/index.cjs +14 -0
- package/dist/plugins/static/index.d.ts +3 -0
- package/dist/plugins/static/index.mjs +3 -0
- package/dist/plugins/static/kind.cjs +9 -0
- package/dist/plugins/static/kind.d.ts +6 -0
- package/dist/plugins/static/kind.mjs +7 -0
- package/dist/plugins/static/makeRouteFile.cjs +62 -0
- package/dist/plugins/static/makeRouteFile.d.ts +48 -0
- package/dist/plugins/static/makeRouteFile.mjs +58 -0
- package/dist/plugins/static/makeRouteFolder.cjs +67 -0
- package/dist/plugins/static/makeRouteFolder.d.ts +39 -0
- package/dist/plugins/static/makeRouteFolder.mjs +65 -0
- package/dist/plugins/static/plugin.cjs +53 -0
- package/dist/plugins/static/plugin.d.ts +26 -0
- package/dist/plugins/static/plugin.mjs +50 -0
- package/package.json +18 -7
- /package/dist/plugins/codeGenerator/{typescriptTransfomer.cjs → typescriptTransformer.cjs} +0 -0
- /package/dist/plugins/codeGenerator/{typescriptTransfomer.d.ts → typescriptTransformer.d.ts} +0 -0
- /package/dist/plugins/codeGenerator/{typescriptTransfomer.mjs → typescriptTransformer.mjs} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { type NeverCoalescing, type MaybePromise } from "@duplojs/utils";
|
|
1
|
+
import { type NeverCoalescing, type MaybePromise, type O } from "@duplojs/utils";
|
|
2
2
|
import * as EE from "@duplojs/utils/either";
|
|
3
3
|
import { type RequestErrorContent } from "./unexpectedResponseError";
|
|
4
|
-
import { type
|
|
5
|
-
type MaybeResponse<GenericClientResponse extends
|
|
6
|
-
type MaybeWantedResponse<GenericWantedClientResponse extends
|
|
7
|
-
export declare class PromiseRequest<GenericHookParams extends Record<string, unknown> = Record<string, unknown>, GenericClientResponse extends
|
|
4
|
+
import { type PromiseRequestParams, type Hooks, type NotPredictedResponseHook, type ErrorHook, type ClientEventsResponse, type AllClientResponse, type AllNotPredictedClientResponse, type ClientEventsResponseHandler, type ServerEvent } from "./types";
|
|
5
|
+
type MaybeResponse<GenericClientResponse extends AllClientResponse = AllClientResponse> = (EE.Right<"response", GenericClientResponse> | EE.Left<"request-error", RequestErrorContent>);
|
|
6
|
+
type MaybeWantedResponse<GenericWantedClientResponse extends AllClientResponse = AllClientResponse, GenericUnexpectClientResponse extends AllClientResponse = AllClientResponse> = (EE.Right<"response", GenericWantedClientResponse> | EE.Left<"unexpect-response", GenericUnexpectClientResponse> | EE.Left<"request-error", RequestErrorContent>);
|
|
7
|
+
export declare class PromiseRequest<GenericHookParams extends Record<string, unknown> = Record<string, unknown>, GenericClientResponse extends AllClientResponse<GenericHookParams> = AllClientResponse<GenericHookParams>> extends Promise<MaybeResponse<GenericClientResponse | AllNotPredictedClientResponse<GenericHookParams>>> {
|
|
8
8
|
params: PromiseRequestParams;
|
|
9
9
|
readonly hooks: Partial<Hooks>;
|
|
10
10
|
constructor(params: PromiseRequestParams);
|
|
@@ -13,77 +13,94 @@ export declare class PromiseRequest<GenericHookParams extends Record<string, unk
|
|
|
13
13
|
whenNotPredictedResponse(callback: NotPredictedResponseHook<GenericHookParams>): this;
|
|
14
14
|
whenInformation<GenericInformation extends Extract<GenericClientResponse["information"], string>>(information: GenericInformation | GenericInformation[], callback: (response: NeverCoalescing<Extract<GenericClientResponse, GenericInformation extends any ? {
|
|
15
15
|
information: GenericInformation;
|
|
16
|
-
} : never>,
|
|
16
|
+
} : never>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
|
|
17
17
|
whenCode<GenericCode extends GenericClientResponse["code"]>(code: GenericCode | GenericCode[], callback: (response: NeverCoalescing<Extract<GenericClientResponse, GenericCode extends any ? {
|
|
18
18
|
code: GenericCode;
|
|
19
|
-
} : never>,
|
|
19
|
+
} : never>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
|
|
20
20
|
whenInformationalResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
|
|
21
21
|
code: `1${number}`;
|
|
22
|
-
}>,
|
|
22
|
+
}>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
|
|
23
23
|
whenSuccessfulResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
|
|
24
24
|
code: `2${number}`;
|
|
25
|
-
}>,
|
|
25
|
+
}>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
|
|
26
26
|
whenRedirectionResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
|
|
27
27
|
code: `3${number}`;
|
|
28
|
-
}>,
|
|
28
|
+
}>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
|
|
29
29
|
whenClientErrorResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
|
|
30
30
|
code: `4${number}`;
|
|
31
|
-
}>,
|
|
31
|
+
}>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
|
|
32
32
|
whenServerErrorResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
|
|
33
33
|
code: `5${number}`;
|
|
34
|
-
}>,
|
|
34
|
+
}>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
|
|
35
35
|
whenExpectedResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
|
|
36
36
|
code: `2${number}` | `4${number}`;
|
|
37
|
-
}>,
|
|
37
|
+
}>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
|
|
38
38
|
whenError(callback: ErrorHook<GenericHookParams>): this;
|
|
39
|
+
whenReceiveServerEvent<GenericEvent extends (GenericClientResponse extends ClientEventsResponseHandler<infer InferredEvent> ? InferredEvent : never), GenericEventName extends GenericEvent["event"]>(eventName: GenericEventName, callback: (event: NoInfer<NeverCoalescing<Extract<GenericEvent, {
|
|
40
|
+
event: GenericEventName;
|
|
41
|
+
}>, ServerEvent>>, response: NeverCoalescing<Extract<GenericClientResponse, ClientEventsResponseHandler<GenericEvent>>, ClientEventsResponse>) => MaybePromise<void>): this;
|
|
39
42
|
iWantInformation<GenericInformation extends Extract<GenericClientResponse["information"], string>, GenericResponse extends NeverCoalescing<Extract<GenericClientResponse, GenericInformation extends any ? {
|
|
40
43
|
information: GenericInformation;
|
|
41
|
-
} : never>,
|
|
44
|
+
} : never>, AllClientResponse<GenericHookParams>>>(information: GenericInformation | GenericInformation[]): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, AllClientResponse<GenericHookParams>> | AllNotPredictedClientResponse<GenericHookParams>>>;
|
|
42
45
|
iWantCode<GenericCode extends GenericClientResponse["code"], GenericResponse extends NeverCoalescing<Extract<GenericClientResponse, GenericCode extends any ? {
|
|
43
46
|
code: GenericCode;
|
|
44
|
-
} : never>,
|
|
47
|
+
} : never>, AllClientResponse<GenericHookParams>>>(code: GenericCode | GenericCode[]): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, AllClientResponse<GenericHookParams>> | AllNotPredictedClientResponse<GenericHookParams>>>;
|
|
45
48
|
iWantInformationalResponse<GenericResponse extends NeverCoalescing<Extract<GenericClientResponse, {
|
|
46
49
|
code: `1${number}`;
|
|
47
|
-
}>,
|
|
50
|
+
}>, AllClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, AllClientResponse<GenericHookParams>> | AllNotPredictedClientResponse<GenericHookParams>>>;
|
|
48
51
|
iWantSuccessfulResponse<GenericResponse extends NeverCoalescing<Extract<GenericClientResponse, {
|
|
49
52
|
code: `2${number}`;
|
|
50
|
-
}>,
|
|
53
|
+
}>, AllClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, AllClientResponse<GenericHookParams>> | AllNotPredictedClientResponse<GenericHookParams>>>;
|
|
51
54
|
iWantRedirectionResponse<GenericResponse extends NeverCoalescing<Extract<GenericClientResponse, {
|
|
52
55
|
code: `3${number}`;
|
|
53
|
-
}>,
|
|
56
|
+
}>, AllClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, AllClientResponse<GenericHookParams>> | AllNotPredictedClientResponse<GenericHookParams>>>;
|
|
54
57
|
iWantClientErrorResponse<GenericResponse extends NeverCoalescing<Extract<GenericClientResponse, {
|
|
55
58
|
code: `4${number}`;
|
|
56
|
-
}>,
|
|
59
|
+
}>, AllClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, AllClientResponse<GenericHookParams>> | AllNotPredictedClientResponse<GenericHookParams>>>;
|
|
57
60
|
iWantServerErrorResponse<GenericResponse extends NeverCoalescing<Extract<GenericClientResponse, {
|
|
58
61
|
code: `5${number}`;
|
|
59
|
-
}>,
|
|
62
|
+
}>, AllClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, AllClientResponse<GenericHookParams>> | AllNotPredictedClientResponse<GenericHookParams>>>;
|
|
60
63
|
iWantExpectedResponse<GenericResponse extends NeverCoalescing<Extract<GenericClientResponse, {
|
|
61
64
|
code: `2${number}` | `4${number}`;
|
|
62
|
-
}>,
|
|
65
|
+
}>, AllClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, AllClientResponse<GenericHookParams>> | AllNotPredictedClientResponse<GenericHookParams>>>;
|
|
66
|
+
iSelectExpectedResponseByInformation<const GenericSelector extends Record<Extract<GenericClientResponse["information"], string>, boolean>, GenericResponse extends Extract<GenericClientResponse, {
|
|
67
|
+
information: O.GetPropsWithValue<GenericSelector, true>;
|
|
68
|
+
} | {
|
|
69
|
+
information: O.GetPropsWithValue<GenericSelector, boolean>;
|
|
70
|
+
}>, GenericUnexpectedResponse extends Extract<GenericClientResponse, {
|
|
71
|
+
information: O.GetPropsWithValue<GenericSelector, false>;
|
|
72
|
+
} | {
|
|
73
|
+
information: O.GetPropsWithValue<GenericSelector, boolean>;
|
|
74
|
+
}>>(selector: GenericSelector): Promise<MaybeWantedResponse<NeverCoalescing<GenericResponse, AllClientResponse<GenericHookParams>>, NeverCoalescing<GenericUnexpectedResponse, AllClientResponse<GenericHookParams>> | AllNotPredictedClientResponse<GenericHookParams>>>;
|
|
63
75
|
iWantInformationOrThrow<GenericInformation extends Extract<GenericClientResponse["information"], string>>(information: GenericInformation | GenericInformation[]): Promise<NeverCoalescing<Extract<GenericClientResponse, GenericInformation extends any ? {
|
|
64
76
|
information: GenericInformation;
|
|
65
|
-
} : never>,
|
|
77
|
+
} : never>, AllClientResponse<GenericHookParams>>>;
|
|
66
78
|
iWantCodeOrThrow<GenericCode extends GenericClientResponse["code"]>(code: GenericCode | GenericCode[]): Promise<NeverCoalescing<Extract<GenericClientResponse, GenericCode extends any ? {
|
|
67
79
|
code: GenericCode;
|
|
68
|
-
} : never>,
|
|
80
|
+
} : never>, AllClientResponse<GenericHookParams>>>;
|
|
69
81
|
iWantInformationalResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
|
|
70
82
|
code: `1${number}`;
|
|
71
|
-
}>,
|
|
83
|
+
}>, AllClientResponse<GenericHookParams>>>;
|
|
72
84
|
iWantSuccessfulResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
|
|
73
85
|
code: `2${number}`;
|
|
74
|
-
}>,
|
|
86
|
+
}>, AllClientResponse<GenericHookParams>>>;
|
|
75
87
|
iWantRedirectionResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
|
|
76
88
|
code: `3${number}`;
|
|
77
|
-
}>,
|
|
89
|
+
}>, AllClientResponse<GenericHookParams>>>;
|
|
78
90
|
iWantClientErrorResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
|
|
79
91
|
code: `4${number}`;
|
|
80
|
-
}>,
|
|
92
|
+
}>, AllClientResponse<GenericHookParams>>>;
|
|
81
93
|
iWantServerErrorResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
|
|
82
94
|
code: `5${number}`;
|
|
83
|
-
}>,
|
|
95
|
+
}>, AllClientResponse<GenericHookParams>>>;
|
|
84
96
|
iWantExpectedResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
|
|
85
97
|
code: `2${number}` | `4${number}`;
|
|
86
|
-
}>,
|
|
98
|
+
}>, AllClientResponse<GenericHookParams>>>;
|
|
99
|
+
iSelectExpectedResponseByInformationOrThrow<const GenericSelector extends Record<Extract<GenericClientResponse["information"], string>, boolean>, GenericResponse extends Extract<GenericClientResponse, {
|
|
100
|
+
information: O.GetPropsWithValue<GenericSelector, true>;
|
|
101
|
+
} | {
|
|
102
|
+
information: O.GetPropsWithValue<GenericSelector, boolean>;
|
|
103
|
+
}>>(selector: GenericSelector): Promise<NeverCoalescing<GenericResponse, AllClientResponse<GenericHookParams>>>;
|
|
87
104
|
static get [Symbol.species](): PromiseConstructor;
|
|
88
105
|
static fetch<GenericPromiseRequestParams extends PromiseRequestParams>(requestParams: GenericPromiseRequestParams): Promise<MaybeResponse>;
|
|
89
106
|
}
|
|
@@ -7,6 +7,7 @@ import * as EE from '@duplojs/utils/either';
|
|
|
7
7
|
import * as SS from '@duplojs/utils/string';
|
|
8
8
|
import * as AA from '@duplojs/utils/array';
|
|
9
9
|
import { UnexpectedInformationResponseError, UnexpectedCodeResponseError, UnexpectedResponseTypeError, UnexpectedResponseError } from './unexpectedResponseError.mjs';
|
|
10
|
+
import { makeClientEventsResponse } from './serverSentEvents.mjs';
|
|
10
11
|
|
|
11
12
|
class PromiseRequest extends Promise {
|
|
12
13
|
params;
|
|
@@ -42,7 +43,7 @@ class PromiseRequest extends Promise {
|
|
|
42
43
|
return EE.right("response", response);
|
|
43
44
|
})
|
|
44
45
|
.then(async (result) => {
|
|
45
|
-
if (EE.
|
|
46
|
+
if (EE.futureErrorKind.has(result)) {
|
|
46
47
|
const error = unwrap(result);
|
|
47
48
|
await launchErrorHook(params.hooks.error, this.hooks.error ?? [], error, params);
|
|
48
49
|
return EE.left("request-error", {
|
|
@@ -123,10 +124,22 @@ class PromiseRequest extends Promise {
|
|
|
123
124
|
this.hooks.error.push(callback);
|
|
124
125
|
return this;
|
|
125
126
|
}
|
|
127
|
+
whenReceiveServerEvent(eventName, callback) {
|
|
128
|
+
void this.then(EE.whenIsRight((response) => {
|
|
129
|
+
if ((response.predicted === true
|
|
130
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
131
|
+
&& Symbol.asyncIterator in response) {
|
|
132
|
+
response.onReceiveEvent(eventName, callback);
|
|
133
|
+
}
|
|
134
|
+
}));
|
|
135
|
+
return this;
|
|
136
|
+
}
|
|
126
137
|
iWantInformation(information) {
|
|
127
138
|
const formattedInformation = AA.coalescing(information);
|
|
128
139
|
return this.then(EE.whenIsRight((response) => {
|
|
129
|
-
if (response.
|
|
140
|
+
if ((response.predicted === true
|
|
141
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
142
|
+
&& response.information !== undefined
|
|
130
143
|
&& AA.includes(formattedInformation, response.information)) {
|
|
131
144
|
return EE.right("response", response);
|
|
132
145
|
}
|
|
@@ -136,7 +149,9 @@ class PromiseRequest extends Promise {
|
|
|
136
149
|
iWantCode(code) {
|
|
137
150
|
const formattedCode = AA.coalescing(code);
|
|
138
151
|
return this.then(EE.whenIsRight((response) => {
|
|
139
|
-
if (
|
|
152
|
+
if ((response.predicted === true
|
|
153
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
154
|
+
&& AA.includes(formattedCode, response.code)) {
|
|
140
155
|
return EE.right("response", response);
|
|
141
156
|
}
|
|
142
157
|
return EE.left("unexpect-response", response);
|
|
@@ -144,7 +159,9 @@ class PromiseRequest extends Promise {
|
|
|
144
159
|
}
|
|
145
160
|
iWantInformationalResponse() {
|
|
146
161
|
return this.then(EE.whenIsRight((response) => {
|
|
147
|
-
if (
|
|
162
|
+
if ((response.predicted === true
|
|
163
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
164
|
+
&& SS.startsWith(response.code, "1")) {
|
|
148
165
|
return EE.right("response", response);
|
|
149
166
|
}
|
|
150
167
|
return EE.left("unexpect-response", response);
|
|
@@ -152,7 +169,9 @@ class PromiseRequest extends Promise {
|
|
|
152
169
|
}
|
|
153
170
|
iWantSuccessfulResponse() {
|
|
154
171
|
return this.then(EE.whenIsRight((response) => {
|
|
155
|
-
if (
|
|
172
|
+
if ((response.predicted === true
|
|
173
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
174
|
+
&& SS.startsWith(response.code, "2")) {
|
|
156
175
|
return EE.right("response", response);
|
|
157
176
|
}
|
|
158
177
|
return EE.left("unexpect-response", response);
|
|
@@ -160,7 +179,9 @@ class PromiseRequest extends Promise {
|
|
|
160
179
|
}
|
|
161
180
|
iWantRedirectionResponse() {
|
|
162
181
|
return this.then(EE.whenIsRight((response) => {
|
|
163
|
-
if (
|
|
182
|
+
if ((response.predicted === true
|
|
183
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
184
|
+
&& SS.startsWith(response.code, "3")) {
|
|
164
185
|
return EE.right("response", response);
|
|
165
186
|
}
|
|
166
187
|
return EE.left("unexpect-response", response);
|
|
@@ -168,7 +189,9 @@ class PromiseRequest extends Promise {
|
|
|
168
189
|
}
|
|
169
190
|
iWantClientErrorResponse() {
|
|
170
191
|
return this.then(EE.whenIsRight((response) => {
|
|
171
|
-
if (
|
|
192
|
+
if ((response.predicted === true
|
|
193
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
194
|
+
&& SS.startsWith(response.code, "4")) {
|
|
172
195
|
return EE.right("response", response);
|
|
173
196
|
}
|
|
174
197
|
return EE.left("unexpect-response", response);
|
|
@@ -176,7 +199,9 @@ class PromiseRequest extends Promise {
|
|
|
176
199
|
}
|
|
177
200
|
iWantServerErrorResponse() {
|
|
178
201
|
return this.then(EE.whenIsRight((response) => {
|
|
179
|
-
if (
|
|
202
|
+
if ((response.predicted === true
|
|
203
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
204
|
+
&& SS.startsWith(response.code, "5")) {
|
|
180
205
|
return EE.right("response", response);
|
|
181
206
|
}
|
|
182
207
|
return EE.left("unexpect-response", response);
|
|
@@ -184,7 +209,20 @@ class PromiseRequest extends Promise {
|
|
|
184
209
|
}
|
|
185
210
|
iWantExpectedResponse() {
|
|
186
211
|
return this.then(EE.whenIsRight((response) => {
|
|
187
|
-
if (
|
|
212
|
+
if ((response.predicted === true
|
|
213
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
214
|
+
&& (SS.startsWith(response.code, "2")
|
|
215
|
+
|| SS.startsWith(response.code, "4"))) {
|
|
216
|
+
return EE.right("response", response);
|
|
217
|
+
}
|
|
218
|
+
return EE.left("unexpect-response", response);
|
|
219
|
+
}));
|
|
220
|
+
}
|
|
221
|
+
iSelectExpectedResponseByInformation(selector) {
|
|
222
|
+
return this.then(EE.whenIsRight((response) => {
|
|
223
|
+
if ((response.predicted === true
|
|
224
|
+
|| response.requestParams.disabledPredicateMode === true)
|
|
225
|
+
&& selector[(response.information ?? "")] === true) {
|
|
188
226
|
return EE.right("response", response);
|
|
189
227
|
}
|
|
190
228
|
return EE.left("unexpect-response", response);
|
|
@@ -270,6 +308,16 @@ class PromiseRequest extends Promise {
|
|
|
270
308
|
throw new UnexpectedResponseError(unwrap(maybeResponse));
|
|
271
309
|
});
|
|
272
310
|
}
|
|
311
|
+
iSelectExpectedResponseByInformationOrThrow(selector) {
|
|
312
|
+
return this
|
|
313
|
+
.iSelectExpectedResponseByInformation(selector)
|
|
314
|
+
.then((maybeResponse) => {
|
|
315
|
+
if (EE.isRight(maybeResponse)) {
|
|
316
|
+
return unwrap(maybeResponse);
|
|
317
|
+
}
|
|
318
|
+
throw new UnexpectedResponseError(unwrap(maybeResponse));
|
|
319
|
+
});
|
|
320
|
+
}
|
|
273
321
|
static get [Symbol.species]() {
|
|
274
322
|
return Promise;
|
|
275
323
|
}
|
|
@@ -303,28 +351,37 @@ class PromiseRequest extends Promise {
|
|
|
303
351
|
}
|
|
304
352
|
}
|
|
305
353
|
}
|
|
306
|
-
|
|
354
|
+
const fetchUrl = `${requestParams.baseUrl}${url}`;
|
|
355
|
+
const fetchInitParams = {
|
|
307
356
|
...requestParams.initParams,
|
|
308
357
|
headers: headers,
|
|
309
358
|
method: requestParams.method,
|
|
310
359
|
body: body,
|
|
311
|
-
|
|
360
|
+
signal: requestParams.abortController.signal,
|
|
361
|
+
};
|
|
362
|
+
return fetch(fetchUrl, fetchInitParams)
|
|
312
363
|
.then((response) => getBody(response)
|
|
313
|
-
.then((body) =>
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
364
|
+
.then((body) => {
|
|
365
|
+
const clientResponse = {
|
|
366
|
+
body,
|
|
367
|
+
information: response.headers.get(requestParams.informationHeaderKey) ?? undefined,
|
|
368
|
+
code: response.status.toString(),
|
|
369
|
+
ok: (response.status < 500)
|
|
370
|
+
? response.ok
|
|
371
|
+
: null,
|
|
372
|
+
headers: response.headers,
|
|
373
|
+
type: response.type,
|
|
374
|
+
url: response.url,
|
|
375
|
+
redirected: response.redirected,
|
|
376
|
+
raw: response,
|
|
377
|
+
requestParams,
|
|
378
|
+
predicted: response.headers.get(requestParams.predictedHeaderKey) !== null,
|
|
379
|
+
};
|
|
380
|
+
if (response.headers.get("content-type")?.includes("text/event-stream")) {
|
|
381
|
+
return EE.right("response", makeClientEventsResponse(clientResponse, fetchUrl, fetchInitParams));
|
|
382
|
+
}
|
|
383
|
+
return EE.right("response", clientResponse);
|
|
384
|
+
}))
|
|
328
385
|
.catch((error) => EE.left("request-error", {
|
|
329
386
|
error,
|
|
330
387
|
requestParams,
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var utils = require('@duplojs/utils');
|
|
4
|
+
var GG = require('@duplojs/utils/generator');
|
|
5
|
+
var SS = require('@duplojs/utils/string');
|
|
6
|
+
var AA = require('@duplojs/utils/array');
|
|
7
|
+
var hooks = require('./hooks.cjs');
|
|
8
|
+
|
|
9
|
+
function _interopNamespaceDefault(e) {
|
|
10
|
+
var n = Object.create(null);
|
|
11
|
+
if (e) {
|
|
12
|
+
Object.keys(e).forEach(function (k) {
|
|
13
|
+
if (k !== 'default') {
|
|
14
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return e[k]; }
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
n.default = e;
|
|
23
|
+
return Object.freeze(n);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var GG__namespace = /*#__PURE__*/_interopNamespaceDefault(GG);
|
|
27
|
+
var SS__namespace = /*#__PURE__*/_interopNamespaceDefault(SS);
|
|
28
|
+
var AA__namespace = /*#__PURE__*/_interopNamespaceDefault(AA);
|
|
29
|
+
|
|
30
|
+
const closeReason = Symbol("CloseReason");
|
|
31
|
+
const endMessageRegexp = /\n\n|\r\r|\r\n\r\n/;
|
|
32
|
+
const eventPayloadRegexp = /^(?<field>event|data|id|retry|content-type): ?(?<value>.*)$/gm;
|
|
33
|
+
const validRetryRegexp = /^[0-9]+$/;
|
|
34
|
+
const nullIdRegexp = /\0|\n|\r/;
|
|
35
|
+
function makeClientEventsResponse(response, fetchUrl, fetchInitParams) {
|
|
36
|
+
let reader = response.raw.body?.getReader();
|
|
37
|
+
let abortController = response.requestParams.abortController;
|
|
38
|
+
const createEventResponse = (eventsReaderGenerator) => {
|
|
39
|
+
let closeServerEvent = undefined;
|
|
40
|
+
let beforeRetryServerEvent = undefined;
|
|
41
|
+
let errorServerEvent = undefined;
|
|
42
|
+
let startServerEvent = undefined;
|
|
43
|
+
let receiveEventServerEvent = undefined;
|
|
44
|
+
const eventResponse = {
|
|
45
|
+
...response,
|
|
46
|
+
closeEventStream: () => void abortController.abort(closeReason),
|
|
47
|
+
onReceiveEvent: (eventName, callback) => {
|
|
48
|
+
receiveEventServerEvent ??= [];
|
|
49
|
+
receiveEventServerEvent.push((receiveEvent) => receiveEvent.event === eventName
|
|
50
|
+
? callback(receiveEvent, eventResponse)
|
|
51
|
+
: undefined);
|
|
52
|
+
return eventResponse;
|
|
53
|
+
},
|
|
54
|
+
onStreamEvent: (event, callback) => {
|
|
55
|
+
if (event === "receiveServerEvents") {
|
|
56
|
+
receiveEventServerEvent ??= [];
|
|
57
|
+
receiveEventServerEvent.push(callback);
|
|
58
|
+
}
|
|
59
|
+
else if (event === "beforeRetry") {
|
|
60
|
+
beforeRetryServerEvent ??= [];
|
|
61
|
+
beforeRetryServerEvent.push(callback);
|
|
62
|
+
}
|
|
63
|
+
else if (event === "close") {
|
|
64
|
+
closeServerEvent ??= [];
|
|
65
|
+
closeServerEvent.push(callback);
|
|
66
|
+
}
|
|
67
|
+
else if (event === "start") {
|
|
68
|
+
startServerEvent ??= [];
|
|
69
|
+
startServerEvent.push(callback);
|
|
70
|
+
}
|
|
71
|
+
else if (event === "error") {
|
|
72
|
+
errorServerEvent ??= [];
|
|
73
|
+
errorServerEvent.push(callback);
|
|
74
|
+
}
|
|
75
|
+
return eventResponse;
|
|
76
|
+
},
|
|
77
|
+
async consumeEventStream() {
|
|
78
|
+
for await (const __ of eventResponse) { }
|
|
79
|
+
},
|
|
80
|
+
[Symbol.asyncIterator]: async function* () {
|
|
81
|
+
await hooks.launchStartServerEventHook(response.requestParams.hooks.startServerEvent, startServerEvent ?? [], eventResponse).catch(console.error);
|
|
82
|
+
const onError = (error) => hooks.launchErrorServerEventHook(response.requestParams.hooks.errorServerEvent, errorServerEvent ?? [], error, eventResponse).catch(console.error);
|
|
83
|
+
const generator = eventsReaderGenerator(onError, () => hooks.launchBeforeRetryServerEventHook(response.requestParams.hooks.beforeRetryServerEvent, beforeRetryServerEvent ?? [], eventResponse).catch(console.error));
|
|
84
|
+
try {
|
|
85
|
+
for await (const event of generator) {
|
|
86
|
+
await hooks.launchReceiveEventServerEventHook(response.requestParams.hooks.receiveEventServerEvent, receiveEventServerEvent ?? [], event, eventResponse).catch(console.error);
|
|
87
|
+
yield event;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
await hooks.launchCloseServerEventHook(response.requestParams.hooks.closeServerEvent, closeServerEvent ?? [], eventResponse).catch(console.error);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
return eventResponse;
|
|
96
|
+
};
|
|
97
|
+
if (!reader
|
|
98
|
+
|| response.code === "204"
|
|
99
|
+
|| !response.headers.get("content-type")?.includes("text/event-stream")) {
|
|
100
|
+
return createEventResponse(async function* () { });
|
|
101
|
+
}
|
|
102
|
+
return createEventResponse((emitError, emitBeforeRetry) => {
|
|
103
|
+
let lastId = response.requestParams.headers?.["last-event-id"];
|
|
104
|
+
let retry = 3000;
|
|
105
|
+
return utils.pipe(GG__namespace.asyncLoop(async ({ next, exit }) => {
|
|
106
|
+
try {
|
|
107
|
+
if (abortController.signal.aborted) {
|
|
108
|
+
return exit();
|
|
109
|
+
}
|
|
110
|
+
else if (reader) {
|
|
111
|
+
const chunk = await reader.read();
|
|
112
|
+
if (chunk.done) {
|
|
113
|
+
reader = undefined;
|
|
114
|
+
}
|
|
115
|
+
return next(chunk);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
abortController = new AbortController();
|
|
119
|
+
await utils.sleep(retry);
|
|
120
|
+
await emitBeforeRetry();
|
|
121
|
+
const fetchResponse = await fetch(fetchUrl, {
|
|
122
|
+
...fetchInitParams,
|
|
123
|
+
headers: {
|
|
124
|
+
...fetchInitParams.headers,
|
|
125
|
+
...(typeof lastId === "string"
|
|
126
|
+
? { "last-event-id": lastId }
|
|
127
|
+
: undefined),
|
|
128
|
+
},
|
|
129
|
+
signal: abortController.signal,
|
|
130
|
+
});
|
|
131
|
+
const fetchInformation = fetchResponse.headers.get(response.requestParams.informationHeaderKey);
|
|
132
|
+
if (fetchResponse.status !== 204
|
|
133
|
+
&& fetchResponse.headers.get("content-type")?.includes("text/event-stream")
|
|
134
|
+
&& fetchResponse.body
|
|
135
|
+
&& ((fetchInformation === null
|
|
136
|
+
&& response.information === undefined)
|
|
137
|
+
|| fetchInformation === response.information)) {
|
|
138
|
+
reader = fetchResponse.body.getReader();
|
|
139
|
+
return next();
|
|
140
|
+
}
|
|
141
|
+
return exit();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error !== closeReason) {
|
|
146
|
+
await emitError(error);
|
|
147
|
+
}
|
|
148
|
+
reader = undefined;
|
|
149
|
+
return next();
|
|
150
|
+
}
|
|
151
|
+
}), async function* (chunkGenerator) {
|
|
152
|
+
const decoder = new TextDecoder("utf-8");
|
|
153
|
+
let buffer = "";
|
|
154
|
+
for await (const chunk of chunkGenerator) {
|
|
155
|
+
buffer += decoder.decode(chunk.value, { stream: true });
|
|
156
|
+
if (SS__namespace.test(buffer, endMessageRegexp)) {
|
|
157
|
+
const events = SS__namespace.split(buffer, endMessageRegexp);
|
|
158
|
+
buffer = AA__namespace.last(events);
|
|
159
|
+
const restEvents = AA__namespace.pop(events);
|
|
160
|
+
for (const event of restEvents) {
|
|
161
|
+
yield event;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (chunk.done) {
|
|
165
|
+
buffer = "";
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}, async function* (chunkStringGenerator) {
|
|
169
|
+
for await (const stringChunk of chunkStringGenerator) {
|
|
170
|
+
const eventContent = GG__namespace.reduce(SS__namespace.extractAll(stringChunk, eventPayloadRegexp), GG__namespace.reduceFrom({}), ({ lastValue, element, next }) => {
|
|
171
|
+
const { field, value } = element.namedGroups;
|
|
172
|
+
if (field === "data") {
|
|
173
|
+
return next({
|
|
174
|
+
...lastValue,
|
|
175
|
+
data: lastValue.data === undefined
|
|
176
|
+
? value
|
|
177
|
+
: `${lastValue.data}\n${value}`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
else if (field === "retry") {
|
|
181
|
+
const retry = SS__namespace.test(value, validRetryRegexp)
|
|
182
|
+
? parseInt(value, 10)
|
|
183
|
+
: undefined;
|
|
184
|
+
return next({
|
|
185
|
+
...lastValue,
|
|
186
|
+
retry: typeof retry === "number" && !isNaN(retry)
|
|
187
|
+
? retry
|
|
188
|
+
: undefined,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
else if (field === "id") {
|
|
192
|
+
return next({
|
|
193
|
+
...lastValue,
|
|
194
|
+
id: !SS__namespace.test(value, nullIdRegexp)
|
|
195
|
+
? value
|
|
196
|
+
: undefined,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return next({
|
|
200
|
+
...lastValue,
|
|
201
|
+
[field]: value,
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
if (typeof eventContent.id === "string") {
|
|
205
|
+
lastId = eventContent.id;
|
|
206
|
+
}
|
|
207
|
+
if (typeof eventContent.retry === "number") {
|
|
208
|
+
retry = eventContent.retry;
|
|
209
|
+
}
|
|
210
|
+
if (eventContent.data === undefined) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
yield {
|
|
215
|
+
event: eventContent.event || "message",
|
|
216
|
+
data: eventContent["content-type"]?.includes("application/json")
|
|
217
|
+
? JSON.parse(eventContent.data)
|
|
218
|
+
: eventContent.data,
|
|
219
|
+
id: eventContent.id,
|
|
220
|
+
retry: eventContent.retry,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
await emitError(error);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
exports.makeClientEventsResponse = makeClientEventsResponse;
|