Mikachu
Mikachu

Reputation: 157

How can I use a websocket server in my production svelte-kit app?

In my current project, I need to use a websocket server (using the ws library) in my svelte-kit application. I have successfully set up the websocket server to run automatically with npm run dev (in my vite.config.ts). But, when I build the application and run npm run preview, I don't see the console.logs from my websocket server anymore. How can I fix this and get the server to just run in the prod environment?

vite.config.ts:

import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import { web_socket_server } from './src/websocket/server';

export default defineConfig({
    plugins: [sveltekit(), web_socket_server]
});

server.ts

import { WebSocket, WebSocketServer } from 'ws';

type Client = {
    name: string;
    socket: WebSocket;
    should_disconnect: boolean;
};

const clients: Client[] = [];

let server;

// TODO: probably change the any
export const configureServer = (_: unknown) => {
    console.log('[*] Creating websocket server...');

    server = new WebSocketServer({
        port: 6969
    });

    console.log('[*] Created websocket server: ' + server);

    server.on('listening', () => {
        console.log('[+] Server is now listening!');
    });

    server.on('close', () => {
        console.log('[-] Shutting down the server!');
    });

    server.on('error', (error) => {
        console.log('[-] An uncaught error has occured!');
        console.error(error);
    });

    server.on('connection', (socket: WebSocket) => {
        clients.push({ name: '', socket, should_disconnect: false });

        socket.on('close', (code, reason) => handleSocketClose(socket, code, reason));
        socket.on('error', (err) => handleSocketError(socket, err));
    });
};

export const web_socket_server = {
    name: 'webSocketServer',
    configureServer
};

export default server;

function handleSocketClose(socket: WebSocket, code: number, reason: Buffer) {
    const current_client = clients.find((client) => client.socket == socket);

    if (!current_client) {
        console.log('[-] Unregistered Socket disconnected!');
        return;
    }

    clients.splice(clients.indexOf(current_client), 1);

    if (!current_client.should_disconnect) {
        console.log('[-] Client disconnected unexpectedly!');
        return;
    }

    console.log('[-] Code: ' + code + ', reason: ' + reason.toString());
}

function handleSocketError(socket: WebSocket, err: Error) {
    console.log('[-] Connection error!');
    console.error(err);

    const client = clients.find((client) => client.socket == socket);
    if (client) {
        client.should_disconnect = true;
    }
}

function handleSocketMessage(socket: WebSocket, message: Buffer | ArrayBuffer | Buffer[]) {}

I tried to get it to run using the svelte.config.js but that made me fiddle around with javascript and typescript interopt, until I found out it the properties on the config object I needed, don't exist anymore. I checked the entire build directory for files that contain strings from the vite.config.ts but none of them contained any.

Upvotes: 0

Views: 344

Answers (0)

Related Questions