@aligent/cdk-prerender-proxy 0.2.4 → 0.2.5-beta

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 (150) hide show
  1. package/lib/handlers/cache-control.ts +7 -20
  2. package/lib/handlers/error-response.ts +8 -51
  3. package/lib/handlers/node_modules/.package-lock.json +32 -3
  4. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/index.d.ts +6 -0
  5. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/index.js +14 -0
  6. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/cache-control.d.ts +3 -0
  7. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/cache-control.js +24 -0
  8. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/error-response.d.ts +3 -0
  9. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/error-response.js +50 -0
  10. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/prerender-check.d.ts +3 -0
  11. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/prerender-check.js +28 -0
  12. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/prerender.d.ts +3 -0
  13. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/prerender.js +49 -0
  14. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/redirect.d.ts +3 -0
  15. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/lib/redirect.js +33 -0
  16. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/package.json +27 -0
  17. package/lib/handlers/node_modules/@aligent/cdk-lambda-at-edge-handlers/tsconfig.json +3 -0
  18. package/lib/handlers/node_modules/@middy/core/LICENSE +21 -0
  19. package/lib/handlers/node_modules/@middy/core/README.md +65 -0
  20. package/lib/handlers/node_modules/@middy/core/index.cjs +207 -0
  21. package/lib/handlers/node_modules/@middy/core/index.d.ts +91 -0
  22. package/lib/handlers/node_modules/@middy/core/index.js +199 -0
  23. package/lib/handlers/node_modules/@middy/core/package.json +65 -0
  24. package/lib/handlers/node_modules/@types/node/README.md +4 -4
  25. package/lib/handlers/node_modules/@types/node/assert/strict.d.ts +5 -1
  26. package/lib/handlers/node_modules/@types/node/assert.d.ts +904 -67
  27. package/lib/handlers/node_modules/@types/node/async_hooks.d.ts +371 -96
  28. package/lib/handlers/node_modules/@types/node/buffer.d.ts +2199 -25
  29. package/lib/handlers/node_modules/@types/node/child_process.d.ts +1151 -308
  30. package/lib/handlers/node_modules/@types/node/cluster.d.ts +356 -208
  31. package/lib/handlers/node_modules/@types/node/console.d.ts +324 -45
  32. package/lib/handlers/node_modules/@types/node/constants.d.ts +8 -3
  33. package/lib/handlers/node_modules/@types/node/crypto.d.ts +3230 -846
  34. package/lib/handlers/node_modules/@types/node/dgram.d.ts +478 -74
  35. package/lib/handlers/node_modules/@types/node/diagnostics_channel.d.ts +153 -0
  36. package/lib/handlers/node_modules/@types/node/dns/promises.d.ts +308 -35
  37. package/lib/handlers/node_modules/@types/node/dns.d.ts +444 -107
  38. package/lib/handlers/node_modules/@types/node/dom-events.d.ts +126 -0
  39. package/lib/handlers/node_modules/@types/node/domain.d.ts +162 -16
  40. package/lib/handlers/node_modules/@types/node/events.d.ts +624 -39
  41. package/lib/handlers/node_modules/@types/node/fs/promises.d.ts +911 -365
  42. package/lib/handlers/node_modules/@types/node/fs.d.ts +2611 -978
  43. package/lib/handlers/node_modules/@types/node/globals.d.ts +66 -421
  44. package/lib/handlers/node_modules/@types/node/globals.global.d.ts +1 -1
  45. package/lib/handlers/node_modules/@types/node/http.d.ts +1416 -199
  46. package/lib/handlers/node_modules/@types/node/http2.d.ts +1688 -530
  47. package/lib/handlers/node_modules/@types/node/https.d.ts +532 -26
  48. package/lib/handlers/node_modules/@types/node/index.d.ts +92 -16
  49. package/lib/handlers/node_modules/@types/node/inspector.d.ts +511 -811
  50. package/lib/handlers/node_modules/@types/node/module.d.ts +75 -13
  51. package/lib/handlers/node_modules/@types/node/net.d.ts +710 -167
  52. package/lib/handlers/node_modules/@types/node/os.d.ts +252 -25
  53. package/lib/handlers/node_modules/@types/node/package.json +30 -25
  54. package/lib/handlers/node_modules/@types/node/path.d.ts +59 -31
  55. package/lib/handlers/node_modules/@types/node/perf_hooks.d.ts +420 -105
  56. package/lib/handlers/node_modules/@types/node/process.d.ts +1249 -228
  57. package/lib/handlers/node_modules/@types/node/punycode.d.ts +67 -25
  58. package/lib/handlers/node_modules/@types/node/querystring.d.ts +113 -10
  59. package/lib/handlers/node_modules/@types/node/readline/promises.d.ts +143 -0
  60. package/lib/handlers/node_modules/@types/node/readline.d.ts +570 -109
  61. package/lib/handlers/node_modules/@types/node/repl.d.ts +154 -125
  62. package/lib/handlers/node_modules/@types/node/stream/consumers.d.ts +12 -0
  63. package/lib/handlers/node_modules/@types/node/stream/promises.d.ts +18 -43
  64. package/lib/handlers/node_modules/@types/node/stream/web.d.ts +330 -0
  65. package/lib/handlers/node_modules/@types/node/stream.d.ts +1117 -248
  66. package/lib/handlers/node_modules/@types/node/string_decoder.d.ts +60 -0
  67. package/lib/handlers/node_modules/@types/node/test.d.ts +446 -0
  68. package/lib/handlers/node_modules/@types/node/timers/promises.d.ts +81 -9
  69. package/lib/handlers/node_modules/@types/node/timers.d.ts +84 -17
  70. package/lib/handlers/node_modules/@types/node/tls.d.ts +510 -275
  71. package/lib/handlers/node_modules/@types/node/trace_events.d.ts +120 -10
  72. package/lib/handlers/node_modules/@types/node/ts4.8/assert/strict.d.ts +8 -0
  73. package/lib/handlers/node_modules/@types/node/ts4.8/assert.d.ts +961 -0
  74. package/lib/handlers/node_modules/@types/node/ts4.8/async_hooks.d.ts +501 -0
  75. package/lib/handlers/node_modules/@types/node/ts4.8/buffer.d.ts +2259 -0
  76. package/lib/handlers/node_modules/@types/node/ts4.8/child_process.d.ts +1369 -0
  77. package/lib/handlers/node_modules/@types/node/ts4.8/cluster.d.ts +410 -0
  78. package/lib/handlers/node_modules/@types/node/ts4.8/console.d.ts +412 -0
  79. package/lib/handlers/node_modules/@types/node/ts4.8/constants.d.ts +18 -0
  80. package/lib/handlers/node_modules/@types/node/ts4.8/crypto.d.ts +3964 -0
  81. package/lib/handlers/node_modules/@types/node/ts4.8/dgram.d.ts +545 -0
  82. package/lib/handlers/node_modules/@types/node/ts4.8/diagnostics_channel.d.ts +153 -0
  83. package/lib/handlers/node_modules/@types/node/ts4.8/dns/promises.d.ts +370 -0
  84. package/lib/handlers/node_modules/@types/node/ts4.8/dns.d.ts +659 -0
  85. package/lib/handlers/node_modules/@types/node/ts4.8/dom-events.d.ts +126 -0
  86. package/lib/handlers/node_modules/@types/node/ts4.8/domain.d.ts +170 -0
  87. package/lib/handlers/node_modules/@types/node/ts4.8/events.d.ts +678 -0
  88. package/lib/handlers/node_modules/@types/node/ts4.8/fs/promises.d.ts +1138 -0
  89. package/lib/handlers/node_modules/@types/node/ts4.8/fs.d.ts +3872 -0
  90. package/lib/handlers/node_modules/@types/node/ts4.8/globals.d.ts +294 -0
  91. package/lib/handlers/node_modules/@types/node/ts4.8/globals.global.d.ts +1 -0
  92. package/lib/handlers/node_modules/@types/node/ts4.8/http.d.ts +1651 -0
  93. package/lib/handlers/node_modules/@types/node/ts4.8/http2.d.ts +2134 -0
  94. package/lib/handlers/node_modules/@types/node/ts4.8/https.d.ts +542 -0
  95. package/lib/handlers/node_modules/@types/node/ts4.8/index.d.ts +88 -0
  96. package/lib/handlers/node_modules/@types/node/ts4.8/inspector.d.ts +2741 -0
  97. package/lib/handlers/node_modules/@types/node/ts4.8/module.d.ts +114 -0
  98. package/lib/handlers/node_modules/@types/node/ts4.8/net.d.ts +869 -0
  99. package/lib/handlers/node_modules/@types/node/ts4.8/os.d.ts +466 -0
  100. package/lib/handlers/node_modules/@types/node/ts4.8/path.d.ts +191 -0
  101. package/lib/handlers/node_modules/@types/node/ts4.8/perf_hooks.d.ts +625 -0
  102. package/lib/handlers/node_modules/@types/node/ts4.8/process.d.ts +1482 -0
  103. package/lib/handlers/node_modules/@types/node/ts4.8/punycode.d.ts +117 -0
  104. package/lib/handlers/node_modules/@types/node/ts4.8/querystring.d.ts +131 -0
  105. package/lib/handlers/node_modules/@types/node/ts4.8/readline/promises.d.ts +143 -0
  106. package/lib/handlers/node_modules/@types/node/ts4.8/readline.d.ts +653 -0
  107. package/lib/handlers/node_modules/@types/node/ts4.8/repl.d.ts +424 -0
  108. package/lib/handlers/node_modules/@types/node/ts4.8/stream/consumers.d.ts +12 -0
  109. package/lib/handlers/node_modules/@types/node/ts4.8/stream/promises.d.ts +42 -0
  110. package/lib/handlers/node_modules/@types/node/ts4.8/stream/web.d.ts +330 -0
  111. package/lib/handlers/node_modules/@types/node/ts4.8/stream.d.ts +1340 -0
  112. package/lib/handlers/node_modules/@types/node/ts4.8/string_decoder.d.ts +67 -0
  113. package/lib/handlers/node_modules/@types/node/ts4.8/test.d.ts +446 -0
  114. package/lib/handlers/node_modules/@types/node/ts4.8/timers/promises.d.ts +93 -0
  115. package/lib/handlers/node_modules/@types/node/ts4.8/timers.d.ts +94 -0
  116. package/lib/handlers/node_modules/@types/node/ts4.8/tls.d.ts +1028 -0
  117. package/lib/handlers/node_modules/@types/node/ts4.8/trace_events.d.ts +171 -0
  118. package/lib/handlers/node_modules/@types/node/ts4.8/tty.d.ts +206 -0
  119. package/lib/handlers/node_modules/@types/node/ts4.8/url.d.ts +897 -0
  120. package/lib/handlers/node_modules/@types/node/ts4.8/util.d.ts +1926 -0
  121. package/lib/handlers/node_modules/@types/node/ts4.8/v8.d.ts +396 -0
  122. package/lib/handlers/node_modules/@types/node/ts4.8/vm.d.ts +509 -0
  123. package/lib/handlers/node_modules/@types/node/ts4.8/wasi.d.ts +158 -0
  124. package/lib/handlers/node_modules/@types/node/ts4.8/worker_threads.d.ts +689 -0
  125. package/lib/handlers/node_modules/@types/node/ts4.8/zlib.d.ts +517 -0
  126. package/lib/handlers/node_modules/@types/node/tty.d.ts +163 -23
  127. package/lib/handlers/node_modules/@types/node/url.d.ts +825 -44
  128. package/lib/handlers/node_modules/@types/node/util.d.ts +1842 -72
  129. package/lib/handlers/node_modules/@types/node/v8.d.ts +276 -78
  130. package/lib/handlers/node_modules/@types/node/vm.d.ts +410 -53
  131. package/lib/handlers/node_modules/@types/node/wasi.d.ts +102 -30
  132. package/lib/handlers/node_modules/@types/node/worker_threads.d.ts +559 -152
  133. package/lib/handlers/node_modules/@types/node/zlib.d.ts +234 -78
  134. package/lib/handlers/node_modules/esbuild/README.md +3 -0
  135. package/lib/handlers/node_modules/esbuild/bin/esbuild +0 -0
  136. package/lib/handlers/node_modules/esbuild/install.js +256 -0
  137. package/lib/handlers/node_modules/esbuild/lib/main.d.ts +397 -0
  138. package/lib/handlers/node_modules/esbuild/lib/main.js +1939 -0
  139. package/lib/handlers/node_modules/esbuild/package.json +15 -0
  140. package/lib/handlers/package-lock.json +62 -6
  141. package/lib/handlers/package.json +6 -1
  142. package/lib/handlers/prerender-check.ts +8 -27
  143. package/lib/handlers/prerender.ts +8 -43
  144. package/package.json +1 -1
  145. package/lib/handlers/node_modules/@types/node/base.d.ts +0 -19
  146. package/lib/handlers/node_modules/@types/node/diagnostic_channel.d.ts +0 -34
  147. package/lib/handlers/node_modules/@types/node/ts3.6/assert.d.ts +0 -98
  148. package/lib/handlers/node_modules/@types/node/ts3.6/base.d.ts +0 -68
  149. package/lib/handlers/node_modules/@types/node/ts3.6/index.d.ts +0 -7
  150. package/lib/handlers/node_modules/@types/node/util/types.d.ts +0 -53
@@ -1,16 +1,47 @@
1
1
  /**
2
- * Async Hooks module: https://nodejs.org/api/async_hooks.html
2
+ * The `async_hooks` module provides an API to track asynchronous resources. It
3
+ * can be accessed using:
4
+ *
5
+ * ```js
6
+ * import async_hooks from 'async_hooks';
7
+ * ```
8
+ * @experimental
9
+ * @see [source](https://github.com/nodejs/node/blob/v18.0.0/lib/async_hooks.js)
3
10
  */
4
11
  declare module 'async_hooks' {
5
12
  /**
6
- * Returns the asyncId of the current execution context.
13
+ * ```js
14
+ * import { executionAsyncId } from 'async_hooks';
15
+ *
16
+ * console.log(executionAsyncId()); // 1 - bootstrap
17
+ * fs.open(path, 'r', (err, fd) => {
18
+ * console.log(executionAsyncId()); // 6 - open()
19
+ * });
20
+ * ```
21
+ *
22
+ * The ID returned from `executionAsyncId()` is related to execution timing, not
23
+ * causality (which is covered by `triggerAsyncId()`):
24
+ *
25
+ * ```js
26
+ * const server = net.createServer((conn) => {
27
+ * // Returns the ID of the server, not of the new connection, because the
28
+ * // callback runs in the execution scope of the server's MakeCallback().
29
+ * async_hooks.executionAsyncId();
30
+ *
31
+ * }).listen(port, () => {
32
+ * // Returns the ID of a TickObject (process.nextTick()) because all
33
+ * // callbacks passed to .listen() are wrapped in a nextTick().
34
+ * async_hooks.executionAsyncId();
35
+ * });
36
+ * ```
37
+ *
38
+ * Promise contexts may not get precise `executionAsyncIds` by default.
39
+ * See the section on `promise execution tracking`.
40
+ * @since v8.1.0
41
+ * @return The `asyncId` of the current execution context. Useful to track when something calls.
7
42
  */
8
43
  function executionAsyncId(): number;
9
-
10
44
  /**
11
- * The resource representing the current execution.
12
- * Useful to store data within the resource.
13
- *
14
45
  * Resource objects returned by `executionAsyncResource()` are most often internal
15
46
  * Node.js handle objects with undocumented APIs. Using any functions or properties
16
47
  * on the object is likely to crash your application and should be avoided.
@@ -18,14 +49,70 @@ declare module 'async_hooks' {
18
49
  * Using `executionAsyncResource()` in the top-level execution context will
19
50
  * return an empty object as there is no handle or request object to use,
20
51
  * but having an object representing the top-level can be helpful.
52
+ *
53
+ * ```js
54
+ * import { open } from 'fs';
55
+ * import { executionAsyncId, executionAsyncResource } from 'async_hooks';
56
+ *
57
+ * console.log(executionAsyncId(), executionAsyncResource()); // 1 {}
58
+ * open(new URL(import.meta.url), 'r', (err, fd) => {
59
+ * console.log(executionAsyncId(), executionAsyncResource()); // 7 FSReqWrap
60
+ * });
61
+ * ```
62
+ *
63
+ * This can be used to implement continuation local storage without the
64
+ * use of a tracking `Map` to store the metadata:
65
+ *
66
+ * ```js
67
+ * import { createServer } from 'http';
68
+ * import {
69
+ * executionAsyncId,
70
+ * executionAsyncResource,
71
+ * createHook
72
+ * } from 'async_hooks';
73
+ * const sym = Symbol('state'); // Private symbol to avoid pollution
74
+ *
75
+ * createHook({
76
+ * init(asyncId, type, triggerAsyncId, resource) {
77
+ * const cr = executionAsyncResource();
78
+ * if (cr) {
79
+ * resource[sym] = cr[sym];
80
+ * }
81
+ * }
82
+ * }).enable();
83
+ *
84
+ * const server = createServer((req, res) => {
85
+ * executionAsyncResource()[sym] = { state: req.url };
86
+ * setTimeout(function() {
87
+ * res.end(JSON.stringify(executionAsyncResource()[sym]));
88
+ * }, 100);
89
+ * }).listen(3000);
90
+ * ```
91
+ * @since v13.9.0, v12.17.0
92
+ * @return The resource representing the current execution. Useful to store data within the resource.
21
93
  */
22
94
  function executionAsyncResource(): object;
23
-
24
95
  /**
25
- * Returns the ID of the resource responsible for calling the callback that is currently being executed.
96
+ * ```js
97
+ * const server = net.createServer((conn) => {
98
+ * // The resource that caused (or triggered) this callback to be called
99
+ * // was that of the new connection. Thus the return value of triggerAsyncId()
100
+ * // is the asyncId of "conn".
101
+ * async_hooks.triggerAsyncId();
102
+ *
103
+ * }).listen(port, () => {
104
+ * // Even though all callbacks passed to .listen() are wrapped in a nextTick()
105
+ * // the callback itself exists because the call to the server's .listen()
106
+ * // was made. So the return value would be the ID of the server.
107
+ * async_hooks.triggerAsyncId();
108
+ * });
109
+ * ```
110
+ *
111
+ * Promise contexts may not get valid `triggerAsyncId`s by default. See
112
+ * the section on `promise execution tracking`.
113
+ * @return The ID of the resource responsible for calling the callback that is currently being executed.
26
114
  */
27
115
  function triggerAsyncId(): number;
28
-
29
116
  interface HookCallbacks {
30
117
  /**
31
118
  * Called when a class is constructed that has the possibility to emit an asynchronous event.
@@ -35,73 +122,133 @@ declare module 'async_hooks' {
35
122
  * @param resource reference to the resource representing the async operation, needs to be released during destroy
36
123
  */
37
124
  init?(asyncId: number, type: string, triggerAsyncId: number, resource: object): void;
38
-
39
125
  /**
40
126
  * When an asynchronous operation is initiated or completes a callback is called to notify the user.
41
127
  * The before callback is called just before said callback is executed.
42
128
  * @param asyncId the unique identifier assigned to the resource about to execute the callback.
43
129
  */
44
130
  before?(asyncId: number): void;
45
-
46
131
  /**
47
132
  * Called immediately after the callback specified in before is completed.
48
133
  * @param asyncId the unique identifier assigned to the resource which has executed the callback.
49
134
  */
50
135
  after?(asyncId: number): void;
51
-
52
136
  /**
53
137
  * Called when a promise has resolve() called. This may not be in the same execution id
54
138
  * as the promise itself.
55
139
  * @param asyncId the unique id for the promise that was resolve()d.
56
140
  */
57
141
  promiseResolve?(asyncId: number): void;
58
-
59
142
  /**
60
143
  * Called after the resource corresponding to asyncId is destroyed
61
144
  * @param asyncId a unique ID for the async resource
62
145
  */
63
146
  destroy?(asyncId: number): void;
64
147
  }
65
-
66
148
  interface AsyncHook {
67
149
  /**
68
150
  * Enable the callbacks for a given AsyncHook instance. If no callbacks are provided enabling is a noop.
69
151
  */
70
152
  enable(): this;
71
-
72
153
  /**
73
154
  * Disable the callbacks for a given AsyncHook instance from the global pool of AsyncHook callbacks to be executed. Once a hook has been disabled it will not be called again until enabled.
74
155
  */
75
156
  disable(): this;
76
157
  }
77
-
78
158
  /**
79
- * Registers functions to be called for different lifetime events of each async operation.
80
- * @param options the callbacks to register
81
- * @return an AsyncHooks instance used for disabling and enabling hooks
159
+ * Registers functions to be called for different lifetime events of each async
160
+ * operation.
161
+ *
162
+ * The callbacks `init()`/`before()`/`after()`/`destroy()` are called for the
163
+ * respective asynchronous event during a resource's lifetime.
164
+ *
165
+ * All callbacks are optional. For example, if only resource cleanup needs to
166
+ * be tracked, then only the `destroy` callback needs to be passed. The
167
+ * specifics of all functions that can be passed to `callbacks` is in the `Hook Callbacks` section.
168
+ *
169
+ * ```js
170
+ * import { createHook } from 'async_hooks';
171
+ *
172
+ * const asyncHook = createHook({
173
+ * init(asyncId, type, triggerAsyncId, resource) { },
174
+ * destroy(asyncId) { }
175
+ * });
176
+ * ```
177
+ *
178
+ * The callbacks will be inherited via the prototype chain:
179
+ *
180
+ * ```js
181
+ * class MyAsyncCallbacks {
182
+ * init(asyncId, type, triggerAsyncId, resource) { }
183
+ * destroy(asyncId) {}
184
+ * }
185
+ *
186
+ * class MyAddedCallbacks extends MyAsyncCallbacks {
187
+ * before(asyncId) { }
188
+ * after(asyncId) { }
189
+ * }
190
+ *
191
+ * const asyncHook = async_hooks.createHook(new MyAddedCallbacks());
192
+ * ```
193
+ *
194
+ * Because promises are asynchronous resources whose lifecycle is tracked
195
+ * via the async hooks mechanism, the `init()`, `before()`, `after()`, and`destroy()` callbacks _must not_ be async functions that return promises.
196
+ * @since v8.1.0
197
+ * @param callbacks The `Hook Callbacks` to register
198
+ * @return Instance used for disabling and enabling hooks
82
199
  */
83
- function createHook(options: HookCallbacks): AsyncHook;
84
-
200
+ function createHook(callbacks: HookCallbacks): AsyncHook;
85
201
  interface AsyncResourceOptions {
86
- /**
87
- * The ID of the execution context that created this async event.
88
- * @default executionAsyncId()
89
- */
90
- triggerAsyncId?: number;
91
-
92
- /**
93
- * Disables automatic `emitDestroy` when the object is garbage collected.
94
- * This usually does not need to be set (even if `emitDestroy` is called
95
- * manually), unless the resource's `asyncId` is retrieved and the
96
- * sensitive API's `emitDestroy` is called with it.
97
- * @default false
98
- */
99
- requireManualDestroy?: boolean;
202
+ /**
203
+ * The ID of the execution context that created this async event.
204
+ * @default executionAsyncId()
205
+ */
206
+ triggerAsyncId?: number | undefined;
207
+ /**
208
+ * Disables automatic `emitDestroy` when the object is garbage collected.
209
+ * This usually does not need to be set (even if `emitDestroy` is called
210
+ * manually), unless the resource's `asyncId` is retrieved and the
211
+ * sensitive API's `emitDestroy` is called with it.
212
+ * @default false
213
+ */
214
+ requireManualDestroy?: boolean | undefined;
100
215
  }
101
-
102
216
  /**
103
- * The class AsyncResource was designed to be extended by the embedder's async resources.
104
- * Using this users can easily trigger the lifetime events of their own resources.
217
+ * The class `AsyncResource` is designed to be extended by the embedder's async
218
+ * resources. Using this, users can easily trigger the lifetime events of their
219
+ * own resources.
220
+ *
221
+ * The `init` hook will trigger when an `AsyncResource` is instantiated.
222
+ *
223
+ * The following is an overview of the `AsyncResource` API.
224
+ *
225
+ * ```js
226
+ * import { AsyncResource, executionAsyncId } from 'async_hooks';
227
+ *
228
+ * // AsyncResource() is meant to be extended. Instantiating a
229
+ * // new AsyncResource() also triggers init. If triggerAsyncId is omitted then
230
+ * // async_hook.executionAsyncId() is used.
231
+ * const asyncResource = new AsyncResource(
232
+ * type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false }
233
+ * );
234
+ *
235
+ * // Run a function in the execution context of the resource. This will
236
+ * // * establish the context of the resource
237
+ * // * trigger the AsyncHooks before callbacks
238
+ * // * call the provided function `fn` with the supplied arguments
239
+ * // * trigger the AsyncHooks after callbacks
240
+ * // * restore the original execution context
241
+ * asyncResource.runInAsyncScope(fn, thisArg, ...args);
242
+ *
243
+ * // Call AsyncHooks destroy callbacks.
244
+ * asyncResource.emitDestroy();
245
+ *
246
+ * // Return the unique ID assigned to the AsyncResource instance.
247
+ * asyncResource.asyncId();
248
+ *
249
+ * // Return the trigger ID for the AsyncResource instance.
250
+ * asyncResource.triggerAsyncId();
251
+ * ```
105
252
  */
106
253
  class AsyncResource {
107
254
  /**
@@ -111,116 +258,244 @@ declare module 'async_hooks' {
111
258
  * @param type The type of async event.
112
259
  * @param triggerAsyncId The ID of the execution context that created
113
260
  * this async event (default: `executionAsyncId()`), or an
114
- * AsyncResourceOptions object (since 9.3)
261
+ * AsyncResourceOptions object (since v9.3.0)
115
262
  */
116
- constructor(type: string, triggerAsyncId?: number|AsyncResourceOptions);
117
-
263
+ constructor(type: string, triggerAsyncId?: number | AsyncResourceOptions);
118
264
  /**
119
265
  * Binds the given function to the current execution context.
266
+ *
267
+ * The returned function will have an `asyncResource` property referencing
268
+ * the `AsyncResource` to which the function is bound.
269
+ * @since v14.8.0, v12.19.0
120
270
  * @param fn The function to bind to the current execution context.
121
271
  * @param type An optional name to associate with the underlying `AsyncResource`.
122
272
  */
123
- static bind<Func extends (...args: any[]) => any>(fn: Func, type?: string): Func & { asyncResource: AsyncResource };
124
-
273
+ static bind<Func extends (this: ThisArg, ...args: any[]) => any, ThisArg>(
274
+ fn: Func,
275
+ type?: string,
276
+ thisArg?: ThisArg
277
+ ): Func & {
278
+ asyncResource: AsyncResource;
279
+ };
125
280
  /**
126
281
  * Binds the given function to execute to this `AsyncResource`'s scope.
282
+ *
283
+ * The returned function will have an `asyncResource` property referencing
284
+ * the `AsyncResource` to which the function is bound.
285
+ * @since v14.8.0, v12.19.0
127
286
  * @param fn The function to bind to the current `AsyncResource`.
128
287
  */
129
- bind<Func extends (...args: any[]) => any>(fn: Func): Func & { asyncResource: AsyncResource };
130
-
288
+ bind<Func extends (...args: any[]) => any>(
289
+ fn: Func
290
+ ): Func & {
291
+ asyncResource: AsyncResource;
292
+ };
131
293
  /**
132
- * Call the provided function with the provided arguments in the
133
- * execution context of the async resource. This will establish the
134
- * context, trigger the AsyncHooks before callbacks, call the function,
135
- * trigger the AsyncHooks after callbacks, and then restore the original
136
- * execution context.
137
- * @param fn The function to call in the execution context of this
138
- * async resource.
294
+ * Call the provided function with the provided arguments in the execution context
295
+ * of the async resource. This will establish the context, trigger the AsyncHooks
296
+ * before callbacks, call the function, trigger the AsyncHooks after callbacks, and
297
+ * then restore the original execution context.
298
+ * @since v9.6.0
299
+ * @param fn The function to call in the execution context of this async resource.
139
300
  * @param thisArg The receiver to be used for the function call.
140
301
  * @param args Optional arguments to pass to the function.
141
302
  */
142
303
  runInAsyncScope<This, Result>(fn: (this: This, ...args: any[]) => Result, thisArg?: This, ...args: any[]): Result;
143
-
144
304
  /**
145
- * Call AsyncHooks destroy callbacks.
305
+ * Call all `destroy` hooks. This should only ever be called once. An error will
306
+ * be thrown if it is called more than once. This **must** be manually called. If
307
+ * the resource is left to be collected by the GC then the `destroy` hooks will
308
+ * never be called.
309
+ * @return A reference to `asyncResource`.
146
310
  */
147
311
  emitDestroy(): this;
148
-
149
312
  /**
150
- * @return the unique ID assigned to this AsyncResource instance.
313
+ * @return The unique `asyncId` assigned to the resource.
151
314
  */
152
315
  asyncId(): number;
153
-
154
316
  /**
155
- * @return the trigger ID for this AsyncResource instance.
317
+ *
318
+ * @return The same `triggerAsyncId` that is passed to the `AsyncResource` constructor.
156
319
  */
157
320
  triggerAsyncId(): number;
158
321
  }
159
-
160
322
  /**
161
- * When having multiple instances of `AsyncLocalStorage`, they are independent
162
- * from each other. It is safe to instantiate this class multiple times.
323
+ * This class creates stores that stay coherent through asynchronous operations.
324
+ *
325
+ * While you can create your own implementation on top of the `async_hooks` module,`AsyncLocalStorage` should be preferred as it is a performant and memory safe
326
+ * implementation that involves significant optimizations that are non-obvious to
327
+ * implement.
328
+ *
329
+ * The following example uses `AsyncLocalStorage` to build a simple logger
330
+ * that assigns IDs to incoming HTTP requests and includes them in messages
331
+ * logged within each request.
332
+ *
333
+ * ```js
334
+ * import http from 'http';
335
+ * import { AsyncLocalStorage } from 'async_hooks';
336
+ *
337
+ * const asyncLocalStorage = new AsyncLocalStorage();
338
+ *
339
+ * function logWithId(msg) {
340
+ * const id = asyncLocalStorage.getStore();
341
+ * console.log(`${id !== undefined ? id : '-'}:`, msg);
342
+ * }
343
+ *
344
+ * let idSeq = 0;
345
+ * http.createServer((req, res) => {
346
+ * asyncLocalStorage.run(idSeq++, () => {
347
+ * logWithId('start');
348
+ * // Imagine any chain of async operations here
349
+ * setImmediate(() => {
350
+ * logWithId('finish');
351
+ * res.end();
352
+ * });
353
+ * });
354
+ * }).listen(8080);
355
+ *
356
+ * http.get('http://localhost:8080');
357
+ * http.get('http://localhost:8080');
358
+ * // Prints:
359
+ * // 0: start
360
+ * // 1: start
361
+ * // 0: finish
362
+ * // 1: finish
363
+ * ```
364
+ *
365
+ * Each instance of `AsyncLocalStorage` maintains an independent storage context.
366
+ * Multiple instances can safely exist simultaneously without risk of interfering
367
+ * with each other's data.
368
+ * @since v13.10.0, v12.17.0
163
369
  */
164
370
  class AsyncLocalStorage<T> {
165
371
  /**
166
- * This method disables the instance of `AsyncLocalStorage`. All subsequent calls
167
- * to `asyncLocalStorage.getStore()` will return `undefined` until
168
- * `asyncLocalStorage.run()` is called again.
372
+ * Disables the instance of `AsyncLocalStorage`. All subsequent calls
373
+ * to `asyncLocalStorage.getStore()` will return `undefined` until`asyncLocalStorage.run()` or `asyncLocalStorage.enterWith()` is called again.
169
374
  *
170
375
  * When calling `asyncLocalStorage.disable()`, all current contexts linked to the
171
376
  * instance will be exited.
172
377
  *
173
- * Calling `asyncLocalStorage.disable()` is required before the
174
- * `asyncLocalStorage` can be garbage collected. This does not apply to stores
378
+ * Calling `asyncLocalStorage.disable()` is required before the`asyncLocalStorage` can be garbage collected. This does not apply to stores
175
379
  * provided by the `asyncLocalStorage`, as those objects are garbage collected
176
380
  * along with the corresponding async resources.
177
381
  *
178
- * This method is to be used when the `asyncLocalStorage` is not in use anymore
382
+ * Use this method when the `asyncLocalStorage` is not in use anymore
179
383
  * in the current process.
384
+ * @since v13.10.0, v12.17.0
385
+ * @experimental
180
386
  */
181
387
  disable(): void;
182
-
183
388
  /**
184
- * This method returns the current store. If this method is called outside of an
185
- * asynchronous context initialized by calling `asyncLocalStorage.run`, it will
186
- * return `undefined`.
389
+ * Returns the current store.
390
+ * If called outside of an asynchronous context initialized by
391
+ * calling `asyncLocalStorage.run()` or `asyncLocalStorage.enterWith()`, it
392
+ * returns `undefined`.
393
+ * @since v13.10.0, v12.17.0
187
394
  */
188
395
  getStore(): T | undefined;
189
-
190
396
  /**
191
- * This methods runs a function synchronously within a context and return its
192
- * return value. The store is not accessible outside of the callback function or
193
- * the asynchronous operations created within the callback.
397
+ * Runs a function synchronously within a context and returns its
398
+ * return value. The store is not accessible outside of the callback function.
399
+ * The store is accessible to any asynchronous operations created within the
400
+ * callback.
401
+ *
402
+ * The optional `args` are passed to the callback function.
194
403
  *
195
- * Optionally, arguments can be passed to the function. They will be passed to the
196
- * callback function.
404
+ * If the callback function throws an error, the error is thrown by `run()` too.
405
+ * The stacktrace is not impacted by this call and the context is exited.
197
406
  *
198
- * I the callback function throws an error, it will be thrown by `run` too. The
199
- * stacktrace will not be impacted by this call and the context will be exited.
407
+ * Example:
408
+ *
409
+ * ```js
410
+ * const store = { id: 2 };
411
+ * try {
412
+ * asyncLocalStorage.run(store, () => {
413
+ * asyncLocalStorage.getStore(); // Returns the store object
414
+ * setTimeout(() => {
415
+ * asyncLocalStorage.getStore(); // Returns the store object
416
+ * }, 200);
417
+ * throw new Error();
418
+ * });
419
+ * } catch (e) {
420
+ * asyncLocalStorage.getStore(); // Returns undefined
421
+ * // The error will be caught here
422
+ * }
423
+ * ```
424
+ * @since v13.10.0, v12.17.0
200
425
  */
201
- // TODO: Apply generic vararg once available
202
- run<R>(store: T, callback: (...args: any[]) => R, ...args: any[]): R;
203
-
426
+ run<R, TArgs extends any[]>(store: T, callback: (...args: TArgs) => R, ...args: TArgs): R;
204
427
  /**
205
- * This methods runs a function synchronously outside of a context and return its
206
- * return value. The store is not accessible within the callback function or the
207
- * asynchronous operations created within the callback.
428
+ * Runs a function synchronously outside of a context and returns its
429
+ * return value. The store is not accessible within the callback function or
430
+ * the asynchronous operations created within the callback. Any `getStore()`call done within the callback function will always return `undefined`.
431
+ *
432
+ * The optional `args` are passed to the callback function.
433
+ *
434
+ * If the callback function throws an error, the error is thrown by `exit()` too.
435
+ * The stacktrace is not impacted by this call and the context is re-entered.
208
436
  *
209
- * Optionally, arguments can be passed to the function. They will be passed to the
210
- * callback function.
437
+ * Example:
211
438
  *
212
- * If the callback function throws an error, it will be thrown by `exit` too. The
213
- * stacktrace will not be impacted by this call and the context will be
214
- * re-entered.
439
+ * ```js
440
+ * // Within a call to run
441
+ * try {
442
+ * asyncLocalStorage.getStore(); // Returns the store object or value
443
+ * asyncLocalStorage.exit(() => {
444
+ * asyncLocalStorage.getStore(); // Returns undefined
445
+ * throw new Error();
446
+ * });
447
+ * } catch (e) {
448
+ * asyncLocalStorage.getStore(); // Returns the same object or value
449
+ * // The error will be caught here
450
+ * }
451
+ * ```
452
+ * @since v13.10.0, v12.17.0
453
+ * @experimental
215
454
  */
216
- // TODO: Apply generic vararg once available
217
- exit<R>(callback: (...args: any[]) => R, ...args: any[]): R;
218
-
455
+ exit<R, TArgs extends any[]>(callback: (...args: TArgs) => R, ...args: TArgs): R;
219
456
  /**
220
- * Calling `asyncLocalStorage.enterWith(store)` will transition into the context
221
- * for the remainder of the current synchronous execution and will persist
222
- * through any following asynchronous calls.
457
+ * Transitions into the context for the remainder of the current
458
+ * synchronous execution and then persists the store through any following
459
+ * asynchronous calls.
460
+ *
461
+ * Example:
462
+ *
463
+ * ```js
464
+ * const store = { id: 1 };
465
+ * // Replaces previous store with the given store object
466
+ * asyncLocalStorage.enterWith(store);
467
+ * asyncLocalStorage.getStore(); // Returns the store object
468
+ * someAsyncOperation(() => {
469
+ * asyncLocalStorage.getStore(); // Returns the same object
470
+ * });
471
+ * ```
472
+ *
473
+ * This transition will continue for the _entire_ synchronous execution.
474
+ * This means that if, for example, the context is entered within an event
475
+ * handler subsequent event handlers will also run within that context unless
476
+ * specifically bound to another context with an `AsyncResource`. That is why`run()` should be preferred over `enterWith()` unless there are strong reasons
477
+ * to use the latter method.
478
+ *
479
+ * ```js
480
+ * const store = { id: 1 };
481
+ *
482
+ * emitter.on('my-event', () => {
483
+ * asyncLocalStorage.enterWith(store);
484
+ * });
485
+ * emitter.on('my-event', () => {
486
+ * asyncLocalStorage.getStore(); // Returns the same object
487
+ * });
488
+ *
489
+ * asyncLocalStorage.getStore(); // Returns undefined
490
+ * emitter.emit('my-event');
491
+ * asyncLocalStorage.getStore(); // Returns the same object
492
+ * ```
493
+ * @since v13.11.0, v12.17.0
494
+ * @experimental
223
495
  */
224
496
  enterWith(store: T): void;
225
497
  }
226
498
  }
499
+ declare module 'node:async_hooks' {
500
+ export * from 'async_hooks';
501
+ }