diff options
| author | Haishan <[email protected]> | 2021-06-05 18:50:41 +0800 |
|---|---|---|
| committer | Haishan <[email protected]> | 2021-06-05 21:43:41 +0800 |
| commit | 8c2af7a8130ffa37dab5920c72c480e30c8e8e61 (patch) | |
| tree | 91441d11cc4876e37c826434fd475f0a4ece9f88 /src/api | |
| parent | 297fb101e75b5d29e411451d075a0b96c1b94f77 (diff) | |
Reconnect logs web socket on log level change
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/logs.ts | 39 |
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; |
