@adaas/a-server 0.0.23 → 0.0.24
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.
- package/dist/browser/index.d.mts +30 -0
- package/dist/browser/index.mjs +68 -2
- package/dist/browser/index.mjs.map +1 -1
- package/dist/node/{A-Response.entity-BVYAc6-8.d.mts → A-Response.entity-6qhiV7BE.d.mts} +30 -0
- package/dist/node/{A-Response.entity-CRc-t-vr.d.ts → A-Response.entity-bjh6bofZ.d.ts} +30 -0
- package/dist/node/controllers/A-CommandController/A-CommandController.component.d.mts +1 -1
- package/dist/node/controllers/A-CommandController/A-CommandController.component.d.ts +1 -1
- package/dist/node/controllers/A-EntityController/A-EntityController.component.d.mts +1 -1
- package/dist/node/controllers/A-EntityController/A-EntityController.component.d.ts +1 -1
- package/dist/node/controllers/A-ListingController/A-ListingController.component.d.mts +1 -1
- package/dist/node/controllers/A-ListingController/A-ListingController.component.d.ts +1 -1
- package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.d.mts +1 -1
- package/dist/node/controllers/A-ServerHealthMonitor/A-ServerHealthMonitor.component.d.ts +1 -1
- package/dist/node/index.d.mts +1 -1
- package/dist/node/index.d.ts +1 -1
- package/dist/node/lib/A-Response/A-Response.entity.d.mts +1 -1
- package/dist/node/lib/A-Response/A-Response.entity.d.ts +1 -1
- package/dist/node/lib/A-Response/A-Response.entity.js +65 -1
- package/dist/node/lib/A-Response/A-Response.entity.js.map +1 -1
- package/dist/node/lib/A-Response/A-Response.entity.mjs +65 -1
- package/dist/node/lib/A-Response/A-Response.entity.mjs.map +1 -1
- package/dist/node/lib/A-Response/A-Response.types.d.mts +1 -1
- package/dist/node/lib/A-Response/A-Response.types.d.ts +1 -1
- package/dist/node/lib/A-Server/A-HttpServer.container.d.mts +1 -1
- package/dist/node/lib/A-Server/A-HttpServer.container.d.ts +1 -1
- package/dist/node/lib/A-Server/A-HttpServer.container.js +3 -1
- package/dist/node/lib/A-Server/A-HttpServer.container.js.map +1 -1
- package/dist/node/lib/A-Server/A-HttpServer.container.mjs +3 -1
- package/dist/node/lib/A-Server/A-HttpServer.container.mjs.map +1 -1
- package/dist/node/lib/A-ServerController/A-ServerController.component.d.mts +1 -1
- package/dist/node/lib/A-ServerController/A-ServerController.component.d.ts +1 -1
- package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.d.mts +1 -1
- package/dist/node/lib/A-ServerLogger/A-ServerLogger.component.d.ts +1 -1
- package/dist/node/lib/A-ServerProxy/A-ServerProxy.component.d.mts +1 -1
- package/dist/node/lib/A-ServerProxy/A-ServerProxy.component.d.ts +1 -1
- package/dist/node/lib/A-ServerRouter/A-ServerRouter.component.d.mts +1 -1
- package/dist/node/lib/A-ServerRouter/A-ServerRouter.component.d.ts +1 -1
- package/dist/node/lib/A-ServerStatic/A-ServerStatic.component.d.mts +1 -1
- package/dist/node/lib/A-ServerStatic/A-ServerStatic.component.d.ts +1 -1
- package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.d.mts +1 -1
- package/dist/node/middlewares/A-ServerCORS/A_ServerCORS.component.d.ts +1 -1
- package/package.json +1 -1
- package/src/lib/A-Response/A-Response.entity.ts +63 -1
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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';
|
package/dist/node/index.d.mts
CHANGED
|
@@ -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-
|
|
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';
|
package/dist/node/index.d.ts
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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":";;;;;;;;;;;;;;;;;;;;AAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA4CO,MAAM,mBAAwCA,iBAAA,CAGnD;AAAA,EA8CE,WAAA,CAAY,QAAgC,OAAA,EAA8B;AACtE,IAAA,KAAA,CAAM,MAAM,CAAA;AAJhB;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,UAAA,uBAAwE,GAAA,EAAI;AAKhF,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,oBAAA,EAAsB,IAAA;AAAA;AAAA,MACtB,aAAA,EAAe,IAAA;AAAA,MACf,kBAAA,EAAoB,IAAA;AAAA;AAAA,MACpB,aAAA,EAAe,IAAA;AAAA,MACf,UAAA,EAAY,IAAA;AAAA,MACZ,kBAAA,EAAoB,IAAA;AAAA,MACpB,OAAA,EAAS,OAAA;AAAA,MACT,kBAAA,EAAoB,kBAAA;AAAA,MACpB,YAAA,EAAc,CAAA;AAAA,MACd,aAAA,EAAe,IAAA;AAAA,MACf,cAAA,EAAgB,IAAA;AAAA,MAChB,GAAI,WAAW;AAAC,KACpB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EA1DA,WAAW,SAAA,GAAoB;AAC3B,IAAA,OAAO,UAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EA6DA,QAAQ,SAAA,EAAyC;AAC7C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAIC,cAAA,CAAM;AAAA,MACnB,OAAA,EAASC,mBAAU,IAAA,CAAK,IAAA;AAAA,MACxB,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,MAAA,EAAS,KAAK,WAAA,CAAkC,MAAA;AAAA,MAChD,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,IAAI,SAAA,CAAU;AAAA,KACjB,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,SAAA,CAAU,QAAA;AACtB,IAAA,IAAA,CAAK,KAAA,uBAAY,GAAA,EAA2B;AAC5C,IAAA,IAAA,CAAK,QAAA,uBAAe,GAAA,EAAmE;AAAA,EAG3F;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAmC;AACnC,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,QAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,WAAA,GAAuB;AACvB,IAAA,OAAO,KAAK,QAAA,CAAS,WAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,UAAA,GAAqB;AACrB,IAAA,OAAO,KAAK,QAAA,CAAS,UAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,gBAAgB,CAAA,IAAe,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,IAAA,GAAsB;AAQxB,IAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,OAAA,EAAS,CAAA,GAAA,KAAO;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,IAAIC,mCAAA,CAAkB;AAAA,QAC5B,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,QAC1C,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN,CAAC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,OAAA,GAAwB;AAE1B,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAClB,MAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,MAAA,IAAA,CAAK,SAAS,kBAAA,EAAmB;AAAA,IACrC;AAEA,IAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,KAAK,GAAA,EAAwC;AAC/C,IAAA,IAAI,GAAA;AACA,MAAAD,kBAAA,CACK,KAAA,CAAM,IAAI,CAAA,CACV,QAAA,CAAS,GAAG,CAAA;AAErB,IAAA,MAAM,IAAA,CAAK,IAAA,CAAKE,sCAAA,CAAmB,OAAO,CAAA;AAE1C,IAAA,MAAM,KAAK,OAAA,EAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,KAAK,IAAA,EAA2B;AAClC,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA;AAEJ,IAAA,IAAI;AACA,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAErB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAKA,sCAAA,CAAmB,MAAM,CAAA;AAAA,IAE7C,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,YAAiBD,mCAAA,GAAoB,KAAA,GAAQ,IAAIA,mCAAA,CAAkB;AAAA,QAC/E,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,+CAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIA,MAAa,OACT,UAAA,EACa;AACb,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA;AAEJ,IAAA,IAAI;AACA,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACpC,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,mBAAA,EAAqB,SAAS,CAAA;AACtD,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,QAAA,IAAIE,QAAA;AAEJ,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAE3B,UAAAA,QAAA,GAAS,IAAIC,eAAA,CAAS;AAAA,YAClB,IAAA,GAAO;AACH,cAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACvB,gBAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,EAAM;AAC/B,gBAAA,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,IAAI,CAAA;AAAA,cAC9E,CAAA,MAAO;AACH,gBAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,cAClB;AAAA,YACJ;AAAA,WACH,CAAA;AAAA,QACL,CAAA,MAAO;AACH,UAAAD,QAAA,GAAS,UAAA;AAAA,QACb;AAEA,QAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,QAAAA,QAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAU;AACzB,UAAA,YAAA,IAAgB,KAAA,CAAM,MAAA;AAAA,QAC1B,CAAC,CAAA;AAED,QAAAA,QAAA,CAAO,EAAA,CAAG,OAAO,OAAO,CAAA;AAExB,QAAAA,QAAA,CAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AAEzB,QAAAE,eAAA,CAASF,QAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,CAAC,KAAA,KAAU;AACvC,UAAA,IAAI,KAAA,EAAO;AACP,YAAA,MAAA,CAAO,KAAK,CAAA;AAAA,UAChB;AAAA,QACJ,CAAC,CAAA;AAAA,MAEL,CAAC,CAAA;AAAA,IACL,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,YAAiBF,mCAAA,GAAoB,KAAA,GAAQ,IAAIA,mCAAA,CAAkB;AAAA,QAC/E,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,+EAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,SACT,GAAA,EACa;AACb,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA;AAEJ,IAAA,IAAI;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,GAAA;AAEpB,MAAA,MAAM,IAAA,CAAK,IAAA,CAAKC,sCAAA,CAAmB,UAAU,CAAA;AAAA,IAEjD,SAAS,KAAA,EAAO;AACZ,MAAA,MAAM,KAAK,IAAA,CAAK,KAAA,YAAiBD,mCAAA,GAAoB,KAAA,GAAQ,IAAIA,mCAAA,CAAkB;AAAA,QAC/E,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,mDAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIO,SAAA,CAAU,YAAoB,OAAA,EAAoE;AACrG,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,OAAO,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,OAAO,IAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,SAAS,UAAA,GAAa,IAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,SAAA,CAAU,KAAa,KAAA,EAAyC;AACnE,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,GAAA,EAAK,KAAK,CAAA;AAClC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,UAAU,GAAA,EAAqD;AAClE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,GAAG,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAIO,aAAa,GAAA,EAAmB;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,aAAa,GAAG,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,SAAA,CACH,IAAA,EACA,KAAA,EACA,OAAA,EACI;AACJ,IAAA,IAAA,CAAK,SAAS,GAAA,CAAI,IAAA,EAAM,EAAE,KAAA,EAAO,SAAS,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,WAAA,CAAY,MAAc,OAAA,EAA0C;AACvE,IAAA,MAAM,YAAA,GAAe;AAAA,MACjB,GAAG,OAAA;AAAA,MACH,OAAA,kBAAS,IAAI,IAAA,CAAK,CAAC,CAAA;AAAA,MACnB,MAAA,EAAQ;AAAA,KACZ;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,IAAA,EAAM,EAAE,OAAO,EAAA,EAAI,OAAA,EAAS,cAAc,CAAA;AAC5D,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,GAAA,CAAI,KAAa,IAAA,EAA2B;AAC/C,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,OAAO,GAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,IAAI,GAAA,EAAwC;AAC/C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAIO,IAAI,GAAA,EAAsB;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAIO,KAAA,GAAc;AACjB,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWU,YAAA,GAA8B;AACpC,IAAA,IAAI;AACA,MAAA,OAAO,IAAA,CAAK,IAAA,CAAKC,sCAAA,CAAmB,QAAQ,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACZ,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAID,mCAAA,CAAkB;AAAA,QACnC,MAAA,EAAQ,GAAA;AAAA,QACR,aAAa,CAAA,uBAAA,EAA0B,KAAA,YAAiBK,gBAAA,GAAU,KAAA,CAAM,UAAU,iDAAiD,CAAA,CAAA;AAAA,QACnI,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIA,MAAgB,WAAA,GAA6B;AACzC,IAAA,IAAI;AAEA,MAAA,MAAM,IAAA,CAAK,IAAA,CAAKJ,sCAAA,CAAmB,OAAO,CAAA;AAAA,IAE9C,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAID,mCAAA,CAAkB;AAAA,QAClC,MAAA,EAAQ,GAAA;AAAA,QACR,WAAA,EAAa,sEAAA;AAAA,QACb,aAAA,EAAe;AAAA,OAClB,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,EAAA,CAAG,OAA+B,QAAA,EAA+B;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAAI,OAA+B,QAAA,EAA+B;AAC9D,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,KAAA,EAA+B;AAChC,IAAA,IAAA,CAAK,WAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,OAAM,QAAA,KAAY;AAClD,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACL;AAAA,EAWA,OAAO,EAAA,GAAAC,sCAAA,CAAmB,MAAM,CAAA,CACU,YACnC,IAAA,EACL;AAEE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,UAAA,EAAW;AAE3D,IAAA,QAAQ,IAAA;AAAM,MACV,MAAK,CAAC,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA;AAC3C,QAAA,IAAA,CAAK,SAAS,SAAA,CAAU,cAAA,EAAgB,6BAA6B,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AAC5F,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAKvC,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,YAAY,CAAC,CAAA;AAC9C,QAAA;AAAA,MAEJ,MAAK,CAAC,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA;AAC3C,QAAA,IAAA,CAAK,SAAS,SAAA,CAAU,cAAA,EAAgB,uBAAuB,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AACtF,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,QAAA,IAAA,CAAK,QAAA,CAAS,IAAI,YAAY,CAAA;AAC9B,QAAA;AAAA,MAEJ;AACI,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,QAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,QAAA,IAAA,CAAK,QAAA,CAAS,IAAI,YAAY,CAAA;AAC9B,QAAA;AAAA;AACR,EACJ;AAAA,EAKA,OAAO,EAAA,GAAAA,sCAAA,CAAmB,UAAU,CAAA,CACM,YACnC,IAAA,EACL;AAEE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AAExB,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,IAAA,CAAK,YAAa,CAAA;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,KAAe,KAAK,UAAA,GAAa,GAAA,IAAO,KAAK,UAAA,GAAa,GAAA,CAAA;AAChE,MAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAEnB,IAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,EACtB;AAAA,EAKA,OAAO,EAAA,GAAAA,sCAAA,CAAmB,OAAO,EACA,KAAA,EACS,OAAA,EACjB,YAClB,IAAA,EACL;AAEE,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,IAAU,GAAA;AACnC,IAAA,IAAA,CAAK,OAAO,UAAU,CAAA;AAEtB,IAAA,MAAM,aAAA,GAAgB;AAAA,MAClB,KAAA,EAAO;AAAA,QACH,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,MAAA,EAAQ,UAAA;AAAA,QACR,WAAA,EAAa,MAAM,WAAA,IAAe;AAAA;AACtC,KACJ;AAEA,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA;AAEvC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASU,yBAAA,GAAkC;AAExC,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,wBAAA,EAA0B,SAAS,CAAA;AAC3D,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,iBAAA,EAAmB,MAAM,CAAA;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,kBAAA,EAAoB,eAAe,CAAA;AAG3D,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,cAAA,EAAgB,IAAA,CAAK,MAAM,EAAE,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAIU,gBAAA,GAAyB;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,iBAAiB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAE9D,IAAA,MAAM,gBAA0B,EAAC;AAEjC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,CAAC,EAAE,KAAA,EAAO,OAAA,IAAW,IAAA,KAAS;AAChD,MAAA,IAAI,eAAe,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,YAAA,IAAgB,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAC9D,QAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,YAAA,IAAgB,CAAA,OAAA,EAAU,QAAQ,IAAI,CAAA,CAAA;AACxD,QAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,YAAA,IAAgB,CAAA,UAAA,EAAa,QAAQ,MAAM,CAAA,CAAA;AAC/D,QAAA,IAAI,QAAQ,OAAA,EAAS,YAAA,IAAgB,aAAa,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA,CAAA;AAC/E,QAAA,IAAI,OAAA,CAAQ,UAAU,YAAA,IAAgB,YAAA;AACtC,QAAA,IAAI,OAAA,CAAQ,QAAQ,YAAA,IAAgB,UAAA;AACpC,QAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,YAAA,IAAgB,CAAA,WAAA,EAAc,QAAQ,QAAQ,CAAA,CAAA;AAAA,MACxE;AAEA,MAAA,aAAA,CAAc,KAAK,YAAY,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,YAAA,EAAc,aAAa,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAIU,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AAEzB,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,YAAA,CAAa,KAAK,QAAQ,CAAA;AACzD,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,cAAA,EAAgB,YAAA,CAAa,KAAK,iBAAiB,CAAA;AAC1E,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,eAAA,EAAiB,YAAA,CAAa,KAAK,kBAAkB,CAAA;AAC5E,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,YAAA,CAAa,KAAK,WAAW,CAAA;AAE/D,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,KAAW,MAAA,EAAW;AACzC,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA,CAAE,CAAA;AAAA,IAC5D;AAEA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,KAAY,MAAA,EAAW;AAC1C,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC9D;AAEA,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,SAAS,SAAA,CAAU,eAAA,EAAiB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,IAAA,CAAK,cAAc,IAAA,EAAM;AACzB,MAAA,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,MAAA,EAAQ,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,IAAA,CAAK,cAAc,YAAA,EAAc;AACjC,MAAA,IAAA,CAAK,SAAS,SAAA,CAAU,eAAA,EAAiB,KAAK,aAAA,CAAc,YAAA,CAAa,aAAa,CAAA;AAAA,IAC1F;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,UAAA,GAA4B;AAC/B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAM,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC5E,MAAA,IAAI,iBAAiBJ,iBAAA,EAAU;AAC3B,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAO;AAAA,MAC5B,CAAA,MAAO;AACH,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,MACf;AACA,MAAA,OAAO,GAAA;AAAA,IACX,CAAA,EAAG,EAAS,CAAA;AAEZ,IAAA,OAAO,QAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAIO,MAAA,GAA+C;AAClD,IAAA,OAAO;AAAA,MACH,GAAG,MAAM,MAAA,EAAO;AAAA,MAChB,QAAQ,IAAA,CAAK,UAAA;AAAA,MACb,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAA,EAAM,KAAK,UAAA,EAAW;AAAA,MACtB,aAAa,IAAA,CAAK;AAAA,KACtB;AAAA,EACJ;AACJ;AArMW,eAAA,CAAA;AAAA,EAHNS,mBAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,qCAASC,qDAA0B,CAAA;AAAA,CAAA,EAhc/B,UAAA,CA+bF,SAAA,EAAA,EAAA,CAAA;AAuCA,eAAA,CAAA;AAAA,EAHND,mBAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,qCAASC,qDAA0B,CAAA;AAAA,CAAA,EAve/B,UAAA,CAseF,SAAA,EAAA,EAAA,CAAA;AAiBA,eAAA,CAAA;AAAA,EAHND,mBAAU,MAAA,CAAO;AAAA,IACd,KAAA,EAAO;AAAA,GACV,CAAA;AAAA,EAEI,qCAASN,mCAAiB,CAAA,CAAA;AAAA,EAC1B,qCAASO,qDAA0B,CAAA,CAAA;AAAA,EACnC,qCAASC,yBAAS,CAAA;AAAA,CAAA,EA1fd,UAAA,CAufF,SAAA,EAAA,EAAA,CAAA","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}"]}
|
|
@@ -14,6 +14,10 @@ class A_Response extends A_Entity {
|
|
|
14
14
|
* Event listeners map for A_Response events
|
|
15
15
|
*/
|
|
16
16
|
this._listeners = /* @__PURE__ */ new Map();
|
|
17
|
+
/**
|
|
18
|
+
* Whether this response is operating as a persistent SSE stream
|
|
19
|
+
*/
|
|
20
|
+
this._isStreaming = false;
|
|
17
21
|
this._options = {
|
|
18
22
|
autoCompress: true,
|
|
19
23
|
compressionThreshold: 1024,
|
|
@@ -83,6 +87,14 @@ class A_Response extends A_Entity {
|
|
|
83
87
|
get size() {
|
|
84
88
|
return this.original.getHeader("Content-Length") || 0;
|
|
85
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Whether this response is in SSE streaming mode.
|
|
92
|
+
* When true the server container will NOT auto-send and destroy() will
|
|
93
|
+
* leave the underlying socket open.
|
|
94
|
+
*/
|
|
95
|
+
get isStreaming() {
|
|
96
|
+
return this._isStreaming;
|
|
97
|
+
}
|
|
86
98
|
// ======================================================================================
|
|
87
99
|
// --------------------------------------------------------------------------
|
|
88
100
|
// A-Response Primary Methods
|
|
@@ -104,7 +116,7 @@ class A_Response extends A_Entity {
|
|
|
104
116
|
* Destroy the response
|
|
105
117
|
*/
|
|
106
118
|
async destroy() {
|
|
107
|
-
if (!this.original.destroyed) {
|
|
119
|
+
if (!this.original.destroyed && !this._isStreaming) {
|
|
108
120
|
this.original.end();
|
|
109
121
|
this._listeners.clear();
|
|
110
122
|
this.original.removeAllListeners();
|
|
@@ -203,6 +215,58 @@ class A_Response extends A_Entity {
|
|
|
203
215
|
}));
|
|
204
216
|
}
|
|
205
217
|
}
|
|
218
|
+
// ======================================================================================
|
|
219
|
+
// --------------------------------------------------------------------------
|
|
220
|
+
// A-Response SSE (Server-Sent Events) Methods
|
|
221
|
+
// --------------------------------------------------------------------------
|
|
222
|
+
// ======================================================================================
|
|
223
|
+
/**
|
|
224
|
+
* Upgrade this response to a persistent SSE stream.
|
|
225
|
+
* Sends the required headers and writes the initial `:ok` comment to flush
|
|
226
|
+
* the connection. After calling this the response will NOT be auto-closed
|
|
227
|
+
* by the server container or by destroy().
|
|
228
|
+
*/
|
|
229
|
+
sseOpen() {
|
|
230
|
+
if (this.headersSent || this._isStreaming) return;
|
|
231
|
+
this._isStreaming = true;
|
|
232
|
+
this.original.writeHead(200, {
|
|
233
|
+
"Content-Type": "text/event-stream",
|
|
234
|
+
"Cache-Control": "no-cache, no-transform",
|
|
235
|
+
"Connection": "keep-alive",
|
|
236
|
+
"X-Accel-Buffering": "no"
|
|
237
|
+
});
|
|
238
|
+
this.original.write(":ok\n\n");
|
|
239
|
+
this.original.once("close", () => {
|
|
240
|
+
this._isStreaming = false;
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Write a named SSE event onto the open stream.
|
|
245
|
+
* Format: `event: <name>\ndata: <JSON>\n\n`
|
|
246
|
+
*
|
|
247
|
+
* Compatible with browser EventSource `addEventListener(name, handler)`.
|
|
248
|
+
*
|
|
249
|
+
* @returns false when the channel is no longer writable
|
|
250
|
+
*/
|
|
251
|
+
sseWrite(event, data) {
|
|
252
|
+
if (!this._isStreaming || this.original.destroyed) return false;
|
|
253
|
+
try {
|
|
254
|
+
return this.original.write(`event: ${event}
|
|
255
|
+
data: ${JSON.stringify(data ?? {})}
|
|
256
|
+
|
|
257
|
+
`);
|
|
258
|
+
} catch {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Close the SSE stream gracefully.
|
|
264
|
+
*/
|
|
265
|
+
sseClose() {
|
|
266
|
+
if (!this._isStreaming || this.original.destroyed) return;
|
|
267
|
+
this._isStreaming = false;
|
|
268
|
+
this.original.end();
|
|
269
|
+
}
|
|
206
270
|
/**
|
|
207
271
|
* Write head with status and headers
|
|
208
272
|
*/
|