@adaas/a-server 0.0.23 → 0.0.25

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 (49) hide show
  1. package/dist/browser/index.d.mts +30 -0
  2. package/dist/browser/index.mjs +68 -2
  3. package/dist/browser/index.mjs.map +1 -1
  4. package/dist/node/{A-Response.entity-BVYAc6-8.d.mts → A-Response.entity-6qhiV7BE.d.mts} +30 -0
  5. package/dist/node/{A-Response.entity-CRc-t-vr.d.ts → A-Response.entity-bjh6bofZ.d.ts} +30 -0
  6. package/dist/node/controllers/A-CommandController/A-CommandController.component.d.mts +1 -1
  7. package/dist/node/controllers/A-CommandController/A-CommandController.component.d.ts +1 -1
  8. package/dist/node/controllers/A-EntityController/A-EntityController.component.d.mts +1 -1
  9. package/dist/node/controllers/A-EntityController/A-EntityController.component.d.ts +1 -1
  10. package/dist/node/controllers/A-ListingController/A-ListingController.component.d.mts +1 -1
  11. package/dist/node/controllers/A-ListingController/A-ListingController.component.d.ts +1 -1
  12. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.d.mts +1 -1
  13. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.d.ts +1 -1
  14. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.js +11 -2
  15. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.js.map +1 -1
  16. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.mjs +7 -3
  17. package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.mjs.map +1 -1
  18. package/dist/node/index.d.mts +1 -1
  19. package/dist/node/index.d.ts +1 -1
  20. package/dist/node/lib/A-Response/A-Response.entity.d.mts +1 -1
  21. package/dist/node/lib/A-Response/A-Response.entity.d.ts +1 -1
  22. package/dist/node/lib/A-Response/A-Response.entity.js +65 -1
  23. package/dist/node/lib/A-Response/A-Response.entity.js.map +1 -1
  24. package/dist/node/lib/A-Response/A-Response.entity.mjs +65 -1
  25. package/dist/node/lib/A-Response/A-Response.entity.mjs.map +1 -1
  26. package/dist/node/lib/A-Response/A-Response.types.d.mts +1 -1
  27. package/dist/node/lib/A-Response/A-Response.types.d.ts +1 -1
  28. package/dist/node/lib/A-Server/A-HttpServer.container.d.mts +1 -1
  29. package/dist/node/lib/A-Server/A-HttpServer.container.d.ts +1 -1
  30. package/dist/node/lib/A-Server/A-HttpServer.container.js +3 -1
  31. package/dist/node/lib/A-Server/A-HttpServer.container.js.map +1 -1
  32. package/dist/node/lib/A-Server/A-HttpServer.container.mjs +3 -1
  33. package/dist/node/lib/A-Server/A-HttpServer.container.mjs.map +1 -1
  34. package/dist/node/lib/A-ServerController/A-ServerController.component.d.mts +1 -1
  35. package/dist/node/lib/A-ServerController/A-ServerController.component.d.ts +1 -1
  36. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.d.mts +1 -1
  37. package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.d.ts +1 -1
  38. package/dist/node/lib/A-ServerProxy/A-ServerProxy.component.d.mts +1 -1
  39. package/dist/node/lib/A-ServerProxy/A-ServerProxy.component.d.ts +1 -1
  40. package/dist/node/lib/A-ServerRouter/A-ServerRouter.component.d.mts +1 -1
  41. package/dist/node/lib/A-ServerRouter/A-ServerRouter.component.d.ts +1 -1
  42. package/dist/node/lib/A-ServerStatic/A-ServerStatic.component.d.mts +1 -1
  43. package/dist/node/lib/A-ServerStatic/A-ServerStatic.component.d.ts +1 -1
  44. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.d.mts +1 -1
  45. package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.d.ts +1 -1
  46. package/package.json +8 -4
  47. package/src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts +7 -4
  48. package/src/lib/A-Response/A-Response.entity.ts +63 -1
  49. package/src/lib/A-Server/A-HttpServer.container.ts +6 -1
@@ -161,6 +161,10 @@ declare class A_Response<_ResponseType = any> extends A_Entity<A_Response_Constr
161
161
  * Event listeners map for A_Response events
162
162
  */
163
163
  private _listeners;
164
+ /**
165
+ * Whether this response is operating as a persistent SSE stream
166
+ */
167
+ private _isStreaming;
164
168
  constructor(params: A_Response_Constructor, options?: A_Response_Options);
165
169
  /**
166
170
  * Initialize from new entity parameters
@@ -186,6 +190,12 @@ declare class A_Response<_ResponseType = any> extends A_Entity<A_Response_Constr
186
190
  * Gets response size in bytes
187
191
  */
188
192
  get size(): number;
193
+ /**
194
+ * Whether this response is in SSE streaming mode.
195
+ * When true the server container will NOT auto-send and destroy() will
196
+ * leave the underlying socket open.
197
+ */
198
+ get isStreaming(): boolean;
189
199
  /**
190
200
  * Initialize the response
191
201
  */
@@ -212,6 +222,26 @@ declare class A_Response<_ResponseType = any> extends A_Entity<A_Response_Constr
212
222
  * [!] Note: This method ends the response immediately.
213
223
  */
214
224
  redirect(url: string): Promise<void>;
225
+ /**
226
+ * Upgrade this response to a persistent SSE stream.
227
+ * Sends the required headers and writes the initial `:ok` comment to flush
228
+ * the connection. After calling this the response will NOT be auto-closed
229
+ * by the server container or by destroy().
230
+ */
231
+ sseOpen(): void;
232
+ /**
233
+ * Write a named SSE event onto the open stream.
234
+ * Format: `event: <name>\ndata: <JSON>\n\n`
235
+ *
236
+ * Compatible with browser EventSource `addEventListener(name, handler)`.
237
+ *
238
+ * @returns false when the channel is no longer writable
239
+ */
240
+ sseWrite(event: string, data?: any): boolean;
241
+ /**
242
+ * Close the SSE stream gracefully.
243
+ */
244
+ sseClose(): void;
215
245
  /**
216
246
  * Write head with status and headers
217
247
  */
@@ -161,6 +161,10 @@ declare class A_Response<_ResponseType = any> extends A_Entity<A_Response_Constr
161
161
  * Event listeners map for A_Response events
162
162
  */
163
163
  private _listeners;
164
+ /**
165
+ * Whether this response is operating as a persistent SSE stream
166
+ */
167
+ private _isStreaming;
164
168
  constructor(params: A_Response_Constructor, options?: A_Response_Options);
165
169
  /**
166
170
  * Initialize from new entity parameters
@@ -186,6 +190,12 @@ declare class A_Response<_ResponseType = any> extends A_Entity<A_Response_Constr
186
190
  * Gets response size in bytes
187
191
  */
188
192
  get size(): number;
193
+ /**
194
+ * Whether this response is in SSE streaming mode.
195
+ * When true the server container will NOT auto-send and destroy() will
196
+ * leave the underlying socket open.
197
+ */
198
+ get isStreaming(): boolean;
189
199
  /**
190
200
  * Initialize the response
191
201
  */
@@ -212,6 +222,26 @@ declare class A_Response<_ResponseType = any> extends A_Entity<A_Response_Constr
212
222
  * [!] Note: This method ends the response immediately.
213
223
  */
214
224
  redirect(url: string): Promise<void>;
225
+ /**
226
+ * Upgrade this response to a persistent SSE stream.
227
+ * Sends the required headers and writes the initial `:ok` comment to flush
228
+ * the connection. After calling this the response will NOT be auto-closed
229
+ * by the server container or by destroy().
230
+ */
231
+ sseOpen(): void;
232
+ /**
233
+ * Write a named SSE event onto the open stream.
234
+ * Format: `event: <name>\ndata: <JSON>\n\n`
235
+ *
236
+ * Compatible with browser EventSource `addEventListener(name, handler)`.
237
+ *
238
+ * @returns false when the channel is no longer writable
239
+ */
240
+ sseWrite(event: string, data?: any): boolean;
241
+ /**
242
+ * Close the SSE stream gracefully.
243
+ */
244
+ sseClose(): void;
215
245
  /**
216
246
  * Write head with status and headers
217
247
  */
@@ -1,6 +1,6 @@
1
1
  import { A_Component, A_Scope, A_Container } from '@adaas/a-concept';
2
2
  import { A as A_Request } from '../../A-Request.entity-r905O60G.mjs';
3
- import { A as A_Response } from '../../A-Response.entity-BVYAc6-8.mjs';
3
+ import { A as A_Response } from '../../A-Response.entity-6qhiV7BE.mjs';
4
4
  import { A_Logger } from '@adaas/a-utils/a-logger';
5
5
  import 'http';
6
6
  import '../../lib/A-Server/A-HttpServer.error.mjs';
@@ -1,6 +1,6 @@
1
1
  import { A_Component, A_Scope, A_Container } from '@adaas/a-concept';
2
2
  import { A as A_Request } from '../../A-Request.entity-8_9MCXT2.js';
3
- import { A as A_Response } from '../../A-Response.entity-CRc-t-vr.js';
3
+ import { A as A_Response } from '../../A-Response.entity-bjh6bofZ.js';
4
4
  import { A_Logger } from '@adaas/a-utils/a-logger';
5
5
  import 'http';
6
6
  import '../../lib/A-Server/A-HttpServer.error.js';
@@ -1,6 +1,6 @@
1
1
  import { A_Component, A_Scope } from '@adaas/a-concept';
2
2
  import { A as A_Request } from '../../A-Request.entity-r905O60G.mjs';
3
- import { A as A_Response } from '../../A-Response.entity-BVYAc6-8.mjs';
3
+ import { A as A_Response } from '../../A-Response.entity-6qhiV7BE.mjs';
4
4
  import { A_Config } from '@adaas/a-utils/a-config';
5
5
  import 'http';
6
6
  import '../../lib/A-Server/A-HttpServer.error.mjs';
@@ -1,6 +1,6 @@
1
1
  import { A_Component, A_Scope } from '@adaas/a-concept';
2
2
  import { A as A_Request } from '../../A-Request.entity-8_9MCXT2.js';
3
- import { A as A_Response } from '../../A-Response.entity-CRc-t-vr.js';
3
+ import { A as A_Response } from '../../A-Response.entity-bjh6bofZ.js';
4
4
  import { A_Config } from '@adaas/a-utils/a-config';
5
5
  import 'http';
6
6
  import '../../lib/A-Server/A-HttpServer.error.js';
@@ -1,7 +1,7 @@
1
1
  import { A_Component, A_Scope } from '@adaas/a-concept';
2
2
  import { A_Config } from '@adaas/a-utils/a-config';
3
3
  import { A as A_Request } from '../../A-Request.entity-r905O60G.mjs';
4
- import { A as A_Response } from '../../A-Response.entity-BVYAc6-8.mjs';
4
+ import { A as A_Response } from '../../A-Response.entity-6qhiV7BE.mjs';
5
5
  import 'http';
6
6
  import '../../lib/A-Server/A-HttpServer.error.mjs';
7
7
  import '../../lib/A-Server/A-HttpServer.types.mjs';
@@ -1,7 +1,7 @@
1
1
  import { A_Component, A_Scope } from '@adaas/a-concept';
2
2
  import { A_Config } from '@adaas/a-utils/a-config';
3
3
  import { A as A_Request } from '../../A-Request.entity-8_9MCXT2.js';
4
- import { A as A_Response } from '../../A-Response.entity-CRc-t-vr.js';
4
+ import { A as A_Response } from '../../A-Response.entity-bjh6bofZ.js';
5
5
  import 'http';
6
6
  import '../../lib/A-Server/A-HttpServer.error.js';
7
7
  import '../../lib/A-Server/A-HttpServer.types.js';
@@ -1,6 +1,6 @@
1
1
  import { A_Component } from '@adaas/a-concept';
2
2
  import { A as A_Request } from '../../A-Request.entity-r905O60G.mjs';
3
- import { A as A_Response } from '../../A-Response.entity-BVYAc6-8.mjs';
3
+ import { A as A_Response } from '../../A-Response.entity-6qhiV7BE.mjs';
4
4
  import { A_Config } from '@adaas/a-utils/a-config';
5
5
  import { A_ServerLogger } from '../../lib/A-ServerLogger/A-ServerLogger.component.mjs';
6
6
  import 'http';
@@ -1,6 +1,6 @@
1
1
  import { A_Component } from '@adaas/a-concept';
2
2
  import { A as A_Request } from '../../A-Request.entity-8_9MCXT2.js';
3
- import { A as A_Response } from '../../A-Response.entity-CRc-t-vr.js';
3
+ import { A as A_Response } from '../../A-Response.entity-bjh6bofZ.js';
4
4
  import { A_Config } from '@adaas/a-utils/a-config';
5
5
  import { A_ServerLogger } from '../../lib/A-ServerLogger/A-ServerLogger.component.js';
6
6
  import 'http';
@@ -6,6 +6,13 @@ var ARequest_entity = require('@adaas/a-server/request/A-Request.entity');
6
6
  var AResponse_entity = require('@adaas/a-server/response/A-Response.entity');
7
7
  var aConfig = require('@adaas/a-utils/a-config');
8
8
  var AServerLogger_component = require('@adaas/a-server/logger/A-ServerLogger.component');
9
+ var fs = require('fs');
10
+ var path = require('path');
11
+
12
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
+
14
+ var fs__default = /*#__PURE__*/_interopDefault(fs);
15
+ var path__default = /*#__PURE__*/_interopDefault(path);
9
16
 
10
17
  var __defProp = Object.defineProperty;
11
18
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -20,13 +27,15 @@ var __decorateClass = (decorators, target, key, kind) => {
20
27
  var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
21
28
  class A_ServerHealthMonitor extends aConcept.A_Component {
22
29
  async get(config, request, response, logger) {
23
- const packageJSON = await import(`${config.get("A_CONCEPT_ROOT_FOLDER")}/package.json`);
30
+ const rootFolder = config.get("A_CONCEPT_ROOT_FOLDER") || aConcept.A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();
31
+ const pkgPath = path__default.default.join(rootFolder, "package.json");
32
+ const packageJSON = JSON.parse(fs__default.default.readFileSync(pkgPath, "utf-8"));
24
33
  const exposedProperties = config.get("EXPOSED_PROPERTIES")?.split(",") || [
25
34
  "name",
26
35
  "version",
27
36
  "description"
28
37
  ];
29
- exposedProperties.forEach((prop) => response.add(prop, packageJSON.default[prop]));
38
+ exposedProperties.forEach((prop) => response.add(prop, packageJSON[prop]));
30
39
  }
31
40
  }
32
41
  __decorateClass([
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts"],"names":["A_Component","A_ServerRouter","A_Config","A_Request","A_Response","A_ServerLogger"],"mappings":";;;;;;;;;;;;;;;;;;;;AASO,MAAM,8BAA8BA,oBAAA,CAAY;AAAA,EAYnD,MAAM,GAAA,CACkB,MAAA,EACC,OAAA,EACC,UACI,MAAA,EACd;AACZ,IAAA,MAAM,cAAc,MAAM,OAAO,GAAG,MAAA,CAAO,GAAA,CAAI,uBAAuB,CAAC,CAAA,aAAA,CAAA,CAAA;AAIvE,IAAA,MAAM,oBAAmC,MAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK;AAAA,MACrF,MAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,UAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAC,CAAC,CAAA;AAAA,EACnF;AACJ;AAlBU,eAAA,CAAA;AAAA,EALLC,uCAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACZ,CAAA;AAAA,EAEI,qCAASC,gBAAQ,CAAA,CAAA;AAAA,EACjB,qCAASC,yBAAS,CAAA,CAAA;AAAA,EAClB,qCAASC,2BAAU,CAAA,CAAA;AAAA,EACnB,qCAASC,sCAAc,CAAA;AAAA,CAAA,EAhBnB,qBAAA,CAYH,SAAA,EAAA,KAAA,CAAA","file":"A-ServerHealthMonitor.component.js","sourcesContent":["import { A_Component, A_Inject } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\n\n\n\nexport class A_ServerHealthMonitor extends A_Component {\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_ServerRouter.Get({\n path: '/',\n prefix: 'health',\n version: 'v1',\n })\n async get(\n @A_Inject(A_Config) config: A_Config<['VERSION_PATH', 'EXPOSED_PROPERTIES']>,\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<any> {\n const packageJSON = await import(`${config.get('A_CONCEPT_ROOT_FOLDER')}/package.json`,\n { with: { type: 'json' } });\n\n\n const exposedProperties: Array<string> = config.get('EXPOSED_PROPERTIES')?.split(',') || [\n 'name',\n 'version',\n 'description',\n ];\n\n exposedProperties.forEach(prop => response.add(prop, packageJSON.default[prop]));\n }\n}"]}
1
+ {"version":3,"sources":["../../../../src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts"],"names":["A_Component","A_CONCEPT_ENV","path","fs","A_ServerRouter","A_Config","A_Request","A_Response","A_ServerLogger"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAWO,MAAM,8BAA8BA,oBAAA,CAAY;AAAA,EAYnD,MAAM,GAAA,CACkB,MAAA,EACC,OAAA,EACC,UACI,MAAA,EACd;AACZ,IAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,uBAAuB,KAAKC,sBAAA,CAAc,qBAAA,IAAyB,QAAQ,GAAA,EAAI;AAC7G,IAAA,MAAM,OAAA,GAAUC,qBAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AACpD,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAMC,oBAAG,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAGhE,IAAA,MAAM,oBAAmC,MAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK;AAAA,MACrF,MAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,UAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3E;AACJ;AAnBU,eAAA,CAAA;AAAA,EALLC,uCAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACZ,CAAA;AAAA,EAEI,qCAASC,gBAAQ,CAAA,CAAA;AAAA,EACjB,qCAASC,yBAAS,CAAA,CAAA;AAAA,EAClB,qCAASC,2BAAU,CAAA,CAAA;AAAA,EACnB,qCAASC,sCAAc,CAAA;AAAA,CAAA,EAhBnB,qBAAA,CAYH,SAAA,EAAA,KAAA,CAAA","file":"A-ServerHealthMonitor.component.js","sourcesContent":["import { A_Component, A_CONCEPT_ENV, A_Inject } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n\n\nexport class A_ServerHealthMonitor extends A_Component {\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_ServerRouter.Get({\n path: '/',\n prefix: 'health',\n version: 'v1',\n })\n async get(\n @A_Inject(A_Config) config: A_Config<['VERSION_PATH', 'EXPOSED_PROPERTIES']>,\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<any> {\n const rootFolder = config.get('A_CONCEPT_ROOT_FOLDER') || A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();\n const pkgPath = path.join(rootFolder, 'package.json');\n const packageJSON = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n\n\n const exposedProperties: Array<string> = config.get('EXPOSED_PROPERTIES')?.split(',') || [\n 'name',\n 'version',\n 'description',\n ];\n\n exposedProperties.forEach(prop => response.add(prop, packageJSON[prop]));\n }\n}"]}
@@ -1,20 +1,24 @@
1
1
  import { __decorateClass, __decorateParam } from '../../chunk-EQQGB2QZ.mjs';
2
- import { A_Inject, A_Component } from '@adaas/a-concept';
2
+ import { A_Inject, A_Component, A_CONCEPT_ENV } from '@adaas/a-concept';
3
3
  import { A_ServerRouter } from '@adaas/a-server/router/A-ServerRouter.component';
4
4
  import { A_Request } from '@adaas/a-server/request/A-Request.entity';
5
5
  import { A_Response } from '@adaas/a-server/response/A-Response.entity';
6
6
  import { A_Config } from '@adaas/a-utils/a-config';
7
7
  import { A_ServerLogger } from '@adaas/a-server/logger/A-ServerLogger.component';
8
+ import fs from 'fs';
9
+ import path from 'path';
8
10
 
9
11
  class A_ServerHealthMonitor extends A_Component {
10
12
  async get(config, request, response, logger) {
11
- const packageJSON = await import(`${config.get("A_CONCEPT_ROOT_FOLDER")}/package.json`);
13
+ const rootFolder = config.get("A_CONCEPT_ROOT_FOLDER") || A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();
14
+ const pkgPath = path.join(rootFolder, "package.json");
15
+ const packageJSON = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
12
16
  const exposedProperties = config.get("EXPOSED_PROPERTIES")?.split(",") || [
13
17
  "name",
14
18
  "version",
15
19
  "description"
16
20
  ];
17
- exposedProperties.forEach((prop) => response.add(prop, packageJSON.default[prop]));
21
+ exposedProperties.forEach((prop) => response.add(prop, packageJSON[prop]));
18
22
  }
19
23
  }
20
24
  __decorateClass([
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts"],"names":[],"mappings":";;;;;;;;AASO,MAAM,8BAA8B,WAAA,CAAY;AAAA,EAYnD,MAAM,GAAA,CACkB,MAAA,EACC,OAAA,EACC,UACI,MAAA,EACd;AACZ,IAAA,MAAM,cAAc,MAAM,OAAO,GAAG,MAAA,CAAO,GAAA,CAAI,uBAAuB,CAAC,CAAA,aAAA,CAAA,CAAA;AAIvE,IAAA,MAAM,oBAAmC,MAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK;AAAA,MACrF,MAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,UAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAC,CAAC,CAAA;AAAA,EACnF;AACJ;AAlBU,eAAA,CAAA;AAAA,EALL,eAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACZ,CAAA;AAAA,EAEI,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,SAAS,CAAA,CAAA;AAAA,EAClB,4BAAS,UAAU,CAAA,CAAA;AAAA,EACnB,4BAAS,cAAc,CAAA;AAAA,CAAA,EAhBnB,qBAAA,CAYH,SAAA,EAAA,KAAA,EAAA,CAAA,CAAA","file":"A-ServerHealthMonitor.component.mjs","sourcesContent":["import { A_Component, A_Inject } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\n\n\n\nexport class A_ServerHealthMonitor extends A_Component {\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_ServerRouter.Get({\n path: '/',\n prefix: 'health',\n version: 'v1',\n })\n async get(\n @A_Inject(A_Config) config: A_Config<['VERSION_PATH', 'EXPOSED_PROPERTIES']>,\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<any> {\n const packageJSON = await import(`${config.get('A_CONCEPT_ROOT_FOLDER')}/package.json`,\n { with: { type: 'json' } });\n\n\n const exposedProperties: Array<string> = config.get('EXPOSED_PROPERTIES')?.split(',') || [\n 'name',\n 'version',\n 'description',\n ];\n\n exposedProperties.forEach(prop => response.add(prop, packageJSON.default[prop]));\n }\n}"]}
1
+ {"version":3,"sources":["../../../../src/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.ts"],"names":[],"mappings":";;;;;;;;;;AAWO,MAAM,8BAA8B,WAAA,CAAY;AAAA,EAYnD,MAAM,GAAA,CACkB,MAAA,EACC,OAAA,EACC,UACI,MAAA,EACd;AACZ,IAAA,MAAM,UAAA,GAAa,OAAO,GAAA,CAAI,uBAAuB,KAAK,aAAA,CAAc,qBAAA,IAAyB,QAAQ,GAAA,EAAI;AAC7G,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AACpD,IAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAGhE,IAAA,MAAM,oBAAmC,MAAA,CAAO,GAAA,CAAI,oBAAoB,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,IAAK;AAAA,MACrF,MAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,iBAAA,CAAkB,OAAA,CAAQ,UAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3E;AACJ;AAnBU,eAAA,CAAA;AAAA,EALL,eAAe,GAAA,CAAI;AAAA,IAChB,IAAA,EAAM,GAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACZ,CAAA;AAAA,EAEI,4BAAS,QAAQ,CAAA,CAAA;AAAA,EACjB,4BAAS,SAAS,CAAA,CAAA;AAAA,EAClB,4BAAS,UAAU,CAAA,CAAA;AAAA,EACnB,4BAAS,cAAc,CAAA;AAAA,CAAA,EAhBnB,qBAAA,CAYH,SAAA,EAAA,KAAA,EAAA,CAAA,CAAA","file":"A-ServerHealthMonitor.component.mjs","sourcesContent":["import { A_Component, A_CONCEPT_ENV, A_Inject } from \"@adaas/a-concept\";\nimport { A_ServerRouter } from \"@adaas/a-server/router/A-ServerRouter.component\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_Response } from \"@adaas/a-server/response/A-Response.entity\";\nimport { A_Config } from \"@adaas/a-utils/a-config\";\nimport { A_ServerLogger } from \"@adaas/a-server/logger/A-ServerLogger.component\";\nimport fs from \"fs\";\nimport path from \"path\";\n\n\n\nexport class A_ServerHealthMonitor extends A_Component {\n\n\n // =======================================================\n // ================ Method Definition=====================\n // =======================================================\n\n @A_ServerRouter.Get({\n path: '/',\n prefix: 'health',\n version: 'v1',\n })\n async get(\n @A_Inject(A_Config) config: A_Config<['VERSION_PATH', 'EXPOSED_PROPERTIES']>,\n @A_Inject(A_Request) request: A_Request,\n @A_Inject(A_Response) response: A_Response,\n @A_Inject(A_ServerLogger) logger: A_ServerLogger\n ): Promise<any> {\n const rootFolder = config.get('A_CONCEPT_ROOT_FOLDER') || A_CONCEPT_ENV.A_CONCEPT_ROOT_FOLDER || process.cwd();\n const pkgPath = path.join(rootFolder, 'package.json');\n const packageJSON = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n\n\n const exposedProperties: Array<string> = config.get('EXPOSED_PROPERTIES')?.split(',') || [\n 'name',\n 'version',\n 'description',\n ];\n\n exposedProperties.forEach(prop => response.add(prop, packageJSON[prop]));\n }\n}"]}
@@ -6,7 +6,7 @@ export { A_RequestEnvVariables, A_RequestEnvVariablesArray, A_RequestEnvVariable
6
6
  export { A_RequestError } from './lib/A-Request/A-Request.error.mjs';
7
7
  export { A_RequestHelper } from './lib/A-Request/A-Request.helper.mjs';
8
8
  export { A_ResponseFeatures } from './lib/A-Response/A-Response.constants.mjs';
9
- export { A as A_Response, a as A_ResponseFeatureNames, b as A_Response_CacheOptions, c as A_Response_CompressionOptions, d as A_Response_Constructor, e as A_Response_CookieOptions, f as A_Response_DownloadOptions, g as A_Response_Listener, h as A_Response_Options, i as A_Response_SendResponseObject, j as A_Response_Serialized, k as A_Response_StreamOptions } from './A-Response.entity-BVYAc6-8.mjs';
9
+ export { A as A_Response, a as A_ResponseFeatureNames, b as A_Response_CacheOptions, c as A_Response_CompressionOptions, d as A_Response_Constructor, e as A_Response_CookieOptions, f as A_Response_DownloadOptions, g as A_Response_Listener, h as A_Response_Options, i as A_Response_SendResponseObject, j as A_Response_Serialized, k as A_Response_StreamOptions } from './A-Response.entity-6qhiV7BE.mjs';
10
10
  export { A_ResponseError } from './lib/A-Response/A-Response.error.mjs';
11
11
  export { A_HttpServerFeatures } from './lib/A-Server/A-HttpServer.constants.mjs';
12
12
  export { A_HttpServer } from './lib/A-Server/A-HttpServer.container.mjs';
@@ -6,7 +6,7 @@ export { A_RequestEnvVariables, A_RequestEnvVariablesArray, A_RequestEnvVariable
6
6
  export { A_RequestError } from './lib/A-Request/A-Request.error.js';
7
7
  export { A_RequestHelper } from './lib/A-Request/A-Request.helper.js';
8
8
  export { A_ResponseFeatures } from './lib/A-Response/A-Response.constants.js';
9
- export { A as A_Response, a as A_ResponseFeatureNames, b as A_Response_CacheOptions, c as A_Response_CompressionOptions, d as A_Response_Constructor, e as A_Response_CookieOptions, f as A_Response_DownloadOptions, g as A_Response_Listener, h as A_Response_Options, i as A_Response_SendResponseObject, j as A_Response_Serialized, k as A_Response_StreamOptions } from './A-Response.entity-CRc-t-vr.js';
9
+ export { A as A_Response, a as A_ResponseFeatureNames, b as A_Response_CacheOptions, c as A_Response_CompressionOptions, d as A_Response_Constructor, e as A_Response_CookieOptions, f as A_Response_DownloadOptions, g as A_Response_Listener, h as A_Response_Options, i as A_Response_SendResponseObject, j as A_Response_Serialized, k as A_Response_StreamOptions } from './A-Response.entity-bjh6bofZ.js';
10
10
  export { A_ResponseError } from './lib/A-Response/A-Response.error.js';
11
11
  export { A_HttpServerFeatures } from './lib/A-Server/A-HttpServer.constants.js';
12
12
  export { A_HttpServer } from './lib/A-Server/A-HttpServer.container.js';
@@ -1,6 +1,6 @@
1
1
  import '@adaas/a-concept';
2
2
  import 'http';
3
- export { A as A_Response } from '../../A-Response.entity-BVYAc6-8.mjs';
3
+ export { A as A_Response } from '../../A-Response.entity-6qhiV7BE.mjs';
4
4
  import 'stream';
5
5
  import './A-Response.constants.mjs';
6
6
  import '../A-Server/A-HttpServer.error.mjs';
@@ -1,6 +1,6 @@
1
1
  import '@adaas/a-concept';
2
2
  import 'http';
3
- export { A as A_Response } from '../../A-Response.entity-CRc-t-vr.js';
3
+ export { A as A_Response } from '../../A-Response.entity-bjh6bofZ.js';
4
4
  import 'stream';
5
5
  import './A-Response.constants.js';
6
6
  import '../A-Server/A-HttpServer.error.js';
@@ -26,6 +26,10 @@ class A_Response extends aConcept.A_Entity {
26
26
  * Event listeners map for A_Response events
27
27
  */
28
28
  this._listeners = /* @__PURE__ */ new Map();
29
+ /**
30
+ * Whether this response is operating as a persistent SSE stream
31
+ */
32
+ this._isStreaming = false;
29
33
  this._options = {
30
34
  autoCompress: true,
31
35
  compressionThreshold: 1024,
@@ -95,6 +99,14 @@ class A_Response extends aConcept.A_Entity {
95
99
  get size() {
96
100
  return this.original.getHeader("Content-Length") || 0;
97
101
  }
102
+ /**
103
+ * Whether this response is in SSE streaming mode.
104
+ * When true the server container will NOT auto-send and destroy() will
105
+ * leave the underlying socket open.
106
+ */
107
+ get isStreaming() {
108
+ return this._isStreaming;
109
+ }
98
110
  // ======================================================================================
99
111
  // --------------------------------------------------------------------------
100
112
  // A-Response Primary Methods
@@ -116,7 +128,7 @@ class A_Response extends aConcept.A_Entity {
116
128
  * Destroy the response
117
129
  */
118
130
  async destroy() {
119
- if (!this.original.destroyed) {
131
+ if (!this.original.destroyed && !this._isStreaming) {
120
132
  this.original.end();
121
133
  this._listeners.clear();
122
134
  this.original.removeAllListeners();
@@ -215,6 +227,58 @@ class A_Response extends aConcept.A_Entity {
215
227
  }));
216
228
  }
217
229
  }
230
+ // ======================================================================================
231
+ // --------------------------------------------------------------------------
232
+ // A-Response SSE (Server-Sent Events) Methods
233
+ // --------------------------------------------------------------------------
234
+ // ======================================================================================
235
+ /**
236
+ * Upgrade this response to a persistent SSE stream.
237
+ * Sends the required headers and writes the initial `:ok` comment to flush
238
+ * the connection. After calling this the response will NOT be auto-closed
239
+ * by the server container or by destroy().
240
+ */
241
+ sseOpen() {
242
+ if (this.headersSent || this._isStreaming) return;
243
+ this._isStreaming = true;
244
+ this.original.writeHead(200, {
245
+ "Content-Type": "text/event-stream",
246
+ "Cache-Control": "no-cache, no-transform",
247
+ "Connection": "keep-alive",
248
+ "X-Accel-Buffering": "no"
249
+ });
250
+ this.original.write(":ok\n\n");
251
+ this.original.once("close", () => {
252
+ this._isStreaming = false;
253
+ });
254
+ }
255
+ /**
256
+ * Write a named SSE event onto the open stream.
257
+ * Format: `event: <name>\ndata: <JSON>\n\n`
258
+ *
259
+ * Compatible with browser EventSource `addEventListener(name, handler)`.
260
+ *
261
+ * @returns false when the channel is no longer writable
262
+ */
263
+ sseWrite(event, data) {
264
+ if (!this._isStreaming || this.original.destroyed) return false;
265
+ try {
266
+ return this.original.write(`event: ${event}
267
+ data: ${JSON.stringify(data ?? {})}
268
+
269
+ `);
270
+ } catch {
271
+ return false;
272
+ }
273
+ }
274
+ /**
275
+ * Close the SSE stream gracefully.
276
+ */
277
+ sseClose() {
278
+ if (!this._isStreaming || this.original.destroyed) return;
279
+ this._isStreaming = false;
280
+ this.original.end();
281
+ }
218
282
  /**
219
283
  * Write head with status and headers
220
284
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/A-Response/A-Response.entity.ts"],"names":["A_Entity","ASEID","A_Context","A_HttpServerError","A_ResponseFeatures","stream","Readable","pipeline","A_Error","A_Feature","A_HttpServerRequestContext","A_Request"],"mappings":"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","file":"A-Response.entity.js","sourcesContent":["import {\n A_Context,\n A_Entity,\n A_Error,\n A_Feature,\n A_Inject,\n ASEID,\n} from \"@adaas/a-concept\";\nimport type {\n IncomingHttpHeaders,\n ServerResponse\n} from \"http\";\nimport {\n A_Response_Constructor,\n A_Response_CacheOptions,\n A_Response_Options,\n A_Response_Serialized,\n A_Response_CookieOptions,\n A_ResponseFeatureNames,\n} from \"./A-Response.types\";\nimport { pipeline, Readable } from 'stream';\nimport { A_ResponseFeatures } from \"./A-Response.constants\";\nimport { A_Response_Listener } from \"./A-Response.types\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\n\n/**\n * A_Response - Comprehensive HTTP Response Processing Entity\n * \n * This class provides a complete wrapper around Node.js ServerResponse with advanced features:\n * - Response data accumulation and value management\n * - Error collection and standardized error responses\n * - Response streaming with progress tracking\n * - Template rendering and view engine support\n * - Cookie management and secure cookie handling\n * - Response compression (gzip, deflate, brotli)\n * - File downloads and static file serving\n * - Response caching and ETags\n * - Performance metrics and timing\n * - Response validation and content negotiation\n * \n * @example\n */\nexport class A_Response<_ResponseType = any> extends A_Entity<\n A_Response_Constructor,\n A_Response_Serialized<_ResponseType>\n> {\n\n // =============================================\n // Static Properties\n // =============================================\n static get namespace(): string {\n return 'a-server';\n }\n\n // =============================================\n // Core Properties\n // =============================================\n /**\n * Original ServerResponse object\n */\n private _res!: ServerResponse;\n /**\n * Internal object to store all response data\n */\n private _data!: Map<string, _ResponseType>;\n /**\n * uses in case the response isn't an object \n */\n private _dataOverride?: _ResponseType\n /**\n * Redirect URL for handling redirects\n */\n private _redirectURL?: string;\n /**\n * Cookies map for managing response cookies\n */\n private _cookies!: Map<string, { value: string, options?: A_Response_CookieOptions }>;\n /**\n * Indicates if the response has finished\n */\n private _cacheOptions?: A_Response_CacheOptions;\n /**\n * Indicates if the response has finished\n */\n private _options!: Required<A_Response_Options>\n /**\n * Event listeners map for A_Response events\n */\n private _listeners: Map<A_ResponseFeatureNames, Set<A_Response_Listener>> = new Map();\n\n\n constructor(params: A_Response_Constructor, options?: A_Response_Options) {\n super(params);\n this._options = {\n autoCompress: true,\n compressionThreshold: 1024, // 1KB\n enableCaching: true,\n defaultCacheMaxAge: 3600, // 1 hour\n enableMetrics: true,\n enableEtag: true,\n enableLastModified: true,\n charset: 'utf-8',\n defaultContentType: 'application/json',\n maxRedirects: 5,\n enableCookies: true,\n enableSessions: true,\n ...(options || {})\n };\n }\n\n /**\n * Initialize from new entity parameters\n */\n fromNew(newEntity: A_Response_Constructor): void {\n this.aseid = new ASEID({\n concept: A_Context.root.name,\n scope: newEntity.scope,\n entity: (this.constructor as typeof A_Response).entity,\n shard: newEntity.shard,\n id: newEntity.id\n });\n\n this._res = newEntity.response;\n this._data = new Map<string, _ResponseType>();\n this._cookies = new Map<string, { value: string, options?: A_Response_CookieOptions }>();\n\n\n }\n /**\n * Gets the response data map\n */\n get data(): Map<string, _ResponseType> {\n return this._data;\n }\n /**\n * Gets the original ServerResponse object\n */\n get original(): ServerResponse {\n return this._res;\n }\n /**\n * Gets whether headers have been sent\n */\n get headersSent(): boolean {\n return this.original.headersSent;\n }\n /**\n * Gets the current status code\n */\n get statusCode(): number {\n return this.original.statusCode;\n }\n /**\n * Gets response size in bytes\n */\n get size(): number {\n return this.original.getHeader('Content-Length') as number || 0;\n }\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Primary Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Initialize the response\n */\n async load(): Promise<void> {\n\n // Track response completion\n // this.original.on('finish', this.handleFinish.bind(this));\n\n // this.original.on('close', this.handleClose.bind(this));\n\n\n this.original.on('error', err => {\n this.fail(new A_HttpServerError({\n status: 500,\n description: `Request error: ${err.message}`,\n originalError: err\n }));\n });\n }\n /**\n * Destroy the response\n */\n async destroy(): Promise<any> {\n\n if (!this.original.destroyed) {\n this.original.end();\n this._listeners.clear();\n this.original.removeAllListeners();\n }\n\n return super.destroy();\n }\n /**\n * Handle response failure with error details\n */\n async fail(err?: A_HttpServerError): Promise<void> {\n if (err)\n A_Context\n .scope(this)\n .register(err);\n\n await this.call(A_ResponseFeatures.onError);\n\n await this.destroy();\n }\n /**\n * Send a plain text or JSON response\n */\n async send(data?: any): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n this._dataOverride = data;\n\n await this.call(A_ResponseFeatures.onSend);\n\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while sending the response.',\n originalError: error\n }));\n }\n }\n /**\n * Stream response data\n */\n public async stream(\n dataStream: Readable | any[]\n ): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n return new Promise((resolve, reject) => {\n this.original.setHeader('Transfer-Encoding', 'chunked');\n this.setDefaultResponseHeaders();\n this.setCookieHeaders();\n this.original.writeHead(this.statusCode);\n\n let stream: Readable;\n\n if (Array.isArray(dataStream)) {\n // Convert array to readable stream\n stream = new Readable({\n read() {\n if (dataStream.length > 0) {\n const chunk = dataStream.shift();\n this.push(typeof chunk === 'string' ? chunk : JSON.stringify(chunk) + '\\n');\n } else {\n this.push(null);\n }\n }\n });\n } else {\n stream = dataStream;\n }\n\n let bytesWritten = 0;\n\n stream.on('data', (chunk) => {\n bytesWritten += chunk.length;\n });\n\n stream.on('end', resolve);\n\n stream.on('error', reject);\n\n pipeline(stream, this.original, (error) => {\n if (error) {\n reject(error);\n }\n });\n\n });\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while streaming the response. Unable to process the stream.',\n originalError: error\n }));\n }\n }\n /**\n * Redirect response\n * \n * [!] Note: This method ends the response immediately.\n */\n public async redirect(\n url: string\n ): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n this._redirectURL = url;\n\n await this.call(A_ResponseFeatures.onRedirect);\n\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while redirecting the response.',\n originalError: error\n }));\n }\n }\n /**\n * Write head with status and headers\n */\n public writeHead(statusCode: number, headers?: Record<string, string> | IncomingHttpHeaders | any): this {\n this.original.writeHead(statusCode, headers);\n return this;\n }\n /**\n * Set HTTP status code\n */\n public status(code: number): this {\n this.original.statusCode = code;\n return this;\n }\n /**\n * Set response header\n */\n public setHeader(key: string, value: string | number | string[]): this {\n this.original.setHeader(key, value);\n return this;\n }\n /**\n * Get response header\n */\n public getHeader(key: string): string | number | string[] | undefined {\n return this.original.getHeader(key);\n }\n /**\n * Remove response header\n */\n public removeHeader(key: string): this {\n this.original.removeHeader(key);\n return this;\n }\n /**\n * Set cookie\n */\n public setCookie(\n name: string,\n value: string,\n options?: A_Response_CookieOptions\n ): this {\n this._cookies.set(name, { value, options });\n return this;\n }\n /**\n * Clear cookie\n */\n public clearCookie(name: string, options?: A_Response_CookieOptions): this {\n const clearOptions = {\n ...options,\n expires: new Date(0),\n maxAge: 0\n };\n this._cookies.set(name, { value: '', options: clearOptions });\n return this;\n }\n // --------------------------------------------------------------------------\n // Response Data manipulation methods\n // --------------------------------------------------------------------------\n /**\n * Add data to response\n */\n public add(key: string, data: _ResponseType): this {\n this._data.set(key, data);\n return this;\n }\n /**\n * Remove data from response\n */\n public remove(key: string): this {\n this._data.delete(key);\n return this;\n }\n /**\n * Get data from response\n */\n public get(key: string): _ResponseType | undefined {\n return this._data.get(key);\n }\n /**\n * Check if response has data\n */\n public has(key: string): boolean {\n return this._data.has(key);\n }\n /**\n * Clear all response data\n */\n public clear(): this {\n this._data.clear();\n return this;\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // Internal handlers for request events\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Handle response finish event\n * \n * @returns \n */\n protected handleFinish(): Promise<void> {\n try {\n return this.call(A_ResponseFeatures.onFinish) as Promise<void>;\n } catch (error) {\n return this.fail(new A_HttpServerError({\n status: 500,\n description: `Response finish error: ${error instanceof A_Error ? error.message : 'An error occurred while finishing the response.'}`,\n originalError: error\n }));\n }\n }\n /**\n * Handle response close event\n */\n protected async handleClose(): Promise<void> {\n try {\n\n await this.call(A_ResponseFeatures.onClose);\n\n } catch (error) {\n\n await this.fail(new A_HttpServerError({\n status: 499,\n description: 'Client closed the connection before the response could be completed.',\n originalError: error\n }));\n }\n }\n // ======================================================================================\n // -------------------------------------------------------------------------- \n // A-Request Event-Emitter methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Registers an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n on(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set());\n }\n this._listeners.get(event)!.add(listener);\n }\n /**\n * Removes an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n off(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n this._listeners.get(event)?.delete(listener);\n }\n /**\n * Emits an event to all registered listeners\n * \n * @param event \n */\n emit(event: A_ResponseFeatureNames) {\n this._listeners.get(event)?.forEach(async listener => {\n listener(this);\n });\n }\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Feature Default Extensions\n // --------------------------------------------------------------------------\n // ======================================================================================\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onSend](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ) {\n\n const responseData = this._dataOverride || this.toResponse();\n\n switch (true) {\n case !!responseData && typeof responseData === 'object':\n this.original.setHeader('Content-Type', `application/json; charset=${this._options.charset}`);\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n // this.setCookieHeaders();\n // this.setCacheHeaders();\n\n this.original.end(JSON.stringify(responseData));\n return;\n\n case !!responseData && typeof responseData === 'string':\n this.original.setHeader('Content-Type', `text/plain; charset=${this._options.charset}`);\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(responseData);\n return;\n\n default:\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(responseData);\n return;\n }\n }\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onRedirect](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ) {\n\n if (!this._redirectURL) return;\n\n this.original.setHeader('Location', this._redirectURL!);\n if (!this.statusCode || (this.statusCode < 300 || this.statusCode > 399))\n this.status(301);\n\n this.original.end();\n }\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onError](\n @A_Inject(A_HttpServerError) error: A_HttpServerError,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n @A_Inject(A_Request) request: A_Request,\n ...args: any[]\n ) {\n\n if (this.headersSent) {\n return;\n }\n\n const statusCode = error.status || 500;\n this.status(statusCode);\n\n const errorResponse = {\n error: {\n message: error.message,\n status: statusCode,\n description: error.description || '',\n }\n };\n\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(JSON.stringify(errorResponse));\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Helper Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Set standard response headers\n */\n protected setDefaultResponseHeaders(): void {\n // Security headers\n this.original.setHeader('X-Content-Type-Options', 'nosniff');\n this.original.setHeader('X-Frame-Options', 'DENY');\n this.original.setHeader('X-XSS-Protection', '1; mode=block');\n\n // Request ID for tracking\n this.original.setHeader('X-Request-ID', this.aseid.id);\n }\n /**\n * Set cookie headers\n */\n protected setCookieHeaders(): void {\n if (!this._options.enableCookies || this._cookies.size === 0) return;\n\n const cookieStrings: string[] = [];\n\n this._cookies.forEach(({ value, options }, name) => {\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options) {\n if (options.domain) cookieString += `; Domain=${options.domain}`;\n if (options.path) cookieString += `; Path=${options.path}`;\n if (options.maxAge) cookieString += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookieString += `; Expires=${options.expires.toUTCString()}`;\n if (options.httpOnly) cookieString += '; HttpOnly';\n if (options.secure) cookieString += '; Secure';\n if (options.sameSite) cookieString += `; SameSite=${options.sameSite}`;\n }\n\n cookieStrings.push(cookieString);\n });\n\n this.original.setHeader('Set-Cookie', cookieStrings);\n }\n /**\n * Set cache headers\n */\n protected setCacheHeaders(): void {\n if (!this._cacheOptions) return;\n\n const cacheControl: string[] = [];\n\n if (this._cacheOptions.public) cacheControl.push('public');\n if (this._cacheOptions.private) cacheControl.push('private');\n if (this._cacheOptions.noCache) cacheControl.push('no-cache');\n if (this._cacheOptions.noStore) cacheControl.push('no-store');\n if (this._cacheOptions.mustRevalidate) cacheControl.push('must-revalidate');\n if (this._cacheOptions.proxyRevalidate) cacheControl.push('proxy-revalidate');\n if (this._cacheOptions.immutable) cacheControl.push('immutable');\n\n if (this._cacheOptions.maxAge !== undefined) {\n cacheControl.push(`max-age=${this._cacheOptions.maxAge}`);\n }\n\n if (this._cacheOptions.sMaxAge !== undefined) {\n cacheControl.push(`s-maxage=${this._cacheOptions.sMaxAge}`);\n }\n\n if (cacheControl.length > 0) {\n this.original.setHeader('Cache-Control', cacheControl.join(', '));\n }\n\n if (this._cacheOptions.etag) {\n this.original.setHeader('ETag', this._cacheOptions.etag);\n }\n\n if (this._cacheOptions.lastModified) {\n this.original.setHeader('Last-Modified', this._cacheOptions.lastModified.toUTCString());\n }\n }\n\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Serialization Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Convert accumulated data to response object\n */\n public toResponse(): _ResponseType {\n const response = Array.from(this._data.entries()).reduce((acc, [key, value]) => {\n if (value instanceof A_Entity) {\n acc[key] = value.toJSON();\n } else {\n acc[key] = value;\n }\n return acc;\n }, {} as any);\n\n return response;\n }\n /**\n * Enhanced JSON serialization for logging/debugging\n */\n public toJSON(): A_Response_Serialized<_ResponseType> {\n return {\n ...super.toJSON(),\n status: this.statusCode,\n headersSent: this.headersSent,\n size: this.size,\n data: this.toResponse(),\n redirectURL: this._redirectURL,\n };\n }\n}"]}
1
+ {"version":3,"sources":["../../../../src/lib/A-Response/A-Response.entity.ts"],"names":["A_Entity","ASEID","A_Context","A_HttpServerError","A_ResponseFeatures","stream","Readable","pipeline","A_Error","A_Feature","A_HttpServerRequestContext","A_Request"],"mappings":"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","file":"A-Response.entity.js","sourcesContent":["import {\n A_Context,\n A_Entity,\n A_Error,\n A_Feature,\n A_Inject,\n ASEID,\n} from \"@adaas/a-concept\";\nimport type {\n IncomingHttpHeaders,\n ServerResponse\n} from \"http\";\nimport {\n A_Response_Constructor,\n A_Response_CacheOptions,\n A_Response_Options,\n A_Response_Serialized,\n A_Response_CookieOptions,\n A_ResponseFeatureNames,\n} from \"./A-Response.types\";\nimport { pipeline, Readable } from 'stream';\nimport { A_ResponseFeatures } from \"./A-Response.constants\";\nimport { A_Response_Listener } from \"./A-Response.types\";\nimport { A_HttpServerError } from \"@adaas/a-server/server/A-HttpServer.error\";\nimport { A_Request } from \"@adaas/a-server/request/A-Request.entity\";\nimport { A_HttpServerRequestContext } from \"@adaas/a-server/request/A-HttpServerRequest.context\";\n\n/**\n * A_Response - Comprehensive HTTP Response Processing Entity\n * \n * This class provides a complete wrapper around Node.js ServerResponse with advanced features:\n * - Response data accumulation and value management\n * - Error collection and standardized error responses\n * - Response streaming with progress tracking\n * - Template rendering and view engine support\n * - Cookie management and secure cookie handling\n * - Response compression (gzip, deflate, brotli)\n * - File downloads and static file serving\n * - Response caching and ETags\n * - Performance metrics and timing\n * - Response validation and content negotiation\n * \n * @example\n */\nexport class A_Response<_ResponseType = any> extends A_Entity<\n A_Response_Constructor,\n A_Response_Serialized<_ResponseType>\n> {\n\n // =============================================\n // Static Properties\n // =============================================\n static get namespace(): string {\n return 'a-server';\n }\n\n // =============================================\n // Core Properties\n // =============================================\n /**\n * Original ServerResponse object\n */\n private _res!: ServerResponse;\n /**\n * Internal object to store all response data\n */\n private _data!: Map<string, _ResponseType>;\n /**\n * uses in case the response isn't an object \n */\n private _dataOverride?: _ResponseType\n /**\n * Redirect URL for handling redirects\n */\n private _redirectURL?: string;\n /**\n * Cookies map for managing response cookies\n */\n private _cookies!: Map<string, { value: string, options?: A_Response_CookieOptions }>;\n /**\n * Indicates if the response has finished\n */\n private _cacheOptions?: A_Response_CacheOptions;\n /**\n * Indicates if the response has finished\n */\n private _options!: Required<A_Response_Options>\n /**\n * Event listeners map for A_Response events\n */\n private _listeners: Map<A_ResponseFeatureNames, Set<A_Response_Listener>> = new Map();\n /**\n * Whether this response is operating as a persistent SSE stream\n */\n private _isStreaming: boolean = false;\n\n\n constructor(params: A_Response_Constructor, options?: A_Response_Options) {\n super(params);\n this._options = {\n autoCompress: true,\n compressionThreshold: 1024, // 1KB\n enableCaching: true,\n defaultCacheMaxAge: 3600, // 1 hour\n enableMetrics: true,\n enableEtag: true,\n enableLastModified: true,\n charset: 'utf-8',\n defaultContentType: 'application/json',\n maxRedirects: 5,\n enableCookies: true,\n enableSessions: true,\n ...(options || {})\n };\n }\n\n /**\n * Initialize from new entity parameters\n */\n fromNew(newEntity: A_Response_Constructor): void {\n this.aseid = new ASEID({\n concept: A_Context.root.name,\n scope: newEntity.scope,\n entity: (this.constructor as typeof A_Response).entity,\n shard: newEntity.shard,\n id: newEntity.id\n });\n\n this._res = newEntity.response;\n this._data = new Map<string, _ResponseType>();\n this._cookies = new Map<string, { value: string, options?: A_Response_CookieOptions }>();\n\n\n }\n /**\n * Gets the response data map\n */\n get data(): Map<string, _ResponseType> {\n return this._data;\n }\n /**\n * Gets the original ServerResponse object\n */\n get original(): ServerResponse {\n return this._res;\n }\n /**\n * Gets whether headers have been sent\n */\n get headersSent(): boolean {\n return this.original.headersSent;\n }\n /**\n * Gets the current status code\n */\n get statusCode(): number {\n return this.original.statusCode;\n }\n /**\n * Gets response size in bytes\n */\n get size(): number {\n return this.original.getHeader('Content-Length') as number || 0;\n }\n /**\n * Whether this response is in SSE streaming mode.\n * When true the server container will NOT auto-send and destroy() will\n * leave the underlying socket open.\n */\n get isStreaming(): boolean {\n return this._isStreaming;\n }\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Primary Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Initialize the response\n */\n async load(): Promise<void> {\n\n // Track response completion\n // this.original.on('finish', this.handleFinish.bind(this));\n\n // this.original.on('close', this.handleClose.bind(this));\n\n\n this.original.on('error', err => {\n this.fail(new A_HttpServerError({\n status: 500,\n description: `Request error: ${err.message}`,\n originalError: err\n }));\n });\n }\n /**\n * Destroy the response\n */\n async destroy(): Promise<any> {\n\n if (!this.original.destroyed && !this._isStreaming) {\n this.original.end();\n this._listeners.clear();\n this.original.removeAllListeners();\n }\n\n return super.destroy();\n }\n /**\n * Handle response failure with error details\n */\n async fail(err?: A_HttpServerError): Promise<void> {\n if (err)\n A_Context\n .scope(this)\n .register(err);\n\n await this.call(A_ResponseFeatures.onError);\n\n await this.destroy();\n }\n /**\n * Send a plain text or JSON response\n */\n async send(data?: any): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n this._dataOverride = data;\n\n await this.call(A_ResponseFeatures.onSend);\n\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while sending the response.',\n originalError: error\n }));\n }\n }\n /**\n * Stream response data\n */\n public async stream(\n dataStream: Readable | any[]\n ): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n return new Promise((resolve, reject) => {\n this.original.setHeader('Transfer-Encoding', 'chunked');\n this.setDefaultResponseHeaders();\n this.setCookieHeaders();\n this.original.writeHead(this.statusCode);\n\n let stream: Readable;\n\n if (Array.isArray(dataStream)) {\n // Convert array to readable stream\n stream = new Readable({\n read() {\n if (dataStream.length > 0) {\n const chunk = dataStream.shift();\n this.push(typeof chunk === 'string' ? chunk : JSON.stringify(chunk) + '\\n');\n } else {\n this.push(null);\n }\n }\n });\n } else {\n stream = dataStream;\n }\n\n let bytesWritten = 0;\n\n stream.on('data', (chunk) => {\n bytesWritten += chunk.length;\n });\n\n stream.on('end', resolve);\n\n stream.on('error', reject);\n\n pipeline(stream, this.original, (error) => {\n if (error) {\n reject(error);\n }\n });\n\n });\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while streaming the response. Unable to process the stream.',\n originalError: error\n }));\n }\n }\n /**\n * Redirect response\n * \n * [!] Note: This method ends the response immediately.\n */\n public async redirect(\n url: string\n ): Promise<void> {\n if (this.headersSent)\n return;\n\n try {\n this._redirectURL = url;\n\n await this.call(A_ResponseFeatures.onRedirect);\n\n } catch (error) {\n await this.fail(error instanceof A_HttpServerError ? error : new A_HttpServerError({\n status: 500,\n description: 'An error occurred while redirecting the response.',\n originalError: error\n }));\n }\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response SSE (Server-Sent Events) Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Upgrade this response to a persistent SSE stream.\n * Sends the required headers and writes the initial `:ok` comment to flush\n * the connection. After calling this the response will NOT be auto-closed\n * by the server container or by destroy().\n */\n public sseOpen(): void {\n if (this.headersSent || this._isStreaming) return;\n this._isStreaming = true;\n this.original.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n 'Connection': 'keep-alive',\n 'X-Accel-Buffering': 'no',\n });\n this.original.write(':ok\\n\\n');\n // Reset streaming flag when the client disconnects\n this.original.once('close', () => {\n this._isStreaming = false;\n });\n }\n /**\n * Write a named SSE event onto the open stream.\n * Format: `event: <name>\\ndata: <JSON>\\n\\n`\n *\n * Compatible with browser EventSource `addEventListener(name, handler)`.\n *\n * @returns false when the channel is no longer writable\n */\n public sseWrite(event: string, data?: any): boolean {\n if (!this._isStreaming || this.original.destroyed) return false;\n try {\n return this.original.write(`event: ${event}\\ndata: ${JSON.stringify(data ?? {})}\\n\\n`);\n } catch {\n return false;\n }\n }\n /**\n * Close the SSE stream gracefully.\n */\n public sseClose(): void {\n if (!this._isStreaming || this.original.destroyed) return;\n this._isStreaming = false;\n this.original.end();\n }\n /**\n * Write head with status and headers\n */\n public writeHead(statusCode: number, headers?: Record<string, string> | IncomingHttpHeaders | any): this {\n this.original.writeHead(statusCode, headers);\n return this;\n }\n /**\n * Set HTTP status code\n */\n public status(code: number): this {\n this.original.statusCode = code;\n return this;\n }\n /**\n * Set response header\n */\n public setHeader(key: string, value: string | number | string[]): this {\n this.original.setHeader(key, value);\n return this;\n }\n /**\n * Get response header\n */\n public getHeader(key: string): string | number | string[] | undefined {\n return this.original.getHeader(key);\n }\n /**\n * Remove response header\n */\n public removeHeader(key: string): this {\n this.original.removeHeader(key);\n return this;\n }\n /**\n * Set cookie\n */\n public setCookie(\n name: string,\n value: string,\n options?: A_Response_CookieOptions\n ): this {\n this._cookies.set(name, { value, options });\n return this;\n }\n /**\n * Clear cookie\n */\n public clearCookie(name: string, options?: A_Response_CookieOptions): this {\n const clearOptions = {\n ...options,\n expires: new Date(0),\n maxAge: 0\n };\n this._cookies.set(name, { value: '', options: clearOptions });\n return this;\n }\n // --------------------------------------------------------------------------\n // Response Data manipulation methods\n // --------------------------------------------------------------------------\n /**\n * Add data to response\n */\n public add(key: string, data: _ResponseType): this {\n this._data.set(key, data);\n return this;\n }\n /**\n * Remove data from response\n */\n public remove(key: string): this {\n this._data.delete(key);\n return this;\n }\n /**\n * Get data from response\n */\n public get(key: string): _ResponseType | undefined {\n return this._data.get(key);\n }\n /**\n * Check if response has data\n */\n public has(key: string): boolean {\n return this._data.has(key);\n }\n /**\n * Clear all response data\n */\n public clear(): this {\n this._data.clear();\n return this;\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // Internal handlers for request events\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Handle response finish event\n * \n * @returns \n */\n protected handleFinish(): Promise<void> {\n try {\n return this.call(A_ResponseFeatures.onFinish) as Promise<void>;\n } catch (error) {\n return this.fail(new A_HttpServerError({\n status: 500,\n description: `Response finish error: ${error instanceof A_Error ? error.message : 'An error occurred while finishing the response.'}`,\n originalError: error\n }));\n }\n }\n /**\n * Handle response close event\n */\n protected async handleClose(): Promise<void> {\n try {\n\n await this.call(A_ResponseFeatures.onClose);\n\n } catch (error) {\n\n await this.fail(new A_HttpServerError({\n status: 499,\n description: 'Client closed the connection before the response could be completed.',\n originalError: error\n }));\n }\n }\n // ======================================================================================\n // -------------------------------------------------------------------------- \n // A-Request Event-Emitter methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Registers an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n on(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set());\n }\n this._listeners.get(event)!.add(listener);\n }\n /**\n * Removes an event listener for a specific event\n * \n * @param event \n * @param listener \n */\n off(event: A_ResponseFeatureNames, listener: A_Response_Listener) {\n this._listeners.get(event)?.delete(listener);\n }\n /**\n * Emits an event to all registered listeners\n * \n * @param event \n */\n emit(event: A_ResponseFeatureNames) {\n this._listeners.get(event)?.forEach(async listener => {\n listener(this);\n });\n }\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Feature Default Extensions\n // --------------------------------------------------------------------------\n // ======================================================================================\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onSend](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ) {\n\n const responseData = this._dataOverride || this.toResponse();\n\n switch (true) {\n case !!responseData && typeof responseData === 'object':\n this.original.setHeader('Content-Type', `application/json; charset=${this._options.charset}`);\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n // this.setCookieHeaders();\n // this.setCacheHeaders();\n\n this.original.end(JSON.stringify(responseData));\n return;\n\n case !!responseData && typeof responseData === 'string':\n this.original.setHeader('Content-Type', `text/plain; charset=${this._options.charset}`);\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(responseData);\n return;\n\n default:\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(responseData);\n return;\n }\n }\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onRedirect](\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n ...args: any[]\n ) {\n\n if (!this._redirectURL) return;\n\n this.original.setHeader('Location', this._redirectURL!);\n if (!this.statusCode || (this.statusCode < 300 || this.statusCode > 399))\n this.status(301);\n\n this.original.end();\n }\n\n @A_Feature.Extend({\n after: /.*/\n })\n async [A_ResponseFeatures.onError](\n @A_Inject(A_HttpServerError) error: A_HttpServerError,\n @A_Inject(A_HttpServerRequestContext) context: A_HttpServerRequestContext,\n @A_Inject(A_Request) request: A_Request,\n ...args: any[]\n ) {\n\n if (this.headersSent) {\n return;\n }\n\n const statusCode = error.status || 500;\n this.status(statusCode);\n\n const errorResponse = {\n error: {\n message: error.message,\n status: statusCode,\n description: error.description || '',\n }\n };\n\n this.setDefaultResponseHeaders();\n this.original.writeHead(this.statusCode);\n\n this.original.end(JSON.stringify(errorResponse));\n }\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Helper Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Set standard response headers\n */\n protected setDefaultResponseHeaders(): void {\n // Security headers\n this.original.setHeader('X-Content-Type-Options', 'nosniff');\n this.original.setHeader('X-Frame-Options', 'DENY');\n this.original.setHeader('X-XSS-Protection', '1; mode=block');\n\n // Request ID for tracking\n this.original.setHeader('X-Request-ID', this.aseid.id);\n }\n /**\n * Set cookie headers\n */\n protected setCookieHeaders(): void {\n if (!this._options.enableCookies || this._cookies.size === 0) return;\n\n const cookieStrings: string[] = [];\n\n this._cookies.forEach(({ value, options }, name) => {\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options) {\n if (options.domain) cookieString += `; Domain=${options.domain}`;\n if (options.path) cookieString += `; Path=${options.path}`;\n if (options.maxAge) cookieString += `; Max-Age=${options.maxAge}`;\n if (options.expires) cookieString += `; Expires=${options.expires.toUTCString()}`;\n if (options.httpOnly) cookieString += '; HttpOnly';\n if (options.secure) cookieString += '; Secure';\n if (options.sameSite) cookieString += `; SameSite=${options.sameSite}`;\n }\n\n cookieStrings.push(cookieString);\n });\n\n this.original.setHeader('Set-Cookie', cookieStrings);\n }\n /**\n * Set cache headers\n */\n protected setCacheHeaders(): void {\n if (!this._cacheOptions) return;\n\n const cacheControl: string[] = [];\n\n if (this._cacheOptions.public) cacheControl.push('public');\n if (this._cacheOptions.private) cacheControl.push('private');\n if (this._cacheOptions.noCache) cacheControl.push('no-cache');\n if (this._cacheOptions.noStore) cacheControl.push('no-store');\n if (this._cacheOptions.mustRevalidate) cacheControl.push('must-revalidate');\n if (this._cacheOptions.proxyRevalidate) cacheControl.push('proxy-revalidate');\n if (this._cacheOptions.immutable) cacheControl.push('immutable');\n\n if (this._cacheOptions.maxAge !== undefined) {\n cacheControl.push(`max-age=${this._cacheOptions.maxAge}`);\n }\n\n if (this._cacheOptions.sMaxAge !== undefined) {\n cacheControl.push(`s-maxage=${this._cacheOptions.sMaxAge}`);\n }\n\n if (cacheControl.length > 0) {\n this.original.setHeader('Cache-Control', cacheControl.join(', '));\n }\n\n if (this._cacheOptions.etag) {\n this.original.setHeader('ETag', this._cacheOptions.etag);\n }\n\n if (this._cacheOptions.lastModified) {\n this.original.setHeader('Last-Modified', this._cacheOptions.lastModified.toUTCString());\n }\n }\n\n\n // ======================================================================================\n // --------------------------------------------------------------------------\n // A-Response Serialization Methods\n // --------------------------------------------------------------------------\n // ======================================================================================\n /**\n * Convert accumulated data to response object\n */\n public toResponse(): _ResponseType {\n const response = Array.from(this._data.entries()).reduce((acc, [key, value]) => {\n if (value instanceof A_Entity) {\n acc[key] = value.toJSON();\n } else {\n acc[key] = value;\n }\n return acc;\n }, {} as any);\n\n return response;\n }\n /**\n * Enhanced JSON serialization for logging/debugging\n */\n public toJSON(): A_Response_Serialized<_ResponseType> {\n return {\n ...super.toJSON(),\n status: this.statusCode,\n headersSent: this.headersSent,\n size: this.size,\n data: this.toResponse(),\n redirectURL: this._redirectURL,\n };\n }\n}"]}