From f52b2c9ed828e2709e0070057ca2cd278123a820 Mon Sep 17 00:00:00 2001 From: iapicca Date: Mon, 2 Mar 2026 19:02:32 +0200 Subject: [PATCH 1/4] async/await pattern for isolate spawning and server initialization --- frameworks/Dart/dart3/dart_aot/bin/server.dart | 10 +++++----- frameworks/Dart/dart3/dart_native/bin/server.dart | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Dart/dart3/dart_aot/bin/server.dart b/frameworks/Dart/dart3/dart_aot/bin/server.dart index 8d7d8205fe8..4ac41db1799 100755 --- a/frameworks/Dart/dart3/dart_aot/bin/server.dart +++ b/frameworks/Dart/dart3/dart_aot/bin/server.dart @@ -25,7 +25,7 @@ final _jsonEncoder = JsonUtf8Encoder(); /// belong to a secondary "worker group". const workerGroupTag = '--workerGroup'; -void main(List args) { +void main(List args) async { /// Defines local isolate quota, using MAX_ISOLATES if provided. /// Falls back to total available cores while respecting hardware limits. var maxIsolates = _maxIsolatesfromEnvironment > 0 @@ -55,7 +55,7 @@ void main(List args) { for (var i = 0; i < workerGroups; i++) { /// [Platform.script] identifies the AOT snapshot or executable. /// [Isolate.spawnUri] spawns a new process group via [main()]. - Isolate.spawnUri(Platform.script, [...args, workerGroupTag], null); + await Isolate.spawnUri(Platform.script, [...args, workerGroupTag], null); } /// Updates local isolate limits, assigning the primary group @@ -66,15 +66,15 @@ void main(List args) { /// Create an [Isolate] containing an [HttpServer] /// for each processor after the first for (var i = 1; i < maxIsolates; i++) { - Isolate.spawn(_startServer, args); + await Isolate.spawn(_startServer, args); } /// Create a [HttpServer] for the first processor - _startServer(args); + await _startServer(args); } /// Creates and setup a [HttpServer] -void _startServer(List args) async { +Future _startServer(List args) async { /// Binds the [HttpServer] on `0.0.0.0:8080`. final server = await HttpServer.bind( InternetAddress.anyIPv4, diff --git a/frameworks/Dart/dart3/dart_native/bin/server.dart b/frameworks/Dart/dart3/dart_native/bin/server.dart index bab4cf30e62..2fd5bad5007 100755 --- a/frameworks/Dart/dart3/dart_native/bin/server.dart +++ b/frameworks/Dart/dart3/dart_native/bin/server.dart @@ -10,19 +10,19 @@ const _defaultPort = 8080; /// transform Dart objects into byte arrays for HTTP responses. final _jsonEncoder = JsonUtf8Encoder(); -void main(List args) { +void main(List args) async { /// Create an [Isolate] containing an [HttpServer] /// for each processor after the first for (var i = 1; i < Platform.numberOfProcessors; i++) { - Isolate.spawn(_startServer, args); + await Isolate.spawn(_startServer, args); } /// Create a [HttpServer] for the first processor - _startServer(args); + await _startServer(args); } /// Creates and setup a [HttpServer] -void _startServer(List args) async { +Future _startServer(List args) async { /// Binds the [HttpServer] on `0.0.0.0:8080`. final server = await HttpServer.bind( InternetAddress.anyIPv4, From 95a5fde0c6c2b28c5c9c9df22f9be8ceab94bcd6 Mon Sep 17 00:00:00 2001 From: iapicca Date: Mon, 2 Mar 2026 19:06:30 +0200 Subject: [PATCH 2/4] Add error handling to _handleRequest function --- .../Dart/dart3/dart_aot/bin/server.dart | 27 +++++++++++-------- .../Dart/dart3/dart_native/bin/server.dart | 27 +++++++++++-------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/frameworks/Dart/dart3/dart_aot/bin/server.dart b/frameworks/Dart/dart3/dart_aot/bin/server.dart index 4ac41db1799..fbe97fb5fe6 100755 --- a/frameworks/Dart/dart3/dart_aot/bin/server.dart +++ b/frameworks/Dart/dart3/dart_aot/bin/server.dart @@ -90,17 +90,22 @@ Future _startServer(List args) async { ..listen(_handleRequest); } -/// Dispatches requests to specific handlers. -void _handleRequest(HttpRequest request) { - switch (request.uri.path) { - case '/json': - _jsonTest(request); - break; - case '/plaintext': - _plaintextTest(request); - break; - default: - _sendResponse(request, HttpStatus.notFound); +/// Dispatches requests to specific test handlers. Wrapped in a try-catch +/// to ensure stable execution and guaranteed response delivery. +Future _handleRequest(HttpRequest request) async { + try { + switch (request.uri.path) { + case '/json': + _jsonTest(request); + break; + case '/plaintext': + _plaintextTest(request); + break; + default: + _sendResponse(request, HttpStatus.notFound); + } + } catch (e) { + _sendResponse(request, HttpStatus.internalServerError); } } diff --git a/frameworks/Dart/dart3/dart_native/bin/server.dart b/frameworks/Dart/dart3/dart_native/bin/server.dart index 2fd5bad5007..f851d7762a2 100755 --- a/frameworks/Dart/dart3/dart_native/bin/server.dart +++ b/frameworks/Dart/dart3/dart_native/bin/server.dart @@ -38,17 +38,22 @@ Future _startServer(List args) async { ..listen(_handleRequest); } -/// Dispatches requests to specific handlers. -void _handleRequest(HttpRequest request) { - switch (request.uri.path) { - case '/json': - _jsonTest(request); - break; - case '/plaintext': - _plaintextTest(request); - break; - default: - _sendResponse(request, HttpStatus.notFound); +/// Dispatches requests to specific test handlers. Wrapped in a try-catch +/// to ensure stable execution and guaranteed response delivery. +Future _handleRequest(HttpRequest request) async { + try { + switch (request.uri.path) { + case '/json': + _jsonTest(request); + break; + case '/plaintext': + _plaintextTest(request); + break; + default: + _sendResponse(request, HttpStatus.notFound); + } + } catch (e) { + _sendResponse(request, HttpStatus.internalServerError); } } From 9ce3243effa8c33b7df2cf3b446191c38b3bf311 Mon Sep 17 00:00:00 2001 From: iapicca Date: Mon, 2 Mar 2026 19:17:00 +0200 Subject: [PATCH 3/4] await for loop with timeout in _startServer --- .../Dart/dart3/dart_aot/bin/server.dart | 19 ++++++++++++++++--- .../Dart/dart3/dart_native/bin/server.dart | 19 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/frameworks/Dart/dart3/dart_aot/bin/server.dart b/frameworks/Dart/dart3/dart_aot/bin/server.dart index fbe97fb5fe6..cfa131993f1 100755 --- a/frameworks/Dart/dart3/dart_aot/bin/server.dart +++ b/frameworks/Dart/dart3/dart_aot/bin/server.dart @@ -25,6 +25,11 @@ final _jsonEncoder = JsonUtf8Encoder(); /// belong to a secondary "worker group". const workerGroupTag = '--workerGroup'; +/// The maximum duration allowed for a single HTTP request to be processed. +/// This prevents slow clients or stalled logic from blocking the isolate's +/// event loop indefinitely. +const _requestTimeout = Duration(seconds: 8); + void main(List args) async { /// Defines local isolate quota, using MAX_ISOLATES if provided. /// Falls back to total available cores while respecting hardware limits. @@ -85,9 +90,17 @@ Future _startServer(List args) async { server ..defaultResponseHeaders.clear() /// Sets [HttpServer]'s [serverHeader]. - ..serverHeader = 'dart_aot' - /// Handles [HttpRequest]'s from [HttpServer]. - ..listen(_handleRequest); + ..serverHeader = 'dart_aot'; + + /// Handles [HttpRequest]'s from [HttpServer]. + await for (final request in server) { + /// Asynchronously processes each request with an 8-second safety deadline + /// to prevent stalled connections from blocking the isolate event loop. + await _handleRequest(request).timeout( + _requestTimeout, + onTimeout: () => _sendResponse(request, HttpStatus.internalServerError), + ); + } } /// Dispatches requests to specific test handlers. Wrapped in a try-catch diff --git a/frameworks/Dart/dart3/dart_native/bin/server.dart b/frameworks/Dart/dart3/dart_native/bin/server.dart index f851d7762a2..264c02fe92a 100755 --- a/frameworks/Dart/dart3/dart_native/bin/server.dart +++ b/frameworks/Dart/dart3/dart_native/bin/server.dart @@ -10,6 +10,11 @@ const _defaultPort = 8080; /// transform Dart objects into byte arrays for HTTP responses. final _jsonEncoder = JsonUtf8Encoder(); +/// The maximum duration allowed for a single HTTP request to be processed. +/// This prevents slow clients or stalled logic from blocking the isolate's +/// event loop indefinitely. +const _requestTimeout = Duration(seconds: 8); + void main(List args) async { /// Create an [Isolate] containing an [HttpServer] /// for each processor after the first @@ -33,9 +38,17 @@ Future _startServer(List args) async { server ..defaultResponseHeaders.clear() /// Sets [HttpServer]'s [serverHeader]. - ..serverHeader = 'dart_native' - /// Handles [HttpRequest]'s from [HttpServer]. - ..listen(_handleRequest); + ..serverHeader = 'dart_native'; + + /// Handles [HttpRequest]'s from [HttpServer]. + await for (final request in server) { + /// Asynchronously processes each request with an 8-second safety deadline + /// to prevent stalled connections from blocking the isolate event loop. + await _handleRequest(request).timeout( + _requestTimeout, + onTimeout: () => _sendResponse(request, HttpStatus.internalServerError), + ); + } } /// Dispatches requests to specific test handlers. Wrapped in a try-catch From 815f836b0e5e18b3a91b4501bedeb03d602f5373 Mon Sep 17 00:00:00 2001 From: iapicca Date: Mon, 2 Mar 2026 19:19:42 +0200 Subject: [PATCH 4/4] Fix typo in timeout handler variable name --- frameworks/Dart/dart3/dart_aot/bin/server.dart | 2 +- frameworks/Dart/dart3/dart_native/bin/server.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Dart/dart3/dart_aot/bin/server.dart b/frameworks/Dart/dart3/dart_aot/bin/server.dart index cfa131993f1..6f1ca5d30d4 100755 --- a/frameworks/Dart/dart3/dart_aot/bin/server.dart +++ b/frameworks/Dart/dart3/dart_aot/bin/server.dart @@ -98,7 +98,7 @@ Future _startServer(List args) async { /// to prevent stalled connections from blocking the isolate event loop. await _handleRequest(request).timeout( _requestTimeout, - onTimeout: () => _sendResponse(request, HttpStatus.internalServerError), + onTimeout: () => _sendResponse(request, HttpStatus.requestTimeout), ); } } diff --git a/frameworks/Dart/dart3/dart_native/bin/server.dart b/frameworks/Dart/dart3/dart_native/bin/server.dart index 264c02fe92a..029c6eaee1d 100755 --- a/frameworks/Dart/dart3/dart_native/bin/server.dart +++ b/frameworks/Dart/dart3/dart_native/bin/server.dart @@ -46,7 +46,7 @@ Future _startServer(List args) async { /// to prevent stalled connections from blocking the isolate event loop. await _handleRequest(request).timeout( _requestTimeout, - onTimeout: () => _sendResponse(request, HttpStatus.internalServerError), + onTimeout: () => _sendResponse(request, HttpStatus.requestTimeout), ); } }