79bebe7bd3
Implements `unstable_after`, which lets the user schedule work to be executed after the response is finished. ### Implementation notes - `unstable_after()` is a dynamic function (bypassable only with `export dynamic = "force-static"`) - Usable in: server components (including `generateMetadata`), actions, route handlers, middleware - It is meant to run its callbacks even if a response didn't complete successfully (thrown error) or called `notFound()`/`redirect()` - Currently gated behind a `experimental.after` feature flag, because it touches many runtime bits (including a React monkeypatch...) - The state for `unstable_after()` in a given request lives in `requestAsyncStorage` (added via `RequestAsyncStorageWrapper`) - the implementation is based around two functions that we inject via `renderOpts`: - `waitUntil(promise)` - keep a function invocation alive until a promise settles. it is provided as a platform primitive in serverless contexts, and a noop in `next start` - for serverless (nodejs), Next.js will attempt to get `waitUntil` from `globalThis[Symbol.for('@next/request-context')].get().waitUntil`. This should be considered unstable for now. See `packages/next/src/server/after/wait-until-builtin.ts` for details. - `onClose(callback)` **[NEW]** - run something when a response is done. basically `res.on('close', callback)`, but also implemented for Web APIs - unfortunately, for Web, this requires some potentially expensive tricks - see `packages/next/src/server/web/web-on-close.ts`
28 lines
1.2 KiB
JavaScript
28 lines
1.2 KiB
JavaScript
const serverExports = {
|
|
NextRequest: require('next/dist/server/web/spec-extension/request')
|
|
.NextRequest,
|
|
NextResponse: require('next/dist/server/web/spec-extension/response')
|
|
.NextResponse,
|
|
ImageResponse: require('next/dist/server/web/spec-extension/image-response')
|
|
.ImageResponse,
|
|
userAgentFromString: require('next/dist/server/web/spec-extension/user-agent')
|
|
.userAgentFromString,
|
|
userAgent: require('next/dist/server/web/spec-extension/user-agent')
|
|
.userAgent,
|
|
URLPattern: require('next/dist/server/web/spec-extension/url-pattern')
|
|
.URLPattern,
|
|
unstable_after: require('next/dist/server/after').unstable_after,
|
|
}
|
|
|
|
// https://nodejs.org/api/esm.html#commonjs-namespaces
|
|
// When importing CommonJS modules, the module.exports object is provided as the default export
|
|
module.exports = serverExports
|
|
|
|
// make import { xxx } from 'next/server' work
|
|
exports.NextRequest = serverExports.NextRequest
|
|
exports.NextResponse = serverExports.NextResponse
|
|
exports.ImageResponse = serverExports.ImageResponse
|
|
exports.userAgentFromString = serverExports.userAgentFromString
|
|
exports.userAgent = serverExports.userAgent
|
|
exports.URLPattern = serverExports.URLPattern
|
|
exports.unstable_after = serverExports.unstable_after
|