Skip to content

Commit 3cbb3b2

Browse files
committed
fast immediates: initial implementation
1 parent e0ffdb6 commit 3cbb3b2

File tree

20 files changed

+797
-1
lines changed

20 files changed

+797
-1
lines changed

packages/next/errors.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -917,5 +917,7 @@
917917
"916": "Unexpected stream chunk while in Before stage",
918918
"917": "getFlightStream should always receive a ReadableStream when using the edge runtime",
919919
"918": "nodeStreamFromReadableStream cannot be used in the edge runtime",
920-
"919": "createNodeStreamFromChunks cannot be used in the edge runtime"
920+
"919": "createNodeStreamFromChunks cannot be used in the edge runtime",
921+
"920": "install() was not called",
922+
"921": "The \"callback\" argument must be of type function. Received %s"
921923
}

packages/next/src/server/app-render/app-render-prerender-utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { InvariantError } from '../../shared/lib/invariant-error'
2+
import { runPendingImmediatesAfterCurrentTask } from './fast-set-immediate.external'
23

34
/**
45
* This is a utility function to make scheduling sequential tasks that run back to back easier.
@@ -16,6 +17,7 @@ export function prerenderAndAbortInSequentialTasks<R>(
1617
return new Promise((resolve, reject) => {
1718
let pendingResult: Promise<R>
1819
setTimeout(() => {
20+
runPendingImmediatesAfterCurrentTask()
1921
try {
2022
pendingResult = prerender()
2123
pendingResult.catch(() => {})
@@ -48,6 +50,7 @@ export function prerenderAndAbortInSequentialTasksWithStages<R>(
4850
return new Promise((resolve, reject) => {
4951
let pendingResult: Promise<R>
5052
setTimeout(() => {
53+
runPendingImmediatesAfterCurrentTask()
5154
try {
5255
pendingResult = prerender()
5356
pendingResult.catch(() => {})
@@ -56,6 +59,7 @@ export function prerenderAndAbortInSequentialTasksWithStages<R>(
5659
}
5760
}, 0)
5861
setTimeout(() => {
62+
runPendingImmediatesAfterCurrentTask()
5963
advanceStage()
6064
}, 0)
6165
setTimeout(() => {

packages/next/src/server/app-render/app-render-render-utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { InvariantError } from '../../shared/lib/invariant-error'
2+
import { runPendingImmediatesAfterCurrentTask } from './fast-set-immediate.external'
23

34
/**
45
* This is a utility function to make scheduling sequential tasks that run back to back easier.
@@ -16,6 +17,7 @@ export function scheduleInSequentialTasks<R>(
1617
return new Promise((resolve, reject) => {
1718
let pendingResult: R | Promise<R>
1819
setTimeout(() => {
20+
runPendingImmediatesAfterCurrentTask()
1921
try {
2022
pendingResult = render()
2123
} catch (err) {
@@ -48,6 +50,7 @@ export function pipelineInSequentialTasks<A, B, C>(
4850
return new Promise((resolve, reject) => {
4951
let oneResult: A
5052
setTimeout(() => {
53+
runPendingImmediatesAfterCurrentTask()
5154
try {
5255
oneResult = one()
5356
} catch (err) {
@@ -60,6 +63,7 @@ export function pipelineInSequentialTasks<A, B, C>(
6063

6164
let twoResult: B
6265
const twoId = setTimeout(() => {
66+
runPendingImmediatesAfterCurrentTask()
6367
// if `one` threw, then this timeout would've been cleared,
6468
// so if we got here, we're guaranteed to have a value.
6569
try {

0 commit comments

Comments
 (0)