@@ -60,7 +60,11 @@ export function maybeMakeNetworkRequest<
60
60
) ;
61
61
}
62
62
case 'No' : {
63
- return [ wrapResolvedValue ( undefined ) , ( ) => { } ] ;
63
+ return loadNormalizationAstAndRetainQuery (
64
+ environment ,
65
+ artifact ,
66
+ variables ,
67
+ ) ;
64
68
}
65
69
case 'IfNecessary' : {
66
70
if (
@@ -82,7 +86,11 @@ export function maybeMakeNetworkRequest<
82
86
) ;
83
87
84
88
if ( result . kind === 'EnoughData' ) {
85
- return [ wrapResolvedValue ( undefined ) , ( ) => { } ] ;
89
+ return loadNormalizationAstAndRetainQuery (
90
+ environment ,
91
+ artifact ,
92
+ variables ,
93
+ ) ;
86
94
} else {
87
95
return makeNetworkRequest (
88
96
environment ,
@@ -109,6 +117,90 @@ function loadNormalizationAst(
109
117
}
110
118
}
111
119
120
+ type NormalizationAstRequestStatus =
121
+ | {
122
+ readonly kind : 'Disposed' ;
123
+ }
124
+ | {
125
+ readonly kind : 'Undisposed' ;
126
+ readonly retainedQuery : RetainedQuery ;
127
+ } ;
128
+
129
+ function loadNormalizationAstAndRetainQuery <
130
+ TReadFromStore extends UnknownTReadFromStore ,
131
+ TClientFieldValue ,
132
+ TArtifact extends
133
+ | RefetchQueryNormalizationArtifact
134
+ | IsographEntrypoint < TReadFromStore , TClientFieldValue , TNormalizationAst > ,
135
+ TNormalizationAst extends NormalizationAst | NormalizationAstLoader ,
136
+ > (
137
+ environment : IsographEnvironment ,
138
+ artifact : TArtifact ,
139
+ variables : ExtractParameters < TReadFromStore > ,
140
+ ) : ItemCleanupPair < PromiseWrapper < void , AnyError > > {
141
+ const root = { __link : ROOT_ID , __typename : artifact . concreteType } ;
142
+
143
+ const retainedQuery : RetainedQuery = {
144
+ normalizationAst : {
145
+ kind : 'Loading' ,
146
+ } ,
147
+ variables,
148
+ root,
149
+ } ;
150
+ let status : NormalizationAstRequestStatus = {
151
+ kind : 'Undisposed' ,
152
+ retainedQuery,
153
+ } ;
154
+ retainQuery ( environment , retainedQuery ) ;
155
+
156
+ switch ( artifact . networkRequestInfo . normalizationAst . kind ) {
157
+ case 'NormalizationAst' : {
158
+ retainedQuery . normalizationAst = {
159
+ kind : 'Ready' ,
160
+ value : artifact . networkRequestInfo . normalizationAst ,
161
+ } ;
162
+ break ;
163
+ }
164
+ case 'NormalizationAstLoader' : {
165
+ artifact . networkRequestInfo . normalizationAst
166
+ . loader ( )
167
+ . then ( ( normalizationAst ) => {
168
+ retainedQuery . normalizationAst = {
169
+ kind : 'Ready' ,
170
+ value : normalizationAst ,
171
+ } ;
172
+ } )
173
+ . catch ( ( ) => {
174
+ const didUnretainSomeQuery = unretainQuery (
175
+ environment ,
176
+ retainedQuery ,
177
+ ) ;
178
+ if ( didUnretainSomeQuery ) {
179
+ garbageCollectEnvironment ( environment ) ;
180
+ }
181
+ } ) ;
182
+ }
183
+ }
184
+
185
+ return [
186
+ wrapResolvedValue ( undefined ) ,
187
+ ( ) => {
188
+ if ( status . kind === 'Undisposed' ) {
189
+ const didUnretainSomeQuery = unretainQuery (
190
+ environment ,
191
+ status . retainedQuery ,
192
+ ) ;
193
+ if ( didUnretainSomeQuery ) {
194
+ garbageCollectEnvironment ( environment ) ;
195
+ }
196
+ }
197
+ status = {
198
+ kind : 'Disposed' ,
199
+ } ;
200
+ } ,
201
+ ] ;
202
+ }
203
+
112
204
export function makeNetworkRequest <
113
205
TReadFromStore extends UnknownTReadFromStore ,
114
206
TClientFieldValue ,
@@ -173,8 +265,11 @@ export function makeNetworkRequest<
173
265
variables ,
174
266
root ,
175
267
) ;
176
- const retainedQuery = {
177
- normalizationAst : normalizationAst . selections ,
268
+ const retainedQuery : RetainedQuery = {
269
+ normalizationAst : {
270
+ kind : 'Ready' ,
271
+ value : normalizationAst ,
272
+ } ,
178
273
variables,
179
274
root,
180
275
} ;
0 commit comments