Handle websocket authentication slightly differently to make errors easier to work with

This commit is contained in:
Dane Everitt 2019-12-21 17:31:04 -08:00
parent 02c0d934c3
commit 11c17245c2
No known key found for this signature in database
GPG key ID: EEA66103B3D71F53
2 changed files with 26 additions and 9 deletions

View file

@ -11,7 +11,7 @@ export default () => {
const updateToken = (uuid: string, socket: Websocket) => { const updateToken = (uuid: string, socket: Websocket) => {
getWebsocketToken(uuid) getWebsocketToken(uuid)
.then(data => socket.setToken(data.token)) .then(data => socket.setToken(data.token, true))
.catch(error => console.error(error)); .catch(error => console.error(error));
}; };
@ -24,7 +24,7 @@ export default () => {
const socket = new Websocket(); const socket = new Websocket();
socket.on('SOCKET_OPEN', () => setConnectionState(true)); socket.on('auth success', () => setConnectionState(true));
socket.on('SOCKET_CLOSE', () => setConnectionState(false)); socket.on('SOCKET_CLOSE', () => setConnectionState(false));
socket.on('SOCKET_ERROR', () => setConnectionState(false)); socket.on('SOCKET_ERROR', () => setConnectionState(false));
socket.on('status', (status) => setServerStatus(status)); socket.on('status', (status) => setServerStatus(status));
@ -38,7 +38,10 @@ export default () => {
getWebsocketToken(server.uuid) getWebsocketToken(server.uuid)
.then(data => { .then(data => {
// Connect and then set the authentication token.
socket.setToken(data.token).connect(data.socket); socket.setToken(data.token).connect(data.socket);
// Once that is done, set the instance.
setInstance(socket); setInstance(socket);
}) })
.catch(error => console.error(error)); .catch(error => console.error(error));

View file

@ -23,9 +23,9 @@ export class Websocket extends EventEmitter {
private token: string = ''; private token: string = '';
// Connects to the websocket instance and sets the token for the initial request. // Connects to the websocket instance and sets the token for the initial request.
connect (url: string) { connect (url: string): this {
this.url = url; this.url = url;
this.socket = new Sockette(`${this.url}?token=${this.token}`, { this.socket = new Sockette(`${this.url}`, {
onmessage: e => { onmessage: e => {
try { try {
let { event, args } = JSON.parse(e.data); let { event, args } = JSON.parse(e.data);
@ -34,11 +34,19 @@ export class Websocket extends EventEmitter {
console.warn('Failed to parse incoming websocket message.', ex); console.warn('Failed to parse incoming websocket message.', ex);
} }
}, },
onopen: () => this.emit('SOCKET_OPEN'), onopen: () => {
onreconnect: () => this.emit('SOCKET_RECONNECT'), this.emit('SOCKET_OPEN');
this.authenticate();
},
onreconnect: () => {
this.emit('SOCKET_RECONNECT');
this.authenticate();
},
onclose: () => this.emit('SOCKET_CLOSE'), onclose: () => this.emit('SOCKET_CLOSE'),
onerror: () => this.emit('SOCKET_ERROR'), onerror: () => this.emit('SOCKET_ERROR'),
}); });
return this;
} }
// Returns the URL connected to for the socket. // Returns the URL connected to for the socket.
@ -48,11 +56,11 @@ export class Websocket extends EventEmitter {
// Sets the authentication token to use when sending commands back and forth // Sets the authentication token to use when sending commands back and forth
// between the websocket instance. // between the websocket instance.
setToken (token: string): this { setToken (token: string, isUpdate = false): this {
this.token = token; this.token = token;
if (this.url) { if (isUpdate) {
this.send('auth', token); this.authenticate();
} }
return this; return this;
@ -63,6 +71,12 @@ export class Websocket extends EventEmitter {
return this.token; return this.token;
} }
authenticate () {
if (this.url && this.token) {
this.send('auth', this.token);
}
}
close (code?: number, reason?: string) { close (code?: number, reason?: string) {
this.url = null; this.url = null;
this.token = ''; this.token = '';