diff --git a/bun.lockb b/bun.lockb index 84d43ba..e3f4784 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 722365c..a498d6d 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "start": "PORT=3005 tsm ./prodServer.ts", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "format": "prettier --write .", @@ -16,7 +17,7 @@ }, "devDependencies": { "@eslint/compat": "^1.2.3", - "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-node": "^5.2.11", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^4.0.0", "autoprefixer": "^10.4.20", @@ -38,8 +39,10 @@ "dependencies": { "daisyui": "^4.12.23", "drizzle-orm": "^0.33.0", + "express": "^4.21.2", "postgres": "^3.4.4", "socket.io": "^4.8.1", - "socket.io-client": "^4.8.1" + "socket.io-client": "^4.8.1", + "tsm": "^2.3.0" } } diff --git a/prodServer.ts b/prodServer.ts index ae4d583..a83368c 100644 --- a/prodServer.ts +++ b/prodServer.ts @@ -1,11 +1,30 @@ -import * as path from 'path'; -import * as url from 'url'; -import { createWSSGlobalInstance, onHttpServerUpgrade } from './src/lib/server/webSocketUtils'; +import { handler } from './build/handler.js'; +import express from 'express'; +import { createServer } from 'http'; +import { Server } from 'socket.io'; -const __filename = url.fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); +const app = express(); +const server = createServer(app); +const io = new Server(server); -createWSSGlobalInstance(); +io.on('connection', (socket) => { + console.log(`[ws:kit] client connected (${socket.id})`); + io!.emit('message', `Hello from SvelteKit ${new Date().toLocaleString()} (${socket.id})`); -const { server } = await import(path.resolve(__dirname, './build/index.js')); -server.server.on('upgrade', onHttpServerUpgrade); + socket.on('disconnect', () => { + io!.emit('message', `[ws:kit] client disconnected (${socket.id})`) + console.log(`client disconnected (${socket.id})`); + }); +}); + +app.use((req, res, next) => { + if (req.path.startsWith('/socket.io/')) { + next(); + } else { + handler(req, res); + } +}); + +server.listen(3005, () => { + console.log('Listening on http://0.0.0.0:3005'); +}); \ No newline at end of file diff --git a/src/lib/hooks.server.ts b/src/lib/hooks.server.ts index 55490b0..58c1b02 100644 --- a/src/lib/hooks.server.ts +++ b/src/lib/hooks.server.ts @@ -1,24 +1,9 @@ import { building } from '$app/environment'; import type { Handle } from '@sveltejs/kit'; import { Server as SocketIOServer } from 'socket.io'; -import type { HttpServer } from 'vite'; +import { startupSocketIOServer } from '$lib/websocketConfig'; let io: SocketIOServer | undefined; - -const startupSocketIOServer = (httpServer: HttpServer | null) => { - if (io) return; - console.log('[ws:kit] setup'); - io = new SocketIOServer(httpServer); - io.on('connection', (socket) => { - console.log(`[ws:kit] client connected (${socket.id})`); - socket.emit('message', `Hello from SvelteKit ${new Date().toLocaleString()} (${socket.id})`); - - socket.on('disconnect', () => { - console.log(`[ws:kit] client disconnected (${socket.id})`); - }); - }); -}; - export const handle = (async ({ event, resolve }) => { if (!building) { startupSocketIOServer(event.locals.httpServer); diff --git a/src/lib/websocketConfig.ts b/src/lib/websocketConfig.ts new file mode 100644 index 0000000..04c6e4b --- /dev/null +++ b/src/lib/websocketConfig.ts @@ -0,0 +1,20 @@ +import { Server as SocketIOServer } from 'socket.io'; +import type { HttpServer } from 'vite'; + +let io: SocketIOServer | undefined; + + +export function startupSocketIOServer(httpServer: HttpServer | null) { + if (io) return; + console.log('[ws:kit] setup'); + io = new SocketIOServer(httpServer); + io.on('connection', (socket) => { + console.log(`[ws:kit] client connected (${socket.id})`); + io!.emit('message', `Hello from SvelteKit ${new Date().toLocaleString()} (${socket.id})`); + + socket.on('disconnect', () => { + io!.emit('message', `[ws:kit] client disconnected (${socket.id})`) + console.log(`client disconnected (${socket.id})`); + }); + }); +} \ No newline at end of file diff --git a/svelte.config.js b/svelte.config.js index 1295460..e0a641e 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,4 +1,4 @@ -import adapter from '@sveltejs/adapter-auto'; +import adapter from '@sveltejs/adapter-node'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ diff --git a/vite.config.ts b/vite.config.ts index 6af1429..2a9d30b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,21 +1,6 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig, type HttpServer } from 'vite'; -import { Server as SocketIOServer } from 'socket.io'; - -function setupSocketIOServer(httpServer: HttpServer | null) { - if (!httpServer) { - throw new Error('HTTP server is not available'); - } - const io = new SocketIOServer(httpServer); - io.on('connection', (socket) => { - console.log(`[ws] client connected (${socket.id})`); - io.emit('message', `Hello from SvelteKit ${new Date().toLocaleString()} (${socket.id})`); - - socket.on('disconnect', () => { - io.emit(`[ws] client disconnected (${socket.id})`); - }); - }); -} +import { defineConfig } from 'vite'; +import { startupSocketIOServer } from './src/lib/websocketConfig'; export default defineConfig({ plugins: [ @@ -23,10 +8,10 @@ export default defineConfig({ { name: 'integratedSocketIOServer', configureServer(server) { - setupSocketIOServer(server.httpServer); + startupSocketIOServer(server.httpServer); }, configurePreviewServer(server) { - setupSocketIOServer(server.httpServer); + startupSocketIOServer(server.httpServer); } }, ]