@@ -2,6 +2,8 @@ import { io, type Socket as IOSocket, type SocketOptions, type ManagerOptions }
22import type { ConfigState } from "~/types/config" ;
33import type { StoreItem } from "~/types/store" ;
44
5+ export type connectionStatus = 'connected' | 'disconnected' | 'connecting' ;
6+
57export const useSocketStore = defineStore ( 'socket' , ( ) => {
68 const runtimeConfig = useRuntimeConfig ( )
79 const config = useConfigStore ( )
@@ -10,6 +12,7 @@ export const useSocketStore = defineStore('socket', () => {
1012
1113 const socket = ref < IOSocket | null > ( null )
1214 const isConnected = ref < boolean > ( false )
15+ const connectionStatus = ref < connectionStatus > ( 'disconnected' )
1316
1417 const emit = ( event : string , data ?: any ) : any => socket . value ?. emit ( event , data )
1518 const on = ( event : string | string [ ] , callback : ( ...args : any [ ] ) => void , withEvent : boolean = false ) => {
@@ -26,6 +29,24 @@ export const useSocketStore = defineStore('socket', () => {
2629 event . forEach ( e => socket . value ?. off ( e , callback ) ) ;
2730 }
2831
32+ const reconnect = ( ) => {
33+ if ( true === isConnected . value ) {
34+ return ;
35+ }
36+ connect ( ) ;
37+ connectionStatus . value = 'connecting' ;
38+ }
39+
40+ const disconnect = ( ) => {
41+ if ( null === socket . value ) {
42+ return ;
43+ }
44+ socket . value . disconnect ( ) ;
45+ socket . value = null ;
46+ isConnected . value = false ;
47+ connectionStatus . value = 'disconnected' ;
48+ }
49+
2950 const connect = ( ) => {
3051 const opts = {
3152 transports : [ 'websocket' , 'polling' ] ,
@@ -44,10 +65,18 @@ export const useSocketStore = defineStore('socket', () => {
4465 window . ws = socket . value ;
4566 }
4667
68+ connectionStatus . value = 'connecting' ;
4769 socket . value = io ( url , opts )
4870
49- socket . value . on ( 'connect' , ( ) => isConnected . value = true ) ;
50- socket . value . on ( 'disconnect' , ( ) => isConnected . value = false ) ;
71+ socket . value . on ( 'connect' , ( ) => {
72+ isConnected . value = true
73+ connectionStatus . value = 'connected' ;
74+ } ) ;
75+
76+ socket . value . on ( 'disconnect' , ( ) => {
77+ isConnected . value = false
78+ connectionStatus . value = 'disconnected' ;
79+ } ) ;
5180
5281 socket . value . on ( 'connected' , stream => {
5382 const json = JSON . parse ( stream )
@@ -187,6 +216,10 @@ export const useSocketStore = defineStore('socket', () => {
187216 connect ( ) ;
188217 }
189218
190-
191- return { connect, on, off, emit, socket, isConnected } ;
219+ return {
220+ connect, reconnect, disconnect,
221+ on, off, emit,
222+ socket, isConnected,
223+ connectionStatus : readonly ( connectionStatus ) as Readonly < Ref < connectionStatus > > ,
224+ } ;
192225} ) ;
0 commit comments