next 15.6.0-canary.2 → 15.6.0-canary.4

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 (51) hide show
  1. package/dist/bin/next +1 -1
  2. package/dist/build/adapter/build-complete.js +1 -1
  3. package/dist/build/adapter/build-complete.js.map +1 -1
  4. package/dist/build/index.js +9 -5
  5. package/dist/build/index.js.map +1 -1
  6. package/dist/build/swc/index.js +1 -1
  7. package/dist/build/templates/app-page.js +5 -1
  8. package/dist/build/templates/app-page.js.map +1 -1
  9. package/dist/build/webpack/loaders/devtool/devtool-style-inject.js +31 -26
  10. package/dist/build/webpack/loaders/devtool/devtool-style-inject.js.map +1 -1
  11. package/dist/build/webpack-config.js +2 -2
  12. package/dist/client/app-bootstrap.js +1 -1
  13. package/dist/client/index.js +1 -1
  14. package/dist/compiled/next-devtools/index.js +1 -1
  15. package/dist/compiled/next-devtools/index.js.map +1 -1
  16. package/dist/compiled/next-server/server.runtime.prod.js +5 -5
  17. package/dist/compiled/next-server/server.runtime.prod.js.map +1 -1
  18. package/dist/esm/build/adapter/build-complete.js +1 -1
  19. package/dist/esm/build/adapter/build-complete.js.map +1 -1
  20. package/dist/esm/build/index.js +9 -5
  21. package/dist/esm/build/index.js.map +1 -1
  22. package/dist/esm/build/swc/index.js +1 -1
  23. package/dist/esm/build/templates/app-page.js +5 -1
  24. package/dist/esm/build/templates/app-page.js.map +1 -1
  25. package/dist/esm/build/webpack/loaders/devtool/devtool-style-inject.js +31 -26
  26. package/dist/esm/build/webpack/loaders/devtool/devtool-style-inject.js.map +1 -1
  27. package/dist/esm/build/webpack-config.js +2 -2
  28. package/dist/esm/client/app-bootstrap.js +1 -1
  29. package/dist/esm/client/index.js +1 -1
  30. package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
  31. package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
  32. package/dist/esm/server/lib/app-info-log.js +1 -1
  33. package/dist/esm/server/lib/router-utils/setup-dev-bundler.js +1 -1
  34. package/dist/esm/server/lib/router-utils/setup-dev-bundler.js.map +1 -1
  35. package/dist/esm/server/lib/start-server.js +1 -1
  36. package/dist/esm/server/node-environment-extensions/unhandled-rejection.js +50 -1
  37. package/dist/esm/server/node-environment-extensions/unhandled-rejection.js.map +1 -1
  38. package/dist/esm/shared/lib/canary-only.js +1 -1
  39. package/dist/server/dev/hot-reloader-turbopack.js +1 -1
  40. package/dist/server/dev/hot-reloader-webpack.js +1 -1
  41. package/dist/server/lib/app-info-log.js +1 -1
  42. package/dist/server/lib/router-utils/setup-dev-bundler.js +1 -1
  43. package/dist/server/lib/router-utils/setup-dev-bundler.js.map +1 -1
  44. package/dist/server/lib/start-server.js +1 -1
  45. package/dist/server/node-environment-extensions/unhandled-rejection.js +50 -1
  46. package/dist/server/node-environment-extensions/unhandled-rejection.js.map +1 -1
  47. package/dist/shared/lib/canary-only.js +1 -1
  48. package/dist/telemetry/anonymous-meta.js +1 -1
  49. package/dist/telemetry/events/session-stopped.js +2 -2
  50. package/dist/telemetry/events/version.js +2 -2
  51. package/package.json +15 -15
@@ -22,6 +22,30 @@ Object.defineProperty(exports, "__esModule", {
22
22
  value: true
23
23
  });
24
24
  const _workunitasyncstorageexternal = require("../app-render/work-unit-async-storage.external");
25
+ const MODE = process.env.NEXT_USE_UNHANDLED_REJECTION_FILTER;
26
+ let ENABLE_UHR_FILTER = false;
27
+ let DEBUG_UHR_FILTER = false;
28
+ switch(MODE){
29
+ case 'debug':
30
+ DEBUG_UHR_FILTER = true;
31
+ // fallthrough
32
+ case 'enabled':
33
+ case 'true':
34
+ case '1':
35
+ ENABLE_UHR_FILTER = true;
36
+ break;
37
+ case 'false':
38
+ case 'disabled':
39
+ case '0':
40
+ case '':
41
+ case undefined:
42
+ break;
43
+ default:
44
+ if (typeof MODE === 'string') {
45
+ console.error(`NEXT_USE_UNHANDLED_REJECTION_FILTER has an unrecognized value: ${JSON.stringify(MODE)}. Use "enabled", "disabled", or "debug" or omit the environment variable altogether`);
46
+ }
47
+ }
48
+ const debug = DEBUG_UHR_FILTER ? (...args)=>console.log('[UNHANDLED REJECTION DEBUG]', ...args, new Error().stack) : undefined;
25
49
  let filterInstalled = false;
26
50
  // We store the proxied listeners for unhandled rejections here.
27
51
  let underlyingListeners = [];
@@ -46,8 +70,10 @@ let didWarnRemoveAll = false;
46
70
  * This should be called once during server startup to install the global filter.
47
71
  */ function installUnhandledRejectionFilter() {
48
72
  if (filterInstalled) {
73
+ debug == null ? void 0 : debug('unexpected second install');
49
74
  return;
50
75
  }
76
+ debug == null ? void 0 : debug('installUnhandledRejectionFilter', process.listeners('unhandledRejection').map((l)=>l.toString()));
51
77
  // Capture existing handlers
52
78
  underlyingListeners = Array.from(process.listeners('unhandledRejection'));
53
79
  // We assume all existing handlers are not "once"
@@ -78,6 +104,7 @@ let didWarnRemoveAll = false;
78
104
  // Intercept process.on to capture new unhandled rejection handlers
79
105
  process.on = patchMethod(originalProcessOn, function(event, listener) {
80
106
  if (event === 'unhandledRejection') {
107
+ debug == null ? void 0 : debug('process.on/addListener', listener.toString());
81
108
  // Add new handlers to our internal queue instead of the process
82
109
  underlyingListeners.push(listener);
83
110
  listenerMetadata.push({
@@ -94,6 +121,7 @@ let didWarnRemoveAll = false;
94
121
  // Intercept process.once for one-time handlers
95
122
  process.once = patchMethod(originalProcessOnce, function(event, listener) {
96
123
  if (event === 'unhandledRejection') {
124
+ debug == null ? void 0 : debug('process.once', listener.toString());
97
125
  underlyingListeners.push(listener);
98
126
  listenerMetadata.push({
99
127
  listener,
@@ -107,6 +135,7 @@ let didWarnRemoveAll = false;
107
135
  // Intercept process.prependListener for handlers that should go first
108
136
  process.prependListener = patchMethod(originalProcessPrependListener, function(event, listener) {
109
137
  if (event === 'unhandledRejection') {
138
+ debug == null ? void 0 : debug('process.prependListener', listener.toString());
110
139
  if (didWarnPrepend === false) {
111
140
  didWarnPrepend = true;
112
141
  console.warn('Warning: `prependListener("unhandledRejection")` called, but Next.js maintains the first listener ' + 'which filters out unnecessary events from aborted prerenders. Your handler will be second.');
@@ -125,6 +154,7 @@ let didWarnRemoveAll = false;
125
154
  // Intercept process.prependOnceListener for one-time handlers that should go first
126
155
  process.prependOnceListener = patchMethod(originalProcessPrependOnceListener, function(event, listener) {
127
156
  if (event === 'unhandledRejection') {
157
+ debug == null ? void 0 : debug('process.prependOnceListener', listener.toString());
128
158
  if (didWarnPrepend === false) {
129
159
  didWarnPrepend = true;
130
160
  console.warn('Warning: `prependOnceListener("unhandledRejection")` called, but Next.js maintains the first listener ' + 'which filters out unnecessary events from aborted prerenders. Your handler will be second.');
@@ -143,6 +173,7 @@ let didWarnRemoveAll = false;
143
173
  // Intercept process.removeListener
144
174
  process.removeListener = patchMethod(originalProcessRemoveListener, function(event, listener) {
145
175
  if (event === 'unhandledRejection') {
176
+ debug == null ? void 0 : debug('process.removeListener', listener.toString());
146
177
  // Check if they're trying to remove our filtering handler
147
178
  if (listener === filteringUnhandledRejectionHandler) {
148
179
  uninstallUnhandledRejectionFilter();
@@ -150,8 +181,11 @@ let didWarnRemoveAll = false;
150
181
  }
151
182
  const index = underlyingListeners.lastIndexOf(listener);
152
183
  if (index > -1) {
184
+ debug == null ? void 0 : debug('process.removeListener match found', index);
153
185
  underlyingListeners.splice(index, 1);
154
186
  listenerMetadata.splice(index, 1);
187
+ } else {
188
+ debug == null ? void 0 : debug('process.removeListener match not found', index);
155
189
  }
156
190
  return process;
157
191
  }
@@ -163,6 +197,7 @@ let didWarnRemoveAll = false;
163
197
  // Intercept process.removeAllListeners
164
198
  process.removeAllListeners = patchMethod(originalProcessRemoveAllListeners, function(event) {
165
199
  if (event === 'unhandledRejection') {
200
+ debug == null ? void 0 : debug('process.removeAllListeners', underlyingListeners.map((l)=>l.toString()));
166
201
  if (didWarnRemoveAll === false) {
167
202
  didWarnRemoveAll = true;
168
203
  console.warn('Warning: `removeAllListeners("unhandledRejection")` called. Next.js maintains an `unhandledRejection` listener ' + 'to filter out unnecessary rejection warnings caused by aborting prerenders early. It is not recommended that you ' + 'uninstall this behavior, but if you want to you must call `process.removeListener("unhandledRejection", listener)`. ' + 'You can acquire the listener from `process.listeners("unhandledRejection")[0]`.');
@@ -183,6 +218,10 @@ let didWarnRemoveAll = false;
183
218
  // Intercept process.listeners to return our internal handlers for unhandled rejection
184
219
  process.listeners = patchMethod(originalProcessListeners, function(event) {
185
220
  if (event === 'unhandledRejection') {
221
+ debug == null ? void 0 : debug('process.listeners', [
222
+ filteringUnhandledRejectionHandler,
223
+ ...underlyingListeners
224
+ ].map((l)=>l.toString()));
186
225
  return [
187
226
  filteringUnhandledRejectionHandler,
188
227
  ...underlyingListeners
@@ -196,6 +235,8 @@ let didWarnRemoveAll = false;
196
235
  originalProcessOn.call(process, 'unhandledRejection', filteringUnhandledRejectionHandler);
197
236
  originalProcessOn.call(process, 'rejectionHandled', noopRejectionHandled);
198
237
  filterInstalled = true;
238
+ debug == null ? void 0 : debug('after install actual listeners', originalProcessListeners.call(process, 'unhandledRejection').map((l)=>l.toString()));
239
+ debug == null ? void 0 : debug('after install listeners', process.listeners('unhandledRejection').map((l)=>l.toString()));
199
240
  }
200
241
  /**
201
242
  * Uninstalls the unhandled rejection filter and restores original process methods.
@@ -203,8 +244,13 @@ let didWarnRemoveAll = false;
203
244
  * @internal
204
245
  */ function uninstallUnhandledRejectionFilter() {
205
246
  if (!filterInstalled) {
247
+ debug == null ? void 0 : debug('unexpected second uninstall');
206
248
  return;
207
249
  }
250
+ debug == null ? void 0 : debug('uninstallUnhandledRejectionFilter', [
251
+ filteringUnhandledRejectionHandler,
252
+ ...underlyingListeners
253
+ ].map((l)=>l.toString()));
208
254
  // Restore original process methods
209
255
  process.on = originalProcessOn;
210
256
  process.addListener = originalProcessAddListener;
@@ -230,6 +276,7 @@ let didWarnRemoveAll = false;
230
276
  filterInstalled = false;
231
277
  underlyingListeners.length = 0;
232
278
  listenerMetadata.length = 0;
279
+ debug == null ? void 0 : debug('after uninstall', process.listeners('unhandledRejection').map((l)=>l.toString()));
233
280
  }
234
281
  /**
235
282
  * The filtering handler that decides whether to suppress or delegate unhandled rejections.
@@ -294,6 +341,8 @@ let didWarnRemoveAll = false;
294
341
  }
295
342
  function noopRejectionHandled() {}
296
343
  // Install the filter when this module is imported
297
- installUnhandledRejectionFilter();
344
+ if (ENABLE_UHR_FILTER) {
345
+ installUnhandledRejectionFilter();
346
+ }
298
347
 
299
348
  //# sourceMappingURL=unhandled-rejection.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/node-environment-extensions/unhandled-rejection.tsx"],"sourcesContent":["/**\n * Manages unhandled rejection listeners to intelligently filter rejections\n * from aborted prerenders when cache components are enabled.\n *\n * THE PROBLEM:\n * When we abort prerenders we expect to find numerous unhandled promise rejections due to\n * things like awaiting Request data like `headers()`. The rejections are fine and should\n * not be construed as problematic so we need to avoid the appearance of a problem by\n * omitting them from the logged output.\n *\n * THE STRATEGY:\n * 1. Install a filtering unhandled rejection handler\n * 2. Intercept process event methods to capture new handlers in our internal queue\n * 3. For each rejection, check if it comes from an aborted prerender context\n * 4. If yes, suppress it. If no, delegate to all handlers in our queue\n * 5. This provides precise filtering without time-based windows\n *\n * This ensures we suppress noisy prerender-related rejections while preserving\n * normal error logging for genuine unhandled rejections.\n */\n\nimport { workUnitAsyncStorage } from '../app-render/work-unit-async-storage.external'\n\ntype ListenerMetadata = {\n listener: NodeJS.UnhandledRejectionListener\n once: boolean\n}\n\nlet filterInstalled = false\n\n// We store the proxied listeners for unhandled rejections here.\nlet underlyingListeners: Array<NodeJS.UnhandledRejectionListener> = []\n// We store a unique pointer to each event listener registration to track\n// details like whether the listener is a once listener.\nlet listenerMetadata: Array<ListenerMetadata> = []\n\nlet originalProcessOn: typeof process.on\nlet originalProcessAddListener: typeof process.addListener\nlet originalProcessOnce: typeof process.once\nlet originalProcessRemoveListener: typeof process.removeListener\nlet originalProcessRemoveAllListeners: typeof process.removeAllListeners\nlet originalProcessListeners: typeof process.listeners\nlet originalProcessPrependListener: typeof process.prependListener\nlet originalProcessPrependOnceListener: typeof process.prependOnceListener\nlet originalProcessOff: typeof process.off\n\nlet didWarnPrepend = false\nlet didWarnRemoveAll = false\n\n/**\n * Installs a filtering unhandled rejection handler that intelligently suppresses\n * rejections from aborted prerender contexts.\n *\n * This should be called once during server startup to install the global filter.\n */\nfunction installUnhandledRejectionFilter(): void {\n if (filterInstalled) {\n return\n }\n\n // Capture existing handlers\n underlyingListeners = Array.from(process.listeners('unhandledRejection'))\n // We assume all existing handlers are not \"once\"\n listenerMetadata = underlyingListeners.map((l) => ({\n listener: l,\n once: false,\n }))\n\n // Store the original process methods\n originalProcessOn = process.on\n originalProcessAddListener = process.addListener\n originalProcessOnce = process.once\n originalProcessOff = process.off\n originalProcessRemoveListener = process.removeListener\n originalProcessRemoveAllListeners = process.removeAllListeners\n originalProcessListeners = process.listeners\n originalProcessPrependListener = process.prependListener\n originalProcessPrependOnceListener = process.prependOnceListener\n\n // Helper function to create a patched method that preserves toString behavior\n function patchMethod<T extends Function>(original: T, patchedImpl: T): T {\n // Preserve the original toString behavior\n Object.defineProperty(patchedImpl, 'toString', {\n value: original.toString.bind(original),\n writable: true,\n configurable: true,\n })\n return patchedImpl\n }\n\n // Intercept process.on to capture new unhandled rejection handlers\n process.on = patchMethod(originalProcessOn, function (\n event: string | symbol,\n listener: (...args: any[]) => void\n ) {\n if (event === 'unhandledRejection') {\n // Add new handlers to our internal queue instead of the process\n underlyingListeners.push(listener as NodeJS.UnhandledRejectionListener)\n listenerMetadata.push({ listener, once: false })\n return process\n }\n // For other events, use the original method\n return originalProcessOn.call(process, event, listener)\n } as typeof process.on)\n\n // Intercept process.addListener (alias for process.on)\n process.addListener = patchMethod(\n originalProcessAddListener,\n process.on as typeof originalProcessAddListener\n )\n\n // Intercept process.once for one-time handlers\n process.once = patchMethod(originalProcessOnce, function (\n event: string | symbol,\n listener: (...args: any[]) => void\n ) {\n if (event === 'unhandledRejection') {\n underlyingListeners.push(listener)\n listenerMetadata.push({ listener, once: true })\n return process\n }\n // For other events, use the original method\n return originalProcessOnce.call(process, event, listener)\n } as typeof process.once)\n\n // Intercept process.prependListener for handlers that should go first\n process.prependListener = patchMethod(\n originalProcessPrependListener,\n function (event: string | symbol, listener: (...args: any[]) => void) {\n if (event === 'unhandledRejection') {\n if (didWarnPrepend === false) {\n didWarnPrepend = true\n console.warn(\n 'Warning: `prependListener(\"unhandledRejection\")` called, but Next.js maintains the first listener ' +\n 'which filters out unnecessary events from aborted prerenders. Your handler will be second.'\n )\n }\n // Add new handlers to the beginning of our internal queue\n underlyingListeners.unshift(\n listener as NodeJS.UnhandledRejectionListener\n )\n listenerMetadata.unshift({ listener, once: false })\n return process\n }\n // For other events, use the original method\n return originalProcessPrependListener.call(\n process,\n event as any,\n listener\n )\n } as typeof process.prependListener\n )\n\n // Intercept process.prependOnceListener for one-time handlers that should go first\n process.prependOnceListener = patchMethod(\n originalProcessPrependOnceListener,\n function (event: string | symbol, listener: (...args: any[]) => void) {\n if (event === 'unhandledRejection') {\n if (didWarnPrepend === false) {\n didWarnPrepend = true\n console.warn(\n 'Warning: `prependOnceListener(\"unhandledRejection\")` called, but Next.js maintains the first listener ' +\n 'which filters out unnecessary events from aborted prerenders. Your handler will be second.'\n )\n }\n // Add to the beginning of our internal queue\n underlyingListeners.unshift(listener)\n listenerMetadata.unshift({ listener, once: true })\n return process\n }\n // For other events, use the original method\n return originalProcessPrependOnceListener.call(\n process,\n event as any,\n listener\n )\n } as typeof process.prependOnceListener\n )\n\n // Intercept process.removeListener\n process.removeListener = patchMethod(originalProcessRemoveListener, function (\n event: string | symbol,\n listener: (...args: any[]) => void\n ) {\n if (event === 'unhandledRejection') {\n // Check if they're trying to remove our filtering handler\n if (listener === filteringUnhandledRejectionHandler) {\n uninstallUnhandledRejectionFilter()\n return process\n }\n\n const index = underlyingListeners.lastIndexOf(listener)\n if (index > -1) {\n underlyingListeners.splice(index, 1)\n listenerMetadata.splice(index, 1)\n }\n return process\n }\n // For other events, use the original method\n return originalProcessRemoveListener.call(process, event, listener)\n } as typeof process.removeListener)\n\n // Intercept process.off (alias for process.removeListener)\n process.off = patchMethod(\n originalProcessOff,\n process.removeListener as typeof originalProcessOff\n )\n\n // Intercept process.removeAllListeners\n process.removeAllListeners = patchMethod(\n originalProcessRemoveAllListeners,\n function (event?: string | symbol) {\n if (event === 'unhandledRejection') {\n if (didWarnRemoveAll === false) {\n didWarnRemoveAll = true\n console.warn(\n 'Warning: `removeAllListeners(\"unhandledRejection\")` called. Next.js maintains an `unhandledRejection` listener ' +\n 'to filter out unnecessary rejection warnings caused by aborting prerenders early. It is not recommended that you ' +\n 'uninstall this behavior, but if you want to you must call `process.removeListener(\"unhandledRejection\", listener)`. ' +\n 'You can acquire the listener from `process.listeners(\"unhandledRejection\")[0]`.'\n )\n }\n underlyingListeners.length = 0\n listenerMetadata.length = 0\n return process\n }\n\n // For other specific events, use the original method\n if (event !== undefined) {\n return originalProcessRemoveAllListeners.call(process, event)\n }\n\n // If no event specified (removeAllListeners()), uninstall our patch completely\n console.warn(\n 'Warning: `removeAllListeners()` called - uninstalling Next.js unhandled rejection filter. ' +\n 'You will observe `unhandledRejection` logs from prerendering which are not problematic.'\n )\n uninstallUnhandledRejectionFilter()\n return originalProcessRemoveAllListeners.call(process)\n } as typeof process.removeAllListeners\n )\n\n // Intercept process.listeners to return our internal handlers for unhandled rejection\n process.listeners = patchMethod(originalProcessListeners, function (\n event: string | symbol\n ) {\n if (event === 'unhandledRejection') {\n return [filteringUnhandledRejectionHandler, ...underlyingListeners]\n }\n return originalProcessListeners.call(process, event as any)\n } as typeof process.listeners)\n\n // Remove all existing handlers\n originalProcessRemoveAllListeners.call(process, 'unhandledRejection')\n\n // Install our filtering handler\n originalProcessOn.call(\n process,\n 'unhandledRejection',\n filteringUnhandledRejectionHandler\n )\n\n originalProcessOn.call(process, 'rejectionHandled', noopRejectionHandled)\n\n filterInstalled = true\n}\n\n/**\n * Uninstalls the unhandled rejection filter and restores original process methods.\n * This is called when someone explicitly removes our filtering handler.\n * @internal\n */\nfunction uninstallUnhandledRejectionFilter(): void {\n if (!filterInstalled) {\n return\n }\n\n // Restore original process methods\n process.on = originalProcessOn\n process.addListener = originalProcessAddListener\n process.once = originalProcessOnce\n process.prependListener = originalProcessPrependListener\n process.prependOnceListener = originalProcessPrependOnceListener\n process.removeListener = originalProcessRemoveListener\n process.off = originalProcessOff\n process.removeAllListeners = originalProcessRemoveAllListeners\n process.listeners = originalProcessListeners\n\n // Remove our filtering handler\n originalProcessRemoveListener.call(\n process,\n 'unhandledRejection',\n filteringUnhandledRejectionHandler\n )\n\n originalProcessRemoveListener.call(\n process,\n 'rejectionHandled',\n noopRejectionHandled\n )\n\n // Re-register all the handlers that were in our internal queue\n for (const meta of listenerMetadata) {\n if (meta.once) {\n originalProcessOnce.call(process, 'unhandledRejection', meta.listener)\n } else {\n originalProcessOn.call(process, 'unhandledRejection', meta.listener)\n }\n }\n\n // Reset state\n filterInstalled = false\n underlyingListeners.length = 0\n listenerMetadata.length = 0\n}\n\n/**\n * The filtering handler that decides whether to suppress or delegate unhandled rejections.\n */\nfunction filteringUnhandledRejectionHandler(\n reason: any,\n promise: Promise<any>\n): void {\n const capturedListenerMetadata = Array.from(listenerMetadata)\n\n const workUnitStore = workUnitAsyncStorage.getStore()\n\n if (workUnitStore) {\n switch (workUnitStore.type) {\n case 'prerender':\n case 'prerender-client':\n case 'prerender-runtime': {\n const signal = workUnitStore.renderSignal\n if (signal.aborted) {\n // This unhandledRejection is from async work spawned in a now\n // aborted prerender. We don't need to report this.\n return\n }\n break\n }\n case 'prerender-ppr':\n case 'prerender-legacy':\n case 'request':\n case 'cache':\n case 'private-cache':\n case 'unstable-cache':\n break\n default:\n workUnitStore satisfies never\n }\n }\n\n // Not from an aborted prerender, delegate to original handlers\n if (capturedListenerMetadata.length === 0) {\n // We need to log something because the default behavior when there is\n // no event handler installed is to trigger an Unhandled Exception.\n // We don't do that here b/c we don't want to rely on this implicit default\n // to kill the process since it can be disabled by installing a userland listener\n // and you may also choose to run Next.js with args such that unhandled rejections\n // do not automatically terminate the process.\n console.error('Unhandled Rejection:', reason)\n } else {\n try {\n for (const meta of capturedListenerMetadata) {\n if (meta.once) {\n // This is a once listener. we remove it from our set before we call it\n const index = listenerMetadata.indexOf(meta)\n if (index !== -1) {\n underlyingListeners.splice(index, 1)\n listenerMetadata.splice(index, 1)\n }\n }\n const listener = meta.listener\n listener(reason, promise)\n }\n } catch (error) {\n // If any handlers error we produce an Uncaught Exception\n setImmediate(() => {\n throw error\n })\n }\n }\n}\n\nfunction noopRejectionHandled() {}\n\n// Install the filter when this module is imported\ninstallUnhandledRejectionFilter()\n"],"names":["filterInstalled","underlyingListeners","listenerMetadata","originalProcessOn","originalProcessAddListener","originalProcessOnce","originalProcessRemoveListener","originalProcessRemoveAllListeners","originalProcessListeners","originalProcessPrependListener","originalProcessPrependOnceListener","originalProcessOff","didWarnPrepend","didWarnRemoveAll","installUnhandledRejectionFilter","Array","from","process","listeners","map","l","listener","once","on","addListener","off","removeListener","removeAllListeners","prependListener","prependOnceListener","patchMethod","original","patchedImpl","Object","defineProperty","value","toString","bind","writable","configurable","event","push","call","console","warn","unshift","filteringUnhandledRejectionHandler","uninstallUnhandledRejectionFilter","index","lastIndexOf","splice","length","undefined","noopRejectionHandled","meta","reason","promise","capturedListenerMetadata","workUnitStore","workUnitAsyncStorage","getStore","type","signal","renderSignal","aborted","error","indexOf","setImmediate"],"mappings":"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","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../src/server/node-environment-extensions/unhandled-rejection.tsx"],"sourcesContent":["/**\n * Manages unhandled rejection listeners to intelligently filter rejections\n * from aborted prerenders when cache components are enabled.\n *\n * THE PROBLEM:\n * When we abort prerenders we expect to find numerous unhandled promise rejections due to\n * things like awaiting Request data like `headers()`. The rejections are fine and should\n * not be construed as problematic so we need to avoid the appearance of a problem by\n * omitting them from the logged output.\n *\n * THE STRATEGY:\n * 1. Install a filtering unhandled rejection handler\n * 2. Intercept process event methods to capture new handlers in our internal queue\n * 3. For each rejection, check if it comes from an aborted prerender context\n * 4. If yes, suppress it. If no, delegate to all handlers in our queue\n * 5. This provides precise filtering without time-based windows\n *\n * This ensures we suppress noisy prerender-related rejections while preserving\n * normal error logging for genuine unhandled rejections.\n */\n\nimport { workUnitAsyncStorage } from '../app-render/work-unit-async-storage.external'\n\nconst MODE:\n | 'enabled'\n | 'debug'\n | 'true'\n | 'false'\n | '1'\n | '0'\n | ''\n | string\n | undefined = process.env.NEXT_USE_UNHANDLED_REJECTION_FILTER\n\nlet ENABLE_UHR_FILTER = false\nlet DEBUG_UHR_FILTER = false\n\nswitch (MODE) {\n case 'debug':\n DEBUG_UHR_FILTER = true\n // fallthrough\n case 'enabled':\n case 'true':\n case '1':\n ENABLE_UHR_FILTER = true\n break\n case 'false':\n case 'disabled':\n case '0':\n case '':\n case undefined:\n break\n default:\n if (typeof MODE === 'string') {\n console.error(\n `NEXT_USE_UNHANDLED_REJECTION_FILTER has an unrecognized value: ${JSON.stringify(MODE)}. Use \"enabled\", \"disabled\", or \"debug\" or omit the environment variable altogether`\n )\n }\n}\n\nconst debug = DEBUG_UHR_FILTER\n ? (...args: any[]) =>\n console.log('[UNHANDLED REJECTION DEBUG]', ...args, new Error().stack)\n : undefined\n\ntype ListenerMetadata = {\n listener: NodeJS.UnhandledRejectionListener\n once: boolean\n}\n\nlet filterInstalled = false\n\n// We store the proxied listeners for unhandled rejections here.\nlet underlyingListeners: Array<NodeJS.UnhandledRejectionListener> = []\n// We store a unique pointer to each event listener registration to track\n// details like whether the listener is a once listener.\nlet listenerMetadata: Array<ListenerMetadata> = []\n\nlet originalProcessOn: typeof process.on\nlet originalProcessAddListener: typeof process.addListener\nlet originalProcessOnce: typeof process.once\nlet originalProcessRemoveListener: typeof process.removeListener\nlet originalProcessRemoveAllListeners: typeof process.removeAllListeners\nlet originalProcessListeners: typeof process.listeners\nlet originalProcessPrependListener: typeof process.prependListener\nlet originalProcessPrependOnceListener: typeof process.prependOnceListener\nlet originalProcessOff: typeof process.off\n\nlet didWarnPrepend = false\nlet didWarnRemoveAll = false\n\n/**\n * Installs a filtering unhandled rejection handler that intelligently suppresses\n * rejections from aborted prerender contexts.\n *\n * This should be called once during server startup to install the global filter.\n */\nfunction installUnhandledRejectionFilter(): void {\n if (filterInstalled) {\n debug?.('unexpected second install')\n return\n }\n\n debug?.(\n 'installUnhandledRejectionFilter',\n process.listeners('unhandledRejection').map((l) => l.toString())\n )\n\n // Capture existing handlers\n underlyingListeners = Array.from(process.listeners('unhandledRejection'))\n // We assume all existing handlers are not \"once\"\n listenerMetadata = underlyingListeners.map((l) => ({\n listener: l,\n once: false,\n }))\n\n // Store the original process methods\n originalProcessOn = process.on\n originalProcessAddListener = process.addListener\n originalProcessOnce = process.once\n originalProcessOff = process.off\n originalProcessRemoveListener = process.removeListener\n originalProcessRemoveAllListeners = process.removeAllListeners\n originalProcessListeners = process.listeners\n originalProcessPrependListener = process.prependListener\n originalProcessPrependOnceListener = process.prependOnceListener\n\n // Helper function to create a patched method that preserves toString behavior\n function patchMethod<T extends Function>(original: T, patchedImpl: T): T {\n // Preserve the original toString behavior\n Object.defineProperty(patchedImpl, 'toString', {\n value: original.toString.bind(original),\n writable: true,\n configurable: true,\n })\n return patchedImpl\n }\n\n // Intercept process.on to capture new unhandled rejection handlers\n process.on = patchMethod(originalProcessOn, function (\n event: string | symbol,\n listener: (...args: any[]) => void\n ) {\n if (event === 'unhandledRejection') {\n debug?.('process.on/addListener', listener.toString())\n // Add new handlers to our internal queue instead of the process\n underlyingListeners.push(listener as NodeJS.UnhandledRejectionListener)\n listenerMetadata.push({ listener, once: false })\n return process\n }\n // For other events, use the original method\n return originalProcessOn.call(process, event, listener)\n } as typeof process.on)\n\n // Intercept process.addListener (alias for process.on)\n process.addListener = patchMethod(\n originalProcessAddListener,\n process.on as typeof originalProcessAddListener\n )\n\n // Intercept process.once for one-time handlers\n process.once = patchMethod(originalProcessOnce, function (\n event: string | symbol,\n listener: (...args: any[]) => void\n ) {\n if (event === 'unhandledRejection') {\n debug?.('process.once', listener.toString())\n underlyingListeners.push(listener)\n listenerMetadata.push({ listener, once: true })\n return process\n }\n // For other events, use the original method\n return originalProcessOnce.call(process, event, listener)\n } as typeof process.once)\n\n // Intercept process.prependListener for handlers that should go first\n process.prependListener = patchMethod(\n originalProcessPrependListener,\n function (event: string | symbol, listener: (...args: any[]) => void) {\n if (event === 'unhandledRejection') {\n debug?.('process.prependListener', listener.toString())\n if (didWarnPrepend === false) {\n didWarnPrepend = true\n console.warn(\n 'Warning: `prependListener(\"unhandledRejection\")` called, but Next.js maintains the first listener ' +\n 'which filters out unnecessary events from aborted prerenders. Your handler will be second.'\n )\n }\n // Add new handlers to the beginning of our internal queue\n underlyingListeners.unshift(\n listener as NodeJS.UnhandledRejectionListener\n )\n listenerMetadata.unshift({ listener, once: false })\n return process\n }\n // For other events, use the original method\n return originalProcessPrependListener.call(\n process,\n event as any,\n listener\n )\n } as typeof process.prependListener\n )\n\n // Intercept process.prependOnceListener for one-time handlers that should go first\n process.prependOnceListener = patchMethod(\n originalProcessPrependOnceListener,\n function (event: string | symbol, listener: (...args: any[]) => void) {\n if (event === 'unhandledRejection') {\n debug?.('process.prependOnceListener', listener.toString())\n if (didWarnPrepend === false) {\n didWarnPrepend = true\n console.warn(\n 'Warning: `prependOnceListener(\"unhandledRejection\")` called, but Next.js maintains the first listener ' +\n 'which filters out unnecessary events from aborted prerenders. Your handler will be second.'\n )\n }\n // Add to the beginning of our internal queue\n underlyingListeners.unshift(listener)\n listenerMetadata.unshift({ listener, once: true })\n return process\n }\n // For other events, use the original method\n return originalProcessPrependOnceListener.call(\n process,\n event as any,\n listener\n )\n } as typeof process.prependOnceListener\n )\n\n // Intercept process.removeListener\n process.removeListener = patchMethod(originalProcessRemoveListener, function (\n event: string | symbol,\n listener: (...args: any[]) => void\n ) {\n if (event === 'unhandledRejection') {\n debug?.('process.removeListener', listener.toString())\n // Check if they're trying to remove our filtering handler\n if (listener === filteringUnhandledRejectionHandler) {\n uninstallUnhandledRejectionFilter()\n return process\n }\n\n const index = underlyingListeners.lastIndexOf(listener)\n if (index > -1) {\n debug?.('process.removeListener match found', index)\n underlyingListeners.splice(index, 1)\n listenerMetadata.splice(index, 1)\n } else {\n debug?.('process.removeListener match not found', index)\n }\n return process\n }\n // For other events, use the original method\n return originalProcessRemoveListener.call(process, event, listener)\n } as typeof process.removeListener)\n\n // Intercept process.off (alias for process.removeListener)\n process.off = patchMethod(\n originalProcessOff,\n process.removeListener as typeof originalProcessOff\n )\n\n // Intercept process.removeAllListeners\n process.removeAllListeners = patchMethod(\n originalProcessRemoveAllListeners,\n function (event?: string | symbol) {\n if (event === 'unhandledRejection') {\n debug?.(\n 'process.removeAllListeners',\n underlyingListeners.map((l) => l.toString())\n )\n if (didWarnRemoveAll === false) {\n didWarnRemoveAll = true\n console.warn(\n 'Warning: `removeAllListeners(\"unhandledRejection\")` called. Next.js maintains an `unhandledRejection` listener ' +\n 'to filter out unnecessary rejection warnings caused by aborting prerenders early. It is not recommended that you ' +\n 'uninstall this behavior, but if you want to you must call `process.removeListener(\"unhandledRejection\", listener)`. ' +\n 'You can acquire the listener from `process.listeners(\"unhandledRejection\")[0]`.'\n )\n }\n underlyingListeners.length = 0\n listenerMetadata.length = 0\n return process\n }\n\n // For other specific events, use the original method\n if (event !== undefined) {\n return originalProcessRemoveAllListeners.call(process, event)\n }\n\n // If no event specified (removeAllListeners()), uninstall our patch completely\n console.warn(\n 'Warning: `removeAllListeners()` called - uninstalling Next.js unhandled rejection filter. ' +\n 'You will observe `unhandledRejection` logs from prerendering which are not problematic.'\n )\n uninstallUnhandledRejectionFilter()\n return originalProcessRemoveAllListeners.call(process)\n } as typeof process.removeAllListeners\n )\n\n // Intercept process.listeners to return our internal handlers for unhandled rejection\n process.listeners = patchMethod(originalProcessListeners, function (\n event: string | symbol\n ) {\n if (event === 'unhandledRejection') {\n debug?.(\n 'process.listeners',\n [filteringUnhandledRejectionHandler, ...underlyingListeners].map((l) =>\n l.toString()\n )\n )\n return [filteringUnhandledRejectionHandler, ...underlyingListeners]\n }\n return originalProcessListeners.call(process, event as any)\n } as typeof process.listeners)\n\n // Remove all existing handlers\n originalProcessRemoveAllListeners.call(process, 'unhandledRejection')\n\n // Install our filtering handler\n originalProcessOn.call(\n process,\n 'unhandledRejection',\n filteringUnhandledRejectionHandler\n )\n\n originalProcessOn.call(process, 'rejectionHandled', noopRejectionHandled)\n\n filterInstalled = true\n\n debug?.(\n 'after install actual listeners',\n originalProcessListeners\n .call(process, 'unhandledRejection' as any)\n .map((l) => l.toString())\n )\n\n debug?.(\n 'after install listeners',\n process.listeners('unhandledRejection').map((l) => l.toString())\n )\n}\n\n/**\n * Uninstalls the unhandled rejection filter and restores original process methods.\n * This is called when someone explicitly removes our filtering handler.\n * @internal\n */\nfunction uninstallUnhandledRejectionFilter(): void {\n if (!filterInstalled) {\n debug?.('unexpected second uninstall')\n return\n }\n\n debug?.(\n 'uninstallUnhandledRejectionFilter',\n [filteringUnhandledRejectionHandler, ...underlyingListeners].map((l) =>\n l.toString()\n )\n )\n\n // Restore original process methods\n process.on = originalProcessOn\n process.addListener = originalProcessAddListener\n process.once = originalProcessOnce\n process.prependListener = originalProcessPrependListener\n process.prependOnceListener = originalProcessPrependOnceListener\n process.removeListener = originalProcessRemoveListener\n process.off = originalProcessOff\n process.removeAllListeners = originalProcessRemoveAllListeners\n process.listeners = originalProcessListeners\n\n // Remove our filtering handler\n originalProcessRemoveListener.call(\n process,\n 'unhandledRejection',\n filteringUnhandledRejectionHandler\n )\n\n originalProcessRemoveListener.call(\n process,\n 'rejectionHandled',\n noopRejectionHandled\n )\n\n // Re-register all the handlers that were in our internal queue\n for (const meta of listenerMetadata) {\n if (meta.once) {\n originalProcessOnce.call(process, 'unhandledRejection', meta.listener)\n } else {\n originalProcessOn.call(process, 'unhandledRejection', meta.listener)\n }\n }\n\n // Reset state\n filterInstalled = false\n underlyingListeners.length = 0\n listenerMetadata.length = 0\n\n debug?.(\n 'after uninstall',\n process.listeners('unhandledRejection').map((l) => l.toString())\n )\n}\n\n/**\n * The filtering handler that decides whether to suppress or delegate unhandled rejections.\n */\nfunction filteringUnhandledRejectionHandler(\n reason: any,\n promise: Promise<any>\n): void {\n const capturedListenerMetadata = Array.from(listenerMetadata)\n\n const workUnitStore = workUnitAsyncStorage.getStore()\n\n if (workUnitStore) {\n switch (workUnitStore.type) {\n case 'prerender':\n case 'prerender-client':\n case 'prerender-runtime': {\n const signal = workUnitStore.renderSignal\n if (signal.aborted) {\n // This unhandledRejection is from async work spawned in a now\n // aborted prerender. We don't need to report this.\n return\n }\n break\n }\n case 'prerender-ppr':\n case 'prerender-legacy':\n case 'request':\n case 'cache':\n case 'private-cache':\n case 'unstable-cache':\n break\n default:\n workUnitStore satisfies never\n }\n }\n\n // Not from an aborted prerender, delegate to original handlers\n if (capturedListenerMetadata.length === 0) {\n // We need to log something because the default behavior when there is\n // no event handler installed is to trigger an Unhandled Exception.\n // We don't do that here b/c we don't want to rely on this implicit default\n // to kill the process since it can be disabled by installing a userland listener\n // and you may also choose to run Next.js with args such that unhandled rejections\n // do not automatically terminate the process.\n console.error('Unhandled Rejection:', reason)\n } else {\n try {\n for (const meta of capturedListenerMetadata) {\n if (meta.once) {\n // This is a once listener. we remove it from our set before we call it\n const index = listenerMetadata.indexOf(meta)\n if (index !== -1) {\n underlyingListeners.splice(index, 1)\n listenerMetadata.splice(index, 1)\n }\n }\n const listener = meta.listener\n listener(reason, promise)\n }\n } catch (error) {\n // If any handlers error we produce an Uncaught Exception\n setImmediate(() => {\n throw error\n })\n }\n }\n}\n\nfunction noopRejectionHandled() {}\n\n// Install the filter when this module is imported\nif (ENABLE_UHR_FILTER) {\n installUnhandledRejectionFilter()\n}\n"],"names":["MODE","process","env","NEXT_USE_UNHANDLED_REJECTION_FILTER","ENABLE_UHR_FILTER","DEBUG_UHR_FILTER","undefined","console","error","JSON","stringify","debug","args","log","Error","stack","filterInstalled","underlyingListeners","listenerMetadata","originalProcessOn","originalProcessAddListener","originalProcessOnce","originalProcessRemoveListener","originalProcessRemoveAllListeners","originalProcessListeners","originalProcessPrependListener","originalProcessPrependOnceListener","originalProcessOff","didWarnPrepend","didWarnRemoveAll","installUnhandledRejectionFilter","listeners","map","l","toString","Array","from","listener","once","on","addListener","off","removeListener","removeAllListeners","prependListener","prependOnceListener","patchMethod","original","patchedImpl","Object","defineProperty","value","bind","writable","configurable","event","push","call","warn","unshift","filteringUnhandledRejectionHandler","uninstallUnhandledRejectionFilter","index","lastIndexOf","splice","length","noopRejectionHandled","meta","reason","promise","capturedListenerMetadata","workUnitStore","workUnitAsyncStorage","getStore","type","signal","renderSignal","aborted","indexOf","setImmediate"],"mappings":"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","ignoreList":[0]}
@@ -22,7 +22,7 @@ _export(exports, {
22
22
  });
23
23
  function isStableBuild() {
24
24
  var _process_env___NEXT_VERSION;
25
- return !((_process_env___NEXT_VERSION = "15.6.0-canary.2") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
25
+ return !((_process_env___NEXT_VERSION = "15.6.0-canary.4") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
26
26
  }
27
27
  class CanaryOnlyError extends Error {
28
28
  constructor(arg){
@@ -81,7 +81,7 @@ function getAnonymousMeta() {
81
81
  isWsl: _iswsl.default,
82
82
  isCI: _ciinfo.isCI,
83
83
  ciName: _ciinfo.isCI && _ciinfo.name || null,
84
- nextVersion: "15.6.0-canary.2"
84
+ nextVersion: "15.6.0-canary.4"
85
85
  };
86
86
  return traits;
87
87
  }
@@ -11,11 +11,11 @@ Object.defineProperty(exports, "eventCliSessionStopped", {
11
11
  const EVENT_VERSION = 'NEXT_CLI_SESSION_STOPPED';
12
12
  function eventCliSessionStopped(event) {
13
13
  // This should be an invariant, if it fails our build tooling is broken.
14
- if (typeof "15.6.0-canary.2" !== 'string') {
14
+ if (typeof "15.6.0-canary.4" !== 'string') {
15
15
  return [];
16
16
  }
17
17
  const payload = {
18
- nextVersion: "15.6.0-canary.2",
18
+ nextVersion: "15.6.0-canary.4",
19
19
  nodeVersion: process.version,
20
20
  cliCommand: event.cliCommand,
21
21
  durationMilliseconds: event.durationMilliseconds,
@@ -12,12 +12,12 @@ const EVENT_VERSION = 'NEXT_CLI_SESSION_STARTED';
12
12
  function eventCliSession(nextConfig, event) {
13
13
  var _nextConfig_experimental_staleTimes, _nextConfig_experimental_staleTimes1, _nextConfig_experimental_reactCompiler, _nextConfig_experimental_reactCompiler1;
14
14
  // This should be an invariant, if it fails our build tooling is broken.
15
- if (typeof "15.6.0-canary.2" !== 'string') {
15
+ if (typeof "15.6.0-canary.4" !== 'string') {
16
16
  return [];
17
17
  }
18
18
  const { images, i18n } = nextConfig || {};
19
19
  const payload = {
20
- nextVersion: "15.6.0-canary.2",
20
+ nextVersion: "15.6.0-canary.4",
21
21
  nodeVersion: process.version,
22
22
  cliCommand: event.cliCommand,
23
23
  isSrcDir: event.isSrcDir,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next",
3
- "version": "15.6.0-canary.2",
3
+ "version": "15.6.0-canary.4",
4
4
  "description": "The React Framework",
5
5
  "main": "./dist/server/next.js",
6
6
  "license": "MIT",
@@ -102,7 +102,7 @@
102
102
  ]
103
103
  },
104
104
  "dependencies": {
105
- "@next/env": "15.6.0-canary.2",
105
+ "@next/env": "15.6.0-canary.4",
106
106
  "@swc/helpers": "0.5.15",
107
107
  "caniuse-lite": "^1.0.30001579",
108
108
  "postcss": "8.4.31",
@@ -132,14 +132,14 @@
132
132
  },
133
133
  "optionalDependencies": {
134
134
  "sharp": "^0.34.3",
135
- "@next/swc-darwin-arm64": "15.6.0-canary.2",
136
- "@next/swc-darwin-x64": "15.6.0-canary.2",
137
- "@next/swc-linux-arm64-gnu": "15.6.0-canary.2",
138
- "@next/swc-linux-arm64-musl": "15.6.0-canary.2",
139
- "@next/swc-linux-x64-gnu": "15.6.0-canary.2",
140
- "@next/swc-linux-x64-musl": "15.6.0-canary.2",
141
- "@next/swc-win32-arm64-msvc": "15.6.0-canary.2",
142
- "@next/swc-win32-x64-msvc": "15.6.0-canary.2"
135
+ "@next/swc-darwin-arm64": "15.6.0-canary.4",
136
+ "@next/swc-darwin-x64": "15.6.0-canary.4",
137
+ "@next/swc-linux-arm64-gnu": "15.6.0-canary.4",
138
+ "@next/swc-linux-arm64-musl": "15.6.0-canary.4",
139
+ "@next/swc-linux-x64-gnu": "15.6.0-canary.4",
140
+ "@next/swc-linux-x64-musl": "15.6.0-canary.4",
141
+ "@next/swc-win32-arm64-msvc": "15.6.0-canary.4",
142
+ "@next/swc-win32-x64-msvc": "15.6.0-canary.4"
143
143
  },
144
144
  "devDependencies": {
145
145
  "@ampproject/toolbox-optimizer": "2.8.3",
@@ -174,11 +174,11 @@
174
174
  "@jest/types": "29.5.0",
175
175
  "@mswjs/interceptors": "0.23.0",
176
176
  "@napi-rs/triples": "1.2.0",
177
- "@next/font": "15.6.0-canary.2",
178
- "@next/polyfill-module": "15.6.0-canary.2",
179
- "@next/polyfill-nomodule": "15.6.0-canary.2",
180
- "@next/react-refresh-utils": "15.6.0-canary.2",
181
- "@next/swc": "15.6.0-canary.2",
177
+ "@next/font": "15.6.0-canary.4",
178
+ "@next/polyfill-module": "15.6.0-canary.4",
179
+ "@next/polyfill-nomodule": "15.6.0-canary.4",
180
+ "@next/react-refresh-utils": "15.6.0-canary.4",
181
+ "@next/swc": "15.6.0-canary.4",
182
182
  "@opentelemetry/api": "1.6.0",
183
183
  "@playwright/test": "1.51.1",
184
184
  "@rspack/core": "1.5.0",