Support customSocketOverride value for websocket. Closes #2225

This commit is contained in:
Gabe Kangas
2022-10-18 20:40:57 -07:00
parent 0c127a65ce
commit e75b20d6ca
3 changed files with 12 additions and 24 deletions

View File

@@ -21,7 +21,7 @@ import {
MessageVisibilityEvent, MessageVisibilityEvent,
SocketEvent, SocketEvent,
} from '../../interfaces/socket-events'; } from '../../interfaces/socket-events';
import { mergeMeta } from '../../utils/helpers';
import handleConnectedClientInfoMessage from './eventhandlers/connected-client-info-handler'; import handleConnectedClientInfoMessage from './eventhandlers/connected-client-info-handler';
import ServerStatusService from '../../services/status-service'; import ServerStatusService from '../../services/status-service';
import handleNameChangeEvent from './eventhandlers/handleNameChangeEvent'; import handleNameChangeEvent from './eventhandlers/handleNameChangeEvent';
@@ -148,17 +148,6 @@ export const visibleChatMessagesSelector = selector<ChatMessage[]>({
}, },
}); });
// Take a nested object of state metadata and merge it into
// a single flattened node.
function mergeMeta(meta) {
return Object.keys(meta).reduce((acc, key) => {
const value = meta[key];
Object.assign(acc, value);
return acc;
}, {});
}
export const ClientConfigStore: FC = () => { export const ClientConfigStore: FC = () => {
const [appState, appStateSend, appStateService] = useMachine(appStateModel); const [appState, appStateSend, appStateService] = useMachine(appStateModel);
const [currentUser, setCurrentUser] = useRecoilState(currentUserAtom); const [currentUser, setCurrentUser] = useRecoilState(currentUserAtom);
@@ -324,7 +313,9 @@ export const ClientConfigStore: FC = () => {
const startChat = async () => { const startChat = async () => {
try { try {
ws = new WebsocketService(accessToken, '/ws'); const { socketHostOverride } = clientConfig;
const host = socketHostOverride || window.location.toString();
ws = new WebsocketService(accessToken, '/ws', host);
ws.handleMessage = handleMessage; ws.handleMessage = handleMessage;
setWebsocketService(ws); setWebsocketService(ws);
} catch (error) { } catch (error) {

View File

@@ -16,6 +16,7 @@ export interface ClientConfig {
federation: Federation; federation: Federation;
notifications: Notifications; notifications: Notifications;
authentication: Authentication; authentication: Authentication;
socketHostOverride?: string;
} }
interface Authentication { interface Authentication {

View File

@@ -20,24 +20,20 @@ export default class WebsocketService {
handleMessage?: (message: SocketEvent) => void; handleMessage?: (message: SocketEvent) => void;
constructor(accessToken, path) { constructor(accessToken, path, host) {
this.accessToken = accessToken; this.accessToken = accessToken;
this.path = path; this.path = path;
this.websocketReconnectTimer = null; this.websocketReconnectTimer = null;
// this.send = this.send.bind(this);
this.createAndConnect = this.createAndConnect.bind(this);
// this.scheduleReconnect = this.scheduleReconnect.bind(this);
// this.onError = this.onError.bind(this);
this.shutdown = this.shutdown.bind(this);
this.isShutdown = false; this.isShutdown = false;
this.createAndConnect(); this.createAndConnect = this.createAndConnect.bind(this);
this.shutdown = this.shutdown.bind(this);
this.createAndConnect(host);
} }
createAndConnect() { createAndConnect(host) {
const url = new URL(window.location.toString()); const url = new URL(host);
url.protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; url.protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
url.pathname = '/ws'; url.pathname = '/ws';
url.port = window.location.port === '3000' ? '8080' : window.location.port; url.port = window.location.port === '3000' ? '8080' : window.location.port;