|  | 
|  | 1 | +import 'dart:convert'; | 
|  | 2 | +import 'dart:io'; | 
|  | 3 | +import 'dart:isolate'; | 
|  | 4 | +import 'dart:typed_data'; | 
|  | 5 | + | 
|  | 6 | +import 'package:relic/io_adapter.dart'; | 
|  | 7 | +import 'package:relic/relic.dart'; | 
|  | 8 | + | 
|  | 9 | +void main() async { | 
|  | 10 | +  /// Number of [Isolate]s to spawn | 
|  | 11 | +  /// This is based on the number of available processors | 
|  | 12 | +  /// minus one for the main isolate | 
|  | 13 | +  final isolateCount = Platform.numberOfProcessors * 2 - 1; | 
|  | 14 | + | 
|  | 15 | +  /// Create an [Isolate] containing an [HttpServer] | 
|  | 16 | +  await Future.wait( | 
|  | 17 | +    List.generate( | 
|  | 18 | +      isolateCount, | 
|  | 19 | +      (final index) => | 
|  | 20 | +          Isolate.spawn((final _) => _serve(), null, debugName: '$index'), | 
|  | 21 | +    ), | 
|  | 22 | +  ); | 
|  | 23 | + | 
|  | 24 | +  _serve(); | 
|  | 25 | +} | 
|  | 26 | + | 
|  | 27 | +/// [_serve] is called in each spawned isolate. | 
|  | 28 | +Future<void> _serve() async { | 
|  | 29 | +  final router = Router<Handler>() | 
|  | 30 | +    ..get('/json', respondWith((req) => _responseJson())) | 
|  | 31 | +    ..get('/plaintext', respondWith((req) => _responsePlainText())); | 
|  | 32 | + | 
|  | 33 | +  final handler = const Pipeline() | 
|  | 34 | +      .addMiddleware(_requiredHeadersMiddleware()) | 
|  | 35 | +      .addMiddleware(routeWith(router)) | 
|  | 36 | +      .addHandler(respondWith((_) => Response.notFound())); | 
|  | 37 | + | 
|  | 38 | +  // start the server | 
|  | 39 | +  await serve(handler, InternetAddress.anyIPv4, 8080, shared: true); | 
|  | 40 | +} | 
|  | 41 | + | 
|  | 42 | +Middleware _requiredHeadersMiddleware() { | 
|  | 43 | +  var addHeaders = createMiddleware( | 
|  | 44 | +    onResponse: (response) => response.copyWith( | 
|  | 45 | +      headers: response.headers.transform((headers) { | 
|  | 46 | +        headers.server = 'relic'; | 
|  | 47 | +        // Date header is added by default, but we set it here for clarity. | 
|  | 48 | +        headers.date = DateTime.now(); | 
|  | 49 | +      }), | 
|  | 50 | +    ), | 
|  | 51 | +  ); | 
|  | 52 | +  return addHeaders; | 
|  | 53 | +} | 
|  | 54 | + | 
|  | 55 | +Response _responseJson() { | 
|  | 56 | +  return Response.ok( | 
|  | 57 | +    body: Body.fromData( | 
|  | 58 | +      _jsonEncoder.convert(const {'message': 'Hello, World!'}) as Uint8List, | 
|  | 59 | +      mimeType: MimeType.json, | 
|  | 60 | +    ), | 
|  | 61 | +  ); | 
|  | 62 | +} | 
|  | 63 | + | 
|  | 64 | +Response _responsePlainText() { | 
|  | 65 | +  return Response.ok( | 
|  | 66 | +    body: Body.fromString('Hello, World!', mimeType: MimeType.plainText), | 
|  | 67 | +  ); | 
|  | 68 | +} | 
|  | 69 | + | 
|  | 70 | +final _jsonEncoder = JsonUtf8Encoder(); | 
0 commit comments