import 'dart:io'; import 'package:dotenv/dotenv.dart'; import 'package:shelf/shelf.dart' show Middleware, Response; import 'package:rra_backend/rra_backend.dart'; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart' as io; Middleware _logger() => (handler) => (request) async { final sw = Stopwatch()..start(); final response = await handler(request); sw.stop(); final ms = sw.elapsedMilliseconds; print('${request.method} ${response.statusCode} ${ms}ms ${request.url.path}'); return response; }; Middleware _cors() => (handler) => (request) async { if (request.method == 'OPTIONS') { return Response.ok('', headers: _corsHeaders); } final response = await handler(request); return response.change(headers: _corsHeaders); }; const _corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, OPTIONS', 'Access-Control-Allow-Headers': 'Origin, Content-Type', }; void main() async { final env = DotEnv(includePlatformEnvironment: true)..load(); final mapboxToken = env['MAPBOX_ACCESS_TOKEN']; if (mapboxToken == null || mapboxToken.isEmpty) { stderr.writeln('ERROR: MAPBOX_ACCESS_TOKEN not set'); exit(1); } final port = int.tryParse(env['PORT'] ?? '8080') ?? 8080; await TileCache.init(); final handler = const Pipeline() .addMiddleware(_logger()) .addMiddleware(_cors()) .addHandler(buildRouter(mapboxToken).call); final server = await io.serve(handler, InternetAddress.anyIPv4, port); print('rra_backend listening on :${server.port}'); }