startMockUserServer function

Future<HttpServer> startMockUserServer({
  1. String host = '127.0.0.1',
  2. int port = 18080,
  3. Map<String, dynamic>? demoUser,
})

Tiny mock server for local demos and tests. Handles demo.UserService/GetUser and AddUser with HTTP+protobuf.

Implementation

Future<HttpServer> startMockUserServer({
  String host = '127.0.0.1',
  int port = 18080,
  Map<String, dynamic>? demoUser,
}) async {
  final user = Map<String, dynamic>.from(
    demoUser ??
        {
          'id': '1',
          'name': 'Ada Lovelace',
          'email': 'ada@example.com',
          'age': 36,
          'phone': '',
          'created_at': 0,
          'updated_at': 0,
        },
  );

  final router = Router();

  router.post('/demo.UserService/GetUser', (Request request) async {
    final bytes = await request.read().expand((c) => c).toList();
    final decoded = GetUserRequestCodec.decode(bytes);
    final id = (decoded['id'] as String?)?.isNotEmpty == true
        ? decoded['id'] as String
        : '1';
    final response = Map<String, dynamic>.from(user)..['id'] = id;
    return Response.ok(
      UserCodec.encode(response),
      headers: {'Content-Type': 'application/x-protobuf'},
    );
  });

  router.post('/demo.UserService/AddUser', (Request request) async {
    final bytes = await request.read().expand((c) => c).toList();
    Map<String, dynamic> decoded = {};
    try {
      decoded = AddUserRequestCodec.decode(bytes);
    } catch (_) {}
    final response = Map<String, dynamic>.from(user)
      ..['id'] = 'new'
      ..['name'] = decoded['name'] ?? user['name']
      ..['email'] = decoded['email'] ?? user['email']
      ..['age'] = decoded['age'] ?? user['age']
      ..['phone'] = decoded['phone'] ?? user['phone'];
    return Response.ok(
      UserCodec.encode(response),
      headers: {'Content-Type': 'application/x-protobuf'},
    );
  });

  final handler =
      const Pipeline().addMiddleware(logRequests()).addHandler(router.call);
  return shelf_io.serve(handler, host, port);
}