Node.js
pluv.io supports building real-time APIs with Node.js. You can define your handler and websocket server manually if you need more control, but if you'd like to get started quicky, check out createPluvHandler.
Using with Node.js (manual)
Let's step through how we'd put together a real-time API for Node.js.
Install dependencies
1# For the server2npm install @pluv/io @pluv/platform-node3# Server peer-dependencies4npm install ws yjs zod
Create PluvIO instance
Define an io (websocket client) instance on the server codebase:
1// backend/io.ts23import { createIO } from "@pluv/io";4import { platformNode } from "@pluv/platform-node";56export const io = createIO({ platform: platformNode() });78// Export the websocket client io type, instead of the client itself9export type AppPluvIO = typeof io;
Integrate PluvIO with ws
Integrate with ws on your Node.js server.
1// backend/server.ts23import express from "express";4import Http from "http";5import WebSocket from "ws";6import { io } from "./io";78const PORT = 3000;910const app = express();11const server = Http.createServer();12const wsServer = new WebSocket.Server({ server });1314const parseRoomId = (url: string): string => {15 /* get room from req.url */16};1718wsServer.on("connection", async (ws, req) => {19 const roomId = parseRoomId(req.url);20 const room = io.getRoom(roomId);2122 await room.register(ws);23});2425server.listen(PORT, () => {26 console.log(`Server is listening on port: ${port}`);27});
createPluvHandler
If you don't need to modify your websocket server or handler too specifically, @pluv/platform-node also provides a function createPluvHandler
to create a websocket server and handler for your automatically.
1import { createIO } from "@pluv/io";2import { createPluvHandler, platformNode } from "@pluv/platform-node";3import bodyParser from "body-parser";4import cors from "cors";5import express from "express";6import Http from "http";7import WS from "ws";89const io = createIO({ platform: platformNode() });1011const app = express();12const server = Http.createServer(app);1314const Pluv = createPluvHandler({15 // Your PluvIO instance16 io,17 // Optional: Specify the base path from which endpoints are defined18 endpoint: "/api/pluv", // defaults to "/api/pluv"19 // Your Http.Server instance20 server,21 // If your PluvIO instance defines authorization, add your authorization22 // logic here. Return a user if authorized, return null or throw an error23 // if not authorized.24 async authorize({ req, res, roomId }) {25 return {26 id: "abc123",27 name: "leedavidcs",28 };29 },30});3132// Create your WS.Server instance, which listens to "connection" events33const wsServer = Pluv.createWsServer();3435// Alternatively, define your own websocket server36const wsServer = new WS.Server({ server });3738wsServer.on("connection", async (ws, req) => {39 const { matched } = await Pluv.wsHandler(ws, req);4041 if (matched) return;4243 // didn't match with the Pluv handler, add your own logic44 // ...45});4647app.use(bodyParser.json());48app.use(cors({ origin: "*" }));49app.use(Pluv.handler);5051server.listen(3000);