xviz/docs/api-reference/server/overview-middleware.md
Timothy Wojtaszek 6a85f68a72 @xviz/server module (#453)
Proper module to replace our adhoc server script with a structured middleware-based implementation.

Key documents are:
 - RFC ./dev-docs/004-server-module-rfc.md
 - User Docs ./docs/api-reference/server
 - Module Readme ./modules/server/README.md
2019-05-23 16:34:18 -07:00

2.9 KiB

Middleware

The middleware provides a structured pipeline for controlling and customizing the data flow for a message.

Middleware is managed by the XVIZServerMiddlewareStack and called in order unless a handler chooses to stop further subsequent flow.

Example

The XVIZServerMiddlewareStack is something that would be instantiated by an XVIZSession. The XVIZSession would create the middleware then setup the components to define the pipeline for handing requests, manipulating data, and sending the response.

import {
  XVIZProviderRequestHandler
  XVIZMessageToMiddleware
  XVIZServerMiddlewareStack
  XVIZSessionContext
  XVIZWebsocketSender} from '@xviz/server';

export class ExampleSession {
  constructor(socket, request, provider, options) {
    this.socket = socket;
    this.provider = provider;
    this.request = request;
    this.options = options;

    // Session shared storage for the middlewares
    this.context = new XVIZSessionContext();

    // The middleware will manage calling the components in the stack
    this.middleware = new XVIZServerMiddlewareStack();

    // Setup a pipeline to respond to request and send back messages
    const stack = [
      new XVIZProviderRequestHandler(this.context, this.provider, this.middleware, this.options),
      new XVIZWebsocketSender(this.context, this.socket, this.options)
    ];
    this.middleware.set(stack);

    // The XVIZMessageToMiddleware object is a convenience class to
    // simply inspect a message and if it is an XVIZ message call the middleware
    this.handler = new XVIZMessageToMiddleware(this.middleware);

    this.socket.onmessage = message => {
      if (!this.handler.onMessage(message)) {
        // Handle non-XVIZ message here
      }
    };
  }
}

Common Method Parameters

The middleware operates at an XVIZ message level.

Parameters:

  • message (XVIZData) - The message being processed by the middleware

Returns: (Boolean) - If false then this message flow should abort. Useful when one message type triggers another message type or if an error occurs.

Middleware Interface

onConnect()

Called when a connection is accepted.

onClose()

Called when a connection is closed.

XVIZ Message Events

onStart(message)

Called when a xviz/start message is inititiated

onTransformLog(message)

Called when a xviz/tranform_log message is inititiated

onError(message)

Called when a xviz/error message is inititiated

onMetadata(message)

Called when a xviz/metadata message is inititiated

onStateUpdate(message)

Called when a xviz/state_update message is inititiated

onTransformLogDone(message)

Called when a xviz/transform_log_done message is inititiated

onReconfigure(message)

Called when a xviz/transform_log_done message is inititiated