@noreajs/realtime

Realtime tools for Node.js applications

Usage no npm install needed!

<script type="module">
  import noreajsRealtime from 'https://cdn.skypack.dev/@noreajs/realtime';
</script>

README

Norea.js Realtime

This package is a set of tools intended to facilitate the integration of real time in node.js applications. It is part of the Norea.js framework but can also be used in any other application.

Features

  • Socket.io : Start a server socket and use it throughout the application

Installation

After initializing your Node.js project installed the package as follows:

npm install @noreajs/realtime --save

Note for typescript developers: The package already has his types definitions.

Socket.io

Socket.IO enables real-time bidirectional event-based communication.

Express application example (Typescript)

import express from "express";
import http from "http";
import SocketIOServer from "@noreajs/realtime";
import { Socket, Server } from "socket.io";

const app = express();

const httpServer = http.createServer(app);

/**
 * Socket.io server initialization
 */
const socketIoServer = new SocketIOServer({ server: httpServer }).namespace({
  middlewares: [
    async (socket, fn) => {
      console.log("Here a middleware!");
      // always call fn at the end of a middleware
      fn();
    },
  ],
  onConnect: (io, namespace, socket) => {
    console.log(`Namespace ${namespace.name}: Socket ${socket.id} connected`);
  },
  onDisconnect: (io, namespace, socket, reason: any) => {
    console.log(
      `Namespace ${namespace.name}: Socket ${socket.id} disconnected`,
      reason
    );
  },
});

/**
 * Inject socket.io server to every request
 */
app.use((req, res, next) => {
  // set socket.io server
  res.locals.socketServer = socketIoServer.getServer();
  // continue the request
  next();
});

app.get("/", function (req, res) {
  if (res.locals.socketServer) {
    /**
     * Get socket.io Server in a request
     */
    const socketIoServer = res.locals.socketServer as Server;
    socketIoServer.clients((err: any, clients: string[]) => {
      if (err) {
        res.status(500).json(err);
      } else {
        res.status(200).send(`Hello world! ${clients.length} users online!!`);
      }
    });
  } else {
    res.send("Hello World");
  }
});

httpServer.listen(3000);

Norea.js example (Typescript)

import { NoreaBootstrap } from "@noreajs/core";
import apiRoutes from "./api.routes";
import { SocketIOServer } from "..";

/**
 * Socket.io server initialization
 */
const socketIoServer = new SocketIOServer().namespace({
  middlewares: [
    async (socket, fn) => {
      // update middleware
      console.log("Here is a global middleware!");
      fn();
    },
  ],
  onConnect: (io, namespace, socket) => {
    console.log(`Namespace ${namespace.name}: Socket ${socket.id} connected`);
    if (socket.user)
      console.log(`Namespace ${namespace.name}: user ${socket.user} connected`);
  },
  onDisconnect: (io, namespace, socket, reason: any) => {
    console.log(
      `Namespace ${namespace.name}: Socket ${socket.id} disconnected`,
      reason
    );
  },
});

/**
 * Create a new Norea.js App
 */
const app = new NoreaBootstrap(apiRoutes, {
  forceHttps: false,
  beforeStart: (app) => {
    // inject socket.io server to every request
    app.use((req, res, next) => {
      // set socket.io server
      res.locals.socketServer = socketIoServer.getServer();
      // continue the request
      next();
    });
  },
  afterStart: (app, server, port) => {
    console.log("@noreajs/realtime test server");
    console.log("The api is running on port", port);

    // attach the socket server to the http/https server instance
    socketIoServer.attach(server);
  },
});

/**
 * Start your app
 */
app.start(3000);