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