Nary a Package Missing

    @azure/web-pubsub-express
    TypeScript icon, indicating that this package has built-in type declarations

    1.0.2 • Public • Published

    Azure Web PubSub CloudEvents handlers for Express

    Azure Web PubSub service is an Azure-managed service that helps developers easily build web applications with real-time features and publish-subscribe pattern. Any scenario that requires real-time publish-subscribe messaging between server and clients or among clients can use Azure Web PubSub service. Traditional real-time features that often require polling from server or submitting HTTP requests can also use Azure Web PubSub service.

    When a WebSocket connection connects, the Web PubSub service transforms the connection lifecycle and messages into events in CloudEvents format. This library provides an express middleware to handle events representing the WebSocket connection's lifecycle and messages, as shown in below diagram:

    cloudevents

    Details about the terms used here are described in Key concepts section.

    Source code | Package (NPM) | API reference documentation | Product documentation | Samples

    Getting started

    Currently supported environments

    Prerequisites

    1. Install the @azure/web-pubsub-express package

    npm install @azure/web-pubsub-express

    2. Create a WebPubSubEventHandler

    const express = require("express");
    
    const { WebPubSubEventHandler } = require("@azure/web-pubsub-express");
    const handler = new WebPubSubEventHandler("chat");
    
    const app = express();
    
    app.use(handler.getMiddleware());
    
    app.listen(3000, () =>
      console.log(`Azure WebPubSub Upstream ready at http://localhost:3000${handler.path}`)
    );

    Key concepts

    Connection

    A connection, also known as a client or a client connection, represents an individual WebSocket connection connected to the Web PubSub service. When successfully connected, a unique connection ID is assigned to this connection by the Web PubSub service.

    Hub

    A hub is a logical concept for a set of client connections. Usually you use one hub for one purpose, for example, a chat hub, or a notification hub. When a client connection is created, it connects to a hub, and during its lifetime, it belongs to that hub. Different applications can share one Azure Web PubSub service by using different hub names.

    Group

    A group is a subset of connections to the hub. You can add a client connection to a group, or remove the client connection from the group, anytime you want. For example, when a client joins a chat room, or when a client leaves the chat room, this chat room can be considered to be a group. A client can join multiple groups, and a group can contain multiple clients.

    User

    Connections to Web PubSub can belong to one user. A user might have multiple connections, for example when a single user is connected across multiple devices or multiple browser tabs.

    Client Events

    Events are created during the lifecycle of a client connection. For example, a simple WebSocket client connection creates a connect event when it tries to connect to the service, a connected event when it successfully connected to the service, a message event when it sends messages to the service and a disconnected event when it disconnects from the service.

    Event Handler

    Event handler contains the logic to handle the client events. Event handler needs to be registered and configured in the service through the portal or Azure CLI beforehand. The place to host the event handler logic is generally considered as the server-side.

    Examples

    Handle the connect request and assign <userId>

    const express = require("express");
    
    const { WebPubSubEventHandler } = require("@azure/web-pubsub-express");
    const handler = new WebPubSubEventHandler("chat", {
      handleConnect: (req, res) => {
        // auth the connection and set the userId of the connection
        res.success({
          userId: "<userId>"
        });
      },
      allowedEndpoints: ["https://<yourAllowedService>.webpubsub.azure.com"]
    });
    
    const app = express();
    
    app.use(handler.getMiddleware());
    
    app.listen(3000, () =>
      console.log(`Azure WebPubSub Upstream ready at http://localhost:3000${handler.path}`)
    );

    Only allow specified endpoints

    const express = require("express");
    
    const { WebPubSubEventHandler } = require("@azure/web-pubsub-express");
    const handler = new WebPubSubEventHandler("chat", {
      allowedEndpoints: [
        "https://<yourAllowedService1>.webpubsub.azure.com",
        "https://<yourAllowedService2>.webpubsub.azure.com"
      ]
    });
    
    const app = express();
    
    app.use(handler.getMiddleware());
    
    app.listen(3000, () =>
      console.log(`Azure WebPubSub Upstream ready at http://localhost:3000${handler.path}`)
    );

    Set custom event handler path

    const express = require("express");
    
    const { WebPubSubEventHandler } = require("@azure/web-pubsub-express");
    const handler = new WebPubSubEventHandler("chat", {
      path: "customPath1"
    });
    
    const app = express();
    
    app.use(handler.getMiddleware());
    
    app.listen(3000, () =>
      // Azure WebPubSub Upstream ready at http://localhost:3000/customPath1
      console.log(`Azure WebPubSub Upstream ready at http://localhost:3000${handler.path}`)
    );

    Set and read connection state

    const express = require("express");
    
    const { WebPubSubEventHandler } = require("@azure/web-pubsub-express");
    
    const handler = new WebPubSubEventHandler("chat", {
      handleConnect(req, res) {
        // You can set the state for the connection, it lasts throughout the lifetime of the connection
        res.setState("calledTime", 1);
        res.success();
      },
      handleUserEvent(req, res) {
        var calledTime = req.context.states.calledTime++;
        console.log(calledTime);
        // You can also set the state here
        res.setState("calledTime", calledTime);
        res.success();
      }
    });
    
    const app = express();
    
    app.use(handler.getMiddleware());
    
    app.listen(3000, () =>
      console.log(`Azure WebPubSub Upstream ready at http://localhost:3000${handler.path}`)
    );

    Troubleshooting

    Enable logs

    You can set the following environment variable to get the debug logs when using this library.

    • Getting debug logs from the SignalR client library
    export AZURE_LOG_LEVEL=verbose

    For more detailed instructions on how to enable logs, you can look at the @azure/logger package docs.

    Live Trace

    Use Live Trace from the Web PubSub service portal to view the live traffic.

    Next steps

    Please take a look at the samples directory for detailed examples on how to use this library.

    Contributing

    If you'd like to contribute to this library, please read the contributing guide to learn more about how to build and test the code.

    Related projects

    Keywords

    Install

    npm i @azure/web-pubsub-express@1.0.2

    Version

    1.0.2

    License

    MIT

    Unpacked Size

    215 kB

    Total Files

    32

    Last publish

    Collaborators

    • azure-sdk