52 lines
1.5 KiB
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}');
|
|
}
|