@@ -73,8 +73,8 @@ export class ConnectionResolver {
73
73
shouldQueryStandardValueSets = false ;
74
74
75
75
// To limit the number of concurrent requests, batch them per an env var.
76
- // By default there is no batching .
77
- this . requestBatchSize = env . getNumber ( 'SF_LIST_METADATA_BATCH_SIZE' , - 1 ) ;
76
+ // Default is 500. From testing we saw jsforce gets stuck on ~1K reqs .
77
+ this . requestBatchSize = env . getNumber ( 'SF_LIST_METADATA_BATCH_SIZE' , 500 ) ;
78
78
}
79
79
80
80
public async resolve (
@@ -171,12 +171,12 @@ export class ConnectionResolver {
171
171
172
172
// Send batched listMetadata requests based on the SF_LIST_METADATA_BATCH_SIZE env var.
173
173
private async sendBatchedRequests ( listMdQueries : string [ ] ) : Promise < RelevantFileProperties [ ] > {
174
- const listMetadataResponses : RelevantFileProperties [ ] = [ ] ;
174
+ let listMetadataResponses : RelevantFileProperties [ ] = [ ] ;
175
175
let listMetadataRequests : Array < Promise < RelevantFileProperties [ ] > > = [ ] ;
176
176
177
177
const sendIt = async ( ) : Promise < void > => {
178
178
const requestBatch = ( await Promise . all ( listMetadataRequests ) ) . flat ( ) ;
179
- listMetadataResponses . push ( ... requestBatch ) ;
179
+ listMetadataResponses = listMetadataResponses . concat ( requestBatch ) ;
180
180
} ;
181
181
182
182
// Make batched listMetadata requests
@@ -186,7 +186,7 @@ export class ConnectionResolver {
186
186
if ( q [ 1 ] ) {
187
187
listMdQuery . folder = q [ 1 ] ;
188
188
}
189
- listMetadataRequests . push ( listMembers ( this . registry ) ( this . connection ) ( listMdQuery ) ) ;
189
+ listMetadataRequests . push ( listMembers ( this . registry , this . connection , listMdQuery ) ) ;
190
190
i ++ ;
191
191
if ( this . requestBatchSize > 0 && i % this . requestBatchSize === 0 ) {
192
192
getLogger ( ) . debug ( `Awaiting listMetadata requests ${ i - this . requestBatchSize + 1 } - ${ i } ` ) ;
@@ -212,12 +212,12 @@ export class ConnectionResolver {
212
212
// SF_LIST_METADATA_BATCH_SIZE env var.
213
213
private async sendBatchedQueries ( ) : Promise < RelevantFileProperties [ ] > {
214
214
const mdType = this . registry . getTypeByName ( 'StandardValueSet' ) ;
215
- const queryResponses : RelevantFileProperties [ ] = [ ] ;
215
+ let queryResponses : RelevantFileProperties [ ] = [ ] ;
216
216
let queryRequests : Array < Promise < RelevantFileProperties | undefined > > = [ ] ;
217
217
218
218
const sendIt = async ( ) : Promise < void > => {
219
219
const requestBatch = ( await Promise . all ( queryRequests ) ) . flat ( ) ;
220
- queryResponses . push ( ... requestBatch . filter ( ( rb ) => ! ! rb ) ) ;
220
+ queryResponses = queryResponses . concat ( requestBatch . filter ( ( rb ) => ! ! rb ) ) ;
221
221
} ;
222
222
223
223
// Make batched query requests
@@ -270,57 +270,58 @@ const querySvs =
270
270
}
271
271
} ;
272
272
273
- const listMembers =
274
- ( registry : RegistryAccess ) =>
275
- ( connection : Connection ) =>
276
- async ( query : ListMetadataQuery ) : Promise < RelevantFileProperties [ ] > => {
277
- const mdType = registry . getTypeByName ( query . type ) ;
278
-
279
- // Workaround because metadata.list({ type: 'StandardValueSet' }) returns [].
280
- // Query for a subset of known StandardValueSets after all listMetadata calls.
281
- if ( mdType . name === registry . getRegistry ( ) . types . standardvalueset . name ) {
282
- shouldQueryStandardValueSets = true ;
283
- return [ ] ;
284
- }
285
-
286
- // Workaround because metadata.list({ type: 'BotVersion' }) returns [].
287
- if ( mdType . name === 'BotVersion' ) {
288
- try {
289
- const botDefQuery = 'SELECT Id, DeveloperName FROM BotDefinition' ;
290
- const botVersionQuery = 'SELECT BotDefinitionId, DeveloperName FROM BotVersion' ;
291
- const botDefs = ( await connection . query < { Id : string ; DeveloperName : string } > ( botDefQuery ) ) . records ;
292
- const botVersionDefs = (
293
- await connection . query < { BotDefinitionId : string ; DeveloperName : string } > ( botVersionQuery )
294
- ) . records ;
295
- return botVersionDefs
296
- . map ( ( bvd ) => {
297
- const botName = botDefs . find ( ( bd ) => bd . Id === bvd . BotDefinitionId ) ?. DeveloperName ;
298
- if ( botName ) {
299
- return {
300
- fullName : `${ botName } .${ bvd . DeveloperName } ` ,
301
- fileName : `bots/${ bvd . DeveloperName } .botVersion` ,
302
- type : 'BotVersion' ,
303
- } ;
304
- }
305
- } )
306
- . filter ( ( b ) => ! ! b ) ;
307
- } catch ( error ) {
308
- const err = SfError . wrap ( error ) ;
309
- getLogger ( ) . debug ( `[${ mdType . name } ] ${ err . message } ` ) ;
310
- return [ ] ;
311
- }
312
- }
273
+ async function listMembers (
274
+ registry : RegistryAccess ,
275
+ connection : Connection ,
276
+ query : ListMetadataQuery
277
+ ) : Promise < RelevantFileProperties [ ] > {
278
+ const mdType = registry . getTypeByName ( query . type ) ;
279
+
280
+ // Workaround because metadata.list({ type: 'StandardValueSet' }) returns [].
281
+ // Query for a subset of known StandardValueSets after all listMetadata calls.
282
+ if ( mdType . name === registry . getRegistry ( ) . types . standardvalueset . name ) {
283
+ shouldQueryStandardValueSets = true ;
284
+ return [ ] ;
285
+ }
313
286
287
+ // Workaround because metadata.list({ type: 'BotVersion' }) returns [].
288
+ if ( mdType . name === 'BotVersion' ) {
314
289
try {
315
- requestCount ++ ;
316
- getLogger ( ) . debug ( `listMetadata for ${ inspect ( query ) } ` ) ;
317
- return ( await connection . metadata . list ( query ) ) . map ( inferFilenamesFromType ( mdType ) ) ;
290
+ const botDefQuery = 'SELECT Id, DeveloperName FROM BotDefinition' ;
291
+ const botVersionQuery = 'SELECT BotDefinitionId, DeveloperName FROM BotVersion' ;
292
+ const botDefs = ( await connection . query < { Id : string ; DeveloperName : string } > ( botDefQuery ) ) . records ;
293
+ const botVersionDefs = (
294
+ await connection . query < { BotDefinitionId : string ; DeveloperName : string } > ( botVersionQuery )
295
+ ) . records ;
296
+ return botVersionDefs
297
+ . map ( ( bvd ) => {
298
+ const botName = botDefs . find ( ( bd ) => bd . Id === bvd . BotDefinitionId ) ?. DeveloperName ;
299
+ if ( botName ) {
300
+ return {
301
+ fullName : `${ botName } .${ bvd . DeveloperName } ` ,
302
+ fileName : `bots/${ bvd . DeveloperName } .botVersion` ,
303
+ type : 'BotVersion' ,
304
+ } ;
305
+ }
306
+ } )
307
+ . filter ( ( b ) => ! ! b ) ;
318
308
} catch ( error ) {
319
309
const err = SfError . wrap ( error ) ;
320
310
getLogger ( ) . debug ( `[${ mdType . name } ] ${ err . message } ` ) ;
321
311
return [ ] ;
322
312
}
323
- } ;
313
+ }
314
+
315
+ try {
316
+ requestCount ++ ;
317
+ getLogger ( ) . debug ( `listMetadata for ${ inspect ( query ) } ` ) ;
318
+ return ( await connection . metadata . list ( query ) ) . map ( inferFilenamesFromType ( mdType ) ) ;
319
+ } catch ( error ) {
320
+ const err = SfError . wrap ( error ) ;
321
+ getLogger ( ) . debug ( `[${ mdType . name } ] ${ err . message } ` ) ;
322
+ return [ ] ;
323
+ }
324
+ }
324
325
325
326
/* if the Metadata Type doesn't return a correct fileName then help it out */
326
327
const inferFilenamesFromType =
0 commit comments