summaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
authorHaishan <[email protected]>2021-06-05 18:50:41 +0800
committerHaishan <[email protected]>2021-06-05 21:43:41 +0800
commit8c2af7a8130ffa37dab5920c72c480e30c8e8e61 (patch)
tree91441d11cc4876e37c826434fd475f0a4ece9f88 /src/api
parent297fb101e75b5d29e411451d075a0b96c1b94f77 (diff)
Reconnect logs web socket on log level change
Diffstat (limited to 'src/api')
-rw-r--r--src/api/logs.ts39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/api/logs.ts b/src/api/logs.ts
index a65c55e..cb74bf3 100644
--- a/src/api/logs.ts
+++ b/src/api/logs.ts
@@ -1,5 +1,6 @@
import { pad0 } from 'src/misc/utils';
-import { Log, LogsAPIConfig } from 'src/types';
+import { Log } from 'src/store/types';
+import { LogsAPIConfig } from 'src/types';
import { buildLogsWebSocketURL, getURLAndInit } from '../misc/request-helper';
@@ -15,6 +16,8 @@ const getRandomStr = () => {
let even = false;
let fetched = false;
let decoded = '';
+let ws: WebSocket;
+let prevAppendLogFn: AppendLogFn;
function appendData(s: string, callback: AppendLogFn) {
let o: Partial<Log>;
@@ -31,7 +34,7 @@ function appendData(s: string, callback: AppendLogFn) {
o.time = time;
o.id = +now - 0 + getRandomStr();
o.even = even = !even;
- callback(o);
+ callback(o as Log);
}
function formatDate(d: Date) {
@@ -73,7 +76,14 @@ function pump(reader: ReadableStreamDefaultReader, appendLog: AppendLogFn) {
});
}
-let apiConfigSnapshot: LogsAPIConfig;
+/** loose hashing of the connection configuration */
+function makeConnStr(c: LogsAPIConfig) {
+ const keys = Object.keys(c);
+ keys.sort();
+ return keys.map((k) => c[k]).join('|');
+}
+
+let prevConnStr: string;
let controller: AbortController;
// 1 OPEN
@@ -84,11 +94,11 @@ let wsState: number;
export function fetchLogs(apiConfig: LogsAPIConfig, appendLog: AppendLogFn) {
if (apiConfig.logLevel === 'uninit') return;
if (fetched || wsState === 1) return;
+ prevAppendLogFn = appendLog;
wsState = 1;
const url = buildLogsWebSocketURL(apiConfig, endpoint);
- const ws = new WebSocket(url);
- ws.addEventListener('error', () => (wsState = 3));
- ws.addEventListener('close', function (_ev) {
+ ws = new WebSocket(url);
+ ws.addEventListener('error', () => {
wsState = 3;
fetchLogsWithFetch(apiConfig, appendLog);
});
@@ -97,20 +107,23 @@ export function fetchLogs(apiConfig: LogsAPIConfig, appendLog: AppendLogFn) {
});
}
+export function reconnect(apiConfig: LogsAPIConfig) {
+ if (!prevAppendLogFn || !ws) return;
+ ws.close();
+ wsState = 3;
+ fetched = false;
+ fetchLogs(apiConfig, prevAppendLogFn);
+}
+
function fetchLogsWithFetch(apiConfig: LogsAPIConfig, appendLog: AppendLogFn) {
- if (
- controller &&
- (apiConfigSnapshot.baseURL !== apiConfig.baseURL ||
- apiConfigSnapshot.secret !== apiConfig.secret ||
- apiConfigSnapshot.logLevel !== apiConfig.logLevel)
- ) {
+ if (controller && makeConnStr(apiConfig) !== prevConnStr) {
controller.abort();
} else if (fetched) {
return;
}
fetched = true;
- apiConfigSnapshot = { ...apiConfig };
+ prevConnStr = makeConnStr(apiConfig);
controller = new AbortController();
const signal = controller.signal;