From 72b52e7c8679f69cd7b4e2dd4b356e3c4dee3ecb Mon Sep 17 00:00:00 2001 From: Lee Robinson Date: Sun, 22 Dec 2024 11:36:26 -0600 Subject: [PATCH] docs: update ISR self-hosting example code (#74211) Co-authored-by: JJ Kasper --- .../10-deploying/index.mdx | 95 ++++++++++--------- 1 file changed, 50 insertions(+), 45 deletions(-) diff --git a/docs/01-app/03-building-your-application/10-deploying/index.mdx b/docs/01-app/03-building-your-application/10-deploying/index.mdx index d8dcfec3536a5..8cce22c13cf30 100644 --- a/docs/01-app/03-building-your-application/10-deploying/index.mdx +++ b/docs/01-app/03-building-your-application/10-deploying/index.mdx @@ -220,11 +220,15 @@ module.exports = class CacheHandler { // Iterate over all entries in the cache for (let [key, value] of cache) { // If the value's tags include the specified tag, delete this entry - if (value.tags.some((tag) => tags.include(tag))) { + if (value.tags.some((tag) => tags.includes(tag))) { cache.delete(key) } } } + + // If you want to have temporary in memory cache for a single request that is reset + // before the next request you can leverage this method + public resetRequestCache() {} } ``` @@ -310,50 +314,51 @@ If you want to use `after` on custom infrastructure, check your provider documen
Reference: supporting `after` for serverless platforms Using `after` in a serverless context requires waiting for asynchronous tasks to finish after the response has been sent. In Next.js and Vercel, this is achieved using a primitive called `waitUntil(promise)`, which extends the lifetime of a serverless invocation until all promises passed to [`waitUntil`](https://vercel.com/docs/functions/functions-api-reference#waituntil) have settled. - - If you want your users to be able to run `after`, you will have to provide your implementation of `waitUntil` that behaves in an analogous way. - - When `after` is called, Next.js will access `waitUntil` like this: - - ```jsx - const RequestContext = globalThis[Symbol.for('@next/request-context')] - const contextValue = RequestContext?.get() - const waitUntil = context?.waitUntil - ``` - - Which means that `globalThis[Symbol.for('@next/request-context')]` is expected to contain an object like this: - - ```tsx - type NextRequestContext = { - get(): NextRequestContextValue | undefined - } - - type NextRequestContextValue = { - waitUntil?: (promise: Promise) => void - } - ``` - - Here is an example of the implementation. - - ```tsx - import { AsyncLocalStorage } from 'node:async_hooks' - - const RequestContextStorage = new AsyncLocalStorage() - - // Define and inject the accessor that next.js will use - const RequestContext: NextRequestContext = { - get() { - return RequestContextStorage.getStore() - }, - } - globalThis[Symbol.for('@next/request-context')] = RequestContext - - const handler = (req, res) => { - const contextValue = { waitUntil: YOUR_WAITUNTIL } - // Provide the value - return RequestContextStorage.run(contextValue, () => nextJsHandler(req, res)) - } - ``` + +If you want your users to be able to run `after`, you will have to provide your implementation of `waitUntil` that behaves in an analogous way. + +When `after` is called, Next.js will access `waitUntil` like this: + +```jsx +const RequestContext = globalThis[Symbol.for('@next/request-context')] +const contextValue = RequestContext?.get() +const waitUntil = context?.waitUntil +``` + +Which means that `globalThis[Symbol.for('@next/request-context')]` is expected to contain an object like this: + +```tsx +type NextRequestContext = { + get(): NextRequestContextValue | undefined +} + +type NextRequestContextValue = { + waitUntil?: (promise: Promise) => void +} +``` + +Here is an example of the implementation. + +```tsx +import { AsyncLocalStorage } from 'node:async_hooks' + +const RequestContextStorage = new AsyncLocalStorage() + +// Define and inject the accessor that next.js will use +const RequestContext: NextRequestContext = { + get() { + return RequestContextStorage.getStore() + }, +} +globalThis[Symbol.for('@next/request-context')] = RequestContext + +const handler = (req, res) => { + const contextValue = { waitUntil: YOUR_WAITUNTIL } + // Provide the value + return RequestContextStorage.run(contextValue, () => nextJsHandler(req, res)) +} +``` +