@@ -740,6 +740,49 @@ describe("ConfigWatcher", () => {
740740 expect ( errors [ 0 ] ?. message ) . toBe ( "access denied" ) ;
741741 } ) ;
742742
743+ it ( "once listener fires only for the first subscriptionError" , async ( ) => {
744+ vi . useFakeTimers ( ) ;
745+
746+ const watcher = createWatcher ( ) ;
747+ watcher . field ( "payments.fee" , Number , { default : 0.01 } ) ;
748+ mockGetConfigSuccess ( [ ] ) ;
749+
750+ const errors : Error [ ] = [ ] ;
751+ watcher . once ( "subscriptionError" , ( err ) => errors . push ( err ) ) ;
752+
753+ await watcher . start ( ) ;
754+
755+ const newStream = createMockStream ( ) ;
756+ configStub . subscribe . mockReturnValue ( newStream ) ;
757+ configStub . getConfig . mockImplementationOnce (
758+ ( _req : unknown , _meta : unknown , _opts : unknown , cb : ( ...args : unknown [ ] ) => void ) => {
759+ cb ( null , { config : { tenantId : "tenant-1" , version : 2 , values : [ ] } } ) ;
760+ } ,
761+ ) ;
762+
763+ // First error fires the once listener.
764+ mockStream . emit ( "error" , makeServiceError ( status . UNAVAILABLE , "first error" ) ) ;
765+ await vi . advanceTimersByTimeAsync ( 60_000 ) ;
766+
767+ // Second error on the new stream should NOT fire the once listener again.
768+ const newStream2 = createMockStream ( ) ;
769+ configStub . subscribe . mockReturnValue ( newStream2 ) ;
770+ configStub . getConfig . mockImplementationOnce (
771+ ( _req : unknown , _meta : unknown , _opts : unknown , cb : ( ...args : unknown [ ] ) => void ) => {
772+ cb ( null , { config : { tenantId : "tenant-1" , version : 2 , values : [ ] } } ) ;
773+ } ,
774+ ) ;
775+ newStream . emit ( "error" , makeServiceError ( status . UNAVAILABLE , "second error" ) ) ;
776+ await vi . advanceTimersByTimeAsync ( 60_000 ) ;
777+
778+ expect ( errors ) . toHaveLength ( 1 ) ;
779+ expect ( errors [ 0 ] ?. message ) . toBe ( "first error" ) ;
780+
781+ newStream2 . cancel = vi . fn ( ) ;
782+ await watcher . stop ( ) ;
783+ vi . useRealTimers ( ) ;
784+ } ) ;
785+
743786 it ( "reconnects on stream end" , async ( ) => {
744787 vi . useFakeTimers ( ) ;
745788
0 commit comments