@@ -9,6 +9,7 @@ export interface ObjectCache<T> {
99
1010export class ListWatch < T extends KubernetesObject > implements ObjectCache < T > , Informer < T > {
1111 private objects : T [ ] = [ ] ;
12+ private resourceVersion : string ;
1213 private readonly indexCache : { [ key : string ] : T [ ] } = { } ;
1314 private readonly callbackCache : { [ key : string ] : Array < ObjectCallback < T > > } = { } ;
1415
@@ -24,6 +25,7 @@ export class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, In
2425 this . callbackCache [ UPDATE ] = [ ] ;
2526 this . callbackCache [ DELETE ] = [ ] ;
2627 this . callbackCache [ ERROR ] = [ ] ;
28+ this . resourceVersion = '' ;
2729 if ( autoStart ) {
2830 this . doneHandler ( null ) ;
2931 }
@@ -68,11 +70,18 @@ export class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, In
6870 return this . indexCache [ namespace ] as ReadonlyArray < T > ;
6971 }
7072
73+ public latestResourceVersion ( ) : string {
74+ return this . resourceVersion ;
75+ }
76+
7177 private async doneHandler ( err : any ) {
7278 if ( err ) {
7379 this . callbackCache [ ERROR ] . forEach ( ( elt : ObjectCallback < T > ) => elt ( err ) ) ;
7480 return ;
7581 }
82+ // TODO: Don't always list here for efficiency
83+ // try to restart the watch from resourceVersion, but detect 410 GONE and relist in that case.
84+ // Or if resourceVersion is empty.
7685 const promise = this . listFn ( ) ;
7786 const result = await promise ;
7887 const list = result . body ;
@@ -109,7 +118,7 @@ export class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, In
109118 addOrUpdateObject ( namespaceList , obj ) ;
110119 }
111120
112- private watchHandler ( phase : string , obj : T ) {
121+ private watchHandler ( phase : string , obj : T , watchObj ?: any ) {
113122 switch ( phase ) {
114123 case 'ADDED' :
115124 case 'MODIFIED' :
@@ -132,6 +141,12 @@ export class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, In
132141 }
133142 }
134143 break ;
144+ case 'BOOKMARK' :
145+ // nothing to do, here for documentation, mostly.
146+ break ;
147+ }
148+ if ( watchObj && watchObj . metadata ) {
149+ this . resourceVersion = watchObj . metadata . resourceVersion ;
135150 }
136151 }
137152}
0 commit comments