import 'dart:async'; import 'dart:io'; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart' as shelf_io; import 'package:shelf_router/shelf_router.dart'; import 'package:shelf_web_socket/shelf_web_socket.dart'; final List clients = []; // Configure routes. final _router = Router() ..get('/', _rootHandler) ..get('/echo/', _echoHandler); Response _rootHandler(Request req) { return Response.ok('Hello, World!\n'); } Response _echoHandler(Request request) { final message = request.params['message']; return Response.ok('$message\n'); } void main(List args) async { // Use any available host or container IP (usually `0.0.0.0`). final ip = InternetAddress.anyIPv4; // Configure a pipeline that logs requests. final handler = Pipeline().addMiddleware(logRequests()).addHandler(_router.call); var wsHandler = webSocketHandler((webSocket, _) { clients.add(webSocket); print('Client connected, total: ${clients.length}'); webSocket.stream.listen( (message) { webSocket.sink.add('echo $message'); }, onDone: () { clients.remove(webSocket); print('Client disconnected, total: ${clients.length}'); }, onError: (error) { clients.remove(webSocket); print('Client error: $error'); }, cancelOnError: true, ); }); FutureOr combinedHandler(Request request) { if (request.url.path == 'ws') { return wsHandler(request); } return handler(request); } // For running in containers, we respect the PORT environment variable. final port = int.parse(Platform.environment['PORT'] ?? '8080'); final server = await shelf_io.serve(combinedHandler, ip, port).then((server) { print('Serving at http|ws://${server.address.host}:${server.port}'); }); } // Broadcast to all clients void broadcast(String message) { for (final client in clients) { client.sink.add(message); } }