@webda/core 4.0.0-beta.5 → 4.0.0-beta.7
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/README.md +6 -5
- package/lib/application/application.d.ts.map +1 -1
- package/lib/application/application.js +18 -6
- package/lib/application/application.js.map +1 -1
- package/lib/application/iconfiguration.d.ts +31 -0
- package/lib/application/iconfiguration.d.ts.map +1 -1
- package/lib/application/iconfiguration.js.map +1 -1
- package/lib/application/unpackedapplication.d.ts.map +1 -1
- package/lib/application/unpackedapplication.js +2 -1
- package/lib/application/unpackedapplication.js.map +1 -1
- package/lib/bin/cli-phase.d.ts +18 -2
- package/lib/bin/cli-phase.d.ts.map +1 -1
- package/lib/bin/cli-phase.js +25 -0
- package/lib/bin/cli-phase.js.map +1 -1
- package/lib/bin/cli.d.ts +19 -0
- package/lib/bin/cli.d.ts.map +1 -1
- package/lib/bin/cli.js +120 -41
- package/lib/bin/cli.js.map +1 -1
- package/lib/configurations/configuration.service.d.ts +7 -0
- package/lib/configurations/configuration.service.d.ts.map +1 -1
- package/lib/configurations/configuration.service.js +18 -5
- package/lib/configurations/configuration.service.js.map +1 -1
- package/lib/configurations/kubernetesconfiguration.service.d.ts.map +1 -1
- package/lib/configurations/kubernetesconfiguration.service.js +1 -4
- package/lib/configurations/kubernetesconfiguration.service.js.map +1 -1
- package/lib/contexts/httpcontext.d.ts +15 -1
- package/lib/contexts/httpcontext.d.ts.map +1 -1
- package/lib/contexts/httpcontext.js +61 -19
- package/lib/contexts/httpcontext.js.map +1 -1
- package/lib/contexts/operationcontext.d.ts +6 -0
- package/lib/contexts/operationcontext.d.ts.map +1 -1
- package/lib/contexts/operationcontext.js +16 -2
- package/lib/contexts/operationcontext.js.map +1 -1
- package/lib/contexts/restcontext.d.ts +110 -0
- package/lib/contexts/restcontext.d.ts.map +1 -0
- package/lib/contexts/restcontext.js +247 -0
- package/lib/contexts/restcontext.js.map +1 -0
- package/lib/contexts/streamingcontext.d.ts +71 -0
- package/lib/contexts/streamingcontext.d.ts.map +1 -0
- package/lib/contexts/streamingcontext.js +93 -0
- package/lib/contexts/streamingcontext.js.map +1 -0
- package/lib/contexts/webcontext.d.ts +20 -0
- package/lib/contexts/webcontext.d.ts.map +1 -1
- package/lib/contexts/webcontext.js +43 -10
- package/lib/contexts/webcontext.js.map +1 -1
- package/lib/contexts/websocketcontext.d.ts +39 -0
- package/lib/contexts/websocketcontext.d.ts.map +1 -0
- package/lib/contexts/websocketcontext.js +67 -0
- package/lib/contexts/websocketcontext.js.map +1 -0
- package/lib/core/asyncqueue.d.ts +50 -0
- package/lib/core/asyncqueue.d.ts.map +1 -0
- package/lib/core/asyncqueue.js +96 -0
- package/lib/core/asyncqueue.js.map +1 -0
- package/lib/core/core.d.ts +21 -2
- package/lib/core/core.d.ts.map +1 -1
- package/lib/core/core.js +87 -24
- package/lib/core/core.js.map +1 -1
- package/lib/core/icore.d.ts +14 -1
- package/lib/core/icore.d.ts.map +1 -1
- package/lib/core/icore.js.map +1 -1
- package/lib/core/instancestorage.d.ts +1 -0
- package/lib/core/instancestorage.d.ts.map +1 -1
- package/lib/core/instancestorage.js +1 -0
- package/lib/core/instancestorage.js.map +1 -1
- package/lib/core/operations.d.ts +49 -6
- package/lib/core/operations.d.ts.map +1 -1
- package/lib/core/operations.js +187 -24
- package/lib/core/operations.js.map +1 -1
- package/lib/deployers/git.d.ts +4 -2
- package/lib/deployers/git.d.ts.map +1 -1
- package/lib/deployers/git.js +44 -5
- package/lib/deployers/git.js.map +1 -1
- package/lib/deployers/packager.d.ts +38 -0
- package/lib/deployers/packager.d.ts.map +1 -1
- package/lib/deployers/packager.js +70 -18
- package/lib/deployers/packager.js.map +1 -1
- package/lib/deployers/packager.service.d.ts +33 -0
- package/lib/deployers/packager.service.d.ts.map +1 -0
- package/lib/deployers/packager.service.js +112 -0
- package/lib/deployers/packager.service.js.map +1 -0
- package/lib/errors/errors.d.ts +15 -0
- package/lib/errors/errors.d.ts.map +1 -1
- package/lib/errors/errors.js +20 -0
- package/lib/errors/errors.js.map +1 -1
- package/lib/index.d.ts +7 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -0
- package/lib/index.js.map +1 -1
- package/lib/models/permissions.d.ts +12 -1
- package/lib/models/permissions.d.ts.map +1 -1
- package/lib/models/permissions.js +29 -2
- package/lib/models/permissions.js.map +1 -1
- package/lib/rest/restoperationstransport.service.d.ts +108 -0
- package/lib/rest/restoperationstransport.service.d.ts.map +1 -1
- package/lib/rest/restoperationstransport.service.js +348 -9
- package/lib/rest/restoperationstransport.service.js.map +1 -1
- package/lib/rest/router.service.d.ts +1 -1
- package/lib/rest/router.service.d.ts.map +1 -1
- package/lib/rest/router.service.js.map +1 -1
- package/lib/services/audit.model.d.ts.map +1 -1
- package/lib/services/audit.model.js +7 -3
- package/lib/services/audit.model.js.map +1 -1
- package/lib/services/authenticatedencryption.d.ts +25 -0
- package/lib/services/authenticatedencryption.d.ts.map +1 -0
- package/lib/services/authenticatedencryption.js +56 -0
- package/lib/services/authenticatedencryption.js.map +1 -0
- package/lib/services/cloudbinary.d.ts.map +1 -1
- package/lib/services/cloudbinary.js +3 -2
- package/lib/services/cloudbinary.js.map +1 -1
- package/lib/services/command.d.ts +7 -1
- package/lib/services/command.d.ts.map +1 -1
- package/lib/services/command.js +4 -0
- package/lib/services/command.js.map +1 -1
- package/lib/services/cryptoservice.service.d.ts +405 -25
- package/lib/services/cryptoservice.service.d.ts.map +1 -1
- package/lib/services/cryptoservice.service.js +779 -72
- package/lib/services/cryptoservice.service.js.map +1 -1
- package/lib/services/httpserver.service.d.ts.map +1 -1
- package/lib/services/httpserver.service.js +15 -9
- package/lib/services/httpserver.service.js.map +1 -1
- package/lib/services/icryptoservice.d.ts +11 -0
- package/lib/services/icryptoservice.d.ts.map +1 -1
- package/lib/services/icryptoservice.js +2 -0
- package/lib/services/icryptoservice.js.map +1 -1
- package/lib/services/mailer.service.d.ts +4 -0
- package/lib/services/mailer.service.d.ts.map +1 -1
- package/lib/services/mailer.service.js +8 -1
- package/lib/services/mailer.service.js.map +1 -1
- package/lib/services/operationstransport.d.ts +13 -0
- package/lib/services/operationstransport.d.ts.map +1 -1
- package/lib/services/operationstransport.js +28 -6
- package/lib/services/operationstransport.js.map +1 -1
- package/lib/services/pki.encrypter.d.ts +214 -0
- package/lib/services/pki.encrypter.d.ts.map +1 -0
- package/lib/services/pki.encrypter.js +350 -0
- package/lib/services/pki.encrypter.js.map +1 -0
- package/lib/services/secretscheck.d.ts +120 -0
- package/lib/services/secretscheck.d.ts.map +1 -0
- package/lib/services/secretscheck.js +322 -0
- package/lib/services/secretscheck.js.map +1 -0
- package/lib/services/servicecommands.d.ts +8 -4
- package/lib/services/servicecommands.d.ts.map +1 -1
- package/lib/services/servicecommands.js +14 -5
- package/lib/services/servicecommands.js.map +1 -1
- package/lib/session/manager.model.d.ts +3 -1
- package/lib/session/manager.model.d.ts.map +1 -1
- package/lib/session/manager.model.js +6 -3
- package/lib/session/manager.model.js.map +1 -1
- package/lib/stores/store.d.ts +20 -1
- package/lib/stores/store.d.ts.map +1 -1
- package/lib/stores/store.js +29 -1
- package/lib/stores/store.js.map +1 -1
- package/lib/test/objects.d.ts.map +1 -1
- package/lib/test/objects.js +3 -1
- package/lib/test/objects.js.map +1 -1
- package/package.json +15 -15
- package/webda.module.json +224 -50
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpcontext.d.ts","sourceRoot":"","sources":["../../src/contexts/httpcontext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"httpcontext.d.ts","sourceRoot":"","sources":["../../src/contexts/httpcontext.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
import { parse as cookieParse } from "cookie";
|
|
2
2
|
import { Readable } from "stream";
|
|
3
|
+
import { HttpError, UnsupportedMediaType } from "../errors/errors.js";
|
|
3
4
|
/**
|
|
4
5
|
* All methods supported by Webda
|
|
5
6
|
*/
|
|
6
7
|
export const HttpMethodTypeAny = ["GET", "OPTIONS", "POST", "PUT", "PATCH", "DELETE"];
|
|
8
|
+
/**
|
|
9
|
+
* Extract the charset parameter from a Content-Type header value
|
|
10
|
+
*
|
|
11
|
+
* The parameter name is matched case-insensitively, surrounding quotes and whitespace are removed
|
|
12
|
+
*
|
|
13
|
+
* @param contentType the Content-Type header value
|
|
14
|
+
* @returns the charset label or undefined if none is present
|
|
15
|
+
*/
|
|
16
|
+
export function getCharset(contentType) {
|
|
17
|
+
const match = contentType?.match(/;\s*charset\s*=\s*("[^"]*"|[^;]*)/i);
|
|
18
|
+
if (!match) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const charset = match[1]
|
|
22
|
+
.trim()
|
|
23
|
+
.replace(/^"(.*)"$/, "$1")
|
|
24
|
+
.trim();
|
|
25
|
+
return charset || undefined;
|
|
26
|
+
}
|
|
7
27
|
/**
|
|
8
28
|
* The HttpContext
|
|
9
29
|
*
|
|
@@ -216,26 +236,28 @@ export class HttpContext {
|
|
|
216
236
|
/**
|
|
217
237
|
* Get the raw body as string
|
|
218
238
|
*
|
|
239
|
+
* Any WHATWG Encoding Standard label is accepted (utf-8, iso-8859-1, shift_jis, gbk, utf-16le, ...)
|
|
240
|
+
* A leading BOM is stripped
|
|
241
|
+
*
|
|
219
242
|
* @param limit the size of readable request
|
|
220
243
|
* @param timeout the time to read the request
|
|
221
|
-
* @param encoding to
|
|
244
|
+
* @param encoding to decode with, default to the Content-Type charset or utf-8
|
|
222
245
|
* @returns the result
|
|
246
|
+
* @throws UnsupportedMediaType if the encoding is not supported
|
|
223
247
|
*/
|
|
224
248
|
async getRawBodyAsString(limit = 1024 * 1024 * 10, timeout = 60000, encoding) {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
encoding = match[1].trim();
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
encoding = "utf-8";
|
|
233
|
-
}
|
|
249
|
+
const label = encoding ?? getCharset(this.getUniqueHeader("content-type")) ?? "utf-8";
|
|
250
|
+
let decoder;
|
|
251
|
+
try {
|
|
252
|
+
decoder = new TextDecoder(label);
|
|
234
253
|
}
|
|
235
|
-
|
|
236
|
-
|
|
254
|
+
catch (err) {
|
|
255
|
+
if (err instanceof RangeError) {
|
|
256
|
+
throw new UnsupportedMediaType(`Unsupported charset '${label}'`);
|
|
257
|
+
}
|
|
258
|
+
throw err;
|
|
237
259
|
}
|
|
238
|
-
return ((await this.getRawBody(limit, timeout))
|
|
260
|
+
return decoder.decode((await this.getRawBody(limit, timeout)) ?? Buffer.alloc(0));
|
|
239
261
|
}
|
|
240
262
|
/**
|
|
241
263
|
* Get request body
|
|
@@ -243,26 +265,46 @@ export class HttpContext {
|
|
|
243
265
|
* @param limit the size of readable request
|
|
244
266
|
* @param timeout the time to read the request
|
|
245
267
|
* @returns the result
|
|
268
|
+
* @throws HttpError 413 if the body is bigger than limit, 408 if it is not read within timeout
|
|
246
269
|
*/
|
|
247
270
|
async getRawBody(limit = 1024 * 1024 * 10, timeout = 60000) {
|
|
248
271
|
if (this.body instanceof Readable) {
|
|
249
272
|
return new Promise((resolve, reject) => {
|
|
250
273
|
const req = this.body;
|
|
251
274
|
const body = [];
|
|
275
|
+
let total = 0;
|
|
276
|
+
let done = false;
|
|
277
|
+
const fail = (err) => {
|
|
278
|
+
done = true;
|
|
279
|
+
clearTimeout(timeoutId);
|
|
280
|
+
req.removeAllListeners("readable");
|
|
281
|
+
req.destroy();
|
|
282
|
+
reject(err);
|
|
283
|
+
};
|
|
252
284
|
const timeoutId = setTimeout(() => {
|
|
253
|
-
|
|
285
|
+
fail(new HttpError("Request timeout", 408));
|
|
254
286
|
}, timeout);
|
|
255
287
|
req.on("readable", () => {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
if (
|
|
259
|
-
|
|
260
|
-
|
|
288
|
+
let chunk;
|
|
289
|
+
while (!done && (chunk = req.read()) !== null) {
|
|
290
|
+
if (total + chunk.length > limit) {
|
|
291
|
+
fail(new HttpError("Request oversized", 413));
|
|
292
|
+
return;
|
|
261
293
|
}
|
|
294
|
+
total += chunk.length;
|
|
262
295
|
body.push(chunk);
|
|
263
296
|
}
|
|
264
297
|
});
|
|
298
|
+
req.on("error", err => {
|
|
299
|
+
if (!done) {
|
|
300
|
+
fail(err);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
265
303
|
req.on("end", () => {
|
|
304
|
+
if (done) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
done = true;
|
|
266
308
|
clearTimeout(timeoutId);
|
|
267
309
|
// Cache body as stream won't be able to be read twice
|
|
268
310
|
this.body = Buffer.concat(body);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpcontext.js","sourceRoot":"","sources":["../../src/contexts/httpcontext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"httpcontext.js","sourceRoot":"","sources":["../../src/contexts/httpcontext.ts"],"names":[],"mappings":"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"}
|
|
@@ -159,6 +159,12 @@ export declare class OperationContext<Input = any, Parameters = any, Output = an
|
|
|
159
159
|
* @returns true if the condition is met
|
|
160
160
|
*/
|
|
161
161
|
write(output: Output, _encoding?: string, _cb?: (error: Error) => void): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Resolves when the client can take more streamed output. callOperation awaits it whenever write() returned
|
|
164
|
+
* false; transports with a real connection override it (backpressure, cancellation).
|
|
165
|
+
* @returns when more output can be written
|
|
166
|
+
*/
|
|
167
|
+
drained(): Promise<void>;
|
|
162
168
|
/**
|
|
163
169
|
* Initialize the operation context
|
|
164
170
|
* @returns this for chaining
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operationcontext.d.ts","sourceRoot":"","sources":["../../src/contexts/operationcontext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,QAAQ,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"operationcontext.d.ts","sourceRoot":"","sources":["../../src/contexts/operationcontext.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ import { NotEnumerable } from "@webda/tsc-esm";
|
|
|
39
39
|
import sanitize from "sanitize-html";
|
|
40
40
|
import { JSONUtils } from "@webda/utils";
|
|
41
41
|
import { useLog } from "../loggers/hooks.js";
|
|
42
|
+
import { HttpError } from "../errors/errors.js";
|
|
42
43
|
import { runAsSystem } from "./execution.js";
|
|
43
44
|
import { useUserResolver } from "../core/hooks.js";
|
|
44
45
|
/**
|
|
@@ -200,10 +201,11 @@ let OperationContext = (() => {
|
|
|
200
201
|
}
|
|
201
202
|
return obj;
|
|
202
203
|
};
|
|
204
|
+
let data;
|
|
203
205
|
try {
|
|
204
206
|
// TODO define this
|
|
205
207
|
const { requestLimit, requestTimeout } = { requestLimit: 10 * 1024 * 1024, requestTimeout: 60000 };
|
|
206
|
-
|
|
208
|
+
data = await this.getRawInputAsString(requestLimit, requestTimeout);
|
|
207
209
|
if (sanitizedOptions.raw === true) {
|
|
208
210
|
return JSON.parse(data || sanitizedOptions.defaultValue);
|
|
209
211
|
}
|
|
@@ -214,7 +216,11 @@ let OperationContext = (() => {
|
|
|
214
216
|
this._sanitized = recursiveSanitize(JSON.parse(data), sanitizedOptions);
|
|
215
217
|
}
|
|
216
218
|
catch (err) {
|
|
217
|
-
|
|
219
|
+
// Unsupported charset, oversized or timed out body are client errors to report
|
|
220
|
+
if (err instanceof HttpError) {
|
|
221
|
+
throw err;
|
|
222
|
+
}
|
|
223
|
+
useLog("ERROR", err, `Body: '${data}'`);
|
|
218
224
|
this._sanitized = sanitizedOptions.defaultValue;
|
|
219
225
|
}
|
|
220
226
|
return this._sanitized;
|
|
@@ -318,6 +324,14 @@ let OperationContext = (() => {
|
|
|
318
324
|
}
|
|
319
325
|
return true;
|
|
320
326
|
}
|
|
327
|
+
/**
|
|
328
|
+
* Resolves when the client can take more streamed output. callOperation awaits it whenever write() returned
|
|
329
|
+
* false; transports with a real connection override it (backpressure, cancellation).
|
|
330
|
+
* @returns when more output can be written
|
|
331
|
+
*/
|
|
332
|
+
async drained() {
|
|
333
|
+
// In-memory output never fills up
|
|
334
|
+
}
|
|
321
335
|
/**
|
|
322
336
|
* Initialize the operation context
|
|
323
337
|
* @returns this for chaining
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operationcontext.js","sourceRoot":"","sources":["../../src/contexts/operationcontext.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"operationcontext.js","sourceRoot":"","sources":["../../src/contexts/operationcontext.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { OutgoingHttpHeaders, ServerResponse } from "node:http";
|
|
2
|
+
import { HttpContext } from "./httpcontext.js";
|
|
3
|
+
import { StreamingOperationContext } from "./streamingcontext.js";
|
|
4
|
+
import type { Session } from "../session/session.js";
|
|
5
|
+
/** How the chunks of a streamed response are framed */
|
|
6
|
+
export type RestStreamFormat = "ndjson" | "sse";
|
|
7
|
+
/**
|
|
8
|
+
* @param response - an HTTP/1.1 or HTTP/2 (compatibility API) response
|
|
9
|
+
* @returns whether it is over or its connection gone
|
|
10
|
+
*/
|
|
11
|
+
export declare function isResponseGone(response: ServerResponse): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* The context of a server-streaming operation served over a plain HTTP request: each streamed chunk is written to the
|
|
14
|
+
* response as soon as the operation yields it, as one JSON line (`ndjson`) or one server-sent event (`sse`).
|
|
15
|
+
*
|
|
16
|
+
* The status line and headers leave with the first chunk (or the first keep-alive): until then an error is still a
|
|
17
|
+
* normal HTTP error response. The context never ends the response by itself, see {@link RestStreamingOperationContext.finish}.
|
|
18
|
+
*/
|
|
19
|
+
export declare class RestStreamingOperationContext extends StreamingOperationContext {
|
|
20
|
+
private readonly response;
|
|
21
|
+
private readonly format;
|
|
22
|
+
private readonly keepAliveInterval;
|
|
23
|
+
private readonly baseHeaders;
|
|
24
|
+
private readonly cookies;
|
|
25
|
+
private started;
|
|
26
|
+
private finished;
|
|
27
|
+
private timer?;
|
|
28
|
+
private beginning?;
|
|
29
|
+
private queued;
|
|
30
|
+
private needDrain;
|
|
31
|
+
private aborted;
|
|
32
|
+
/**
|
|
33
|
+
* @param httpContext - the request
|
|
34
|
+
* @param response - the HTTP response to stream to
|
|
35
|
+
* @param format - how to frame the chunks
|
|
36
|
+
* @param session - the session already loaded for the request, if any
|
|
37
|
+
* @param keepAliveInterval - milliseconds between two SSE keep-alive comments (0 disables them)
|
|
38
|
+
* @param baseHeaders - headers already set for the response (CORS...), sent with the first chunk
|
|
39
|
+
* @param cookies - Set-Cookie values already set for the response
|
|
40
|
+
*/
|
|
41
|
+
constructor(httpContext: HttpContext, response: ServerResponse, format: RestStreamFormat, session?: Session, keepAliveInterval?: number, baseHeaders?: OutgoingHttpHeaders, cookies?: string[]);
|
|
42
|
+
/**
|
|
43
|
+
* The session of an authorized request is reused, not loaded twice
|
|
44
|
+
* @override
|
|
45
|
+
*/
|
|
46
|
+
init(): Promise<this>;
|
|
47
|
+
/**
|
|
48
|
+
* @returns whether the status line and headers were sent
|
|
49
|
+
*/
|
|
50
|
+
get hasStarted(): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* The response is over or its connection destroyed (an HTTP/2 response has no `destroyed`: its stream tells)
|
|
53
|
+
* @override
|
|
54
|
+
*/
|
|
55
|
+
protected get connectionEnded(): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* @returns whether the client is gone or the response is over
|
|
58
|
+
*/
|
|
59
|
+
get disconnected(): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Send the status line and headers, once
|
|
62
|
+
*/
|
|
63
|
+
private start;
|
|
64
|
+
/**
|
|
65
|
+
* The operation failed before the response head was sent: it will never be written, so the caller can answer with a
|
|
66
|
+
* normal HTTP error
|
|
67
|
+
*/
|
|
68
|
+
abortBeforeStart(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Save the session (its cookie leaves with the headers, so changes made until now are kept), send the headers, then
|
|
71
|
+
* what was written meanwhile. Once.
|
|
72
|
+
* @returns a promise resolved when the response head is out
|
|
73
|
+
*/
|
|
74
|
+
begin(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Send an SSE keep-alive comment every interval while the response is open and the operation is streaming. When the
|
|
77
|
+
* operation has not yielded anything yet the first one commits the response as a stream (an error after it is an
|
|
78
|
+
* error event). An operation that is not (yet) streaming, like a plain method awaiting its result, gets none.
|
|
79
|
+
*/
|
|
80
|
+
startKeepAlive(): void;
|
|
81
|
+
/**
|
|
82
|
+
* Stop sending keep-alive comments
|
|
83
|
+
*/
|
|
84
|
+
stopKeepAlive(): void;
|
|
85
|
+
/**
|
|
86
|
+
* One JSON line or server-sent event per chunk, without its `__` keys. The first one waits for the response head
|
|
87
|
+
* (the session is saved first): the operation is asked to wait for `drained()`.
|
|
88
|
+
* @override
|
|
89
|
+
*/
|
|
90
|
+
protected sendChunk(chunk: any): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Wait for the response head, then for the response buffer to empty, or the response to close or fail
|
|
93
|
+
* @override
|
|
94
|
+
*/
|
|
95
|
+
protected waitForDrain(signal: AbortSignal): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Tell the client the stream failed: the last event or line of the response
|
|
98
|
+
* @param message - what the client may know
|
|
99
|
+
* @param code - the HTTP status the error maps to
|
|
100
|
+
* @returns a promise resolved once it is written
|
|
101
|
+
*/
|
|
102
|
+
writeError(message: string, code: number): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* End the response (a normal end is announced to SSE clients with an `end` event)
|
|
105
|
+
* @param normal - whether the stream ended without error
|
|
106
|
+
* @returns a promise resolved once the response is ended
|
|
107
|
+
*/
|
|
108
|
+
finish(normal?: boolean): Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=restcontext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restcontext.d.ts","sourceRoot":"","sources":["../../src/contexts/restcontext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,KAAK,CAAC;AAWhD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAEhE;AAED;;;;;;GAMG;AACH,qBAAa,6BAA8B,SAAQ,yBAAyB;IAoBxE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAxB1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAgB;IAClC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IAExB;;;;;;;;OAQG;IACH,YACE,WAAW,EAAE,WAAW,EACP,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,gBAAgB,EACzC,OAAO,CAAC,EAAE,OAAO,EACA,iBAAiB,GAAE,MAAc,EACjC,WAAW,GAAE,mBAAwB,EACrC,OAAO,GAAE,MAAM,EAAO,EASxC;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;OAGG;IACH,SAAS,KAAK,eAAe,IAAI,OAAO,CAEvC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED;;OAEG;IACH,OAAO,CAAC,KAAK;IAoBb;;;OAGG;IACH,gBAAgB,IAAI,IAAI,CAEvB;IAED;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAYrB;IAED;;;;OAIG;IACH,cAAc,IAAI,IAAI,CAarB;IAED;;OAEG;IACH,aAAa,IAAI,IAAI,CAGpB;IAED;;;;OAIG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAWvC;IAED;;;OAGG;IACH,UAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/D;IAED;;;;;OAKG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7D;IAED;;;;OAIG;IACG,MAAM,CAAC,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAanD;CACF"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { once } from "node:events";
|
|
2
|
+
import { JSONUtils } from "@webda/utils";
|
|
3
|
+
import { StreamingOperationContext } from "./streamingcontext.js";
|
|
4
|
+
/** Headers that only exist in HTTP/1.1: refused by HTTP/2 */
|
|
5
|
+
const HTTP1_ONLY_HEADERS = ["connection", "keep-alive", "transfer-encoding", "upgrade"];
|
|
6
|
+
/** Content type of each format */
|
|
7
|
+
const CONTENT_TYPES = {
|
|
8
|
+
ndjson: "application/x-ndjson",
|
|
9
|
+
sse: "text/event-stream; charset=utf-8"
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* @param response - an HTTP/1.1 or HTTP/2 (compatibility API) response
|
|
13
|
+
* @returns whether it is over or its connection gone
|
|
14
|
+
*/
|
|
15
|
+
export function isResponseGone(response) {
|
|
16
|
+
return response.writableEnded || response.destroyed || response.stream?.destroyed === true;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The context of a server-streaming operation served over a plain HTTP request: each streamed chunk is written to the
|
|
20
|
+
* response as soon as the operation yields it, as one JSON line (`ndjson`) or one server-sent event (`sse`).
|
|
21
|
+
*
|
|
22
|
+
* The status line and headers leave with the first chunk (or the first keep-alive): until then an error is still a
|
|
23
|
+
* normal HTTP error response. The context never ends the response by itself, see {@link RestStreamingOperationContext.finish}.
|
|
24
|
+
*/
|
|
25
|
+
export class RestStreamingOperationContext extends StreamingOperationContext {
|
|
26
|
+
response;
|
|
27
|
+
format;
|
|
28
|
+
keepAliveInterval;
|
|
29
|
+
baseHeaders;
|
|
30
|
+
cookies;
|
|
31
|
+
started = false;
|
|
32
|
+
finished = false;
|
|
33
|
+
timer;
|
|
34
|
+
beginning;
|
|
35
|
+
queued = [];
|
|
36
|
+
needDrain = false;
|
|
37
|
+
aborted = false;
|
|
38
|
+
/**
|
|
39
|
+
* @param httpContext - the request
|
|
40
|
+
* @param response - the HTTP response to stream to
|
|
41
|
+
* @param format - how to frame the chunks
|
|
42
|
+
* @param session - the session already loaded for the request, if any
|
|
43
|
+
* @param keepAliveInterval - milliseconds between two SSE keep-alive comments (0 disables them)
|
|
44
|
+
* @param baseHeaders - headers already set for the response (CORS...), sent with the first chunk
|
|
45
|
+
* @param cookies - Set-Cookie values already set for the response
|
|
46
|
+
*/
|
|
47
|
+
constructor(httpContext, response, format, session, keepAliveInterval = 20000, baseHeaders = {}, cookies = []) {
|
|
48
|
+
super(httpContext, response);
|
|
49
|
+
this.response = response;
|
|
50
|
+
this.format = format;
|
|
51
|
+
this.keepAliveInterval = keepAliveInterval;
|
|
52
|
+
this.baseHeaders = baseHeaders;
|
|
53
|
+
this.cookies = cookies;
|
|
54
|
+
if (session)
|
|
55
|
+
this.session = session;
|
|
56
|
+
response.once("close", () => {
|
|
57
|
+
this.stopKeepAlive();
|
|
58
|
+
// The client left before the end of the stream
|
|
59
|
+
if (!this.finished)
|
|
60
|
+
this.cancel();
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The session of an authorized request is reused, not loaded twice
|
|
65
|
+
* @override
|
|
66
|
+
*/
|
|
67
|
+
async init() {
|
|
68
|
+
return this.session ? this : super.init();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* @returns whether the status line and headers were sent
|
|
72
|
+
*/
|
|
73
|
+
get hasStarted() {
|
|
74
|
+
return this.started;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The response is over or its connection destroyed (an HTTP/2 response has no `destroyed`: its stream tells)
|
|
78
|
+
* @override
|
|
79
|
+
*/
|
|
80
|
+
get connectionEnded() {
|
|
81
|
+
return isResponseGone(this.response);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* @returns whether the client is gone or the response is over
|
|
85
|
+
*/
|
|
86
|
+
get disconnected() {
|
|
87
|
+
return this.connectionEnded;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Send the status line and headers, once
|
|
91
|
+
*/
|
|
92
|
+
start() {
|
|
93
|
+
if (this.started)
|
|
94
|
+
return;
|
|
95
|
+
this.started = true;
|
|
96
|
+
const headers = {};
|
|
97
|
+
for (const [name, value] of Object.entries({ ...this.baseHeaders, ...this.getResponseHeaders() })) {
|
|
98
|
+
// Ours below, whatever the case of the name
|
|
99
|
+
if (["content-type", "cache-control", "content-length"].includes(name.toLowerCase()))
|
|
100
|
+
continue;
|
|
101
|
+
if (this.response.req?.httpVersionMajor >= 2 && HTTP1_ONLY_HEADERS.includes(name.toLowerCase()))
|
|
102
|
+
continue;
|
|
103
|
+
headers[name] = value;
|
|
104
|
+
}
|
|
105
|
+
headers["Content-Type"] = CONTENT_TYPES[this.format];
|
|
106
|
+
headers["Cache-Control"] = "no-cache";
|
|
107
|
+
// Reverse proxies must not buffer a stream
|
|
108
|
+
headers["X-Accel-Buffering"] = "no";
|
|
109
|
+
const cookies = [...this.cookies, ...this.getSetCookieHeaders()];
|
|
110
|
+
if (cookies.length)
|
|
111
|
+
headers["Set-Cookie"] = cookies;
|
|
112
|
+
this.setFlushedHeaders();
|
|
113
|
+
this.response.writeHead(200, headers);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* The operation failed before the response head was sent: it will never be written, so the caller can answer with a
|
|
117
|
+
* normal HTTP error
|
|
118
|
+
*/
|
|
119
|
+
abortBeforeStart() {
|
|
120
|
+
if (!this.started)
|
|
121
|
+
this.aborted = true;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Save the session (its cookie leaves with the headers, so changes made until now are kept), send the headers, then
|
|
125
|
+
* what was written meanwhile. Once.
|
|
126
|
+
* @returns a promise resolved when the response head is out
|
|
127
|
+
*/
|
|
128
|
+
begin() {
|
|
129
|
+
this.beginning ??= (async () => {
|
|
130
|
+
this._sessionSaved = false;
|
|
131
|
+
await this.saveSession();
|
|
132
|
+
// Gone, over, or failed before anything was sent: the head is not ours to write anymore
|
|
133
|
+
if (this.finished || this.aborted || this.connectionEnded)
|
|
134
|
+
return;
|
|
135
|
+
this.start();
|
|
136
|
+
for (const text of this.queued.splice(0)) {
|
|
137
|
+
if (!this.response.write(text))
|
|
138
|
+
this.needDrain = true;
|
|
139
|
+
}
|
|
140
|
+
})();
|
|
141
|
+
return this.beginning;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Send an SSE keep-alive comment every interval while the response is open and the operation is streaming. When the
|
|
145
|
+
* operation has not yielded anything yet the first one commits the response as a stream (an error after it is an
|
|
146
|
+
* error event). An operation that is not (yet) streaming, like a plain method awaiting its result, gets none.
|
|
147
|
+
*/
|
|
148
|
+
startKeepAlive() {
|
|
149
|
+
if (this.format !== "sse" || this.keepAliveInterval <= 0 || this.timer)
|
|
150
|
+
return;
|
|
151
|
+
this.timer = setInterval(() => {
|
|
152
|
+
if (this.finished || this.connectionEnded)
|
|
153
|
+
return;
|
|
154
|
+
if (!this.started && !this.getExtension("operationStreaming"))
|
|
155
|
+
return;
|
|
156
|
+
this.begin().then(() => {
|
|
157
|
+
if (!this.finished && !this.connectionEnded)
|
|
158
|
+
this.response.write(": keep-alive\n\n");
|
|
159
|
+
}, () => undefined);
|
|
160
|
+
}, this.keepAliveInterval);
|
|
161
|
+
this.timer.unref();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Stop sending keep-alive comments
|
|
165
|
+
*/
|
|
166
|
+
stopKeepAlive() {
|
|
167
|
+
if (this.timer)
|
|
168
|
+
clearInterval(this.timer);
|
|
169
|
+
this.timer = undefined;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* One JSON line or server-sent event per chunk, without its `__` keys. The first one waits for the response head
|
|
173
|
+
* (the session is saved first): the operation is asked to wait for `drained()`.
|
|
174
|
+
* @override
|
|
175
|
+
*/
|
|
176
|
+
sendChunk(chunk) {
|
|
177
|
+
const json = JSONUtils.stringify(chunk, undefined, 0, true) ?? "null";
|
|
178
|
+
const text = this.format === "sse" ? `data: ${json}\n\n` : `${json}\n`;
|
|
179
|
+
if (this.started) {
|
|
180
|
+
const flushed = this.response.write(text);
|
|
181
|
+
if (!flushed)
|
|
182
|
+
this.needDrain = true;
|
|
183
|
+
return flushed;
|
|
184
|
+
}
|
|
185
|
+
this.queued.push(text);
|
|
186
|
+
this.begin().catch(() => undefined);
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Wait for the response head, then for the response buffer to empty, or the response to close or fail
|
|
191
|
+
* @override
|
|
192
|
+
*/
|
|
193
|
+
async waitForDrain(signal) {
|
|
194
|
+
await this.beginning;
|
|
195
|
+
// The client left while the head was being prepared: nothing will ever drain
|
|
196
|
+
this.assertAlive();
|
|
197
|
+
if (this.started && !this.needDrain)
|
|
198
|
+
return;
|
|
199
|
+
this.needDrain = false;
|
|
200
|
+
await Promise.race([
|
|
201
|
+
once(this.response, "drain", { signal }),
|
|
202
|
+
once(this.response, "close", { signal }),
|
|
203
|
+
once(this.response, "error", { signal }).then(([error]) => {
|
|
204
|
+
throw error;
|
|
205
|
+
})
|
|
206
|
+
]);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Tell the client the stream failed: the last event or line of the response
|
|
210
|
+
* @param message - what the client may know
|
|
211
|
+
* @param code - the HTTP status the error maps to
|
|
212
|
+
* @returns a promise resolved once it is written
|
|
213
|
+
*/
|
|
214
|
+
async writeError(message, code) {
|
|
215
|
+
if (this.finished || this.connectionEnded)
|
|
216
|
+
return;
|
|
217
|
+
await this.begin();
|
|
218
|
+
if (this.finished || this.connectionEnded)
|
|
219
|
+
return;
|
|
220
|
+
const payload = JSON.stringify({ message, code });
|
|
221
|
+
this.response.write(this.format === "sse" ? `event: error\ndata: ${payload}\n\n` : `{"error":${payload}}\n`);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* End the response (a normal end is announced to SSE clients with an `end` event)
|
|
225
|
+
* @param normal - whether the stream ended without error
|
|
226
|
+
* @returns a promise resolved once the response is ended
|
|
227
|
+
*/
|
|
228
|
+
async finish(normal = false) {
|
|
229
|
+
if (this.finished)
|
|
230
|
+
return;
|
|
231
|
+
this.stopKeepAlive();
|
|
232
|
+
if (this.connectionEnded) {
|
|
233
|
+
this.finished = true;
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
await this.begin();
|
|
237
|
+
if (this.finished)
|
|
238
|
+
return;
|
|
239
|
+
this.finished = true;
|
|
240
|
+
if (this.connectionEnded)
|
|
241
|
+
return;
|
|
242
|
+
if (normal && this.format === "sse")
|
|
243
|
+
this.response.write("event: end\ndata: {}\n\n");
|
|
244
|
+
this.response.end();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=restcontext.js.map
|