diff --git a/src/cache.ts b/src/cache.ts index 8b580d02ed..2ee8c4f80c 100644 --- a/src/cache.ts +++ b/src/cache.ts @@ -10,7 +10,7 @@ import { ObjectCallback, UPDATE, } from './informer.js'; -import { KubernetesObject } from './types.js'; +import { KubernetesObject, KubernetesListObject } from './types.js'; import { ObjectSerializer } from './serializer.js'; import { Watch } from './watch.js'; @@ -143,8 +143,14 @@ export class ListWatch implements ObjectCache, In } this.callbackCache[CONNECT].forEach((elt: ErrorCallback) => elt(undefined)); if (!this.resourceVersion) { - const promise = this.listFn(); - const list = await promise; + let list: KubernetesListObject; + try { + const promise = this.listFn(); + list = await promise; + } catch (err) { + this.callbackCache[ERROR].forEach((elt: ErrorCallback) => elt(err)); + return; + } this.objects = deleteItems(this.objects, list.items, this.callbackCache[DELETE].slice()); this.addOrUpdateItems(list.items); this.resourceVersion = list.metadata!.resourceVersion || ''; diff --git a/src/cache_test.ts b/src/cache_test.ts index bfcd7114f3..e2e0123818 100644 --- a/src/cache_test.ts +++ b/src/cache_test.ts @@ -1460,4 +1460,25 @@ describe('delete items', () => { strictEqual(await connectPromise, true); }); + + it('should correctly handle errors in the initial list', async () => { + const fake = mock.mock(Watch); + const requestErr = Error('request failed'); + const listFn: ListPromise = function (): Promise { + return new Promise((resolve, reject) => { + reject(requestErr); + }); + }; + const lw = new ListWatch('/some/path', fake, listFn); + let gotErr: Error | null = null; + const errCalled = new Promise((resolve, reject) => { + lw.on('error', (err) => { + gotErr = err; + resolve(); + }); + }); + await lw.start(); + await errCalled; + strictEqual(gotErr, requestErr); + }); });