Roadbound-Map-Utility/backend/bin/server.dart

52 lines
1.5 KiB
Dart

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}');
}