Skip to content

Commit 0e2148d

Browse files
committed
fix: handle keepalive chunk
1 parent 001870f commit 0e2148d

File tree

4 files changed

+29
-7
lines changed

4 files changed

+29
-7
lines changed

src/services/api/streaming.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {parseMultipart} from '@mjackson/multipart-parser';
22
import qs from 'qs';
33

44
import {
5+
isKeepAliveChunk,
56
isQueryResponseChunk,
67
isSessionChunk,
78
isStreamDataChunk,
@@ -93,6 +94,9 @@ export class StreamingAPI extends BaseYdbAPI {
9394
options.onStreamDataChunk(chunk);
9495
} else if (isQueryResponseChunk(chunk)) {
9596
options.onQueryResponseChunk(chunk);
97+
} else if (isKeepAliveChunk(chunk)) {
98+
// Logging for debug purposes
99+
console.log('Received keep alive chunk');
96100
}
97101
} catch (e) {
98102
throw new Error(`Error parsing chunk: ${e}`);

src/store/reducers/query/query.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {createSlice} from '@reduxjs/toolkit';
1+
import {createSelector, createSlice} from '@reduxjs/toolkit';
22
import type {PayloadAction} from '@reduxjs/toolkit';
33

44
import {settingsManager} from '../../../services/settings';
@@ -135,11 +135,9 @@ const slice = createSlice({
135135
selectors: {
136136
selectQueriesHistoryFilter: (state) => state.history.filter || '',
137137
selectTenantPath: (state) => state.tenantPath,
138-
selectQueryDuration: (state) => ({
139-
startTime: state.result?.startTime,
140-
endTime: state.result?.endTime,
141-
}),
142138
selectResult: (state) => state.result,
139+
selectStartTime: (state) => state.result?.startTime,
140+
selectEndTime: (state) => state.result?.endTime,
143141
selectQueriesHistory: (state) => {
144142
const items = state.history.queries;
145143
const filter = state.history.filter?.toLowerCase();
@@ -154,6 +152,17 @@ const slice = createSlice({
154152
},
155153
});
156154

155+
export const selectQueryDuration = createSelector(
156+
slice.selectors.selectStartTime,
157+
slice.selectors.selectEndTime,
158+
(startTime, endTime) => {
159+
return {
160+
startTime,
161+
endTime,
162+
};
163+
},
164+
);
165+
157166
export default slice.reducer;
158167
export const {
159168
changeUserInput,
@@ -177,7 +186,6 @@ export const {
177186
selectTenantPath,
178187
selectResult,
179188
selectUserInput,
180-
selectQueryDuration,
181189
selectIsDirty,
182190
} = slice.selectors;
183191

src/store/reducers/query/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,7 @@ export function isStreamDataChunk(content: StreamingChunk): content is StreamDat
4646
export function isQueryResponseChunk(content: StreamingChunk): content is QueryResponseChunk {
4747
return content?.meta?.event === 'QueryResponse';
4848
}
49+
50+
export function isKeepAliveChunk(content: StreamingChunk): content is SessionChunk {
51+
return content?.meta?.event === 'KeepAlive';
52+
}

src/types/store/streaming.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ export interface SessionChunk {
1919
};
2020
}
2121

22+
export interface KeepAliveChunk {
23+
meta: {
24+
event: 'KeepAlive';
25+
};
26+
}
27+
2228
export interface StreamDataChunk {
2329
meta: {
2430
event: 'StreamData';
@@ -51,4 +57,4 @@ export interface BaseQueryResponseChunk {
5157
export type QueryResponseChunk = BaseQueryResponseChunk &
5258
(SuccessQueryResponseData | ErrorQueryResponseData);
5359

54-
export type StreamingChunk = SessionChunk | StreamDataChunk | QueryResponseChunk;
60+
export type StreamingChunk = SessionChunk | StreamDataChunk | QueryResponseChunk | KeepAliveChunk;

0 commit comments

Comments
 (0)