start_server function

Future<void> start_server({
  1. int port = 8080,
  2. void callback(
    1. Map<String, dynamic> metadata
    )?,
})

Implementation

Future<void> start_server({int port = 8080, void Function(Map<String, dynamic> metadata)? callback}) async {
  try{
    Database db = await _download_data();
    List<Map<String, dynamic>> items = await db.query("metadata");
    Map<String, dynamic> metadata = <String ,dynamic>{};
    for(var item in items){
      metadata[item['name']] = item['value'];
    }

    server = await HttpServer.bind(
      InternetAddress.loopbackIPv4,
      port,
      backlog: 1024,
      shared: true
    );

    if(callback != null){
      callback(metadata);
    }

    await for(HttpRequest request in server){
      final paths = request.uri.pathSegments;
      if(paths[0] == "tile"){
        int z = int.parse(paths[1]);
        int x = int.parse(paths[2]);
        int y = int.parse(paths[3]);
        List<Map<String, dynamic>> rows = await db.query("tiles",
          columns:["tile_data"],
          where:"zoom_level=$z and tile_column=$x and tile_row=$y");
        if(rows.isNotEmpty){
          dynamic tileData = rows[0]["tile_data"];
          Uint8List bytes = Uint8List.fromList(tileData);
          request.response
            ..headers.contentType = ContentType("image", "png")
            ..headers.contentLength = bytes.length
            ..add(bytes)
            ..close();
          continue;
        }
      }
      request.response.write('{"message":"welcome to access","paths":$paths}');
      await request.response.close();
    }
  }catch(err){
    print("internal server error:$err");
  }
}