From 27059532823177f265f1906377b24a349262f352 Mon Sep 17 00:00:00 2001 From: Levi Lesches Date: Thu, 10 Apr 2025 00:48:47 -0400 Subject: [PATCH] Fixed URI issues, test data format, and draw polyline (#6) * Fixed base API * Better parsing of the actual server data * Removed deno.lock from the repo * Fixed server responses and added usingDocker * Fix uris with usingDocker * Fixed polyline logic to show entire route --- src/client/.gitignore | 1 + src/client/lib/data.dart | 1 + src/client/lib/src/data/path.dart | 4 +- src/client/lib/src/data/polyline.dart | 45 ++ src/client/lib/src/data/trip.dart | 22 +- src/client/lib/src/pages/home.dart | 160 ++++---- src/client/lib/src/services/api.dart | 17 +- src/client/lib/src/view_models/home.dart | 18 +- src/client/pubspec.lock | 402 ------------------ src/client/pubspec.yaml | 2 + src/server/.gitignore | 1 + src/server/deno.lock | 501 ----------------------- src/server/index.ts | 122 +++--- src/server/utils.ts | 5 + 14 files changed, 241 insertions(+), 1060 deletions(-) create mode 100644 src/client/lib/src/data/polyline.dart delete mode 100644 src/client/pubspec.lock create mode 100644 src/server/.gitignore delete mode 100644 src/server/deno.lock diff --git a/src/client/.gitignore b/src/client/.gitignore index 6b27c3a..fea5393 100644 --- a/src/client/.gitignore +++ b/src/client/.gitignore @@ -11,6 +11,7 @@ .svn/ .swiftpm/ migrate_working_dir/ +pubspec.lock # IntelliJ related *.iml diff --git a/src/client/lib/data.dart b/src/client/lib/data.dart index 4576903..f8264a5 100644 --- a/src/client/lib/data.dart +++ b/src/client/lib/data.dart @@ -1,4 +1,5 @@ export "src/data/utils.dart"; export "src/data/trip.dart"; export "src/data/path.dart"; +export "src/data/polyline.dart"; export "src/data/stop.dart"; diff --git a/src/client/lib/src/data/path.dart b/src/client/lib/src/data/path.dart index cd28af7..12762b3 100644 --- a/src/client/lib/src/data/path.dart +++ b/src/client/lib/src/data/path.dart @@ -2,12 +2,12 @@ import "trip.dart"; import "utils.dart"; class PathStep { - final Trip trip; + final PathTrip trip; final TripStop enter; final TripStop exit; PathStep.fromJson(Json json) : - trip = Trip.fromJson(json["trip"]), + trip = PathTrip.fromJson(json["trip"]), enter = TripStop.fromJson(json["enter_bus"]), exit = TripStop.fromJson(json["exit_bus"]); } diff --git a/src/client/lib/src/data/polyline.dart b/src/client/lib/src/data/polyline.dart new file mode 100644 index 0000000..7adc537 --- /dev/null +++ b/src/client/lib/src/data/polyline.dart @@ -0,0 +1,45 @@ +import "package:fixnum/fixnum.dart"; +import "package:google_maps_flutter/google_maps_flutter.dart"; + +List decodePolyline(String polyline) { + final points = []; // List to hold the decoded coordinates + var index = 0; + final len = polyline.length; + var lat = Int32(); + var lng = Int32(); + + // While there are still characters to process in the polyline + while (index < len) { + int b; + var shift = 0; + var result = Int32(); + final oneF = Int32(0x1F); + + // Decode latitude + do { + b = polyline.codeUnitAt(index++) - 63; // Get the next character + result |= (Int32(b) & oneF) << shift; // Update the result + shift += 5; // Increase the shift + } while (b >= 0x20); // Continue until a character less than 0x20 is found + + final dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); // Decode the latitude delta + lat = (lat + dlat) as Int32; // Update the latitude + + shift = 0; // Reset shift for longitude decoding + result = Int32(); // Reset result for longitude decoding + + // Decode longitude + do { + b = polyline.codeUnitAt(index++) - 63; // Get the next character + result |= (Int32(b) & oneF) << shift; // Update the result + shift += 5; // Increase the shift + } while (b >= 0x20); // Continue until a character less than 0x20 is found + + final dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); // Decode the longitude delta + lng = (lng + dlng) as Int32; // Update the longitude + + // Add the new LatLng poInt32 to the list of points + points.add(LatLng(lat.toInt() / 1E5, lng.toInt() / 1E5)); + } + return points; +} diff --git a/src/client/lib/src/data/trip.dart b/src/client/lib/src/data/trip.dart index 434ed74..07ad343 100644 --- a/src/client/lib/src/data/trip.dart +++ b/src/client/lib/src/data/trip.dart @@ -34,21 +34,25 @@ class Trip { class TripStop { final double lat; final double long; - final List times; + // final List times; + // For testing, use this: + final String time; const TripStop({ required this.lat, required this.long, - required this.times, + // required this.times, + required this.time, }); TripStop.fromJson(Json json) : lat = json["latitude"], long = json["longitude"], - times = [ - for (final time in json["times"]) - ScheduledTime.fromJson(time), - ]; + time = json["time"]; + // times = [ + // for (final time in json["times"]) + // ScheduledTime.fromJson(time), + // ]; } class ScheduledTime { @@ -69,3 +73,9 @@ class ScheduledTime { return ScheduledTime(weekday: weekday, timeOfDay: timeOfDay); } } + +class PathTrip { + final String polyline; + PathTrip.fromJson(Json json) : + polyline = json["polyline"]; +} diff --git a/src/client/lib/src/pages/home.dart b/src/client/lib/src/pages/home.dart index 7eb9bed..9fb5a39 100644 --- a/src/client/lib/src/pages/home.dart +++ b/src/client/lib/src/pages/home.dart @@ -13,87 +13,95 @@ class HomePage extends ReactiveWidget { @override Widget build(BuildContext context, HomeModel model) => Scaffold( appBar: AppBar(title: const Text("Counter")), - body: Center( - child: SizedBox( - width: 300, - child: Column( - children: [ - Row( - children: [ - Expanded( - child: TextField( - controller: model.startLatitudeController, - decoration: const InputDecoration( - hintText: "Start latitude", - border: OutlineInputBorder(), - ), + body: Column( + children: [ + SizedBox( + width: 300, + child: Row( + children: [ + Expanded( + child: TextField( + controller: model.startLatitudeController, + decoration: const InputDecoration( + hintText: "Start latitude", + border: OutlineInputBorder(), ), ), - const SizedBox(width: 8), - Expanded( - child: TextField( - controller: model.startLongitudeController, - decoration: const InputDecoration( - hintText: "Start longitude", - border: OutlineInputBorder(), - ), - ), - ), - ], - ), - const SizedBox(height: 12), - Row( - children: [ - Expanded( - child: TextField( - controller: model.endLatitudeController, - decoration: const InputDecoration( - hintText: "End latitude", - border: OutlineInputBorder(), - ), - ), - ), - const SizedBox(width: 8), - Expanded( - child: TextField( - controller: model.endLongitudeController, - decoration: const InputDecoration( - hintText: "End Longitude", - border: OutlineInputBorder(), - ), - ), - ), - ], - ), - const SizedBox(height: 24), - FilledButton(onPressed: model.search, child: const Text("Search for a path")), - const SizedBox(height: 8), - const Divider(), - const SizedBox(height: 8), - if (model.isLoading) - const LinearProgressIndicator() - else if (model.isSearching && model.path == null) - const Text("Could not connect to API") - else - for (final step in model.path ?? []) Text( - "Get on at ${step.enter.lat}, ${step.enter.long}\n" - "Get off at ${step.exit.lat}, ${step.exit.long}", ), - SizedBox( - width: 300, - height: 300, - child: model.isGoogleReady - ? const GoogleMap( - initialCameraPosition: CameraPosition( - target: LatLng(42.10125081757972, -75.94181323552698), - zoom: 14, + const SizedBox(width: 8), + Expanded( + child: TextField( + controller: model.startLongitudeController, + decoration: const InputDecoration( + hintText: "Start longitude", + border: OutlineInputBorder(), ), - ) - : const Center(child: CircularProgressIndicator()), - ), - ], + ), + ), + ], + ), ), - ), + const SizedBox(height: 12), + SizedBox( + width: 300, + child: Row( + children: [ + Expanded( + child: TextField( + controller: model.endLatitudeController, + decoration: const InputDecoration( + hintText: "End latitude", + border: OutlineInputBorder(), + ), + ), + ), + const SizedBox(width: 8), + Expanded( + child: TextField( + controller: model.endLongitudeController, + decoration: const InputDecoration( + hintText: "End Longitude", + border: OutlineInputBorder(), + ), + ), + ), + ], + ), + ), + const SizedBox(height: 24), + FilledButton(onPressed: model.search, child: const Text("Search for a path")), + const SizedBox(height: 8), + const Divider(), + const SizedBox(height: 8), + if (model.isLoading) + const LinearProgressIndicator() + else if (model.isSearching && model.path == null) + const Text("Could not connect to API") + else + for (final step in model.path ?? []) Text( + "Get on at ${step.enter.lat}, ${step.enter.long}\n" + "Get off at ${step.exit.lat}, ${step.exit.long}", + ), + Expanded( + child: model.isGoogleReady + ? GoogleMap( + initialCameraPosition: const CameraPosition( + target: LatLng(42.10125081757972, -75.94181323552698), + zoom: 14, + ), + polylines: { + for (final (index, route) in model.routes.indexed) Polyline( + polylineId: PolylineId(index.toString()), + color: routeColors[index], + points: route, + ), + }, + ) + : const Center(child: CircularProgressIndicator()), + ), + ], ), ); } + +const routeColors = [Colors.blue, Colors.red, Colors.green, Colors.yellow, Colors.orange]; diff --git a/src/client/lib/src/services/api.dart b/src/client/lib/src/services/api.dart index eedc4a0..2f56443 100644 --- a/src/client/lib/src/services/api.dart +++ b/src/client/lib/src/services/api.dart @@ -7,29 +7,34 @@ import "package:client/data.dart"; import "service.dart"; class ApiService extends Service { + static const bool usingDocker = true; final client = http.Client(); @override Future init() async { } - Uri get _base => Uri(scheme: "https", host: "localhost", port: 5000); + Uri get _base => usingDocker + ? Uri(path: "api/") + : Uri(scheme: "http", host: "localhost", port: 80); Future?> _getAll(Uri uri, FromJson fromJson) async { try { final response = await client.get(uri); if (response.statusCode != 200) return null; - final json = jsonDecode(response.body) as List; + final json = jsonDecode(response.body)["path"] as List; return [ for (final obj in json.cast()) fromJson(obj), ]; - } catch (error) { + } catch (error, stackTrace) { + // ignore: avoid_print + print("Error: $error\n$stackTrace"); return null; } } Future?> getTrips() => _getAll( - _base.replace(path: "/trips"), + _base.resolve("trips"), Trip.fromJson, ); @@ -37,9 +42,7 @@ class ApiService extends Service { required Coordinates start, required Coordinates end, }) => _getAll( - _base.replace( - path: "/path", - ).replace( + _base.resolve("path").replace( queryParameters: { "start_lat": start.lat.toString(), "start_lon": start.long.toString(), diff --git a/src/client/lib/src/view_models/home.dart b/src/client/lib/src/view_models/home.dart index 0dd3539..67b9045 100644 --- a/src/client/lib/src/view_models/home.dart +++ b/src/client/lib/src/view_models/home.dart @@ -2,8 +2,12 @@ import "package:client/data.dart"; import "package:client/services.dart"; import "package:flutter/widgets.dart" hide Path; +import "package:google_maps_flutter/google_maps_flutter.dart"; + import "view_model.dart"; +typedef LatLng2 = (double lat, double lng); + /// The view model for the home page. class HomeModel extends ViewModel { final startLatitudeController = TextEditingController(); @@ -28,6 +32,8 @@ class HomeModel extends ViewModel { notifyListeners(); } + List> routes = []; + Future search() async { final start = (lat: startLatitude, long: startLongitude); final end = (lat: endLatitude, long: endLongitude); @@ -35,8 +41,16 @@ class HomeModel extends ViewModel { if (end.lat == null || end.long == null) return; isSearching = true; isLoading = true; - path = await services.api.getPath(start: start as Coordinates, end: end as Coordinates); - if (path != null) isSearching = false; + final result = await services.api.getPath(start: start as Coordinates, end: end as Coordinates); + path = result; isLoading = false; + if (result == null) return; + isSearching = false; + routes = [ + for (final step in result) [ + ...decodePolyline(step.trip.polyline), + ], + ]; + notifyListeners(); } } diff --git a/src/client/pubspec.lock b/src/client/pubspec.lock deleted file mode 100644 index b38a75e..0000000 --- a/src/client/pubspec.lock +++ /dev/null @@ -1,402 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.dev" - source: hosted - version: "2.13.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - build_cli_annotations: - dependency: transitive - description: - name: build_cli_annotations - sha256: b59d2769769efd6c9ff6d4c4cede0be115a566afc591705c2040b707534b1172 - url: "https://pub.dev" - source: hosted - version: "2.1.0" - characters: - dependency: transitive - description: - name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - convert: - dependency: transitive - description: - name: convert - sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev" - source: hosted - version: "3.1.2" - csslib: - dependency: transitive - description: - name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - dhttpd: - dependency: "direct dev" - description: - name: dhttpd - sha256: "2e24765d7569b8e0a02a441e3cf96f09cca69dfecba646e7e9f6b3ab45a2f3fe" - url: "https://pub.dev" - source: hosted - version: "4.1.0" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: "5a1e6fb2c0561958d7e4c33574674bda7b77caaca7a33b758876956f2902eea3" - url: "https://pub.dev" - source: hosted - version: "2.0.27" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - go_router: - dependency: "direct main" - description: - name: go_router - sha256: f02fd7d2a4dc512fec615529824fdd217fecb3a3d3de68360293a551f21634b3 - url: "https://pub.dev" - source: hosted - version: "14.8.1" - google_maps: - dependency: transitive - description: - name: google_maps - sha256: "4d6e199c561ca06792c964fa24b2bac7197bf4b401c2e1d23e345e5f9939f531" - url: "https://pub.dev" - source: hosted - version: "8.1.1" - google_maps_flutter: - dependency: "direct main" - description: - name: google_maps_flutter - sha256: b42ff7f3875a5eedbe388d883100561b85c62beed1c39ad66dd60537c75bb424 - url: "https://pub.dev" - source: hosted - version: "2.12.0" - google_maps_flutter_android: - dependency: transitive - description: - name: google_maps_flutter_android - sha256: "0ede4ae8326335c0c007c8c7a8c9737449263123385e2bdf49f3e71103b2dc2e" - url: "https://pub.dev" - source: hosted - version: "2.16.0" - google_maps_flutter_ios: - dependency: transitive - description: - name: google_maps_flutter_ios - sha256: ef72c822930ce69515cb91c10cd88cfb8b26296f765808a43cbc9a10eaffacfe - url: "https://pub.dev" - source: hosted - version: "2.15.0" - google_maps_flutter_platform_interface: - dependency: transitive - description: - name: google_maps_flutter_platform_interface - sha256: "970c8f766c02909c7be282dea923c971f83a88adaf07f8871d0aacebc3b07bb2" - url: "https://pub.dev" - source: hosted - version: "2.11.1" - google_maps_flutter_web: - dependency: transitive - description: - name: google_maps_flutter_web - sha256: a45786ea6691cc7cdbe2cf3ce2c2daf4f82a885745666b4a36baada3a4e12897 - url: "https://pub.dev" - source: hosted - version: "0.5.12" - html: - dependency: "direct main" - description: - name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" - url: "https://pub.dev" - source: hosted - version: "0.15.5" - http: - dependency: "direct main" - description: - name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f - url: "https://pub.dev" - source: hosted - version: "1.3.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" - source: hosted - version: "4.1.2" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" - url: "https://pub.dev" - source: hosted - version: "10.0.9" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 - url: "https://pub.dev" - source: hosted - version: "3.0.9" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev" - source: hosted - version: "3.0.1" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.dev" - source: hosted - version: "0.12.17" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" - source: hosted - version: "0.11.1" - meta: - dependency: transitive - description: - name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.dev" - source: hosted - version: "1.16.0" - mime: - dependency: transitive - description: - name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - sanitize_html: - dependency: transitive - description: - name: sanitize_html - sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - shelf: - dependency: transitive - description: - name: shelf - sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 - url: "https://pub.dev" - source: hosted - version: "1.4.2" - shelf_static: - dependency: transitive - description: - name: shelf_static - sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 - url: "https://pub.dev" - source: hosted - version: "1.1.3" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev" - source: hosted - version: "1.10.1" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - stream_transform: - dependency: transitive - description: - name: stream_transform - sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.dev" - source: hosted - version: "2.1.1" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd - url: "https://pub.dev" - source: hosted - version: "0.7.4" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - very_good_analysis: - dependency: "direct dev" - description: - name: very_good_analysis - sha256: "1fb637c0022034b1f19ea2acb42a3603cbd8314a470646a59a2fb01f5f3a8629" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 - url: "https://pub.dev" - source: hosted - version: "15.0.0" - web: - dependency: "direct main" - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" -sdks: - dart: ">=3.7.0-0 <4.0.0" - flutter: ">=3.27.0" diff --git a/src/client/pubspec.yaml b/src/client/pubspec.yaml index 05bdd20..a2286cf 100644 --- a/src/client/pubspec.yaml +++ b/src/client/pubspec.yaml @@ -7,12 +7,14 @@ environment: sdk: ^3.5.0 dependencies: + fixnum: ^1.1.1 flutter: sdk: flutter go_router: ^14.2.7 google_maps_flutter: ^2.12.0 html: ^0.15.5 http: ^1.3.0 + polyline_tools: ^0.0.2 web: ^1.1.1 dev_dependencies: diff --git a/src/server/.gitignore b/src/server/.gitignore new file mode 100644 index 0000000..fff3a34 --- /dev/null +++ b/src/server/.gitignore @@ -0,0 +1 @@ +deno.lock diff --git a/src/server/deno.lock b/src/server/deno.lock deleted file mode 100644 index e3d09d7..0000000 --- a/src/server/deno.lock +++ /dev/null @@ -1,501 +0,0 @@ -{ - "version": "4", - "specifiers": { - "jsr:@oak/acorn@^1.1.1": "1.1.1", - "jsr:@oak/commons@1": "1.0.0", - "jsr:@std/assert@1": "1.0.11", - "jsr:@std/bytes@1": "1.0.5", - "jsr:@std/crypto@1": "1.0.4", - "jsr:@std/encoding@1": "1.0.7", - "jsr:@std/encoding@^1.0.7": "1.0.7", - "jsr:@std/fmt@^1.0.5": "1.0.5", - "jsr:@std/fs@^1.0.11": "1.0.13", - "jsr:@std/http@1": "1.0.13", - "jsr:@std/internal@^1.0.5": "1.0.5", - "jsr:@std/io@~0.225.2": "0.225.2", - "jsr:@std/log@0.224": "0.224.14", - "jsr:@std/media-types@1": "1.1.0", - "jsr:@valibot/valibot@0.42": "0.42.1", - "npm:@types/node@^22.13.11": "22.13.11", - "npm:buffer@6": "6.0.3", - "npm:hyperid@^3.3.0": "3.3.0", - "npm:path-to-regexp@^8.2.0": "8.2.0", - "npm:qs@^6.13.0": "6.14.0", - "npm:string_decoder@^1.3.0": "1.3.0", - "npm:undici@^6.18.0": "6.21.1" - }, - "jsr": { - "@oak/acorn@1.1.1": { - "integrity": "a6157ef41a7886c14b296bf91b058492b5fd642102666bf8d71c57b92a4e94c0", - "dependencies": [ - "jsr:@oak/commons", - "jsr:@std/assert", - "jsr:@std/http", - "jsr:@std/log", - "jsr:@valibot/valibot", - "npm:buffer", - "npm:hyperid", - "npm:path-to-regexp", - "npm:qs", - "npm:string_decoder", - "npm:undici" - ] - }, - "@oak/commons@1.0.0": { - "integrity": "49805b55603c3627a9d6235c0655aa2b6222d3036b3a13ff0380c16368f607ac", - "dependencies": [ - "jsr:@std/assert", - "jsr:@std/bytes", - "jsr:@std/crypto", - "jsr:@std/encoding@1", - "jsr:@std/http", - "jsr:@std/media-types" - ] - }, - "@std/assert@1.0.11": { - "integrity": "2461ef3c368fe88bc60e186e7744a93112f16fd110022e113a0849e94d1c83c1", - "dependencies": [ - "jsr:@std/internal" - ] - }, - "@std/bytes@1.0.5": { - "integrity": "4465dd739d7963d964c809202ebea6d5c6b8e3829ef25c6a224290fbb8a1021e" - }, - "@std/crypto@1.0.4": { - "integrity": "cee245c453bd5366207f4d8aa25ea3e9c86cecad2be3fefcaa6cb17203d79340" - }, - "@std/encoding@1.0.7": { - "integrity": "f631247c1698fef289f2de9e2a33d571e46133b38d042905e3eac3715030a82d" - }, - "@std/fmt@1.0.5": { - "integrity": "0cfab43364bc36650d83c425cd6d99910fc20c4576631149f0f987eddede1a4d" - }, - "@std/fs@1.0.13": { - "integrity": "756d3ff0ade91c9e72b228e8012b6ff00c3d4a4ac9c642c4dac083536bf6c605" - }, - "@std/http@1.0.13": { - "integrity": "d29618b982f7ae44380111f7e5b43da59b15db64101198bb5f77100d44eb1e1e", - "dependencies": [ - "jsr:@std/encoding@^1.0.7" - ] - }, - "@std/internal@1.0.5": { - "integrity": "54a546004f769c1ac9e025abd15a76b6671ddc9687e2313b67376125650dc7ba" - }, - "@std/io@0.225.2": { - "integrity": "3c740cd4ee4c082e6cfc86458f47e2ab7cb353dc6234d5e9b1f91a2de5f4d6c7" - }, - "@std/log@0.224.14": { - "integrity": "257f7adceee3b53bb2bc86c7242e7d1bc59729e57d4981c4a7e5b876c808f05e", - "dependencies": [ - "jsr:@std/fmt", - "jsr:@std/fs", - "jsr:@std/io" - ] - }, - "@std/media-types@1.1.0": { - "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4" - }, - "@valibot/valibot@0.42.1": { - "integrity": "ba0f6f7964aaeec0e4b1f793d575061f325ae6254cbb9d7ff01fb65068a0a23b" - } - }, - "npm": { - "@types/node@22.13.11": { - "integrity": "sha512-iEUCUJoU0i3VnrCmgoWCXttklWcvoCIx4jzcP22fioIVSdTmjgoEvmAO/QPw6TcS9k5FrNgn4w7q5lGOd1CT5g==", - "dependencies": [ - "undici-types" - ] - }, - "base64-js@1.5.1": { - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "buffer@5.7.1": { - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dependencies": [ - "base64-js", - "ieee754" - ] - }, - "buffer@6.0.3": { - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dependencies": [ - "base64-js", - "ieee754" - ] - }, - "call-bind-apply-helpers@1.0.2": { - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": [ - "es-errors", - "function-bind" - ] - }, - "call-bound@1.0.3": { - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dependencies": [ - "call-bind-apply-helpers", - "get-intrinsic" - ] - }, - "dunder-proto@1.0.1": { - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": [ - "call-bind-apply-helpers", - "es-errors", - "gopd" - ] - }, - "es-define-property@1.0.1": { - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" - }, - "es-errors@1.3.0": { - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-object-atoms@1.1.1": { - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": [ - "es-errors" - ] - }, - "function-bind@1.1.2": { - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "get-intrinsic@1.3.0": { - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dependencies": [ - "call-bind-apply-helpers", - "es-define-property", - "es-errors", - "es-object-atoms", - "function-bind", - "get-proto", - "gopd", - "has-symbols", - "hasown", - "math-intrinsics" - ] - }, - "get-proto@1.0.1": { - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": [ - "dunder-proto", - "es-object-atoms" - ] - }, - "gopd@1.2.0": { - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - }, - "has-symbols@1.1.0": { - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" - }, - "hasown@2.0.2": { - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": [ - "function-bind" - ] - }, - "hyperid@3.3.0": { - "integrity": "sha512-7qhCVT4MJIoEsNcbhglhdmBKb09QtcmJNiIQGq7js/Khf5FtQQ9bzcAuloeqBeee7XD7JqDeve9KNlQya5tSGQ==", - "dependencies": [ - "buffer@5.7.1", - "uuid", - "uuid-parse" - ] - }, - "ieee754@1.2.1": { - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "math-intrinsics@1.1.0": { - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" - }, - "object-inspect@1.13.4": { - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" - }, - "path-to-regexp@8.2.0": { - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==" - }, - "qs@6.14.0": { - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dependencies": [ - "side-channel" - ] - }, - "safe-buffer@5.2.1": { - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "side-channel-list@1.0.0": { - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": [ - "es-errors", - "object-inspect" - ] - }, - "side-channel-map@1.0.1": { - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dependencies": [ - "call-bound", - "es-errors", - "get-intrinsic", - "object-inspect" - ] - }, - "side-channel-weakmap@1.0.2": { - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": [ - "call-bound", - "es-errors", - "get-intrinsic", - "object-inspect", - "side-channel-map" - ] - }, - "side-channel@1.1.0": { - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": [ - "es-errors", - "object-inspect", - "side-channel-list", - "side-channel-map", - "side-channel-weakmap" - ] - }, - "string_decoder@1.3.0": { - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": [ - "safe-buffer" - ] - }, - "undici-types@6.20.0": { - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, - "undici@6.21.1": { - "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==" - }, - "uuid-parse@1.1.0": { - "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==" - }, - "uuid@8.3.2": { - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - }, - "remote": { - "https://deno.land/std@0.119.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", - "https://deno.land/std@0.119.0/_util/os.ts": "dfb186cc4e968c770ab6cc3288bd65f4871be03b93beecae57d657232ecffcac", - "https://deno.land/std@0.119.0/async/deadline.ts": "1d6ac7aeaee22f75eb86e4e105d6161118aad7b41ae2dd14f4cfd3bf97472b93", - "https://deno.land/std@0.119.0/async/debounce.ts": "b2f693e4baa16b62793fd618de6c003b63228db50ecfe3bd51fc5f6dc0bc264b", - "https://deno.land/std@0.119.0/async/deferred.ts": "ab60d46ba561abb3b13c0c8085d05797a384b9f182935f051dc67136817acdee", - "https://deno.land/std@0.119.0/async/delay.ts": "f2d8ccaa8ebc26594bd8b0989edfd8a96257a714c1dee2fb54d986e5bdd840ac", - "https://deno.land/std@0.119.0/async/mod.ts": "78425176fabea7bd1046ce3819fd69ce40da85c83e0f174d17e8e224a91f7d10", - "https://deno.land/std@0.119.0/async/mux_async_iterator.ts": "62abff3af9ff619e8f2adc96fc70d4ca020fa48a50c23c13f12d02ed2b760dbe", - "https://deno.land/std@0.119.0/async/pool.ts": "353ce4f91865da203a097aa6f33de8966340c91b6f4a055611c8c5d534afd12f", - "https://deno.land/std@0.119.0/async/tee.ts": "3e9f2ef6b36e55188de16a667c702ace4ad0cf84e3720379160e062bf27348ad", - "https://deno.land/std@0.119.0/bytes/bytes_list.ts": "3bff6a09c72b2e0b1e92e29bd3b135053894196cca07a2bba842901073efe5cb", - "https://deno.land/std@0.119.0/bytes/equals.ts": "69f55fdbd45c71f920c1a621e6c0865dc780cd8ae34e0f5e55a9497b70c31c1b", - "https://deno.land/std@0.119.0/bytes/mod.ts": "fedb80b8da2e7ad8dd251148e65f92a04c73d6c5a430b7d197dc39588c8dda6f", - "https://deno.land/std@0.119.0/encoding/base64.ts": "0b58bd6477214838bf711eef43eac21e47ba9e5c81b2ce185fe25d9ecab3ebb3", - "https://deno.land/std@0.119.0/encoding/base64url.ts": "a5c3f71c99a397f9c6da7701e7cae4c031700ae180ba68a0fc9ff9baca71e4ac", - "https://deno.land/std@0.119.0/fmt/colors.ts": "8368ddf2d48dfe413ffd04cdbb7ae6a1009cf0dccc9c7ff1d76259d9c61a0621", - "https://deno.land/std@0.119.0/fmt/printf.ts": "419510e0a3f7c8d680fbf6472d5a11e372854f1c2b32fca5fdb513575c485068", - "https://deno.land/std@0.119.0/io/buffer.ts": "8f10342821b81990acf859cdccb4e4031c7c9187a0ffc3ed6b356ee29ecc6681", - "https://deno.land/std@0.119.0/node/_buffer.js": "a43c35f89ef15c2107cba863d2cd0bd573e829a2a3b80167033da9b96066ce51", - "https://deno.land/std@0.119.0/node/_core.ts": "8b105f152c9f8990f7558b0a0a514d4f3ab90a85c09ca60e489ca92ed5271f75", - "https://deno.land/std@0.119.0/node/_errors.ts": "bf047995427fc15a27a182ee13021e94315fa758c1cc7c3576374876ab9f952a", - "https://deno.land/std@0.119.0/node/_fixed_queue.ts": "ac68975e5663ea9cf2e465e91a7600fa3d5dc1a2f556cf80fd1ee25b37dbcedf", - "https://deno.land/std@0.119.0/node/_next_tick.ts": "9b0bde39bfad9774be73b0fe9e77df757e147e2fc04784d51fe777d36d142260", - "https://deno.land/std@0.119.0/node/_process/process.ts": "828b67fa5858e30901e11a84968b2732057cd0bea34afcf49f617498040e7dbe", - "https://deno.land/std@0.119.0/node/_util/_debuglog.ts": "b46f7b640bad2afb8adf2b3560e6969071f9de0721dcec9e3530465ab5ec6c40", - "https://deno.land/std@0.119.0/node/_util/_util_callbackify.ts": "a89ade5b5d989f9eb9261cd8179a5f8a1579c6a898549fab304200a85ee520b0", - "https://deno.land/std@0.119.0/node/_util/_util_promisify.ts": "6d8d88fd81763f1074c84f4494484f9dd86182dfe46b63fe5aadd6448b767896", - "https://deno.land/std@0.119.0/node/_utils.ts": "42e5b28e1740ba0be9b4ace2c9adb95317d9cadb099418c51ed34cd6a301cae3", - "https://deno.land/std@0.119.0/node/buffer.ts": "cf37645cd1fc08f1afa02532dc6682cefd8cabbf44812aa9a4916e79bdd1cd11", - "https://deno.land/std@0.119.0/node/internal/buffer.js": "21f4bfea78679e18bfebeb1d9ece1a94d337d282a2a68d43ab5ff655c2d33e56", - "https://deno.land/std@0.119.0/node/internal/idna.ts": "6d7cce3e569fd1d9e558d63ab522700e57b998597196a4746436a62f3f8b1c7f", - "https://deno.land/std@0.119.0/node/internal/querystring.ts": "1fdee1158205dd220c3711cce2e994bd0848abc7518d245856d142b08a266a07", - "https://deno.land/std@0.119.0/node/internal/util.js": "11ef4e4724a4d40f1f5ed4a54e42cee3c3af0f75dcea33ac063747a6e3b9a582", - "https://deno.land/std@0.119.0/node/internal/util/comparisons.ts": "9e6979948221ee00a105355d8a9afe47fa059a331351cbb2e11fa8e2f50749d4", - "https://deno.land/std@0.119.0/node/internal/util/inspect.js": "2b50eb7e8b1d5a73a933f56a361262cf2f23429a8e1ca6ee47db04229bf12208", - "https://deno.land/std@0.119.0/node/internal/util/types.ts": "31745332605771b59701baebf1655f389202b10bb787afb78e66c92486bc0332", - "https://deno.land/std@0.119.0/node/internal/validators.js": "16b58d8ac8505897422d4ad273652a8cb36c470f470df9677700cc3b78c24c19", - "https://deno.land/std@0.119.0/node/internal_binding/_libuv_winerror.ts": "689b8fa52dafb7a1b55f3ffceca5905f77fb2720a8b9f77c921cd598e3ef3757", - "https://deno.land/std@0.119.0/node/internal_binding/_node.ts": "c257e872993334cfab1eaab8212d422b24f7388281f73c7bbdd9bbf1bb2a7841", - "https://deno.land/std@0.119.0/node/internal_binding/_utils.ts": "ee6830db046e829b5c4d6df1de21f1a3d6464469a2fe303b32bc44bb171c2eeb", - "https://deno.land/std@0.119.0/node/internal_binding/_winerror.ts": "27e4a7d78ae31e7b07faafd25fe46fa367271aec0a49f3be067f7ec160396a38", - "https://deno.land/std@0.119.0/node/internal_binding/buffer.ts": "f92daf02083bdaf0006a06fa1f26a26436f4b7b0c5d000aff7d01da3d1aa42a5", - "https://deno.land/std@0.119.0/node/internal_binding/constants.ts": "91c9274c8891f93262032129348b25f170162cb126dc424ec7ce8a2172812657", - "https://deno.land/std@0.119.0/node/internal_binding/string_decoder.ts": "6aca87fb018705e34c39d6f67d610b14c8ca04a47ca58f0d1fc8d5f9281e6b7b", - "https://deno.land/std@0.119.0/node/internal_binding/types.ts": "80621e22989a1431068bc3b7f59cab3afb42cfb4d4cd273e61fa2d11ab3abab6", - "https://deno.land/std@0.119.0/node/internal_binding/util.ts": "446b4d704f4d588df98db9c6f9c7465c08a23f20f781ba55bcc246fb260012af", - "https://deno.land/std@0.119.0/node/internal_binding/uv.ts": "3b722cd20508d54e4d790c825b23510a5fa4313ad42bfb8904704a738df32325", - "https://deno.land/std@0.119.0/node/path.ts": "86b262d6957fba13d4f3d58a92ced49de4f40169d06542326b5547ff97257f0d", - "https://deno.land/std@0.119.0/node/querystring.ts": "4f436efdd97659fe567c00f1cff233d4f5b67002ef388951db052dfe7c3de114", - "https://deno.land/std@0.119.0/node/string_decoder.ts": "e97d4988a3490fd572fc23e64b3a33dabc4ac76c1fb82665f34dc8956d57a658", - "https://deno.land/std@0.119.0/node/url.ts": "c58bd8adfde3833026c1c3c8f55cd14e37f9f1e4dd6b7b99c5feb4ace710e9b4", - "https://deno.land/std@0.119.0/node/util.ts": "3be88d5d1c908f279bf7fecd77ff3933e048aa50205029fdd69280f67aea5901", - "https://deno.land/std@0.119.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", - "https://deno.land/std@0.119.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", - "https://deno.land/std@0.119.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b", - "https://deno.land/std@0.119.0/path/common.ts": "f41a38a0719a1e85aa11c6ba3bea5e37c15dd009d705bd8873f94c833568cbc4", - "https://deno.land/std@0.119.0/path/glob.ts": "ea87985765b977cc284b92771003b2070c440e0807c90e1eb0ff3e095911a820", - "https://deno.land/std@0.119.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12", - "https://deno.land/std@0.119.0/path/posix.ts": "34349174b9cd121625a2810837a82dd8b986bbaaad5ade690d1de75bbb4555b2", - "https://deno.land/std@0.119.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c", - "https://deno.land/std@0.119.0/path/win32.ts": "11549e8c6df8307a8efcfa47ad7b2a75da743eac7d4c89c9723a944661c8bd2e", - "https://deno.land/std@0.119.0/streams/conversion.ts": "7ff9af42540063fa72003ab31a377ba9dde8532d43b16329b933c37a6d7aac5f", - "https://deno.land/std@0.119.0/testing/_diff.ts": "e6a10d2aca8d6c27a9c5b8a2dbbf64353874730af539707b5b39d4128140642d", - "https://deno.land/std@0.119.0/testing/asserts.ts": "e8bd3ff280731e2d2b48c67d6ed97ce2c0b717601ccb38816aff89edce71680d", - "https://deno.land/std@0.157.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", - "https://deno.land/std@0.157.0/bytes/bytes_list.ts": "aba5e2369e77d426b10af1de0dcc4531acecec27f9b9056f4f7bfbf8ac147ab4", - "https://deno.land/std@0.157.0/bytes/equals.ts": "3c3558c3ae85526f84510aa2b48ab2ad7bdd899e2e0f5b7a8ffc85acb3a6043a", - "https://deno.land/std@0.157.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf", - "https://deno.land/std@0.157.0/io/buffer.ts": "fae02290f52301c4e0188670e730cd902f9307fb732d79c4aa14ebdc82497289", - "https://deno.land/std@0.157.0/streams/conversion.ts": "fc4eb76a14148c43f0b85e903a5a1526391aa40ed9434dc21e34f88304eb823e", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-util.js": "6188861fdee925a1085384702ada49d4102f7084697b9b38319e4d53ded11248", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v1.js": "f81e4290ea83341b3151fa10f25c570f6e9bee44b4976610b316d621452f403f", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v1.transformer.js": "bc5f2e7eb4a39d057a9d14cbc81d4b43b435b5c4b71d3c8917d06afd81f8774c", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v2.js": "f121a291825044f7e174963d96fedecc6a57c29aca1bdc60fe6239d448531f26", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v2.transformer.js": "bd1cbdbbecdabaf3d9c80824c2e92307abcfe1a9dce403a9786ea34c71a0a13c", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v3.js": "7036c83e49a3906f2639717323d230486d9fddd4500d343d90ef1ec4eb3fb665", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v3.transformer.js": "d14279a5c09d70ccf43750ca3930be4810fc37d38a663328f26d6f87b6b5bee3", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x0.js": "9ebda7629bd511bc55a0ace523e1e3a8c6c06a2049eaa5c80d27bdec4451283b", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x0.transformer.js": "a3a47856ee49c2af9bf56db608959527bc9cfbd7208ec017be8a74bb272ab7b8", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x1.js": "b8cf09b24e660079866de4ee69f890c31eb55c162f98e0a8b947ed4f9b9c59c4", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x1.transformer.js": "3a5ea40231c8df92c1af41c29d95d4db41ffe00f53eab0f89892f9dc978998a7", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x2.js": "f97b2d1a99f487dc0a356f58024a10d977e5677d1e205a31637c91005ec31663", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x2.transformer.js": "02f083dae8b1994b04c8ac773ec6a233fb59abb85450e4c3a3c15ac96bba3094", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x3.js": "0dcba1e488bbe33b6b46dfd3ac44af235fe6741df1595c738c27808deed586b2", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x3.transformer.js": "45b913c622f7d51b4c570aeb8b3d69305ef11845dd26d50c122c89c4a9de94d0", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x4.js": "168f543cb415ea07a7459ddda302025639a263b0b8d4b5cddf0199c0f1de3f81", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v4x4.transformer.js": "85a4fdde11f428caa01d8657d3904885a27cef0e511e9e85a4905ee3aac6a100", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x0.js": "9c14bbaedefcfccee8eb7afa77c53603e3f8aabf0a5b2ea6bb7bc7cd4615c103", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x0.transformer.js": "3093aa5b2543cb174b559e55a5ff9d294b7e51474ddffe345403caa082f760e6", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x0.utc.transformer.js": "3447525c410da810896c8cd82413fae58010d3e3b4db5f5b4600898e6495997e", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x1.js": "714de8f0ae9ff09f739ef9eb48a485e05a7806bdbe82acd0403c779c85c7d9c1", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x1.transformer.js": "3fdcff71e4d6d258fbbb4ad64d79dd650635a5640e20fbd554b4e2f5981f046a", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x2.js": "08331ed2f8125456fbd79bdc2bec58c617c7f5e8832a45e16bf959d499ad90d8", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x2.transformer.js": "22a97efd4d68679dd39fea0d94dc7cbd38a46773d8254a063e7a2b3ae04e968a", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x3.js": "adfd91290269cc99472063ecf348804bdc898926f90943ee204270ff260fd6ec", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x3.transformer.js": "f352b5f54b5db80ba7ec51985fabb00ce5067f2f92e9bff9803d7bdc080bcf64", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x4.js": "994b5098db3243b88647c663f392bf8a7e6a0ffae4e30a3d85244d61de87718f", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x4.transformer.js": "966d71a5c0ff99eb40e73a3ade69d0555b1333759dde00d222447584315c31d7", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x5.js": "e4ba4bf6e9d249b9deee6fd8f50e85009dfb7640485b240a8810961c368c30a9", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x5.transformer.js": "43983c40de0544c36987559773d3f356d90a88b142bf8d08a56387c482cc490f", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x6.js": "6658a3d69ed023e629979cbee6b802810a62395f5b04a19f9abb9319774e0273", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x6.transformer.js": "985eff910b26ebedf1f82217591f5c85f2c249b0a4052ef0a1e25102810f2bda", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x7.js": "506caeae0da1a6bd9be30a8729dddf76dd73ed5495ac4b3cd03cb98887b74300", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x7.transformer.js": "897ace26170c2255e951d2697a029f957357c59def09459caa3f0e906e73b83e", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x8.js": "7706020193d6fd1d2314be58ca441ed318f5df535b8be2c3421f85c36abee953", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/bolt-protocol-v5x8.transformer.js": "6a188d70b171d0f97bb4c85e0980d3d20e7d27fb88bcab68218a7bee5ae51914", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/create.js": "1f04ec788f468842350cd34c1f3788e06e48fa9f69b3d745831b8798f07eaf68", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/handshake.js": "1b6421547f4439a03f5b82f65b8f0a0764045c0807692ac9f38292b105664340", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/index.js": "6b6320102de3ac69fede4512591b53522678956f1bab002742014e35eaba350f", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/request-message.js": "ca0e31c57a30ab2f6ee54012d03ce0bb0d1007bf3e6657a89abfaa1d984dfd53", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/response-handler.js": "2bdef7a1c9c8850f4ba594ba40eb97bfd2bb1e13e8e808276c34048bf6e31648", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/routing-table-raw.js": "d17532440c85c4e5ffa42cd2a35bd334713135f681cab5e3bb5f4b27e1d86b5f", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/stream-observers.js": "f5e71feff58dd5b32ecb6e86edb45fdabe01abe12866284ccbd0bdf709ba9658", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/temporal-factory.js": "f23fa2154f8a450416071ad7bc4c45c4b35f307226aeeba650d64a9e1c10f44c", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/bolt/transformer.js": "2c73d9c235529fae3aca1cd6537786e37dc21371a342205db30cd2718d0afd58", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/buf/base-buf.js": "ad1fea47cff99244c15624adca837c78824b5ff2b1ee5cf9c8f8d1f0b87fbe17", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/buf/index.js": "52e94c8ecf57fec12b1d6a79b72636240250e0270b3a995264854d584c4fd169", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/channel-buf.js": "8b5ebef2fe3d6e282686d9bd6edb7a14fc0d391cbd9b029ef1c040dabc9a1ddb", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/channel-config.js": "6b4c0a7feeba38801eae93ea81b4776025e876f6fe91f30304136baecb51c90c", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/chunking.js": "6cb0edcd168cad7ec4245803158a5761771067d87d1c91a4edc85fa648917886", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/combined-buf.js": "22ac829cdfb1180ec4d08b7088bc9098fe2f2757687d54452680d931d3f632cf", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/deno/deno-channel.js": "794a1eae08276feaa19007663e9661d17034bed40e5752268874f12d3c0d7d2e", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/deno/deno-client-certificates-loader.js": "b9faf33b51f566f1605a6f98c052b0b19b714741f80221fd016a31973b86da47", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/deno/deno-host-name-resolver.js": "11e46fdd2899a290116f34e31ce797733a95c348ed7ef79d4b0a33f48118174d", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/deno/index.js": "64435776e1305c37c197e43e18f02e65fdfdcbc0a4e874c844176e2cb86609e6", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/index.js": "0af32b512036837092d4b850bb11e8bc08a6d8f211a104697593f6fda5d1381d", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/channel/utf8.js": "646d64b2dfe1ea7d69ed5f73848ef4fc5ed4a759bcf2698079e81166210e8f59", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection-provider/authentication-provider.js": "8f3410dd754086574744e9ef724403ba94c1b02d9b09feabc57d44ce002ee87b", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection-provider/client-certificate-holder.js": "583bf8a72f427c23593aa694a74df2b88417b9ae0d378135bacb15c25645fcca", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection-provider/connection-provider-direct.js": "6c031c0d631941d8f9271162d7645ac8d5fc39dafc5476f1960da8a4d3911ad1", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection-provider/connection-provider-pooled.js": "f81b91413ff90b06d5c4684a4a58f4c0ddb036dee4fd2f6b3e19bf296d2bd722", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection-provider/connection-provider-routing.js": "8639fba3339ff96d78d6dd5792a60b330457df31a3afcb264120b3f8f7811fbf", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection-provider/connection-provider-single.js": "27b4bdddb86970901d6846d5b791ea7ec0597359960051fcf39f26c7f092277e", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection-provider/index.js": "a07265e0efc70f05429479c0890e7db30ec2a1d885b5844adf381ce0285b6e14", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection-provider/liveness-check-provider.js": "fa72fb17681cc3fcfe97029a68bbe17e0e96d2da72d613071a81b6f0329d7d7a", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection/connection-channel.js": "804ad2052121d32285c241c7a4c5965e8fbf963a42edf168c846b4a9c7d778d3", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection/connection-delegate.js": "dc23005fa9562185965b241faddd982bc4bac6fadef9a54805a8a29791f97b53", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection/connection-error-handler.js": "7cb75e2417556550baa154e7db9f79cf0ab2f6df59522a0cde023226c10b5361", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection/connection.js": "873fb4aa01d51c837f911d669cad1e8cae68455804f6ed454eaeedd6ed3bbdd8", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/connection/index.js": "41349a6d563ebebb557ace8b919bc793890e01e17f0b0d100a1785da5fa1d995", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/index.js": "199d52389c391d27b76b6ab874808690b17b7c9970c334477e2fbe9d3b96a5a7", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/lang/functional.js": "e5326a229dd38fac2f9623caa1465f835a835895b5a89bb645b71f7ee4c7e819", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/lang/index.js": "1fc9b3dcf8324eacee7aeea2afd3cb619a0c1080ed92f72d4fa0af2460f5fda6", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/lang/object.js": "3c4a9a3040b2bbaa42fd5cf550d2992fa2c5b602e594e45f185384d0bfff58f4", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/load-balancing/index.js": "99b3e2559c2646d7fb1569a8176e9cae02ca2ca20bc3f004b68458d02d7afb10", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/load-balancing/least-connected-load-balancing-strategy.js": "2b15f9e3b43accb615ff51a6d5b78c76b5e77a0da10e5cecaf0965632d52521a", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/load-balancing/load-balancing-strategy.js": "64b8f3122d0d19fefbc288098ca19b0a8c4cf0582de9f242db29fd6ad5a5b834", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/load-balancing/round-robin-array-index.js": "14866d564f8db3e88ff40ae5831da39fd8b56c8ea7f0a7033e4e2bff9acd5301", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/packstream/index.js": "b8f9a8d64a180566e601460d6f262bddd289f4f6d5439918bea505c0beea9d3e", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/packstream/packstream-v1.js": "6f37bcd98d2201dcaa07b235a239d59200f37ac47684bdc31c8e741fecb8fbc3", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/packstream/packstream-v2.js": "05ed1671fb691527595591a8953a34dd541190672f6062b928bf1fdf5d2f3f18", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/packstream/structure.js": "d694bdf00c72843408d7db60b619ed93bca769a00999f7433212808cbc9d3b24", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/rediscovery/index.js": "31df074a0d7f2447e5197ea9707fbcb67c6a66c73450d32e6028ede90ae3ce47", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/rediscovery/rediscovery.js": "519e2414560945b5467028b305c34a0699aa1a2bd15b5260576ef7cb6433c017", - "https://deno.land/x/neo4j_driver_lite@5.28.1/bolt-connection/rediscovery/routing-table.js": "53dd3878f25a574a665ab310821703c3e68b9800f507fe2b787d505622d67793", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/auth-token-manager.ts": "0710403bd4dee8de08a97a6ea5aa96c0692dee9e90e9d291826845e6e27e1748", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/auth.ts": "ea97dde1b1343fead62d2595fe30b687fdea1a2b6eb0d9582ca89de0383bb9ac", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/bookmark-manager.ts": "0abd0a37804789cf4f8e0b4bdf86f37b9cf5127a515666f23469c2e2ef775cef", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/client-certificate.ts": "85666813c1a25f89da49f1d9db76fed62e3f4abeba41e37c644634fd7ba7463e", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/connection-provider.ts": "c889ca4dd8ef8ea32f1d88490142f8ca3642589efaae6e62c3e5d1f3b5b62a0b", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/connection.ts": "b9cdfd3c0b9fdeb081ae53a134217912e44f1bd7ea17d7bd7d6da221ef3437fd", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/driver.ts": "84950f30692c0b100e62bfa6f8f574c470b4203f4278087e0151b145f2d21100", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/error.ts": "8745a0cfd762ae2e4d6820e91eefe76a92064dbeb746f73aa2dd3245a928c668", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/gql-constants.ts": "57148e6e3101970458f41c3d33c3f6c7a1a138b89f30ed3883816ab32e696474", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/graph-types.ts": "2b45ae83804d89721a869dffa87103ef6db731b2379cd3d47f93236690053362", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/index.ts": "b97ab2c2fb684fa3f008464459ecd56bac800498bb838e4a2802f5384faca2a6", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/integer.ts": "c364b286b50e152681e5ef0ab3fc5a7108f7bafe7ebebb9d3af2a242152d1ae5", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/auth-util.ts": "9cbadc76e1897c44e9da93a4e8fb6a92b20020dce5ea005213c5dfa03ce92185", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/bolt-agent/deno/bolt-agent.ts": "eb6699b7073a83be0a2bfb8279fc488236b7ee303dfdecbaa6e44ad878583df0", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/bolt-agent/deno/index.ts": "37974586224aac462eb5a0f788358bcdb43d7c921e1c0196f9ab4b4b1ad6ca58", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/bolt-agent/index.ts": "4127fdd558eb5d5c164e7e75259808d90fb924a4af1068ec63c91b7383bf7ef5", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/bookmarks.ts": "f86659f8628c89342a0fe27460ead4218ffadb25f5123315a1658957f72116ce", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/connection-holder.ts": "da8c6cb3cb18c2124b136e8f737a167ac272f24a66613446fc51b9f8ccb5dd13", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/constants.ts": "1841dc0c1a26386e309f53a1d27d4246a9cc47c80b56c30b8042a82c5f56f80e", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/homedb-cache.ts": "02fe9449ced6f14cb49b4e5caeb2e7dd06a0b9392ab70c41c338575d65f09338", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/index.ts": "c24ba0f11ceba12a7a1c5546cd249f68eca93276f09f230c57fb830dd95d2061", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/logger.ts": "0db99bd8be86d75f428a77381b7d698033973f00cd8e5520dff0a29032d6557b", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/object-util.ts": "b8312e1d75bb0b2230a4835be237e6ce88422be6ded89936fa7cb722b0de785d", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/observers.ts": "b3b2e0c0b0fd6410a557e478fcd00be63ba02cf9c4c6f076bfcdd8f6d5f3d1dc", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/pool/index.ts": "225a0e6bc78537d9c20dbac1bec3260542b53aa378eeb38f76382c1d7d19438d", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/pool/pool-config.ts": "703b5ac354977e70bcf59a6933f5cd164318752f06a1b6a7daa940cc394f6fd5", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/pool/pool.ts": "0942764da83ecc43f5f297428b3e45067397de436d18f1755670c3c42cef0fa6", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/query-executor.ts": "52cd000bc510ff6b065aea76234ca096fd6e54066a58f0bd6de29f1879fe16fe", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/resolver/base-host-name-resolver.ts": "e58bff18db8dcee558a7bf8fa60c2c5d70d7a4620083968577e8d4c056ba6fe8", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/resolver/configured-custom-resolver.ts": "2a5e42da0049100d30ea61f181cee5378c226837e3c45e606bc044943267f64c", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/resolver/index.ts": "5ca219a9f7a16c27ce0c98fad709df6ed773e05d0af57af9e4e4c2c8cad948d2", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/server-address.ts": "0fea4ffde9a3772a5e3dcee5d11ba60221f443c5fa1983f006831b36031c7229", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/temporal-util.ts": "d4c46b01fe28fe7b78d140930a449da5d4321d53cdf55a8a6ca61388138455f1", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/transaction-executor.ts": "5e10c4e66c5d89ac403e90750353d4e4ce146f8409fefef14618fce7507d9dc8", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/tx-config.ts": "c169d23925ea9c3288bef3aafadb43262e4c09d69ee980a5b611d03c6868aaf6", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/url-util.ts": "7244377c839cb3c7aa96e14705f0c815561a42e9126acd5958733e86300ef730", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/internal/util.ts": "b1def4fb37afe5ce4682290e15700f5cf9f883842b2362b6de515057b4021d91", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/json.ts": "9dd9932375e3de103aa827cb6920c2b4a8566c619dc8bff9d2ed2ad9d371175e", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/notification-filter.ts": "a1d1b616506bd5b0fb0d3e3a87373c7a7d529c0c5e807e9918fe6cd959faaf84", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/notification.ts": "0d83b1c4ffc7588f0b1fbd6a649b3321c4c161949f3f11ced2e94b0d7dc29988", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/record.ts": "0e3d10db1b206773128fe325c977e0ca6fe1c5f5faf5aa80a0ac817e5e9fbddc", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/result-eager.ts": "7161607d3226d8568bdcfb5ab0a0dc73875124a59288afe0443d2f4d5d51f39c", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/result-summary.ts": "36485b6e603640dcc91e8aca3dff076f2ee9a3312ff7970abd22e1d42bcb5934", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/result-transformers.ts": "30d27753dea5f2048a61e4394e16e4388d3af8b46c5368f049d76bd006ddd1f2", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/result.ts": "51c4f566e892b8f1810deea49505e113fef9b47aad3e773b9adaae4fb014af76", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/session.ts": "827285d56bec3006d1abd4fe447d52298f4676dceb15eac0a7256ddb3ae91d8d", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/spatial-types.ts": "20a7961ee212c33424ff6dcbf989a67b304af4b01d13adb6532d43193aba40de", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/temporal-types.ts": "e42fcafe6c3eb334b69b6e9c8f375e837f9795082481245ca5683d693e0c9bc1", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/transaction-managed.ts": "8a7739723115b1ac143f2a641b91c21c4c42858ce1eeb8e3adbf3f67d6305735", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/transaction-promise.ts": "61396d6b9b78c16f213c15b235c2a9275523acc809bbbfea4e7e58f1fd9d54d3", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/transaction.ts": "5e9779c400db9d5745bc048945998664fca3127b573e973167fba92b6f1770a1", - "https://deno.land/x/neo4j_driver_lite@5.28.1/core/types.ts": "abcd1dbaf3d1a0947b8ae269f1ddff2eea9f4e161a458496fc2e79ac002605e5", - "https://deno.land/x/neo4j_driver_lite@5.28.1/logging.ts": "66d1f9eab651da3759b8cb9b46506edcb1610bb25e379a733045f7c28d41ff50", - "https://deno.land/x/neo4j_driver_lite@5.28.1/mod.ts": "5d5a32df405780238aa0ee36eceb85b370a4a173d727ef01941922a034f33ade", - "https://deno.land/x/neo4j_driver_lite@5.28.1/version.ts": "66c6f8420eddf8f0b2f450935b73c41256365e807fa5672c635a75301539b1b0" - }, - "workspace": { - "dependencies": [ - "jsr:@oak/acorn@^1.1.1", - "jsr:@std/assert@1", - "npm:@types/node@^22.13.11" - ] - } -} diff --git a/src/server/index.ts b/src/server/index.ts index bc1d43d..3200c1e 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1,18 +1,15 @@ -import { - Context, - RouteHandler, - RouteInitWithHandler, - Router, -} from "@oak/acorn"; +import { Router } from "@oak/acorn"; import { db_setup, select_closest } from "./db.ts"; import { DatabaseSync } from "node:sqlite"; -import { json_mime_add, substitute_base_name_ } from "./utils.ts"; +import { json_mime_add, substitute_base_name_, cors_add } from "./utils.ts"; import { assert } from "@std/assert"; import neo4j from "https://deno.land/x/neo4j_driver_lite@5.28.1/mod.ts"; import { graph_setup } from "./graph.ts"; -const root_url: string = Deno.env.get("ROOT_URL") as string; +const usingDocker = true; +const root_url: string = usingDocker + ? Deno.env.get("ROOT_URL") as string : "http://localhost:8080/api"; assert(root_url, "ROOT_URL env var not defined"); // bind values we're actually using @@ -24,8 +21,9 @@ const substitute_base_name = substitute_base_name_.bind( const { hostname, port } = { hostname: "0.0.0.0", port: 80 }; +const neo4jHost = usingDocker ? "neo4j" : "127.0.0.1"; // localhost does NOT work const graph_driver = neo4j.driver( - "neo4j://neo4j:7687", + `neo4j://${neo4jHost}:7687`, neo4j.auth.basic("neo4j", "your_password"), ); console.log("initializing graph with static data"); @@ -52,6 +50,7 @@ router.get( async (_) => { const headers = new Headers(); json_mime_add(headers); + cors_add(headers); return new Response(JSON.stringify(await trip_list), { headers }); }, ); @@ -64,6 +63,7 @@ router.get( const body = substitute_base_name(bytes); const headers = new Headers(); json_mime_add(headers); + cors_add(headers); return new Response(body, { headers }); } catch (_) { @@ -80,6 +80,7 @@ router.get( const body = substitute_base_name(bytes); const headers = new Headers(); json_mime_add(headers); + cors_add(headers); return new Response(body, { headers }); } catch (_) { @@ -126,65 +127,58 @@ router.get( }, 1); const headers = new Headers(); json_mime_add(headers); + cors_add(headers); + const r = { + path: [ + { + trip: { + href: `${root_url}/trips/BCT_R51_inb_T08`, + polyline: "ivz_GtswmMEQo@P]Ko@_Dg@gByBfCcBjBWX]^Ua@[u@uFdGqErFoDxDiIrIaG|FwGlFyCvCo@r@{@tAq@vAu@vBy@~C_CbJaBhFgF`SY~@YNi@?cDuA_@u@NqAf@{@lAw@vAArBl@jGxB`DlARt@iAnF_BrCi@tBl@Vl@}BEw@p@iAPw@zAaHLYNG|BbArAp@XBNGPOb@{AtAiF@o@s@c@}E}Bg@QS~AzCnALe@X[t@\\r@\\RR?XKr@g@fB_AfDOR[B{@_@aAg@_Bs@_@PWV]FsLeEiCs@eAHaAd@w@xA]jAk@h@uAYKYDs@q@MMCGQ@O?c@_B_@Uj@]P[g@[q@YiAg@sHMmAy@_C}@wCuD{Ja@wA@mAbBkElAyDZuD\\iD^mAh@s@`DcCfBoDzA_DXeBr@iNZoHKkA}@kB{@i@}@QmERmBBw@Om@_@g@c@m@m@Y_AScAImABmAHs@RMFWIc@YIS^H`AGtBVhC^jA|@fAfAj@x@T`JSb@Pn@Zf@bA^tAQjFm@vLQhD]nAoAnCiBhDiDdCk@`ASv@y@fIUzAqBlFmA|BxF`QjHyFo@eAeAqBM{@Hu@Pe@|CaGhCwD\\_@bA}Ah@qAdAiDjAqDtAqDd@q@jAo@~Ce@`DE~CCjAl@hAzBl@pBd@xC@hCY~Co@fBeCrGgB~BcAjA}A|BoErIuBnEm@`Au@b@yANaASuAcA_DbEi@bASzACdBEbDo@pBLT|@b@rKrBbAf@\\^Jp@]~AsFdVqBfI_Kx_@sAlH}@xIk@dHOpCEjCAd@P|IXdLZlDf@tD`DnR\\vCLjDEpFa@~Fs@rI}CrVSdDKhG@pVR|Td@|k@BbQTj@|C~Cl@|DlD|TPjAfBpIp@~EvBhL|BpLxAnIaC|@gE`BL`A`@tB]t@SCaBu@iB{@iDqALhDFzC~Bb@nAg@hCh@p@J", + }, + enter_bus: { + href: `${root_url}/stops/BCT_95103`, + latitude: 42.101991, + longitude: -75.83611, + time: "00:00" + }, + exit_bus:{ + href: `${root_url}/stops/BCT_1`, + latitude: 42.101354, + longitude: -75.910801, + time: "00:00", + }, + }, + { + trip: { + href: `${root_url}/trips/BCT_R28otb_T11`, + polyline: "az}_GvjinM}KiBQsHw@y@oDiEmFeGgFcGyAcB_@c@HcA^qL^gL@w@UyFMcIEkBi@aTi@aREmBCeAi@D_Id@sJl@{GZsRnAw@DASUsLGgBI]MUc@a@UEWBw@Vw@j@y@Nc@FYBj@jFJfAkDx@qAVcA^UFFfCD`AnIc@jH]pIi@rDSzJk@vKo@fDQbF[Di@a@oN_@mNe@eMs@qSW_Ha@{L[}Ie@mL_@mJBoAPyA^iATm@T_@R]l@_@zCgA`@QrBfEVLlATN^D^HPL?XGLQN[CYQQUBS@W@SCoAUSSUc@wAaDkA`@{@^gA`@m@^g@hAa@z@Wv@MrABp@L~FPjDXbI^fLPbEHhDd@tMd@pMj@jNP~GLbFVnK\\pJVfJHpDJrERzGH`FJdENlHN`DCbCUbHEbBQ`GObDGr@|@hA|DlE`F`GvDhE`DnDRrHrDf@Xo@nCl@", + }, + enter_bus:{ + href: `${root_url}/stops/BCT_2802`, + latitude: 42.100982, + longitude: -75.91097, + time: "00:00", + }, + exit_bus:{ + href: `${root_url}/stops/BCT_2804`, + latitude: 42.105488, + longitude: -75.906281, + time: "00:00", + }, + }, + ], + _legit: [ + start, + mid, + end, + ], + }; return new Response( - `{ - "path": [ - { - "trip":{ - "href":"${root_url}/trips/BCT_R51_inb_T08", - "polyline":${ - JSON.stringify( - "ivz_GtswmMEQo@P]Ko@_Dg@gByBfCcBjBWX]^Ua@[u@uFdGqErFoDxDiIrIaG|FwGlFyCvCo@r@{@tAq@vAu@vBy@~C_CbJaBhFgF`SY~@YNi@?cDuA_@u@NqAf@{@lAw@vAArBl@jGxB`DlARt@iAnF_BrCi@tBl@Vl@}BEw@p@iAPw@zAaHLYNG|BbArAp@XBNGPOb@{AtAiF@o@s@c@}E}Bg@QS~AzCnALe@X[t@\\r@\\RR?XKr@g@fB_AfDOR[B{@_@aAg@_Bs@_@PWV]FsLeEiCs@eAHaAd@w@xA]jAk@h@uAYKYDs@q@MMCGQ@O?c@_B_@Uj@]P[g@[q@YiAg@sHMmAy@_C}@wCuD{Ja@wA@mAbBkElAyDZuD\\iD^mAh@s@`DcCfBoDzA_DXeBr@iNZoHKkA}@kB{@i@}@QmERmBBw@Om@_@g@c@m@m@Y_AScAImABmAHs@RMFWIc@YIS^H`AGtBVhC^jA|@fAfAj@x@T`JSb@Pn@Zf@bA^tAQjFm@vLQhD]nAoAnCiBhDiDdCk@`ASv@y@fIUzAqBlFmA|BxF`QjHyFo@eAeAqBM{@Hu@Pe@|CaGhCwD\\_@bA}Ah@qAdAiDjAqDtAqDd@q@jAo@~Ce@`DE~CCjAl@hAzBl@pBd@xC@hCY~Co@fBeCrGgB~BcAjA}A|BoErIuBnEm@`Au@b@yANaASuAcA_DbEi@bASzACdBEbDo@pBLT|@b@rKrBbAf@\\^Jp@]~AsFdVqBfI_Kx_@sAlH}@xIk@dHOpCEjCAd@P|IXdLZlDf@tD`DnR\\vCLjDEpFa@~Fs@rI}CrVSdDKhG@pVR|Td@|k@BbQTj@|C~Cl@|DlD|TPjAfBpIp@~EvBhL|BpLxAnIaC|@gE`BL`A`@tB]t@SCaBu@iB{@iDqALhDFzC~Bb@nAg@hCh@p@J", - ) - } - }, - "enter_bus":{ - "href":"${root_url}/stops/BCT_95103", - "lattitude":42.101991, - "longitude":-75.83611, - "time":"00:00" - }, - "exit_bus":{ - "href":"${root_url}/stops/BCT_1", - "lattitude":42.101354, - "longitude":-75.910801, - "time":"00:00" - } - }, - { - "trip": { - "href":"${root_url}/trips/BCT_R28otb_T11", - "polyline":${ - JSON.stringify( - "az}_GvjinM}KiBQsHw@y@oDiEmFeGgFcGyAcB_@c@HcA^qL^gL@w@UyFMcIEkBi@aTi@aREmBCeAi@D_Id@sJl@{GZsRnAw@DASUsLGgBI]MUc@a@UEWBw@Vw@j@y@Nc@FYBj@jFJfAkDx@qAVcA^UFFfCD`AnIc@jH]pIi@rDSzJk@vKo@fDQbF[Di@a@oN_@mNe@eMs@qSW_Ha@{L[}Ie@mL_@mJBoAPyA^iATm@T_@R]l@_@zCgA`@QrBfEVLlATN^D^HPL?XGLQN[CYQQUBS@W@SCoAUSSUc@wAaDkA`@{@^gA`@m@^g@hAa@z@Wv@MrABp@L~FPjDXbI^fLPbEHhDd@tMd@pMj@jNP~GLbFVnK\\pJVfJHpDJrERzGH`FJdENlHN`DCbCUbHEbBQ`GObDGr@|@hA|DlE`F`GvDhE`DnDRrHrDf@Xo@nCl@", - ) - } - }, - "enter_bus":{ - "href":"${root_url}/stops/BCT_2802", - "lattitude":42.100982, - "longitude":-75.91097, - "time":"00:00" - }, - "exit_bus":{ - "href":"${root_url}/stops/BCT_2804", - "lattitude":42.105488, - "longitude":-75.906281, - "time":"00:00" - } - } - ], - "_legit":[ - - "${start}", - "${mid}", - "${end}" - ] - }`, + JSON.stringify(r), { headers }, ); }, ); console.log(`Ready! Listening on ${hostname}:${port}`); -router.listen({ hostname, port }); +router.listen({ hostname, port}); diff --git a/src/server/utils.ts b/src/server/utils.ts index cbd63a1..71de357 100644 --- a/src/server/utils.ts +++ b/src/server/utils.ts @@ -3,6 +3,11 @@ export function json_mime_add(headers: Headers): Headers { return headers; } +export function cors_add(headers: Headers): Headers { + headers.set("Access-Control-Allow-Origin", "*"); + return headers; +} + export function substitute_base_name_( pattern: string | RegExp, replace_with: string,