startServer function
Implementation
Future<HttpServer> startServer(List<String> args) async {
final parser = ArgParser()..addOption('port', abbr: 'p');
final result = parser.parse(args);
// For Google Cloud Run, we respect the PORT environment variable
final portStr = result['port'] as String? ?? Platform.environment['PORT'] ?? '8080';
final port = int.tryParse(portStr);
if (port == null) {
stdout.writeln('Could not parse port value "$portStr" into a number.');
// 64: command line usage error
exitCode = 64;
exit(1);
}
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',
'Access-Control-Allow-Headers': '*',
};
shelf.Response? options(shelf.Request request) =>
(request.method == 'OPTIONS') ? shelf.Response.ok(null, headers: corsHeaders) : null;
shelf.Response cors(shelf.Response response) => response.change(headers: corsHeaders);
final fixCORS = shelf.createMiddleware(requestHandler: options, responseHandler: cors);
final handler =
const shelf.Pipeline().addMiddleware(fixCORS).addMiddleware(shelf.logRequests()).addHandler(serverHandler);
print('Starting server on $_hostname:$port');
return io.serve(handler, _hostname, port);
}