2022-05-03 07:13:36 +02:00
import { message } from 'antd' ;
2022-05-03 23:17:05 +02:00
import { MessageType } from '../interfaces/socket-events' ;
2022-05-03 07:13:36 +02:00
2022-05-03 02:45:22 +02:00
interface SocketMessage {
2022-05-03 23:17:05 +02:00
type : MessageType ;
2022-05-03 02:45:22 +02:00
data : any ;
}
export default class WebsocketService {
websocket : WebSocket ;
accessToken : string ;
path : string ;
websocketReconnectTimer : ReturnType < typeof setTimeout > ;
2022-05-03 07:13:36 +02:00
handleMessage ? : ( message : SocketMessage ) = > void ;
2022-05-03 02:45:22 +02:00
constructor ( accessToken , path ) {
this . accessToken = accessToken ;
2022-05-03 07:13:36 +02:00
this . path = path ;
2022-05-03 02:45:22 +02:00
// this.websocketReconnectTimer = null;
// this.accessToken = accessToken;
// this.websocketConnectedListeners = [];
// this.websocketDisconnectListeners = [];
// this.rawMessageListeners = [];
// this.send = this.send.bind(this);
// this.createAndConnect = this.createAndConnect.bind(this);
// this.scheduleReconnect = this.scheduleReconnect.bind(this);
// this.shutdown = this.shutdown.bind(this);
// this.isShutdown = false;
this . createAndConnect ( ) ;
}
createAndConnect() {
2022-05-03 07:13:36 +02:00
const url = new URL ( 'ws://localhost:8080/ws' ) ;
2022-05-03 02:45:22 +02:00
url . searchParams . append ( 'accessToken' , this . accessToken ) ;
2022-05-03 07:13:36 +02:00
console . log ( 'connecting to ' , url . toString ( ) ) ;
2022-05-03 02:45:22 +02:00
const ws = new WebSocket ( url . toString ( ) ) ;
ws . onopen = this . onOpen . bind ( this ) ;
// ws.onclose = this.onClose.bind(this);
ws . onerror = this . onError . bind ( this ) ;
ws . onmessage = this . onMessage . bind ( this ) ;
this . websocket = ws ;
}
onOpen() {
if ( this . websocketReconnectTimer ) {
clearTimeout ( this . websocketReconnectTimer ) ;
}
}
// On ws error just close the socket and let it re-connect again for now.
onError ( e ) {
2022-05-03 22:01:50 +02:00
console . error ( e ) ;
2022-05-03 07:13:36 +02:00
handleNetworkingError ( ` Socket error: ${ e } ` ) ;
2022-05-03 02:45:22 +02:00
this . websocket . close ( ) ;
// if (!this.isShutdown) {
// this.scheduleReconnect();
// }
}
/ *
onMessage is fired when an inbound object comes across the websocket .
If the message is of type ` PING ` we send a ` PONG ` back and do not
pass it along to listeners .
* /
onMessage ( e : SocketMessage ) {
// Optimization where multiple events can be sent within a
// single websocket message. So split them if needed.
const messages = e . data . split ( '\n' ) ;
let message : SocketMessage ;
// eslint-disable-next-line no-plusplus
for ( let i = 0 ; i < messages . length ; i ++ ) {
try {
message = JSON . parse ( messages [ i ] ) ;
2022-05-03 07:13:36 +02:00
if ( this . handleMessage ) {
this . handleMessage ( message ) ;
}
2022-05-03 02:45:22 +02:00
} catch ( e ) {
console . error ( e , e . data ) ;
return ;
}
if ( ! message . type ) {
console . error ( 'No type provided' , message ) ;
return ;
}
// Send PONGs
2022-05-03 23:17:05 +02:00
if ( message . type === MessageType . PING ) {
2022-05-03 02:45:22 +02:00
this . sendPong ( ) ;
return ;
}
}
}
// Outbound: Other components can pass an object to `send`.
send ( message : any ) {
// Sanity check that what we're sending is a valid type.
2022-05-03 23:17:05 +02:00
if ( ! message . type || ! MessageType [ message . type ] ) {
2022-05-03 02:45:22 +02:00
console . warn ( ` Outbound message: Unknown socket message type: " ${ message . type } " sent. ` ) ;
}
const messageJSON = JSON . stringify ( message ) ;
this . websocket . send ( messageJSON ) ;
}
// Reply to a PING as a keep alive.
sendPong() {
2022-05-03 23:17:05 +02:00
const pong = { type : MessageType . PONG } ;
2022-05-03 02:45:22 +02:00
this . send ( pong ) ;
}
}
function handleNetworkingError ( error ) {
console . error (
2022-05-03 07:13:36 +02:00
` Chat has been disconnected and is likely not working for you. It's possible you were removed from chat. If this is a server configuration issue, visit troubleshooting steps to resolve. https://owncast.online/docs/troubleshooting/#chat-is-disabled: ${ error } ` ,
2022-05-03 02:45:22 +02:00
) ;
2022-05-03 07:13:36 +02:00
}