2022-09-30 12:38:12 +02:00
|
|
|
import {
|
|
|
|
builderStore,
|
|
|
|
environmentStore,
|
|
|
|
notificationStore,
|
|
|
|
} from "./stores/index.js"
|
2022-08-19 12:09:20 +02:00
|
|
|
import { get } from "svelte/store"
|
|
|
|
import { io } from "socket.io-client"
|
|
|
|
|
2022-09-30 13:01:56 +02:00
|
|
|
let socket
|
|
|
|
|
2022-08-19 12:09:20 +02:00
|
|
|
export const initWebsocket = () => {
|
|
|
|
const { inBuilder, location } = get(builderStore)
|
2022-09-22 16:04:20 +02:00
|
|
|
const { cloud } = get(environmentStore)
|
2022-08-22 19:24:34 +02:00
|
|
|
|
|
|
|
// Only connect when we're inside the builder preview, for now
|
2022-09-30 13:01:56 +02:00
|
|
|
if (!inBuilder || !location || cloud || socket) {
|
2022-08-19 12:09:20 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-08-22 19:24:34 +02:00
|
|
|
// Initialise connection
|
2022-08-19 12:09:20 +02:00
|
|
|
const tls = location.protocol === "https:"
|
|
|
|
const proto = tls ? "wss:" : "ws:"
|
|
|
|
const host = location.hostname
|
2022-08-23 09:48:16 +02:00
|
|
|
const port = location.port || (tls ? 443 : 80)
|
2022-09-30 13:01:56 +02:00
|
|
|
socket = io(`${proto}//${host}:${port}`, {
|
2022-08-22 19:24:34 +02:00
|
|
|
path: "/socket/client",
|
2022-09-30 13:01:56 +02:00
|
|
|
// Cap reconnection attempts to 3 (total of 15 seconds before giving up)
|
|
|
|
reconnectionAttempts: 3,
|
|
|
|
// Delay reconnection attempt by 5 seconds
|
2022-09-22 16:52:46 +02:00
|
|
|
reconnectionDelay: 5000,
|
2022-09-30 13:01:56 +02:00
|
|
|
reconnectionDelayMax: 5000,
|
|
|
|
// Timeout after 4 seconds so we never stack requests
|
|
|
|
timeout: 4000,
|
2022-08-19 12:09:20 +02:00
|
|
|
})
|
2022-08-22 19:24:34 +02:00
|
|
|
|
|
|
|
// Event handlers
|
2022-08-19 12:09:20 +02:00
|
|
|
socket.on("plugin-update", data => {
|
|
|
|
builderStore.actions.updateUsedPlugin(data.name, data.hash)
|
2022-09-30 12:38:12 +02:00
|
|
|
notificationStore.actions.info(`"${data.name}" plugin reloaded`)
|
2022-08-19 12:09:20 +02:00
|
|
|
})
|
|
|
|
}
|