diff --git a/examples/postgres-adapter-example/README.md b/examples/postgres-adapter-example/README.md new file mode 100644 index 00000000..7b5bd788 --- /dev/null +++ b/examples/postgres-adapter-example/README.md @@ -0,0 +1,25 @@ +# Example with `@socket.io/postgres-adapter` + +**Table of contents** + + + * [How to use](#how-to-use) + * [Documentation](#documentation) + + +## How to use + +```bash +# start the postgres server +$ docker compose up -d + +# run the cluster +$ node cluster.js + +# run the client +$ node client.js +``` + +## Documentation + +The documentation can be found here: https://socket.io/docs/v4/postgres-adapter/ diff --git a/examples/postgres-adapter-example/client.js b/examples/postgres-adapter-example/client.js new file mode 100644 index 00000000..b6efb6b1 --- /dev/null +++ b/examples/postgres-adapter-example/client.js @@ -0,0 +1,31 @@ +import { io } from "socket.io-client"; + +const CLIENTS_COUNT = 3; +const PORTS = [3000, 3001, 3002]; + +for (let i = 0; i < CLIENTS_COUNT; i++) { + const socket = io(`ws://localhost:${PORTS[i % 3]}`, { + // transports: ["polling"], + // transports: ["websocket"], + }); + + socket.on("connect", () => { + console.log(`connected as ${socket.id}`); + }); + + socket.on("connect_error", () => { + console.log(`connect_error`); + }); + + socket.on("disconnect", (reason) => { + console.log(`disconnected due to ${reason}`); + }); + + socket.on("hello", (socketId, pid) => { + console.log(`received "hello" from ${socketId} (process: ${pid})`); + }); + + setInterval(() => { + socket.emit("hello"); + }, 2000); +} diff --git a/examples/postgres-adapter-example/cluster.js b/examples/postgres-adapter-example/cluster.js new file mode 100644 index 00000000..c1aa1381 --- /dev/null +++ b/examples/postgres-adapter-example/cluster.js @@ -0,0 +1,13 @@ +import cluster from 'node:cluster'; + +const SERVERS_COUNT = 3; + +cluster.setupPrimary({ + exec: 'server.js', +}); + +for (let i = 0; i < SERVERS_COUNT; i++) { + cluster.fork({ + PORT: 3000 + i + }); +} diff --git a/examples/postgres-adapter-example/compose.yaml b/examples/postgres-adapter-example/compose.yaml new file mode 100644 index 00000000..84ebf53d --- /dev/null +++ b/examples/postgres-adapter-example/compose.yaml @@ -0,0 +1,7 @@ +services: + postgres: + image: postgres:14 + ports: + - "5432:5432" + environment: + POSTGRES_PASSWORD: "changeit" diff --git a/examples/postgres-adapter-example/package.json b/examples/postgres-adapter-example/package.json new file mode 100644 index 00000000..a114f6bd --- /dev/null +++ b/examples/postgres-adapter-example/package.json @@ -0,0 +1,12 @@ +{ + "private": true, + "name": "postgres-adapter-example", + "version": "0.0.1", + "type": "module", + "dependencies": { + "@socket.io/postgres-adapter": "^0.4.0", + "pg": "^8.12.0", + "socket.io": "^4.7.5", + "socket.io-client": "^4.7.5" + } +} diff --git a/examples/postgres-adapter-example/server.js b/examples/postgres-adapter-example/server.js new file mode 100644 index 00000000..6cd07fdc --- /dev/null +++ b/examples/postgres-adapter-example/server.js @@ -0,0 +1,40 @@ +import { Server } from "socket.io"; +import { createAdapter } from "@socket.io/postgres-adapter"; +import pg from "pg"; +import process from "node:process"; + +const PORT = process.env.PORT || 3000; + +const pool = new pg.Pool({ + user: "postgres", + host: "localhost", + database: "postgres", + password: "changeit", + port: 5432, +}); + +await pool.query(` + CREATE TABLE IF NOT EXISTS socket_io_attachments ( + id bigserial UNIQUE, + created_at timestamptz DEFAULT NOW(), + payload bytea + ); +`); + +pool.on("error", (err) => { + console.error("Postgres error", err); +}); + +const io = new Server({ + adapter: createAdapter(pool) +}); + +io.on("connection", (socket) => { + socket.on("hello", () => { + // send to anyone except the sender + socket.broadcast.emit("hello", socket.id, process.pid); + }); +}); + +io.listen(PORT); +console.log(`server listening on port ${PORT}`);