Skip to content

Commit 4dcfed2

Browse files
authored
Merge pull request #127 from LiveTL/reconnect-chat-port
Reconnecting Chat Port
2 parents dce6a96 + c6a0f6e commit 4dcfed2

File tree

3 files changed

+55
-16
lines changed

3 files changed

+55
-16
lines changed

src/components/Hyperchat.svelte

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,18 @@
1919
Browser,
2020
Theme,
2121
YoutubeEmojiRenderMode,
22-
chatUserActionsItems
22+
chatUserActionsItems,
23+
24+
ChatReportUserOptions
25+
2326
} from '../ts/chat-constants';
24-
import { isAllEmoji, isChatMessage, isPrivileged, responseIsAction } from '../ts/chat-utils';
27+
import {
28+
isAllEmoji,
29+
isChatMessage,
30+
isPrivileged,
31+
responseIsAction,
32+
useReconnect
33+
} from '../ts/chat-utils';
2534
import Button from 'smelte/src/components/Button';
2635
import {
2736
theme,
@@ -281,24 +290,31 @@
281290
frameId: parseInt(paramsFrameId)
282291
};
283292
284-
$port = chrome.runtime.connect({ name: JSON.stringify(frameInfo) });
293+
let hasRun = false;
294+
$port = useReconnect(() => {
295+
const port = chrome.runtime.connect({
296+
name: JSON.stringify(frameInfo)
297+
}) as Chat.Port;
285298
286-
$port?.onMessage.addListener(onPortMessage);
299+
port.onMessage.addListener(onPortMessage);
287300
288-
$port?.postMessage({
289-
type: 'registerClient',
290-
getInitialData: true
291-
});
292-
$port?.postMessage({
293-
type: 'getTheme'
294-
});
301+
port.postMessage({
302+
type: 'registerClient',
303+
getInitialData: true
304+
});
295305
296-
// service worker gets shut down after 30s of not receiving events
297-
const interval = setInterval(() => $port?.postMessage({
298-
type: 'ping'
299-
}), 15_000);
306+
if (!hasRun) {
307+
port.postMessage({
308+
type: 'getTheme'
309+
});
310+
}
311+
312+
hasRun = true;
313+
314+
return port;
315+
});
300316
301-
return () => clearInterval(interval);
317+
return () => $port?.destroy && $port?.destroy();
302318
};
303319
304320
onMount(onLoad);

src/ts/chat-utils.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,25 @@ export const checkInjected = (error: string): boolean => {
6767
}
6868
return false;
6969
};
70+
71+
export const useReconnect = <T extends Chat.Port>(connect: () => T): T & { destroy: () => void } => {
72+
let actualPort = connect();
73+
const onDisconnect = (): void => {
74+
actualPort = connect();
75+
actualPort.onDisconnect.addListener(onDisconnect);
76+
};
77+
actualPort.onDisconnect.addListener(onDisconnect);
78+
79+
return {
80+
...actualPort,
81+
get name() { return actualPort.name; },
82+
get disconnect() { return actualPort.disconnect; },
83+
get postMessage() { return actualPort.postMessage; },
84+
get onMessage() { return actualPort.onMessage; },
85+
get onDisconnect() { return actualPort.onDisconnect; },
86+
destroy: () => {
87+
actualPort.onDisconnect.removeListener(onDisconnect);
88+
actualPort.disconnect();
89+
}
90+
};
91+
};

src/ts/typings/chat.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ declare namespace Chat {
154154
callback: (message: BackgroundResponse, port: Port) => void
155155
) => void;
156156
};
157+
destroy?: () => void;
157158
};
158159

159160
interface Interceptor {

0 commit comments

Comments
 (0)