Future serve()

in github-label-notifier/symbolizer/lib/server.dart [24:75]


Future<void> serve(Object address, int port,
    {@required Symbolizer symbolizer, @required Bot bot}) async {
  final handlers = <String, _RequestHandler>{
    '/symbolize': (issue) => symbolizer.symbolize(issue['body']),
    '/command': (event) async {
      final repoOrgMember = const {'MEMBER', 'OWNER'}
          .contains(event['comment']['author_association']);
      final commentEvent = IssueCommentEvent.fromJson(event);
      final repo = RepositorySlug.full(event['repository']['full_name']);
      await bot.executeCommand(repo, commentEvent.issue, commentEvent.comment,
          authorized: repoOrgMember);
      return {'status': 'ok'};
    },
  };

  // Start the server.
  final server = await HttpServer.bind(address, port);
  _log.info('Listening on ${server.address}:${server.port}');

  // Intentionally not processing requests in parallel to avoid racing
  // in symbol cache.
  await for (HttpRequest request in server) {
    _log.info('Incoming request: ${request.method} ${request.requestedUri}');
    final handler = handlers[request.requestedUri.path];
    if (request.method != 'POST' || handler == null) {
      request.response
        ..statusCode = 404
        ..write('Not found');
      unawaited(request.response.close());
      continue;
    }
    try {
      final requestObj =
          await utf8.decoder.bind(request).transform(json.decoder).first;
      final responseJson = jsonEncode(await handler(requestObj));
      request.response
        ..statusCode = HttpStatus.ok
        ..headers.add(HttpHeaders.contentTypeHeader, 'application/json')
        ..write(responseJson);
    } catch (e, st) {
      request.response
        ..statusCode = HttpStatus.internalServerError
        ..headers.add(HttpHeaders.contentTypeHeader, 'application/json')
        ..write(jsonEncode({
          'status': 'error',
          'message': e.toString(),
          'stacktrace': st.toString(),
        }));
    }
    unawaited(request.response.close());
  }
}