creating first structure of cinema backend server

Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
2025-11-16 00:01:14 +01:00
parent 92da4423b2
commit a5d9372806
15 changed files with 362 additions and 58 deletions

View File

@@ -1,71 +1,44 @@
import 'dart:async';
import 'dart:io';
import 'package:cinema/feature/poster/poster.service.dart';
import 'package:cinema/feature/version/version.dart';
import 'package:cinema/feature/websocket/websocket.service.dart';
import 'package:cinema/injectable.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:shelf/shelf_io.dart' as 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;
configureDependencies();
final router = Router();
router.mount("/poster", getIt<PosterService>().router.call);
// 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,
);
});
final handler = Pipeline().addMiddleware(logRequests()).addHandler(router.call);
FutureOr<Response> combinedHandler(Request request) {
if (request.url.path == 'ws') {
return wsHandler(request);
return getIt<WebSocketService>().handler(request);
}
return handler(request);
}
// Use any available host or container IP (usually `0.0.0.0`).
final ip = InternetAddress.anyIPv4;
// 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}');
final port = int.parse(Platform.environment['PORT'] ?? '3000');
await io.serve(combinedHandler, ip, port, poweredByHeader: null).then((server) async {
final bannerFile = File('banner.txt');
if (await bannerFile.exists()) {
final banner = await bannerFile.readAsString();
print(banner);
}
getIt<Version>().printVersion();
print('Serving at ${server.address.host}:${server.port}');
});
}
// Broadcast to all clients
void broadcast(String message) {
for (final client in clients) {
client.sink.add(message);
}
}