@duplojs/http 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +2 -0
  2. package/dist/core/builders/checker.cjs +20 -0
  3. package/dist/core/builders/checker.d.ts +17 -0
  4. package/dist/core/builders/checker.mjs +17 -0
  5. package/dist/core/builders/index.d.ts +4 -0
  6. package/dist/core/builders/preflight/builder.cjs +15 -0
  7. package/dist/core/builders/preflight/builder.d.ts +17 -0
  8. package/dist/core/builders/preflight/builder.mjs +12 -0
  9. package/dist/core/builders/preflight/index.d.ts +3 -0
  10. package/dist/core/builders/preflight/process.cjs +22 -0
  11. package/dist/core/builders/preflight/process.d.ts +22 -0
  12. package/dist/core/builders/preflight/process.mjs +20 -0
  13. package/dist/core/builders/preflight/route.cjs +23 -0
  14. package/dist/core/builders/preflight/route.d.ts +21 -0
  15. package/dist/core/builders/preflight/route.mjs +21 -0
  16. package/dist/core/builders/process/builder.cjs +17 -0
  17. package/dist/core/builders/process/builder.d.ts +18 -0
  18. package/dist/core/builders/process/builder.mjs +14 -0
  19. package/dist/core/builders/process/checker.cjs +23 -0
  20. package/dist/core/builders/process/checker.d.ts +34 -0
  21. package/dist/core/builders/process/checker.mjs +21 -0
  22. package/dist/core/builders/process/cut.cjs +22 -0
  23. package/dist/core/builders/process/cut.d.ts +19 -0
  24. package/dist/core/builders/process/cut.mjs +20 -0
  25. package/dist/core/builders/process/export.cjs +6 -0
  26. package/dist/core/builders/process/export.d.ts +12 -0
  27. package/dist/core/builders/process/export.mjs +4 -0
  28. package/dist/core/builders/process/extract.cjs +22 -0
  29. package/dist/core/builders/process/extract.d.ts +25 -0
  30. package/dist/core/builders/process/extract.mjs +20 -0
  31. package/dist/core/builders/process/index.d.ts +7 -0
  32. package/dist/core/builders/process/presetChecker.cjs +22 -0
  33. package/dist/core/builders/process/presetChecker.d.ts +23 -0
  34. package/dist/core/builders/process/presetChecker.mjs +20 -0
  35. package/dist/core/builders/process/process.cjs +22 -0
  36. package/dist/core/builders/process/process.d.ts +22 -0
  37. package/dist/core/builders/process/process.mjs +20 -0
  38. package/dist/core/builders/route/builder.cjs +18 -0
  39. package/dist/core/builders/route/builder.d.ts +16 -0
  40. package/dist/core/builders/route/builder.mjs +15 -0
  41. package/dist/core/builders/route/checker.cjs +23 -0
  42. package/dist/core/builders/route/checker.d.ts +34 -0
  43. package/dist/core/builders/route/checker.mjs +21 -0
  44. package/dist/core/builders/route/cut.cjs +22 -0
  45. package/dist/core/builders/route/cut.d.ts +19 -0
  46. package/dist/core/builders/route/cut.mjs +20 -0
  47. package/dist/core/builders/route/extract.cjs +22 -0
  48. package/dist/core/builders/route/extract.d.ts +25 -0
  49. package/dist/core/builders/route/extract.mjs +20 -0
  50. package/dist/core/builders/route/handler.cjs +28 -0
  51. package/dist/core/builders/route/handler.d.ts +19 -0
  52. package/dist/core/builders/route/handler.mjs +26 -0
  53. package/dist/core/builders/route/index.d.ts +8 -0
  54. package/dist/core/builders/route/presetChecker.cjs +22 -0
  55. package/dist/core/builders/route/presetChecker.d.ts +23 -0
  56. package/dist/core/builders/route/presetChecker.mjs +20 -0
  57. package/dist/core/builders/route/process.cjs +22 -0
  58. package/dist/core/builders/route/process.d.ts +23 -0
  59. package/dist/core/builders/route/process.mjs +20 -0
  60. package/dist/core/builders/route/store.cjs +19 -0
  61. package/dist/core/builders/route/store.d.ts +13 -0
  62. package/dist/core/builders/route/store.mjs +17 -0
  63. package/dist/core/checker.cjs +14 -0
  64. package/dist/core/checker.d.ts +22 -0
  65. package/dist/core/checker.mjs +10 -0
  66. package/dist/core/floor.d.ts +1 -0
  67. package/dist/core/functionsBuilders/index.d.ts +2 -0
  68. package/dist/core/functionsBuilders/route/build.cjs +40 -0
  69. package/dist/core/functionsBuilders/route/build.d.ts +8 -0
  70. package/dist/core/functionsBuilders/route/build.mjs +38 -0
  71. package/dist/core/functionsBuilders/route/create.cjs +11 -0
  72. package/dist/core/functionsBuilders/route/create.d.ts +16 -0
  73. package/dist/core/functionsBuilders/route/create.mjs +9 -0
  74. package/dist/core/functionsBuilders/route/default.cjs +143 -0
  75. package/dist/core/functionsBuilders/route/default.d.ts +1 -0
  76. package/dist/core/functionsBuilders/route/default.mjs +141 -0
  77. package/dist/core/functionsBuilders/route/hook.cjs +69 -0
  78. package/dist/core/functionsBuilders/route/hook.d.ts +7 -0
  79. package/dist/core/functionsBuilders/route/hook.mjs +62 -0
  80. package/dist/core/functionsBuilders/route/index.d.ts +4 -0
  81. package/dist/core/functionsBuilders/steps/build.cjs +24 -0
  82. package/dist/core/functionsBuilders/steps/build.d.ts +8 -0
  83. package/dist/core/functionsBuilders/steps/build.mjs +22 -0
  84. package/dist/core/functionsBuilders/steps/create.cjs +11 -0
  85. package/dist/core/functionsBuilders/steps/create.d.ts +20 -0
  86. package/dist/core/functionsBuilders/steps/create.mjs +9 -0
  87. package/dist/core/functionsBuilders/steps/defaults/checkerStep.cjs +73 -0
  88. package/dist/core/functionsBuilders/steps/defaults/checkerStep.d.ts +1 -0
  89. package/dist/core/functionsBuilders/steps/defaults/checkerStep.mjs +71 -0
  90. package/dist/core/functionsBuilders/steps/defaults/cutStep.cjs +58 -0
  91. package/dist/core/functionsBuilders/steps/defaults/cutStep.d.ts +1 -0
  92. package/dist/core/functionsBuilders/steps/defaults/cutStep.mjs +56 -0
  93. package/dist/core/functionsBuilders/steps/defaults/extractStep.cjs +57 -0
  94. package/dist/core/functionsBuilders/steps/defaults/extractStep.d.ts +1 -0
  95. package/dist/core/functionsBuilders/steps/defaults/extractStep.mjs +55 -0
  96. package/dist/core/functionsBuilders/steps/defaults/handlerStep.cjs +41 -0
  97. package/dist/core/functionsBuilders/steps/defaults/handlerStep.d.ts +1 -0
  98. package/dist/core/functionsBuilders/steps/defaults/handlerStep.mjs +39 -0
  99. package/dist/core/functionsBuilders/steps/defaults/index.d.ts +5 -0
  100. package/dist/core/functionsBuilders/steps/defaults/processStep.cjs +65 -0
  101. package/dist/core/functionsBuilders/steps/defaults/processStep.d.ts +4 -0
  102. package/dist/core/functionsBuilders/steps/defaults/processStep.mjs +62 -0
  103. package/dist/core/functionsBuilders/steps/index.d.ts +3 -0
  104. package/dist/core/hub/defaultExtractContract.cjs +8 -0
  105. package/dist/core/hub/defaultExtractContract.d.ts +6 -0
  106. package/dist/core/hub/defaultExtractContract.mjs +6 -0
  107. package/dist/core/hub/defaultNotfoundHandler.cjs +20 -0
  108. package/dist/core/hub/defaultNotfoundHandler.d.ts +10 -0
  109. package/dist/core/hub/defaultNotfoundHandler.mjs +18 -0
  110. package/dist/core/hub/hooks.cjs +38 -0
  111. package/dist/core/hub/hooks.d.ts +33 -0
  112. package/dist/core/hub/hooks.mjs +30 -0
  113. package/dist/core/hub/index.cjs +157 -0
  114. package/dist/core/hub/index.d.ts +58 -0
  115. package/dist/core/hub/index.mjs +145 -0
  116. package/dist/core/index.cjs +141 -0
  117. package/dist/core/index.d.ts +15 -0
  118. package/dist/core/index.mjs +57 -0
  119. package/dist/core/kind.cjs +9 -0
  120. package/dist/core/kind.d.ts +6 -0
  121. package/dist/core/kind.mjs +7 -0
  122. package/dist/core/presetChecker.cjs +39 -0
  123. package/dist/core/presetChecker.d.ts +38 -0
  124. package/dist/core/presetChecker.mjs +36 -0
  125. package/dist/core/process/index.cjs +12 -0
  126. package/dist/core/process/index.d.ts +31 -0
  127. package/dist/core/process/index.mjs +9 -0
  128. package/dist/core/process/types/index.d.ts +1 -0
  129. package/dist/core/request.cjs +34 -0
  130. package/dist/core/request.d.ts +40 -0
  131. package/dist/core/request.mjs +32 -0
  132. package/dist/core/response/contract.cjs +91 -0
  133. package/dist/core/response/contract.d.ts +291 -0
  134. package/dist/core/response/contract.mjs +91 -0
  135. package/dist/core/response/index.cjs +45 -0
  136. package/dist/core/response/index.d.ts +21 -0
  137. package/dist/core/response/index.mjs +39 -0
  138. package/dist/core/route/hooks/index.cjs +21 -0
  139. package/dist/core/route/hooks/index.d.ts +61 -0
  140. package/dist/core/route/hooks/index.mjs +16 -0
  141. package/dist/core/route/hooks/response.cjs +23 -0
  142. package/dist/core/route/hooks/response.d.ts +13 -0
  143. package/dist/core/route/hooks/response.mjs +21 -0
  144. package/dist/core/route/index.cjs +16 -0
  145. package/dist/core/route/index.d.ts +25 -0
  146. package/dist/core/route/index.mjs +10 -0
  147. package/dist/core/route/types/buildedRoute.d.ts +2 -0
  148. package/dist/core/route/types/index.d.ts +1 -0
  149. package/dist/core/router/buildError.cjs +14 -0
  150. package/dist/core/router/buildError.d.ts +9 -0
  151. package/dist/core/router/buildError.mjs +12 -0
  152. package/dist/core/router/decodeUrl.cjs +47 -0
  153. package/dist/core/router/decodeUrl.d.ts +7 -0
  154. package/dist/core/router/decodeUrl.mjs +43 -0
  155. package/dist/core/router/index.cjs +108 -0
  156. package/dist/core/router/index.d.ts +7 -0
  157. package/dist/core/router/index.mjs +102 -0
  158. package/dist/core/router/pathToRegExp.cjs +9 -0
  159. package/dist/core/router/pathToRegExp.d.ts +2 -0
  160. package/dist/core/router/pathToRegExp.mjs +7 -0
  161. package/dist/core/router/types/buildedRouter.d.ts +12 -0
  162. package/dist/core/router/types/index.d.ts +1 -0
  163. package/dist/core/steps/checker.cjs +13 -0
  164. package/dist/core/steps/checker.d.ts +19 -0
  165. package/dist/core/steps/checker.mjs +10 -0
  166. package/dist/core/steps/cut.cjs +15 -0
  167. package/dist/core/steps/cut.d.ts +22 -0
  168. package/dist/core/steps/cut.mjs +11 -0
  169. package/dist/core/steps/extract.cjs +13 -0
  170. package/dist/core/steps/extract.d.ts +18 -0
  171. package/dist/core/steps/extract.mjs +10 -0
  172. package/dist/core/steps/handler.cjs +13 -0
  173. package/dist/core/steps/handler.d.ts +19 -0
  174. package/dist/core/steps/handler.mjs +10 -0
  175. package/dist/core/steps/identifier.cjs +7 -0
  176. package/dist/core/steps/identifier.d.ts +5 -0
  177. package/dist/core/steps/identifier.mjs +5 -0
  178. package/dist/core/steps/index.d.ts +9 -0
  179. package/dist/core/steps/kind.cjs +7 -0
  180. package/dist/core/steps/kind.d.ts +3 -0
  181. package/dist/core/steps/kind.mjs +5 -0
  182. package/dist/core/steps/presetChecker.cjs +13 -0
  183. package/dist/core/steps/presetChecker.d.ts +14 -0
  184. package/dist/core/steps/presetChecker.mjs +10 -0
  185. package/dist/core/steps/process.cjs +13 -0
  186. package/dist/core/steps/process.d.ts +14 -0
  187. package/dist/core/steps/process.mjs +10 -0
  188. package/dist/core/steps/types/buildedStep.d.ts +5 -0
  189. package/dist/core/steps/types/index.d.ts +3 -0
  190. package/dist/core/steps/types/stepFunctionParams.d.ts +12 -0
  191. package/dist/core/steps/types/steps.d.ts +11 -0
  192. package/dist/core/stringIdentifier.cjs +7 -0
  193. package/dist/core/stringIdentifier.d.ts +1 -0
  194. package/dist/core/stringIdentifier.mjs +5 -0
  195. package/dist/core/types/environment.d.ts +4 -0
  196. package/dist/core/types/index.d.ts +1 -0
  197. package/dist/interfaces/bun/index.cjs +16 -0
  198. package/dist/interfaces/bun/index.d.ts +2 -0
  199. package/dist/interfaces/bun/index.mjs +10 -0
  200. package/dist/interfaces/bun/kind.cjs +9 -0
  201. package/dist/interfaces/bun/kind.d.ts +6 -0
  202. package/dist/interfaces/bun/kind.mjs +7 -0
  203. package/dist/interfaces/bun/types/index.d.ts +1 -0
  204. package/dist/interfaces/bun/types/request.d.ts +21 -0
  205. package/dist/interfaces/deno/index.cjs +7 -0
  206. package/dist/interfaces/deno/index.d.ts +2 -0
  207. package/dist/interfaces/deno/index.mjs +1 -0
  208. package/dist/interfaces/deno/kind.cjs +9 -0
  209. package/dist/interfaces/deno/kind.d.ts +6 -0
  210. package/dist/interfaces/deno/kind.mjs +7 -0
  211. package/dist/interfaces/deno/types/index.d.ts +1 -0
  212. package/dist/interfaces/deno/types/request.d.ts +21 -0
  213. package/dist/interfaces/node/createHttpServer.cjs +65 -0
  214. package/dist/interfaces/node/createHttpServer.d.ts +23 -0
  215. package/dist/interfaces/node/createHttpServer.mjs +63 -0
  216. package/dist/interfaces/node/error/bodyParseUnknownError.cjs +16 -0
  217. package/dist/interfaces/node/error/bodyParseUnknownError.d.ts +9 -0
  218. package/dist/interfaces/node/error/bodyParseUnknownError.mjs +14 -0
  219. package/dist/interfaces/node/error/bodyParseWrongChunkReceived.cjs +14 -0
  220. package/dist/interfaces/node/error/bodyParseWrongChunkReceived.d.ts +8 -0
  221. package/dist/interfaces/node/error/bodyParseWrongChunkReceived.mjs +12 -0
  222. package/dist/interfaces/node/error/bodySizeExceedsLimitError.cjs +14 -0
  223. package/dist/interfaces/node/error/bodySizeExceedsLimitError.d.ts +9 -0
  224. package/dist/interfaces/node/error/bodySizeExceedsLimitError.mjs +12 -0
  225. package/dist/interfaces/node/error/index.d.ts +3 -0
  226. package/dist/interfaces/node/hooks.cjs +119 -0
  227. package/dist/interfaces/node/hooks.d.ts +8 -0
  228. package/dist/interfaces/node/hooks.mjs +117 -0
  229. package/dist/interfaces/node/index.cjs +26 -0
  230. package/dist/interfaces/node/index.d.ts +5 -0
  231. package/dist/interfaces/node/index.mjs +15 -0
  232. package/dist/interfaces/node/kind.cjs +9 -0
  233. package/dist/interfaces/node/kind.d.ts +6 -0
  234. package/dist/interfaces/node/kind.mjs +7 -0
  235. package/dist/interfaces/node/types/host.d.ts +4 -0
  236. package/dist/interfaces/node/types/index.d.ts +2 -0
  237. package/dist/interfaces/node/types/request.d.ts +23 -0
  238. package/package.json +82 -0
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@duplojs/utils');
4
+ var kind = require('../kind.cjs');
5
+
6
+ class BodyParseWrongChunkReceived extends utils.kindHeritage("body-parse-wrong-chunk-received", kind.createInterfacesNodeLibKind("body-parse-wrong-chunk-received"), Error) {
7
+ wrongChunk;
8
+ constructor(wrongChunk) {
9
+ super({}, ["Received chunk is not buffer or string."]);
10
+ this.wrongChunk = wrongChunk;
11
+ }
12
+ }
13
+
14
+ exports.BodyParseWrongChunkReceived = BodyParseWrongChunkReceived;
@@ -0,0 +1,8 @@
1
+ declare const BodyParseWrongChunkReceived_base: new (params: {
2
+ "@DuplojsHttpInterfacesNode/body-parse-wrong-chunk-received"?: unknown;
3
+ }, parentParams: [message?: string | undefined, options?: ErrorOptions | undefined]) => Error & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsHttpInterfacesNode/body-parse-wrong-chunk-received", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"body-parse-wrong-chunk-received", unknown>, unknown>;
4
+ export declare class BodyParseWrongChunkReceived extends BodyParseWrongChunkReceived_base {
5
+ wrongChunk: unknown;
6
+ constructor(wrongChunk: unknown);
7
+ }
8
+ export {};
@@ -0,0 +1,12 @@
1
+ import { kindHeritage } from '@duplojs/utils';
2
+ import { createInterfacesNodeLibKind } from '../kind.mjs';
3
+
4
+ class BodyParseWrongChunkReceived extends kindHeritage("body-parse-wrong-chunk-received", createInterfacesNodeLibKind("body-parse-wrong-chunk-received"), Error) {
5
+ wrongChunk;
6
+ constructor(wrongChunk) {
7
+ super({}, ["Received chunk is not buffer or string."]);
8
+ this.wrongChunk = wrongChunk;
9
+ }
10
+ }
11
+
12
+ export { BodyParseWrongChunkReceived };
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@duplojs/utils');
4
+ var kind = require('../kind.cjs');
5
+
6
+ class BodySizeExceedsLimitError extends utils.kindHeritage("body-size-exceeds-limit-error", kind.createInterfacesNodeLibKind("body-size-exceeds-limit-error"), Error) {
7
+ bytesInString;
8
+ constructor(bytesInString) {
9
+ super({}, [`Body size is bigger than ${bytesInString}.`]);
10
+ this.bytesInString = bytesInString;
11
+ }
12
+ }
13
+
14
+ exports.BodySizeExceedsLimitError = BodySizeExceedsLimitError;
@@ -0,0 +1,9 @@
1
+ import { type BytesInString } from "@duplojs/utils";
2
+ declare const BodySizeExceedsLimitError_base: new (params: {
3
+ "@DuplojsHttpInterfacesNode/body-size-exceeds-limit-error"?: unknown;
4
+ }, parentParams: [message?: string | undefined, options?: ErrorOptions | undefined]) => Error & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"@DuplojsHttpInterfacesNode/body-size-exceeds-limit-error", unknown>, unknown> & import("@duplojs/utils").Kind<import("@duplojs/utils").KindDefinition<"body-size-exceeds-limit-error", unknown>, unknown>;
5
+ export declare class BodySizeExceedsLimitError extends BodySizeExceedsLimitError_base {
6
+ bytesInString: BytesInString | number;
7
+ constructor(bytesInString: BytesInString | number);
8
+ }
9
+ export {};
@@ -0,0 +1,12 @@
1
+ import { kindHeritage } from '@duplojs/utils';
2
+ import { createInterfacesNodeLibKind } from '../kind.mjs';
3
+
4
+ class BodySizeExceedsLimitError extends kindHeritage("body-size-exceeds-limit-error", createInterfacesNodeLibKind("body-size-exceeds-limit-error"), Error) {
5
+ bytesInString;
6
+ constructor(bytesInString) {
7
+ super({}, [`Body size is bigger than ${bytesInString}.`]);
8
+ this.bytesInString = bytesInString;
9
+ }
10
+ }
11
+
12
+ export { BodySizeExceedsLimitError };
@@ -0,0 +1,3 @@
1
+ export * from "./bodySizeExceedsLimitError";
2
+ export * from "./bodyParseWrongChunkReceived";
3
+ export * from "./bodyParseUnknownError";
@@ -0,0 +1,119 @@
1
+ 'use strict';
2
+
3
+ require('../../core/route/index.cjs');
4
+ var utils = require('@duplojs/utils');
5
+ var bodySizeExceedsLimitError = require('./error/bodySizeExceedsLimitError.cjs');
6
+ var bodyParseWrongChunkReceived = require('./error/bodyParseWrongChunkReceived.cjs');
7
+ var bodyParseUnknownError = require('./error/bodyParseUnknownError.cjs');
8
+ var index = require('../../core/route/hooks/index.cjs');
9
+ var response = require('../../core/route/hooks/response.cjs');
10
+
11
+ function makeNodeHook(hub, serverParams) {
12
+ const informationHeaderKey = serverParams.informationHeaderKey;
13
+ const fromHookHeaderKey = serverParams.fromHookHeaderKey;
14
+ const isDev = hub.config.environment === "DEV";
15
+ const maxBodySize = utils.stringToBytes(serverParams.maxBodySize);
16
+ return index.createHookRouteLifeCycle({
17
+ async parseBody({ request, exit }) {
18
+ const contentType = request.headers["content-type"] instanceof Array
19
+ ? request.headers["content-type"].join(", ")
20
+ : request.headers["content-type"] ?? "";
21
+ const isText = contentType.includes("text/plain");
22
+ const isJson = contentType.includes("application/json");
23
+ if (!isText && !isJson) {
24
+ return exit();
25
+ }
26
+ const { request: rawRequest } = request.raw;
27
+ request.body = await new Promise((resolve, reject) => {
28
+ function errorCallback(error) {
29
+ if (error instanceof bodySizeExceedsLimitError.BodySizeExceedsLimitError
30
+ || error instanceof bodyParseWrongChunkReceived.BodyParseWrongChunkReceived) {
31
+ reject(error);
32
+ return;
33
+ }
34
+ reject(new bodyParseUnknownError.BodyParseUnknownError(contentType, error));
35
+ }
36
+ let stringBody = "";
37
+ let byteLengthBody = 0;
38
+ rawRequest.on("error", errorCallback);
39
+ rawRequest.on("data", (chunk) => {
40
+ if (!(chunk instanceof Buffer) && typeof chunk !== "string") {
41
+ rawRequest.emit("error", new bodyParseWrongChunkReceived.BodyParseWrongChunkReceived(chunk));
42
+ return;
43
+ }
44
+ byteLengthBody += chunk instanceof Buffer
45
+ ? chunk.byteLength
46
+ : Buffer.byteLength(chunk);
47
+ if (byteLengthBody > maxBodySize) {
48
+ rawRequest.emit("error", new bodySizeExceedsLimitError.BodySizeExceedsLimitError(serverParams.maxBodySize));
49
+ return;
50
+ }
51
+ stringBody += chunk.toString();
52
+ });
53
+ rawRequest.on("end", () => {
54
+ try {
55
+ resolve(isText
56
+ ? stringBody
57
+ : JSON.parse(stringBody));
58
+ }
59
+ catch (error) {
60
+ errorCallback(error);
61
+ }
62
+ });
63
+ });
64
+ return exit();
65
+ },
66
+ error({ error, response, exit }) {
67
+ const displayedError = isDev ? error : undefined;
68
+ if (error instanceof bodySizeExceedsLimitError.BodySizeExceedsLimitError) {
69
+ return response("400", "body-size-exceeds-limit-error", displayedError);
70
+ }
71
+ else if (error instanceof bodyParseWrongChunkReceived.BodyParseWrongChunkReceived) {
72
+ return response("400", "body-parse-wrong-chunk-received", displayedError);
73
+ }
74
+ else if (error instanceof bodyParseUnknownError.BodyParseUnknownError) {
75
+ return response("400", "body-parse-unknown-error", displayedError);
76
+ }
77
+ return exit();
78
+ },
79
+ beforeSendResponse({ request, currentResponse, exit }) {
80
+ const body = currentResponse.body;
81
+ if (typeof body === "number"
82
+ || typeof body === "string"
83
+ || body === null
84
+ || body instanceof Error) {
85
+ currentResponse.setHeader("content-type", "text/plain; charset=utf-8");
86
+ }
87
+ else if (typeof body === "object") {
88
+ currentResponse.setHeader("content-type", "application/json; charset=utf-8");
89
+ }
90
+ currentResponse.setHeader(informationHeaderKey, currentResponse.information);
91
+ if (currentResponse instanceof response.HookResponse) {
92
+ currentResponse.setHeader(fromHookHeaderKey, currentResponse.fromHook);
93
+ }
94
+ request.raw.response.writeHead(Number(currentResponse.code), currentResponse.headers);
95
+ return exit();
96
+ },
97
+ sendResponse({ request, currentResponse, exit }) {
98
+ const { response: rawResponse } = request.raw;
99
+ const body = currentResponse.body;
100
+ if (body instanceof Error) {
101
+ rawResponse.write(body.toString());
102
+ }
103
+ else if (typeof body === "object") {
104
+ rawResponse.write(JSON.stringify(body));
105
+ }
106
+ else if (typeof body === "string") {
107
+ rawResponse.write(body);
108
+ }
109
+ else if (typeof body === "number"
110
+ || typeof body === "bigint") {
111
+ rawResponse.write(body.toString());
112
+ }
113
+ rawResponse.end();
114
+ return exit();
115
+ },
116
+ });
117
+ }
118
+
119
+ exports.makeNodeHook = makeNodeHook;
@@ -0,0 +1,8 @@
1
+ import { type HttpServerParams, type Hub } from "../../core/hub";
2
+ import { HookResponse } from "../../core/route";
3
+ export declare function makeNodeHook(hub: Hub, serverParams: HttpServerParams): {
4
+ parseBody({ request, exit }: import("../../core/route").RouteHookParams<import("../../core/request").Request>): Promise<import("../../core/route").RouteHookExit>;
5
+ error({ error, response, exit }: import("../../core/route").RouteHookErrorParams<import("../../core/request").Request>): import("../../core/route").RouteHookExit | HookResponse<"400", "body-size-exceeds-limit-error", unknown> | HookResponse<"400", "body-parse-wrong-chunk-received", unknown> | HookResponse<"400", "body-parse-unknown-error", unknown>;
6
+ beforeSendResponse({ request, currentResponse, exit }: import("../../core/route").RouteHookParamsAfter<import("../../core/request").Request>): import("../../core/route").RouteHookExit;
7
+ sendResponse({ request, currentResponse, exit }: import("../../core/route").RouteHookParamsAfter<import("../../core/request").Request>): import("../../core/route").RouteHookExit;
8
+ };
@@ -0,0 +1,117 @@
1
+ import '../../core/route/index.mjs';
2
+ import { stringToBytes } from '@duplojs/utils';
3
+ import { BodySizeExceedsLimitError } from './error/bodySizeExceedsLimitError.mjs';
4
+ import { BodyParseWrongChunkReceived } from './error/bodyParseWrongChunkReceived.mjs';
5
+ import { BodyParseUnknownError } from './error/bodyParseUnknownError.mjs';
6
+ import { createHookRouteLifeCycle } from '../../core/route/hooks/index.mjs';
7
+ import { HookResponse } from '../../core/route/hooks/response.mjs';
8
+
9
+ function makeNodeHook(hub, serverParams) {
10
+ const informationHeaderKey = serverParams.informationHeaderKey;
11
+ const fromHookHeaderKey = serverParams.fromHookHeaderKey;
12
+ const isDev = hub.config.environment === "DEV";
13
+ const maxBodySize = stringToBytes(serverParams.maxBodySize);
14
+ return createHookRouteLifeCycle({
15
+ async parseBody({ request, exit }) {
16
+ const contentType = request.headers["content-type"] instanceof Array
17
+ ? request.headers["content-type"].join(", ")
18
+ : request.headers["content-type"] ?? "";
19
+ const isText = contentType.includes("text/plain");
20
+ const isJson = contentType.includes("application/json");
21
+ if (!isText && !isJson) {
22
+ return exit();
23
+ }
24
+ const { request: rawRequest } = request.raw;
25
+ request.body = await new Promise((resolve, reject) => {
26
+ function errorCallback(error) {
27
+ if (error instanceof BodySizeExceedsLimitError
28
+ || error instanceof BodyParseWrongChunkReceived) {
29
+ reject(error);
30
+ return;
31
+ }
32
+ reject(new BodyParseUnknownError(contentType, error));
33
+ }
34
+ let stringBody = "";
35
+ let byteLengthBody = 0;
36
+ rawRequest.on("error", errorCallback);
37
+ rawRequest.on("data", (chunk) => {
38
+ if (!(chunk instanceof Buffer) && typeof chunk !== "string") {
39
+ rawRequest.emit("error", new BodyParseWrongChunkReceived(chunk));
40
+ return;
41
+ }
42
+ byteLengthBody += chunk instanceof Buffer
43
+ ? chunk.byteLength
44
+ : Buffer.byteLength(chunk);
45
+ if (byteLengthBody > maxBodySize) {
46
+ rawRequest.emit("error", new BodySizeExceedsLimitError(serverParams.maxBodySize));
47
+ return;
48
+ }
49
+ stringBody += chunk.toString();
50
+ });
51
+ rawRequest.on("end", () => {
52
+ try {
53
+ resolve(isText
54
+ ? stringBody
55
+ : JSON.parse(stringBody));
56
+ }
57
+ catch (error) {
58
+ errorCallback(error);
59
+ }
60
+ });
61
+ });
62
+ return exit();
63
+ },
64
+ error({ error, response, exit }) {
65
+ const displayedError = isDev ? error : undefined;
66
+ if (error instanceof BodySizeExceedsLimitError) {
67
+ return response("400", "body-size-exceeds-limit-error", displayedError);
68
+ }
69
+ else if (error instanceof BodyParseWrongChunkReceived) {
70
+ return response("400", "body-parse-wrong-chunk-received", displayedError);
71
+ }
72
+ else if (error instanceof BodyParseUnknownError) {
73
+ return response("400", "body-parse-unknown-error", displayedError);
74
+ }
75
+ return exit();
76
+ },
77
+ beforeSendResponse({ request, currentResponse, exit }) {
78
+ const body = currentResponse.body;
79
+ if (typeof body === "number"
80
+ || typeof body === "string"
81
+ || body === null
82
+ || body instanceof Error) {
83
+ currentResponse.setHeader("content-type", "text/plain; charset=utf-8");
84
+ }
85
+ else if (typeof body === "object") {
86
+ currentResponse.setHeader("content-type", "application/json; charset=utf-8");
87
+ }
88
+ currentResponse.setHeader(informationHeaderKey, currentResponse.information);
89
+ if (currentResponse instanceof HookResponse) {
90
+ currentResponse.setHeader(fromHookHeaderKey, currentResponse.fromHook);
91
+ }
92
+ request.raw.response.writeHead(Number(currentResponse.code), currentResponse.headers);
93
+ return exit();
94
+ },
95
+ sendResponse({ request, currentResponse, exit }) {
96
+ const { response: rawResponse } = request.raw;
97
+ const body = currentResponse.body;
98
+ if (body instanceof Error) {
99
+ rawResponse.write(body.toString());
100
+ }
101
+ else if (typeof body === "object") {
102
+ rawResponse.write(JSON.stringify(body));
103
+ }
104
+ else if (typeof body === "string") {
105
+ rawResponse.write(body);
106
+ }
107
+ else if (typeof body === "number"
108
+ || typeof body === "bigint") {
109
+ rawResponse.write(body.toString());
110
+ }
111
+ rawResponse.end();
112
+ return exit();
113
+ },
114
+ });
115
+ }
116
+
117
+ export { makeNodeHook };
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ require('../../core/request.cjs');
4
+ require('../../core/steps/kind.cjs');
5
+ require('../../core/steps/identifier.cjs');
6
+ require('../../core/steps/checker.cjs');
7
+ require('../../core/steps/extract.cjs');
8
+ require('../../core/steps/cut.cjs');
9
+ require('../../core/steps/handler.cjs');
10
+ require('../../core/steps/process.cjs');
11
+ require('../../core/steps/presetChecker.cjs');
12
+ var kind = require('./kind.cjs');
13
+ var bodySizeExceedsLimitError = require('./error/bodySizeExceedsLimitError.cjs');
14
+ var bodyParseWrongChunkReceived = require('./error/bodyParseWrongChunkReceived.cjs');
15
+ var bodyParseUnknownError = require('./error/bodyParseUnknownError.cjs');
16
+ var createHttpServer = require('./createHttpServer.cjs');
17
+ var hooks = require('./hooks.cjs');
18
+
19
+
20
+
21
+ exports.createInterfacesNodeLibKind = kind.createInterfacesNodeLibKind;
22
+ exports.BodySizeExceedsLimitError = bodySizeExceedsLimitError.BodySizeExceedsLimitError;
23
+ exports.BodyParseWrongChunkReceived = bodyParseWrongChunkReceived.BodyParseWrongChunkReceived;
24
+ exports.BodyParseUnknownError = bodyParseUnknownError.BodyParseUnknownError;
25
+ exports.createHttpServer = createHttpServer.createHttpServer;
26
+ exports.makeNodeHook = hooks.makeNodeHook;
@@ -0,0 +1,5 @@
1
+ export * from "./types";
2
+ export * from "./kind";
3
+ export * from "./error";
4
+ export * from "./createHttpServer";
5
+ export * from "./hooks";
@@ -0,0 +1,15 @@
1
+ import '../../core/request.mjs';
2
+ import '../../core/steps/kind.mjs';
3
+ import '../../core/steps/identifier.mjs';
4
+ import '../../core/steps/checker.mjs';
5
+ import '../../core/steps/extract.mjs';
6
+ import '../../core/steps/cut.mjs';
7
+ import '../../core/steps/handler.mjs';
8
+ import '../../core/steps/process.mjs';
9
+ import '../../core/steps/presetChecker.mjs';
10
+ export { createInterfacesNodeLibKind } from './kind.mjs';
11
+ export { BodySizeExceedsLimitError } from './error/bodySizeExceedsLimitError.mjs';
12
+ export { BodyParseWrongChunkReceived } from './error/bodyParseWrongChunkReceived.mjs';
13
+ export { BodyParseUnknownError } from './error/bodyParseUnknownError.mjs';
14
+ export { createHttpServer } from './createHttpServer.mjs';
15
+ export { makeNodeHook } from './hooks.mjs';
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ var utils = require('@duplojs/utils');
4
+
5
+ const createInterfacesNodeLibKind = utils.createKindNamespace(
6
+ // @ts-expect-error reserved kind namespace
7
+ "DuplojsHttpInterfacesNode");
8
+
9
+ exports.createInterfacesNodeLibKind = createInterfacesNodeLibKind;
@@ -0,0 +1,6 @@
1
+ declare module "@duplojs/utils" {
2
+ interface ReservedKindNamespace {
3
+ DuplojsHttpInterfacesNode: true;
4
+ }
5
+ }
6
+ export declare const createInterfacesNodeLibKind: <GenericName extends string, GenericKindValue extends unknown = unknown>(name: GenericName & import("@duplojs/utils/string").ForbiddenString<GenericName, "@" | "/">) => import("@duplojs/utils").KindHandler<import("@duplojs/utils").KindDefinition<`@DuplojsHttpInterfacesNode/${GenericName}`, GenericKindValue>>;
@@ -0,0 +1,7 @@
1
+ import { createKindNamespace } from '@duplojs/utils';
2
+
3
+ const createInterfacesNodeLibKind = createKindNamespace(
4
+ // @ts-expect-error reserved kind namespace
5
+ "DuplojsHttpInterfacesNode");
6
+
7
+ export { createInterfacesNodeLibKind };
@@ -0,0 +1,4 @@
1
+ import { type O } from "@duplojs/utils";
2
+ export interface HostCustom {
3
+ }
4
+ export type Hosts = (HostCustom[O.GetPropsWithValue<HostCustom, true>] | "::" | "0.0.0.0" | "localhost" | "127.0.0.1" | "::1");
@@ -0,0 +1,2 @@
1
+ export * from "./host";
2
+ export * from "./request";
@@ -0,0 +1,23 @@
1
+ import "../../../core/request";
2
+ import "../../../core/steps";
3
+ import type http from "http";
4
+ export interface RawRequest {
5
+ request: http.IncomingMessage;
6
+ response: http.ServerResponse;
7
+ }
8
+ declare module "../../../core/steps" {
9
+ interface DisabledExtractKeysCustom {
10
+ raw: true;
11
+ }
12
+ }
13
+ declare module "../../../core/request" {
14
+ interface RequestInitializationData {
15
+ raw: RawRequest;
16
+ }
17
+ interface Request {
18
+ /**
19
+ * @deprecated
20
+ */
21
+ raw: RawRequest;
22
+ }
23
+ }
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@duplojs/http",
3
+ "version": "0.1.0",
4
+ "author": "mathcovax",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/duplojs/http.git"
10
+ },
11
+ "scripts": {
12
+ "build": "rollup --config",
13
+ "test:tu": "vitest --coverage",
14
+ "test:tu:bench": "vitest bench",
15
+ "test:tu:watch": "vitest --coverage --watch",
16
+ "test:tu:update": "vitest --coverage --update",
17
+ "test:types": "tsc -p tests/core/tsconfig.json && tsc -p tests/interfaces/node/tsconfig.json && tsc -p tests/interfaces/bun/tsconfig.json && tsc -p tests/interfaces/deno/tsconfig.json",
18
+ "test:lint": "eslint",
19
+ "test:lint:fix": "eslint --fix",
20
+ "prepare": "husky"
21
+ },
22
+ "types": "./dist/index.d.ts",
23
+ "exports": {
24
+ ".": {
25
+ "import": "./dist/core/index.mjs",
26
+ "require": "./dist/core/index.cjs",
27
+ "types": "./dist/core/index.d.ts"
28
+ },
29
+ "./node": {
30
+ "import": "./dist/interfaces/node/index.mjs",
31
+ "require": "./dist/interfaces/node/index.cjs",
32
+ "types": "./dist/interfaces/node/index.d.ts"
33
+ },
34
+ "./bun": {
35
+ "import": "./dist/interfaces/bun/index.mjs",
36
+ "require": "./dist/interfaces/bun/index.cjs",
37
+ "types": "./dist/interfaces/bun/index.d.ts"
38
+ },
39
+ "./deno": {
40
+ "import": "./dist/interfaces/deno/index.mjs",
41
+ "require": "./dist/interfaces/deno/index.cjs",
42
+ "types": "./dist/interfaces/deno/index.d.ts"
43
+ }
44
+ },
45
+ "files": [
46
+ "dist",
47
+ "README.md"
48
+ ],
49
+ "peerDependencies": {
50
+ "@duplojs/utils": ">=1.1.16 <2.0.0"
51
+ },
52
+ "devDependencies": {
53
+ "@commitlint/cli": "19.8.1",
54
+ "@commitlint/config-conventional": "19.8.1",
55
+ "@duplojs/eslint": "0.5.0",
56
+ "@rollup/plugin-typescript": "12.1.4",
57
+ "@types/bun": "^1.3.3",
58
+ "@types/deno": "^2.5.0",
59
+ "@types/node": "24.3.0",
60
+ "@vitest/coverage-istanbul": "3.2.4",
61
+ "eslint": "9.34.0",
62
+ "form-data": "^4.0.5",
63
+ "husky": "9.1.7",
64
+ "node-mocks-http": "^1.17.2",
65
+ "rollup": "4.50.0",
66
+ "rollup-plugin-delete": "3.0.1",
67
+ "rollup-plugin-esbuild": "6.2.1",
68
+ "rollup-plugin-tsc-alias": "1.1.4",
69
+ "tslib": "2.8.1",
70
+ "tsx": "4.20.5",
71
+ "typescript": "5.9.2",
72
+ "vite-tsconfig-paths": "5.1.4",
73
+ "vitest": "3.2.4"
74
+ },
75
+ "workspaces": [
76
+ "integration"
77
+ ],
78
+ "keywords": [],
79
+ "engines": {
80
+ "node": ">=22.15.1"
81
+ }
82
+ }