@@ -26,7 +26,8 @@ export opaque type LanePriority =
2626 | 13
2727 | 14
2828 | 15
29- | 16 ;
29+ | 16
30+ | 17 ;
3031export opaque type Lanes = number ;
3132export opaque type Lane = number ;
3233export opaque type LaneMap < T > = Array < T > ;
@@ -42,23 +43,25 @@ import {
4243 NoPriority as NoSchedulerPriority ,
4344} from './SchedulerWithReactIntegration.new' ;
4445
45- export const SyncLanePriority : LanePriority = 16 ;
46- const SyncBatchedLanePriority : LanePriority = 15 ;
46+ export const SyncLanePriority : LanePriority = 17 ;
47+ const SyncBatchedLanePriority : LanePriority = 16 ;
4748
48- const InputDiscreteHydrationLanePriority : LanePriority = 14 ;
49- export const InputDiscreteLanePriority : LanePriority = 13 ;
49+ const InputDiscreteHydrationLanePriority : LanePriority = 15 ;
50+ export const InputDiscreteLanePriority : LanePriority = 14 ;
5051
51- const InputContinuousHydrationLanePriority : LanePriority = 12 ;
52- export const InputContinuousLanePriority : LanePriority = 11 ;
52+ const InputContinuousHydrationLanePriority : LanePriority = 13 ;
53+ export const InputContinuousLanePriority : LanePriority = 12 ;
5354
54- const DefaultHydrationLanePriority : LanePriority = 10 ;
55- export const DefaultLanePriority : LanePriority = 9 ;
55+ const DefaultHydrationLanePriority : LanePriority = 11 ;
56+ export const DefaultLanePriority : LanePriority = 10 ;
5657
57- const TransitionShortHydrationLanePriority : LanePriority = 8 ;
58- export const TransitionShortLanePriority : LanePriority = 7 ;
58+ const TransitionShortHydrationLanePriority : LanePriority = 9 ;
59+ export const TransitionShortLanePriority : LanePriority = 8 ;
5960
60- const TransitionLongHydrationLanePriority : LanePriority = 6 ;
61- export const TransitionLongLanePriority : LanePriority = 5 ;
61+ const TransitionLongHydrationLanePriority : LanePriority = 7 ;
62+ export const TransitionLongLanePriority : LanePriority = 6 ;
63+
64+ const RetryLanePriority : LanePriority = 5 ;
6265
6366const SelectiveHydrationLanePriority : LanePriority = 4 ;
6467
@@ -90,25 +93,30 @@ const InputContinuousUpdateRangeStart = 6;
9093const InputContinuousUpdateRangeEnd = 8 ;
9194
9295export const DefaultHydrationLane : Lane = /* */ 0b0000000000000000000000100000000 ;
93- const DefaultLanes : Lanes = /* */ 0b0000000000000000011111100000000 ;
96+ export const DefaultLanes : Lanes = /* */ 0b0000000000000000000111100000000 ;
9497const DefaultUpdateRangeStart = 9 ;
95- const DefaultUpdateRangeEnd = 14 ;
98+ const DefaultUpdateRangeEnd = 12 ;
99+
100+ const TransitionShortHydrationLane : Lane = /* */ 0b0000000000000000001000000000000 ;
101+ const TransitionShortLanes : Lanes = /* */ 0b0000000000000011111000000000000 ;
102+ const TransitionShortUpdateRangeStart = 13 ;
103+ const TransitionShortUpdateRangeEnd = 17 ;
96104
97- const TransitionShortHydrationLane : Lane = /* */ 0b0000000000000000100000000000000 ;
98- const TransitionShortLanes : Lanes = /* */ 0b0000000000011111100000000000000 ;
99- const TransitionShortUpdateRangeStart = 15 ;
100- const TransitionShortUpdateRangeEnd = 20 ;
105+ const TransitionLongHydrationLane : Lane = /* */ 0b0000000000000100000000000000000 ;
106+ const TransitionLongLanes : Lanes = /* */ 0b0000000001111100000000000000000 ;
107+ const TransitionLongUpdateRangeStart = 18 ;
108+ const TransitionLongUpdateRangeEnd = 22 ;
101109
102- const TransitionLongHydrationLane : Lane = /* */ 0b0000000000100000000000000000000 ;
103- const TransitionLongLanes : Lanes = /* */ 0b0000011111100000000000000000000 ;
104- const TransitionLongUpdateRangeStart = 21 ;
105- const TransitionLongUpdateRangeEnd = 26 ;
110+ // Includes all updates. Except Idle updates, which have special semantics.
111+ const UpdateRangeEnd = TransitionLongUpdateRangeEnd ;
106112
107- export const SelectiveHydrationLane : Lane = /* */ 0b0000110000000000000000000000000 ;
113+ const RetryLanes : Lanes = /* */ 0b0000011110000000000000000000000 ;
114+ const RetryRangeStart = 22 ;
115+ const RetryRangeEnd = 26 ;
116+
117+ export const SelectiveHydrationLane : Lane = /* */ 0b0000100000000000000000000000000 ;
108118const SelectiveHydrationRangeEnd = 27 ;
109119
110- // Includes all non-Idle updates
111- const UpdateRangeEnd = 27 ;
112120const NonIdleLanes = /* */ 0b0000111111111111111111111111111 ;
113121
114122export const IdleHydrationLane : Lane = /* */ 0b0001000000000000000000000000000 ;
@@ -206,6 +214,12 @@ function getHighestPriorityLanes(lanes: Lanes | Lane): Lanes {
206214 return transitionLongLanes ;
207215 }
208216 }
217+ const retryLanes = RetryLanes & lanes ;
218+ if ( retryLanes !== NoLanes ) {
219+ return_highestLanePriority = RetryLanePriority ;
220+ return_updateRangeEnd = RetryRangeEnd ;
221+ return retryLanes ;
222+ }
209223 if ( lanes & SelectiveHydrationLane ) {
210224 return_highestLanePriority = SelectiveHydrationLanePriority ;
211225 return_updateRangeEnd = SelectiveHydrationRangeEnd ;
@@ -275,6 +289,7 @@ export function lanePriorityToSchedulerPriority(
275289 case TransitionLongHydrationLanePriority :
276290 case TransitionLongLanePriority :
277291 case SelectiveHydrationLanePriority :
292+ case RetryLanePriority :
278293 return NormalSchedulerPriority ;
279294 case IdleHydrationLanePriority :
280295 case IdleLanePriority :
@@ -537,6 +552,9 @@ export function findUpdateLane(
537552 case TransitionLongLanePriority :
538553 // Should be handled by findTransitionLane instead
539554 break ;
555+ case RetryLanePriority :
556+ // Should be handled by findRetryLane instead
557+ break ;
540558 case IdleLanePriority :
541559 let lane = findLane ( IdleUpdateRangeStart , IdleUpdateRangeEnd , wipLanes ) ;
542560 if ( lane === NoLane ) {
@@ -604,6 +622,19 @@ export function findTransitionLane(
604622 ) ;
605623}
606624
625+ // To ensure consistency across multiple updates in the same event, this should
626+ // be pure function, so that it always returns the same lane for given inputs.
627+ export function findRetryLane ( wipLanes : Lanes ) : Lane {
628+ // This is a fork of `findUpdateLane` designed specifically for Suspense
629+ // "retries" — a special update that attempts to flip a Suspense boundary
630+ // from its placeholder state to its primary/resolved state.
631+ let lane = findLane ( RetryRangeStart , RetryRangeEnd , wipLanes ) ;
632+ if ( lane === NoLane ) {
633+ lane = pickArbitraryLane ( RetryLanes ) ;
634+ }
635+ return lane ;
636+ }
637+
607638function findLane ( start , end , skipLanes ) {
608639 // This finds the first bit between the `start` and `end` positions that isn't
609640 // in `skipLanes`.
@@ -808,6 +839,11 @@ export function getBumpedLaneForHydration(
808839 case TransitionLongLanePriority :
809840 lane = TransitionLongHydrationLane ;
810841 break ;
842+ case RetryLanePriority :
843+ // Shouldn't be reachable under normal circumstances, so there's no
844+ // dedicated lane for retry priority. Use the one for long transitions.
845+ lane = TransitionLongHydrationLane ;
846+ break ;
811847 case SelectiveHydrationLanePriority :
812848 lane = SelectiveHydrationLane ;
813849 break ;
0 commit comments