try to use dart as backend language

Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
2025-11-15 09:16:09 +01:00
parent 4e14e08be4
commit 92da4423b2
17 changed files with 757 additions and 1 deletions

View File

@@ -0,0 +1,71 @@
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<dynamic> clients = [];
// Configure routes.
final _router = Router()
..get('/', _rootHandler)
..get('/echo/<message>', _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<String> 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<Response> 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);
}
}