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` |
||
---|---|---|
.. | ||
crates | ||
native | ||
package.json | ||
README.md | ||
turbo.json |
@next/swc
This package is responsible for swc compilation customized for next.js
Development
Run tests
cargo test
# Update snapshots and fixtures for tests
UPDATE=1 cargo test
Format code before submitting code
cargo fmt
Build the binary to integrate with next.js
pnpm build-native
Build wasm bindings to integrate with next.js
pnpm build-wasm
napi bindings feature matrix
Due to platform differences napi bindings selectively enables supported features. See below tables for the currently enabled features.
arch\platform | Linux(gnu) | Linux(musl) | Darwin | Win32 |
---|---|---|---|---|
ia32 | a,b,d,e | |||
x64 | a,b,d,e,f | a,b,d,e,f | a,b,d,e,f | a,b,d,e,f |
aarch64 | a,d,e,f | a,d,e,f | a,b,d,e,f | a,b,c,e |
- a:
turbo_tasks_malloc
, - b:
turbo_tasks_malloc_custom_allocator
, - c:
native-tls
, - d:
rustls-tls
, - e:
image-extended
(webp) - f:
plugin
Package hierarchies
@next/swc
consist of multiple rust packages to enable features. See below for the high level hierarchies.
flowchart TD
C(next-custom-transforms) --> A(napi)
C(next-custom-transforms) --> B(wasm)
D(next-core) --> A(napi)
E(next-build) --> A(napi)
F(next-api) --> A(napi)
C(next-custom-transforms) --> D
D(next-core) --> F(next-api)
D(next-core) --> E(next-build)
next-custom-transforms
: provides next-swc specific SWC transform visitors. Turbopack, and the plain next-swc bidnings (transform
) use these transforms. Since this is a bottom package can be imported in any place (turbopack / next-swc / wasm), it is important package do not contain specific dependencies. For example, using Turbopack's VC in this package will cause build failures to wasm bindings.next-core
: Implements Turbopack features for the next.js core functionality. This is also the place where Turbopack-specific transform providers (implementingCustomTransformer
) lives, which wraps swc's transformer in thenext-custom-transforms
.next-api
: Binding interface to the next.js provides a proper next.js functionality usingnext-core
.napi
/wasm
: The actual binding interfaces, napi for the node.js and wasm for the wasm. Note wasm bindings cannot import packages using turbopack's feature.
To add new swc transforms
- Implements a new visitor in
next-custom-transforms
. It is highly encouraged to useVisitMut
instead ofFold
for the performance reasons. - Implements a new
CustomTransformer
underpackages/next-swc/crates/next-core/src/next_shared/transforms
to make Turbopack's ecma transform plugin, then adjust corresponding rules inpackages/next-swc/crates/next-core/src/(next_client|next_server)/context.rs
.