@furystack/rest-service 8.0.0 → 9.0.1

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 (113) hide show
  1. package/esm/actions/login.d.ts +0 -1
  2. package/esm/actions/login.d.ts.map +1 -1
  3. package/esm/actions/login.js +0 -1
  4. package/esm/actions/login.js.map +1 -1
  5. package/esm/add-cors-header.d.ts +14 -0
  6. package/esm/add-cors-header.d.ts.map +1 -0
  7. package/esm/add-cors-header.js +23 -0
  8. package/esm/add-cors-header.js.map +1 -0
  9. package/esm/add-cors-header.spec.js +7 -8
  10. package/esm/add-cors-header.spec.js.map +1 -1
  11. package/esm/api-manager.d.ts.map +1 -1
  12. package/esm/api-manager.js +4 -5
  13. package/esm/api-manager.js.map +1 -1
  14. package/esm/endpoint-generators/create-delete-endpoint.d.ts +0 -1
  15. package/esm/endpoint-generators/create-delete-endpoint.d.ts.map +1 -1
  16. package/esm/endpoint-generators/create-delete-endpoint.js +0 -1
  17. package/esm/endpoint-generators/create-delete-endpoint.js.map +1 -1
  18. package/esm/endpoint-generators/create-delete-endpoint.spec.js +4 -2
  19. package/esm/endpoint-generators/create-delete-endpoint.spec.js.map +1 -1
  20. package/esm/endpoint-generators/create-get-collection-endpoint.d.ts +0 -1
  21. package/esm/endpoint-generators/create-get-collection-endpoint.d.ts.map +1 -1
  22. package/esm/endpoint-generators/create-get-collection-endpoint.js +0 -1
  23. package/esm/endpoint-generators/create-get-collection-endpoint.js.map +1 -1
  24. package/esm/endpoint-generators/create-get-collection-endpoint.spec.js +16 -10
  25. package/esm/endpoint-generators/create-get-collection-endpoint.spec.js.map +1 -1
  26. package/esm/endpoint-generators/create-get-entity-endpoint.d.ts +0 -1
  27. package/esm/endpoint-generators/create-get-entity-endpoint.d.ts.map +1 -1
  28. package/esm/endpoint-generators/create-get-entity-endpoint.js +0 -1
  29. package/esm/endpoint-generators/create-get-entity-endpoint.js.map +1 -1
  30. package/esm/endpoint-generators/create-get-entity-endpoint.spec.js +10 -6
  31. package/esm/endpoint-generators/create-get-entity-endpoint.spec.js.map +1 -1
  32. package/esm/endpoint-generators/create-patch-endpoint.d.ts +0 -1
  33. package/esm/endpoint-generators/create-patch-endpoint.d.ts.map +1 -1
  34. package/esm/endpoint-generators/create-patch-endpoint.js +2 -2
  35. package/esm/endpoint-generators/create-patch-endpoint.js.map +1 -1
  36. package/esm/endpoint-generators/create-patch-endpoint.spec.js +4 -2
  37. package/esm/endpoint-generators/create-patch-endpoint.spec.js.map +1 -1
  38. package/esm/endpoint-generators/create-post-endpoint.d.ts +0 -1
  39. package/esm/endpoint-generators/create-post-endpoint.d.ts.map +1 -1
  40. package/esm/endpoint-generators/create-post-endpoint.js +2 -2
  41. package/esm/endpoint-generators/create-post-endpoint.js.map +1 -1
  42. package/esm/endpoint-generators/create-post-endpoint.spec.js +4 -2
  43. package/esm/endpoint-generators/create-post-endpoint.spec.js.map +1 -1
  44. package/esm/endpoint-generators/utils.d.ts.map +1 -1
  45. package/esm/endpoint-generators/utils.js +0 -2
  46. package/esm/endpoint-generators/utils.js.map +1 -1
  47. package/esm/http-user-context.d.ts.map +1 -1
  48. package/esm/http-user-context.js +0 -3
  49. package/esm/http-user-context.js.map +1 -1
  50. package/esm/http-user-context.spec.js +1 -2
  51. package/esm/http-user-context.spec.js.map +1 -1
  52. package/esm/incoming-message-extensions.d.ts +0 -2
  53. package/esm/incoming-message-extensions.d.ts.map +1 -1
  54. package/esm/incoming-message-extensions.js +1 -10
  55. package/esm/incoming-message-extensions.js.map +1 -1
  56. package/esm/index.d.ts +2 -2
  57. package/esm/index.d.ts.map +1 -1
  58. package/esm/index.js +2 -2
  59. package/esm/index.js.map +1 -1
  60. package/esm/models/default-session.d.ts.map +1 -1
  61. package/esm/models/default-session.js +0 -8
  62. package/esm/models/default-session.js.map +1 -1
  63. package/esm/read-post-body.d.ts +12 -0
  64. package/esm/read-post-body.d.ts.map +1 -0
  65. package/esm/read-post-body.js +33 -0
  66. package/esm/read-post-body.js.map +1 -0
  67. package/esm/rest-service.integration.spec.js +23 -30
  68. package/esm/rest-service.integration.spec.js.map +1 -1
  69. package/esm/rest.integration.test.js +1 -1
  70. package/esm/static-server-manager.d.ts.map +1 -1
  71. package/esm/static-server-manager.js +0 -1
  72. package/esm/static-server-manager.js.map +1 -1
  73. package/esm/static-server-manager.spec.js +2 -15
  74. package/esm/static-server-manager.spec.js.map +1 -1
  75. package/esm/validate.integration.spec.js +2 -2
  76. package/esm/validate.integration.spec.js.map +1 -1
  77. package/package.json +10 -10
  78. package/src/actions/login.ts +0 -1
  79. package/src/add-cors-header.spec.ts +7 -8
  80. package/src/add-cors-header.ts +32 -0
  81. package/src/api-manager.ts +5 -5
  82. package/src/endpoint-generators/create-delete-endpoint.spec.ts +4 -2
  83. package/src/endpoint-generators/create-delete-endpoint.ts +0 -1
  84. package/src/endpoint-generators/create-get-collection-endpoint.spec.ts +16 -10
  85. package/src/endpoint-generators/create-get-collection-endpoint.ts +0 -1
  86. package/src/endpoint-generators/create-get-entity-endpoint.spec.ts +10 -6
  87. package/src/endpoint-generators/create-get-entity-endpoint.ts +0 -1
  88. package/src/endpoint-generators/create-patch-endpoint.spec.ts +4 -2
  89. package/src/endpoint-generators/create-patch-endpoint.ts +2 -2
  90. package/src/endpoint-generators/create-post-endpoint.spec.ts +4 -2
  91. package/src/endpoint-generators/create-post-endpoint.ts +2 -2
  92. package/src/endpoint-generators/utils.ts +2 -2
  93. package/src/http-user-context.spec.ts +1 -2
  94. package/src/http-user-context.ts +3 -3
  95. package/src/incoming-message-extensions.ts +0 -15
  96. package/src/index.ts +2 -2
  97. package/src/models/default-session.ts +2 -2
  98. package/src/read-post-body.ts +36 -0
  99. package/src/rest-service.integration.spec.ts +24 -34
  100. package/src/rest.integration.test.ts +1 -1
  101. package/src/static-server-manager.spec.ts +2 -18
  102. package/src/static-server-manager.ts +1 -1
  103. package/src/validate.integration.spec.ts +2 -2
  104. package/esm/incoming-message-extensions.spec.d.ts +0 -2
  105. package/esm/incoming-message-extensions.spec.d.ts.map +0 -1
  106. package/esm/incoming-message-extensions.spec.js +0 -38
  107. package/esm/incoming-message-extensions.spec.js.map +0 -1
  108. package/esm/utils.d.ts +0 -25
  109. package/esm/utils.d.ts.map +0 -1
  110. package/esm/utils.js +0 -70
  111. package/esm/utils.js.map +0 -1
  112. package/src/incoming-message-extensions.spec.ts +0 -42
  113. package/src/utils.ts +0 -68
@@ -14,7 +14,7 @@ import { getPort } from '@furystack/core/port-generator'
14
14
  const createValidateApi = async () => {
15
15
  const injector = new Injector()
16
16
  const port = getPort()
17
- useRestService<ValidationApi>({
17
+ await useRestService<ValidationApi>({
18
18
  injector,
19
19
  api: {
20
20
  GET: {
@@ -54,7 +54,7 @@ const createValidateApi = async () => {
54
54
  root: '/api',
55
55
  })
56
56
  const client = createClient<ValidationApi>({
57
- endpointUrl: `http://localhost:${port}/api`,
57
+ endpointUrl: `http://127.0.0.1:${port}/api`,
58
58
  })
59
59
  return {
60
60
  dispose: injector.dispose.bind(injector),
@@ -1,2 +0,0 @@
1
- import './incoming-message-extensions';
2
- //# sourceMappingURL=incoming-message-extensions.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"incoming-message-extensions.spec.d.ts","sourceRoot":"","sources":["../src/incoming-message-extensions.spec.ts"],"names":[],"mappings":"AACA,OAAO,+BAA+B,CAAA"}
@@ -1,38 +0,0 @@
1
- import { IncomingMessage } from 'http';
2
- import './incoming-message-extensions';
3
- import { Socket } from 'net';
4
- import { describe, it, expect } from 'vitest';
5
- describe('IncomingMessage extensions', () => {
6
- describe('readPostBody', () => {
7
- it('Should be extended', () => {
8
- const socket = new Socket();
9
- const msg = new IncomingMessage(socket);
10
- expect(typeof msg.readPostBody).toBe('function');
11
- });
12
- it('Should read the raw post body', async () => {
13
- const exampleValue = { value: Math.random().toString() };
14
- const socket = new Socket();
15
- const msg = new IncomingMessage(socket);
16
- setTimeout(() => {
17
- msg.read = () => JSON.stringify(exampleValue);
18
- msg.emit('readable');
19
- msg.emit('end');
20
- }, 10);
21
- const result = await msg.readPostBodyRaw();
22
- expect(result).toEqual(JSON.stringify(exampleValue));
23
- });
24
- it('Should read the post body', async () => {
25
- const exampleValue = { value: Math.random().toString() };
26
- const socket = new Socket();
27
- const msg = new IncomingMessage(socket);
28
- setTimeout(() => {
29
- msg.read = () => JSON.stringify(exampleValue);
30
- msg.emit('readable');
31
- msg.emit('end');
32
- }, 10);
33
- const result = await msg.readPostBody();
34
- expect(result).toEqual(exampleValue);
35
- });
36
- });
37
- });
38
- //# sourceMappingURL=incoming-message-extensions.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"incoming-message-extensions.spec.js","sourceRoot":"","sources":["../src/incoming-message-extensions.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AACtC,OAAO,+BAA+B,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE7C,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAC5B,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;YAC3B,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;YACvC,MAAM,CAAC,OAAO,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAA;YACxD,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;YAC3B,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;YACvC,UAAU,CAAC,GAAG,EAAE;gBACd,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;gBAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACpB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACjB,CAAC,EAAE,EAAE,CAAC,CAAA;YAEN,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,eAAe,EAAE,CAAA;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,YAAY,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAA;YACxD,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;YAC3B,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAA;YACvC,UAAU,CAAC,GAAG,EAAE;gBACd,GAAG,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;gBAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBACpB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACjB,CAAC,EAAE,EAAE,CAAC,CAAA;YAEN,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAA;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/esm/utils.d.ts DELETED
@@ -1,25 +0,0 @@
1
- /// <reference path="server-response-extensions.d.ts" />
2
- /// <reference path="incoming-message-extensions.d.ts" />
3
- /// <reference types="node/http.js" />
4
- import type { IncomingMessage, ServerResponse } from 'http';
5
- import type { CorsOptions } from './models/cors-options.js';
6
- /**
7
- * A collection of various HTTP API related utilities
8
- */
9
- export declare class Utils {
10
- readPostBodyRaw(incomingMessage: IncomingMessage): Promise<string>;
11
- /**
12
- * Reads the post's body and returns a promise with a parsed value
13
- * @param incomingMessage The incoming message instance
14
- * @returns the parsed object from the post body
15
- */
16
- readPostBody<T>(incomingMessage: IncomingMessage): Promise<T>;
17
- /**
18
- * Adds the specified CORS headers to the response
19
- * @param options The CORS Options object
20
- * @param incomingMessage The incoming message instance
21
- * @param serverResponse The outgoing response instance
22
- */
23
- addCorsHeaders(options: CorsOptions, incomingMessage: IncomingMessage, serverResponse: ServerResponse): void;
24
- }
25
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D;;GAEG;AACH,qBACa,KAAK;IACH,eAAe,CAAC,eAAe,EAAE,eAAe;IAuB7D;;;;OAIG;IACU,YAAY,CAAC,CAAC,EAAE,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC;IAM1E;;;;;OAKG;IACI,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc;CAkB7G"}
package/esm/utils.js DELETED
@@ -1,70 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { Injectable } from '@furystack/inject';
8
- /**
9
- * A collection of various HTTP API related utilities
10
- */
11
- let Utils = class Utils {
12
- async readPostBodyRaw(incomingMessage) {
13
- if (!incomingMessage.readable) {
14
- throw Error('Incoming message is not readable');
15
- }
16
- let body = '';
17
- await new Promise((resolve, reject) => {
18
- incomingMessage.on('readable', () => {
19
- const data = incomingMessage.read();
20
- if (data) {
21
- body += data;
22
- }
23
- });
24
- incomingMessage.on('end', () => {
25
- resolve();
26
- });
27
- incomingMessage.on('error', (err) => {
28
- reject(err);
29
- });
30
- });
31
- return body;
32
- }
33
- /**
34
- * Reads the post's body and returns a promise with a parsed value
35
- * @param incomingMessage The incoming message instance
36
- * @returns the parsed object from the post body
37
- */
38
- async readPostBody(incomingMessage) {
39
- const body = incomingMessage.postBody || JSON.parse(await this.readPostBodyRaw(incomingMessage));
40
- incomingMessage.postBody = body;
41
- return body;
42
- }
43
- /**
44
- * Adds the specified CORS headers to the response
45
- * @param options The CORS Options object
46
- * @param incomingMessage The incoming message instance
47
- * @param serverResponse The outgoing response instance
48
- */
49
- addCorsHeaders(options, incomingMessage, serverResponse) {
50
- if (incomingMessage.headers &&
51
- incomingMessage.headers.origin !== incomingMessage.headers.host &&
52
- options.origins.some((origin) => origin === incomingMessage.headers.origin)) {
53
- serverResponse.setHeader('Access-Control-Allow-Origin', incomingMessage.headers.origin);
54
- if (options.credentials) {
55
- serverResponse.setHeader('Access-Control-Allow-Credentials', 'true');
56
- }
57
- if (options.headers && options.headers.length) {
58
- serverResponse.setHeader('Access-Control-Allow-Headers', options.headers.join(', '));
59
- }
60
- if (options.methods && options.methods.length) {
61
- serverResponse.setHeader('Access-Control-Allow-Methods', options.methods.join(', '));
62
- }
63
- }
64
- }
65
- };
66
- Utils = __decorate([
67
- Injectable({ lifetime: 'transient' })
68
- ], Utils);
69
- export { Utils };
70
- //# sourceMappingURL=utils.js.map
package/esm/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAG9C;;GAEG;AAEI,IAAM,KAAK,GAAX,MAAM,KAAK;IACT,KAAK,CAAC,eAAe,CAAC,eAAgC;QAC3D,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC,kCAAkC,CAAC,CAAA;QACjD,CAAC;QAED,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;gBAClC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,CAAA;gBACnC,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,IAAI,IAAI,CAAA;gBACd,CAAC;YACH,CAAC,CAAC,CAAA;YACF,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBAC7B,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;YACF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClC,MAAM,CAAC,GAAG,CAAC,CAAA;YACb,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,YAAY,CAAI,eAAgC;QAC3D,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAA;QAChG,eAAe,CAAC,QAAQ,GAAG,IAAI,CAAA;QAC/B,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,OAAoB,EAAE,eAAgC,EAAE,cAA8B;QAC1G,IACE,eAAe,CAAC,OAAO;YACvB,eAAe,CAAC,OAAO,CAAC,MAAM,KAAK,eAAe,CAAC,OAAO,CAAC,IAAI;YAC/D,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAC3E,CAAC;YACD,cAAc,CAAC,SAAS,CAAC,6BAA6B,EAAE,eAAe,CAAC,OAAO,CAAC,MAAgB,CAAC,CAAA;YACjG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,cAAc,CAAC,SAAS,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAA;YACtE,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC9C,cAAc,CAAC,SAAS,CAAC,8BAA8B,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YACtF,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC9C,cAAc,CAAC,SAAS,CAAC,8BAA8B,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YACtF,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA;AA3DY,KAAK;IADjB,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,KAAK,CA2DjB"}
@@ -1,42 +0,0 @@
1
- import { IncomingMessage } from 'http'
2
- import './incoming-message-extensions'
3
- import { Socket } from 'net'
4
- import { describe, it, expect } from 'vitest'
5
-
6
- describe('IncomingMessage extensions', () => {
7
- describe('readPostBody', () => {
8
- it('Should be extended', () => {
9
- const socket = new Socket()
10
- const msg = new IncomingMessage(socket)
11
- expect(typeof msg.readPostBody).toBe('function')
12
- })
13
-
14
- it('Should read the raw post body', async () => {
15
- const exampleValue = { value: Math.random().toString() }
16
- const socket = new Socket()
17
- const msg = new IncomingMessage(socket)
18
- setTimeout(() => {
19
- msg.read = () => JSON.stringify(exampleValue)
20
- msg.emit('readable')
21
- msg.emit('end')
22
- }, 10)
23
-
24
- const result = await msg.readPostBodyRaw()
25
- expect(result).toEqual(JSON.stringify(exampleValue))
26
- })
27
-
28
- it('Should read the post body', async () => {
29
- const exampleValue = { value: Math.random().toString() }
30
- const socket = new Socket()
31
- const msg = new IncomingMessage(socket)
32
- setTimeout(() => {
33
- msg.read = () => JSON.stringify(exampleValue)
34
- msg.emit('readable')
35
- msg.emit('end')
36
- }, 10)
37
-
38
- const result = await msg.readPostBody()
39
- expect(result).toEqual(exampleValue)
40
- })
41
- })
42
- })
package/src/utils.ts DELETED
@@ -1,68 +0,0 @@
1
- import type { IncomingMessage, ServerResponse } from 'http'
2
- import { Injectable } from '@furystack/inject'
3
- import type { CorsOptions } from './models/cors-options.js'
4
-
5
- /**
6
- * A collection of various HTTP API related utilities
7
- */
8
- @Injectable({ lifetime: 'transient' })
9
- export class Utils {
10
- public async readPostBodyRaw(incomingMessage: IncomingMessage) {
11
- if (!incomingMessage.readable) {
12
- throw Error('Incoming message is not readable')
13
- }
14
-
15
- let body = ''
16
- await new Promise<void>((resolve, reject) => {
17
- incomingMessage.on('readable', () => {
18
- const data = incomingMessage.read()
19
- if (data) {
20
- body += data
21
- }
22
- })
23
- incomingMessage.on('end', () => {
24
- resolve()
25
- })
26
- incomingMessage.on('error', (err) => {
27
- reject(err)
28
- })
29
- })
30
- return body
31
- }
32
-
33
- /**
34
- * Reads the post's body and returns a promise with a parsed value
35
- * @param incomingMessage The incoming message instance
36
- * @returns the parsed object from the post body
37
- */
38
- public async readPostBody<T>(incomingMessage: IncomingMessage): Promise<T> {
39
- const body = incomingMessage.postBody || JSON.parse(await this.readPostBodyRaw(incomingMessage))
40
- incomingMessage.postBody = body
41
- return body
42
- }
43
-
44
- /**
45
- * Adds the specified CORS headers to the response
46
- * @param options The CORS Options object
47
- * @param incomingMessage The incoming message instance
48
- * @param serverResponse The outgoing response instance
49
- */
50
- public addCorsHeaders(options: CorsOptions, incomingMessage: IncomingMessage, serverResponse: ServerResponse) {
51
- if (
52
- incomingMessage.headers &&
53
- incomingMessage.headers.origin !== incomingMessage.headers.host &&
54
- options.origins.some((origin) => origin === incomingMessage.headers.origin)
55
- ) {
56
- serverResponse.setHeader('Access-Control-Allow-Origin', incomingMessage.headers.origin as string)
57
- if (options.credentials) {
58
- serverResponse.setHeader('Access-Control-Allow-Credentials', 'true')
59
- }
60
- if (options.headers && options.headers.length) {
61
- serverResponse.setHeader('Access-Control-Allow-Headers', options.headers.join(', '))
62
- }
63
- if (options.methods && options.methods.length) {
64
- serverResponse.setHeader('Access-Control-Allow-Methods', options.methods.join(', '))
65
- }
66
- }
67
- }
68
- }