init
This commit is contained in:
88
src/workers/worker.js
Normal file
88
src/workers/worker.js
Normal file
@@ -0,0 +1,88 @@
|
||||
let socket
|
||||
let clients = []
|
||||
let reconnectAttempts = 0
|
||||
const MAX_RECONNECT_ATTEMPTS = 5
|
||||
|
||||
function connectWebSocket(url) {
|
||||
try {
|
||||
socket = new WebSocket(url)
|
||||
|
||||
socket.onopen = () => {
|
||||
console.log('[Shared Worker] WebSocket connected')
|
||||
reconnectAttempts = 0
|
||||
broadcast({ type: 'STATUS', connected: true })
|
||||
}
|
||||
|
||||
socket.onmessage = (event) => {
|
||||
console.log('[Shared Worker] Get message')
|
||||
const data = JSON.parse(event.data)
|
||||
broadcast(data)
|
||||
}
|
||||
|
||||
socket.onclose = () => {
|
||||
console.log('[Shared Worker] WebSocket disconnected')
|
||||
broadcast({ type: 'STATUS', connected: false })
|
||||
|
||||
// if (reconnectAttempts < MAX_RECONNECT_ATTEMPTS) {
|
||||
// reconnectAttempts++
|
||||
// setTimeout(() => {
|
||||
// console.log(`[Shared Worker] Reconnecting (attempt ${reconnectAttempts})...`)
|
||||
// connectWebSocket(url)
|
||||
// }, 1000 * reconnectAttempts)
|
||||
// }
|
||||
}
|
||||
|
||||
socket.onerror = (error) => {
|
||||
console.error('[Shared Worker] WebSocket error:', error)
|
||||
broadcast({ type: 'ERROR', message: error.message })
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[Shared Worker] Failed to create WebSocket:', error)
|
||||
}
|
||||
}
|
||||
|
||||
function broadcast(message) {
|
||||
clients.forEach((port) => port.postMessage(message))
|
||||
}
|
||||
|
||||
onconnect = function (event) {
|
||||
const port = event.ports[0]
|
||||
clients.push(port)
|
||||
|
||||
port.onmessage = function (e) {
|
||||
const { command, data } = e.data
|
||||
|
||||
console.log('Received command', command, data)
|
||||
|
||||
switch (command) {
|
||||
case 'CONNECT':
|
||||
if (!socket || socket.readyState !== WebSocket.OPEN) {
|
||||
connectWebSocket(data.url)
|
||||
}
|
||||
break
|
||||
case 'SEND':
|
||||
if (socket && socket.readyState === WebSocket.OPEN) {
|
||||
socket.send(JSON.stringify(data))
|
||||
} else {
|
||||
port.postMessage('[Shared Worker] WebSocket not open. Cannot send message.')
|
||||
}
|
||||
break
|
||||
|
||||
case 'CLOSE':
|
||||
if (socket && socket.readyState === WebSocket.OPEN) {
|
||||
socket.close()
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
const status = { type: 'STATUS' }
|
||||
|
||||
if (socket) {
|
||||
status.connected = socket.readyState === WebSocket.OPEN
|
||||
} else {
|
||||
status.connected = false
|
||||
}
|
||||
|
||||
port.postMessage(status)
|
||||
}
|
||||
Reference in New Issue
Block a user