@duplojs/http 0.7.1 → 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.
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/clean/entity.cjs +19 -28
  29. package/dist/core/clean/entity.d.ts +9 -9
  30. package/dist/core/clean/entity.mjs +20 -29
  31. package/dist/core/defaultHooks/index.cjs +8 -0
  32. package/dist/core/defaultHooks/index.d.ts +1 -1
  33. package/dist/core/defaultHooks/index.mjs +8 -0
  34. package/dist/core/functionsBuilders/route/default.cjs +9 -13
  35. package/dist/core/functionsBuilders/route/default.mjs +2 -6
  36. package/dist/core/functionsBuilders/steps/create.d.ts +2 -2
  37. package/dist/core/functionsBuilders/steps/defaults/cutStep.cjs +1 -1
  38. package/dist/core/functionsBuilders/steps/defaults/cutStep.mjs +1 -1
  39. package/dist/core/functionsBuilders/steps/defaults/handlerStep.cjs +37 -17
  40. package/dist/core/functionsBuilders/steps/defaults/handlerStep.mjs +37 -17
  41. package/dist/core/functionsBuilders/steps/defaults/processStep.cjs +3 -3
  42. package/dist/core/functionsBuilders/steps/defaults/processStep.mjs +3 -3
  43. package/dist/core/hub/defaultEmptyReaderImplementation.cjs +9 -0
  44. package/dist/core/hub/defaultEmptyReaderImplementation.d.ts +1 -0
  45. package/dist/core/hub/defaultEmptyReaderImplementation.mjs +7 -0
  46. package/dist/core/hub/defaultMalformedUrlHandler.cjs +14 -0
  47. package/dist/core/hub/defaultMalformedUrlHandler.d.ts +10 -0
  48. package/dist/core/hub/defaultMalformedUrlHandler.mjs +12 -0
  49. package/dist/core/hub/defaultNotfoundHandler.d.ts +1 -1
  50. package/dist/core/hub/index.cjs +14 -1
  51. package/dist/core/hub/index.d.ts +4 -0
  52. package/dist/core/hub/index.mjs +13 -2
  53. package/dist/core/implementHttpServer.cjs +7 -2
  54. package/dist/core/implementHttpServer.d.ts +7 -1
  55. package/dist/core/implementHttpServer.mjs +5 -0
  56. package/dist/core/index.cjs +18 -0
  57. package/dist/core/index.d.ts +1 -0
  58. package/dist/core/index.mjs +8 -2
  59. package/dist/core/request/bodyController/base.cjs +24 -6
  60. package/dist/core/request/bodyController/base.d.ts +9 -0
  61. package/dist/core/request/bodyController/base.mjs +25 -8
  62. package/dist/core/request/bodyController/empty.cjs +11 -0
  63. package/dist/core/request/bodyController/empty.d.ts +3 -0
  64. package/dist/core/request/bodyController/empty.mjs +8 -0
  65. package/dist/core/request/bodyController/formData.d.ts +2 -2
  66. package/dist/core/request/bodyController/index.cjs +4 -0
  67. package/dist/core/request/bodyController/index.d.ts +1 -0
  68. package/dist/core/request/bodyController/index.mjs +2 -1
  69. package/dist/core/request/index.cjs +5 -0
  70. package/dist/core/request/index.d.ts +1 -1
  71. package/dist/core/request/index.mjs +6 -1
  72. package/dist/core/response/contract.cjs +17 -4
  73. package/dist/core/response/contract.d.ts +19 -4
  74. package/dist/core/response/contract.mjs +17 -4
  75. package/dist/core/response/index.cjs +2 -0
  76. package/dist/core/response/index.d.ts +1 -0
  77. package/dist/core/response/index.mjs +1 -0
  78. package/dist/core/response/serverSentEventsPredicted.cjs +23 -0
  79. package/dist/core/response/serverSentEventsPredicted.d.ts +14 -0
  80. package/dist/core/response/serverSentEventsPredicted.mjs +21 -0
  81. package/dist/core/route/hooks.cjs +9 -0
  82. package/dist/core/route/hooks.d.ts +10 -9
  83. package/dist/core/route/hooks.mjs +9 -1
  84. package/dist/core/route/index.cjs +1 -0
  85. package/dist/core/route/index.mjs +1 -1
  86. package/dist/core/router/buildSystemRoute.cjs +33 -0
  87. package/dist/core/router/buildSystemRoute.d.ts +11 -0
  88. package/dist/core/router/buildSystemRoute.mjs +31 -0
  89. package/dist/core/router/decodeUrl.cjs +5 -4
  90. package/dist/core/router/decodeUrl.d.ts +1 -1
  91. package/dist/core/router/decodeUrl.mjs +5 -4
  92. package/dist/core/router/index.cjs +24 -23
  93. package/dist/core/router/index.d.ts +1 -0
  94. package/dist/core/router/index.mjs +25 -25
  95. package/dist/core/serverSentEvents.cjs +96 -0
  96. package/dist/core/serverSentEvents.d.ts +33 -0
  97. package/dist/core/serverSentEvents.mjs +96 -0
  98. package/dist/core/steps/cut.d.ts +2 -2
  99. package/dist/core/steps/handler.d.ts +10 -5
  100. package/dist/interfaces/node/bodyReaders/formData/index.cjs +33 -14
  101. package/dist/interfaces/node/bodyReaders/formData/index.mjs +34 -15
  102. package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.cjs +8 -11
  103. package/dist/interfaces/node/bodyReaders/formData/readRequestFormData.mjs +8 -11
  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
@@ -5,15 +5,15 @@ function getBody(response) {
5
5
  if (!responseContentType) {
6
6
  return Promise.resolve(undefined);
7
7
  }
8
+ else if (responseContentType.includes("text/event-stream")) {
9
+ return Promise.resolve(undefined);
10
+ }
8
11
  else if (responseContentType.includes("json")) {
9
12
  return response.json();
10
13
  }
11
14
  else if (responseContentType.includes("text")) {
12
15
  return response.text();
13
16
  }
14
- else if (responseContentType.includes("form-data")) {
15
- return response.formData();
16
- }
17
17
  else {
18
18
  return Promise.resolve(undefined);
19
19
  }
@@ -3,15 +3,15 @@ function getBody(response) {
3
3
  if (!responseContentType) {
4
4
  return Promise.resolve(undefined);
5
5
  }
6
+ else if (responseContentType.includes("text/event-stream")) {
7
+ return Promise.resolve(undefined);
8
+ }
6
9
  else if (responseContentType.includes("json")) {
7
10
  return response.json();
8
11
  }
9
12
  else if (responseContentType.includes("text")) {
10
13
  return response.text();
11
14
  }
12
- else if (responseContentType.includes("form-data")) {
13
- return response.formData();
14
- }
15
15
  else {
16
16
  return Promise.resolve(undefined);
17
17
  }
@@ -68,12 +68,57 @@ async function launchErrorHook(clientHook, promiseRequestHook, error, requestPar
68
68
  await clientHook[index](error, requestParams);
69
69
  }
70
70
  }
71
+ async function launchCloseServerEventHook(clientHook, promiseRequestHook, response) {
72
+ for (let index = 0; index < promiseRequestHook.length; index++) {
73
+ await promiseRequestHook[index](response);
74
+ }
75
+ for (let index = 0; index < clientHook.length; index++) {
76
+ await clientHook[index](response);
77
+ }
78
+ }
79
+ async function launchBeforeRetryServerEventHook(clientHook, promiseRequestHook, response) {
80
+ for (let index = 0; index < promiseRequestHook.length; index++) {
81
+ await promiseRequestHook[index](response);
82
+ }
83
+ for (let index = 0; index < clientHook.length; index++) {
84
+ await clientHook[index](response);
85
+ }
86
+ }
87
+ async function launchErrorServerEventHook(clientHook, promiseRequestHook, error, response) {
88
+ for (let index = 0; index < promiseRequestHook.length; index++) {
89
+ await promiseRequestHook[index](error, response);
90
+ }
91
+ for (let index = 0; index < clientHook.length; index++) {
92
+ await clientHook[index](error, response);
93
+ }
94
+ }
95
+ async function launchStartServerEventHook(clientHook, promiseRequestHook, response) {
96
+ for (let index = 0; index < promiseRequestHook.length; index++) {
97
+ await promiseRequestHook[index](response);
98
+ }
99
+ for (let index = 0; index < clientHook.length; index++) {
100
+ await clientHook[index](response);
101
+ }
102
+ }
103
+ async function launchReceiveEventServerEventHook(clientHook, promiseRequestHook, event, response) {
104
+ for (let index = 0; index < promiseRequestHook.length; index++) {
105
+ await promiseRequestHook[index](event, response);
106
+ }
107
+ for (let index = 0; index < clientHook.length; index++) {
108
+ await clientHook[index](event, response);
109
+ }
110
+ }
71
111
 
112
+ exports.launchBeforeRetryServerEventHook = launchBeforeRetryServerEventHook;
113
+ exports.launchCloseServerEventHook = launchCloseServerEventHook;
72
114
  exports.launchCodeHook = launchCodeHook;
73
115
  exports.launchErrorHook = launchErrorHook;
116
+ exports.launchErrorServerEventHook = launchErrorServerEventHook;
74
117
  exports.launchExpectedResponseHook = launchExpectedResponseHook;
75
118
  exports.launchInformationHook = launchInformationHook;
76
119
  exports.launchNotPredictedHook = launchNotPredictedHook;
120
+ exports.launchReceiveEventServerEventHook = launchReceiveEventServerEventHook;
77
121
  exports.launchRequestHook = launchRequestHook;
78
122
  exports.launchResponseHook = launchResponseHook;
79
123
  exports.launchResponseTypeHook = launchResponseTypeHook;
124
+ exports.launchStartServerEventHook = launchStartServerEventHook;
@@ -1,4 +1,4 @@
1
- import { type CodeHook, type ErrorHook, type InformationHook, type NotPredictedResponseHook, type RequestHook, type ResponseHook, type ResponseTypeHook, type PromiseRequestParams, type NotPredictedClientResponse, type ClientResponse } from "./types";
1
+ import { type CodeHook, type ErrorHook, type InformationHook, type NotPredictedResponseHook, type RequestHook, type ResponseHook, type ResponseTypeHook, type PromiseRequestParams, type NotPredictedClientResponse, type ClientResponse, type CloseServerEventHook, type ClientEventsResponse, type BeforeRetryServerEventHook, type ErrorServerEventHook, type StartServerEventHook, type ServerEvent, type ReceiveEventServerEventHook } from "./types";
2
2
  export declare function launchRequestHook(clientHook: readonly RequestHook[], promiseRequestHook: readonly RequestHook[], requestParams: PromiseRequestParams): Promise<PromiseRequestParams>;
3
3
  export declare function launchResponseHook(clientHook: readonly ResponseHook[], promiseRequestHook: readonly ResponseHook[], response: ClientResponse): Promise<ClientResponse>;
4
4
  export declare function launchInformationHook(clientHook: readonly InformationHook[], promiseRequestHook: readonly InformationHook[], response: ClientResponse): Promise<void>;
@@ -7,3 +7,8 @@ export declare function launchResponseTypeHook(clientHook: readonly ResponseType
7
7
  export declare function launchExpectedResponseHook(clientHook: readonly ResponseTypeHook[], promiseRequestHook: readonly ResponseTypeHook[], response: ClientResponse): Promise<void>;
8
8
  export declare function launchNotPredictedHook(clientHook: readonly NotPredictedResponseHook[], promiseRequestHook: readonly NotPredictedResponseHook[], response: NotPredictedClientResponse): Promise<void>;
9
9
  export declare function launchErrorHook(clientHook: readonly ErrorHook[], promiseRequestHook: readonly ErrorHook[], error: unknown, requestParams: PromiseRequestParams): Promise<void>;
10
+ export declare function launchCloseServerEventHook(clientHook: readonly CloseServerEventHook[], promiseRequestHook: readonly CloseServerEventHook[], response: ClientEventsResponse): Promise<void>;
11
+ export declare function launchBeforeRetryServerEventHook(clientHook: readonly BeforeRetryServerEventHook[], promiseRequestHook: readonly BeforeRetryServerEventHook[], response: ClientEventsResponse): Promise<void>;
12
+ export declare function launchErrorServerEventHook(clientHook: readonly ErrorServerEventHook[], promiseRequestHook: readonly ErrorServerEventHook[], error: unknown, response: ClientEventsResponse): Promise<void>;
13
+ export declare function launchStartServerEventHook(clientHook: readonly StartServerEventHook[], promiseRequestHook: readonly StartServerEventHook[], response: ClientEventsResponse): Promise<void>;
14
+ export declare function launchReceiveEventServerEventHook(clientHook: readonly ReceiveEventServerEventHook[], promiseRequestHook: readonly ReceiveEventServerEventHook[], event: ServerEvent, response: ClientEventsResponse): Promise<void>;
@@ -66,5 +66,45 @@ async function launchErrorHook(clientHook, promiseRequestHook, error, requestPar
66
66
  await clientHook[index](error, requestParams);
67
67
  }
68
68
  }
69
+ async function launchCloseServerEventHook(clientHook, promiseRequestHook, response) {
70
+ for (let index = 0; index < promiseRequestHook.length; index++) {
71
+ await promiseRequestHook[index](response);
72
+ }
73
+ for (let index = 0; index < clientHook.length; index++) {
74
+ await clientHook[index](response);
75
+ }
76
+ }
77
+ async function launchBeforeRetryServerEventHook(clientHook, promiseRequestHook, response) {
78
+ for (let index = 0; index < promiseRequestHook.length; index++) {
79
+ await promiseRequestHook[index](response);
80
+ }
81
+ for (let index = 0; index < clientHook.length; index++) {
82
+ await clientHook[index](response);
83
+ }
84
+ }
85
+ async function launchErrorServerEventHook(clientHook, promiseRequestHook, error, response) {
86
+ for (let index = 0; index < promiseRequestHook.length; index++) {
87
+ await promiseRequestHook[index](error, response);
88
+ }
89
+ for (let index = 0; index < clientHook.length; index++) {
90
+ await clientHook[index](error, response);
91
+ }
92
+ }
93
+ async function launchStartServerEventHook(clientHook, promiseRequestHook, response) {
94
+ for (let index = 0; index < promiseRequestHook.length; index++) {
95
+ await promiseRequestHook[index](response);
96
+ }
97
+ for (let index = 0; index < clientHook.length; index++) {
98
+ await clientHook[index](response);
99
+ }
100
+ }
101
+ async function launchReceiveEventServerEventHook(clientHook, promiseRequestHook, event, response) {
102
+ for (let index = 0; index < promiseRequestHook.length; index++) {
103
+ await promiseRequestHook[index](event, response);
104
+ }
105
+ for (let index = 0; index < clientHook.length; index++) {
106
+ await clientHook[index](event, response);
107
+ }
108
+ }
69
109
 
70
- export { launchCodeHook, launchErrorHook, launchExpectedResponseHook, launchInformationHook, launchNotPredictedHook, launchRequestHook, launchResponseHook, launchResponseTypeHook };
110
+ export { launchBeforeRetryServerEventHook, launchCloseServerEventHook, launchCodeHook, launchErrorHook, launchErrorServerEventHook, launchExpectedResponseHook, launchInformationHook, launchNotPredictedHook, launchReceiveEventServerEventHook, launchRequestHook, launchResponseHook, launchResponseTypeHook, launchStartServerEventHook };
@@ -40,6 +40,11 @@ function createHttpClient(clientParams) {
40
40
  expectedResponse: [],
41
41
  error: [],
42
42
  notPredictedResponse: [],
43
+ beforeRetryServerEvent: [],
44
+ closeServerEvent: [],
45
+ errorServerEvent: [],
46
+ receiveEventServerEvent: [],
47
+ startServerEvent: [],
43
48
  }, clientParams.hooks ?? {});
44
49
  const config = {
45
50
  baseUrl: clientParams.baseUrl,
@@ -102,9 +107,27 @@ function createHttpClient(clientParams) {
102
107
  addErrorHook(hook) {
103
108
  hooks.error.push(hook);
104
109
  },
110
+ addBeforeRetryServerEventHook(hook) {
111
+ hooks.beforeRetryServerEvent.push(hook);
112
+ },
113
+ addCloseServerEventHook(hook) {
114
+ hooks.closeServerEvent.push(hook);
115
+ },
116
+ addErrorServerEventHook(hook) {
117
+ hooks.errorServerEvent.push(hook);
118
+ },
119
+ addReceiveEventServerEventHook(hook) {
120
+ hooks.receiveEventServerEvent.push(hook);
121
+ },
122
+ addStartServerEventHook(hook) {
123
+ hooks.startServerEvent.push(hook);
124
+ },
105
125
  request(params) {
106
126
  const headers = GG__namespace.reduce(defaultHeaders.entries(), GG__namespace.reduceFrom({}), ({ element, lastValue, next }) => {
107
- lastValue[element[0]] = `${element[1]()}`;
127
+ const value = element[1]();
128
+ if (value !== undefined) {
129
+ lastValue[element[0]] = `${value}`;
130
+ }
108
131
  return next(lastValue);
109
132
  });
110
133
  return new promiseRequest.PromiseRequest({
@@ -123,6 +146,7 @@ function createHttpClient(clientParams) {
123
146
  predictedHeaderKey: config.predictedHeaderKey,
124
147
  informationHeaderKey: config.informationHeaderKey,
125
148
  disabledPredicateMode: config.disabledPredictedMode,
149
+ abortController: params.abortController ?? new AbortController(),
126
150
  });
127
151
  },
128
152
  get: ((path, params) => self.request({
@@ -1,9 +1,9 @@
1
1
  import { type Kind, type MayBeGetter, type SimplifyTopLevel, type IsEqual } from "@duplojs/utils";
2
- import { type ClientRequestInitParams, type ServerRoute, type ServerRouteToClientRequestParams, type ServerRouteToClientResponse, type ClientRequestParams, type ClientResponse, type Hooks, type RequestHook, type ResponseHook, type InformationHook, type CodeHook, type ResponseTypeHook, type ExpectedResponseHook, type NotPredictedResponseHook, type ErrorHook, type GetServerRoutePath } from "./types";
2
+ import { type ClientRequestInitParams, type ServerRoute, type ServerRouteToClientRequestParams, type ServerRouteToClientResponse, type ClientRequestParams, type Hooks, type RequestHook, type ResponseHook, type InformationHook, type CodeHook, type ResponseTypeHook, type ExpectedResponseHook, type NotPredictedResponseHook, type ErrorHook, type GetServerRoutePath, type AllClientResponse, type BeforeRetryServerEventHook, type CloseServerEventHook, type ErrorServerEventHook, type StartServerEventHook, type ReceiveEventServerEventHook } from "./types";
3
3
  import { PromiseRequest } from "./promiseRequest";
4
4
  export declare const httpClientKind: import("@duplojs/utils").KindHandler<import("@duplojs/utils").KindDefinition<"@DuplojsHttpClient/http-client", unknown>>;
5
5
  type MaybeRequestParams<GenericRequestParams extends object> = {} extends GenericRequestParams ? [params?: GenericRequestParams] : [params: GenericRequestParams];
6
- type HttpClientRequestMethod<GenericServerRoute extends ServerRoute, GenericHookParams extends Record<string, unknown>, GenericMethod extends string> = IsEqual<GenericServerRoute, ServerRoute> extends true ? (path: string, params?: SimplifyTopLevel<Omit<ClientRequestParams<GenericHookParams>, "method" | "path">>) => PromiseRequest<GenericHookParams, ClientResponse<GenericHookParams>> : <GenericPath extends Extract<GenericServerRoute, {
6
+ type HttpClientRequestMethod<GenericServerRoute extends ServerRoute, GenericHookParams extends Record<string, unknown>, GenericMethod extends string> = IsEqual<GenericServerRoute, ServerRoute> extends true ? (path: string, params?: SimplifyTopLevel<Omit<ClientRequestParams<GenericHookParams>, "method" | "path">>) => PromiseRequest<GenericHookParams, AllClientResponse<GenericHookParams>> : <GenericPath extends Extract<GenericServerRoute, {
7
7
  method: GenericMethod;
8
8
  }>["path"], GenericMatchedPath extends GetServerRoutePath<Extract<GenericServerRoute, {
9
9
  method: GenericMethod;
@@ -40,9 +40,14 @@ export interface HttpClient<GenericServerRoute extends ServerRoute = ServerRoute
40
40
  addExpectedResponseHook(hook: ExpectedResponseHook<GenericHookParams>): void;
41
41
  addNotPredictedResponseHook(hook: NotPredictedResponseHook<GenericHookParams>): void;
42
42
  addErrorHook(hook: ErrorHook<GenericHookParams>): void;
43
+ addBeforeRetryServerEventHook(hook: BeforeRetryServerEventHook<GenericHookParams>): void;
44
+ addCloseServerEventHook(hook: CloseServerEventHook<GenericHookParams>): void;
45
+ addErrorServerEventHook(hook: ErrorServerEventHook<GenericHookParams>): void;
46
+ addStartServerEventHook(hook: StartServerEventHook<GenericHookParams>): void;
47
+ addReceiveEventServerEventHook(hook: ReceiveEventServerEventHook<GenericHookParams>): void;
43
48
  request<GenericClientRequestParams extends ServerRouteToClientRequestParams<GenericServerRoute, GenericHookParams>, GenericMatchedPath extends GetServerRoutePath<Extract<GenericServerRoute, {
44
49
  method: GenericClientRequestParams["method"];
45
- }>, GenericClientRequestParams["path"]>>(params: GenericClientRequestParams): PromiseRequest<GenericHookParams, ServerRouteToClientResponse<Extract<GenericServerRoute, {
50
+ }>, GenericClientRequestParams["path"]>>(params: GenericClientRequestParams): PromiseRequest<GenericHookParams, IsEqual<GenericServerRoute, ServerRoute> extends true ? AllClientResponse<GenericHookParams> : ServerRouteToClientResponse<Extract<GenericServerRoute, {
46
51
  method: GenericClientRequestParams["method"];
47
52
  path: GenericMatchedPath;
48
53
  }>, GenericHookParams>>;
@@ -18,6 +18,11 @@ function createHttpClient(clientParams) {
18
18
  expectedResponse: [],
19
19
  error: [],
20
20
  notPredictedResponse: [],
21
+ beforeRetryServerEvent: [],
22
+ closeServerEvent: [],
23
+ errorServerEvent: [],
24
+ receiveEventServerEvent: [],
25
+ startServerEvent: [],
21
26
  }, clientParams.hooks ?? {});
22
27
  const config = {
23
28
  baseUrl: clientParams.baseUrl,
@@ -80,9 +85,27 @@ function createHttpClient(clientParams) {
80
85
  addErrorHook(hook) {
81
86
  hooks.error.push(hook);
82
87
  },
88
+ addBeforeRetryServerEventHook(hook) {
89
+ hooks.beforeRetryServerEvent.push(hook);
90
+ },
91
+ addCloseServerEventHook(hook) {
92
+ hooks.closeServerEvent.push(hook);
93
+ },
94
+ addErrorServerEventHook(hook) {
95
+ hooks.errorServerEvent.push(hook);
96
+ },
97
+ addReceiveEventServerEventHook(hook) {
98
+ hooks.receiveEventServerEvent.push(hook);
99
+ },
100
+ addStartServerEventHook(hook) {
101
+ hooks.startServerEvent.push(hook);
102
+ },
83
103
  request(params) {
84
104
  const headers = GG.reduce(defaultHeaders.entries(), GG.reduceFrom({}), ({ element, lastValue, next }) => {
85
- lastValue[element[0]] = `${element[1]()}`;
105
+ const value = element[1]();
106
+ if (value !== undefined) {
107
+ lastValue[element[0]] = `${value}`;
108
+ }
86
109
  return next(lastValue);
87
110
  });
88
111
  return new PromiseRequest({
@@ -101,6 +124,7 @@ function createHttpClient(clientParams) {
101
124
  predictedHeaderKey: config.predictedHeaderKey,
102
125
  informationHeaderKey: config.informationHeaderKey,
103
126
  disabledPredicateMode: config.disabledPredictedMode,
127
+ abortController: params.abortController ?? new AbortController(),
104
128
  });
105
129
  },
106
130
  get: ((path, params) => self.request({
@@ -9,20 +9,26 @@ var insertParamsInPath = require('./insertParamsInPath.cjs');
9
9
  var queryToString = require('./queryToString.cjs');
10
10
  var promiseRequest = require('./promiseRequest.cjs');
11
11
  var unexpectedResponseError = require('./unexpectedResponseError.cjs');
12
+ var serverSentEvents = require('./serverSentEvents.cjs');
12
13
 
13
14
 
14
15
 
15
16
  exports.createClientKind = kind.createClientKind;
16
17
  exports.createHttpClient = httpClient.createHttpClient;
17
18
  exports.httpClientKind = httpClient.httpClientKind;
19
+ exports.launchBeforeRetryServerEventHook = hooks.launchBeforeRetryServerEventHook;
20
+ exports.launchCloseServerEventHook = hooks.launchCloseServerEventHook;
18
21
  exports.launchCodeHook = hooks.launchCodeHook;
19
22
  exports.launchErrorHook = hooks.launchErrorHook;
23
+ exports.launchErrorServerEventHook = hooks.launchErrorServerEventHook;
20
24
  exports.launchExpectedResponseHook = hooks.launchExpectedResponseHook;
21
25
  exports.launchInformationHook = hooks.launchInformationHook;
22
26
  exports.launchNotPredictedHook = hooks.launchNotPredictedHook;
27
+ exports.launchReceiveEventServerEventHook = hooks.launchReceiveEventServerEventHook;
23
28
  exports.launchRequestHook = hooks.launchRequestHook;
24
29
  exports.launchResponseHook = hooks.launchResponseHook;
25
30
  exports.launchResponseTypeHook = hooks.launchResponseTypeHook;
31
+ exports.launchStartServerEventHook = hooks.launchStartServerEventHook;
26
32
  exports.getBody = getBody.getBody;
27
33
  exports.insertParamsInPath = insertParamsInPath.insertParamsInPath;
28
34
  exports.queryToString = queryToString.queryToString;
@@ -31,3 +37,4 @@ exports.UnexpectedCodeResponseError = unexpectedResponseError.UnexpectedCodeResp
31
37
  exports.UnexpectedInformationResponseError = unexpectedResponseError.UnexpectedInformationResponseError;
32
38
  exports.UnexpectedResponseError = unexpectedResponseError.UnexpectedResponseError;
33
39
  exports.UnexpectedResponseTypeError = unexpectedResponseError.UnexpectedResponseTypeError;
40
+ exports.makeClientEventsResponse = serverSentEvents.makeClientEventsResponse;
@@ -7,3 +7,4 @@ export * from "./insertParamsInPath";
7
7
  export * from "./queryToString";
8
8
  export * from "./promiseRequest";
9
9
  export * from "./unexpectedResponseError";
10
+ export * from "./serverSentEvents";
@@ -1,9 +1,10 @@
1
1
  import './types/index.mjs';
2
2
  export { createClientKind } from './kind.mjs';
3
3
  export { createHttpClient, httpClientKind } from './httpClient.mjs';
4
- export { launchCodeHook, launchErrorHook, launchExpectedResponseHook, launchInformationHook, launchNotPredictedHook, launchRequestHook, launchResponseHook, launchResponseTypeHook } from './hooks.mjs';
4
+ export { launchBeforeRetryServerEventHook, launchCloseServerEventHook, launchCodeHook, launchErrorHook, launchErrorServerEventHook, launchExpectedResponseHook, launchInformationHook, launchNotPredictedHook, launchReceiveEventServerEventHook, launchRequestHook, launchResponseHook, launchResponseTypeHook, launchStartServerEventHook } from './hooks.mjs';
5
5
  export { getBody } from './getBody.mjs';
6
6
  export { insertParamsInPath } from './insertParamsInPath.mjs';
7
7
  export { queryToString } from './queryToString.mjs';
8
8
  export { PromiseRequest } from './promiseRequest.mjs';
9
9
  export { UnexpectedCodeResponseError, UnexpectedInformationResponseError, UnexpectedResponseError, UnexpectedResponseTypeError } from './unexpectedResponseError.mjs';
10
+ export { makeClientEventsResponse } from './serverSentEvents.mjs';
@@ -4,7 +4,7 @@ function insertParamsInPath(path, params) {
4
4
  if (!params) {
5
5
  return path;
6
6
  }
7
- return Object.entries(params).reduce((pv, [key, value]) => value
7
+ return Object.entries(params).reduce((pv, [key, value]) => value !== undefined
8
8
  ? pv.replace(`{${key}}`, value.toString())
9
9
  : pv, path);
10
10
  }
@@ -2,7 +2,7 @@ function insertParamsInPath(path, params) {
2
2
  if (!params) {
3
3
  return path;
4
4
  }
5
- return Object.entries(params).reduce((pv, [key, value]) => value
5
+ return Object.entries(params).reduce((pv, [key, value]) => value !== undefined
6
6
  ? pv.replace(`{${key}}`, value.toString())
7
7
  : pv, path);
8
8
  }
@@ -9,6 +9,7 @@ var EE = require('@duplojs/utils/either');
9
9
  var SS = require('@duplojs/utils/string');
10
10
  var AA = require('@duplojs/utils/array');
11
11
  var unexpectedResponseError = require('./unexpectedResponseError.cjs');
12
+ var serverSentEvents = require('./serverSentEvents.cjs');
12
13
 
13
14
  function _interopNamespaceDefault(e) {
14
15
  var n = Object.create(null);
@@ -65,7 +66,7 @@ class PromiseRequest extends Promise {
65
66
  return EE__namespace.right("response", response);
66
67
  })
67
68
  .then(async (result) => {
68
- if (EE__namespace.eitherFutureErrorKind.has(result)) {
69
+ if (EE__namespace.futureErrorKind.has(result)) {
69
70
  const error = utils.unwrap(result);
70
71
  await hooks.launchErrorHook(params.hooks.error, this.hooks.error ?? [], error, params);
71
72
  return EE__namespace.left("request-error", {
@@ -146,10 +147,22 @@ class PromiseRequest extends Promise {
146
147
  this.hooks.error.push(callback);
147
148
  return this;
148
149
  }
150
+ whenReceiveServerEvent(eventName, callback) {
151
+ void this.then(EE__namespace.whenIsRight((response) => {
152
+ if ((response.predicted === true
153
+ || response.requestParams.disabledPredicateMode === true)
154
+ && Symbol.asyncIterator in response) {
155
+ response.onReceiveEvent(eventName, callback);
156
+ }
157
+ }));
158
+ return this;
159
+ }
149
160
  iWantInformation(information) {
150
161
  const formattedInformation = AA__namespace.coalescing(information);
151
162
  return this.then(EE__namespace.whenIsRight((response) => {
152
- if (response.information !== undefined
163
+ if ((response.predicted === true
164
+ || response.requestParams.disabledPredicateMode === true)
165
+ && response.information !== undefined
153
166
  && AA__namespace.includes(formattedInformation, response.information)) {
154
167
  return EE__namespace.right("response", response);
155
168
  }
@@ -159,7 +172,9 @@ class PromiseRequest extends Promise {
159
172
  iWantCode(code) {
160
173
  const formattedCode = AA__namespace.coalescing(code);
161
174
  return this.then(EE__namespace.whenIsRight((response) => {
162
- if (AA__namespace.includes(formattedCode, response.code)) {
175
+ if ((response.predicted === true
176
+ || response.requestParams.disabledPredicateMode === true)
177
+ && AA__namespace.includes(formattedCode, response.code)) {
163
178
  return EE__namespace.right("response", response);
164
179
  }
165
180
  return EE__namespace.left("unexpect-response", response);
@@ -167,7 +182,9 @@ class PromiseRequest extends Promise {
167
182
  }
168
183
  iWantInformationalResponse() {
169
184
  return this.then(EE__namespace.whenIsRight((response) => {
170
- if (SS__namespace.startsWith(response.code, "1")) {
185
+ if ((response.predicted === true
186
+ || response.requestParams.disabledPredicateMode === true)
187
+ && SS__namespace.startsWith(response.code, "1")) {
171
188
  return EE__namespace.right("response", response);
172
189
  }
173
190
  return EE__namespace.left("unexpect-response", response);
@@ -175,7 +192,9 @@ class PromiseRequest extends Promise {
175
192
  }
176
193
  iWantSuccessfulResponse() {
177
194
  return this.then(EE__namespace.whenIsRight((response) => {
178
- if (SS__namespace.startsWith(response.code, "2")) {
195
+ if ((response.predicted === true
196
+ || response.requestParams.disabledPredicateMode === true)
197
+ && SS__namespace.startsWith(response.code, "2")) {
179
198
  return EE__namespace.right("response", response);
180
199
  }
181
200
  return EE__namespace.left("unexpect-response", response);
@@ -183,7 +202,9 @@ class PromiseRequest extends Promise {
183
202
  }
184
203
  iWantRedirectionResponse() {
185
204
  return this.then(EE__namespace.whenIsRight((response) => {
186
- if (SS__namespace.startsWith(response.code, "3")) {
205
+ if ((response.predicted === true
206
+ || response.requestParams.disabledPredicateMode === true)
207
+ && SS__namespace.startsWith(response.code, "3")) {
187
208
  return EE__namespace.right("response", response);
188
209
  }
189
210
  return EE__namespace.left("unexpect-response", response);
@@ -191,7 +212,9 @@ class PromiseRequest extends Promise {
191
212
  }
192
213
  iWantClientErrorResponse() {
193
214
  return this.then(EE__namespace.whenIsRight((response) => {
194
- if (SS__namespace.startsWith(response.code, "4")) {
215
+ if ((response.predicted === true
216
+ || response.requestParams.disabledPredicateMode === true)
217
+ && SS__namespace.startsWith(response.code, "4")) {
195
218
  return EE__namespace.right("response", response);
196
219
  }
197
220
  return EE__namespace.left("unexpect-response", response);
@@ -199,7 +222,9 @@ class PromiseRequest extends Promise {
199
222
  }
200
223
  iWantServerErrorResponse() {
201
224
  return this.then(EE__namespace.whenIsRight((response) => {
202
- if (SS__namespace.startsWith(response.code, "5")) {
225
+ if ((response.predicted === true
226
+ || response.requestParams.disabledPredicateMode === true)
227
+ && SS__namespace.startsWith(response.code, "5")) {
203
228
  return EE__namespace.right("response", response);
204
229
  }
205
230
  return EE__namespace.left("unexpect-response", response);
@@ -207,7 +232,20 @@ class PromiseRequest extends Promise {
207
232
  }
208
233
  iWantExpectedResponse() {
209
234
  return this.then(EE__namespace.whenIsRight((response) => {
210
- if (SS__namespace.startsWith(response.code, "2") || SS__namespace.startsWith(response.code, "4")) {
235
+ if ((response.predicted === true
236
+ || response.requestParams.disabledPredicateMode === true)
237
+ && (SS__namespace.startsWith(response.code, "2")
238
+ || SS__namespace.startsWith(response.code, "4"))) {
239
+ return EE__namespace.right("response", response);
240
+ }
241
+ return EE__namespace.left("unexpect-response", response);
242
+ }));
243
+ }
244
+ iSelectExpectedResponseByInformation(selector) {
245
+ return this.then(EE__namespace.whenIsRight((response) => {
246
+ if ((response.predicted === true
247
+ || response.requestParams.disabledPredicateMode === true)
248
+ && selector[(response.information ?? "")] === true) {
211
249
  return EE__namespace.right("response", response);
212
250
  }
213
251
  return EE__namespace.left("unexpect-response", response);
@@ -293,6 +331,16 @@ class PromiseRequest extends Promise {
293
331
  throw new unexpectedResponseError.UnexpectedResponseError(utils.unwrap(maybeResponse));
294
332
  });
295
333
  }
334
+ iSelectExpectedResponseByInformationOrThrow(selector) {
335
+ return this
336
+ .iSelectExpectedResponseByInformation(selector)
337
+ .then((maybeResponse) => {
338
+ if (EE__namespace.isRight(maybeResponse)) {
339
+ return utils.unwrap(maybeResponse);
340
+ }
341
+ throw new unexpectedResponseError.UnexpectedResponseError(utils.unwrap(maybeResponse));
342
+ });
343
+ }
296
344
  static get [Symbol.species]() {
297
345
  return Promise;
298
346
  }
@@ -326,28 +374,37 @@ class PromiseRequest extends Promise {
326
374
  }
327
375
  }
328
376
  }
329
- return fetch(`${requestParams.baseUrl}${url}`, {
377
+ const fetchUrl = `${requestParams.baseUrl}${url}`;
378
+ const fetchInitParams = {
330
379
  ...requestParams.initParams,
331
380
  headers: headers,
332
381
  method: requestParams.method,
333
382
  body: body,
334
- })
383
+ signal: requestParams.abortController.signal,
384
+ };
385
+ return fetch(fetchUrl, fetchInitParams)
335
386
  .then((response) => getBody.getBody(response)
336
- .then((body) => EE__namespace.right("response", {
337
- body,
338
- information: response.headers.get(requestParams.informationHeaderKey) || undefined,
339
- code: response.status.toString(),
340
- ok: (response.status < 500)
341
- ? response.ok
342
- : null,
343
- headers: response.headers,
344
- type: response.type,
345
- url: response.url,
346
- redirected: response.redirected,
347
- raw: response,
348
- requestParams,
349
- predicted: response.headers.get(requestParams.predictedHeaderKey) !== null,
350
- })))
387
+ .then((body) => {
388
+ const clientResponse = {
389
+ body,
390
+ information: response.headers.get(requestParams.informationHeaderKey) ?? undefined,
391
+ code: response.status.toString(),
392
+ ok: (response.status < 500)
393
+ ? response.ok
394
+ : null,
395
+ headers: response.headers,
396
+ type: response.type,
397
+ url: response.url,
398
+ redirected: response.redirected,
399
+ raw: response,
400
+ requestParams,
401
+ predicted: response.headers.get(requestParams.predictedHeaderKey) !== null,
402
+ };
403
+ if (response.headers.get("content-type")?.includes("text/event-stream")) {
404
+ return EE__namespace.right("response", serverSentEvents.makeClientEventsResponse(clientResponse, fetchUrl, fetchInitParams));
405
+ }
406
+ return EE__namespace.right("response", clientResponse);
407
+ }))
351
408
  .catch((error) => EE__namespace.left("request-error", {
352
409
  error,
353
410
  requestParams,