@webda/core 4.0.0-beta.6 → 4.0.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +6 -5
  2. package/lib/application/application.d.ts +18 -0
  3. package/lib/application/application.d.ts.map +1 -1
  4. package/lib/application/application.js +49 -11
  5. package/lib/application/application.js.map +1 -1
  6. package/lib/application/iconfiguration.d.ts +31 -0
  7. package/lib/application/iconfiguration.d.ts.map +1 -1
  8. package/lib/application/iconfiguration.js.map +1 -1
  9. package/lib/application/unpackedapplication.d.ts.map +1 -1
  10. package/lib/application/unpackedapplication.js +7 -5
  11. package/lib/application/unpackedapplication.js.map +1 -1
  12. package/lib/bin/cli-phase.d.ts +18 -2
  13. package/lib/bin/cli-phase.d.ts.map +1 -1
  14. package/lib/bin/cli-phase.js +25 -0
  15. package/lib/bin/cli-phase.js.map +1 -1
  16. package/lib/bin/cli.d.ts +8 -0
  17. package/lib/bin/cli.d.ts.map +1 -1
  18. package/lib/bin/cli.js +94 -35
  19. package/lib/bin/cli.js.map +1 -1
  20. package/lib/configurations/configuration.service.d.ts +7 -0
  21. package/lib/configurations/configuration.service.d.ts.map +1 -1
  22. package/lib/configurations/configuration.service.js +18 -5
  23. package/lib/configurations/configuration.service.js.map +1 -1
  24. package/lib/configurations/kubernetesconfiguration.service.d.ts.map +1 -1
  25. package/lib/configurations/kubernetesconfiguration.service.js +1 -4
  26. package/lib/configurations/kubernetesconfiguration.service.js.map +1 -1
  27. package/lib/contexts/httpcontext.d.ts +15 -1
  28. package/lib/contexts/httpcontext.d.ts.map +1 -1
  29. package/lib/contexts/httpcontext.js +61 -19
  30. package/lib/contexts/httpcontext.js.map +1 -1
  31. package/lib/contexts/operationcontext.d.ts +6 -0
  32. package/lib/contexts/operationcontext.d.ts.map +1 -1
  33. package/lib/contexts/operationcontext.js +16 -2
  34. package/lib/contexts/operationcontext.js.map +1 -1
  35. package/lib/contexts/restcontext.d.ts +110 -0
  36. package/lib/contexts/restcontext.d.ts.map +1 -0
  37. package/lib/contexts/restcontext.js +247 -0
  38. package/lib/contexts/restcontext.js.map +1 -0
  39. package/lib/contexts/streamingcontext.d.ts +71 -0
  40. package/lib/contexts/streamingcontext.d.ts.map +1 -0
  41. package/lib/contexts/streamingcontext.js +93 -0
  42. package/lib/contexts/streamingcontext.js.map +1 -0
  43. package/lib/contexts/webcontext.d.ts +20 -0
  44. package/lib/contexts/webcontext.d.ts.map +1 -1
  45. package/lib/contexts/webcontext.js +43 -10
  46. package/lib/contexts/webcontext.js.map +1 -1
  47. package/lib/contexts/websocketcontext.d.ts +39 -0
  48. package/lib/contexts/websocketcontext.d.ts.map +1 -0
  49. package/lib/contexts/websocketcontext.js +67 -0
  50. package/lib/contexts/websocketcontext.js.map +1 -0
  51. package/lib/core/asyncqueue.d.ts +50 -0
  52. package/lib/core/asyncqueue.d.ts.map +1 -0
  53. package/lib/core/asyncqueue.js +96 -0
  54. package/lib/core/asyncqueue.js.map +1 -0
  55. package/lib/core/core.d.ts +18 -0
  56. package/lib/core/core.d.ts.map +1 -1
  57. package/lib/core/core.js +72 -7
  58. package/lib/core/core.js.map +1 -1
  59. package/lib/core/icore.d.ts +14 -1
  60. package/lib/core/icore.d.ts.map +1 -1
  61. package/lib/core/icore.js.map +1 -1
  62. package/lib/core/instancestorage.d.ts +1 -0
  63. package/lib/core/instancestorage.d.ts.map +1 -1
  64. package/lib/core/instancestorage.js +1 -0
  65. package/lib/core/instancestorage.js.map +1 -1
  66. package/lib/core/operations.d.ts +49 -6
  67. package/lib/core/operations.d.ts.map +1 -1
  68. package/lib/core/operations.js +187 -24
  69. package/lib/core/operations.js.map +1 -1
  70. package/lib/deployers/git.d.ts +4 -2
  71. package/lib/deployers/git.d.ts.map +1 -1
  72. package/lib/deployers/git.js +44 -5
  73. package/lib/deployers/git.js.map +1 -1
  74. package/lib/errors/errors.d.ts +15 -0
  75. package/lib/errors/errors.d.ts.map +1 -1
  76. package/lib/errors/errors.js +20 -0
  77. package/lib/errors/errors.js.map +1 -1
  78. package/lib/index.d.ts +5 -0
  79. package/lib/index.d.ts.map +1 -1
  80. package/lib/index.js +5 -0
  81. package/lib/index.js.map +1 -1
  82. package/lib/rest/restoperationstransport.service.d.ts +108 -0
  83. package/lib/rest/restoperationstransport.service.d.ts.map +1 -1
  84. package/lib/rest/restoperationstransport.service.js +360 -10
  85. package/lib/rest/restoperationstransport.service.js.map +1 -1
  86. package/lib/rest/router.service.d.ts +1 -1
  87. package/lib/rest/router.service.d.ts.map +1 -1
  88. package/lib/rest/router.service.js +5 -2
  89. package/lib/rest/router.service.js.map +1 -1
  90. package/lib/services/authenticatedencryption.d.ts +25 -0
  91. package/lib/services/authenticatedencryption.d.ts.map +1 -0
  92. package/lib/services/authenticatedencryption.js +56 -0
  93. package/lib/services/authenticatedencryption.js.map +1 -0
  94. package/lib/services/binary.service.d.ts +1 -1
  95. package/lib/services/binary.service.d.ts.map +1 -1
  96. package/lib/services/binary.service.js.map +1 -1
  97. package/lib/services/cloudbinary.d.ts.map +1 -1
  98. package/lib/services/cloudbinary.js +3 -2
  99. package/lib/services/cloudbinary.js.map +1 -1
  100. package/lib/services/command.d.ts +7 -1
  101. package/lib/services/command.d.ts.map +1 -1
  102. package/lib/services/command.js +4 -0
  103. package/lib/services/command.js.map +1 -1
  104. package/lib/services/cryptoservice.service.d.ts +405 -25
  105. package/lib/services/cryptoservice.service.d.ts.map +1 -1
  106. package/lib/services/cryptoservice.service.js +779 -72
  107. package/lib/services/cryptoservice.service.js.map +1 -1
  108. package/lib/services/httpserver.service.d.ts.map +1 -1
  109. package/lib/services/httpserver.service.js +20 -9
  110. package/lib/services/httpserver.service.js.map +1 -1
  111. package/lib/services/icryptoservice.d.ts +11 -0
  112. package/lib/services/icryptoservice.d.ts.map +1 -1
  113. package/lib/services/icryptoservice.js +2 -0
  114. package/lib/services/icryptoservice.js.map +1 -1
  115. package/lib/services/mailer.service.d.ts +4 -0
  116. package/lib/services/mailer.service.d.ts.map +1 -1
  117. package/lib/services/mailer.service.js +7 -1
  118. package/lib/services/mailer.service.js.map +1 -1
  119. package/lib/services/operationstransport.d.ts +13 -0
  120. package/lib/services/operationstransport.d.ts.map +1 -1
  121. package/lib/services/operationstransport.js +28 -6
  122. package/lib/services/operationstransport.js.map +1 -1
  123. package/lib/services/pki.encrypter.d.ts +214 -0
  124. package/lib/services/pki.encrypter.d.ts.map +1 -0
  125. package/lib/services/pki.encrypter.js +350 -0
  126. package/lib/services/pki.encrypter.js.map +1 -0
  127. package/lib/services/secretscheck.d.ts +120 -0
  128. package/lib/services/secretscheck.d.ts.map +1 -0
  129. package/lib/services/secretscheck.js +322 -0
  130. package/lib/services/secretscheck.js.map +1 -0
  131. package/lib/services/servicecommands.d.ts +8 -4
  132. package/lib/services/servicecommands.d.ts.map +1 -1
  133. package/lib/services/servicecommands.js +14 -5
  134. package/lib/services/servicecommands.js.map +1 -1
  135. package/lib/session/manager.model.d.ts +3 -1
  136. package/lib/session/manager.model.d.ts.map +1 -1
  137. package/lib/session/manager.model.js +6 -3
  138. package/lib/session/manager.model.js.map +1 -1
  139. package/lib/test/objects.d.ts.map +1 -1
  140. package/lib/test/objects.js +3 -1
  141. package/lib/test/objects.js.map +1 -1
  142. package/package.json +12 -11
  143. package/webda.module.json +135 -41
@@ -0,0 +1,71 @@
1
+ import { WebContext } from "./webcontext.js";
2
+ /**
3
+ * A value as clients may see it: plain JSON without `__` keys
4
+ * @param value - an operation result or streamed chunk
5
+ * @returns the copy (undefined stays undefined), or null when the value is not JSON-serializable (function, symbol)
6
+ */
7
+ export declare function toPublicChunk(value: unknown): unknown;
8
+ /**
9
+ * The shared part of a context serving a streaming operation over a transport (gRPC, WebSocket, GraphQL
10
+ * subscription, ...):
11
+ *
12
+ * - a non-streamed result is buffered as usual (`writeResult()`)
13
+ * - a streamed chunk is sent right away (`sendChunk()`), `write()` returning false under backpressure
14
+ * - `drained()` waits for the transport (`waitForDrain()`) without leaving listeners behind: the signal it gets is
15
+ * aborted once the wait is over
16
+ * - once cancelled (the client went away) or once the connection is over (`connectionEnded`), `write()` and
17
+ * `drained()` throw `OperationCancelledError`
18
+ *
19
+ * The transport calls `cancel()` when the client leaves, and also ends the operation's input queue so its pending read
20
+ * returns and its `finally` blocks run.
21
+ */
22
+ export declare abstract class StreamingOperationContext extends WebContext {
23
+ private cancelled;
24
+ /**
25
+ * @returns whether the client went away
26
+ */
27
+ get isCancelled(): boolean;
28
+ /** The client went away: the next write or drain throws. */
29
+ cancel(): void;
30
+ /**
31
+ * @returns true when nothing can be sent anymore although the context was not cancelled (response or socket over)
32
+ */
33
+ protected abstract get connectionEnded(): boolean;
34
+ /**
35
+ * Send one streamed chunk now
36
+ * @param chunk - what the operation wrote
37
+ * @returns false when the transport asks the operation to wait for `drained()`
38
+ */
39
+ protected abstract sendChunk(chunk: any): boolean;
40
+ /**
41
+ * Wait until the transport can take more output
42
+ * @param signal - aborted once the wait is over: listeners registered with it are removed
43
+ * @throws any error when the transport failed or closed (reported as `OperationCancelledError`)
44
+ */
45
+ protected abstract waitForDrain(signal: AbortSignal): Promise<void>;
46
+ /**
47
+ * Keep a non-streamed result
48
+ * @param output - the result
49
+ * @param encoding - the encoding to use
50
+ * @param cb - the callback function
51
+ * @returns true
52
+ */
53
+ protected writeResult(output: any, encoding?: string, cb?: (error: Error) => void): boolean;
54
+ /**
55
+ * @throws OperationCancelledError when the client went away or the connection is over
56
+ */
57
+ protected assertAlive(): void;
58
+ /**
59
+ * Streamed chunks go out immediately; a non-streamed result is buffered
60
+ * @override
61
+ * @throws OperationCancelledError when streaming and the client went away or the connection is over
62
+ */
63
+ write(output: any, encoding?: string, cb?: (error: Error) => void): boolean;
64
+ /**
65
+ * Wait for the transport to take more output, without leaving listeners behind
66
+ * @override
67
+ * @throws OperationCancelledError when the client went away, the connection is over or the transport failed
68
+ */
69
+ drained(): Promise<void>;
70
+ }
71
+ //# sourceMappingURL=streamingcontext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamingcontext.d.ts","sourceRoot":"","sources":["../../src/contexts/streamingcontext.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIrD;AAED;;;;;;;;;;;;;GAaG;AACH,8BAAsB,yBAA0B,SAAQ,UAAU;IAChE,OAAO,CAAC,SAAS,CAAS;IAE1B;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,4DAA4D;IAC5D,MAAM,IAAI,IAAI,CAEb;IAED;;OAEG;IACH,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,OAAO,CAAC;IAElD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC;IAElD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;;;;OAMG;IACH,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAE1F;IAED;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI,CAI5B;IAED;;;;OAIG;IAEI,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAIjF;IAED;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAY7B;CACF"}
@@ -0,0 +1,93 @@
1
+ import { JSONUtils } from "@webda/utils";
2
+ import { WebContext } from "./webcontext.js";
3
+ import * as WebdaError from "../errors/errors.js";
4
+ /**
5
+ * A value as clients may see it: plain JSON without `__` keys
6
+ * @param value - an operation result or streamed chunk
7
+ * @returns the copy (undefined stays undefined), or null when the value is not JSON-serializable (function, symbol)
8
+ */
9
+ export function toPublicChunk(value) {
10
+ if (value === undefined)
11
+ return undefined;
12
+ const json = JSONUtils.stringify(value, undefined, 0, true);
13
+ return json === undefined ? null : JSON.parse(json);
14
+ }
15
+ /**
16
+ * The shared part of a context serving a streaming operation over a transport (gRPC, WebSocket, GraphQL
17
+ * subscription, ...):
18
+ *
19
+ * - a non-streamed result is buffered as usual (`writeResult()`)
20
+ * - a streamed chunk is sent right away (`sendChunk()`), `write()` returning false under backpressure
21
+ * - `drained()` waits for the transport (`waitForDrain()`) without leaving listeners behind: the signal it gets is
22
+ * aborted once the wait is over
23
+ * - once cancelled (the client went away) or once the connection is over (`connectionEnded`), `write()` and
24
+ * `drained()` throw `OperationCancelledError`
25
+ *
26
+ * The transport calls `cancel()` when the client leaves, and also ends the operation's input queue so its pending read
27
+ * returns and its `finally` blocks run.
28
+ */
29
+ export class StreamingOperationContext extends WebContext {
30
+ cancelled = false;
31
+ /**
32
+ * @returns whether the client went away
33
+ */
34
+ get isCancelled() {
35
+ return this.cancelled;
36
+ }
37
+ /** The client went away: the next write or drain throws. */
38
+ cancel() {
39
+ this.cancelled = true;
40
+ }
41
+ /**
42
+ * Keep a non-streamed result
43
+ * @param output - the result
44
+ * @param encoding - the encoding to use
45
+ * @param cb - the callback function
46
+ * @returns true
47
+ */
48
+ writeResult(output, encoding, cb) {
49
+ return super.write(output, encoding, cb);
50
+ }
51
+ /**
52
+ * @throws OperationCancelledError when the client went away or the connection is over
53
+ */
54
+ assertAlive() {
55
+ if (this.cancelled || this.connectionEnded) {
56
+ throw new WebdaError.OperationCancelledError();
57
+ }
58
+ }
59
+ /**
60
+ * Streamed chunks go out immediately; a non-streamed result is buffered
61
+ * @override
62
+ * @throws OperationCancelledError when streaming and the client went away or the connection is over
63
+ */
64
+ // @ts-ignore same signature as WebContext.write
65
+ write(output, encoding, cb) {
66
+ if (!this.getExtension("operationStreaming"))
67
+ return this.writeResult(output, encoding, cb);
68
+ this.assertAlive();
69
+ return this.sendChunk(output);
70
+ }
71
+ /**
72
+ * Wait for the transport to take more output, without leaving listeners behind
73
+ * @override
74
+ * @throws OperationCancelledError when the client went away, the connection is over or the transport failed
75
+ */
76
+ async drained() {
77
+ this.assertAlive();
78
+ const controller = new AbortController();
79
+ try {
80
+ await this.waitForDrain(controller.signal);
81
+ }
82
+ catch (err) {
83
+ if (err instanceof WebdaError.OperationCancelledError)
84
+ throw err;
85
+ throw new WebdaError.OperationCancelledError();
86
+ }
87
+ finally {
88
+ controller.abort();
89
+ }
90
+ this.assertAlive();
91
+ }
92
+ }
93
+ //# sourceMappingURL=streamingcontext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamingcontext.js","sourceRoot":"","sources":["../../src/contexts/streamingcontext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AAElD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5D,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAgB,yBAA0B,SAAQ,UAAU;IACxD,SAAS,GAAG,KAAK,CAAC;IAE1B;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,4DAA4D;IAC5D,MAAM;QACJ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAqBD;;;;;;OAMG;IACO,WAAW,CAAC,MAAW,EAAE,QAAiB,EAAE,EAA2B;QAC/E,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACO,WAAW;QACnB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,MAAM,IAAI,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,gDAAgD;IACzC,KAAK,CAAC,MAAW,EAAE,QAAiB,EAAE,EAA2B;QACtE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,UAAU,CAAC,uBAAuB;gBAAE,MAAM,GAAG,CAAC;YACjE,MAAM,IAAI,UAAU,CAAC,uBAAuB,EAAE,CAAC;QACjD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -35,6 +35,10 @@ export declare class WebContext<T = any, P = any, U = any> extends OperationCont
35
35
  headers: Map<string, string>;
36
36
  _route: any;
37
37
  _ended: Promise<any>;
38
+ /**
39
+ * Whether the session was already saved
40
+ */
41
+ protected _sessionSaved: boolean;
38
42
  /**
39
43
  * If headers were flushed
40
44
  */
@@ -51,6 +55,11 @@ export declare class WebContext<T = any, P = any, U = any> extends OperationCont
51
55
  */
52
56
  getHttpContext(): HttpContext;
53
57
  /**
58
+ * Get the raw input as string
59
+ *
60
+ * Any WHATWG Encoding Standard label is accepted as encoding (utf-8, iso-8859-1, shift_jis, ...)
61
+ * If no encoding is given, the charset of the Content-Type header is used, falling back to UTF-8
62
+ *
54
63
  * @override
55
64
  */
56
65
  getRawInputAsString(limit?: number, timeout?: number, encoding?: string): Promise<string>;
@@ -114,6 +123,11 @@ export declare class WebContext<T = any, P = any, U = any> extends OperationCont
114
123
  * @returns the result map
115
124
  */
116
125
  getResponseCookies(): Map<string, Cookie>;
126
+ /**
127
+ * The Set-Cookie header values of the response, one per cookie
128
+ * @returns the serialized cookies
129
+ */
130
+ getSetCookieHeaders(): string[];
117
131
  /**
118
132
  * Whether the response has been ended
119
133
  * @returns the result
@@ -142,6 +156,12 @@ export declare class WebContext<T = any, P = any, U = any> extends OperationCont
142
156
  * @returns the result
143
157
  */
144
158
  getResponseSize(): number | undefined;
159
+ /**
160
+ * Save the session through the SessionManager, once
161
+ *
162
+ * The SessionManager writes the session cookie: call it before the headers are flushed
163
+ */
164
+ saveSession(): Promise<void>;
145
165
  /**
146
166
  * Flush the request
147
167
  *
@@ -1 +1 @@
1
- {"version":3,"file":"webcontext.d.ts","sourceRoot":"","sources":["../../src/contexts/webcontext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webcontext.d.ts","sourceRoot":"","sources":["../../src/contexts/webcontext.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { OperationContext } from "./operationcontext.js";
2
2
  import acceptLanguage from "accept-language";
3
3
  import { Readable } from "node:stream";
4
4
  import { WritableStreamBuffer } from "stream-buffers";
5
+ import { serialize as cookieSerialize } from "cookie";
5
6
  import { useCore, useDynamicService, useService } from "../core/hooks.js";
6
7
  /**
7
8
  * @category CoreFeatures
@@ -36,6 +37,10 @@ export class WebContext extends OperationContext {
36
37
  headers;
37
38
  _route;
38
39
  _ended = undefined;
40
+ /**
41
+ * Whether the session was already saved
42
+ */
43
+ _sessionSaved = false;
39
44
  /**
40
45
  * If headers were flushed
41
46
  */
@@ -57,6 +62,11 @@ export class WebContext extends OperationContext {
57
62
  return this.getExtension("http");
58
63
  }
59
64
  /**
65
+ * Get the raw input as string
66
+ *
67
+ * Any WHATWG Encoding Standard label is accepted as encoding (utf-8, iso-8859-1, shift_jis, ...)
68
+ * If no encoding is given, the charset of the Content-Type header is used, falling back to UTF-8
69
+ *
60
70
  * @override
61
71
  */
62
72
  async getRawInputAsString(limit = 1024 * 1024 * 10, timeout = 60000, encoding) {
@@ -163,6 +173,13 @@ export class WebContext extends OperationContext {
163
173
  getResponseCookies() {
164
174
  return this._cookie;
165
175
  }
176
+ /**
177
+ * The Set-Cookie header values of the response, one per cookie
178
+ * @returns the serialized cookies
179
+ */
180
+ getSetCookieHeaders() {
181
+ return Object.values(this._cookie ?? {}).map((c) => cookieSerialize(c.name, c.value, c.options));
182
+ }
166
183
  /**
167
184
  * Whether the response has been ended
168
185
  * @returns the result
@@ -201,6 +218,25 @@ export class WebContext extends OperationContext {
201
218
  getResponseSize() {
202
219
  return this._body ? Buffer.byteLength(this._body, "utf8") : undefined;
203
220
  }
221
+ /**
222
+ * Save the session through the SessionManager, once
223
+ *
224
+ * The SessionManager writes the session cookie: call it before the headers are flushed
225
+ */
226
+ async saveSession() {
227
+ if (this._sessionSaved || !this.getExtension("http") || !this.session) {
228
+ return;
229
+ }
230
+ this._sessionSaved = true;
231
+ try {
232
+ const sm = useDynamicService("SessionManager");
233
+ if (sm)
234
+ await sm.save(this, this.session);
235
+ }
236
+ catch {
237
+ // SessionManager may not be available
238
+ }
239
+ }
204
240
  /**
205
241
  * Flush the request
206
242
  *
@@ -214,16 +250,7 @@ export class WebContext extends OperationContext {
214
250
  return this._ended;
215
251
  }
216
252
  this._ended = (async () => {
217
- if (this.getExtension("http") && this.session) {
218
- try {
219
- const sm = useDynamicService("SessionManager");
220
- if (sm)
221
- await sm.save(this, this.session);
222
- }
223
- catch {
224
- // SessionManager may not be available
225
- }
226
- }
253
+ await this.saveSession();
227
254
  await super.end();
228
255
  if (this._stream instanceof WritableStreamBuffer && this._stream.size()) {
229
256
  this._body = this._stream.getContents().toString();
@@ -340,7 +367,13 @@ export class WebContext extends OperationContext {
340
367
  async flushHeaders() {
341
368
  if (this.flushed)
342
369
  return;
370
+ // The SessionManager writes the session cookie: save the session before the headers leave
371
+ await this.saveSession();
343
372
  const headers = this.getResponseHeaders();
373
+ const setCookies = this.getSetCookieHeaders();
374
+ if (setCookies.length) {
375
+ headers["Set-Cookie"] = setCookies;
376
+ }
344
377
  await super.flushHeaders();
345
378
  // Write to ServerResponse if the stream supports writeHead (not a WritableStreamBuffer)
346
379
  if (this._stream && !(this._stream instanceof WritableStreamBuffer) && typeof this._stream.writeHead === "function") {
@@ -1 +1 @@
1
- {"version":3,"file":"webcontext.js","sourceRoot":"","sources":["../../src/contexts/webcontext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webcontext.js","sourceRoot":"","sources":["../../src/contexts/webcontext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { WebSocket } from "ws";
2
+ import { HttpContext } from "./httpcontext.js";
3
+ import { StreamingOperationContext } from "./streamingcontext.js";
4
+ import type { Session } from "../session/session.js";
5
+ /**
6
+ * The context of a bidirectional operation served over a WebSocket: the upgrade request's headers and session,
7
+ * each streamed chunk sent as one JSON text message.
8
+ */
9
+ export declare class WebSocketOperationContext extends StreamingOperationContext {
10
+ private readonly socket;
11
+ private lastSend;
12
+ /**
13
+ * @param httpContext - the upgrade request
14
+ * @param socket - the accepted socket
15
+ * @param session - the session already loaded for the upgrade request, if any
16
+ */
17
+ constructor(httpContext: HttpContext, socket: WebSocket, session?: Session);
18
+ /**
19
+ * The session of an authorized upgrade is reused, not loaded twice
20
+ * @override
21
+ */
22
+ init(): Promise<this>;
23
+ /**
24
+ * The socket is closing or closed
25
+ * @override
26
+ */
27
+ protected get connectionEnded(): boolean;
28
+ /**
29
+ * One JSON text message per chunk
30
+ * @override
31
+ */
32
+ protected sendChunk(chunk: any): boolean;
33
+ /**
34
+ * Wait for the last message to be flushed, or the socket to close
35
+ * @override
36
+ */
37
+ protected waitForDrain(signal: AbortSignal): Promise<void>;
38
+ }
39
+ //# sourceMappingURL=websocketcontext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocketcontext.d.ts","sourceRoot":"","sources":["../../src/contexts/websocketcontext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,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;AASrD;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,yBAAyB;IAUpE,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,QAAQ,CAAoC;IAEpD;;;;OAIG;IACH,YACE,WAAW,EAAE,WAAW,EACP,MAAM,EAAE,SAAS,EAClC,OAAO,CAAC,EAAE,OAAO,EAIlB;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;IAED;;;OAGG;IACH,SAAS,KAAK,eAAe,IAAI,OAAO,CAEvC;IAED;;;OAGG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAQvC;IAED;;;OAGG;IACH,UAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/D;CACF"}
@@ -0,0 +1,67 @@
1
+ import { once } from "node:events";
2
+ import { JSONUtils } from "@webda/utils";
3
+ import { StreamingOperationContext } from "./streamingcontext.js";
4
+ import * as WebdaError from "../errors/errors.js";
5
+ /** Pending output (bytes) above which write() asks the operation to wait. */
6
+ const HIGH_WATER = 1024 * 1024;
7
+ /** WebSocket readyState values after which nothing can be sent (CLOSING, CLOSED) */
8
+ const CLOSING = 2;
9
+ /**
10
+ * The context of a bidirectional operation served over a WebSocket: the upgrade request's headers and session,
11
+ * each streamed chunk sent as one JSON text message.
12
+ */
13
+ export class WebSocketOperationContext extends StreamingOperationContext {
14
+ socket;
15
+ lastSend = Promise.resolve();
16
+ /**
17
+ * @param httpContext - the upgrade request
18
+ * @param socket - the accepted socket
19
+ * @param session - the session already loaded for the upgrade request, if any
20
+ */
21
+ constructor(httpContext, socket, session) {
22
+ super(httpContext);
23
+ this.socket = socket;
24
+ if (session)
25
+ this.session = session;
26
+ }
27
+ /**
28
+ * The session of an authorized upgrade is reused, not loaded twice
29
+ * @override
30
+ */
31
+ async init() {
32
+ return this.session ? this : super.init();
33
+ }
34
+ /**
35
+ * The socket is closing or closed
36
+ * @override
37
+ */
38
+ get connectionEnded() {
39
+ return this.socket.readyState >= CLOSING;
40
+ }
41
+ /**
42
+ * One JSON text message per chunk
43
+ * @override
44
+ */
45
+ sendChunk(chunk) {
46
+ const text = JSONUtils.stringify(chunk, undefined, 0, true);
47
+ const sent = new Promise((resolve, reject) => this.socket.send(text, err => (err ? reject(err) : resolve())));
48
+ sent.catch(() => {
49
+ // reported through drained()
50
+ });
51
+ this.lastSend = sent;
52
+ return this.socket.bufferedAmount < HIGH_WATER;
53
+ }
54
+ /**
55
+ * Wait for the last message to be flushed, or the socket to close
56
+ * @override
57
+ */
58
+ async waitForDrain(signal) {
59
+ await Promise.race([
60
+ this.lastSend,
61
+ once(this.socket, "close", { signal }).then(() => {
62
+ throw new WebdaError.OperationCancelledError();
63
+ })
64
+ ]);
65
+ }
66
+ }
67
+ //# sourceMappingURL=websocketcontext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocketcontext.js","sourceRoot":"","sources":["../../src/contexts/websocketcontext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,UAAU,MAAM,qBAAqB,CAAC;AAElD,6EAA6E;AAC7E,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/B,oFAAoF;AACpF,MAAM,OAAO,GAAG,CAAC,CAAC;AAElB;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,yBAAyB;IAUnD,MAAM;IATjB,QAAQ,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEpD;;;;OAIG;IACH,YACE,WAAwB,EACP,MAAiB,EAClC,OAAiB;QAEjB,KAAK,CAAC,WAAW,CAAC,CAAC;sBAHF,MAAM;QAIvB,IAAI,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,IAAc,eAAe;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACO,SAAS,CAAC,KAAU;QAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACpH,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACd,6BAA6B;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC;IACjD,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,YAAY,CAAC,MAAmB;QAC9C,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,IAAI,CAAC,QAAQ;YACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC/C,MAAM,IAAI,UAAU,CAAC,uBAAuB,EAAE,CAAC;YACjD,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * A push-based async iterable: producers push, one consumer iterates. `end()` (or the consumer leaving the loop)
3
+ * finishes it; items pushed after the end are dropped.
4
+ */
5
+ export declare class AsyncQueue<T> implements AsyncIterable<T> {
6
+ private items;
7
+ private waiters;
8
+ private done;
9
+ private sizes;
10
+ private bytes;
11
+ private readonly size?;
12
+ /**
13
+ * @param options - optional settings
14
+ * @param options.size - measures an item in bytes, to track `pendingBytes`
15
+ */
16
+ constructor(options?: {
17
+ size?: (item: T) => number;
18
+ });
19
+ /**
20
+ * @returns whether the queue is finished
21
+ */
22
+ get ended(): boolean;
23
+ /**
24
+ * @param item - the next item
25
+ * @param size - its size in bytes (defaults to the size function's result)
26
+ */
27
+ push(item: T, size?: number): void;
28
+ /**
29
+ * @returns the size of the items pushed and not yet consumed (0 when no size is given)
30
+ */
31
+ get pendingBytes(): number;
32
+ /**
33
+ * @returns the number of items pushed and not yet consumed
34
+ */
35
+ get pending(): number;
36
+ /**
37
+ * No more items.
38
+ * @param discard - also drop the items not consumed yet
39
+ */
40
+ end(discard?: boolean): void;
41
+ /**
42
+ * @returns the next item, without ending the queue (unlike breaking out of a for await)
43
+ */
44
+ next(): Promise<IteratorResult<T>>;
45
+ /**
46
+ * @returns the iterator
47
+ */
48
+ [Symbol.asyncIterator](): AsyncIterator<T>;
49
+ }
50
+ //# sourceMappingURL=asyncqueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncqueue.d.ts","sourceRoot":"","sources":["../../src/core/asyncqueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAsB;IAE5C;;;OAGG;IACH,YAAY,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;KAAO,EAEvD;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED;;;OAGG;IACH,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAUjC;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;OAGG;IACH,GAAG,CAAC,OAAO,GAAE,OAAe,GAAG,IAAI,CASlC;IAED;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAQjC;IAED;;OAEG;IACH,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAQzC;CACF"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * A push-based async iterable: producers push, one consumer iterates. `end()` (or the consumer leaving the loop)
3
+ * finishes it; items pushed after the end are dropped.
4
+ */
5
+ export class AsyncQueue {
6
+ items = [];
7
+ waiters = [];
8
+ done = false;
9
+ sizes = [];
10
+ bytes = 0;
11
+ size;
12
+ /**
13
+ * @param options - optional settings
14
+ * @param options.size - measures an item in bytes, to track `pendingBytes`
15
+ */
16
+ constructor(options = {}) {
17
+ this.size = options.size;
18
+ }
19
+ /**
20
+ * @returns whether the queue is finished
21
+ */
22
+ get ended() {
23
+ return this.done;
24
+ }
25
+ /**
26
+ * @param item - the next item
27
+ * @param size - its size in bytes (defaults to the size function's result)
28
+ */
29
+ push(item, size) {
30
+ if (this.done)
31
+ return;
32
+ const waiter = this.waiters.shift();
33
+ if (waiter)
34
+ waiter({ value: item, done: false });
35
+ else {
36
+ const bytes = size ?? this.size?.(item) ?? 0;
37
+ this.items.push(item);
38
+ this.sizes.push(bytes);
39
+ this.bytes += bytes;
40
+ }
41
+ }
42
+ /**
43
+ * @returns the size of the items pushed and not yet consumed (0 when no size is given)
44
+ */
45
+ get pendingBytes() {
46
+ return this.bytes;
47
+ }
48
+ /**
49
+ * @returns the number of items pushed and not yet consumed
50
+ */
51
+ get pending() {
52
+ return this.items.length;
53
+ }
54
+ /**
55
+ * No more items.
56
+ * @param discard - also drop the items not consumed yet
57
+ */
58
+ end(discard = false) {
59
+ if (discard) {
60
+ this.items.length = 0;
61
+ this.sizes.length = 0;
62
+ this.bytes = 0;
63
+ }
64
+ if (this.done)
65
+ return;
66
+ this.done = true;
67
+ for (const waiter of this.waiters.splice(0))
68
+ waiter({ value: undefined, done: true });
69
+ }
70
+ /**
71
+ * @returns the next item, without ending the queue (unlike breaking out of a for await)
72
+ */
73
+ next() {
74
+ if (this.items.length > 0) {
75
+ const value = this.items.shift();
76
+ this.bytes -= this.sizes.shift();
77
+ return Promise.resolve({ value, done: false });
78
+ }
79
+ if (this.done)
80
+ return Promise.resolve({ value: undefined, done: true });
81
+ return new Promise(resolve => this.waiters.push(resolve));
82
+ }
83
+ /**
84
+ * @returns the iterator
85
+ */
86
+ [Symbol.asyncIterator]() {
87
+ return {
88
+ next: () => this.next(),
89
+ return: async () => {
90
+ this.end();
91
+ return { value: undefined, done: true };
92
+ }
93
+ };
94
+ }
95
+ }
96
+ //# sourceMappingURL=asyncqueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncqueue.js","sourceRoot":"","sources":["../../src/core/asyncqueue.ts"],"names":[],"mappings":"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"}