configureServer method
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);
}