2222 * Kept small intentionally: each page triggers an
2323 * activityRelations lookup per member via memberId index.
2424 * --concurrency <n> Max concurrent Temporal workflow starts per page (default: 20)
25- * --page-delay <ms> Milliseconds to wait between pages (default: 5000 )
25+ * --page-delay <ms> Milliseconds to wait between pages (default: 2000 )
2626 * --start-after <id> Resume from a specific memberId (exclusive, for restarts)
2727 * --dry-run Log what would be processed without starting workflows
2828 * --limit <n> Stop after triggering at most N workflows (for testing)
2929 * --max-pages <n> Stop after processing at most N pages (useful for dry-run testing)
30+ * --empty-page-delay <ms> Delay when a page has 0 broken members (default: same as --page-delay)
3031 * --workflow-delay <ms> Milliseconds to wait after each workflow start (default: 0)
3132 *
3233 * Environment Variables Required:
@@ -63,6 +64,7 @@ interface ScriptOptions {
6364 dryRun : boolean
6465 limit : number | null
6566 maxPages : number | null
67+ emptyPageDelayMs : number | null
6668}
6769
6870function parseArgs ( ) : ScriptOptions {
@@ -76,10 +78,17 @@ function parseArgs(): ScriptOptions {
7678
7779 const pageSize = parseInt ( getArg ( '--page-size' ) ?? '100' , 10 )
7880 const concurrency = parseInt ( getArg ( '--concurrency' ) ?? '20' , 10 )
79- const pageDelayMs = parseInt ( getArg ( '--page-delay' ) ?? '5000 ' , 10 )
81+ const pageDelayMs = parseInt ( getArg ( '--page-delay' ) ?? '2000 ' , 10 )
8082 const workflowDelayMs = parseInt ( getArg ( '--workflow-delay' ) ?? '0' , 10 )
8183 const startAfter = getArg ( '--start-after' ) ?? null
8284 const dryRun = args . includes ( '--dry-run' )
85+ const emptyPageDelayRaw = getArg ( '--empty-page-delay' )
86+ const emptyPageDelayMs = emptyPageDelayRaw !== undefined ? parseInt ( emptyPageDelayRaw , 10 ) : null
87+
88+ if ( emptyPageDelayMs !== null && ( isNaN ( emptyPageDelayMs ) || emptyPageDelayMs < 0 ) ) {
89+ log . error ( '--empty-page-delay must be a non-negative integer' )
90+ process . exit ( 1 )
91+ }
8392 const limitRaw = getArg ( '--limit' )
8493 const limit = limitRaw !== undefined ? parseInt ( limitRaw , 10 ) : null
8594 const maxPagesRaw = getArg ( '--max-pages' )
@@ -110,7 +119,7 @@ function parseArgs(): ScriptOptions {
110119 process . exit ( 1 )
111120 }
112121
113- return { pageSize, concurrency, pageDelayMs, workflowDelayMs, startAfter, dryRun, limit, maxPages }
122+ return { pageSize, concurrency, pageDelayMs, workflowDelayMs, startAfter, dryRun, limit, maxPages, emptyPageDelayMs }
114123}
115124
116125// Returns a page of distinct memberIds from memberOrganizations, cursor-based.
@@ -239,6 +248,7 @@ async function main() {
239248 log . info ( `Mode: ${ opts . dryRun ? 'DRY RUN' : 'LIVE' } ` )
240249 log . info ( `Limit: ${ opts . limit ?? '(none)' } ` )
241250 log . info ( `Max pages: ${ opts . maxPages ?? '(none)' } ` )
251+ log . info ( `Empty page delay: ${ opts . emptyPageDelayMs !== null ? `${ opts . emptyPageDelayMs } ms` : `same as page-delay (${ opts . pageDelayMs } ms)` } ` )
242252 log . info ( '=' . repeat ( 80 ) )
243253
244254 const dbConnection = await getDbConnection ( WRITE_DB_CONFIG ( ) )
@@ -350,8 +360,11 @@ async function main() {
350360 hasMore = false
351361 }
352362
353- if ( opts . pageDelayMs > 0 ) {
354- await new Promise ( ( resolve ) => setTimeout ( resolve , opts . pageDelayMs ) )
363+ const delayMs = brokenMembers . length === 0 && opts . emptyPageDelayMs !== null
364+ ? opts . emptyPageDelayMs
365+ : opts . pageDelayMs
366+ if ( delayMs > 0 ) {
367+ await new Promise ( ( resolve ) => setTimeout ( resolve , delayMs ) )
355368 }
356369 }
357370
0 commit comments