startServer function

Future<HttpServer> startServer(
  1. List<String> args
)

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