configureServer method

  1. @override
Future configureServer(
  1. Angel app
)

Applies routes, DI, and other configuration to an app.

Implementation

@override
Future configureServer(Angel app) async {
  if (findExpose(app.container.reflector) != null) {
    await super.configureServer(app);
  }

  _findExposed(app.container.reflector);
  await configureWs();

  ws.onConnection.listen((socket) {
    if (!socket.request.container!.has<WebSocketContext>()) {
      socket.request.container!.registerSingleton<WebSocketContext>(socket);
    }

    // The streams of the socket are listened to before [onConnect] runs,
    // as they are broadcast streams, which keep no event for later; what
    // comes meanwhile is handled once it has run.
    var connected = Future.sync(() => onConnect(socket))
        .catchError((Object e, StackTrace st) {
          ws.catchError(e, st, socket);
        });

    socket.onData.listen((data) async {
      await connected;
      return onData(data, socket);
    });

    socket.onAction.listen((WebSocketAction action) async {
      try {
        await connected;
        await onAction(action, socket);

        var handler = _handlers[action.eventName];
        if (handler != null) return await handler(action, socket);

        var exposed = _exposed[action.eventName];
        if (exposed != null) {
          var container = socket.request.container!.createChild();
          container.registerSingleton<WebSocketAction>(action);
          var (fn, injection) = exposed;
          return await handleContained(fn, injection, container)(
            socket.request,
            socket.response,
          );
        }
      } catch (e, st) {
        ws.catchError(e, st, socket);
      }
    });
  });

  ws.onDisconnection.listen(onDisconnect);
}