mirror of
https://github.com/socketio/socket.io.git
synced 2026-01-09 15:08:12 -05:00
docs: add example with @socket.io/postgres-adapter
[skip ci]
This commit is contained in:
25
examples/postgres-adapter-example/README.md
Normal file
25
examples/postgres-adapter-example/README.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Example with `@socket.io/postgres-adapter`
|
||||||
|
|
||||||
|
**Table of contents**
|
||||||
|
|
||||||
|
<!-- TOC -->
|
||||||
|
* [How to use](#how-to-use)
|
||||||
|
* [Documentation](#documentation)
|
||||||
|
<!-- TOC -->
|
||||||
|
|
||||||
|
## 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/
|
||||||
31
examples/postgres-adapter-example/client.js
Normal file
31
examples/postgres-adapter-example/client.js
Normal file
@@ -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);
|
||||||
|
}
|
||||||
13
examples/postgres-adapter-example/cluster.js
Normal file
13
examples/postgres-adapter-example/cluster.js
Normal file
@@ -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
|
||||||
|
});
|
||||||
|
}
|
||||||
7
examples/postgres-adapter-example/compose.yaml
Normal file
7
examples/postgres-adapter-example/compose.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:14
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: "changeit"
|
||||||
12
examples/postgres-adapter-example/package.json
Normal file
12
examples/postgres-adapter-example/package.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
40
examples/postgres-adapter-example/server.js
Normal file
40
examples/postgres-adapter-example/server.js
Normal file
@@ -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}`);
|
||||||
Reference in New Issue
Block a user