From de4226a24a1e47a96a6a574abb6428d6f25bad89 Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 18 Jan 2021 15:15:04 +0200 Subject: [PATCH] fix: parse multiple kube-events from stream's chunk Signed-off-by: Roman --- src/renderer/api/kube-watch-api.ts | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/renderer/api/kube-watch-api.ts b/src/renderer/api/kube-watch-api.ts index fcd84c75c0..7d5ad8b32a 100644 --- a/src/renderer/api/kube-watch-api.ts +++ b/src/renderer/api/kube-watch-api.ts @@ -106,7 +106,7 @@ export class KubeWatchApi { }); const reader = req.body.getReader(); - const handleEvent = this.handleEvent.bind(this); + const handleEvent = this.handleStreamEvent.bind(this); this.stream = new ReadableStream({ start(controller) { @@ -138,17 +138,25 @@ export class KubeWatchApi { } } - protected handleEvent(eventStreamChunk: Uint8Array) { - try { - const jsonText = new TextDecoder().decode(eventStreamChunk); - const event: IKubeWatchEvent = JSON.parse(jsonText); - const message = this.getMessage(event); - this.onMessage.emit(message); - } catch (error) { - this.writeLog({ - error: ["failed to parse watch-api event", error] - }); + protected handleStreamEvent(chunk: Uint8Array) { + const jsonText = new TextDecoder().decode(chunk); + if (!jsonText) { + return; } + + // decoded json might contain multiple kube-events at a time + const events = jsonText.split("\n"); + + events.forEach(kubeEvent => { + try { + const message = this.getMessage(JSON.parse(kubeEvent)); + this.onMessage.emit(message); + } catch (error) { + this.writeLog({ + error: ["failed to parse watch-api event", { error, jsonText }] + }); + } + }) } protected getMessage(event: IKubeWatchEvent): IKubeWatchMessage {