@@ -7,7 +7,8 @@ import { StatusIds_StatusCode } from "@ydbjs/api/operation";
7
7
import { type OffsetsRange , OffsetsRangeSchema , type StreamReadMessage_CommitOffsetRequest_PartitionCommitOffset , StreamReadMessage_CommitOffsetRequest_PartitionCommitOffsetSchema , type StreamReadMessage_FromClient , StreamReadMessage_FromClientSchema , type StreamReadMessage_FromServer , StreamReadMessage_FromServerSchema , type StreamReadMessage_InitRequest_TopicReadSettings , StreamReadMessage_InitRequest_TopicReadSettingsSchema , type StreamReadMessage_ReadResponse , TopicServiceDefinition } from "@ydbjs/api/topic" ;
8
8
import type { Driver } from "@ydbjs/core" ;
9
9
import { YDBError } from "@ydbjs/error" ;
10
- import { retry } from "@ydbjs/retry" ;
10
+ import { type RetryConfig , retry } from "@ydbjs/retry" ;
11
+ import { backoff , combine , jitter } from "@ydbjs/retry/strategy" ;
11
12
import type { StringValue } from "ms" ;
12
13
import ms from "ms" ;
13
14
@@ -326,12 +327,24 @@ export class TopicReader<Payload = Uint8Array> implements Disposable {
326
327
let signal = this . #controller. signal
327
328
await this . #driver. ready ( signal )
328
329
330
+ let retryConfig : RetryConfig = {
331
+ signal,
332
+ budget : Infinity ,
333
+ strategy : combine ( jitter ( 50 ) , backoff ( 50 , 5000 ) ) ,
334
+ retry ( error ) {
335
+ dbg ( 'retrying stream read due to %O' , error ) ;
336
+ return true ;
337
+ } ,
338
+ }
339
+
329
340
try {
330
341
// TODO: handle user errors (for example tx errors). Ex: use abort signal
331
- await retry ( { signal, idempotent : true } , async ( ) => {
342
+ await retry ( retryConfig , async ( ) => {
343
+ using outgoing = new AsyncEventEmitter < StreamReadMessage_FromClient > ( this . #fromClientEmitter, 'message' )
344
+
332
345
let stream = this . #driver
333
346
. createClient ( TopicServiceDefinition )
334
- . streamRead ( new AsyncEventEmitter ( this . #fromClientEmitter , 'message' ) , { signal } ) ;
347
+ . streamRead ( outgoing , { signal } ) ;
335
348
336
349
nextTick ( ( ) => {
337
350
dbg ( 'start consuming topic stream for consumer %s with autoPartitioningSupport=%o' , this . #options. consumer , false ) ;
@@ -353,15 +366,16 @@ export class TopicReader<Payload = Uint8Array> implements Disposable {
353
366
354
367
if ( event . status !== StatusIds_StatusCode . SUCCESS ) {
355
368
let error = new YDBError ( event . status , event . issues )
356
- this . #fromServerEmitter. emit ( 'error' , error ) ;
357
-
369
+ dbg ( 'received error from server: %s' , error . message ) ;
358
370
throw error ;
359
371
}
360
372
361
373
this . #fromServerEmitter. emit ( 'message' , event ) ;
362
374
}
363
375
} ) ;
364
376
} catch ( error ) {
377
+ dbg ( 'error: %O' , error ) ;
378
+
365
379
this . #fromServerEmitter. emit ( 'error' , error ) ;
366
380
} finally {
367
381
this . #fromServerEmitter. emit ( 'end' ) ;
0 commit comments