forked from noxious/client
77 lines
1.9 KiB
TypeScript
77 lines
1.9 KiB
TypeScript
import config from '@/application/config'
|
|
import { SocketEvent } from '@/application/enums'
|
|
import { useCookies } from '@vueuse/integrations/useCookies'
|
|
import { io, Socket } from 'socket.io-client'
|
|
import { ref, shallowRef } from 'vue'
|
|
|
|
class SocketManager {
|
|
private static instance: SocketManager
|
|
private _connection = shallowRef<Socket | null>(null)
|
|
private _token = ref('')
|
|
|
|
private constructor() {}
|
|
|
|
public static getInstance(): SocketManager {
|
|
if (!SocketManager.instance) {
|
|
SocketManager.instance = new SocketManager()
|
|
}
|
|
return SocketManager.instance
|
|
}
|
|
|
|
public get connection() {
|
|
return this._connection.value
|
|
}
|
|
|
|
public get token() {
|
|
return this._token.value
|
|
}
|
|
|
|
public setToken(token: string) {
|
|
this._token.value = token
|
|
}
|
|
|
|
public initConnection(): Socket {
|
|
if (this._connection.value) return this._connection.value
|
|
|
|
const socket = io(config.server_endpoint, {
|
|
secure: config.environment === 'production',
|
|
withCredentials: true,
|
|
transports: ['websocket'],
|
|
reconnectionAttempts: 5
|
|
})
|
|
|
|
this._connection.value = socket
|
|
return socket
|
|
}
|
|
|
|
public disconnect(): void {
|
|
if (!this._connection.value) return
|
|
|
|
this._connection.value.off(SocketEvent.CONNECT_ERROR)
|
|
this._connection.value.off(SocketEvent.RECONNECT_FAILED)
|
|
this._connection.value.off(SocketEvent.DATE)
|
|
this._connection.value.disconnect()
|
|
|
|
useCookies().remove('token', {
|
|
domain: config.domain
|
|
})
|
|
|
|
this._connection.value = null
|
|
this._token.value = ''
|
|
}
|
|
|
|
public emit(event: string, ...args: any[]): void {
|
|
this._connection.value?.emit(event, ...args)
|
|
}
|
|
|
|
public on(event: string, callback: (...args: any[]) => void): void {
|
|
this._connection.value?.on(event, callback)
|
|
}
|
|
|
|
public off(event: string, callback?: (...args: any[]) => void): void {
|
|
this._connection.value?.off(event, callback)
|
|
}
|
|
}
|
|
|
|
export const socketManager = SocketManager.getInstance()
|