@duplojs/http 0.7.4 → 0.8.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.
Files changed (154) hide show
  1. package/dist/client/getBody.cjs +3 -3
  2. package/dist/client/getBody.mjs +3 -3
  3. package/dist/client/hooks.cjs +45 -0
  4. package/dist/client/hooks.d.ts +6 -1
  5. package/dist/client/hooks.mjs +41 -1
  6. package/dist/client/httpClient.cjs +25 -1
  7. package/dist/client/httpClient.d.ts +8 -3
  8. package/dist/client/httpClient.mjs +25 -1
  9. package/dist/client/index.cjs +7 -0
  10. package/dist/client/index.d.ts +1 -0
  11. package/dist/client/index.mjs +2 -1
  12. package/dist/client/insertParamsInPath.cjs +1 -1
  13. package/dist/client/insertParamsInPath.mjs +1 -1
  14. package/dist/client/promiseRequest.cjs +83 -26
  15. package/dist/client/promiseRequest.d.ts +46 -29
  16. package/dist/client/promiseRequest.mjs +83 -26
  17. package/dist/client/queryToString.cjs +1 -1
  18. package/dist/client/queryToString.mjs +1 -1
  19. package/dist/client/serverSentEvents.cjs +231 -0
  20. package/dist/client/serverSentEvents.d.ts +2 -0
  21. package/dist/client/serverSentEvents.mjs +208 -0
  22. package/dist/client/types/clientRequestParams.d.ts +2 -0
  23. package/dist/client/types/clientResponse.d.ts +34 -3
  24. package/dist/client/types/hooks.d.ts +17 -7
  25. package/dist/client/types/promiseRequestParams.d.ts +1 -0
  26. package/dist/client/types/serverRoute.d.ts +2 -0
  27. package/dist/core/builders/route/handler.d.ts +5 -2
  28. package/dist/core/defaultHooks/index.cjs +8 -0
  29. package/dist/core/defaultHooks/index.d.ts +1 -1
  30. package/dist/core/defaultHooks/index.mjs +8 -0
  31. package/dist/core/functionsBuilders/route/default.cjs +9 -13
  32. package/dist/core/functionsBuilders/route/default.mjs +2 -6
  33. package/dist/core/functionsBuilders/steps/create.d.ts +2 -2
  34. package/dist/core/functionsBuilders/steps/defaults/cutStep.cjs +1 -1
  35. package/dist/core/functionsBuilders/steps/defaults/cutStep.mjs +1 -1
  36. package/dist/core/functionsBuilders/steps/defaults/handlerStep.cjs +37 -17
  37. package/dist/core/functionsBuilders/steps/defaults/handlerStep.mjs +37 -17
  38. package/dist/core/functionsBuilders/steps/defaults/processStep.cjs +3 -3
  39. package/dist/core/functionsBuilders/steps/defaults/processStep.mjs +3 -3
  40. package/dist/core/hub/defaultEmptyReaderImplementation.cjs +9 -0
  41. package/dist/core/hub/defaultEmptyReaderImplementation.d.ts +1 -0
  42. package/dist/core/hub/defaultEmptyReaderImplementation.mjs +7 -0
  43. package/dist/core/hub/defaultMalformedUrlHandler.cjs +14 -0
  44. package/dist/core/hub/defaultMalformedUrlHandler.d.ts +10 -0
  45. package/dist/core/hub/defaultMalformedUrlHandler.mjs +12 -0
  46. package/dist/core/hub/defaultNotfoundHandler.d.ts +1 -1
  47. package/dist/core/hub/index.cjs +14 -1
  48. package/dist/core/hub/index.d.ts +4 -0
  49. package/dist/core/hub/index.mjs +13 -2
  50. package/dist/core/implementHttpServer.cjs +7 -2
  51. package/dist/core/implementHttpServer.d.ts +7 -1
  52. package/dist/core/implementHttpServer.mjs +5 -0
  53. package/dist/core/index.cjs +18 -0
  54. package/dist/core/index.d.ts +1 -0
  55. package/dist/core/index.mjs +8 -2
  56. package/dist/core/request/bodyController/base.cjs +24 -6
  57. package/dist/core/request/bodyController/base.d.ts +9 -0
  58. package/dist/core/request/bodyController/base.mjs +25 -8
  59. package/dist/core/request/bodyController/empty.cjs +11 -0
  60. package/dist/core/request/bodyController/empty.d.ts +3 -0
  61. package/dist/core/request/bodyController/empty.mjs +8 -0
  62. package/dist/core/request/bodyController/formData.cjs +1 -0
  63. package/dist/core/request/bodyController/formData.d.ts +4 -2
  64. package/dist/core/request/bodyController/formData.mjs +1 -0
  65. package/dist/core/request/bodyController/index.cjs +4 -0
  66. package/dist/core/request/bodyController/index.d.ts +1 -0
  67. package/dist/core/request/bodyController/index.mjs +2 -1
  68. package/dist/core/request/index.cjs +5 -0
  69. package/dist/core/request/index.d.ts +1 -1
  70. package/dist/core/request/index.mjs +6 -1
  71. package/dist/core/response/contract.cjs +17 -4
  72. package/dist/core/response/contract.d.ts +19 -4
  73. package/dist/core/response/contract.mjs +17 -4
  74. package/dist/core/response/index.cjs +2 -0
  75. package/dist/core/response/index.d.ts +1 -0
  76. package/dist/core/response/index.mjs +1 -0
  77. package/dist/core/response/serverSentEventsPredicted.cjs +23 -0
  78. package/dist/core/response/serverSentEventsPredicted.d.ts +14 -0
  79. package/dist/core/response/serverSentEventsPredicted.mjs +21 -0
  80. package/dist/core/route/hooks.cjs +9 -0
  81. package/dist/core/route/hooks.d.ts +10 -9
  82. package/dist/core/route/hooks.mjs +9 -1
  83. package/dist/core/route/index.cjs +1 -0
  84. package/dist/core/route/index.mjs +1 -1
  85. package/dist/core/router/buildSystemRoute.cjs +33 -0
  86. package/dist/core/router/buildSystemRoute.d.ts +11 -0
  87. package/dist/core/router/buildSystemRoute.mjs +31 -0
  88. package/dist/core/router/decodeUrl.cjs +5 -4
  89. package/dist/core/router/decodeUrl.d.ts +1 -1
  90. package/dist/core/router/decodeUrl.mjs +5 -4
  91. package/dist/core/router/index.cjs +24 -23
  92. package/dist/core/router/index.d.ts +1 -0
  93. package/dist/core/router/index.mjs +25 -25
  94. package/dist/core/serverSentEvents.cjs +96 -0
  95. package/dist/core/serverSentEvents.d.ts +33 -0
  96. package/dist/core/serverSentEvents.mjs +96 -0
  97. package/dist/core/steps/cut.d.ts +2 -2
  98. package/dist/core/steps/handler.d.ts +10 -5
  99. package/dist/interfaces/node/bodyReaders/formData/index.cjs +34 -14
  100. package/dist/interfaces/node/bodyReaders/formData/index.mjs +35 -15
  101. package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.cjs +18 -12
  102. package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.d.ts +2 -1
  103. package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.mjs +18 -12
  104. package/dist/interfaces/node/createHttpServer.cjs +2 -3
  105. package/dist/interfaces/node/createHttpServer.mjs +2 -3
  106. package/dist/interfaces/node/hooks/index.cjs +61 -38
  107. package/dist/interfaces/node/hooks/index.d.ts +6 -4
  108. package/dist/interfaces/node/hooks/index.mjs +61 -38
  109. package/dist/interfaces/node/index.cjs +1 -1
  110. package/dist/interfaces/node/index.mjs +1 -1
  111. package/dist/plugins/cacheController/createResponseHeader.cjs +43 -0
  112. package/dist/plugins/cacheController/createResponseHeader.d.ts +2 -0
  113. package/dist/plugins/cacheController/createResponseHeader.mjs +41 -0
  114. package/dist/plugins/cacheController/hooks.cjs +23 -0
  115. package/dist/plugins/cacheController/hooks.d.ts +4 -0
  116. package/dist/plugins/cacheController/hooks.mjs +21 -0
  117. package/dist/plugins/cacheController/index.cjs +10 -0
  118. package/dist/plugins/cacheController/index.d.ts +3 -0
  119. package/dist/plugins/cacheController/index.mjs +3 -0
  120. package/dist/plugins/cacheController/types/cacheControlDirectives.cjs +2 -0
  121. package/dist/plugins/cacheController/types/cacheControlDirectives.d.ts +16 -0
  122. package/dist/plugins/cacheController/types/cacheControlDirectives.mjs +1 -0
  123. package/dist/plugins/cacheController/types/index.cjs +4 -0
  124. package/dist/plugins/cacheController/types/index.d.ts +1 -0
  125. package/dist/plugins/cacheController/types/index.mjs +1 -0
  126. package/dist/plugins/codeGenerator/aggregateStepContract.cjs +9 -2
  127. package/dist/plugins/codeGenerator/aggregateStepContract.d.ts +1 -1
  128. package/dist/plugins/codeGenerator/aggregateStepContract.mjs +10 -3
  129. package/dist/plugins/codeGenerator/plugin.cjs +4 -4
  130. package/dist/plugins/codeGenerator/plugin.mjs +1 -1
  131. package/dist/plugins/openApiGenerator/aggregateStepContract.d.ts +2 -7
  132. package/dist/plugins/openApiGenerator/routeToOpenApi.cjs +46 -8
  133. package/dist/plugins/openApiGenerator/routeToOpenApi.d.ts +2 -2
  134. package/dist/plugins/openApiGenerator/routeToOpenApi.mjs +46 -8
  135. package/dist/plugins/openApiGenerator/types/endpointResponse.d.ts +7 -3
  136. package/dist/plugins/static/index.cjs +14 -0
  137. package/dist/plugins/static/index.d.ts +3 -0
  138. package/dist/plugins/static/index.mjs +3 -0
  139. package/dist/plugins/static/kind.cjs +9 -0
  140. package/dist/plugins/static/kind.d.ts +6 -0
  141. package/dist/plugins/static/kind.mjs +7 -0
  142. package/dist/plugins/static/makeRouteFile.cjs +62 -0
  143. package/dist/plugins/static/makeRouteFile.d.ts +48 -0
  144. package/dist/plugins/static/makeRouteFile.mjs +58 -0
  145. package/dist/plugins/static/makeRouteFolder.cjs +67 -0
  146. package/dist/plugins/static/makeRouteFolder.d.ts +39 -0
  147. package/dist/plugins/static/makeRouteFolder.mjs +65 -0
  148. package/dist/plugins/static/plugin.cjs +53 -0
  149. package/dist/plugins/static/plugin.d.ts +26 -0
  150. package/dist/plugins/static/plugin.mjs +50 -0
  151. package/package.json +18 -7
  152. /package/dist/plugins/codeGenerator/{typescriptTransfomer.cjs → typescriptTransformer.cjs} +0 -0
  153. /package/dist/plugins/codeGenerator/{typescriptTransfomer.d.ts → typescriptTransformer.d.ts} +0 -0
  154. /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 NotPredictedClientResponse, type ClientResponse, type PromiseRequestParams, type Hooks, type NotPredictedResponseHook, type ErrorHook } from "./types";
5
- type MaybeResponse<GenericClientResponse extends ClientResponse = ClientResponse> = (EE.Right<"response", GenericClientResponse> | EE.Left<"request-error", RequestErrorContent>);
6
- type MaybeWantedResponse<GenericWantedClientResponse extends ClientResponse = ClientResponse, GenericUnexpectClientResponse extends ClientResponse = ClientResponse> = (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 ClientResponse<GenericHookParams> = ClientResponse<GenericHookParams>> extends Promise<MaybeResponse<GenericClientResponse | NotPredictedClientResponse<GenericHookParams>>> {
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>, ClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
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>, ClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
19
+ } : never>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
20
20
  whenInformationalResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
21
21
  code: `1${number}`;
22
- }>, ClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
22
+ }>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
23
23
  whenSuccessfulResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
24
24
  code: `2${number}`;
25
- }>, ClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
25
+ }>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
26
26
  whenRedirectionResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
27
27
  code: `3${number}`;
28
- }>, ClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
28
+ }>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
29
29
  whenClientErrorResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
30
30
  code: `4${number}`;
31
- }>, ClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
31
+ }>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
32
32
  whenServerErrorResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
33
33
  code: `5${number}`;
34
- }>, ClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
34
+ }>, AllClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
35
35
  whenExpectedResponse(callback: (response: NeverCoalescing<Extract<GenericClientResponse, {
36
36
  code: `2${number}` | `4${number}`;
37
- }>, ClientResponse<GenericHookParams>>) => MaybePromise<void>): this;
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>, ClientResponse<GenericHookParams>>>(information: GenericInformation | GenericInformation[]): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, ClientResponse<GenericHookParams>>>>;
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>, ClientResponse<GenericHookParams>>>(code: GenericCode | GenericCode[]): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, ClientResponse<GenericHookParams>>>>;
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
- }>, ClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, ClientResponse<GenericHookParams>>>>;
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
- }>, ClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, ClientResponse<GenericHookParams>>>>;
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
- }>, ClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, ClientResponse<GenericHookParams>>>>;
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
- }>, ClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, ClientResponse<GenericHookParams>>>>;
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
- }>, ClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, ClientResponse<GenericHookParams>>>>;
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
- }>, ClientResponse<GenericHookParams>>>(): Promise<MaybeWantedResponse<GenericResponse, NeverCoalescing<Exclude<GenericClientResponse, GenericResponse>, ClientResponse<GenericHookParams>>>>;
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>, ClientResponse<GenericHookParams>>>;
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>, ClientResponse<GenericHookParams>>>;
80
+ } : never>, AllClientResponse<GenericHookParams>>>;
69
81
  iWantInformationalResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
70
82
  code: `1${number}`;
71
- }>, ClientResponse<GenericHookParams>>>;
83
+ }>, AllClientResponse<GenericHookParams>>>;
72
84
  iWantSuccessfulResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
73
85
  code: `2${number}`;
74
- }>, ClientResponse<GenericHookParams>>>;
86
+ }>, AllClientResponse<GenericHookParams>>>;
75
87
  iWantRedirectionResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
76
88
  code: `3${number}`;
77
- }>, ClientResponse<GenericHookParams>>>;
89
+ }>, AllClientResponse<GenericHookParams>>>;
78
90
  iWantClientErrorResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
79
91
  code: `4${number}`;
80
- }>, ClientResponse<GenericHookParams>>>;
92
+ }>, AllClientResponse<GenericHookParams>>>;
81
93
  iWantServerErrorResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
82
94
  code: `5${number}`;
83
- }>, ClientResponse<GenericHookParams>>>;
95
+ }>, AllClientResponse<GenericHookParams>>>;
84
96
  iWantExpectedResponseOrThrow(): Promise<NeverCoalescing<Extract<GenericClientResponse, {
85
97
  code: `2${number}` | `4${number}`;
86
- }>, ClientResponse<GenericHookParams>>>;
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.eitherFutureErrorKind.has(result)) {
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.information !== undefined
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 (AA.includes(formattedCode, response.code)) {
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 (SS.startsWith(response.code, "1")) {
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 (SS.startsWith(response.code, "2")) {
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 (SS.startsWith(response.code, "3")) {
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 (SS.startsWith(response.code, "4")) {
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 (SS.startsWith(response.code, "5")) {
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 (SS.startsWith(response.code, "2") || SS.startsWith(response.code, "4")) {
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
- return fetch(`${requestParams.baseUrl}${url}`, {
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) => EE.right("response", {
314
- body,
315
- information: response.headers.get(requestParams.informationHeaderKey) || undefined,
316
- code: response.status.toString(),
317
- ok: (response.status < 500)
318
- ? response.ok
319
- : null,
320
- headers: response.headers,
321
- type: response.type,
322
- url: response.url,
323
- redirected: response.redirected,
324
- raw: response,
325
- requestParams,
326
- predicted: response.headers.get(requestParams.predictedHeaderKey) !== null,
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,
@@ -6,7 +6,7 @@ function queryToString(query) {
6
6
  }
7
7
  return Object.entries(query)
8
8
  .reduce((pv, [key, value]) => {
9
- if (!value) {
9
+ if (value === undefined) {
10
10
  return pv;
11
11
  }
12
12
  if (value instanceof Array) {
@@ -4,7 +4,7 @@ function queryToString(query) {
4
4
  }
5
5
  return Object.entries(query)
6
6
  .reduce((pv, [key, value]) => {
7
- if (!value) {
7
+ if (value === undefined) {
8
8
  return pv;
9
9
  }
10
10
  if (value instanceof Array) {
@@ -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;
@@ -0,0 +1,2 @@
1
+ import { type ClientEventsResponse, type ClientResponse } from "./types";
2
+ export declare function makeClientEventsResponse(response: ClientResponse, fetchUrl: string, fetchInitParams: RequestInit): ClientEventsResponse;