diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md index aa97c636b..d44f1a338 100644 --- a/dwds/CHANGELOG.md +++ b/dwds/CHANGELOG.md @@ -1,5 +1,8 @@ -## 24.4.1-wip +## 24.4.1 +- Implemented a WebSocket-based communication protocol that provides essential developer tooling (hot reload, service extensions) when Chrome debugger access is unavailable. - [#2605](https://github.com/dart-lang/webdev/issues/2605) +- Added WebSocket-based hot reload and service extension support via new `WebSocketProxyService` class that implements VM service protocol over WebSockets. +- Enhanced `DevHandler` with `useWebSocketConnection` flag to toggle between Chrome-based and WebSocket-based communication protocols. - Fixed an issue where we didn't wait until all scripts were parsed before recomputing metadata on a hot reload. diff --git a/dwds/lib/dart_web_debug_service.dart b/dwds/lib/dart_web_debug_service.dart index ff960f0f0..587e8af43 100644 --- a/dwds/lib/dart_web_debug_service.dart +++ b/dwds/lib/dart_web_debug_service.dart @@ -31,6 +31,7 @@ class Dwds { final DevHandler _devHandler; final AssetReader _assetReader; final bool _enableDebugging; + final bool _useDwdsWebSocketConnection; Dwds._( this.middleware, @@ -38,6 +39,7 @@ class Dwds { this._devHandler, this._assetReader, this._enableDebugging, + this._useDwdsWebSocketConnection, ) : handler = _devHandler.handler; Stream get connectedApps => _devHandler.connectedApps; @@ -53,12 +55,18 @@ class Dwds { await _assetReader.close(); } + /// Creates a debug connection for the given app connection. + /// + /// Returns a [DebugConnection] that wraps the appropriate debug services + /// based on the connection type (WebSocket or Chrome-based). Future debugConnection(AppConnection appConnection) async { if (!_enableDebugging) throw StateError('Debugging is not enabled.'); - final appDebugServices = await _devHandler.loadAppServices(appConnection); - final chromeProxyService = appDebugServices.chromeProxyService; - await chromeProxyService.isInitialized; - return DebugConnection(appDebugServices); + + if (_useDwdsWebSocketConnection) { + return await _devHandler.createDebugConnectionForWebSocket(appConnection); + } else { + return await _devHandler.createDebugConnectionForChrome(appConnection); + } } static Future start({ @@ -123,10 +131,7 @@ class Dwds { _logger.info('Serving DevTools at $uri\n'); } - final injected = DwdsInjector( - extensionUri: extensionUri, - useDwdsWebSocketConnection: useDwdsWebSocketConnection, - ); + final injected = DwdsInjector(extensionUri: extensionUri); final devHandler = DevHandler( chromeConnection, @@ -143,6 +148,7 @@ class Dwds { debugSettings.spawnDds, debugSettings.ddsPort, debugSettings.launchDevToolsInNewWindow, + useWebSocketConnection: useDwdsWebSocketConnection, ); return Dwds._( @@ -151,6 +157,7 @@ class Dwds { devHandler, assetReader, debugSettings.enableDebugging, + useDwdsWebSocketConnection, ); } } diff --git a/dwds/lib/data/hot_restart_request.dart b/dwds/lib/data/hot_restart_request.dart new file mode 100644 index 000000000..36048ed4f --- /dev/null +++ b/dwds/lib/data/hot_restart_request.dart @@ -0,0 +1,24 @@ +// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library hot_restart_request; + +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'hot_restart_request.g.dart'; + +/// A request to hot restart the application. +abstract class HotRestartRequest + implements Built { + static Serializer get serializer => + _$hotRestartRequestSerializer; + + /// A unique identifier for this request. + String get id; + + HotRestartRequest._(); + factory HotRestartRequest([void Function(HotRestartRequestBuilder) updates]) = + _$HotRestartRequest; +} diff --git a/dwds/lib/data/hot_restart_request.g.dart b/dwds/lib/data/hot_restart_request.g.dart new file mode 100644 index 000000000..c65ea554f --- /dev/null +++ b/dwds/lib/data/hot_restart_request.g.dart @@ -0,0 +1,147 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'hot_restart_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +Serializer _$hotRestartRequestSerializer = + _$HotRestartRequestSerializer(); + +class _$HotRestartRequestSerializer + implements StructuredSerializer { + @override + final Iterable types = const [HotRestartRequest, _$HotRestartRequest]; + @override + final String wireName = 'HotRestartRequest'; + + @override + Iterable serialize( + Serializers serializers, + HotRestartRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + final result = [ + 'id', + serializers.serialize(object.id, specifiedType: const FullType(String)), + ]; + + return result; + } + + @override + HotRestartRequest deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = HotRestartRequestBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current! as String; + iterator.moveNext(); + final Object? value = iterator.current; + switch (key) { + case 'id': + result.id = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; + break; + } + } + + return result.build(); + } +} + +class _$HotRestartRequest extends HotRestartRequest { + @override + final String id; + + factory _$HotRestartRequest([ + void Function(HotRestartRequestBuilder)? updates, + ]) => (HotRestartRequestBuilder()..update(updates))._build(); + + _$HotRestartRequest._({required this.id}) : super._(); + @override + HotRestartRequest rebuild(void Function(HotRestartRequestBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + HotRestartRequestBuilder toBuilder() => + HotRestartRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is HotRestartRequest && id == other.id; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'HotRestartRequest') + ..add('id', id)).toString(); + } +} + +class HotRestartRequestBuilder + implements Builder { + _$HotRestartRequest? _$v; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + HotRestartRequestBuilder(); + + HotRestartRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _id = $v.id; + _$v = null; + } + return this; + } + + @override + void replace(HotRestartRequest other) { + _$v = other as _$HotRestartRequest; + } + + @override + void update(void Function(HotRestartRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + HotRestartRequest build() => _build(); + + _$HotRestartRequest _build() { + final _$result = + _$v ?? + _$HotRestartRequest._( + id: BuiltValueNullFieldError.checkNotNull( + id, + r'HotRestartRequest', + 'id', + ), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/dwds/lib/data/hot_restart_response.dart b/dwds/lib/data/hot_restart_response.dart new file mode 100644 index 000000000..7335cc122 --- /dev/null +++ b/dwds/lib/data/hot_restart_response.dart @@ -0,0 +1,32 @@ +// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +library hot_restart_response; + +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'hot_restart_response.g.dart'; + +/// A response to a hot restart request. +abstract class HotRestartResponse + implements Built { + static Serializer get serializer => + _$hotRestartResponseSerializer; + + /// The unique identifier matching the request. + String get id; + + /// Whether the hot restart succeeded on the client. + bool get success; + + /// An optional error message if success is false. + @BuiltValueField(wireName: 'error') + String? get errorMessage; + + HotRestartResponse._(); + factory HotRestartResponse([ + void Function(HotRestartResponseBuilder) updates, + ]) = _$HotRestartResponse; +} diff --git a/dwds/lib/data/hot_restart_response.g.dart b/dwds/lib/data/hot_restart_response.g.dart new file mode 100644 index 000000000..3302f0a66 --- /dev/null +++ b/dwds/lib/data/hot_restart_response.g.dart @@ -0,0 +1,209 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'hot_restart_response.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +Serializer _$hotRestartResponseSerializer = + _$HotRestartResponseSerializer(); + +class _$HotRestartResponseSerializer + implements StructuredSerializer { + @override + final Iterable types = const [HotRestartResponse, _$HotRestartResponse]; + @override + final String wireName = 'HotRestartResponse'; + + @override + Iterable serialize( + Serializers serializers, + HotRestartResponse object, { + FullType specifiedType = FullType.unspecified, + }) { + final result = [ + 'id', + serializers.serialize(object.id, specifiedType: const FullType(String)), + 'success', + serializers.serialize( + object.success, + specifiedType: const FullType(bool), + ), + ]; + Object? value; + value = object.errorMessage; + if (value != null) { + result + ..add('error') + ..add( + serializers.serialize(value, specifiedType: const FullType(String)), + ); + } + return result; + } + + @override + HotRestartResponse deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = HotRestartResponseBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current! as String; + iterator.moveNext(); + final Object? value = iterator.current; + switch (key) { + case 'id': + result.id = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; + break; + case 'success': + result.success = + serializers.deserialize( + value, + specifiedType: const FullType(bool), + )! + as bool; + break; + case 'error': + result.errorMessage = + serializers.deserialize( + value, + specifiedType: const FullType(String), + ) + as String?; + break; + } + } + + return result.build(); + } +} + +class _$HotRestartResponse extends HotRestartResponse { + @override + final String id; + @override + final bool success; + @override + final String? errorMessage; + + factory _$HotRestartResponse([ + void Function(HotRestartResponseBuilder)? updates, + ]) => (HotRestartResponseBuilder()..update(updates))._build(); + + _$HotRestartResponse._({ + required this.id, + required this.success, + this.errorMessage, + }) : super._(); + @override + HotRestartResponse rebuild( + void Function(HotRestartResponseBuilder) updates, + ) => (toBuilder()..update(updates)).build(); + + @override + HotRestartResponseBuilder toBuilder() => + HotRestartResponseBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is HotRestartResponse && + id == other.id && + success == other.success && + errorMessage == other.errorMessage; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, success.hashCode); + _$hash = $jc(_$hash, errorMessage.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'HotRestartResponse') + ..add('id', id) + ..add('success', success) + ..add('errorMessage', errorMessage)) + .toString(); + } +} + +class HotRestartResponseBuilder + implements Builder { + _$HotRestartResponse? _$v; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + bool? _success; + bool? get success => _$this._success; + set success(bool? success) => _$this._success = success; + + String? _errorMessage; + String? get errorMessage => _$this._errorMessage; + set errorMessage(String? errorMessage) => _$this._errorMessage = errorMessage; + + HotRestartResponseBuilder(); + + HotRestartResponseBuilder get _$this { + final $v = _$v; + if ($v != null) { + _id = $v.id; + _success = $v.success; + _errorMessage = $v.errorMessage; + _$v = null; + } + return this; + } + + @override + void replace(HotRestartResponse other) { + _$v = other as _$HotRestartResponse; + } + + @override + void update(void Function(HotRestartResponseBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + HotRestartResponse build() => _build(); + + _$HotRestartResponse _build() { + final _$result = + _$v ?? + _$HotRestartResponse._( + id: BuiltValueNullFieldError.checkNotNull( + id, + r'HotRestartResponse', + 'id', + ), + success: BuiltValueNullFieldError.checkNotNull( + success, + r'HotRestartResponse', + 'success', + ), + errorMessage: errorMessage, + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/dwds/lib/data/serializers.dart b/dwds/lib/data/serializers.dart index 11755912f..e29d2343d 100644 --- a/dwds/lib/data/serializers.dart +++ b/dwds/lib/data/serializers.dart @@ -14,6 +14,10 @@ import 'error_response.dart'; import 'extension_request.dart'; import 'hot_reload_request.dart'; import 'hot_reload_response.dart'; +import 'hot_restart_request.dart'; +import 'hot_restart_response.dart'; +import 'service_extension_request.dart'; +import 'service_extension_response.dart'; import 'isolate_events.dart'; import 'register_event.dart'; import 'run_request.dart'; @@ -32,6 +36,8 @@ part 'serializers.g.dart'; DevToolsResponse, HotReloadRequest, HotReloadResponse, + HotRestartRequest, + HotRestartResponse, IsolateExit, IsolateStart, ExtensionRequest, @@ -40,5 +46,7 @@ part 'serializers.g.dart'; ErrorResponse, RegisterEvent, RunRequest, + ServiceExtensionRequest, + ServiceExtensionResponse, ]) final Serializers serializers = _$serializers; diff --git a/dwds/lib/data/serializers.g.dart b/dwds/lib/data/serializers.g.dart index 3f229a323..250998250 100644 --- a/dwds/lib/data/serializers.g.dart +++ b/dwds/lib/data/serializers.g.dart @@ -7,7 +7,7 @@ part of 'serializers.dart'; // ************************************************************************** Serializers _$serializers = - (new Serializers().toBuilder() + (Serializers().toBuilder() ..add(BatchedDebugEvents.serializer) ..add(BatchedEvents.serializer) ..add(BuildResult.serializer) @@ -23,17 +23,21 @@ Serializers _$serializers = ..add(ExtensionResponse.serializer) ..add(HotReloadRequest.serializer) ..add(HotReloadResponse.serializer) + ..add(HotRestartRequest.serializer) + ..add(HotRestartResponse.serializer) ..add(IsolateExit.serializer) ..add(IsolateStart.serializer) ..add(RegisterEvent.serializer) ..add(RunRequest.serializer) + ..add(ServiceExtensionRequest.serializer) + ..add(ServiceExtensionResponse.serializer) ..addBuilderFactory( const FullType(BuiltList, const [const FullType(DebugEvent)]), - () => new ListBuilder(), + () => ListBuilder(), ) ..addBuilderFactory( const FullType(BuiltList, const [const FullType(ExtensionEvent)]), - () => new ListBuilder(), + () => ListBuilder(), )) .build(); diff --git a/dwds/lib/data/service_extension_request.dart b/dwds/lib/data/service_extension_request.dart new file mode 100644 index 000000000..7539a9b3b --- /dev/null +++ b/dwds/lib/data/service_extension_request.dart @@ -0,0 +1,43 @@ +// Copyright (c) 2025, the Dart project authors. All rights reserved. +// Defines the request for service extension calls over WebSocket. + +import 'dart:convert'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'service_extension_request.g.dart'; + +abstract class ServiceExtensionRequest + implements Built { + String get id; + String get method; + String + get argsJson; // Store args as JSON string for built_value compatibility + + // Helper method to get args as Map + Map get args => + argsJson.isEmpty + ? {} + : json.decode(argsJson) as Map; + + ServiceExtensionRequest._(); + factory ServiceExtensionRequest([ + void Function(ServiceExtensionRequestBuilder) updates, + ]) = _$ServiceExtensionRequest; + + // Convenient factory method to create with args Map + factory ServiceExtensionRequest.fromArgs({ + required String id, + required String method, + required Map args, + }) => ServiceExtensionRequest( + (b) => + b + ..id = id + ..method = method + ..argsJson = json.encode(args), + ); + + static Serializer get serializer => + _$serviceExtensionRequestSerializer; +} diff --git a/dwds/lib/data/service_extension_request.g.dart b/dwds/lib/data/service_extension_request.g.dart new file mode 100644 index 000000000..94379fd36 --- /dev/null +++ b/dwds/lib/data/service_extension_request.g.dart @@ -0,0 +1,228 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'service_extension_request.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +Serializer _$serviceExtensionRequestSerializer = + new _$ServiceExtensionRequestSerializer(); + +class _$ServiceExtensionRequestSerializer + implements StructuredSerializer { + @override + final Iterable types = const [ + ServiceExtensionRequest, + _$ServiceExtensionRequest, + ]; + @override + final String wireName = 'ServiceExtensionRequest'; + + @override + Iterable serialize( + Serializers serializers, + ServiceExtensionRequest object, { + FullType specifiedType = FullType.unspecified, + }) { + final result = [ + 'id', + serializers.serialize(object.id, specifiedType: const FullType(String)), + 'method', + serializers.serialize( + object.method, + specifiedType: const FullType(String), + ), + 'argsJson', + serializers.serialize( + object.argsJson, + specifiedType: const FullType(String), + ), + ]; + + return result; + } + + @override + ServiceExtensionRequest deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = new ServiceExtensionRequestBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current! as String; + iterator.moveNext(); + final Object? value = iterator.current; + switch (key) { + case 'id': + result.id = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; + break; + case 'method': + result.method = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; + break; + case 'argsJson': + result.argsJson = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; + break; + } + } + + return result.build(); + } +} + +class _$ServiceExtensionRequest extends ServiceExtensionRequest { + @override + final String id; + @override + final String method; + @override + final String argsJson; + + factory _$ServiceExtensionRequest([ + void Function(ServiceExtensionRequestBuilder)? updates, + ]) => (new ServiceExtensionRequestBuilder()..update(updates))._build(); + + _$ServiceExtensionRequest._({ + required this.id, + required this.method, + required this.argsJson, + }) : super._() { + BuiltValueNullFieldError.checkNotNull(id, r'ServiceExtensionRequest', 'id'); + BuiltValueNullFieldError.checkNotNull( + method, + r'ServiceExtensionRequest', + 'method', + ); + BuiltValueNullFieldError.checkNotNull( + argsJson, + r'ServiceExtensionRequest', + 'argsJson', + ); + } + + @override + ServiceExtensionRequest rebuild( + void Function(ServiceExtensionRequestBuilder) updates, + ) => (toBuilder()..update(updates)).build(); + + @override + ServiceExtensionRequestBuilder toBuilder() => + new ServiceExtensionRequestBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is ServiceExtensionRequest && + id == other.id && + method == other.method && + argsJson == other.argsJson; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, method.hashCode); + _$hash = $jc(_$hash, argsJson.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'ServiceExtensionRequest') + ..add('id', id) + ..add('method', method) + ..add('argsJson', argsJson)) + .toString(); + } +} + +class ServiceExtensionRequestBuilder + implements + Builder { + _$ServiceExtensionRequest? _$v; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + String? _method; + String? get method => _$this._method; + set method(String? method) => _$this._method = method; + + String? _argsJson; + String? get argsJson => _$this._argsJson; + set argsJson(String? argsJson) => _$this._argsJson = argsJson; + + ServiceExtensionRequestBuilder(); + + ServiceExtensionRequestBuilder get _$this { + final $v = _$v; + if ($v != null) { + _id = $v.id; + _method = $v.method; + _argsJson = $v.argsJson; + _$v = null; + } + return this; + } + + @override + void replace(ServiceExtensionRequest other) { + ArgumentError.checkNotNull(other, 'other'); + _$v = other as _$ServiceExtensionRequest; + } + + @override + void update(void Function(ServiceExtensionRequestBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + ServiceExtensionRequest build() => _build(); + + _$ServiceExtensionRequest _build() { + final _$result = + _$v ?? + new _$ServiceExtensionRequest._( + id: BuiltValueNullFieldError.checkNotNull( + id, + r'ServiceExtensionRequest', + 'id', + ), + method: BuiltValueNullFieldError.checkNotNull( + method, + r'ServiceExtensionRequest', + 'method', + ), + argsJson: BuiltValueNullFieldError.checkNotNull( + argsJson, + r'ServiceExtensionRequest', + 'argsJson', + ), + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/dwds/lib/data/service_extension_response.dart b/dwds/lib/data/service_extension_response.dart new file mode 100644 index 000000000..854526951 --- /dev/null +++ b/dwds/lib/data/service_extension_response.dart @@ -0,0 +1,50 @@ +// Copyright (c) 2025, the Dart project authors. All rights reserved. +// Defines the response for service extension calls over WebSocket. + +import 'dart:convert'; +import 'package:built_value/built_value.dart'; +import 'package:built_value/serializer.dart'; + +part 'service_extension_response.g.dart'; + +abstract class ServiceExtensionResponse + implements + Built { + String get id; + String? + get resultJson; // Store result as JSON string for built_value compatibility + bool get success; + int? get errorCode; + String? get errorMessage; + + // Helper method to get result as Map + Map? get result => + resultJson == null || resultJson!.isEmpty + ? null + : json.decode(resultJson!) as Map; + + ServiceExtensionResponse._(); + factory ServiceExtensionResponse([ + void Function(ServiceExtensionResponseBuilder) updates, + ]) = _$ServiceExtensionResponse; + + // Convenient factory method to create with result Map + factory ServiceExtensionResponse.fromResult({ + required String id, + required bool success, + Map? result, + int? errorCode, + String? errorMessage, + }) => ServiceExtensionResponse( + (b) => + b + ..id = id + ..success = success + ..resultJson = result != null ? json.encode(result) : null + ..errorCode = errorCode + ..errorMessage = errorMessage, + ); + + static Serializer get serializer => + _$serviceExtensionResponseSerializer; +} diff --git a/dwds/lib/data/service_extension_response.g.dart b/dwds/lib/data/service_extension_response.g.dart new file mode 100644 index 000000000..e840cf2b4 --- /dev/null +++ b/dwds/lib/data/service_extension_response.g.dart @@ -0,0 +1,277 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'service_extension_response.dart'; + +// ************************************************************************** +// BuiltValueGenerator +// ************************************************************************** + +Serializer _$serviceExtensionResponseSerializer = + new _$ServiceExtensionResponseSerializer(); + +class _$ServiceExtensionResponseSerializer + implements StructuredSerializer { + @override + final Iterable types = const [ + ServiceExtensionResponse, + _$ServiceExtensionResponse, + ]; + @override + final String wireName = 'ServiceExtensionResponse'; + + @override + Iterable serialize( + Serializers serializers, + ServiceExtensionResponse object, { + FullType specifiedType = FullType.unspecified, + }) { + final result = [ + 'id', + serializers.serialize(object.id, specifiedType: const FullType(String)), + 'success', + serializers.serialize( + object.success, + specifiedType: const FullType(bool), + ), + ]; + Object? value; + value = object.resultJson; + if (value != null) { + result + ..add('resultJson') + ..add( + serializers.serialize(value, specifiedType: const FullType(String)), + ); + } + value = object.errorCode; + if (value != null) { + result + ..add('errorCode') + ..add(serializers.serialize(value, specifiedType: const FullType(int))); + } + value = object.errorMessage; + if (value != null) { + result + ..add('errorMessage') + ..add( + serializers.serialize(value, specifiedType: const FullType(String)), + ); + } + return result; + } + + @override + ServiceExtensionResponse deserialize( + Serializers serializers, + Iterable serialized, { + FullType specifiedType = FullType.unspecified, + }) { + final result = new ServiceExtensionResponseBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current! as String; + iterator.moveNext(); + final Object? value = iterator.current; + switch (key) { + case 'id': + result.id = + serializers.deserialize( + value, + specifiedType: const FullType(String), + )! + as String; + break; + case 'resultJson': + result.resultJson = + serializers.deserialize( + value, + specifiedType: const FullType(String), + ) + as String?; + break; + case 'success': + result.success = + serializers.deserialize( + value, + specifiedType: const FullType(bool), + )! + as bool; + break; + case 'errorCode': + result.errorCode = + serializers.deserialize(value, specifiedType: const FullType(int)) + as int?; + break; + case 'errorMessage': + result.errorMessage = + serializers.deserialize( + value, + specifiedType: const FullType(String), + ) + as String?; + break; + } + } + + return result.build(); + } +} + +class _$ServiceExtensionResponse extends ServiceExtensionResponse { + @override + final String id; + @override + final String? resultJson; + @override + final bool success; + @override + final int? errorCode; + @override + final String? errorMessage; + + factory _$ServiceExtensionResponse([ + void Function(ServiceExtensionResponseBuilder)? updates, + ]) => (new ServiceExtensionResponseBuilder()..update(updates))._build(); + + _$ServiceExtensionResponse._({ + required this.id, + this.resultJson, + required this.success, + this.errorCode, + this.errorMessage, + }) : super._() { + BuiltValueNullFieldError.checkNotNull( + id, + r'ServiceExtensionResponse', + 'id', + ); + BuiltValueNullFieldError.checkNotNull( + success, + r'ServiceExtensionResponse', + 'success', + ); + } + + @override + ServiceExtensionResponse rebuild( + void Function(ServiceExtensionResponseBuilder) updates, + ) => (toBuilder()..update(updates)).build(); + + @override + ServiceExtensionResponseBuilder toBuilder() => + new ServiceExtensionResponseBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is ServiceExtensionResponse && + id == other.id && + resultJson == other.resultJson && + success == other.success && + errorCode == other.errorCode && + errorMessage == other.errorMessage; + } + + @override + int get hashCode { + var _$hash = 0; + _$hash = $jc(_$hash, id.hashCode); + _$hash = $jc(_$hash, resultJson.hashCode); + _$hash = $jc(_$hash, success.hashCode); + _$hash = $jc(_$hash, errorCode.hashCode); + _$hash = $jc(_$hash, errorMessage.hashCode); + _$hash = $jf(_$hash); + return _$hash; + } + + @override + String toString() { + return (newBuiltValueToStringHelper(r'ServiceExtensionResponse') + ..add('id', id) + ..add('resultJson', resultJson) + ..add('success', success) + ..add('errorCode', errorCode) + ..add('errorMessage', errorMessage)) + .toString(); + } +} + +class ServiceExtensionResponseBuilder + implements + Builder { + _$ServiceExtensionResponse? _$v; + + String? _id; + String? get id => _$this._id; + set id(String? id) => _$this._id = id; + + String? _resultJson; + String? get resultJson => _$this._resultJson; + set resultJson(String? resultJson) => _$this._resultJson = resultJson; + + bool? _success; + bool? get success => _$this._success; + set success(bool? success) => _$this._success = success; + + int? _errorCode; + int? get errorCode => _$this._errorCode; + set errorCode(int? errorCode) => _$this._errorCode = errorCode; + + String? _errorMessage; + String? get errorMessage => _$this._errorMessage; + set errorMessage(String? errorMessage) => _$this._errorMessage = errorMessage; + + ServiceExtensionResponseBuilder(); + + ServiceExtensionResponseBuilder get _$this { + final $v = _$v; + if ($v != null) { + _id = $v.id; + _resultJson = $v.resultJson; + _success = $v.success; + _errorCode = $v.errorCode; + _errorMessage = $v.errorMessage; + _$v = null; + } + return this; + } + + @override + void replace(ServiceExtensionResponse other) { + ArgumentError.checkNotNull(other, 'other'); + _$v = other as _$ServiceExtensionResponse; + } + + @override + void update(void Function(ServiceExtensionResponseBuilder)? updates) { + if (updates != null) updates(this); + } + + @override + ServiceExtensionResponse build() => _build(); + + _$ServiceExtensionResponse _build() { + final _$result = + _$v ?? + new _$ServiceExtensionResponse._( + id: BuiltValueNullFieldError.checkNotNull( + id, + r'ServiceExtensionResponse', + 'id', + ), + resultJson: resultJson, + success: BuiltValueNullFieldError.checkNotNull( + success, + r'ServiceExtensionResponse', + 'success', + ), + errorCode: errorCode, + errorMessage: errorMessage, + ); + replace(_$result); + return _$result; + } +} + +// ignore_for_file: deprecated_member_use_from_same_package,type=lint diff --git a/dwds/lib/src/connections/debug_connection.dart b/dwds/lib/src/connections/debug_connection.dart index 271331eb3..06efd932c 100644 --- a/dwds/lib/src/connections/debug_connection.dart +++ b/dwds/lib/src/connections/debug_connection.dart @@ -22,9 +22,11 @@ class DebugConnection { Future? _closed; DebugConnection(this._appDebugServices) { - _appDebugServices.chromeProxyService.remoteDebugger.onClose.first.then((_) { - close(); - }); + // Only setup Chrome-specific close handling if we have a ChromeProxyService + final proxyService = _appDebugServices.proxyService; + if (proxyService is ChromeProxyService) { + proxyService.remoteDebugger.onClose.first.then((_) => close()); + } } /// The port of the host Dart VM Service. @@ -41,7 +43,10 @@ class DebugConnection { Future close() => _closed ??= () async { - await _appDebugServices.chromeProxyService.remoteDebugger.close(); + final proxyService = _appDebugServices.proxyService; + if (proxyService is ChromeProxyService) { + await proxyService.remoteDebugger.close(); + } await _appDebugServices.close(); _onDoneCompleter.complete(); }(); @@ -50,5 +55,10 @@ class DebugConnection { } /// [ChromeProxyService] of a [DebugConnection] for internal use only. -ChromeProxyService fetchChromeProxyService(DebugConnection debugConnection) => - debugConnection._appDebugServices.chromeProxyService; +ChromeProxyService fetchChromeProxyService(DebugConnection debugConnection) { + final service = debugConnection._appDebugServices.proxyService; + if (service is ChromeProxyService) { + return service; + } + throw StateError('ChromeProxyService not available in this debug connection'); +} diff --git a/dwds/lib/src/dwds_vm_client.dart b/dwds/lib/src/dwds_vm_client.dart index 34285c718..f5e97547a 100644 --- a/dwds/lib/src/dwds_vm_client.dart +++ b/dwds/lib/src/dwds_vm_client.dart @@ -9,6 +9,8 @@ import 'package:dwds/src/events.dart'; import 'package:dwds/src/services/chrome_debug_exception.dart'; import 'package:dwds/src/services/chrome_proxy_service.dart'; import 'package:dwds/src/services/debug_service.dart'; +import 'package:dwds/src/services/proxy_service.dart'; +import 'package:dwds/src/services/web_socket_proxy_service.dart'; import 'package:dwds/src/utilities/synchronized.dart'; import 'package:logging/logging.dart'; import 'package:uuid/uuid.dart'; @@ -17,8 +19,6 @@ import 'package:vm_service/vm_service_io.dart'; import 'package:vm_service_interface/vm_service_interface.dart'; import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'; -final _logger = Logger('DwdsVmClient'); - /// Type of requests added to the request controller. typedef VmRequest = Map; @@ -38,9 +38,22 @@ enum _NamespacedServiceExtension { final String method; } +/// Common interface for DWDS VM clients. +abstract class DwdsVmClient { + /// The VM service client. + VmService get client; + + /// Closes the VM client and releases resources. + Future close(); +} + +// Chrome-based DWDS VM client logger. +final _chromeLogger = Logger('DwdsVmClient'); + // A client of the vm service that registers some custom extensions like // hotRestart. -class DwdsVmClient { +class ChromeDwdsVmClient implements DwdsVmClient { + @override final VmService client; final StreamController> _requestController; final StreamController> _responseController; @@ -53,8 +66,13 @@ class DwdsVmClient { /// Synchronizes hot restarts to avoid races. final _hotRestartQueue = AtomicQueue(); - DwdsVmClient(this.client, this._requestController, this._responseController); + ChromeDwdsVmClient( + this.client, + this._requestController, + this._responseController, + ); + @override Future close() => _closed ??= () async { await _requestController.close(); @@ -62,13 +80,12 @@ class DwdsVmClient { await client.dispose(); }(); - static Future create( - DebugService debugService, + static Future create( + ChromeDebugService debugService, DwdsStats dwdsStats, Uri? ddsUri, ) async { - final chromeProxyService = - debugService.chromeProxyService as ChromeProxyService; + final chromeProxyService = debugService.chromeProxyService; final responseController = StreamController(); final responseSink = responseController.sink; // Response stream must be a broadcast stream so that it can have multiple @@ -104,7 +121,7 @@ class DwdsVmClient { clientCompleter.complete(client); } - final dwdsVmClient = DwdsVmClient( + final dwdsVmClient = ChromeDwdsVmClient( client, requestController, responseController, @@ -137,7 +154,7 @@ class DwdsVmClient { }) { final client = VmService(responseStream.map(jsonEncode), (request) { if (requestController.isClosed) { - _logger.warning( + _chromeLogger.warning( 'Attempted to send a request but the connection is closed:\n\n' '$request', ); @@ -162,7 +179,7 @@ class DwdsVmClient { static void _setUpVmServerConnection({ required ChromeProxyService chromeProxyService, required DwdsStats dwdsStats, - required DebugService debugService, + required ChromeDebugService debugService, required Stream responseStream, required StreamSink responseSink, required Stream requestStream, @@ -205,16 +222,20 @@ class DwdsVmClient { VmRequest? response; final method = request['method']; if (method == _NamespacedServiceExtension.flutterListViews.method) { - response = await _flutterListViewsHandler(chromeProxyService); + response = await flutterListViewsHandler(chromeProxyService); } else if (method == _NamespacedServiceExtension.extDwdsEmitEvent.method) { - response = _extDwdsEmitEventHandler(request); + response = extDwdsEmitEventHandler(request, _chromeLogger); } else if (method == _NamespacedServiceExtension.extDwdsReload.method) { response = await _extDwdsReloadHandler(chromeProxyService); } else if (method == _NamespacedServiceExtension.extDwdsRestart.method) { final client = await clientFuture; response = await _extDwdsRestartHandler(chromeProxyService, client); } else if (method == _NamespacedServiceExtension.extDwdsSendEvent.method) { - response = await _extDwdsSendEventHandler(request, dwdsStats); + response = await extDwdsSendEventHandler( + request, + dwdsStats, + _chromeLogger, + ); } else if (method == _NamespacedServiceExtension.extDwdsScreenshot.method) { response = await _extDwdsScreenshotHandler(chromeProxyService); } @@ -230,21 +251,6 @@ class DwdsVmClient { return response; } - static Future> _flutterListViewsHandler( - ChromeProxyService chromeProxyService, - ) async { - final vm = await chromeProxyService.getVM(); - final isolates = vm.isolates; - return { - 'result': { - 'views': [ - for (final isolate in isolates ?? []) - {'id': isolate.id, 'isolate': isolate.toJson()}, - ], - }, - }; - } - static Future> _extDwdsScreenshotHandler( ChromeProxyService chromeProxyService, ) async { @@ -255,27 +261,6 @@ class DwdsVmClient { return {'result': response.result as Object}; } - static Future> _extDwdsSendEventHandler( - VmResponse request, - DwdsStats dwdsStats, - ) async { - _processSendEvent(request, dwdsStats); - return {'result': Success().toJson()}; - } - - static Map _extDwdsEmitEventHandler(VmResponse request) { - final event = request['params'] as Map?; - if (event != null) { - final type = event['type'] as String?; - final payload = event['payload'] as Map?; - if (type != null && payload != null) { - emitEvent(DwdsEvent(type, payload)); - } - } - - return {'result': Success().toJson()}; - } - static Future> _extDwdsReloadHandler( ChromeProxyService chromeProxyService, ) async { @@ -294,7 +279,7 @@ class DwdsVmClient { static Future _registerServiceExtensions({ required VmService client, required ChromeProxyService chromeProxyService, - required DwdsVmClient dwdsVmClient, + required ChromeDwdsVmClient dwdsVmClient, }) async { client.registerServiceCallback( 'hotRestart', @@ -323,6 +308,219 @@ class DwdsVmClient { } } +// WebSocket-based DWDS VM client logger. +final _webSocketLogger = Logger('WebSocketDwdsVmClient'); + +/// WebSocket-based DWDS VM client. +class WebSocketDwdsVmClient implements DwdsVmClient { + @override + final VmService client; + final StreamController _requestController; + final StreamController _responseController; + Future? _closed; + + WebSocketDwdsVmClient( + this.client, + this._requestController, + this._responseController, + ); + + @override + Future close() => + _closed ??= () async { + await _requestController.close(); + await _responseController.close(); + await client.dispose(); + }(); + + static Future create( + WebSocketDebugService debugService, + ) async { + _webSocketLogger.fine('Creating WebSocket DWDS VM client'); + final webSocketProxyService = debugService.webSocketProxyService; + final responseController = StreamController(); + final responseSink = responseController.sink; + final responseStream = responseController.stream.asBroadcastStream(); + final requestController = StreamController(); + final requestSink = requestController.sink; + final requestStream = requestController.stream; + + _setUpWebSocketVmServerConnection( + webSocketProxyService: webSocketProxyService, + debugService: debugService, + responseStream: responseStream, + responseSink: responseSink, + requestStream: requestStream, + requestSink: requestSink, + ); + + final client = _setUpWebSocketVmClient( + responseStream: responseStream, + requestController: requestController, + requestSink: requestSink, + ); + + await _registerServiceExtensions( + client: client, + webSocketProxyService: webSocketProxyService, + ); + + _webSocketLogger.fine('WebSocket DWDS VM client created successfully'); + return WebSocketDwdsVmClient(client, requestController, responseController); + } + + static VmService _setUpWebSocketVmClient({ + required Stream responseStream, + required StreamSink requestSink, + required StreamController requestController, + }) { + final client = VmService(responseStream.map(jsonEncode), (request) { + if (requestController.isClosed) { + _webSocketLogger.warning( + 'Attempted to send a request but the connection is closed:\n\n$request', + ); + return; + } + requestSink.add(Map.from(jsonDecode(request))); + }); + return client; + } + + static void _setUpWebSocketVmServerConnection({ + required WebSocketProxyService webSocketProxyService, + required WebSocketDebugService debugService, + required Stream responseStream, + required StreamSink responseSink, + required Stream requestStream, + required StreamSink requestSink, + }) { + responseStream.listen((request) async { + final response = await _maybeHandleWebSocketServiceExtensionRequest( + request, + webSocketProxyService: webSocketProxyService, + ); + if (response != null) { + requestSink.add(response); + } + }); + + final vmServerConnection = VmServerConnection( + requestStream, + responseSink, + debugService.serviceExtensionRegistry, + webSocketProxyService, + ); + + // Register service extensions + for (final extension in _NamespacedServiceExtension.values) { + _webSocketLogger.finest( + 'Registering service extension: ${extension.method}', + ); + debugService.serviceExtensionRegistry.registerExtension( + extension.method, + vmServerConnection, + ); + } + } + + static Future _maybeHandleWebSocketServiceExtensionRequest( + VmResponse request, { + required WebSocketProxyService webSocketProxyService, + }) async { + VmRequest? response; + final method = request['method']; + + _webSocketLogger.finest('Processing service extension method: $method'); + + if (method == _NamespacedServiceExtension.flutterListViews.method) { + response = await flutterListViewsHandler(webSocketProxyService); + } else if (method == _NamespacedServiceExtension.extDwdsEmitEvent.method) { + response = extDwdsEmitEventHandler(request, _webSocketLogger); + } else if (method == _NamespacedServiceExtension.extDwdsReload.method) { + response = {'result': 'Reload not implemented'}; + } else if (method == _NamespacedServiceExtension.extDwdsSendEvent.method) { + response = await extDwdsSendEventHandler(request, null, _webSocketLogger); + } else if (method == _NamespacedServiceExtension.extDwdsScreenshot.method) { + response = {'result': 'Screenshot not implemented'}; + } + + if (response != null) { + response['id'] = request['id'] as String; + response['jsonrpc'] = '2.0'; + } + return response; + } + + static Future _registerServiceExtensions({ + required VmService client, + required WebSocketProxyService webSocketProxyService, + }) async { + client.registerServiceCallback( + 'hotRestart', + (request) => captureElapsedTime( + () => webSocketProxyService.hotRestart(), + (_) => DwdsEvent.hotRestart(), + ), + ); + await client.registerService('hotRestart', 'DWDS'); + + client.registerServiceCallback( + 'fullReload', + (request) => captureElapsedTime( + () async => { + 'result': + (await webSocketProxyService.reloadSources('dummy')).toJson(), + }, + (_) => DwdsEvent.fullReload(), + ), + ); + await client.registerService('fullReload', 'DWDS'); + } +} + +/// Shared handler for Flutter list views service extension. +Future> flutterListViewsHandler( + ProxyService proxyService, +) async { + final vm = await proxyService.getVM(); + final isolates = vm.isolates; + return { + 'result': { + 'views': [ + for (final isolate in isolates ?? []) + {'id': isolate.id, 'isolate': isolate.toJson()}, + ], + }, + }; +} + +/// Shared handler for DWDS emit event service extension. +Map extDwdsEmitEventHandler(VmResponse request, Logger logger) { + final event = request['params'] as Map?; + if (event != null) { + final type = event['type'] as String?; + final payload = event['payload'] as Map?; + if (type != null && payload != null) { + logger.fine('EmitEvent: $type $payload'); + emitEvent(DwdsEvent(type, payload)); + } + } + return {'result': Success().toJson()}; +} + +/// Shared handler for DWDS send event service extension. +Future> extDwdsSendEventHandler( + VmResponse request, + DwdsStats? dwdsStats, + Logger logger, +) async { + logger.fine('SendEvent: $request'); + if (dwdsStats != null) { + _processSendEvent(request, dwdsStats); + } + return {'result': Success().toJson()}; +} + void _processSendEvent(Map request, DwdsStats dwdsStats) { final event = request['params'] as Map?; if (event == null) return; @@ -331,13 +529,13 @@ void _processSendEvent(Map request, DwdsStats dwdsStats) { switch (type) { case 'DevtoolsEvent': { - _logger.finest('Received DevTools event: $event'); + _chromeLogger.finest('Received DevTools event: $event'); final action = payload?['action'] as String?; final screen = payload?['screen'] as String?; if (screen != null && action == 'pageReady') { _recordDwdsStats(dwdsStats, screen); } else { - _logger.finest('Ignoring unknown event: $event'); + _chromeLogger.finest('Ignoring unknown event: $event'); } } } @@ -351,16 +549,16 @@ void _recordDwdsStats(DwdsStats dwdsStats, String screen) { final devToolLoadTime = DateTime.now().difference(devToolsStart).inMilliseconds; emitEvent(DwdsEvent.devToolsLoad(devToolLoadTime, screen)); - _logger.fine('DevTools load time: $devToolLoadTime ms'); + _chromeLogger.fine('DevTools load time: $devToolLoadTime ms'); } if (debuggerStart != null) { final debuggerReadyTime = DateTime.now().difference(debuggerStart).inMilliseconds; emitEvent(DwdsEvent.debuggerReady(debuggerReadyTime, screen)); - _logger.fine('Debugger ready time: $debuggerReadyTime ms'); + _chromeLogger.fine('Debugger ready time: $debuggerReadyTime ms'); } } else { - _logger.finest('Debugger and DevTools stats are already recorded.'); + _chromeLogger.finest('Debugger and DevTools stats are already recorded.'); } } @@ -381,14 +579,14 @@ Future> _hotRestart( ChromeProxyService chromeProxyService, VmService client, ) async { - _logger.info('Attempting a hot restart'); + _chromeLogger.info('Attempting a hot restart'); chromeProxyService.terminatingIsolates = true; await _disableBreakpointsAndResume(client, chromeProxyService); try { - _logger.info('Attempting to get execution context ID.'); + _chromeLogger.info('Attempting to get execution context ID.'); await tryGetContextId(chromeProxyService); - _logger.info('Got execution context ID.'); + _chromeLogger.info('Got execution context ID.'); } on StateError catch (e) { // We couldn't find the execution context. `hotRestart` may have been // triggered in the middle of a full reload. @@ -408,12 +606,12 @@ Future> _hotRestart( } // Generate run id to hot restart all apps loaded into the tab. final runId = const Uuid().v4().toString(); - _logger.info('Issuing \$dartHotRestartDwds request'); + _chromeLogger.info('Issuing \$dartHotRestartDwds request'); await chromeProxyService.inspector.jsEvaluate( '\$dartHotRestartDwds(\'$runId\', $pauseIsolatesOnStart);', awaitPromise: true, ); - _logger.info('\$dartHotRestartDwds request complete.'); + _chromeLogger.info('\$dartHotRestartDwds request complete.'); } on WipError catch (exception) { final code = exception.error?['code']; final message = exception.error?['message']; @@ -433,11 +631,11 @@ Future> _hotRestart( }, }; } - _logger.info('Waiting for Isolate Start event.'); + _chromeLogger.info('Waiting for Isolate Start event.'); await stream.firstWhere((event) => event.kind == EventKind.kIsolateStart); chromeProxyService.terminatingIsolates = false; - _logger.info('Successful hot restart'); + _chromeLogger.info('Successful hot restart'); return {'result': Success().toJson()}; } @@ -455,10 +653,10 @@ void _waitForResumeEventToRunMain(ChromeProxyService chromeProxyService) { Future> _fullReload( ChromeProxyService chromeProxyService, ) async { - _logger.info('Attempting a full reload'); + _chromeLogger.info('Attempting a full reload'); await chromeProxyService.remoteDebugger.enablePage(); await chromeProxyService.remoteDebugger.pageReload(); - _logger.info('Successful full reload'); + _chromeLogger.info('Successful full reload'); return {'result': Success().toJson()}; } @@ -466,7 +664,9 @@ Future _disableBreakpointsAndResume( VmService client, ChromeProxyService chromeProxyService, ) async { - _logger.info('Attempting to disable breakpoints and resume the isolate'); + _chromeLogger.info( + 'Attempting to disable breakpoints and resume the isolate', + ); final vm = await client.getVM(); final isolates = vm.isolates; if (isolates == null || isolates.isEmpty) { @@ -495,9 +695,15 @@ Future _disableBreakpointsAndResume( await client.resume(isolateId); } on RPCError catch (e, s) { if (!e.message.contains('Can only perform operation while paused')) { - _logger.severe('Hot restart failed to resume exiting isolate', e, s); + _chromeLogger.severe( + 'Hot restart failed to resume exiting isolate', + e, + s, + ); rethrow; } } - _logger.info('Successfully disabled breakpoints and resumed the isolate'); + _chromeLogger.info( + 'Successfully disabled breakpoints and resumed the isolate', + ); } diff --git a/dwds/lib/src/handlers/dev_handler.dart b/dwds/lib/src/handlers/dev_handler.dart index 329777540..25b81982a 100644 --- a/dwds/lib/src/handlers/dev_handler.dart +++ b/dwds/lib/src/handlers/dev_handler.dart @@ -12,9 +12,11 @@ import 'package:dwds/data/debug_event.dart'; import 'package:dwds/data/devtools_request.dart'; import 'package:dwds/data/error_response.dart'; import 'package:dwds/data/hot_reload_response.dart'; +import 'package:dwds/data/hot_restart_response.dart'; import 'package:dwds/data/isolate_events.dart'; import 'package:dwds/data/register_event.dart'; import 'package:dwds/data/serializers.dart'; +import 'package:dwds/data/service_extension_response.dart'; import 'package:dwds/src/config/tool_configuration.dart'; import 'package:dwds/src/connections/app_connection.dart'; import 'package:dwds/src/connections/debug_connection.dart'; @@ -30,8 +32,10 @@ import 'package:dwds/src/servers/devtools.dart'; import 'package:dwds/src/servers/extension_backend.dart'; import 'package:dwds/src/servers/extension_debugger.dart'; import 'package:dwds/src/services/app_debug_services.dart'; +import 'package:dwds/src/services/chrome_proxy_service.dart'; import 'package:dwds/src/services/debug_service.dart'; import 'package:dwds/src/services/expression_compiler.dart'; +import 'package:dwds/src/services/web_socket_proxy_service.dart'; import 'package:dwds/src/utilities/shared.dart'; import 'package:logging/logging.dart'; import 'package:shelf/shelf.dart'; @@ -79,6 +83,8 @@ class DevHandler { Stream get connectedApps => _connectedApps.stream; + final bool useWebSocketConnection; + DevHandler( this._chromeConnection, this.buildResults, @@ -93,8 +99,9 @@ class DevHandler { this._injected, this._spawnDds, this._ddsPort, - this._launchDevToolsInNewWindow, - ) { + this._launchDevToolsInNewWindow, { + this.useWebSocketConnection = false, + }) { _subs.add(buildResults.listen(_emitBuildResults)); _listen(); if (_extensionBackend != null) { @@ -133,11 +140,14 @@ class DevHandler { } /// Sends the provided [request] to all connected injected clients. - void _sendRequestToClients(Object request) { + /// Returns the number of clients the request was successfully sent to. + int _sendRequestToClients(Object request) { _logger.finest('Sending request to injected clients: $request'); + var successfulSends = 0; for (final injectedConnection in _injectedConnections) { try { injectedConnection.sink.add(jsonEncode(serializers.serialize(request))); + successfulSends++; } on StateError catch (e) { // The sink has already closed (app is disconnected), or another StateError occurred. _logger.warning( @@ -148,10 +158,14 @@ class DevHandler { _logger.severe('Error sending request to client: $e', e, s); } } + _logger.fine( + 'Sent request to $successfulSends clients out of ${_injectedConnections.length} total connections', + ); + return successfulSends; } - /// Starts a [DebugService] for local debugging. - Future _startLocalDebugService( + /// Starts a [ChromeDebugService] for local debugging. + Future _startLocalDebugService( ChromeConnection chromeConnection, AppConnection appConnection, ) async { @@ -211,7 +225,7 @@ class DevHandler { final webkitDebugger = WebkitDebugger(WipDebugger(tabConnection)); - return DebugService.start( + return ChromeDebugService.start( // We assume the user will connect to the debug service on the same // machine. This allows consumers of DWDS to provide a `hostname` for // debugging through the Dart Debug Extension without impacting the local @@ -239,7 +253,6 @@ class DevHandler { expressionCompiler: _expressionCompiler, spawnDds: _spawnDds, ddsPort: _ddsPort, - sendClientRequest: _sendRequestToClients, ); } @@ -256,27 +269,64 @@ class DevHandler { final appId = appConnection.request.appId; var appServices = _servicesByAppId[appId]; if (appServices == null) { - final debugService = await _startLocalDebugService( - await _chromeConnection(), - appConnection, - ); - appServices = await _createAppDebugServices(debugService); - safeUnawaited( - appServices.chromeProxyService.remoteDebugger.onClose.first - .whenComplete(() async { - await appServices?.close(); - _servicesByAppId.remove(appConnection.request.appId); - _logger.info( - 'Stopped debug service on ' - 'ws://${debugService.hostname}:${debugService.port}\n', - ); - }), - ); + if (useWebSocketConnection) { + appServices = await _createWebSocketAppServices(appConnection); + } else { + appServices = await _createChromeAppServices(appConnection); + _setupChromeServiceCleanup(appServices, appConnection); + } _servicesByAppId[appId] = appServices; } + return appServices; } + /// Creates WebSocket-based app services for hot reload functionality. + Future _createWebSocketAppServices( + AppConnection appConnection, + ) async { + final webSocketDebugService = await WebSocketDebugService.start( + 'localhost', + appConnection, + sendClientRequest: _sendRequestToClients, + ); + return _createAppDebugServicesWebSocketMode( + webSocketDebugService, + appConnection, + ); + } + + /// Creates Chrome-based app services for full debugging capabilities. + Future _createChromeAppServices( + AppConnection appConnection, + ) async { + final debugService = await _startLocalDebugService( + await _chromeConnection(), + appConnection, + ); + return _createAppDebugServices(debugService); + } + + /// Sets up cleanup handling for Chrome-based services. + void _setupChromeServiceCleanup( + AppDebugServices appServices, + AppConnection appConnection, + ) { + final chromeProxy = appServices.proxyService; + if (chromeProxy is ChromeProxyService) { + safeUnawaited( + chromeProxy.remoteDebugger.onClose.first.whenComplete(() async { + await appServices.close(); + _servicesByAppId.remove(appConnection.request.appId); + _logger.info( + 'Stopped debug service on ' + 'ws://${appServices.debugService.hostname}:${appServices.debugService.port}\n', + ); + }), + ); + } + } + void _handleConnection(SocketConnection injectedConnection) { _injectedConnections.add(injectedConnection); AppConnection? appConnection; @@ -291,10 +341,13 @@ class DevHandler { 'https://github.com/dart-lang/webdev/issues/new.', ); } - appConnection = await _handleConnectRequest( - message, - injectedConnection, - ); + appConnection = + useWebSocketConnection + ? await _handleWebSocketConnectRequest( + message, + injectedConnection, + ) + : await _handleConnectRequest(message, injectedConnection); } else { final connection = appConnection; if (connection == null) { @@ -302,23 +355,9 @@ class DevHandler { } if (message is DevToolsRequest) { await _handleDebugRequest(connection, injectedConnection); - } else if (message is HotReloadResponse) { - // The app reload operation has completed. Mark the completer as done. - _servicesByAppId[connection.request.appId]?.chromeProxyService - .completeHotReload(message); - } else if (message is IsolateExit) { - _handleIsolateExit(connection); - } else if (message is IsolateStart) { - await _handleIsolateStart(connection); - } else if (message is BatchedDebugEvents) { - _servicesByAppId[connection.request.appId]?.chromeProxyService - .parseBatchedDebugEvents(message); - } else if (message is DebugEvent) { - _servicesByAppId[connection.request.appId]?.chromeProxyService - .parseDebugEvent(message); - } else if (message is RegisterEvent) { - _servicesByAppId[connection.request.appId]?.chromeProxyService - .parseRegisterEvent(message); + } else { + // Handle messages for both WebSocket and Chrome proxy services + await _handleMessage(connection, message); } } } catch (e, s) { @@ -350,13 +389,17 @@ class DevHandler { _injectedConnections.remove(injectedConnection); final connection = appConnection; if (connection != null) { - _appConnectionByAppId.remove(connection.request.appId); - final services = _servicesByAppId[connection.request.appId]; + final appId = connection.request.appId; + final services = _servicesByAppId[appId]; + // WebSocket mode doesn't need this because WebSocketProxyService handles connection tracking and cleanup + if (!useWebSocketConnection) { + _appConnectionByAppId.remove(appId); + } if (services != null) { if (services.connectedInstanceId == null || services.connectedInstanceId == connection.request.instanceId) { services.connectedInstanceId = null; - services.chromeProxyService.destroyIsolate(); + _handleIsolateExit(connection); } } } @@ -364,6 +407,46 @@ class DevHandler { ); } + /// Handles messages for both WebSocket and Chrome proxy services. + Future _handleMessage(AppConnection connection, Object? message) async { + if (message == null) return; + + final appId = connection.request.appId; + final proxyService = _servicesByAppId[appId]?.proxyService; + + if (proxyService == null) { + _logger.warning( + 'No proxy service found for appId: $appId to process $message', + ); + return; + } + + // Handle messages that are specific to certain proxy service types + if (message is HotReloadResponse) { + proxyService.completeHotReload(message); + } else if (message is HotRestartResponse) { + proxyService.completeHotRestart(message); + } else if (message is ServiceExtensionResponse) { + proxyService.completeServiceExtension(message); + } else if (message is IsolateExit) { + _handleIsolateExit(connection); + } else if (message is IsolateStart) { + await _handleIsolateStart(connection); + } else if (message is BatchedDebugEvents) { + proxyService.parseBatchedDebugEvents(message); + } else if (message is DebugEvent) { + proxyService.parseDebugEvent(message); + } else if (message is RegisterEvent) { + proxyService.parseRegisterEvent(message); + } else { + final serviceType = + proxyService is WebSocketProxyService ? 'WebSocket' : 'Chrome'; + throw UnsupportedError( + 'Message type ${message.runtimeType} is not supported in $serviceType mode', + ); + } + } + Future _handleDebugRequest( AppConnection appConnection, SocketConnection sseConnection, @@ -456,17 +539,68 @@ class DevHandler { ); appServices.connectedInstanceId = appConnection.request.instanceId; - appServices.dwdsStats.updateLoadTime( + appServices.dwdsStats!.updateLoadTime( debuggerStart: debuggerStart, devToolsStart: DateTime.now(), ); - await _launchDevTools( - appServices.chromeProxyService.remoteDebugger, - _constructDevToolsUri( - appServices.debugService.uri, - ideQueryParam: 'Dwds', - ), - ); + final chromeProxy = appServices.proxyService; + if (chromeProxy is ChromeProxyService) { + await _launchDevTools( + chromeProxy.remoteDebugger, + _constructDevToolsUri( + appServices.debugService.uri, + ideQueryParam: 'Dwds', + ), + ); + } + } + + /// Creates a debug connection for WebSocket mode. + Future createDebugConnectionForWebSocket( + AppConnection appConnection, + ) async { + final appDebugServices = await loadAppServices(appConnection); + + // Initialize WebSocket proxy service + try { + final proxyService = appDebugServices.proxyService; + if (proxyService is! WebSocketProxyService) { + throw StateError( + 'Expected WebSocketProxyService but got ${proxyService.runtimeType}. ', + ); + } + await proxyService.isInitialized; + _logger.fine('WebSocket proxy service initialized successfully'); + } catch (e) { + _logger.severe('Failed to initialize WebSocket proxy service: $e'); + rethrow; + } + + return DebugConnection(appDebugServices); + } + + /// Creates a debug connection for Chrome mode. + Future createDebugConnectionForChrome( + AppConnection appConnection, + ) async { + final appDebugServices = await loadAppServices(appConnection); + + // Initialize Chrome proxy service + try { + final proxyService = appDebugServices.proxyService; + if (proxyService is! ChromeProxyService) { + throw StateError( + 'Expected ChromeProxyService but got ${proxyService.runtimeType}. ', + ); + } + await proxyService.isInitialized; + _logger.fine('Chrome proxy service initialized successfully'); + } catch (e) { + _logger.severe('Failed to initialize Chrome proxy service: $e'); + rethrow; + } + + return DebugConnection(appDebugServices); } Future _handleConnectRequest( @@ -492,33 +626,39 @@ class DevHandler { // AppConnection is in the KeepAlive state (this means it disconnected but // is still waiting for a possible reconnect - this happens during a page // reload). - final canReuseConnection = + final canReconnect = services != null && (services.connectedInstanceId == null || existingConnection?.isInKeepAlivePeriod == true); - if (canReuseConnection) { + if (canReconnect) { // Disconnect any old connection (eg. those in the keep-alive waiting // state when reloading the page). existingConnection?.shutDown(); - services.chromeProxyService.destroyIsolate(); + final chromeProxy = services.proxyService; + if (chromeProxy is ChromeProxyService) { + chromeProxy.destroyIsolate(); + } // Reconnect to existing service. services.connectedInstanceId = message.instanceId; - if (services.chromeProxyService.pauseIsolatesOnStart) { - // If the pause-isolates-on-start flag is set, we need to wait for - // the resume event to run the app's main() method. - _waitForResumeEventToRunMain( - services.chromeProxyService.resumeAfterRestartEventsStream, - readyToRunMainCompleter, - ); - } else { - // Otherwise, we can run the app's main() method immediately. - readyToRunMainCompleter.complete(); - } + final chromeService = services.proxyService; + if (chromeService is ChromeProxyService) { + if (chromeService.pauseIsolatesOnStart) { + // If the pause-isolates-on-start flag is set, we need to wait for + // the resume event to run the app's main() method. + _waitForResumeEventToRunMain( + chromeService.resumeAfterRestartEventsStream, + readyToRunMainCompleter, + ); + } else { + // Otherwise, we can run the app's main() method immediately. + readyToRunMainCompleter.complete(); + } - await services.chromeProxyService.createIsolate(connection); + await chromeService.createIsolate(connection); + } } else { // If this is the initial app connection, we can run the app's main() // method immediately. @@ -529,6 +669,112 @@ class DevHandler { return connection; } + /// Handles WebSocket mode connection requests with multi-window support. + Future _handleWebSocketConnectRequest( + ConnectRequest message, + SocketConnection sseConnection, + ) async { + // After a page refresh, reconnect to the same app services if they + // were previously launched and create the new isolate. + final services = _servicesByAppId[message.appId]; + final existingConnection = _appConnectionByAppId[message.appId]; + // Completer to indicate when the app's main() method is ready to be run. + // Its future is passed to the AppConnection so that it can be awaited on + // before running the app's main() method: + final readyToRunMainCompleter = Completer(); + final connection = AppConnection( + message, + sseConnection, + readyToRunMainCompleter.future, + ); + + // Allow connection reuse for page refreshes and same instance reconnections + final isSameInstance = + existingConnection?.request.instanceId == message.instanceId; + final isKeepAliveReconnect = + existingConnection?.isInKeepAlivePeriod == true; + final hasNoActiveConnection = services?.connectedInstanceId == null; + final noExistingConnection = existingConnection == null; + + final canReconnect = + services != null && + (isSameInstance || + (isKeepAliveReconnect && hasNoActiveConnection) || + (noExistingConnection && hasNoActiveConnection)); + + if (canReconnect) { + // Reconnect to existing service. + await _reconnectToService( + services, + existingConnection, + connection, + message, + readyToRunMainCompleter, + ); + } else { + // New browser window or initial connection: run main() immediately + readyToRunMainCompleter.complete(); + + // For WebSocket mode, we need to proactively create and emit a debug connection + try { + // Initialize the WebSocket service and create debug connection + final debugConnection = await createDebugConnectionForWebSocket( + connection, + ); + + // Emit the debug connection through the extension stream + extensionDebugConnections.add(debugConnection); + } catch (e, s) { + _logger.warning('Failed to create WebSocket debug connection: $e\n$s'); + } + } + _appConnectionByAppId[message.appId] = connection; + _connectedApps.add(connection); + _logger.fine('App connection established for: ${message.appId}'); + return connection; + } + + /// Handles reconnection to existing services for web-socket mode. + Future _reconnectToService( + AppDebugServices services, + AppConnection? existingConnection, + AppConnection newConnection, + ConnectRequest message, + Completer readyToRunMainCompleter, + ) async { + // Disconnect old connection + existingConnection?.shutDown(); + services.connectedInstanceId = message.instanceId; + + _logger.finest('WebSocket service reconnected for app: ${message.appId}'); + + final wsService = services.proxyService; + if (wsService is WebSocketProxyService) { + _setupMainExecution( + wsService.pauseIsolatesOnStart, + wsService.resumeAfterRestartEventsStream, + readyToRunMainCompleter, + ); + } else { + readyToRunMainCompleter.complete(); + } + + await _handleIsolateStart(newConnection); + } + + /// Sets up main() execution timing based on pause settings. + void _setupMainExecution( + bool pauseIsolatesOnStart, + Stream? resumeEventsStream, + Completer readyToRunMainCompleter, + ) { + if (pauseIsolatesOnStart && resumeEventsStream != null) { + _waitForResumeEventToRunMain(resumeEventsStream, readyToRunMainCompleter); + } else { + readyToRunMainCompleter.complete(); + } + } + /// Waits for a resume event to trigger the app's main() method. /// /// The [readyToRunMainCompleter]'s future will be passed to the @@ -545,14 +791,37 @@ class DevHandler { }); } + /// Handles isolate exit events for both WebSocket and Chrome-based debugging. void _handleIsolateExit(AppConnection appConnection) { - _servicesByAppId[appConnection.request.appId]?.chromeProxyService - .destroyIsolate(); + final appId = appConnection.request.appId; + + if (useWebSocketConnection) { + _logger.fine( + 'Isolate exit handled by WebSocket proxy service for app: $appId', + ); + } else { + final proxyService = _servicesByAppId[appId]?.proxyService; + if (proxyService is ChromeProxyService) { + proxyService.destroyIsolate(); + } + } } + /// Handles isolate start events for both WebSocket and Chrome-based debugging. Future _handleIsolateStart(AppConnection appConnection) async { - await _servicesByAppId[appConnection.request.appId]?.chromeProxyService - .createIsolate(appConnection); + final appId = appConnection.request.appId; + + if (useWebSocketConnection) { + final proxyService = _servicesByAppId[appId]?.proxyService; + if (proxyService is WebSocketProxyService) { + await proxyService.createIsolate(appConnection); + } + } else { + final proxyService = _servicesByAppId[appId]?.proxyService; + if (proxyService is ChromeProxyService) { + await proxyService.createIsolate(appConnection); + } + } } void _listen() { @@ -581,7 +850,7 @@ class DevHandler { } Future _createAppDebugServices( - DebugService debugService, + ChromeDebugService debugService, ) async { final dwdsStats = DwdsStats(); Uri? ddsUri; @@ -589,8 +858,12 @@ class DevHandler { final dds = await debugService.startDartDevelopmentService(); ddsUri = dds.wsUri; } - final vmClient = await DwdsVmClient.create(debugService, dwdsStats, ddsUri); - final appDebugService = AppDebugServices( + final vmClient = await ChromeDwdsVmClient.create( + debugService, + dwdsStats, + ddsUri, + ); + final appDebugService = ChromeAppDebugServices( debugService, vmClient, dwdsStats, @@ -598,15 +871,18 @@ class DevHandler { ); final encodedUri = await debugService.encodedUri; _logger.info('Debug service listening on $encodedUri\n'); - await appDebugService.chromeProxyService.remoteDebugger.sendCommand( - 'Runtime.evaluate', - params: { - 'expression': - 'console.log(' - '"This app is linked to the debug service: $encodedUri"' - ');', - }, - ); + final chromeProxy = appDebugService.proxyService; + if (chromeProxy is ChromeProxyService) { + await chromeProxy.remoteDebugger.sendCommand( + 'Runtime.evaluate', + params: { + 'expression': + 'console.log(' + '"This app is linked to the debug service: $encodedUri"' + ');', + }, + ); + } // Notify that DWDS has been launched and a debug connection has been made: _maybeEmitDwdsLaunchEvent(); @@ -614,6 +890,28 @@ class DevHandler { return appDebugService; } + Future _createAppDebugServicesWebSocketMode( + WebSocketDebugService webSocketDebugService, + AppConnection appConnection, + ) async { + final wsVmClient = await WebSocketDwdsVmClient.create( + webSocketDebugService, + ); + final wsAppDebugService = WebSocketAppDebugServices( + webSocketDebugService, + wsVmClient, + ); + + safeUnawaited(_handleIsolateStart(appConnection)); + final debugServiceUri = webSocketDebugService.uri; + _logger.info('Debug service listening on $debugServiceUri\n'); + + // Notify that DWDS has been launched and a debug connection has been made: + _maybeEmitDwdsLaunchEvent(); + + return wsAppDebugService; + } + Future _listenForDebugExtension() async { final extensionBackend = _extensionBackend; if (extensionBackend == null) { @@ -627,13 +925,14 @@ class DevHandler { } } - /// Starts a [DebugService] for Dart Debug Extension. + /// Starts a [ChromeProxyService] for Dart Debug Extension. void _startExtensionDebugService(ExtensionDebugger extensionDebugger) { // Waits for a `DevToolsRequest` to be sent from the extension background // when the extension is clicked. extensionDebugger.devToolsRequestStream.listen((devToolsRequest) async { try { await _handleDevToolsRequest(extensionDebugger, devToolsRequest); + _logger.finest('DevTools request processed successfully'); } catch (error) { _logger.severe('Encountered error handling DevTools request.'); extensionDebugger.closeWithError(error); @@ -673,7 +972,7 @@ class DevHandler { final debuggerStart = DateTime.now(); var appServices = _servicesByAppId[appId]; if (appServices == null) { - final debugService = await DebugService.start( + final debugService = await ChromeDebugService.start( _hostname, extensionDebugger, executionContext, @@ -688,24 +987,25 @@ class DevHandler { expressionCompiler: _expressionCompiler, spawnDds: _spawnDds, ddsPort: _ddsPort, - sendClientRequest: _sendRequestToClients, ); appServices = await _createAppDebugServices(debugService); extensionDebugger.sendEvent('dwds.debugUri', debugService.uri); final encodedUri = await debugService.encodedUri; extensionDebugger.sendEvent('dwds.encodedUri', encodedUri); - safeUnawaited( - appServices.chromeProxyService.remoteDebugger.onClose.first - .whenComplete(() async { - appServices?.chromeProxyService.destroyIsolate(); - await appServices?.close(); - _servicesByAppId.remove(devToolsRequest.appId); - _logger.info( - 'Stopped debug service on ' - '${await appServices?.debugService.encodedUri}\n', - ); - }), - ); + final chromeProxy = appServices.proxyService; + if (chromeProxy is ChromeProxyService) { + safeUnawaited( + chromeProxy.remoteDebugger.onClose.first.whenComplete(() async { + chromeProxy.destroyIsolate(); + await appServices?.close(); + _servicesByAppId.remove(devToolsRequest.appId); + _logger.info( + 'Stopped debug service on ' + '${await appServices?.debugService.encodedUri}\n', + ); + }), + ); + } extensionDebugConnections.add(DebugConnection(appServices)); _servicesByAppId[appId] = appServices; } @@ -718,7 +1018,7 @@ class DevHandler { final encodedUri = await appServices.debugService.encodedUri; - appServices.dwdsStats.updateLoadTime( + appServices.dwdsStats!.updateLoadTime( debuggerStart: debuggerStart, devToolsStart: DateTime.now(), ); diff --git a/dwds/lib/src/handlers/injector.dart b/dwds/lib/src/handlers/injector.dart index d55494944..121c3628a 100644 --- a/dwds/lib/src/handlers/injector.dart +++ b/dwds/lib/src/handlers/injector.dart @@ -29,22 +29,12 @@ const _clientScript = 'dwds/src/injected/client'; /// This class is responsible for modifying the served JavaScript files /// to include the injected DWDS client, enabling debugging capabilities /// and source mapping when running in a browser environment. -/// -/// TODO(yjessy): Remove this when the DWDS WebSocket connection is implemented. -/// The `_useDwdsWebSocketConnection` flag determines the communication protocol: -/// - When `true`, uses a socket-based implementation. -/// - When `false`, uses Chrome-based communication protocol. class DwdsInjector { final Future? _extensionUri; final _devHandlerPaths = StreamController(); final _logger = Logger('DwdsInjector'); - final bool _useDwdsWebSocketConnection; - DwdsInjector({ - Future? extensionUri, - bool useDwdsWebSocketConnection = false, - }) : _extensionUri = extensionUri, - _useDwdsWebSocketConnection = useDwdsWebSocketConnection; + DwdsInjector({Future? extensionUri}) : _extensionUri = extensionUri; /// Returns the embedded dev handler paths. /// @@ -111,7 +101,6 @@ class DwdsInjector { devHandlerPath, entrypoint, await _extensionUri, - _useDwdsWebSocketConnection, ); body += await globalToolConfiguration.loadStrategy.bootstrapFor( entrypoint, @@ -148,7 +137,6 @@ Future _injectClientAndHoistMain( String devHandlerPath, String entrypointPath, String? extensionUri, - bool useDwdsWebSocketConnection, ) async { final bodyLines = body.split('\n'); final extensionIndex = bodyLines.indexWhere( @@ -167,7 +155,6 @@ Future _injectClientAndHoistMain( devHandlerPath, entrypointPath, extensionUri, - useDwdsWebSocketConnection, ); result += ''' // Injected by dwds for debugging support. @@ -199,7 +186,6 @@ Future _injectedClientSnippet( String devHandlerPath, String entrypointPath, String? extensionUri, - bool useDwdsWebSocketConnection, ) async { final loadStrategy = globalToolConfiguration.loadStrategy; final buildSettings = loadStrategy.buildSettings; @@ -218,7 +204,6 @@ Future _injectedClientSnippet( 'window.\$dartEmitDebugEvents = ${debugSettings.emitDebugEvents};\n' 'window.\$isInternalBuild = ${appMetadata.isInternalBuild};\n' 'window.\$isFlutterApp = ${buildSettings.isFlutterApp};\n' - 'window.\$useDwdsWebSocketConnection = $useDwdsWebSocketConnection;\n' '${loadStrategy is DdcLibraryBundleStrategy ? 'window.\$hotReloadSourcesPath = "${loadStrategy.hotReloadSourcesUri.toString()}";\n' : ''}' '${loadStrategy.loadClientSnippet(_clientScript)}'; diff --git a/dwds/lib/src/injected/client.js b/dwds/lib/src/injected/client.js index 85c394005..b362e61fa 100644 --- a/dwds/lib/src/injected/client.js +++ b/dwds/lib/src/injected/client.js @@ -1,4 +1,4 @@ -// Generated by dart2js (, csp, intern-composite-values), the Dart to JavaScript compiler version: 3.9.0-152.0.dev. +// Generated by dart2js (, csp, intern-composite-values), the Dart to JavaScript compiler version: 3.10.0-edge. // The code supports the following hooks: // dartPrint(message): // if this function is defined it is called instead of the Dart [print] @@ -388,6 +388,22 @@ return J.UnknownJavaScriptObject.prototype; return receiver; }, + getInterceptor$x(receiver) { + if (receiver == null) + return receiver; + if (typeof receiver != "object") { + if (typeof receiver == "function") + return J.JavaScriptFunction.prototype; + if (typeof receiver == "symbol") + return J.JavaScriptSymbol.prototype; + if (typeof receiver == "bigint") + return J.JavaScriptBigInt.prototype; + return receiver; + } + if (receiver instanceof A.Object) + return receiver; + return J.getNativeInterceptor(receiver); + }, set$length$asx(receiver, value) { return J.getInterceptor$asx(receiver).set$length(receiver, value); }, @@ -438,6 +454,9 @@ allMatches$2$s(receiver, a0, a1) { return J.getInterceptor$s(receiver).allMatches$2(receiver, a0, a1); }, + asUint8List$2$x(receiver, a0, a1) { + return J.getInterceptor$x(receiver).asUint8List$2(receiver, a0, a1); + }, cast$1$0$ax(receiver, $T1) { return J.getInterceptor$ax(receiver).cast$1$0(receiver, $T1); }, @@ -1366,7 +1385,7 @@ return new A.NullThrownFromJavaScriptException(ex); if (ex instanceof A.ExceptionAndStackTrace) { t1 = ex.dartException; - return A.saveStackTrace(ex, t1 == null ? type$.Object._as(t1) : t1); + return A.saveStackTrace(ex, t1 == null ? A._asObject(t1) : t1); } if (typeof ex !== "object") return ex; @@ -2211,6 +2230,9 @@ this._name = t0; this.__late_helper$_value = null; }, + _checkLength($length) { + return $length; + }, _ensureNativeList(list) { var t1, result, i; if (type$.JSIndexable_dynamic._is(list)) @@ -2251,8 +2273,13 @@ }, NativeByteBuffer: function NativeByteBuffer() { }, + NativeArrayBuffer: function NativeArrayBuffer() { + }, NativeTypedData: function NativeTypedData() { }, + _UnmodifiableNativeByteBufferView: function _UnmodifiableNativeByteBufferView(t0) { + this._data = t0; + }, NativeByteData: function NativeByteData() { }, NativeTypedArray: function NativeTypedArray() { @@ -2551,9 +2578,8 @@ return testRti._is(object); }, _specializedIsTest(testRti) { - var kind, simpleIsFn, $name, predicate, t2, - t1 = type$.Object; - if (testRti === t1) + var kind, simpleIsFn, $name, predicate, t1; + if (testRti === type$.Object) return A._isObject; if (A.isTopType(testRti)) return A._isTop; @@ -2579,8 +2605,8 @@ } } else if (kind === 10) { predicate = A.createRecordTypePredicate(testRti._primary, testRti._rest); - t2 = predicate == null ? A._isNever : predicate; - return t2 == null ? t1._as(t2) : t2; + t1 = predicate == null ? A._isNever : predicate; + return t1 == null ? A._asObject(t1) : t1; } return A._generalIsTestImplementation; }, @@ -2616,6 +2642,8 @@ asFn = A._asNumQ; else if (testRti === type$.nullable_double) asFn = A._asDoubleQ; + else if (testRti === type$.nullable_JSObject) + asFn = A._asJSObjectQ; } else if (testRti === type$.int) asFn = A._asInt; else if (testRti === type$.String) @@ -2626,6 +2654,8 @@ asFn = A._asNum; else if (testRti === type$.double) asFn = A._asDouble; + else if (testRti === type$.JSObject) + asFn = A._asJSObject; testRti._as = asFn; return testRti._as(object); }, @@ -2675,6 +2705,16 @@ return true; return false; }, + _isJSObjectStandalone(object) { + if (typeof object == "object") { + if (object instanceof A.Object) + return type$.JSObject._is(object); + return true; + } + if (typeof object == "function") + return true; + return false; + }, _generalAsCheckImplementation(object) { var testRti = this; if (object == null) { @@ -2804,6 +2844,18 @@ return object; throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "String?"), new Error()); }, + _asJSObject(object) { + if (A._isJSObjectStandalone(object)) + return object; + throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "JSObject"), new Error()); + }, + _asJSObjectQ(object) { + if (object == null) + return object; + if (A._isJSObjectStandalone(object)) + return object; + throw A.initializeExceptionWrapper(A._TypeError__TypeError$forType(object, "JSObject?"), new Error()); + }, _rtiArrayToString(array, genericContext) { var s, sep, i; for (s = "", sep = "", i = 0; i < array.length; ++i, sep = ", ") @@ -3845,6 +3897,78 @@ }($function, 1); return $.Zone__current.registerBinaryCallback$3$1(new A._wrapJsFunctionForAsync_closure($protected), type$.void, type$.int, type$.dynamic); }, + _asyncStarHelper(object, bodyFunctionOrErrorCode, controller) { + var t1, t2, t3, + _s10_ = "controller"; + if (bodyFunctionOrErrorCode === 0) { + t1 = controller.cancelationFuture; + if (t1 != null) + t1._completeWithValue$1(null); + else { + t1 = controller.___AsyncStarStreamController_controller_A; + t1 === $ && A.throwLateFieldNI(_s10_); + t1.close$0(); + } + return; + } else if (bodyFunctionOrErrorCode === 1) { + t1 = controller.cancelationFuture; + if (t1 != null) { + t2 = A.unwrapException(object); + t3 = A.getTraceFromException(object); + t1._completeErrorObject$1(new A.AsyncError(t2, t3)); + } else { + t1 = A.unwrapException(object); + t2 = A.getTraceFromException(object); + t3 = controller.___AsyncStarStreamController_controller_A; + t3 === $ && A.throwLateFieldNI(_s10_); + t3.addError$2(t1, t2); + controller.___AsyncStarStreamController_controller_A.close$0(); + } + return; + } + type$.void_Function_int_dynamic._as(bodyFunctionOrErrorCode); + if (object instanceof A._IterationMarker) { + if (controller.cancelationFuture != null) { + bodyFunctionOrErrorCode.call$2(2, null); + return; + } + t1 = object.state; + if (t1 === 0) { + t1 = object.value; + t2 = controller.___AsyncStarStreamController_controller_A; + t2 === $ && A.throwLateFieldNI(_s10_); + t2.add$1(0, controller.$ti._precomputed1._as(t1)); + A.scheduleMicrotask(new A._asyncStarHelper_closure(controller, bodyFunctionOrErrorCode)); + return; + } else if (t1 === 1) { + t1 = controller.$ti._eval$1("Stream<1>")._as(type$.Stream_dynamic._as(object.value)); + t2 = controller.___AsyncStarStreamController_controller_A; + t2 === $ && A.throwLateFieldNI(_s10_); + t2.addStream$2$cancelOnError(t1, false).then$1$1(new A._asyncStarHelper_closure0(controller, bodyFunctionOrErrorCode), type$.Null); + return; + } + } + A._awaitOnObject(object, bodyFunctionOrErrorCode); + }, + _streamOfController(controller) { + var t1 = controller.___AsyncStarStreamController_controller_A; + t1 === $ && A.throwLateFieldNI("controller"); + return new A._ControllerStream(t1, A._instanceType(t1)._eval$1("_ControllerStream<1>")); + }, + _AsyncStarStreamController$(body, $T) { + var t1 = new A._AsyncStarStreamController($T._eval$1("_AsyncStarStreamController<0>")); + t1._AsyncStarStreamController$1(body, $T); + return t1; + }, + _makeAsyncStarStreamController(body, $T) { + return A._AsyncStarStreamController$(body, $T); + }, + _IterationMarker_yieldStar(values) { + return new A._IterationMarker(values, 1); + }, + _IterationMarker_yieldSingle(value) { + return new A._IterationMarker(value, 0); + }, AsyncError_defaultStackTrace(error) { var stackTrace; if (type$.Error._is(error)) { @@ -4144,21 +4268,12 @@ t1 = $.Zone__current; t1.scheduleMicrotask$1(t1.bindCallbackGuarded$1(callback)); }, - Stream_Stream$value(value, $T) { - var _null = null, - t1 = $T._eval$1("_AsyncStreamController<0>"), - t2 = new A._AsyncStreamController(_null, _null, _null, _null, t1); - t2._add$1(value); - t2._closeUnchecked$0(); - return new A._ControllerStream(t2, t1._eval$1("_ControllerStream<1>")); - }, StreamIterator_StreamIterator(stream, $T) { A.checkNotNullable(stream, "stream", type$.Object); return new A._StreamIterator($T._eval$1("_StreamIterator<0>")); }, - StreamController_StreamController(onCancel, onListen, sync, $T) { - var _null = null; - return sync ? new A._SyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_SyncStreamController<0>")) : new A._AsyncStreamController(onListen, _null, _null, onCancel, $T._eval$1("_AsyncStreamController<0>")); + StreamController_StreamController(onCancel, onListen, onResume, sync, $T) { + return sync ? new A._SyncStreamController(onListen, null, onResume, onCancel, $T._eval$1("_SyncStreamController<0>")) : new A._AsyncStreamController(onListen, null, onResume, onCancel, $T._eval$1("_AsyncStreamController<0>")); }, _runGuarded(notificationHandler) { var e, s, exception; @@ -4172,6 +4287,9 @@ $.Zone__current.handleUncaughtError$2(e, s); } }, + _AddStreamState_makeErrorHandler(controller) { + return new A._AddStreamState_makeErrorHandler_closure(controller); + }, _BufferingStreamSubscription__registerDataHandler(zone, handleData, $T) { var t1 = handleData == null ? A.async___nullDataHandler$closure() : handleData; return zone.registerUnaryCallback$2$1(t1, type$.void, $T); @@ -4188,7 +4306,7 @@ _nullDataHandler(value) { }, _nullErrorHandler(error, stackTrace) { - type$.Object._as(error); + A._asObject(error); type$.StackTrace._as(stackTrace); $.Zone__current.handleUncaughtError$2(error, stackTrace); }, @@ -4254,14 +4372,14 @@ $.Zone__current = old; } }, - _rootRunBinary($self, $parent, zone, f, arg1, arg2, $R, T1, T2) { + _rootRunBinary($self, $parent, zone, f, arg1, arg2, $R, $T1, $T2) { var old, t1; type$.nullable_Zone._as($self); type$.nullable_ZoneDelegate._as($parent); type$.Zone._as(zone); - $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f); - T1._as(arg1); - T2._as(arg2); + $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f); + $T1._as(arg1); + $T2._as(arg2); t1 = $.Zone__current; if (t1 === zone) return f.call$2(arg1, arg2); @@ -4280,8 +4398,8 @@ _rootRegisterUnaryCallback($self, $parent, zone, f, $R, $T) { return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f); }, - _rootRegisterBinaryCallback($self, $parent, zone, f, $R, T1, T2) { - return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f); + _rootRegisterBinaryCallback($self, $parent, zone, f, $R, $T1, $T2) { + return $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f); }, _rootErrorCallback($self, $parent, zone, error, stackTrace) { type$.nullable_StackTrace._as(stackTrace); @@ -4391,6 +4509,45 @@ _wrapJsFunctionForAsync_closure: function _wrapJsFunctionForAsync_closure(t0) { this.$protected = t0; }, + _asyncStarHelper_closure: function _asyncStarHelper_closure(t0, t1) { + this.controller = t0; + this.bodyFunction = t1; + }, + _asyncStarHelper_closure0: function _asyncStarHelper_closure0(t0, t1) { + this.controller = t0; + this.bodyFunction = t1; + }, + _AsyncStarStreamController: function _AsyncStarStreamController(t0) { + var _ = this; + _.___AsyncStarStreamController_controller_A = $; + _.isSuspended = false; + _.cancelationFuture = null; + _.$ti = t0; + }, + _AsyncStarStreamController__resumeBody: function _AsyncStarStreamController__resumeBody(t0) { + this.body = t0; + }, + _AsyncStarStreamController__resumeBody_closure: function _AsyncStarStreamController__resumeBody_closure(t0) { + this.body = t0; + }, + _AsyncStarStreamController_closure0: function _AsyncStarStreamController_closure0(t0) { + this._resumeBody = t0; + }, + _AsyncStarStreamController_closure1: function _AsyncStarStreamController_closure1(t0, t1) { + this.$this = t0; + this._resumeBody = t1; + }, + _AsyncStarStreamController_closure: function _AsyncStarStreamController_closure(t0, t1) { + this.$this = t0; + this.body = t1; + }, + _AsyncStarStreamController__closure: function _AsyncStarStreamController__closure(t0) { + this.body = t0; + }, + _IterationMarker: function _IterationMarker(t0, t1) { + this.value = t0; + this.state = t1; + }, AsyncError: function AsyncError(t0, t1) { this.error = t0; this.stackTrace = t1; @@ -4560,6 +4717,21 @@ this._async$_target = t0; this.$ti = t1; }, + _AddStreamState: function _AddStreamState() { + }, + _AddStreamState_makeErrorHandler_closure: function _AddStreamState_makeErrorHandler_closure(t0) { + this.controller = t0; + }, + _AddStreamState_cancel_closure: function _AddStreamState_cancel_closure(t0) { + this.$this = t0; + }, + _StreamControllerAddStreamState: function _StreamControllerAddStreamState(t0, t1, t2, t3) { + var _ = this; + _._varData = t0; + _.addStreamFuture = t1; + _.addSubscription = t2; + _.$ti = t3; + }, _BufferingStreamSubscription: function _BufferingStreamSubscription() { }, _BufferingStreamSubscription_asFuture_closure: function _BufferingStreamSubscription_asFuture_closure(t0, t1) { @@ -4953,7 +5125,7 @@ }, _LinkedHashSetCell: function _LinkedHashSetCell(t0) { this._element = t0; - this._collection$_previous = this._collection$_next = null; + this._collection$_next = null; }, _LinkedHashSetIterator: function _LinkedHashSetIterator(t0, t1, t2) { var _ = this; @@ -5440,7 +5612,7 @@ _JsonMap: function _JsonMap(t0, t1) { this._original = t0; this._processed = t1; - this._data = null; + this._convert$_data = null; }, _JsonMapKeyIterable: function _JsonMapKeyIterable(t0) { this._parent = t0; @@ -5927,7 +6099,7 @@ Error__throw(error, stackTrace) { error = A.initializeExceptionWrapper(error, new Error()); if (error == null) - error = type$.Object._as(error); + error = A._asObject(error); error.stack = stackTrace.toString$0(0); throw error; }, @@ -6276,8 +6448,8 @@ B.JSArray_methods.add$1(parts, penultimateString); B.JSArray_methods.add$1(parts, ultimateString); }, - Map_castFrom(source, $K, $V, K2, V2) { - return new A.CastMap(source, $K._eval$1("@<0>")._bind$1($V)._bind$1(K2)._bind$1(V2)._eval$1("CastMap<1,2,3,4>")); + Map_castFrom(source, $K, $V, $K2, $V2) { + return new A.CastMap(source, $K._eval$1("@<0>")._bind$1($V)._bind$1($K2)._bind$1($V2)._eval$1("CastMap<1,2,3,4>")); }, Object_hash(object1, object2, object3, object4) { var t1; @@ -7521,24 +7693,24 @@ _.___Uri_hashCode_FI = _.___Uri_pathSegments_FI = _.___Uri__text_FI = $; }, JSAnyUtilityExtension_instanceOfString(_this, constructorName) { - var parts, $constructor, t1, t2, _i, t3; + var parts, $constructor, t1, _i, t2; if (constructorName.length === 0) return false; parts = constructorName.split("."); $constructor = init.G; - for (t1 = parts.length, t2 = type$.nullable_JSObject, _i = 0; _i < t1; ++_i, $constructor = t3) { - t3 = $constructor[parts[_i]]; - t2._as(t3); - if (t3 == null) + for (t1 = parts.length, _i = 0; _i < t1; ++_i, $constructor = t2) { + t2 = $constructor[parts[_i]]; + A._asJSObjectQ(t2); + if (t2 == null) return false; } return _this instanceof type$.JavaScriptFunction._as($constructor); }, FutureOfJSAnyToJSPromise_get_toJS(_this, $T) { - return type$.JSObject._as(new init.G.Promise(A._functionToJS2(new A.FutureOfJSAnyToJSPromise_get_toJS_closure(_this)))); + return A._asJSObject(new init.G.Promise(A._functionToJS2(new A.FutureOfJSAnyToJSPromise_get_toJS_closure(_this)))); }, FutureOfVoidToJSPromise_get_toJS(_this) { - return type$.JSObject._as(new init.G.Promise(A._functionToJS2(new A.FutureOfVoidToJSPromise_get_toJS_closure(_this)))); + return A._asJSObject(new init.G.Promise(A._functionToJS2(new A.FutureOfVoidToJSPromise_get_toJS_closure(_this)))); }, FutureOfJSAnyToJSPromise_get_toJS_closure: function FutureOfJSAnyToJSPromise_get_toJS_closure(t0) { this._this = t0; @@ -7612,6 +7784,17 @@ return callback.call$1(arg1); return callback.call$0(); }, + _callDartFunctionFast3(callback, arg1, arg2, arg3, $length) { + type$.Function._as(callback); + A._asInt($length); + if ($length >= 3) + return callback.call$3(arg1, arg2, arg3); + if ($length === 2) + return callback.call$2(arg1, arg2); + if ($length === 1) + return callback.call$1(arg1); + return callback.call$0(); + }, _noJsifyRequired(o) { return o == null || A._isBool(o) || typeof o == "number" || typeof o == "string" || type$.Int8List._is(o) || type$.Uint8List._is(o) || type$.Uint8ClampedList._is(o) || type$.Int16List._is(o) || type$.Uint16List._is(o) || type$.Int32List._is(o) || type$.Uint32List._is(o) || type$.Float32List._is(o) || type$.Float64List._is(o) || type$.ByteBuffer._is(o) || type$.ByteData._is(o); }, @@ -7680,11 +7863,11 @@ A.checkTypeBound($T, type$.num, "T", "max"); return Math.max($T._as(a), $T._as(b)); }, - Random_Random(seed) { - return B.C__JSRandom; - }, _JSRandom: function _JSRandom() { }, + _JSSecureRandom: function _JSSecureRandom(t0) { + this._math$_buffer = t0; + }, AsyncMemoizer: function AsyncMemoizer(t0, t1) { this._async_memoizer$_completer = t0; this.$ti = t1; @@ -8456,6 +8639,34 @@ var _ = this; _._errorMessage = _._hot_reload_response$_success = _._hot_reload_response$_id = _._hot_reload_response$_$v = null; }, + HotRestartRequest: function HotRestartRequest() { + }, + _$HotRestartRequestSerializer: function _$HotRestartRequestSerializer() { + }, + _$HotRestartRequest: function _$HotRestartRequest(t0) { + this.id = t0; + }, + HotRestartRequestBuilder: function HotRestartRequestBuilder() { + this._hot_restart_request$_id = this._hot_restart_request$_$v = null; + }, + HotRestartResponse___new_tearOff(updates) { + var t1 = new A.HotRestartResponseBuilder(); + type$.nullable_void_Function_HotRestartResponseBuilder._as(type$.void_Function_HotRestartResponseBuilder._as(updates)).call$1(t1); + return t1._hot_restart_response$_build$0(); + }, + HotRestartResponse: function HotRestartResponse() { + }, + _$HotRestartResponseSerializer: function _$HotRestartResponseSerializer() { + }, + _$HotRestartResponse: function _$HotRestartResponse(t0, t1, t2) { + this.id = t0; + this.success = t1; + this.errorMessage = t2; + }, + HotRestartResponseBuilder: function HotRestartResponseBuilder() { + var _ = this; + _._hot_restart_response$_errorMessage = _._hot_restart_response$_success = _._hot_restart_response$_id = _._hot_restart_response$_$v = null; + }, IsolateExit: function IsolateExit() { }, IsolateStart: function IsolateStart() { @@ -8495,6 +8706,48 @@ }, _$serializers_closure0: function _$serializers_closure0() { }, + ServiceExtensionRequest: function ServiceExtensionRequest() { + }, + _$ServiceExtensionRequestSerializer: function _$ServiceExtensionRequestSerializer() { + }, + _$ServiceExtensionRequest: function _$ServiceExtensionRequest(t0, t1, t2) { + this.id = t0; + this.method = t1; + this.argsJson = t2; + }, + ServiceExtensionRequestBuilder: function ServiceExtensionRequestBuilder() { + var _ = this; + _._argsJson = _._service_extension_request$_method = _._service_extension_request$_id = _._service_extension_request$_$v = null; + }, + ServiceExtensionResponse_ServiceExtensionResponse$fromResult(errorCode, errorMessage, id, result, success) { + var t1 = new A.ServiceExtensionResponseBuilder(); + type$.nullable_void_Function_ServiceExtensionResponseBuilder._as(new A.ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure(id, success, result, errorCode, errorMessage)).call$1(t1); + return t1._service_extension_response$_build$0(); + }, + ServiceExtensionResponse: function ServiceExtensionResponse() { + }, + ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure: function ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure(t0, t1, t2, t3, t4) { + var _ = this; + _.id = t0; + _.success = t1; + _.result = t2; + _.errorCode = t3; + _.errorMessage = t4; + }, + _$ServiceExtensionResponseSerializer: function _$ServiceExtensionResponseSerializer() { + }, + _$ServiceExtensionResponse: function _$ServiceExtensionResponse(t0, t1, t2, t3, t4) { + var _ = this; + _.id = t0; + _.resultJson = t1; + _.success = t2; + _.errorCode = t3; + _.errorMessage = t4; + }, + ServiceExtensionResponseBuilder: function ServiceExtensionResponseBuilder() { + var _ = this; + _._service_extension_response$_errorMessage = _._errorCode = _._service_extension_response$_success = _._resultJson = _._service_extension_response$_id = _._service_extension_response$_$v = null; + }, BatchedStreamController: function BatchedStreamController(t0, t1, t2, t3, t4, t5) { var _ = this; _._checkDelayMilliseconds = t0; @@ -8707,39 +8960,156 @@ }, BaseResponse: function BaseResponse() { }, - _extension_0_get_responseHeaders(_this) { - var _i, header, splitIdx, key, value, - t1 = type$.String, - headers = A.LinkedHashMap_LinkedHashMap$_empty(t1, t1), - headersList = A._asString(_this.getAllResponseHeaders()).split("\r\n"); - for (t1 = headersList.length, _i = 0; _i < t1; ++_i) { - header = headersList[_i]; - if (header.length === 0) - continue; - splitIdx = B.JSString_methods.indexOf$1(header, ": "); - if (splitIdx === -1) - continue; - key = B.JSString_methods.substring$2(header, 0, splitIdx).toLowerCase(); - value = B.JSString_methods.substring$1(header, splitIdx + 2); - if (headers.containsKey$1(key)) - headers.$indexSet(0, key, A.S(headers.$index(0, key)) + ", " + value); - else - headers.$indexSet(0, key, value); + _rethrowAsClientException(e, st, request) { + var message; + if (!(e instanceof A.ClientException)) { + message = J.toString$0$(e); + if (B.JSString_methods.startsWith$1(message, "TypeError: ")) + message = B.JSString_methods.substring$1(message, 11); + e = new A.ClientException(message, request.url); } - return headers; + A.Error_throwWithStackTrace(e, st); + }, + _readBody(request, response) { + return A._readBody$body(request, response); + }, + _readBody$body(request, response) { + var $async$_readBody = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + switch ($async$errorCode) { + case 2: + $async$next = $async$nextWhenCanceled; + $async$goto = $async$next.pop(); + break; + case 1: + $async$errorStack.push($async$result); + $async$goto = $async$handler; + } + while (true) + switch ($async$goto) { + case 0: + // Function start + _box_0 = {}; + t1 = A._asJSObjectQ(response.body); + bodyStreamReader = t1 == null ? null : A._asJSObject(t1.getReader()); + if (bodyStreamReader == null) { + // goto return + $async$goto = 1; + break; + } + isDone = false; + _box_0.isError = false; + $async$handler = 4; + t1 = type$.NativeUint8List, t2 = type$.JSObject; + case 7: + // for condition + // trivial condition + $async$goto = 9; + return A._asyncStarHelper(A.promiseToFuture(A._asJSObject(bodyStreamReader.read()), t2), $async$_readBody, $async$controller); + case 9: + // returning from await. + chunk = $async$result; + if (A._asBool(chunk.done)) { + isDone = true; + // goto after for + $async$goto = 8; + break; + } + t3 = chunk.value; + t3.toString; + $async$goto = 10; + $async$nextWhenCanceled = [1, 5]; + return A._asyncStarHelper(A._IterationMarker_yieldSingle(t1._as(t3)), $async$_readBody, $async$controller); + case 10: + // after yield + // goto for condition + $async$goto = 7; + break; + case 8: + // after for + $async$next.push(6); + // goto finally + $async$goto = 5; + break; + case 4: + // catch + $async$handler = 3; + $async$exception = $async$errorStack.pop(); + e = A.unwrapException($async$exception); + st = A.getTraceFromException($async$exception); + _box_0.isError = true; + A._rethrowAsClientException(e, st, request); + $async$next.push(6); + // goto finally + $async$goto = 5; + break; + case 3: + // uncaught + $async$next = [2]; + case 5: + // finally + $async$handler = 2; + $async$goto = !isDone ? 11 : 12; + break; + case 11: + // then + $async$handler = 14; + $async$goto = 17; + return A._asyncStarHelper(A.promiseToFuture(A._asJSObject(bodyStreamReader.cancel()), type$.nullable_Object).catchError$2$test(new A._readBody_closure(), new A._readBody_closure0(_box_0)), $async$_readBody, $async$controller); + case 17: + // returning from await. + $async$handler = 2; + // goto after finally + $async$goto = 16; + break; + case 14: + // catch + $async$handler = 13; + $async$exception1 = $async$errorStack.pop(); + e0 = A.unwrapException($async$exception1); + st0 = A.getTraceFromException($async$exception1); + if (!_box_0.isError) + A._rethrowAsClientException(e0, st0, request); + // goto after finally + $async$goto = 16; + break; + case 13: + // uncaught + // goto rethrow + $async$goto = 2; + break; + case 16: + // after finally + case 12: + // join + // goto the next finally handler + $async$goto = $async$next.pop(); + break; + case 6: + // after finally + case 1: + // return + return A._asyncStarHelper(null, 0, $async$controller); + case 2: + // rethrow + return A._asyncStarHelper($async$errorStack.at(-1), 1, $async$controller); + } + }); + var $async$goto = 0, + $async$controller = A._makeAsyncStarStreamController($async$_readBody, type$.List_int), + $async$nextWhenCanceled, $async$handler = 2, $async$errorStack = [], $async$next = [], isDone, chunk, e, st, e0, st0, t2, t3, exception, _box_0, t1, bodyStreamReader, $async$exception, $async$exception1; + return A._streamOfController($async$controller); }, BrowserClient: function BrowserClient(t0) { - this._xhrs = t0; + this._abortController = t0; this.withCredentials = false; }, - BrowserClient_send_closure: function BrowserClient_send_closure(t0, t1, t2) { - this.xhr = t0; - this.completer = t1; - this.request = t2; + BrowserClient_send_closure: function BrowserClient_send_closure(t0) { + this.headers = t0; }, - BrowserClient_send_closure0: function BrowserClient_send_closure0(t0, t1) { - this.completer = t0; - this.request = t1; + _readBody_closure: function _readBody_closure() { + }, + _readBody_closure0: function _readBody_closure0(t0) { + this._box_0 = t0; }, ByteStream: function ByteStream(t0) { this._stream = t0; @@ -8747,6 +9117,9 @@ ByteStream_toBytes_closure: function ByteStream_toBytes_closure(t0) { this.completer = t0; }, + ClientException$(message, uri) { + return new A.ClientException(message, uri); + }, ClientException: function ClientException(t0, t1) { this.message = t0; this.uri = t1; @@ -9325,11 +9698,11 @@ SseClient$(serverUrl, debugKey) { var t3, t4, t5, _null = null, t1 = type$.String, - t2 = A.StreamController_StreamController(_null, _null, false, t1); - t1 = A.StreamController_StreamController(_null, _null, false, t1); + t2 = A.StreamController_StreamController(_null, _null, _null, false, t1); + t1 = A.StreamController_StreamController(_null, _null, _null, false, t1); t3 = A.Logger_Logger("SseClient"); t4 = $.Zone__current; - t5 = A.generateUuidV4(); + t5 = A.generateId(); t1 = new A.SseClient(debugKey + "-" + t5, t2, t1, t3, new A._AsyncCompleter(new A._Future(t4, type$._Future_void), type$._AsyncCompleter_void)); t1.SseClient$2$debugKey(serverUrl, debugKey); return t1; @@ -9363,21 +9736,6 @@ this.$this = t1; this.message = t2; }, - generateUuidV4() { - var t1 = new A.generateUuidV4_printDigits(), - t2 = new A.generateUuidV4_bitsDigits(t1, new A.generateUuidV4_generateBits(B.C__JSRandom)), - t3 = B.C__JSRandom.nextInt$1(4); - return A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4)) + "-" + A.S(t2.call$2(16, 4)) + "-4" + A.S(t2.call$2(12, 3)) + "-" + A.S(t1.call$2(8 + t3, 1)) + A.S(t2.call$2(12, 3)) + "-" + A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4)) + A.S(t2.call$2(16, 4)); - }, - generateUuidV4_generateBits: function generateUuidV4_generateBits(t0) { - this.random = t0; - }, - generateUuidV4_printDigits: function generateUuidV4_printDigits() { - }, - generateUuidV4_bitsDigits: function generateUuidV4_bitsDigits(t0, t1) { - this.printDigits = t0; - this.generateBits = t1; - }, GuaranteeChannel$(innerStream, innerSink, allowSinkErrors, $T) { var t2, t1 = {}; t1.innerStream = innerStream; @@ -9432,8 +9790,7 @@ }, RNG: function RNG() { }, - MathRNG: function MathRNG(t0) { - this._rnd = t0; + CryptoRNG: function CryptoRNG() { }, UuidV1: function UuidV1(t0) { this.goptions = t0; @@ -9485,7 +9842,7 @@ BrowserWebSocket_connect(url, protocols) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.BrowserWebSocket), - $async$returnValue, t1, t2, t3, t4, webSocket, browserSocket, webSocketConnected; + $async$returnValue, t1, t2, t3, webSocket, browserSocket, webSocketConnected; var $async$BrowserWebSocket_connect = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -9500,23 +9857,21 @@ t3 = url.toString$0(0); t1 = t1.Array; t1 = type$.JSArray_nullable_Object._as(new t1()); - t4 = type$.JSObject; - webSocket = t4._as(new t2(t3, t1)); + webSocket = A._asJSObject(new t2(t3, t1)); webSocket.binaryType = "arraybuffer"; - browserSocket = new A.BrowserWebSocket(webSocket, A.StreamController_StreamController(null, null, false, type$.WebSocketEvent)); + browserSocket = new A.BrowserWebSocket(webSocket, A.StreamController_StreamController(null, null, null, false, type$.WebSocketEvent)); t1 = new A._Future($.Zone__current, type$._Future_BrowserWebSocket); webSocketConnected = new A._AsyncCompleter(t1, type$._AsyncCompleter_BrowserWebSocket); if (A._asInt(webSocket.readyState) === 1) webSocketConnected.complete$1(browserSocket); - else if (A._asInt(webSocket.readyState) === 2 || A._asInt(webSocket.readyState) === 3) { - A._asInt(webSocket.readyState); - webSocketConnected.completeError$1(new A.WebSocketException()); - } else + else if (A._asInt(webSocket.readyState) === 2 || A._asInt(webSocket.readyState) === 3) + webSocketConnected.completeError$1(new A.WebSocketException("Unexpected WebSocket state: " + A._asInt(webSocket.readyState) + ", expected CONNECTING (0) or OPEN (1)")); + else new A._EventStream(webSocket, "open", false, type$._EventStream_JSObject).get$first(0).then$1$1(new A.BrowserWebSocket_connect_closure(webSocketConnected, browserSocket), type$.void); t2 = type$._EventStream_JSObject; t3 = type$.void; new A._EventStream(webSocket, "error", false, t2).get$first(0).then$1$1(new A.BrowserWebSocket_connect_closure0(webSocketConnected, browserSocket), t3); - A._EventStreamSubscription$(webSocket, "message", type$.nullable_void_Function_JSObject._as(new A.BrowserWebSocket_connect_closure1(browserSocket)), false, t4); + A._EventStreamSubscription$(webSocket, "message", type$.nullable_void_Function_JSObject._as(new A.BrowserWebSocket_connect_closure1(browserSocket)), false, type$.JSObject); new A._EventStream(webSocket, "close", false, t2).get$first(0).then$1$1(new A.BrowserWebSocket_connect_closure2(webSocketConnected, browserSocket), t3); $async$returnValue = t1; // goto return @@ -9549,7 +9904,7 @@ this.browserSocket = t1; }, WebSocketConnectionClosed$() { - return new A.WebSocketConnectionClosed(); + return new A.WebSocketConnectionClosed("Connection Closed"); }, WebSocketEvent: function WebSocketEvent() { }, @@ -9563,17 +9918,19 @@ this.code = t0; this.reason = t1; }, - WebSocketException: function WebSocketException() { + WebSocketException: function WebSocketException(t0) { + this.message = t0; }, - WebSocketConnectionClosed: function WebSocketConnectionClosed() { + WebSocketConnectionClosed: function WebSocketConnectionClosed(t0) { + this.message = t0; }, AdapterWebSocketChannel$(webSocket) { var _null = null, t1 = $.Zone__current, t2 = new A.StreamChannelController(type$.StreamChannelController_nullable_Object), t3 = type$.nullable_Object, - localToForeignController = A.StreamController_StreamController(_null, _null, true, t3), - foreignToLocalController = A.StreamController_StreamController(_null, _null, true, t3), + localToForeignController = A.StreamController_StreamController(_null, _null, _null, true, t3), + foreignToLocalController = A.StreamController_StreamController(_null, _null, _null, true, t3), t4 = A._instanceType(foreignToLocalController), t5 = A._instanceType(localToForeignController); t2.__StreamChannelController__local_F = A.GuaranteeChannel$(new A._ControllerStream(foreignToLocalController, t4._eval$1("_ControllerStream<1>")), new A._StreamSinkWrapper(localToForeignController, t5._eval$1("_StreamSinkWrapper<1>")), true, t3); @@ -9634,7 +9991,7 @@ }, _launchCommunicationWithDebugExtension() { var t1, t2; - type$.JSObject._as(init.G.window).addEventListener("message", A._functionToJS1(A.client___handleAuthRequest$closure())); + A._asJSObject(init.G.window).addEventListener("message", A._functionToJS1(A.client___handleAuthRequest$closure())); t1 = $.$get$serializers(); t2 = new A.DebugInfoBuilder(); type$.nullable_void_Function_DebugInfoBuilder._as(new A._launchCommunicationWithDebugExtension_closure()).call$1(t2); @@ -9642,13 +9999,12 @@ }, _dispatchEvent(message, detail) { var t1 = init.G, - t2 = type$.JSObject, - $event = t2._as(new t1.CustomEvent(message, {detail: detail})); - A._asBool(t2._as(t1.document).dispatchEvent($event)); + $event = A._asJSObject(new t1.CustomEvent(message, {detail: detail})); + A._asBool(A._asJSObject(t1.document).dispatchEvent($event)); }, _handleAuthRequest($event) { var t1, - data = type$.JSObject._as($event).data; + data = A._asJSObject($event).data; if (!(typeof data === "string")) return; if (A._asString(data) !== "dart-auth-request") @@ -9670,14 +10026,14 @@ switch ($async$goto) { case 0: // Function start - client = new A.BrowserClient(A.LinkedHashSet_LinkedHashSet$_empty(type$.JSObject)); + client = new A.BrowserClient(A._asJSObject(new init.G.AbortController())); client.withCredentials = true; $async$goto = 3; return A._asyncAwait(client._sendUnstreamed$3("GET", A.Uri_parse(authUrl), null), $async$_authenticateUser); case 3: // returning from await. response = $async$result; - $async$returnValue = B.JSString_methods.contains$1(A.encodingForCharset(A._contentTypeForHeaders(response.headers).parameters._collection$_map.$index(0, "charset")).decode$1(response.bodyBytes), "Dart Debug Authentication Success!"); + $async$returnValue = B.JSString_methods.contains$1(A.encodingForContentTypeHeader(A._contentTypeForHeaders(response.headers)).decode$1(response.bodyBytes), "Dart Debug Authentication Success!"); // goto return $async$goto = 1; break; @@ -9691,6 +10047,9 @@ _sendResponse(clientSink, builder, requestId, errorMessage, success, $T) { A._trySendEvent(clientSink, B.C_JsonCodec.encode$2$toEncodable($.$get$serializers().serialize$1(builder.call$1(new A._sendResponse_closure(requestId, success, errorMessage))), null), type$.dynamic); }, + _sendServiceExtensionResponse(clientSink, requestId, errorCode, errorMessage, result, success) { + A._trySendEvent(clientSink, B.C_JsonCodec.encode$2$toEncodable($.$get$serializers().serialize$1(A.ServiceExtensionResponse_ServiceExtensionResponse$fromResult(errorCode, errorMessage, requestId, result, success)), null), type$.dynamic); + }, handleWebSocketHotReloadRequest($event, manager, clientSink) { return A.handleWebSocketHotReloadRequest$body($event, manager, clientSink); }, @@ -9748,34 +10107,170 @@ }); return A._asyncStartSync($async$handleWebSocketHotReloadRequest, $async$completer); }, - hotReloadSourcesPath() { - var path = A._asStringQ(init.G.$hotReloadSourcesPath); - if (path == null) - throw A.wrapException(A.StateError$("Expected 'hotReloadSourcePath' to not be null in a hot reload.")); - return path; - }, - _isChromium() { - var t1 = type$.JSObject; - return B.JSString_methods.contains$1(A._asString(t1._as(t1._as(init.G.window).navigator).vendor), "Google"); - }, - _authUrl() { - var authUrl, - extensionUrl = A._asStringQ(type$.JavaScriptObject._as(init.G.window).$dartExtensionUri); - if (extensionUrl == null) - return null; - authUrl = A.Uri_parse(extensionUrl).replace$1$path("$dwdsExtensionAuthentication"); - switch (authUrl.scheme) { - case "ws": - return authUrl.replace$1$scheme("http").get$_text(); - case "wss": - return authUrl.replace$1$scheme("https").get$_text(); - default: - return authUrl.get$_text(); - } - }, - main_closure: function main_closure() { + handleWebSocketHotRestartRequest($event, manager, clientSink) { + return A.handleWebSocketHotRestartRequest$body($event, manager, clientSink); }, - main__closure: function main__closure(t0) { + handleWebSocketHotRestartRequest$body($event, manager, clientSink) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.void), + $async$returnValue, $async$handler = 2, $async$errorStack = [], runId, e, t1, rng, t2, exception, requestId, $async$exception; + var $async$handleWebSocketHotRestartRequest = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) { + $async$errorStack.push($async$result); + $async$goto = $async$handler; + } + while (true) + switch ($async$goto) { + case 0: + // Function start + requestId = $event.id; + $async$handler = 4; + t1 = null; + if (null == null) + rng = t1; + else + rng = t1; + if (rng == null) + rng = $.$get$V4State_random().generate$0(); + t1 = rng.length; + if (6 >= t1) { + $async$returnValue = A.ioore(rng, 6); + // goto return + $async$goto = 1; + break; + } + t2 = rng[6]; + rng.$flags & 2 && A.throwUnsupportedOperation(rng); + rng[6] = t2 & 15 | 64; + if (8 >= t1) { + $async$returnValue = A.ioore(rng, 8); + // goto return + $async$goto = 1; + break; + } + rng[8] = rng[8] & 63 | 128; + runId = A.UuidParsing_unparse(rng); + $async$goto = 7; + return A._asyncAwait(manager.hotRestart$1$runId(runId), $async$handleWebSocketHotRestartRequest); + case 7: + // returning from await. + A._sendResponse(clientSink, A.hot_restart_response_HotRestartResponse___new_tearOff$closure(), requestId, null, true, type$.HotRestartResponse); + $async$handler = 2; + // goto after finally + $async$goto = 6; + break; + case 4: + // catch + $async$handler = 3; + $async$exception = $async$errorStack.pop(); + e = A.unwrapException($async$exception); + t1 = J.toString$0$(e); + A._sendResponse(clientSink, A.hot_restart_response_HotRestartResponse___new_tearOff$closure(), requestId, t1, false, type$.HotRestartResponse); + // goto after finally + $async$goto = 6; + break; + case 3: + // uncaught + // goto rethrow + $async$goto = 2; + break; + case 6: + // after finally + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + case 2: + // rethrow + return A._asyncRethrow($async$errorStack.at(-1), $async$completer); + } + }); + return A._asyncStartSync($async$handleWebSocketHotRestartRequest, $async$completer); + }, + handleServiceExtensionRequest(request, clientSink, manager) { + return A.handleServiceExtensionRequest$body(request, clientSink, manager); + }, + handleServiceExtensionRequest$body(request, clientSink, manager) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.void), + $async$handler = 1, $async$errorStack = [], result, e, t1, exception, $async$exception; + var $async$handleServiceExtensionRequest = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) { + $async$errorStack.push($async$result); + $async$goto = $async$handler; + } + while (true) + switch ($async$goto) { + case 0: + // Function start + $async$handler = 3; + t1 = request.argsJson; + t1 = t1.length === 0 ? A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic) : type$.Map_String_dynamic._as(B.C_JsonCodec.decode$1(t1)); + $async$goto = 6; + return A._asyncAwait(manager.handleServiceExtension$2(request.method, t1), $async$handleServiceExtensionRequest); + case 6: + // returning from await. + result = $async$result; + t1 = request.id; + if (result != null) + A._sendServiceExtensionResponse(clientSink, t1, null, null, result, true); + else + A._sendServiceExtensionResponse(clientSink, t1, -32601, "Service extension not supported", null, false); + $async$handler = 1; + // goto after finally + $async$goto = 5; + break; + case 3: + // catch + $async$handler = 2; + $async$exception = $async$errorStack.pop(); + e = A.unwrapException($async$exception); + A._sendServiceExtensionResponse(clientSink, request.id, null, J.toString$0$(e), null, false); + // goto after finally + $async$goto = 5; + break; + case 2: + // uncaught + // goto rethrow + $async$goto = 1; + break; + case 5: + // after finally + // implicit return + return A._asyncReturn(null, $async$completer); + case 1: + // rethrow + return A._asyncRethrow($async$errorStack.at(-1), $async$completer); + } + }); + return A._asyncStartSync($async$handleServiceExtensionRequest, $async$completer); + }, + hotReloadSourcesPath() { + var path = A._asStringQ(init.G.$hotReloadSourcesPath); + if (path == null) + throw A.wrapException(A.StateError$("Expected 'hotReloadSourcePath' to not be null in a hot reload.")); + return path; + }, + _isChromium() { + return B.JSString_methods.contains$1(A._asString(A._asJSObject(A._asJSObject(init.G.window).navigator).vendor), "Google"); + }, + _authUrl() { + var authUrl, + extensionUrl = A._asStringQ(type$.JavaScriptObject._as(init.G.window).$dartExtensionUri); + if (extensionUrl == null) + return null; + authUrl = A.Uri_parse(extensionUrl).replace$1$path("$dwdsExtensionAuthentication"); + switch (authUrl.scheme) { + case "ws": + return authUrl.replace$1$scheme("http").get$_text(); + case "wss": + return authUrl.replace$1$scheme("https").get$_text(); + default: + return authUrl.get$_text(); + } + }, + main_closure: function main_closure() { + }, + main__closure: function main__closure(t0) { this.manager = t0; }, main__closure0: function main__closure0(t0) { @@ -9850,7 +10345,7 @@ case 2: // then $async$goto = 4; - return A._asyncAwait(A.promiseToFuture(type$.JSObject._as(_this.invokeExtension("ext.flutter.disassemble", "{}")), type$.String), $async$_Debugger_maybeInvokeFlutterDisassemble); + return A._asyncAwait(A.promiseToFuture(A._asJSObject(_this.invokeExtension("ext.flutter.disassemble", "{}")), type$.String), $async$_Debugger_maybeInvokeFlutterDisassemble); case 4: // returning from await. case 3: @@ -9861,6 +10356,34 @@ }); return A._asyncStartSync($async$_Debugger_maybeInvokeFlutterDisassemble, $async$completer); }, + _Debugger_maybeInvokeFlutterReassemble(_this) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.void), + t1; + var $async$_Debugger_maybeInvokeFlutterReassemble = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + switch ($async$goto) { + case 0: + // Function start + t1 = type$.JSArray_nullable_Object._as(_this.extensionNames); + $async$goto = J.contains$1$asx(type$.List_String._is(t1) ? t1 : new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,String>")), "ext.flutter.reassemble") ? 2 : 3; + break; + case 2: + // then + $async$goto = 4; + return A._asyncAwait(A.promiseToFuture(A._asJSObject(_this.invokeExtension("ext.flutter.reassemble", "{}")), type$.String), $async$_Debugger_maybeInvokeFlutterReassemble); + case 4: + // returning from await. + case 3: + // join + // implicit return + return A._asyncReturn(null, $async$completer); + } + }); + return A._asyncStartSync($async$_Debugger_maybeInvokeFlutterReassemble, $async$completer); + }, DdcLibraryBundleRestarter: function DdcLibraryBundleRestarter() { this._capturedHotReloadEndCallback = null; }, @@ -9902,7 +10425,7 @@ case 2: // then $async$goto = 4; - return A._asyncAwait(A.promiseToFuture(type$.JSObject._as(_this.invokeExtension("ext.flutter.disassemble", "{}")), type$.String), $async$SdkDeveloperExtension_maybeInvokeFlutterDisassemble); + return A._asyncAwait(A.promiseToFuture(A._asJSObject(_this.invokeExtension("ext.flutter.disassemble", "{}")), type$.String), $async$SdkDeveloperExtension_maybeInvokeFlutterDisassemble); case 4: // returning from await. case 3: @@ -9968,15 +10491,14 @@ this.stackTrace = t1; }, _findNonce() { - var t2, i, element, t3, nonceValue, - t1 = type$.JSObject, - elements = t1._as(t1._as(t1._as(init.G.window).document).querySelectorAll("script")); - for (t2 = type$.nullable_JSObject, i = 0; i < A._asInt(elements.length); ++i) { - element = t2._as(elements.item(i)); - t3 = element == null ? t1._as(element) : element; - nonceValue = A._asString(t3.nonce); - t3 = $.$get$_noncePattern(); - if (t3._nativeRegExp.test(nonceValue)) + var i, element, t1, nonceValue, + elements = A._asJSObject(A._asJSObject(A._asJSObject(init.G.window).document).querySelectorAll("script")); + for (i = 0; i < A._asInt(elements.length); ++i) { + element = A._asJSObjectQ(elements.item(i)); + t1 = element == null ? A._asJSObject(element) : element; + nonceValue = A._asString(t1.nonce); + t1 = $.$get$_noncePattern(); + if (t1._nativeRegExp.test(nonceValue)) return nonceValue; } return null; @@ -9985,7 +10507,7 @@ var t1, t2, scriptElement = $.$get$_createScript().call$0(); scriptElement.innerHTML = "window.$dartRunMain();"; - t1 = type$.nullable_JSObject._as(type$.JSObject._as(init.G.document).body); + t1 = A._asJSObjectQ(A._asJSObject(init.G.document).body); t1.toString; t2 = A.jsify(scriptElement); t2.toString; @@ -10054,18 +10576,24 @@ else return 255; }, - encodingForCharset(charset) { - var t1; - if (charset == null) - return B.C_Latin1Codec; - t1 = A.Encoding_getByName(charset); - return t1 == null ? B.C_Latin1Codec : t1; + encodingForContentTypeHeader(contentTypeHeader) { + var t1, + charset = contentTypeHeader.parameters._collection$_map.$index(0, "charset"); + if (contentTypeHeader.type === "application" && contentTypeHeader.subtype === "json" && charset == null) + return B.C_Utf8Codec; + if (charset != null) { + t1 = A.Encoding_getByName(charset); + if (t1 == null) + t1 = B.C_Latin1Codec; + } else + t1 = B.C_Latin1Codec; + return t1; }, toUint8List(input) { return input; }, toByteStream(stream) { - return stream; + return new A.ByteStream(stream); }, wrapFormatException($name, value, body, $T) { var error, error0, t1, exception; @@ -10202,6 +10730,87 @@ index = B.JSString_methods.indexOf$2(context, text, index + 1); } return null; + }, + generateId() { + var i, + chars = A.List_List$filled(6, 0, false, type$.int), + bits = B.C__JSRandom.nextInt$1(4294967296); + for (i = 0; i < 6; ++i) { + B.JSArray_methods.$indexSet(chars, i, string$.ABCDEF.charCodeAt(bits & 63)); + bits = bits >>> 6; + } + return A.String_String$fromCharCodes(chars, 0, null); + }, + UuidParsing_unparse(buffer) { + var t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, + t1 = buffer.length; + if (t1 < 16) + throw A.wrapException(A.RangeError$("buffer too small: need 16: length=" + t1)); + t1 = $.$get$UuidParsing__byteToHex(); + t2 = buffer[0]; + if (!(t2 < 256)) + return A.ioore(t1, t2); + t2 = t1[t2]; + t3 = buffer[1]; + if (!(t3 < 256)) + return A.ioore(t1, t3); + t3 = t1[t3]; + t4 = buffer[2]; + if (!(t4 < 256)) + return A.ioore(t1, t4); + t4 = t1[t4]; + t5 = buffer[3]; + if (!(t5 < 256)) + return A.ioore(t1, t5); + t5 = t1[t5]; + t6 = buffer[4]; + if (!(t6 < 256)) + return A.ioore(t1, t6); + t6 = t1[t6]; + t7 = buffer[5]; + if (!(t7 < 256)) + return A.ioore(t1, t7); + t7 = t1[t7]; + t8 = buffer[6]; + if (!(t8 < 256)) + return A.ioore(t1, t8); + t8 = t1[t8]; + t9 = buffer[7]; + if (!(t9 < 256)) + return A.ioore(t1, t9); + t9 = t1[t9]; + t10 = buffer[8]; + if (!(t10 < 256)) + return A.ioore(t1, t10); + t10 = t1[t10]; + t11 = buffer[9]; + if (!(t11 < 256)) + return A.ioore(t1, t11); + t11 = t1[t11]; + t12 = buffer[10]; + if (!(t12 < 256)) + return A.ioore(t1, t12); + t12 = t1[t12]; + t13 = buffer[11]; + if (!(t13 < 256)) + return A.ioore(t1, t13); + t13 = t1[t13]; + t14 = buffer[12]; + if (!(t14 < 256)) + return A.ioore(t1, t14); + t14 = t1[t14]; + t15 = buffer[13]; + if (!(t15 < 256)) + return A.ioore(t1, t15); + t15 = t1[t15]; + t16 = buffer[14]; + if (!(t16 < 256)) + return A.ioore(t1, t16); + t16 = t1[t16]; + t17 = buffer[15]; + if (!(t17 < 256)) + return A.ioore(t1, t17); + return t2 + t3 + t4 + t5 + "-" + t6 + t7 + "-" + t8 + t9 + "-" + t10 + t11 + "-" + t12 + t13 + t14 + t15 + t16 + t1[t17]; } }, B = {}; @@ -10806,9 +11415,6 @@ throw A.wrapException(A.argumentErrorValue(other)); return other > 31 ? 0 : receiver << other >>> 0; }, - _shlPositive$1(receiver, other) { - return other > 31 ? 0 : receiver << other >>> 0; - }, $shr(receiver, other) { var t1; if (other < 0) @@ -11127,8 +11733,8 @@ } }; A.CastMap.prototype = { - cast$2$0(_, RK, RV) { - return new A.CastMap(this.__internal$_source, this.$ti._eval$1("@<1,2>")._bind$1(RK)._bind$1(RV)._eval$1("CastMap<1,2,3,4>")); + cast$2$0(_, $RK, $RV) { + return new A.CastMap(this.__internal$_source, this.$ti._eval$1("@<1,2>")._bind$1($RK)._bind$1($RV)._eval$1("CastMap<1,2,3,4>")); }, containsKey$1(key) { return this.__internal$_source.containsKey$1(key); @@ -11156,6 +11762,10 @@ get$isEmpty(_) { var t1 = this.__internal$_source; return t1.get$isEmpty(t1); + }, + get$isNotEmpty(_) { + var t1 = this.__internal$_source; + return t1.get$isNotEmpty(t1); } }; A.CastMap_forEach_closure.prototype = { @@ -11668,13 +12278,16 @@ }; A.__CastListBase__CastIterableBase_ListMixin.prototype = {}; A.ConstantMap.prototype = { - cast$2$0(_, RK, RV) { + cast$2$0(_, $RK, $RV) { var t1 = A._instanceType(this); - return A.Map_castFrom(this, t1._precomputed1, t1._rest[1], RK, RV); + return A.Map_castFrom(this, t1._precomputed1, t1._rest[1], $RK, $RV); }, get$isEmpty(_) { return this.get$length(this) === 0; }, + get$isNotEmpty(_) { + return this.get$length(this) !== 0; + }, toString$0(_) { return A.MapBase_mapToString(this); }, @@ -11684,9 +12297,9 @@ t1._rest[1]._as(value); A.ConstantMap__throwUnmodifiable(); }, - map$2$1(_, transform, K2, V2) { - var result = A.LinkedHashMap_LinkedHashMap$_empty(K2, V2); - this.forEach$1(0, new A.ConstantMap_map_closure(this, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), result)); + map$2$1(_, transform, $K2, $V2) { + var result = A.LinkedHashMap_LinkedHashMap$_empty($K2, $V2); + this.forEach$1(0, new A.ConstantMap_map_closure(this, A._instanceType(this)._bind$1($K2)._bind$1($V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), result)); return result; }, map$1(_, transform) { @@ -11926,6 +12539,9 @@ get$isEmpty(_) { return this.__js_helper$_length === 0; }, + get$isNotEmpty(_) { + return this.__js_helper$_length !== 0; + }, get$keys() { return new A.LinkedHashMapKeysIterable(this, A._instanceType(this)._eval$1("LinkedHashMapKeysIterable<1>")); }, @@ -12050,7 +12666,7 @@ if (index < 0) return null; cell = bucket.splice(index, 1)[0]; - _this.__js_helper$_unlinkCell$1(cell); + _this._unlinkCell$1(cell); if (bucket.length === 0) delete rest[hash]; return cell.hashMapCellValue; @@ -12085,7 +12701,7 @@ cell = table[key]; if (cell == null) return null; - this.__js_helper$_unlinkCell$1(cell); + this._unlinkCell$1(cell); delete table[key]; return cell.hashMapCellValue; }, @@ -12108,7 +12724,7 @@ _this._modified$0(); return cell; }, - __js_helper$_unlinkCell$1(cell) { + _unlinkCell$1(cell) { var _this = this, previous = cell._previous, next = cell._next; @@ -12283,19 +12899,19 @@ call$1(o) { return this.getTag(o); }, - $signature: 4 + $signature: 6 }; A.initHooks_closure0.prototype = { call$2(o, tag) { return this.getUnknownTag(o, tag); }, - $signature: 83 + $signature: 93 }; A.initHooks_closure1.prototype = { call$1(tag) { return this.prototypeForTag(A._asString(tag)); }, - $signature: 90 + $signature: 86 }; A._Record.prototype = {}; A.JSSyntaxRegExp.prototype = { @@ -12337,7 +12953,7 @@ var match, regexp = this.get$_nativeGlobalVersion(); if (regexp == null) - regexp = type$.Object._as(regexp); + regexp = A._asObject(regexp); regexp.lastIndex = start; match = regexp.exec(string); if (match == null) @@ -12348,7 +12964,7 @@ var match, regexp = this.get$_nativeAnchoredVersion(); if (regexp == null) - regexp = type$.Object._as(regexp); + regexp = A._asObject(regexp); regexp.lastIndex = start; match = regexp.exec(string); if (match == null) @@ -12514,11 +13130,21 @@ get$runtimeType(receiver) { return B.Type_ByteBuffer_rqD; }, + asUint8List$2(receiver, offsetInBytes, $length) { + return $length == null ? new Uint8Array(receiver, offsetInBytes) : new Uint8Array(receiver, offsetInBytes, $length); + }, $isTrustedGetRuntimeType: 1, $isNativeByteBuffer: 1, $isByteBuffer: 1 }; + A.NativeArrayBuffer.prototype = {$isNativeArrayBuffer: 1}; A.NativeTypedData.prototype = { + get$buffer(receiver) { + if (((receiver.$flags | 0) & 2) !== 0) + return new A._UnmodifiableNativeByteBufferView(receiver.buffer); + else + return receiver.buffer; + }, _invalidPosition$3(receiver, position, $length, $name) { var t1 = A.RangeError$range(position, 0, $length, $name, null); throw A.wrapException(t1); @@ -12528,6 +13154,14 @@ this._invalidPosition$3(receiver, position, $length, $name); } }; + A._UnmodifiableNativeByteBufferView.prototype = { + asUint8List$2(_, offsetInBytes, $length) { + var result = A.NativeUint8List_NativeUint8List$view(this._data, offsetInBytes, $length); + result.$flags = 3; + return result; + }, + $isByteBuffer: 1 + }; A.NativeByteData.prototype = { get$runtimeType(receiver) { return B.Type_ByteData_9dB; @@ -12781,7 +13415,7 @@ t1.storedCallback = null; f.call$0(); }, - $signature: 6 + $signature: 4 }; A._AsyncRun__initializeScheduleImmediate_closure.prototype = { call$1(callback) { @@ -12791,7 +13425,7 @@ t2 = this.span; t1.firstChild ? t1.removeChild(t2) : t1.appendChild(t2); }, - $signature: 63 + $signature: 69 }; A._AsyncRun__scheduleImmediateJsOverride_internalCallback.prototype = { call$0() { @@ -12897,30 +13531,115 @@ call$2(error, stackTrace) { this.bodyFunction.call$2(1, new A.ExceptionAndStackTrace(error, type$.StackTrace._as(stackTrace))); }, - $signature: 53 + $signature: 66 }; A._wrapJsFunctionForAsync_closure.prototype = { call$2(errorCode, result) { this.$protected(A._asInt(errorCode), result); }, - $signature: 37 + $signature: 64 }; - A.AsyncError.prototype = { - toString$0(_) { - return A.S(this.error); + A._asyncStarHelper_closure.prototype = { + call$0() { + var t3, + t1 = this.controller, + t2 = t1.___AsyncStarStreamController_controller_A; + t2 === $ && A.throwLateFieldNI("controller"); + t3 = t2._state; + if ((t3 & 1) !== 0 ? (t2.get$_subscription()._state & 4) !== 0 : (t3 & 2) === 0) { + t1.isSuspended = true; + return; + } + t1 = t1.cancelationFuture != null ? 2 : 0; + this.bodyFunction.call$2(t1, null); }, - $isError: 1, - get$stackTrace() { - return this.stackTrace; + $signature: 0 + }; + A._asyncStarHelper_closure0.prototype = { + call$1(__wc0_formal) { + var errorCode = this.controller.cancelationFuture != null ? 2 : 0; + this.bodyFunction.call$2(errorCode, null); + }, + $signature: 4 + }; + A._AsyncStarStreamController.prototype = { + _AsyncStarStreamController$1(body, $T) { + var _this = this, + t1 = new A._AsyncStarStreamController__resumeBody(body); + _this.___AsyncStarStreamController_controller_A = _this.$ti._eval$1("StreamController<1>")._as(A.StreamController_StreamController(new A._AsyncStarStreamController_closure(_this, body), new A._AsyncStarStreamController_closure0(t1), new A._AsyncStarStreamController_closure1(_this, t1), false, $T)); } }; - A.Future_Future$microtask_closure.prototype = { + A._AsyncStarStreamController__resumeBody.prototype = { call$0() { - var e, s, exception, t1, t2, t3, computationResult = null; - try { - computationResult = this.computation.call$0(); - } catch (exception) { - e = A.unwrapException(exception); + A.scheduleMicrotask(new A._AsyncStarStreamController__resumeBody_closure(this.body)); + }, + $signature: 1 + }; + A._AsyncStarStreamController__resumeBody_closure.prototype = { + call$0() { + this.body.call$2(0, null); + }, + $signature: 0 + }; + A._AsyncStarStreamController_closure0.prototype = { + call$0() { + this._resumeBody.call$0(); + }, + $signature: 0 + }; + A._AsyncStarStreamController_closure1.prototype = { + call$0() { + var t1 = this.$this; + if (t1.isSuspended) { + t1.isSuspended = false; + this._resumeBody.call$0(); + } + }, + $signature: 0 + }; + A._AsyncStarStreamController_closure.prototype = { + call$0() { + var t1 = this.$this, + t2 = t1.___AsyncStarStreamController_controller_A; + t2 === $ && A.throwLateFieldNI("controller"); + if ((t2._state & 4) === 0) { + t1.cancelationFuture = new A._Future($.Zone__current, type$._Future_dynamic); + if (t1.isSuspended) { + t1.isSuspended = false; + A.scheduleMicrotask(new A._AsyncStarStreamController__closure(this.body)); + } + return t1.cancelationFuture; + } + }, + $signature: 59 + }; + A._AsyncStarStreamController__closure.prototype = { + call$0() { + this.body.call$2(2, null); + }, + $signature: 0 + }; + A._IterationMarker.prototype = { + toString$0(_) { + return "IterationMarker(" + this.state + ", " + A.S(this.value) + ")"; + } + }; + A.AsyncError.prototype = { + toString$0(_) { + return A.S(this.error); + }, + $isError: 1, + get$stackTrace() { + return this.stackTrace; + } + }; + A.Future_Future$microtask_closure.prototype = { + call$0() { + var e, s, exception, t1, t2, t3, computationResult = null; + try { + computationResult = this.computation.call$0(); + } catch (exception) { + e = A.unwrapException(exception); s = A.getTraceFromException(exception); t1 = e; t2 = s; @@ -12939,7 +13658,7 @@ A.TimeoutException.prototype = {}; A._Completer.prototype = { completeError$2(error, stackTrace) { - type$.Object._as(error); + A._asObject(error); type$.nullable_StackTrace._as(stackTrace); if ((this.future._state & 30) !== 0) throw A.wrapException(A.StateError$("Future already completed")); @@ -13042,15 +13761,24 @@ this._addListener$1(new A._FutureListener(result, 19, f, onError, t1._eval$1("@<1>")._bind$1($E)._eval$1("_FutureListener<1,2>"))); return result; }, - catchError$1(onError) { - var t1 = this.$ti, - t2 = $.Zone__current, - result = new A._Future(t2, t1); - if (t2 !== B.C__RootZone) + catchError$2$test(onError, test) { + var t1, t2, result; + type$.nullable_bool_Function_Object._as(test); + t1 = this.$ti; + t2 = $.Zone__current; + result = new A._Future(t2, t1); + if (t2 !== B.C__RootZone) { onError = A._registerErrorHandler(onError, t2); - this._addListener$1(new A._FutureListener(result, 2, null, onError, t1._eval$1("_FutureListener<1,1>"))); + if (test != null) + test = t2.registerUnaryCallback$2$1(test, type$.bool, type$.Object); + } + t2 = test == null ? 2 : 6; + this._addListener$1(new A._FutureListener(result, t2, test, onError, t1._eval$1("_FutureListener<1,1>"))); return result; }, + catchError$1(onError) { + return this.catchError$2$test(onError, null); + }, whenComplete$1(action) { var t1, t2, result; type$.dynamic_Function._as(action); @@ -13171,7 +13899,7 @@ A._Future__propagateToListeners(this, listeners); }, _completeError$2(error, stackTrace) { - type$.Object._as(error); + A._asObject(error); type$.StackTrace._as(stackTrace); this._completeErrorObject$1(new A.AsyncError(error, stackTrace)); }, @@ -13293,11 +14021,11 @@ call$1(__wc0_formal) { this.joinedResult._completeWithResultOf$1(this.originalSource); }, - $signature: 6 + $signature: 4 }; A._Future__propagateToListeners_handleWhenCompleteCallback_closure0.prototype = { call$2(e, s) { - type$.Object._as(e); + A._asObject(e); type$.StackTrace._as(s); this.joinedResult._completeErrorObject$1(new A.AsyncError(e, s)); }, @@ -13393,7 +14121,7 @@ A._Future_timeout_closure1.prototype = { call$2(e, s) { var t1; - type$.Object._as(e); + A._asObject(e); type$.StackTrace._as(s); t1 = this._box_0; if (t1.timer.get$isActive()) { @@ -13475,10 +14203,10 @@ if ((_this._state & 8) === 0) return A._instanceType(_this)._eval$1("_PendingEvents<1>?")._as(_this._varData); t1 = A._instanceType(_this); - return t1._eval$1("_PendingEvents<1>?")._as(t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$_varData()); + return t1._eval$1("_PendingEvents<1>?")._as(t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData)._varData); }, _ensurePendingEvents$0() { - var events, t1, _this = this; + var events, t1, state, _this = this; if ((_this._state & 8) === 0) { events = _this._varData; if (events == null) @@ -13486,13 +14214,16 @@ return A._instanceType(_this)._eval$1("_PendingEvents<1>")._as(events); } t1 = A._instanceType(_this); - events = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData).get$_varData(); + state = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData); + events = state._varData; + if (events == null) + events = state._varData = new A._PendingEvents(t1._eval$1("_PendingEvents<1>")); return t1._eval$1("_PendingEvents<1>")._as(events); }, get$_subscription() { var varData = this._varData; if ((this._state & 8) !== 0) - varData = type$._StreamControllerAddStreamState_nullable_Object._as(varData).get$_varData(); + varData = type$._StreamControllerAddStreamState_nullable_Object._as(varData)._varData; return A._instanceType(this)._eval$1("_ControllerSubscription<1>")._as(varData); }, _badEventState$0() { @@ -13500,6 +14231,31 @@ return new A.StateError("Cannot add event after closing"); return new A.StateError("Cannot add event while adding a stream"); }, + addStream$2$cancelOnError(source, cancelOnError) { + var t2, t3, t4, t5, t6, _this = this, + t1 = A._instanceType(_this); + t1._eval$1("Stream<1>")._as(source); + t2 = _this._state; + if (t2 >= 4) + throw A.wrapException(_this._badEventState$0()); + if ((t2 & 2) !== 0) { + t1 = new A._Future($.Zone__current, type$._Future_dynamic); + t1._asyncComplete$1(null); + return t1; + } + t2 = _this._varData; + t3 = cancelOnError === true; + t4 = new A._Future($.Zone__current, type$._Future_dynamic); + t5 = t1._eval$1("~(1)")._as(_this.get$_add()); + t6 = t3 ? A._AddStreamState_makeErrorHandler(_this) : _this.get$_addError(); + t6 = source.listen$4$cancelOnError$onDone$onError(t5, t3, _this.get$_close(), t6); + t3 = _this._state; + if ((t3 & 1) !== 0 ? (_this.get$_subscription()._state & 4) !== 0 : (t3 & 2) === 0) + t6.pause$0(); + _this._varData = new A._StreamControllerAddStreamState(t2, t4, t6, t1._eval$1("_StreamControllerAddStreamState<1>")); + _this._state |= 8; + return t4; + }, _ensureDoneFuture$0() { var t1 = this._doneFuture; if (t1 == null) @@ -13514,19 +14270,13 @@ _this._add$1(value); }, addError$2(error, stackTrace) { - var _0_0, t1, _this = this; - type$.Object._as(error); + var _0_0; + A._asObject(error); type$.nullable_StackTrace._as(stackTrace); - if (_this._state >= 4) - throw A.wrapException(_this._badEventState$0()); + if (this._state >= 4) + throw A.wrapException(this._badEventState$0()); _0_0 = A._interceptUserError(error, stackTrace); - error = _0_0.error; - stackTrace = _0_0.stackTrace; - t1 = _this._state; - if ((t1 & 1) !== 0) - _this._sendError$2(error, stackTrace); - else if ((t1 & 3) === 0) - _this._ensurePendingEvents$0().add$1(0, new A._DelayedError(error, stackTrace)); + this._addError$2(_0_0.error, _0_0.stackTrace); }, addError$1(error) { return this.addError$2(error, null); @@ -13558,6 +14308,23 @@ else if ((t2 & 3) === 0) _this._ensurePendingEvents$0().add$1(0, new A._DelayedData(value, t1._eval$1("_DelayedData<1>"))); }, + _addError$2(error, stackTrace) { + var t1; + A._asObject(error); + type$.StackTrace._as(stackTrace); + t1 = this._state; + if ((t1 & 1) !== 0) + this._sendError$2(error, stackTrace); + else if ((t1 & 3) === 0) + this._ensurePendingEvents$0().add$1(0, new A._DelayedError(error, stackTrace)); + }, + _close$0() { + var _this = this, + addState = A._instanceType(_this)._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData); + _this._varData = addState._varData; + _this._state &= 4294967287; + addState.addStreamFuture._asyncComplete$1(null); + }, _subscribe$4(onData, onError, onDone, cancelOnError) { var t2, t3, t4, t5, t6, t7, subscription, pendingEvents, addState, _this = this, t1 = A._instanceType(_this); @@ -13575,8 +14342,8 @@ pendingEvents = _this.get$_pendingEvents(); if (((_this._state |= 1) & 8) !== 0) { addState = t1._eval$1("_StreamControllerAddStreamState<1>")._as(_this._varData); - addState.set$_varData(subscription); - addState.resume$0(); + addState._varData = subscription; + addState.addSubscription.resume$0(); } else _this._varData = subscription; subscription._setPendingEvents$1(pendingEvents); @@ -13603,7 +14370,7 @@ e = A.unwrapException(exception); s = A.getTraceFromException(exception); result0 = new A._Future($.Zone__current, type$._Future_void); - t1 = type$.Object._as(e); + t1 = A._asObject(e); t2 = type$.StackTrace._as(s); result0._asyncCompleteErrorObject$1(new A.AsyncError(t1, t2)); result = result0; @@ -13685,7 +14452,7 @@ t2 = A._instanceType(t1); t2._eval$1("StreamSubscription<1>")._as(this); if ((t1._state & 8) !== 0) - t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).pause$0(); + t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).addSubscription.pause$0(); A._runGuarded(t1.onPause); }, _onResume$0() { @@ -13693,7 +14460,7 @@ t2 = A._instanceType(t1); t2._eval$1("StreamSubscription<1>")._as(this); if ((t1._state & 8) !== 0) - t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).resume$0(); + t2._eval$1("_StreamControllerAddStreamState<1>")._as(t1._varData).addSubscription.resume$0(); A._runGuarded(t1.onResume); } }; @@ -13703,6 +14470,27 @@ }, $isStreamSink: 1 }; + A._AddStreamState.prototype = { + cancel$0() { + var cancel = this.addSubscription.cancel$0(); + return cancel.whenComplete$1(new A._AddStreamState_cancel_closure(this)); + } + }; + A._AddStreamState_makeErrorHandler_closure.prototype = { + call$2(e, s) { + var t1 = this.controller; + t1._addError$2(A._asObject(e), type$.StackTrace._as(s)); + t1._close$0(); + }, + $signature: 5 + }; + A._AddStreamState_cancel_closure.prototype = { + call$0() { + this.$this.addStreamFuture._asyncComplete$1(null); + }, + $signature: 1 + }; + A._StreamControllerAddStreamState.prototype = {}; A._BufferingStreamSubscription.prototype = { _setPendingEvents$1(pendingEvents) { var _this = this; @@ -13940,7 +14728,7 @@ A._BufferingStreamSubscription_asFuture_closure0.prototype = { call$2(error, stackTrace) { var cancelFuture, t1; - type$.Object._as(error); + A._asObject(error); type$.StackTrace._as(stackTrace); cancelFuture = this.$this.cancel$0(); t1 = this.result; @@ -14208,7 +14996,7 @@ _handleError$2(error, stackTrace) { var t1; type$.StackTrace._as(stackTrace); - t1 = error == null ? type$.Object._as(error) : error; + t1 = error == null ? A._asObject(error) : error; this._stream.$ti._eval$1("_EventSink<2>")._as(this)._addError$2(t1, stackTrace); }, _handleDone$0() { @@ -14292,7 +15080,7 @@ } catch (exception) { e = A.unwrapException(exception); s = A.getTraceFromException(exception); - this._processUncaughtError$3(this, type$.Object._as(e), type$.StackTrace._as(s)); + this._processUncaughtError$3(this, A._asObject(e), type$.StackTrace._as(s)); } }, runUnaryGuarded$1$2(f, arg, $T) { @@ -14304,20 +15092,20 @@ } catch (exception) { e = A.unwrapException(exception); s = A.getTraceFromException(exception); - this._processUncaughtError$3(this, type$.Object._as(e), type$.StackTrace._as(s)); + this._processUncaughtError$3(this, A._asObject(e), type$.StackTrace._as(s)); } }, - runBinaryGuarded$2$3(f, arg1, arg2, T1, T2) { + runBinaryGuarded$2$3(f, arg1, arg2, $T1, $T2) { var e, s, exception; - T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f); - T1._as(arg1); - T2._as(arg2); + $T1._eval$1("@<0>")._bind$1($T2)._eval$1("~(1,2)")._as(f); + $T1._as(arg1); + $T2._as(arg2); try { - this.runBinary$3$3(f, arg1, arg2, type$.void, T1, T2); + this.runBinary$3$3(f, arg1, arg2, type$.void, $T1, $T2); } catch (exception) { e = A.unwrapException(exception); s = A.getTraceFromException(exception); - this._processUncaughtError$3(this, type$.Object._as(e), type$.StackTrace._as(s)); + this._processUncaughtError$3(this, A._asObject(e), type$.StackTrace._as(s)); } }, bindCallback$1$1(f, $R) { @@ -14355,14 +15143,14 @@ t1 = implementation.zone; return implementation.$function.call$2$5(t1, t1.get$_parentDelegate(), this, f, arg, $R, $T); }, - runBinary$3$3(f, arg1, arg2, $R, T1, T2) { + runBinary$3$3(f, arg1, arg2, $R, $T1, $T2) { var implementation, t1; - $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f); - T1._as(arg1); - T2._as(arg2); + $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f); + $T1._as(arg1); + $T2._as(arg2); implementation = this._runBinary; t1 = implementation.zone; - return implementation.$function.call$3$6(t1, t1.get$_parentDelegate(), this, f, arg1, arg2, $R, T1, T2); + return implementation.$function.call$3$6(t1, t1.get$_parentDelegate(), this, f, arg1, arg2, $R, $T1, $T2); }, registerCallback$1$1(callback, $R) { var implementation, t1; @@ -14378,12 +15166,12 @@ t1 = implementation.zone; return implementation.$function.call$2$4(t1, t1.get$_parentDelegate(), this, callback, $R, $T); }, - registerBinaryCallback$3$1(callback, $R, T1, T2) { + registerBinaryCallback$3$1(callback, $R, $T1, $T2) { var implementation, t1; - $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(callback); + $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(callback); implementation = this._registerBinaryCallback; t1 = implementation.zone; - return implementation.$function.call$3$4(t1, t1.get$_parentDelegate(), this, callback, $R, T1, T2); + return implementation.$function.call$3$4(t1, t1.get$_parentDelegate(), this, callback, $R, $T1, $T2); }, errorCallback$2(error, stackTrace) { var implementation = this._errorCallback, @@ -14565,7 +15353,7 @@ } catch (exception) { e = A.unwrapException(exception); s = A.getTraceFromException(exception); - A._rootHandleError(type$.Object._as(e), type$.StackTrace._as(s)); + A._rootHandleError(A._asObject(e), type$.StackTrace._as(s)); } }, runUnaryGuarded$1$2(f, arg, $T) { @@ -14581,24 +15369,24 @@ } catch (exception) { e = A.unwrapException(exception); s = A.getTraceFromException(exception); - A._rootHandleError(type$.Object._as(e), type$.StackTrace._as(s)); + A._rootHandleError(A._asObject(e), type$.StackTrace._as(s)); } }, - runBinaryGuarded$2$3(f, arg1, arg2, T1, T2) { + runBinaryGuarded$2$3(f, arg1, arg2, $T1, $T2) { var e, s, exception; - T1._eval$1("@<0>")._bind$1(T2)._eval$1("~(1,2)")._as(f); - T1._as(arg1); - T2._as(arg2); + $T1._eval$1("@<0>")._bind$1($T2)._eval$1("~(1,2)")._as(f); + $T1._as(arg1); + $T2._as(arg2); try { if (B.C__RootZone === $.Zone__current) { f.call$2(arg1, arg2); return; } - A._rootRunBinary(null, null, this, f, arg1, arg2, type$.void, T1, T2); + A._rootRunBinary(null, null, this, f, arg1, arg2, type$.void, $T1, $T2); } catch (exception) { e = A.unwrapException(exception); s = A.getTraceFromException(exception); - A._rootHandleError(type$.Object._as(e), type$.StackTrace._as(s)); + A._rootHandleError(A._asObject(e), type$.StackTrace._as(s)); } }, bindCallback$1$1(f, $R) { @@ -14632,13 +15420,13 @@ return f.call$1(arg); return A._rootRunUnary(null, null, this, f, arg, $R, $T); }, - runBinary$3$3(f, arg1, arg2, $R, T1, T2) { - $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f); - T1._as(arg1); - T2._as(arg2); + runBinary$3$3(f, arg1, arg2, $R, $T1, $T2) { + $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f); + $T1._as(arg1); + $T2._as(arg2); if ($.Zone__current === B.C__RootZone) return f.call$2(arg1, arg2); - return A._rootRunBinary(null, null, this, f, arg1, arg2, $R, T1, T2); + return A._rootRunBinary(null, null, this, f, arg1, arg2, $R, $T1, $T2); }, registerCallback$1$1(f, $R) { return $R._eval$1("0()")._as(f); @@ -14646,8 +15434,8 @@ registerUnaryCallback$2$1(f, $R, $T) { return $R._eval$1("@<0>")._bind$1($T)._eval$1("1(2)")._as(f); }, - registerBinaryCallback$3$1(f, $R, T1, T2) { - return $R._eval$1("@<0>")._bind$1(T1)._bind$1(T2)._eval$1("1(2,3)")._as(f); + registerBinaryCallback$3$1(f, $R, $T1, $T2) { + return $R._eval$1("@<0>")._bind$1($T1)._bind$1($T2)._eval$1("1(2,3)")._as(f); }, errorCallback$2(error, stackTrace) { return null; @@ -14709,10 +15497,10 @@ if (e === error) t2._processUncaughtError$3(zone, error, stackTrace); else - t2._processUncaughtError$3(zone, type$.Object._as(e), t1._as(s)); + t2._processUncaughtError$3(zone, A._asObject(e), t1._as(s)); } }, - $signature: 66 + $signature: 55 }; A._HashMap.prototype = { get$length(_) { @@ -14721,6 +15509,9 @@ get$isEmpty(_) { return this._collection$_length === 0; }, + get$isNotEmpty(_) { + return this._collection$_length !== 0; + }, get$keys() { return new A._HashMapKeyIterable(this, A._instanceType(this)._eval$1("_HashMapKeyIterable<1>")); }, @@ -15271,26 +16062,6 @@ } return true; }, - remove$1(_, object) { - var t1 = this._remove$1(object); - return t1; - }, - _remove$1(object) { - var hash, bucket, index, cell, _this = this, - rest = _this._collection$_rest; - if (rest == null) - return false; - hash = _this._computeHashCode$1(object); - bucket = rest[hash]; - index = _this._findBucketIndex$2(bucket, object); - if (index < 0) - return false; - cell = bucket.splice(index, 1)[0]; - if (0 === bucket.length) - delete rest[hash]; - _this._unlinkCell$1(cell); - return true; - }, _collection$_addHashTableEntry$2(table, element) { A._instanceType(this)._precomputed1._as(element); if (type$.nullable__LinkedHashSetCell._as(table[element]) != null) @@ -15298,39 +16069,17 @@ table[element] = this._collection$_newLinkedCell$1(element); return true; }, - _collection$_modified$0() { - this._collection$_modifications = this._collection$_modifications + 1 & 1073741823; - }, _collection$_newLinkedCell$1(element) { - var t1, _this = this, + var _this = this, cell = new A._LinkedHashSetCell(A._instanceType(_this)._precomputed1._as(element)); if (_this._collection$_first == null) _this._collection$_first = _this._collection$_last = cell; - else { - t1 = _this._collection$_last; - t1.toString; - cell._collection$_previous = t1; - _this._collection$_last = t1._collection$_next = cell; - } + else + _this._collection$_last = _this._collection$_last._collection$_next = cell; ++_this._collection$_length; - _this._collection$_modified$0(); + _this._collection$_modifications = _this._collection$_modifications + 1 & 1073741823; return cell; }, - _unlinkCell$1(cell) { - var _this = this, - previous = cell._collection$_previous, - next = cell._collection$_next; - if (previous == null) - _this._collection$_first = next; - else - previous._collection$_next = next; - if (next == null) - _this._collection$_last = previous; - else - next._collection$_previous = previous; - --_this._collection$_length; - _this._collection$_modified$0(); - }, _computeHashCode$1(element) { return J.get$hashCode$(element) & 1073741823; }, @@ -15383,7 +16132,7 @@ call$2(k, v) { this.result.$indexSet(0, this.K._as(k), this.V._as(v)); }, - $signature: 23 + $signature: 24 }; A.ListBase.prototype = { get$iterator(receiver) { @@ -15515,9 +16264,9 @@ $isList: 1 }; A.MapBase.prototype = { - cast$2$0(_, RK, RV) { + cast$2$0(_, $RK, $RV) { var t1 = A._instanceType(this); - return A.Map_castFrom(this, t1._eval$1("MapBase.K"), t1._eval$1("MapBase.V"), RK, RV); + return A.Map_castFrom(this, t1._eval$1("MapBase.K"), t1._eval$1("MapBase.V"), $RK, $RV); }, forEach$1(_, action) { var t2, key, t3, @@ -15529,11 +16278,11 @@ action.call$2(key, t3 == null ? t1._as(t3) : t3); } }, - map$2$1(_, transform, K2, V2) { + map$2$1(_, transform, $K2, $V2) { var result, t2, key, t3, entry, t1 = A._instanceType(this); - t1._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(MapBase.K,MapBase.V)")._as(transform); - result = A.LinkedHashMap_LinkedHashMap$_empty(K2, V2); + t1._bind$1($K2)._bind$1($V2)._eval$1("MapEntry<1,2>(MapBase.K,MapBase.V)")._as(transform); + result = A.LinkedHashMap_LinkedHashMap$_empty($K2, $V2); for (t2 = this.get$keys(), t2 = t2.get$iterator(t2), t1 = t1._eval$1("MapBase.V"); t2.moveNext$0();) { key = t2.get$current(); t3 = this.$index(0, key); @@ -15557,6 +16306,10 @@ var t1 = this.get$keys(); return t1.get$isEmpty(t1); }, + get$isNotEmpty(_) { + var t1 = this.get$keys(); + return t1.get$isNotEmpty(t1); + }, toString$0(_) { return A.MapBase_mapToString(this); }, @@ -15575,7 +16328,7 @@ t2 = A.S(v); t1._contents += t2; }, - $signature: 24 + $signature: 25 }; A._UnmodifiableMapMixin.prototype = { $indexSet(_, key, value) { @@ -15586,8 +16339,8 @@ } }; A.MapView.prototype = { - cast$2$0(_, RK, RV) { - return this._collection$_map.cast$2$0(0, RK, RV); + cast$2$0(_, $RK, $RV) { + return this._collection$_map.cast$2$0(0, $RK, $RV); }, $index(_, key) { return this._collection$_map.$index(0, key); @@ -15606,6 +16359,10 @@ var t1 = this._collection$_map; return t1.get$isEmpty(t1); }, + get$isNotEmpty(_) { + var t1 = this._collection$_map; + return t1.get$isNotEmpty(t1); + }, get$length(_) { var t1 = this._collection$_map; return t1.get$length(t1); @@ -15616,8 +16373,8 @@ toString$0(_) { return this._collection$_map.toString$0(0); }, - map$2$1(_, transform, K2, V2) { - return this._collection$_map.map$2$1(0, A._instanceType(this)._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), K2, V2); + map$2$1(_, transform, $K2, $V2) { + return this._collection$_map.map$2$1(0, A._instanceType(this)._bind$1($K2)._bind$1($V2)._eval$1("MapEntry<1,2>(3,4)")._as(transform), $K2, $V2); }, map$1(_, transform) { var t1 = type$.dynamic; @@ -15626,8 +16383,8 @@ $isMap: 1 }; A.UnmodifiableMapView.prototype = { - cast$2$0(_, RK, RV) { - return new A.UnmodifiableMapView(this._collection$_map.cast$2$0(0, RK, RV), RK._eval$1("@<0>")._bind$1(RV)._eval$1("UnmodifiableMapView<1,2>")); + cast$2$0(_, $RK, $RV) { + return new A.UnmodifiableMapView(this._collection$_map.cast$2$0(0, $RK, $RV), $RK._eval$1("@<0>")._bind$1($RV)._eval$1("UnmodifiableMapView<1,2>")); } }; A.ListQueue.prototype = { @@ -16094,7 +16851,7 @@ var result, t1 = this._processed; if (t1 == null) - return this._data.$index(0, key); + return this._convert$_data.$index(0, key); else if (typeof key != "string") return null; else { @@ -16103,14 +16860,17 @@ } }, get$length(_) { - return this._processed == null ? this._data.__js_helper$_length : this._convert$_computeKeys$0().length; + return this._processed == null ? this._convert$_data.__js_helper$_length : this._convert$_computeKeys$0().length; }, get$isEmpty(_) { return this.get$length(0) === 0; }, + get$isNotEmpty(_) { + return this.get$length(0) > 0; + }, get$keys() { if (this._processed == null) { - var t1 = this._data; + var t1 = this._convert$_data; return new A.LinkedHashMapKeysIterable(t1, A._instanceType(t1)._eval$1("LinkedHashMapKeysIterable<1>")); } return new A._JsonMapKeyIterable(this); @@ -16119,7 +16879,7 @@ var processed, original, _this = this; A._asString(key); if (_this._processed == null) - _this._data.$indexSet(0, key, value); + _this._convert$_data.$indexSet(0, key, value); else if (_this.containsKey$1(key)) { processed = _this._processed; processed[key] = value; @@ -16131,7 +16891,7 @@ }, containsKey$1(key) { if (this._processed == null) - return this._data.containsKey$1(key); + return this._convert$_data.containsKey$1(key); if (typeof key != "string") return false; return Object.prototype.hasOwnProperty.call(this._original, key); @@ -16140,7 +16900,7 @@ var keys, i, key, value, _this = this; type$.void_Function_String_dynamic._as(f); if (_this._processed == null) - return _this._data.forEach$1(0, f); + return _this._convert$_data.forEach$1(0, f); keys = _this._convert$_computeKeys$0(); for (i = 0; i < keys.length; ++i) { key = keys[i]; @@ -16150,20 +16910,20 @@ _this._processed[key] = value; } f.call$2(key, value); - if (keys !== _this._data) + if (keys !== _this._convert$_data) throw A.wrapException(A.ConcurrentModificationError$(_this)); } }, _convert$_computeKeys$0() { - var keys = type$.nullable_List_dynamic._as(this._data); + var keys = type$.nullable_List_dynamic._as(this._convert$_data); if (keys == null) - keys = this._data = A._setArrayType(Object.keys(this._original), type$.JSArray_String); + keys = this._convert$_data = A._setArrayType(Object.keys(this._original), type$.JSArray_String); return keys; }, _upgrade$0() { var result, keys, i, t1, key, _this = this; if (_this._processed == null) - return _this._data; + return _this._convert$_data; result = A.LinkedHashMap_LinkedHashMap$_empty(type$.String, type$.dynamic); keys = _this._convert$_computeKeys$0(); for (i = 0; t1 = keys.length, i < t1; ++i) { @@ -16175,7 +16935,7 @@ else B.JSArray_methods.clear$0(keys); _this._original = _this._processed = null; - return _this._data = result; + return _this._convert$_data = result; }, _process$1(key) { var result; @@ -16226,7 +16986,7 @@ } return null; }, - $signature: 25 + $signature: 26 }; A._Utf8Decoder__decoderNonfatal_closure.prototype = { call$0() { @@ -16238,7 +16998,7 @@ } return null; }, - $signature: 25 + $signature: 26 }; A.AsciiCodec.prototype = { encode$1(source) { @@ -16529,6 +17289,9 @@ var t1 = A._JsonStringStringifier_stringify(value, this.get$encoder()._toEncodable, null); return t1; }, + encode$1(value) { + return this.encode$2$toEncodable(value, null); + }, get$encoder() { return B.JsonEncoder_null; }, @@ -16741,7 +17504,7 @@ B.JSArray_methods.$indexSet(t1, t2.i++, key); B.JSArray_methods.$indexSet(t1, t2.i++, value); }, - $signature: 24 + $signature: 25 }; A._JsonStringStringifier.prototype = { get$_partialResult() { @@ -17020,7 +17783,7 @@ break; default: t3 = A.Primitives_stringFromCharCode(_65533); - buffer._contents = (buffer._contents += t3) + A.Primitives_stringFromCharCode(_65533); + buffer._contents = (buffer._contents += t3) + t3; break; } else { @@ -17423,7 +18186,7 @@ hash = hash + ((hash & 524287) << 10) & 536870911; return hash ^ hash >>> 6; }, - $signature: 26 + $signature: 27 }; A._BigIntImpl_hashCode_finish.prototype = { call$1(hash) { @@ -17431,7 +18194,7 @@ hash ^= hash >>> 11; return hash + ((hash & 16383) << 15) & 536870911; }, - $signature: 27 + $signature: 53 }; A.DateTime.prototype = { $eq(_, other) { @@ -17849,13 +18612,13 @@ call$2(msg, position) { throw A.wrapException(A.FormatException$("Illegal IPv4 address, " + msg, this.host, position)); }, - $signature: 61 + $signature: 44 }; A.Uri_parseIPv6Address_error.prototype = { call$2(msg, position) { throw A.wrapException(A.FormatException$("Illegal IPv6 address, " + msg, this.host, position)); }, - $signature: 56 + $signature: 40 }; A.Uri_parseIPv6Address_parseHex.prototype = { call$2(start, end) { @@ -17867,7 +18630,7 @@ this.error.call$2("each part must be in the range of `0x0..0xFFFF`", start); return value; }, - $signature: 26 + $signature: 27 }; A._Uri.prototype = { get$_text() { @@ -17897,7 +18660,6 @@ t2 = _this._fragment; if (t2 != null) t1 = t1 + "#" + t2; - value !== $ && A.throwLateFieldADI("_text"); value = _this.___Uri__text_FI = t1.charCodeAt(0) == 0 ? t1 : t1; } return value; @@ -18168,7 +18930,7 @@ call$1(s) { return A._Uri__uriEncode(64, A._asString(s), B.C_Utf8Codec, false); }, - $signature: 13 + $signature: 16 }; A.UriData.prototype = { get$uri() { @@ -18494,7 +19256,7 @@ var t1 = type$.JavaScriptFunction; this._this.then$1$2$onError(new A.FutureOfJSAnyToJSPromise_get_toJS__closure(t1._as(resolve)), new A.FutureOfJSAnyToJSPromise_get_toJS__closure0(t1._as(reject)), type$.nullable_Object); }, - $signature: 29 + $signature: 30 }; A.FutureOfJSAnyToJSPromise_get_toJS__closure.prototype = { call$1(value) { @@ -18507,7 +19269,7 @@ A.FutureOfJSAnyToJSPromise_get_toJS__closure0.prototype = { call$2(error, stackTrace) { var wrapper, box, t1; - type$.Object._as(error); + A._asObject(error); type$.StackTrace._as(stackTrace); wrapper = A.JSFunctionUnsafeUtilExtension_callAsConstructor(type$.JavaScriptFunction._as(init.G.Error), string$.Dart_e, type$.JSObject); if (type$.JavaScriptObject._is(error)) @@ -18520,26 +19282,26 @@ t1.call(t1, wrapper); return wrapper; }, - $signature: 52 + $signature: 39 }; A.FutureOfVoidToJSPromise_get_toJS_closure.prototype = { call$2(resolve, reject) { var t1 = type$.JavaScriptFunction; this._this.then$1$2$onError(new A.FutureOfVoidToJSPromise_get_toJS__closure(t1._as(resolve)), new A.FutureOfVoidToJSPromise_get_toJS__closure0(t1._as(reject)), type$.nullable_Object); }, - $signature: 29 + $signature: 30 }; A.FutureOfVoidToJSPromise_get_toJS__closure.prototype = { call$1(__wc0_formal) { var t1 = this.resolve; return t1.call(t1); }, - $signature: 50 + $signature: 38 }; A.FutureOfVoidToJSPromise_get_toJS__closure0.prototype = { call$2(error, stackTrace) { var wrapper, box, t1; - type$.Object._as(error); + A._asObject(error); type$.StackTrace._as(stackTrace); wrapper = A.JSFunctionUnsafeUtilExtension_callAsConstructor(type$.JavaScriptFunction._as(init.G.Error), string$.Dart_e, type$.JSObject); if (type$.JavaScriptObject._is(error)) @@ -18654,10 +19416,44 @@ A._JSRandom.prototype = { nextInt$1(max) { if (max <= 0 || max > 4294967296) - throw A.wrapException(A.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max)); + throw A.wrapException(A.RangeError$(string$.max_mu + max)); return Math.random() * max >>> 0; + } + }; + A._JSSecureRandom.prototype = { + _JSSecureRandom$0() { + var $crypto = self.crypto; + if ($crypto != null) + if ($crypto.getRandomValues != null) + return; + throw A.wrapException(A.UnsupportedError$("No source of cryptographically secure random numbers available.")); }, - $isRandom: 1 + nextInt$1(max) { + var byteCount, t1, start, randomLimit, t2, t3, random, result; + if (max <= 0 || max > 4294967296) + throw A.wrapException(A.RangeError$(string$.max_mu + max)); + if (max > 255) + if (max > 65535) + byteCount = max > 16777215 ? 4 : 3; + else + byteCount = 2; + else + byteCount = 1; + t1 = this._math$_buffer; + t1.$flags & 2 && A.throwUnsupportedOperation(t1, 11); + t1.setUint32(0, 0, false); + start = 4 - byteCount; + randomLimit = A._asInt(Math.pow(256, byteCount)); + for (t2 = max - 1, t3 = (max & t2) >>> 0 === 0; true;) { + crypto.getRandomValues(J.asUint8List$2$x(B.NativeByteData_methods.get$buffer(t1), start, byteCount)); + random = t1.getUint32(0, false); + if (t3) + return (random & t2) >>> 0; + result = random % max; + if (random - result + max < randomLimit) + return result; + } + } }; A.AsyncMemoizer.prototype = {}; A.DelegatingStreamSink.prototype = { @@ -18762,7 +19558,7 @@ }; A.StreamQueue__ensureListening_closure1.prototype = { call$2(error, stackTrace) { - type$.Object._as(error); + A._asObject(error); type$.StackTrace._as(stackTrace); this.$this._addResult$1(new A.ErrorResult(error, stackTrace)); }, @@ -18820,7 +19616,7 @@ call$2(h, i) { return A._combine(A._asInt(h), J.get$hashCode$(i)); }, - $signature: 46 + $signature: 37 }; A.BuiltList.prototype = { toBuilder$0() { @@ -19030,7 +19826,7 @@ call$1(k) { return this.multimap.$index(0, k); }, - $signature: 4 + $signature: 6 }; A.BuiltListMultimap_hashCode_closure.prototype = { call$1(key) { @@ -19187,7 +19983,7 @@ call$1(k) { return this.multimap.$index(0, k); }, - $signature: 4 + $signature: 6 }; A.BuiltMap.prototype = { toBuilder$0() { @@ -19254,7 +20050,7 @@ call$1(k) { return this.map.$index(0, k); }, - $signature: 4 + $signature: 6 }; A.BuiltMap_hashCode_closure.prototype = { call$1(key) { @@ -19372,7 +20168,7 @@ var t1 = this.$this.$ti; this.replacement.$indexSet(0, t1._precomputed1._as(key), t1._rest[1]._as(value)); }, - $signature: 23 + $signature: 24 }; A.BuiltSet.prototype = { get$hashCode(_) { @@ -19736,7 +20532,7 @@ call$1(k) { return this.multimap.$index(0, k); }, - $signature: 4 + $signature: 6 }; A.EnumClass.prototype = { toString$0(_) { @@ -19751,7 +20547,7 @@ $._indentingBuiltValueToStringHelperIndent = $._indentingBuiltValueToStringHelperIndent + 2; return new A.IndentingBuiltValueToStringHelper(t1); }, - $signature: 42 + $signature: 84 }; A.IndentingBuiltValueToStringHelper.prototype = { add$2(_, field, value) { @@ -19759,8 +20555,7 @@ if (value != null) { t1 = this._result; t1.toString; - t2 = B.JSString_methods.$mul(" ", $._indentingBuiltValueToStringHelperIndent); - t2 = (t1._contents += t2) + field; + t2 = (t1._contents += B.JSString_methods.$mul(" ", $._indentingBuiltValueToStringHelperIndent)) + field; t1._contents = t2; t1._contents = t2 + "="; t2 = A.S(value); @@ -19773,9 +20568,8 @@ $._indentingBuiltValueToStringHelperIndent = t1; t2 = this._result; t2.toString; - t1 = B.JSString_methods.$mul(" ", t1); - t2._contents = (t2._contents += t1) + "}"; - stringResult = J.toString$0$(this._result); + t2._contents = (t2._contents += B.JSString_methods.$mul(" ", t1)) + "}"; + stringResult = t2.toString$0(0); this._result = null; return stringResult; } @@ -19884,34 +20678,34 @@ call$0() { return A.ListBuilder_ListBuilder(B.List_empty0, type$.Object); }, - $signature: 39 + $signature: 58 }; A.Serializers_Serializers_closure0.prototype = { call$0() { var t1 = type$.Object; return A.ListMultimapBuilder_ListMultimapBuilder(t1, t1); }, - $signature: 38 + $signature: 34 }; A.Serializers_Serializers_closure1.prototype = { call$0() { var t1 = type$.Object; return A.MapBuilder_MapBuilder(t1, t1); }, - $signature: 36 + $signature: 35 }; A.Serializers_Serializers_closure2.prototype = { call$0() { return A.SetBuilder_SetBuilder(type$.Object); }, - $signature: 35 + $signature: 36 }; A.Serializers_Serializers_closure3.prototype = { call$0() { var t1 = type$.Object; return A.SetMultimapBuilder_SetMultimapBuilder(t1, t1); }, - $signature: 89 + $signature: 92 }; A.FullType.prototype = { $eq(_, other) { @@ -20160,7 +20954,7 @@ if (builderFactory == null) this._throwMissingBuilderFactory$1(fullType); t1 = builderFactory.call$0(); - return t1 == null ? type$.Object._as(t1) : t1; + return t1 == null ? A._asObject(t1) : t1; }, _throwMissingBuilderFactory$1(fullType) { throw A.wrapException(A.StateError$("No builder factory for " + fullType.toString$0(0) + ". Fix by adding one, see SerializersBuilder.addBuilderFactory.")); @@ -21214,8 +22008,8 @@ addAll$1(_, other) { this.$ti._eval$1("Map")._as(other).forEach$1(0, new A.CanonicalizedMap_addAll_closure(this)); }, - cast$2$0(_, K2, V2) { - return this._base.cast$2$0(0, K2, V2); + cast$2$0(_, $K2, $V2) { + return this._base.cast$2$0(0, $K2, $V2); }, containsKey$1(key) { var _this = this; @@ -21229,6 +22023,9 @@ get$isEmpty(_) { return this._base.__js_helper$_length === 0; }, + get$isNotEmpty(_) { + return this._base.__js_helper$_length !== 0; + }, get$keys() { var t1 = this._base, t2 = A._instanceType(t1)._eval$1("LinkedHashMapValuesIterable<2>"), @@ -21238,8 +22035,8 @@ get$length(_) { return this._base.__js_helper$_length; }, - map$2$1(_, transform, K2, V2) { - return this._base.map$2$1(0, new A.CanonicalizedMap_map_closure(this, this.$ti._bind$1(K2)._bind$1(V2)._eval$1("MapEntry<1,2>(CanonicalizedMap.K,CanonicalizedMap.V)")._as(transform), K2, V2), K2, V2); + map$2$1(_, transform, $K2, $V2) { + return this._base.map$2$1(0, new A.CanonicalizedMap_map_closure(this, this.$ti._bind$1($K2)._bind$1($V2)._eval$1("MapEntry<1,2>(CanonicalizedMap.K,CanonicalizedMap.V)")._as(transform), $K2, $V2), $K2, $V2); }, map$1(_, transform) { var t1 = type$.dynamic; @@ -23342,43 +24139,40 @@ return _this._hot_reload_response$_$v = _$result; } }; - A.IsolateExit.prototype = {}; - A.IsolateStart.prototype = {}; - A._$IsolateExitSerializer.prototype = { - serialize$3$specifiedType(serializers, object, specifiedType) { - type$.IsolateExit._as(object); - return []; - }, - serialize$2(serializers, object) { - return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false); - }, - deserialize$3$specifiedType(serializers, serialized, specifiedType) { - type$.Iterable_nullable_Object._as(serialized); - return new A.IsolateExitBuilder()._isolate_events$_build$0(); - }, - deserialize$2(serializers, serialized) { - return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false); - }, - $isSerializer: 1, - $isStructuredSerializer: 1, - get$types() { - return B.List_MJN; - }, - get$wireName() { - return "IsolateExit"; - } - }; - A._$IsolateStartSerializer.prototype = { + A.HotRestartRequest.prototype = {}; + A._$HotRestartRequestSerializer.prototype = { serialize$3$specifiedType(serializers, object, specifiedType) { - type$.IsolateStart._as(object); - return []; + return ["id", serializers.serialize$2$specifiedType(type$.HotRestartRequest._as(object).id, B.FullType_PT1)]; }, serialize$2(serializers, object) { return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false); }, deserialize$3$specifiedType(serializers, serialized, specifiedType) { - type$.Iterable_nullable_Object._as(serialized); - return new A.IsolateStartBuilder()._isolate_events$_build$0(); + var t1, value, $$v, _$result, + result = new A.HotRestartRequestBuilder(), + iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized)); + for (; iterator.moveNext$0();) { + t1 = iterator.get$current(); + t1.toString; + A._asString(t1); + iterator.moveNext$0(); + value = iterator.get$current(); + switch (t1) { + case "id": + t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1); + t1.toString; + A._asString(t1); + $$v = result._hot_restart_request$_$v; + if ($$v != null) { + result._hot_restart_request$_id = $$v.id; + result._hot_restart_request$_$v = null; + } + result._hot_restart_request$_id = t1; + break; + } + } + _$result = result._hot_restart_request$_$v; + return result._hot_restart_request$_$v = _$result == null ? new A._$HotRestartRequest(A.BuiltValueNullFieldError_checkNotNull(result.get$_hot_restart_request$_$this()._hot_restart_request$_id, "HotRestartRequest", "id", type$.String)) : _$result; }, deserialize$2(serializers, serialized) { return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false); @@ -23386,27 +24180,217 @@ $isSerializer: 1, $isStructuredSerializer: 1, get$types() { - return B.List_KpG; + return B.List_9I1; }, get$wireName() { - return "IsolateStart"; + return "HotRestartRequest"; } }; - A._$IsolateExit.prototype = { + A._$HotRestartRequest.prototype = { $eq(_, other) { if (other == null) return false; if (other === this) return true; - return other instanceof A._$IsolateExit; + return other instanceof A._$HotRestartRequest && this.id === other.id; }, get$hashCode(_) { - return 814065794; + return A.$jf(A.$jc(0, B.JSString_methods.get$hashCode(this.id))); }, toString$0(_) { - return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateExit")); - } - }; + var t1 = $.$get$newBuiltValueToStringHelper().call$1("HotRestartRequest"), + t2 = J.getInterceptor$ax(t1); + t2.add$2(t1, "id", this.id); + return t2.toString$0(t1); + } + }; + A.HotRestartRequestBuilder.prototype = { + set$id(id) { + this.get$_hot_restart_request$_$this()._hot_restart_request$_id = id; + }, + get$_hot_restart_request$_$this() { + var _this = this, + $$v = _this._hot_restart_request$_$v; + if ($$v != null) { + _this._hot_restart_request$_id = $$v.id; + _this._hot_restart_request$_$v = null; + } + return _this; + } + }; + A.HotRestartResponse.prototype = {}; + A._$HotRestartResponseSerializer.prototype = { + serialize$3$specifiedType(serializers, object, specifiedType) { + var result, value; + type$.HotRestartResponse._as(object); + result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_PT1), "success", serializers.serialize$2$specifiedType(object.success, B.FullType_R6B)]; + value = object.errorMessage; + if (value != null) { + result.push("error"); + result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1)); + } + return result; + }, + serialize$2(serializers, object) { + return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false); + }, + deserialize$3$specifiedType(serializers, serialized, specifiedType) { + var t1, value, + result = new A.HotRestartResponseBuilder(), + iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized)); + for (; iterator.moveNext$0();) { + t1 = iterator.get$current(); + t1.toString; + A._asString(t1); + iterator.moveNext$0(); + value = iterator.get$current(); + switch (t1) { + case "id": + t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1); + t1.toString; + A._asString(t1); + result.get$_hot_restart_response$_$this()._hot_restart_response$_id = t1; + break; + case "success": + t1 = serializers.deserialize$2$specifiedType(value, B.FullType_R6B); + t1.toString; + A._asBool(t1); + result.get$_hot_restart_response$_$this()._hot_restart_response$_success = t1; + break; + case "error": + t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1)); + result.get$_hot_restart_response$_$this()._hot_restart_response$_errorMessage = t1; + break; + } + } + return result._hot_restart_response$_build$0(); + }, + deserialize$2(serializers, serialized) { + return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false); + }, + $isSerializer: 1, + $isStructuredSerializer: 1, + get$types() { + return B.List_YhA; + }, + get$wireName() { + return "HotRestartResponse"; + } + }; + A._$HotRestartResponse.prototype = { + $eq(_, other) { + var _this = this; + if (other == null) + return false; + if (other === _this) + return true; + return other instanceof A._$HotRestartResponse && _this.id === other.id && _this.success === other.success && _this.errorMessage == other.errorMessage; + }, + get$hashCode(_) { + return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.id)), B.JSBool_methods.get$hashCode(this.success)), J.get$hashCode$(this.errorMessage))); + }, + toString$0(_) { + var t1 = $.$get$newBuiltValueToStringHelper().call$1("HotRestartResponse"), + t2 = J.getInterceptor$ax(t1); + t2.add$2(t1, "id", this.id); + t2.add$2(t1, "success", this.success); + t2.add$2(t1, "errorMessage", this.errorMessage); + return t2.toString$0(t1); + } + }; + A.HotRestartResponseBuilder.prototype = { + set$id(id) { + this.get$_hot_restart_response$_$this()._hot_restart_response$_id = id; + }, + set$success(success) { + this.get$_hot_restart_response$_$this()._hot_restart_response$_success = success; + }, + set$errorMessage(errorMessage) { + this.get$_hot_restart_response$_$this()._hot_restart_response$_errorMessage = errorMessage; + }, + get$_hot_restart_response$_$this() { + var _this = this, + $$v = _this._hot_restart_response$_$v; + if ($$v != null) { + _this._hot_restart_response$_id = $$v.id; + _this._hot_restart_response$_success = $$v.success; + _this._hot_restart_response$_errorMessage = $$v.errorMessage; + _this._hot_restart_response$_$v = null; + } + return _this; + }, + _hot_restart_response$_build$0() { + var _this = this, + _s18_ = "HotRestartResponse", + _$result = _this._hot_restart_response$_$v; + return _this._hot_restart_response$_$v = _$result == null ? new A._$HotRestartResponse(A.BuiltValueNullFieldError_checkNotNull(_this.get$_hot_restart_response$_$this()._hot_restart_response$_id, _s18_, "id", type$.String), A.BuiltValueNullFieldError_checkNotNull(_this.get$_hot_restart_response$_$this()._hot_restart_response$_success, _s18_, "success", type$.bool), _this.get$_hot_restart_response$_$this()._hot_restart_response$_errorMessage) : _$result; + } + }; + A.IsolateExit.prototype = {}; + A.IsolateStart.prototype = {}; + A._$IsolateExitSerializer.prototype = { + serialize$3$specifiedType(serializers, object, specifiedType) { + type$.IsolateExit._as(object); + return []; + }, + serialize$2(serializers, object) { + return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false); + }, + deserialize$3$specifiedType(serializers, serialized, specifiedType) { + type$.Iterable_nullable_Object._as(serialized); + return new A.IsolateExitBuilder()._isolate_events$_build$0(); + }, + deserialize$2(serializers, serialized) { + return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false); + }, + $isSerializer: 1, + $isStructuredSerializer: 1, + get$types() { + return B.List_MJN; + }, + get$wireName() { + return "IsolateExit"; + } + }; + A._$IsolateStartSerializer.prototype = { + serialize$3$specifiedType(serializers, object, specifiedType) { + type$.IsolateStart._as(object); + return []; + }, + serialize$2(serializers, object) { + return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false); + }, + deserialize$3$specifiedType(serializers, serialized, specifiedType) { + type$.Iterable_nullable_Object._as(serialized); + return new A.IsolateStartBuilder()._isolate_events$_build$0(); + }, + deserialize$2(serializers, serialized) { + return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false); + }, + $isSerializer: 1, + $isStructuredSerializer: 1, + get$types() { + return B.List_KpG; + }, + get$wireName() { + return "IsolateStart"; + } + }; + A._$IsolateExit.prototype = { + $eq(_, other) { + if (other == null) + return false; + if (other === this) + return true; + return other instanceof A._$IsolateExit; + }, + get$hashCode(_) { + return 814065794; + }, + toString$0(_) { + return J.toString$0$($.$get$newBuiltValueToStringHelper().call$1("IsolateExit")); + } + }; A.IsolateExitBuilder.prototype = { _isolate_events$_build$0() { var _$result = this._isolate_events$_$v; @@ -23596,19 +24580,281 @@ call$0() { return A.ListBuilder_ListBuilder(B.List_empty0, type$.DebugEvent); }, - $signature: 40 + $signature: 41 }; A._$serializers_closure0.prototype = { call$0() { return A.ListBuilder_ListBuilder(B.List_empty0, type$.ExtensionEvent); }, - $signature: 41 + $signature: 42 + }; + A.ServiceExtensionRequest.prototype = {}; + A._$ServiceExtensionRequestSerializer.prototype = { + serialize$3$specifiedType(serializers, object, specifiedType) { + type$.ServiceExtensionRequest._as(object); + return ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_PT1), "method", serializers.serialize$2$specifiedType(object.method, B.FullType_PT1), "argsJson", serializers.serialize$2$specifiedType(object.argsJson, B.FullType_PT1)]; + }, + serialize$2(serializers, object) { + return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false); + }, + deserialize$3$specifiedType(serializers, serialized, specifiedType) { + var t1, value, _$result, t2, t3, t4, + _s8_ = "argsJson", + _s23_ = "ServiceExtensionRequest", + result = new A.ServiceExtensionRequestBuilder(), + iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized)); + for (; iterator.moveNext$0();) { + t1 = iterator.get$current(); + t1.toString; + A._asString(t1); + iterator.moveNext$0(); + value = iterator.get$current(); + switch (t1) { + case "id": + t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1); + t1.toString; + A._asString(t1); + result.get$_service_extension_request$_$this()._service_extension_request$_id = t1; + break; + case "method": + t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1); + t1.toString; + A._asString(t1); + result.get$_service_extension_request$_$this()._service_extension_request$_method = t1; + break; + case "argsJson": + t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1); + t1.toString; + A._asString(t1); + result.get$_service_extension_request$_$this()._argsJson = t1; + break; + } + } + _$result = result._service_extension_request$_$v; + if (_$result == null) { + t1 = type$.String; + t2 = A.BuiltValueNullFieldError_checkNotNull(result.get$_service_extension_request$_$this()._service_extension_request$_id, _s23_, "id", t1); + t3 = A.BuiltValueNullFieldError_checkNotNull(result.get$_service_extension_request$_$this()._service_extension_request$_method, _s23_, "method", t1); + t4 = A.BuiltValueNullFieldError_checkNotNull(result.get$_service_extension_request$_$this()._argsJson, _s23_, _s8_, t1); + _$result = new A._$ServiceExtensionRequest(t2, t3, t4); + A.BuiltValueNullFieldError_checkNotNull(t2, _s23_, "id", t1); + A.BuiltValueNullFieldError_checkNotNull(t3, _s23_, "method", t1); + A.BuiltValueNullFieldError_checkNotNull(t4, _s23_, _s8_, t1); + } + A.ArgumentError_checkNotNull(_$result, "other", type$.ServiceExtensionRequest); + return result._service_extension_request$_$v = _$result; + }, + deserialize$2(serializers, serialized) { + return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false); + }, + $isSerializer: 1, + $isStructuredSerializer: 1, + get$types() { + return B.List_4i4; + }, + get$wireName() { + return "ServiceExtensionRequest"; + } + }; + A._$ServiceExtensionRequest.prototype = { + $eq(_, other) { + var _this = this; + if (other == null) + return false; + if (other === _this) + return true; + return other instanceof A._$ServiceExtensionRequest && _this.id === other.id && _this.method === other.method && _this.argsJson === other.argsJson; + }, + get$hashCode(_) { + return A.$jf(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(this.id)), B.JSString_methods.get$hashCode(this.method)), B.JSString_methods.get$hashCode(this.argsJson))); + }, + toString$0(_) { + var t1 = $.$get$newBuiltValueToStringHelper().call$1("ServiceExtensionRequest"), + t2 = J.getInterceptor$ax(t1); + t2.add$2(t1, "id", this.id); + t2.add$2(t1, "method", this.method); + t2.add$2(t1, "argsJson", this.argsJson); + return t2.toString$0(t1); + } + }; + A.ServiceExtensionRequestBuilder.prototype = { + set$id(id) { + this.get$_service_extension_request$_$this()._service_extension_request$_id = id; + }, + get$_service_extension_request$_$this() { + var _this = this, + $$v = _this._service_extension_request$_$v; + if ($$v != null) { + _this._service_extension_request$_id = $$v.id; + _this._service_extension_request$_method = $$v.method; + _this._argsJson = $$v.argsJson; + _this._service_extension_request$_$v = null; + } + return _this; + } + }; + A.ServiceExtensionResponse.prototype = {}; + A.ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure.prototype = { + call$1(b) { + var t1, _this = this; + b.get$_service_extension_response$_$this()._service_extension_response$_id = _this.id; + b.get$_service_extension_response$_$this()._service_extension_response$_success = _this.success; + t1 = _this.result; + t1 = t1 != null ? B.C_JsonCodec.encode$1(t1) : null; + b.get$_service_extension_response$_$this()._resultJson = t1; + b.get$_service_extension_response$_$this()._errorCode = _this.errorCode; + b.get$_service_extension_response$_$this()._service_extension_response$_errorMessage = _this.errorMessage; + return b; + }, + $signature: 43 + }; + A._$ServiceExtensionResponseSerializer.prototype = { + serialize$3$specifiedType(serializers, object, specifiedType) { + var result, value; + type$.ServiceExtensionResponse._as(object); + result = ["id", serializers.serialize$2$specifiedType(object.id, B.FullType_PT1), "success", serializers.serialize$2$specifiedType(object.success, B.FullType_R6B)]; + value = object.resultJson; + if (value != null) { + result.push("resultJson"); + result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1)); + } + value = object.errorCode; + if (value != null) { + result.push("errorCode"); + result.push(serializers.serialize$2$specifiedType(value, B.FullType_rTD)); + } + value = object.errorMessage; + if (value != null) { + result.push("errorMessage"); + result.push(serializers.serialize$2$specifiedType(value, B.FullType_PT1)); + } + return result; + }, + serialize$2(serializers, object) { + return this.serialize$3$specifiedType(serializers, object, B.FullType_null_List_empty_false); + }, + deserialize$3$specifiedType(serializers, serialized, specifiedType) { + var t1, value, + result = new A.ServiceExtensionResponseBuilder(), + iterator = J.get$iterator$ax(type$.Iterable_nullable_Object._as(serialized)); + for (; iterator.moveNext$0();) { + t1 = iterator.get$current(); + t1.toString; + A._asString(t1); + iterator.moveNext$0(); + value = iterator.get$current(); + switch (t1) { + case "id": + t1 = serializers.deserialize$2$specifiedType(value, B.FullType_PT1); + t1.toString; + A._asString(t1); + result.get$_service_extension_response$_$this()._service_extension_response$_id = t1; + break; + case "resultJson": + t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1)); + result.get$_service_extension_response$_$this()._resultJson = t1; + break; + case "success": + t1 = serializers.deserialize$2$specifiedType(value, B.FullType_R6B); + t1.toString; + A._asBool(t1); + result.get$_service_extension_response$_$this()._service_extension_response$_success = t1; + break; + case "errorCode": + t1 = A._asIntQ(serializers.deserialize$2$specifiedType(value, B.FullType_rTD)); + result.get$_service_extension_response$_$this()._errorCode = t1; + break; + case "errorMessage": + t1 = A._asStringQ(serializers.deserialize$2$specifiedType(value, B.FullType_PT1)); + result.get$_service_extension_response$_$this()._service_extension_response$_errorMessage = t1; + break; + } + } + return result._service_extension_response$_build$0(); + }, + deserialize$2(serializers, serialized) { + return this.deserialize$3$specifiedType(serializers, serialized, B.FullType_null_List_empty_false); + }, + $isSerializer: 1, + $isStructuredSerializer: 1, + get$types() { + return B.List_5rA; + }, + get$wireName() { + return "ServiceExtensionResponse"; + } + }; + A._$ServiceExtensionResponse.prototype = { + $eq(_, other) { + var _this = this; + if (other == null) + return false; + if (other === _this) + return true; + return other instanceof A._$ServiceExtensionResponse && _this.id === other.id && _this.resultJson == other.resultJson && _this.success === other.success && _this.errorCode == other.errorCode && _this.errorMessage == other.errorMessage; + }, + get$hashCode(_) { + var _this = this; + return A.$jf(A.$jc(A.$jc(A.$jc(A.$jc(A.$jc(0, B.JSString_methods.get$hashCode(_this.id)), J.get$hashCode$(_this.resultJson)), B.JSBool_methods.get$hashCode(_this.success)), J.get$hashCode$(_this.errorCode)), J.get$hashCode$(_this.errorMessage))); + }, + toString$0(_) { + var _this = this, + t1 = $.$get$newBuiltValueToStringHelper().call$1("ServiceExtensionResponse"), + t2 = J.getInterceptor$ax(t1); + t2.add$2(t1, "id", _this.id); + t2.add$2(t1, "resultJson", _this.resultJson); + t2.add$2(t1, "success", _this.success); + t2.add$2(t1, "errorCode", _this.errorCode); + t2.add$2(t1, "errorMessage", _this.errorMessage); + return t2.toString$0(t1); + } + }; + A.ServiceExtensionResponseBuilder.prototype = { + set$id(id) { + this.get$_service_extension_response$_$this()._service_extension_response$_id = id; + }, + set$success(success) { + this.get$_service_extension_response$_$this()._service_extension_response$_success = success; + }, + set$errorMessage(errorMessage) { + this.get$_service_extension_response$_$this()._service_extension_response$_errorMessage = errorMessage; + }, + get$_service_extension_response$_$this() { + var _this = this, + $$v = _this._service_extension_response$_$v; + if ($$v != null) { + _this._service_extension_response$_id = $$v.id; + _this._resultJson = $$v.resultJson; + _this._service_extension_response$_success = $$v.success; + _this._errorCode = $$v.errorCode; + _this._service_extension_response$_errorMessage = $$v.errorMessage; + _this._service_extension_response$_$v = null; + } + return _this; + }, + _service_extension_response$_build$0() { + var t1, t2, t3, t4, t5, _this = this, + _s24_ = "ServiceExtensionResponse", + _$result = _this._service_extension_response$_$v; + if (_$result == null) { + t1 = type$.String; + t2 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_service_extension_response$_$this()._service_extension_response$_id, _s24_, "id", t1); + t3 = _this.get$_service_extension_response$_$this()._resultJson; + t4 = type$.bool; + t5 = A.BuiltValueNullFieldError_checkNotNull(_this.get$_service_extension_response$_$this()._service_extension_response$_success, _s24_, "success", t4); + _$result = new A._$ServiceExtensionResponse(t2, t3, t5, _this.get$_service_extension_response$_$this()._errorCode, _this.get$_service_extension_response$_$this()._service_extension_response$_errorMessage); + A.BuiltValueNullFieldError_checkNotNull(t2, _s24_, "id", t1); + A.BuiltValueNullFieldError_checkNotNull(t5, _s24_, "success", t4); + } + A.ArgumentError_checkNotNull(_$result, "other", type$.ServiceExtensionResponse); + return _this._service_extension_response$_$v = _$result; + } }; A.BatchedStreamController.prototype = { _batchAndSendEvents$0() { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), - $async$self = this, t2, t3, t4, t5, t6, t7, t8, lastSendTime0, lastEvent, duration, t1, buffer, lastSendTime, $async$temp1, $async$temp2; + $async$self = this, t2, t3, t4, t5, t6, t7, t8, now, lastEvent, duration, t1, buffer, lastSendTime, $async$temp1, $async$temp2; var $async$_batchAndSendEvents$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -23620,7 +24866,7 @@ t1 = $async$self.$ti; buffer = A._setArrayType([], t1._eval$1("JSArray<1>")); lastSendTime = Date.now(); - t2 = $async$self._batchDelayMilliseconds, t3 = $async$self._outputController, t4 = A._instanceType(t3), t1 = t1._precomputed1, t5 = t4._precomputed1, t4 = t4._eval$1("_DelayedData<1>"); + t2 = $async$self._batchDelayMilliseconds, t3 = $async$self._outputController, t4 = A._instanceType(t3), t1 = t1._precomputed1, t5 = t4._eval$1("_DelayedData<1>"); case 2: // for condition $async$goto = 4; @@ -23654,11 +24900,11 @@ $async$temp1.add$1($async$temp2, $async$result); case 6: // join - lastSendTime0 = Date.now(); - if (lastSendTime0 > lastSendTime + t2) { + now = Date.now(); + if (now > lastSendTime + t2) { if (buffer.length !== 0) { t6 = A.List_List$_of(buffer, t1); - t5._as(t6); + t4._precomputed1._as(t6); t7 = t3._state; if (t7 >= 4) A.throwExpression(t3._badEventState$0()); @@ -23666,7 +24912,7 @@ t3._sendData$1(t6); else if ((t7 & 3) === 0) { t7 = t3._ensurePendingEvents$0(); - t6 = new A._DelayedData(t6, t4); + t6 = new A._DelayedData(t6, t5); lastEvent = t7.lastPendingEvent; if (lastEvent == null) t7.firstPendingEvent = t7.lastPendingEvent = t6; @@ -23677,7 +24923,7 @@ } B.JSArray_methods.clear$0(buffer); } - lastSendTime = lastSendTime0; + lastSendTime = now; } // goto for condition $async$goto = 2; @@ -23686,7 +24932,7 @@ // after for if (buffer.length !== 0) { t1 = A.List_List$_of(buffer, t1); - t3.add$1(0, t5._as(t1)); + t3.add$1(0, t4._precomputed1._as(t1)); } $async$self._completer.complete$1(true); // implicit return @@ -23710,13 +24956,13 @@ call$0() { return true; }, - $signature: 34 + $signature: 29 }; A.BatchedStreamController__hasEventDuring_closure.prototype = { call$0() { return false; }, - $signature: 34 + $signature: 29 }; A.SocketClient.prototype = {}; A.SseSocketClient.prototype = { @@ -23739,7 +24985,6 @@ t2 === $ && A.throwLateFieldNI("_foreign"); t2 = t2.__GuaranteeChannel__sink_F; t2 === $ && A.throwLateFieldNI("_sink"); - value !== $ && A.throwLateFieldADI("sink"); value = t1.__AdapterWebSocketChannel_sink_FI = new A._WebSocketSink(t1, t2); } return value; @@ -23758,7 +25003,7 @@ call$1(o) { return J.toString$0$(o); }, - $signature: 43 + $signature: 45 }; A.safeUnawaited_closure.prototype = { call$2(error, stackTrace) { @@ -23934,26 +25179,34 @@ call$2(key1, key2) { return A._asString(key1).toLowerCase() === A._asString(key2).toLowerCase(); }, - $signature: 44 + $signature: 46 }; A.BaseRequest_closure0.prototype = { call$1(key) { return B.JSString_methods.get$hashCode(A._asString(key).toLowerCase()); }, - $signature: 45 + $signature: 47 }; A.BaseResponse.prototype = { BaseResponse$7$contentLength$headers$isRedirect$persistentConnection$reasonPhrase$request(statusCode, contentLength, headers, isRedirect, persistentConnection, reasonPhrase, request) { var t1 = this.statusCode; if (t1 < 100) throw A.wrapException(A.ArgumentError$("Invalid status code " + t1 + ".", null)); + else { + t1 = this.contentLength; + if (t1 != null && t1 < 0) + throw A.wrapException(A.ArgumentError$("Invalid content length " + A.S(t1) + ".", null)); + } } }; A.BrowserClient.prototype = { send$1(request) { + return this.send$body$BrowserClient(request); + }, + send$body$BrowserClient(request) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.StreamedResponse), - $async$returnValue, $async$handler = 2, $async$errorStack = [], $async$next = [], $async$self = this, xhr, completer, bytes, t1, t2, header, t3; + $async$returnValue, $async$handler = 2, $async$errorStack = [], $async$self = this, bodyBytes, t1, _0_0, contentLength, header, response, contentLengthHeader, contentLength0, headers, e, st, t2, t3, _this, t4, t5, t6, t7, result, exception, $async$exception; var $async$send$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) { $async$errorStack.push($async$result); @@ -23964,54 +25217,93 @@ case 0: // Function start request.super$BaseRequest$finalize(); + t2 = type$._AsyncStreamController_List_int; + t3 = new A._AsyncStreamController(null, null, null, null, t2); + t3._add$1(request._bodyBytes); + t3._closeUnchecked$0(); $async$goto = 3; - return A._asyncAwait(new A.ByteStream(A.Stream_Stream$value(request._bodyBytes, type$.List_int)).toBytes$0(), $async$send$1); + return A._asyncAwait(new A.ByteStream(new A._ControllerStream(t3, t2._eval$1("_ControllerStream<1>"))).toBytes$0(), $async$send$1); case 3: // returning from await. - bytes = $async$result; - xhr = type$.JSObject._as(new init.G.XMLHttpRequest()); - t1 = $async$self._xhrs; - t1.add$1(0, xhr); - t2 = xhr; - t2.open(request.method, request.url.toString$0(0), true); - t2.responseType = "arraybuffer"; - t2.withCredentials = $async$self.withCredentials; - for (t2 = request.headers, t2 = new A.LinkedHashMapEntriesIterable(t2, A._instanceType(t2)._eval$1("LinkedHashMapEntriesIterable<1,2>")).get$iterator(0); t2.moveNext$0();) { - header = t2.__js_helper$_current; - xhr.setRequestHeader(header.key, header.value); + bodyBytes = $async$result; + $async$handler = 5; + t2 = request.url; + _this = t2.toString$0(0); + t3 = !J.get$isEmpty$asx(bodyBytes) ? bodyBytes : null; + t4 = $async$self.withCredentials ? "include" : "same-origin"; + t5 = type$.String; + t1 = A.LinkedHashMap_LinkedHashMap$_empty(t5, type$.Object); + _0_0 = request._bodyBytes.length; + contentLength = null; + if (_0_0 != null) { + contentLength = _0_0; + J.$indexSet$ax(t1, "content-length", contentLength); } - completer = new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_StreamedResponse), type$._AsyncCompleter_StreamedResponse); - t2 = type$._EventStream_JSObject; - t3 = type$.void; - new A._EventStream(xhr, "load", false, t2).get$first(0).then$1$1(new A.BrowserClient_send_closure(xhr, completer, request), t3); - new A._EventStream(xhr, "error", false, t2).get$first(0).then$1$1(new A.BrowserClient_send_closure0(completer, request), t3); - xhr.send(bytes); - $async$handler = 4; - $async$goto = 7; - return A._asyncAwait(completer.future, $async$send$1); - case 7: + for (t6 = request.headers, t6 = new A.LinkedHashMapEntriesIterable(t6, A._instanceType(t6)._eval$1("LinkedHashMapEntriesIterable<1,2>")).get$iterator(0); t6.moveNext$0();) { + t7 = t6.__js_helper$_current; + t7.toString; + header = t7; + J.$indexSet$ax(t1, header.key, header.value); + } + t1 = A.jsify(t1); + t1.toString; + A._asJSObject(t1); + t6 = A._asJSObject($async$self._abortController.signal); + $async$goto = 8; + return A._asyncAwait(A.promiseToFuture(A._asJSObject(init.G.fetch(_this, {method: request.method, headers: t1, body: t3, credentials: t4, redirect: "follow", signal: t6})), type$.JSObject), $async$send$1); + case 8: // returning from await. - t2 = $async$result; - $async$returnValue = t2; - $async$next = [1]; - // goto finally - $async$goto = 5; + response = $async$result; + contentLengthHeader = A._asStringQ(A._asJSObject(response.headers).get("content-length")); + contentLength0 = contentLengthHeader != null ? A.Primitives_parseInt(contentLengthHeader, null) : null; + if (contentLength0 == null && contentLengthHeader != null) { + t1 = A.ClientException$("Invalid content-length header [" + contentLengthHeader + "].", t2); + throw A.wrapException(t1); + } + headers = A.LinkedHashMap_LinkedHashMap$_empty(t5, t5); + t1 = A._asJSObject(response.headers); + t2 = new A.BrowserClient_send_closure(headers); + if (typeof t2 == "function") + A.throwExpression(A.ArgumentError$("Attempting to rewrap a JS function.", null)); + result = function(_call, f) { + return function(arg1, arg2, arg3) { + return _call(f, arg1, arg2, arg3, arguments.length); + }; + }(A._callDartFunctionFast3, t2); + result[$.$get$DART_CLOSURE_PROPERTY_NAME()] = t2; + t1.forEach(result); + t1 = A._readBody(request, response); + t2 = A._asInt(response.status); + t3 = headers; + t4 = contentLength0; + A.Uri_parse(A._asString(response.url)); + t5 = A._asString(response.statusText); + t1 = new A.StreamedResponseV2(A.toByteStream(t1), request, t2, t5, t4, t3, false, true); + t1.BaseResponse$7$contentLength$headers$isRedirect$persistentConnection$reasonPhrase$request(t2, t4, t3, false, true, t5, request); + $async$returnValue = t1; + // goto return + $async$goto = 1; break; - $async$next.push(6); - // goto finally - $async$goto = 5; + $async$handler = 2; + // goto after finally + $async$goto = 7; + break; + case 5: + // catch + $async$handler = 4; + $async$exception = $async$errorStack.pop(); + e = A.unwrapException($async$exception); + st = A.getTraceFromException($async$exception); + A._rethrowAsClientException(e, st, request); + // goto after finally + $async$goto = 7; break; case 4: // uncaught - $async$next = [2]; - case 5: - // finally - $async$handler = 2; - t1.remove$1(0, xhr); - // goto the next finally handler - $async$goto = $async$next.pop(); + // goto rethrow + $async$goto = 2; break; - case 6: + case 7: // after finally case 1: // return @@ -24025,42 +25317,32 @@ } }; A.BrowserClient_send_closure.prototype = { + call$3(value, header, _) { + A._asString(value); + this.headers.$indexSet(0, A._asString(header).toLowerCase(), value); + }, + call$2(value, header) { + return this.call$3(value, header, null); + }, + "call*": "call$3", + $requiredArgCount: 2, + $defaultValues() { + return [null]; + }, + $signature: 48 + }; + A._readBody_closure.prototype = { call$1(_) { - var t1, _0_0, t2, body, responseUrl, t3, t4, t5, t6, _this = this; - type$.JSObject._as(_); - t1 = _this.xhr; - _0_0 = A._extension_0_get_responseHeaders(t1).$index(0, "content-length"); - t2 = false; - if (_0_0 != null) { - t2 = $.$get$_digitRegex(); - t2 = !t2._nativeRegExp.test(_0_0); - } - if (t2) { - _this.completer.completeError$1(new A.ClientException("Invalid content-length header [" + _0_0 + "].", _this.request.url)); - return; - } - body = A.NativeUint8List_NativeUint8List$view(type$.NativeByteBuffer._as(t1.response), 0, null); - responseUrl = A._asString(t1.responseURL); - if (responseUrl.length !== 0) - A.Uri_parse(responseUrl); - t2 = A.Stream_Stream$value(body, type$.List_int); - t3 = A._asInt(t1.status); - t4 = body.length; - t5 = _this.request; - t6 = A._extension_0_get_responseHeaders(t1); - t1 = A._asString(t1.statusText); - t2 = new A.StreamedResponseV2(A.toByteStream(new A.ByteStream(t2)), t5, t3, t1, t4, t6, false, true); - t2.BaseResponse$7$contentLength$headers$isRedirect$persistentConnection$reasonPhrase$request(t3, t4, t6, false, true, t1, t5); - _this.completer.complete$1(t2); + return null; }, - $signature: 8 + $signature: 4 }; - A.BrowserClient_send_closure0.prototype = { + A._readBody_closure0.prototype = { call$1(_) { - type$.JSObject._as(_); - this.completer.completeError$2(new A.ClientException("XMLHttpRequest error.", this.request.url), A.StackTrace_current()); + A._asObject(_); + return this._box_0.isError; }, - $signature: 8 + $signature: 49 }; A.ByteStream.prototype = { toBytes$0() { @@ -24075,7 +25357,7 @@ call$1(bytes) { return this.completer.complete$1(new Uint8Array(A._ensureNativeList(type$.List_int._as(bytes)))); }, - $signature: 47 + $signature: 50 }; A.ClientException.prototype = { toString$0(_) { @@ -24163,7 +25445,7 @@ scanner.expectDone$0(); return A.MediaType$(t4, t5, parameters); }, - $signature: 48 + $signature: 51 }; A.MediaType_toString_closure.prototype = { call$2(attribute, value) { @@ -24182,13 +25464,13 @@ } else t1._contents = t3 + value; }, - $signature: 49 + $signature: 52 }; A.MediaType_toString__closure.prototype = { call$1(match) { return "\\" + A.S(match.$index(0, 0)); }, - $signature: 32 + $signature: 28 }; A.expectQuotedString_closure.prototype = { call$1(match) { @@ -24196,7 +25478,7 @@ t1.toString; return t1; }, - $signature: 32 + $signature: 28 }; A.Level.prototype = { $eq(_, other) { @@ -24244,7 +25526,7 @@ var record, _this = this, t1 = logLevel.value; if (t1 >= _this.get$level().value) { - if (stackTrace == null && t1 >= 2000) { + if ((stackTrace == null || stackTrace === B._StringStackTrace_OdL) && t1 >= 2000) { A.StackTrace_current(); if (error == null) logLevel.toString$0(0); @@ -24285,7 +25567,7 @@ $parent._children.$indexSet(0, thisName, t1); return t1; }, - $signature: 51 + $signature: 54 }; A.Context.prototype = { absolute$15(part1, part2, part3, part4, part5, part6, part7, part8, part9, part10, part11, part12, part13, part14, part15) { @@ -24361,7 +25643,7 @@ return parsed.toString$0(0); }, _needsNormalization$1(path) { - var t2, i, start, previous, t3, previousPrevious, codeUnit, t4, + var t2, i, start, previous, previousPrevious, codeUnit, t3, t1 = this.style, root = t1.rootLength$1(path); if (root !== 0) { @@ -24378,20 +25660,20 @@ start = 0; previous = null; } - for (t2 = new A.CodeUnits(path).__internal$_string, t3 = t2.length, i = start, previousPrevious = null; i < t3; ++i, previousPrevious = previous, previous = codeUnit) { + for (t2 = path.length, i = start, previousPrevious = null; i < t2; ++i, previousPrevious = previous, previous = codeUnit) { if (!(i >= 0)) - return A.ioore(t2, i); - codeUnit = t2.charCodeAt(i); + return A.ioore(path, i); + codeUnit = path.charCodeAt(i); if (t1.isSeparator$1(codeUnit)) { if (t1 === $.$get$Style_windows() && codeUnit === 47) return true; if (previous != null && t1.isSeparator$1(previous)) return true; if (previous === 46) - t4 = previousPrevious == null || previousPrevious === 46 || t1.isSeparator$1(previousPrevious); + t3 = previousPrevious == null || previousPrevious === 46 || t1.isSeparator$1(previousPrevious); else - t4 = false; - if (t4) + t3 = false; + if (t3) return true; } } @@ -24519,20 +25801,20 @@ call$1(part) { return A._asString(part) !== ""; }, - $signature: 31 + $signature: 22 }; A.Context_split_closure.prototype = { call$1(part) { return A._asString(part).length !== 0; }, - $signature: 31 + $signature: 22 }; A._validateArgList_closure.prototype = { call$1(arg) { A._asStringQ(arg); return arg == null ? "null" : '"' + arg + '"'; }, - $signature: 106 + $signature: 56 }; A.InternalStyle.prototype = { getRoot$1(path) { @@ -24986,11 +26268,11 @@ var t1 = this.$this; t1._onReleaseCompleters.removeFirst$0().complete$1(new A.PoolResource(t1)); }, - $signature: 6 + $signature: 4 }; A.Pool__runOnRelease_closure0.prototype = { call$2(error, stackTrace) { - type$.Object._as(error); + A._asObject(error); type$.StackTrace._as(stackTrace); this.$this._onReleaseCompleters.removeFirst$0().completeError$2(error, stackTrace); }, @@ -25363,10 +26645,9 @@ t4 = t1.__internal$_current; if (t4 == null) t4 = t2._as(t4); - if (t4 === 9) { - t4 = B.JSString_methods.$mul(" ", 4); - t3._contents += t4; - } else { + if (t4 === 9) + t3._contents += B.JSString_methods.$mul(" ", 4); + else { t4 = A.Primitives_stringFromCharCode(t4); t3._contents += t4; } @@ -25427,7 +26708,7 @@ call$0() { return this.color; }, - $signature: 54 + $signature: 57 }; A.Highlighter$__closure.prototype = { call$1(line) { @@ -25435,34 +26716,34 @@ t2 = A._arrayInstanceType(t1); return new A.WhereIterable(t1, t2._eval$1("bool(1)")._as(new A.Highlighter$___closure()), t2._eval$1("WhereIterable<1>")).get$length(0); }, - $signature: 55 + $signature: 33 }; A.Highlighter$___closure.prototype = { call$1(highlight) { var t1 = type$._Highlight._as(highlight).span; return t1.get$start().get$line() !== t1.get$end().get$line(); }, - $signature: 15 + $signature: 17 }; A.Highlighter$__closure0.prototype = { call$1(line) { return type$._Line._as(line).url; }, - $signature: 57 + $signature: 60 }; A.Highlighter__collateLines_closure.prototype = { call$1(highlight) { var t1 = type$._Highlight._as(highlight).span.get$sourceUrl(); return t1 == null ? new A.Object() : t1; }, - $signature: 58 + $signature: 61 }; A.Highlighter__collateLines_closure0.prototype = { call$2(highlight1, highlight2) { var t1 = type$._Highlight; return t1._as(highlight1).span.compareTo$1(0, t1._as(highlight2).span); }, - $signature: 59 + $signature: 62 }; A.Highlighter__collateLines_closure1.prototype = { call$1(entry) { @@ -25505,26 +26786,24 @@ } return lines; }, - $signature: 60 + $signature: 63 }; A.Highlighter__collateLines__closure.prototype = { call$1(highlight) { return type$._Highlight._as(highlight).span.get$end().get$line() < this.line.number; }, - $signature: 15 + $signature: 17 }; A.Highlighter_highlight_closure.prototype = { call$1(highlight) { type$._Highlight._as(highlight); return true; }, - $signature: 15 + $signature: 17 }; A.Highlighter__writeFileStart_closure.prototype = { call$0() { - var t1 = this.$this._buffer, - t2 = B.JSString_methods.$mul("\u2500", 2) + ">"; - t1._contents += t2; + this.$this._buffer._contents += B.JSString_methods.$mul("\u2500", 2) + ">"; return null; }, $signature: 0 @@ -25614,12 +26893,11 @@ tabsBefore = t1._countTabs$1(B.JSString_methods.substring$2(t4, 0, startColumn)); tabsInside = t1._countTabs$1(B.JSString_methods.substring$2(t4, startColumn, endColumn)); startColumn += tabsBefore * 3; - t4 = B.JSString_methods.$mul(" ", startColumn); - t2._contents += t4; - t4 = B.JSString_methods.$mul("^", Math.max(endColumn + (tabsBefore + tabsInside) * 3 - startColumn, 1)); - return (t2._contents += t4).length - t3.length; + t4 = (t2._contents += B.JSString_methods.$mul(" ", startColumn)) + B.JSString_methods.$mul("^", Math.max(endColumn + (tabsBefore + tabsInside) * 3 - startColumn, 1)); + t2._contents = t4; + return t4.length - t3.length; }, - $signature: 28 + $signature: 23 }; A.Highlighter__writeIndicator_closure0.prototype = { call$0() { @@ -25633,14 +26911,13 @@ t1 = _this.$this, t2 = t1._buffer, t3 = t2._contents; - if (_this.coversWholeLine) { - t1 = B.JSString_methods.$mul("\u2500", 3); - t2._contents += t1; - } else + if (_this.coversWholeLine) + t2._contents = t3 + B.JSString_methods.$mul("\u2500", 3); + else t1._writeArrow$3$beginning(_this.line, Math.max(_this.highlight.span.get$end().get$column() - 1, 0), false); return t2._contents.length - t3.length; }, - $signature: 28 + $signature: 23 }; A.Highlighter__writeSidebar_closure.prototype = { call$0() { @@ -25676,7 +26953,7 @@ } return A._Highlight__normalizeEndOfLine(A._Highlight__normalizeTrailingNewline(A._Highlight__normalizeNewlines(newSpan))); }, - $signature: 62 + $signature: 65 }; A._Line.prototype = { toString$0(_) { @@ -25866,13 +27143,13 @@ var t2, _this = this, t1 = serverUrl + "?sseClientId=" + _this._clientId; _this.__SseClient__serverUrl_A = t1; - t2 = type$.JSObject; - t1 = t2._as(new init.G.EventSource(t1, {withCredentials: true})); + t1 = A._asJSObject(new init.G.EventSource(t1, {withCredentials: true})); _this.__SseClient__eventSource_A = t1; new A._EventStream(t1, "open", false, type$._EventStream_JSObject).get$first(0).whenComplete$1(new A.SseClient_closure(_this)); _this.__SseClient__eventSource_A.addEventListener("message", A._functionToJS1(_this.get$_onIncomingMessage())); _this.__SseClient__eventSource_A.addEventListener("control", A._functionToJS1(_this.get$_onIncomingControlMessage())); t1 = type$.nullable_void_Function_JSObject; + t2 = type$.JSObject; A._EventStreamSubscription$(_this.__SseClient__eventSource_A, "open", t1._as(new A.SseClient_closure0(_this)), false, t2); A._EventStreamSubscription$(_this.__SseClient__eventSource_A, "error", t1._as(new A.SseClient_closure1(_this)), false, t2); }, @@ -25897,14 +27174,14 @@ t1.completeError$1(error); }, _onIncomingControlMessage$1(message) { - var data = type$.JSObject._as(message).data; + var data = A._asJSObject(message).data; if (J.$eq$(A.dartify(data), "close")) this.close$0(); else throw A.wrapException(A.UnsupportedError$("[" + this._clientId + '] Illegal Control Message "' + A.S(data) + '"')); }, _onIncomingMessage$1(message) { - this._incomingController.add$1(0, A._asString(B.C_JsonCodec.decode$2$reviver(A._asString(type$.JSObject._as(message).data), null))); + this._incomingController.add$1(0, A._asString(B.C_JsonCodec.decode$2$reviver(A._asString(A._asJSObject(message).data), null))); }, _onOutgoingDone$0() { this.close$0(); @@ -26008,9 +27285,8 @@ if (t1 == null) t1 = null; t1 = {method: "POST", body: t1, credentials: "include"}; - t2 = type$.JSObject; $async$goto = 6; - return A._asyncAwait(A.promiseToFuture(t2._as(t2._as(init.G.window).fetch(url, t1)), t2), $async$call$0); + return A._asyncAwait(A.promiseToFuture(A._asJSObject(A._asJSObject(init.G.window).fetch(url, t1)), type$.JSObject), $async$call$0); case 6: // returning from await. $async$handler = 1; @@ -26045,34 +27321,16 @@ }); return A._asyncStartSync($async$call$0, $async$completer); }, - $signature: 65 - }; - A.generateUuidV4_generateBits.prototype = { - call$1(bitCount) { - return this.random.nextInt$1(B.JSInt_methods._shlPositive$1(1, bitCount)); - }, - $signature: 27 - }; - A.generateUuidV4_printDigits.prototype = { - call$2(value, count) { - return B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(value, 16), count, "0"); - }, - $signature: 22 - }; - A.generateUuidV4_bitsDigits.prototype = { - call$2(bitCount, digitCount) { - return this.printDigits.call$2(this.generateBits.call$1(bitCount), digitCount); - }, - $signature: 22 + $signature: 68 }; A.GuaranteeChannel.prototype = { GuaranteeChannel$3$allowSinkErrors(innerSink, allowSinkErrors, _box_0, $T) { var _this = this, t1 = _this.$ti, - t2 = t1._eval$1("_GuaranteeSink<1>")._as(new A._GuaranteeSink(innerSink, _this, new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_dynamic), type$._AsyncCompleter_dynamic), allowSinkErrors, $T._eval$1("_GuaranteeSink<0>"))); + t2 = t1._eval$1("_GuaranteeSink<1>")._as(new A._GuaranteeSink(innerSink, _this, new A._AsyncCompleter(new A._Future($.Zone__current, type$._Future_void), type$._AsyncCompleter_void), allowSinkErrors, $T._eval$1("_GuaranteeSink<0>"))); _this.__GuaranteeChannel__sink_F !== $ && A.throwLateFieldAI("_sink"); _this.__GuaranteeChannel__sink_F = t2; - t1 = t1._eval$1("StreamController<1>")._as(A.StreamController_StreamController(null, new A.GuaranteeChannel_closure(_box_0, _this, $T), true, $T)); + t1 = t1._eval$1("StreamController<1>")._as(A.StreamController_StreamController(null, new A.GuaranteeChannel_closure(_box_0, _this, $T), null, true, $T)); _this.__GuaranteeChannel__streamController_F !== $ && A.throwLateFieldAI("_streamController"); _this.__GuaranteeChannel__streamController_F = t1; }, @@ -26167,7 +27425,7 @@ A._GuaranteeSink__addError_closure.prototype = { call$1(_) { }, - $signature: 6 + $signature: 4 }; A.StreamChannelController.prototype = {}; A.StreamChannelMixin.prototype = {$isStreamChannel: 1}; @@ -26241,46 +27499,78 @@ this.error$3$length$position("expected " + $name + ".", 0, this._string_scanner$_position); } }; - A.RNG.prototype = {}; - A.MathRNG.prototype = { + A.RNG.prototype = { + generate$0() { + var uint8list = this._generateInternal$0(); + if (uint8list.length !== 16) + throw A.wrapException(A.Exception_Exception("The length of the Uint8list returned by the custom RNG must be 16.")); + else + return uint8list; + } + }; + A.CryptoRNG.prototype = { _generateInternal$0() { - var t1, i, k, t2, t3, + var i, k, t1, t2, b = new Uint8Array(16); - for (t1 = this._rnd, i = 0; i < 16; i += 4) { - k = t1.nextInt$1(B.JSNumber_methods.toInt$0(Math.pow(2, 32))); + for (i = 0; i < 16; i += 4) { + k = $.$get$CryptoRNG__secureRandom().nextInt$1(B.JSNumber_methods.toInt$0(Math.pow(2, 32))); if (!(i < 16)) return A.ioore(b, i); b[i] = k; - t2 = i + 1; - t3 = B.JSInt_methods._shrOtherPositive$1(k, 8); - if (!(t2 < 16)) - return A.ioore(b, t2); - b[t2] = t3; - t3 = i + 2; - t2 = B.JSInt_methods._shrOtherPositive$1(k, 16); - if (!(t3 < 16)) - return A.ioore(b, t3); - b[t3] = t2; - t2 = i + 3; - t3 = B.JSInt_methods._shrOtherPositive$1(k, 24); + t1 = i + 1; + t2 = B.JSInt_methods._shrOtherPositive$1(k, 8); + if (!(t1 < 16)) + return A.ioore(b, t1); + b[t1] = t2; + t2 = i + 2; + t1 = B.JSInt_methods._shrOtherPositive$1(k, 16); if (!(t2 < 16)) return A.ioore(b, t2); - b[t2] = t3; + b[t2] = t1; + t1 = i + 3; + t2 = B.JSInt_methods._shrOtherPositive$1(k, 24); + if (!(t1 < 16)) + return A.ioore(b, t1); + b[t1] = t2; } return b; } }; A.UuidV1.prototype = { _init$0() { + var seedBytes, t1, t2, t3, t4, t5, t6; if ($.V1State_initialized) return; - var uint8list = $.$get$V1State_random()._generateInternal$0(); - $.V1State_nodeId = A._setArrayType([uint8list[0] | 1, uint8list[1], uint8list[2], uint8list[3], uint8list[4], uint8list[5]], type$.JSArray_int); - $.V1State_clockSeq = (uint8list[6] << 8 | uint8list[7]) & 262143; + seedBytes = $.$get$V1State_random().generate$0(); + t1 = seedBytes.length; + if (0 >= t1) + return A.ioore(seedBytes, 0); + t2 = seedBytes[0]; + if (1 >= t1) + return A.ioore(seedBytes, 1); + t3 = seedBytes[1]; + if (2 >= t1) + return A.ioore(seedBytes, 2); + t4 = seedBytes[2]; + if (3 >= t1) + return A.ioore(seedBytes, 3); + t5 = seedBytes[3]; + if (4 >= t1) + return A.ioore(seedBytes, 4); + t6 = seedBytes[4]; + if (5 >= t1) + return A.ioore(seedBytes, 5); + $.V1State_nodeId = A._setArrayType([t2 | 1, t3, t4, t5, t6, seedBytes[5]], type$.JSArray_int); + if (6 >= t1) + return A.ioore(seedBytes, 6); + t6 = seedBytes[6]; + if (7 >= t1) + return A.ioore(seedBytes, 7); + $.V1State_clockSeq = (t6 << 8 | seedBytes[7]) & 262143; $.V1State_initialized = true; }, generate$1$options(options) { - var buf, clockSeq, mSecs, t1, nSecs, t2, tl, tmh, node, n, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17; + var buf, clockSeq, mSecs, t1, nSecs, t2, tl, tmh, node, n, t3; this._init$0(); buf = new Uint8Array(16); clockSeq = $.V1State_clockSeq; @@ -26316,75 +27606,15 @@ buf[8] = buf[8] | 128; node = $.V1State_nodeId; for (t1 = node.length, n = 0; n < 6; ++n) { + t2 = 10 + n; if (!(n < t1)) return A.ioore(node, n); - buf[10 + n] = node[n]; + t3 = node[n]; + if (!(t2 < 16)) + return A.ioore(buf, t2); + buf[t2] = t3; } - t1 = $.$get$UuidParsing__byteToHex(); - t2 = buf[0]; - if (!(t2 < 256)) - return A.ioore(t1, t2); - t2 = t1[t2]; - t3 = buf[1]; - if (!(t3 < 256)) - return A.ioore(t1, t3); - t3 = t1[t3]; - t4 = buf[2]; - if (!(t4 < 256)) - return A.ioore(t1, t4); - t4 = t1[t4]; - t5 = buf[3]; - if (!(t5 < 256)) - return A.ioore(t1, t5); - t5 = t1[t5]; - t6 = buf[4]; - if (!(t6 < 256)) - return A.ioore(t1, t6); - t6 = t1[t6]; - t7 = buf[5]; - if (!(t7 < 256)) - return A.ioore(t1, t7); - t7 = t1[t7]; - t8 = buf[6]; - if (!(t8 < 256)) - return A.ioore(t1, t8); - t8 = t1[t8]; - t9 = buf[7]; - if (!(t9 < 256)) - return A.ioore(t1, t9); - t9 = t1[t9]; - t10 = buf[8]; - if (!(t10 < 256)) - return A.ioore(t1, t10); - t10 = t1[t10]; - t11 = buf[9]; - if (!(t11 < 256)) - return A.ioore(t1, t11); - t11 = t1[t11]; - t12 = buf[10]; - if (!(t12 < 256)) - return A.ioore(t1, t12); - t12 = t1[t12]; - t13 = buf[11]; - if (!(t13 < 256)) - return A.ioore(t1, t13); - t13 = t1[t13]; - t14 = buf[12]; - if (!(t14 < 256)) - return A.ioore(t1, t14); - t14 = t1[t14]; - t15 = buf[13]; - if (!(t15 < 256)) - return A.ioore(t1, t15); - t15 = t1[t15]; - t16 = buf[14]; - if (!(t16 < 256)) - return A.ioore(t1, t16); - t16 = t1[t16]; - t17 = buf[15]; - if (!(t17 < 256)) - return A.ioore(t1, t17); - return t2 + t3 + t4 + t5 + "-" + t6 + t7 + "-" + t8 + t9 + "-" + t10 + t11 + "-" + t12 + t13 + t14 + t15 + t16 + t1[t17]; + return A.UuidParsing_unparse(buf); } }; A.EventStreamProvider.prototype = {}; @@ -26448,13 +27678,13 @@ }; A._EventStreamSubscription_closure.prototype = { call$1(e) { - return this.onData.call$1(type$.JSObject._as(e)); + return this.onData.call$1(A._asJSObject(e)); }, $signature: 2 }; A._EventStreamSubscription_onData_closure.prototype = { call$1(e) { - return this.handleData.call$1(type$.JSObject._as(e)); + return this.handleData.call$1(A._asJSObject(e)); }, $signature: 2 }; @@ -26500,22 +27730,22 @@ }; A.BrowserWebSocket_connect_closure.prototype = { call$1(_) { - type$.JSObject._as(_); + A._asJSObject(_); this.webSocketConnected.complete$1(this.browserSocket); }, - $signature: 8 + $signature: 14 }; A.BrowserWebSocket_connect_closure0.prototype = { call$1(e) { var t1; - type$.JSObject._as(e); + A._asJSObject(e); t1 = this.webSocketConnected; if ((t1.future._state & 30) === 0) - t1.completeError$1(new A.WebSocketException()); + t1.completeError$1(new A.WebSocketException("Failed to connect WebSocket")); else this.browserSocket._browser_web_socket$_closed$2(1006, "error"); }, - $signature: 8 + $signature: 14 }; A.BrowserWebSocket_connect_closure1.prototype = { call$1(e) { @@ -26528,8 +27758,8 @@ data = A._Cell$named("data"); if (typeof t2 === "string") data.__late_helper$_value = new A.TextDataReceived(A._asString(t2)); - else if (typeof t2 === "object" && A.JSAnyUtilityExtension_instanceOfString(type$.JSObject._as(t2), "ArrayBuffer")) - data.__late_helper$_value = new A.BinaryDataReceived(A.NativeUint8List_NativeUint8List$view(type$.NativeByteBuffer._as(t2), 0, null)); + else if (typeof t2 === "object" && A.JSAnyUtilityExtension_instanceOfString(A._asJSObject(t2), "ArrayBuffer")) + data.__late_helper$_value = new A.BinaryDataReceived(A.NativeUint8List_NativeUint8List$view(type$.NativeArrayBuffer._as(t2), 0, null)); else throw A.wrapException(A.StateError$("unexpected message type: " + J.get$runtimeType$(t2).toString$0(0))); t1.add$1(0, data._readLocal$0()); @@ -26539,13 +27769,13 @@ A.BrowserWebSocket_connect_closure2.prototype = { call$1($event) { var t1; - type$.JSObject._as($event); + A._asJSObject($event); t1 = this.webSocketConnected; if ((t1.future._state & 30) === 0) t1.complete$1(this.browserSocket); this.browserSocket._browser_web_socket$_closed$2(A._asInt($event.code), A._asString($event.reason)); }, - $signature: 8 + $signature: 14 }; A.WebSocketEvent.prototype = {}; A.TextDataReceived.prototype = { @@ -26594,8 +27824,25 @@ return "CloseReceived(" + this.code + ", " + this.reason + ")"; } }; - A.WebSocketException.prototype = {$isException: 1}; - A.WebSocketConnectionClosed.prototype = {}; + A.WebSocketException.prototype = { + toString$0(_) { + var t1 = this.message; + if (t1.length === 0) + return "WebSocketException"; + else + return "WebSocketException: " + t1; + }, + $isException: 1 + }; + A.WebSocketConnectionClosed.prototype = { + toString$0(_) { + var t1 = this.message; + if (t1.length === 0) + return "WebSocketConnectionClosed"; + else + return "WebSocketConnectionClosed: " + t1; + } + }; A.AdapterWebSocketChannel.prototype = { AdapterWebSocketChannel$1(webSocket) { webSocket.then$1$2$onError(new A.AdapterWebSocketChannel_closure(this), new A.AdapterWebSocketChannel_closure0(this), type$.Null); @@ -26617,7 +27864,7 @@ A._asString(webSocket._webSocket.protocol); t2._readyCompleter.complete$0(); }, - $signature: 67 + $signature: 70 }; A.AdapterWebSocketChannel__closure.prototype = { call$1($event) { @@ -26653,7 +27900,7 @@ } } }, - $signature: 68 + $signature: 71 }; A.AdapterWebSocketChannel__closure0.prototype = { call$1(obj) { @@ -26699,7 +27946,7 @@ throw exception; } }, - $signature: 9 + $signature: 8 }; A.AdapterWebSocketChannel__closure1.prototype = { call$0() { @@ -26755,7 +28002,7 @@ A.AdapterWebSocketChannel_closure0.prototype = { call$1(e) { var error, t1, t2; - type$.Object._as(e); + A._asObject(e); error = e instanceof A.TimeoutException ? e : new A.WebSocketChannelException(J.toString$0$(e)); t1 = this.$this; t1._readyCompleter.completeError$1(error); @@ -26768,7 +28015,7 @@ t1 === $ && A.throwLateFieldNI("_sink"); t1.close$0(); }, - $signature: 69 + $signature: 72 }; A._WebSocketSink.prototype = {$isWebSocketSink: 1}; A.WebSocketChannelException.prototype = { @@ -26784,7 +28031,7 @@ $call$body$main_closure() { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), - uri, t2, fixedPath, fixedUri, client, _0_0, t3, manager, t4, t5, t6, debugEventController, t7, _box_0, t1; + uri, fixedPath, fixedUri, client, _0_0, t2, manager, t3, t4, t5, debugEventController, t6, _box_0, t1; var $async$call$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -26797,10 +28044,9 @@ if (A._asStringQ(t1.$dartAppInstanceId) == null) t1.$dartAppInstanceId = new A.UuidV1(null).generate$1$options(null); uri = A.Uri_parse(A._asString(t1.$dwdsDevHandlerPath)); - t2 = type$.JSObject; - if (A._asString(t2._as(t2._as(t1.window).location).protocol) === "https:" && uri.get$scheme() === "http" && uri.get$host() !== "localhost") + if (A._asString(A._asJSObject(A._asJSObject(t1.window).location).protocol) === "https:" && uri.get$scheme() === "http" && uri.get$host() !== "localhost") uri = uri.replace$1$scheme("https"); - else if (A._asString(t2._as(t2._as(t1.window).location).protocol) === "wss:" && uri.get$scheme() === "ws" && uri.get$host() !== "localhost") + else if (A._asString(A._asJSObject(A._asJSObject(t1.window).location).protocol) === "wss:" && uri.get$scheme() === "ws" && uri.get$host() !== "localhost") uri = uri.replace$1$scheme("wss"); fixedPath = uri.toString$0(0); fixedUri = A.Uri_parse(fixedPath); @@ -26814,60 +28060,57 @@ return A._asyncAwait(A.RequireRestarter_create(), $async$call$0); case 5: // returning from await. - t3 = $async$result; + t2 = $async$result; // goto break $label0$0 $async$goto = 2; break; case 4: // join if ("ddc-library-bundle" === _0_0) { - t3 = new A.DdcLibraryBundleRestarter(); + t2 = new A.DdcLibraryBundleRestarter(); // goto break $label0$0 $async$goto = 2; break; } if ("ddc" === _0_0 || "legacy" === _0_0) { - t3 = new A.DdcRestarter(); + t2 = new A.DdcRestarter(); // goto break $label0$0 $async$goto = 2; break; } - t3 = A.throwExpression(A.StateError$("Unknown module strategy: " + A.S(A.getProperty(A.staticInteropGlobalContext(), "$dartModuleStrategy", type$.String)))); + t2 = A.throwExpression(A.StateError$("Unknown module strategy: " + A.S(A.getProperty(A.staticInteropGlobalContext(), "$dartModuleStrategy", type$.String)))); case 2: // break $label0$0 - manager = new A.ReloadingManager(client, t3); + manager = new A.ReloadingManager(client, t2); t1.$dartHotReloadStartDwds = A._functionToJS0(new A.main__closure(manager)); t1.$dartHotReloadEndDwds = A._functionToJS0(new A.main__closure0(manager)); _box_0.readyToRunMainCompleter = null; t1.$dartHotRestartDwds = A._functionToJS2(new A.main__closure1(_box_0, manager)); t1.$dartReadyToRunMain = A._functionToJS0(new A.main__closure2(_box_0)); - t3 = $.Zone__current; - t4 = Math.max(100, 1); - t5 = A.StreamController_StreamController(null, null, false, type$.DebugEvent); - t6 = A.StreamController_StreamController(null, null, false, type$.List_DebugEvent); - debugEventController = new A.BatchedStreamController(t4, 1000, t5, t6, new A._AsyncCompleter(new A._Future(t3, type$._Future_bool), type$._AsyncCompleter_bool), type$.BatchedStreamController_DebugEvent); - t3 = A.List_List$filled(A.QueueList__computeInitialCapacity(null), null, false, type$.nullable_Result_DebugEvent); - t4 = A.ListQueue$(type$._EventRequest_dynamic); - t7 = type$.StreamQueue_DebugEvent; - debugEventController.__BatchedStreamController__inputQueue_A = t7._as(new A.StreamQueue(new A._ControllerStream(t5, A._instanceType(t5)._eval$1("_ControllerStream<1>")), new A.QueueList(t3, 0, 0, type$.QueueList_Result_DebugEvent), t4, t7)); + t2 = $.Zone__current; + t3 = Math.max(100, 1); + t4 = A.StreamController_StreamController(null, null, null, false, type$.DebugEvent); + t5 = A.StreamController_StreamController(null, null, null, false, type$.List_DebugEvent); + debugEventController = new A.BatchedStreamController(t3, 1000, t4, t5, new A._AsyncCompleter(new A._Future(t2, type$._Future_bool), type$._AsyncCompleter_bool), type$.BatchedStreamController_DebugEvent); + t2 = A.List_List$filled(A.QueueList__computeInitialCapacity(null), null, false, type$.nullable_Result_DebugEvent); + t3 = A.ListQueue$(type$._EventRequest_dynamic); + t6 = type$.StreamQueue_DebugEvent; + debugEventController.__BatchedStreamController__inputQueue_A = t6._as(new A.StreamQueue(new A._ControllerStream(t4, A._instanceType(t4)._eval$1("_ControllerStream<1>")), new A.QueueList(t2, 0, 0, type$.QueueList_Result_DebugEvent), t3, t6)); A.safeUnawaited(debugEventController._batchAndSendEvents$0()); - new A._ControllerStream(t6, A._instanceType(t6)._eval$1("_ControllerStream<1>")).listen$1(new A.main__closure3(client)); + new A._ControllerStream(t5, A._instanceType(t5)._eval$1("_ControllerStream<1>")).listen$1(new A.main__closure3(client)); t1.$emitDebugEvent = A._functionToJS2(new A.main__closure4(debugEventController)); t1.$emitRegisterEvent = A._functionToJS1(new A.main__closure5(client)); t1.$launchDevTools = A._functionToJS0(new A.main__closure6(client)); client.get$stream().listen$2$onError(new A.main__closure7(manager, client), new A.main__closure8()); if (A._asBool(t1.$dwdsEnableDevToolsLaunch)) - A._EventStreamSubscription$(t2._as(t1.window), "keydown", type$.nullable_void_Function_JSObject._as(new A.main__closure9()), false, t2); + A._EventStreamSubscription$(A._asJSObject(t1.window), "keydown", type$.nullable_void_Function_JSObject._as(new A.main__closure9()), false, type$.JSObject); if (A._asString(t1.$dartModuleStrategy) !== "ddc-library-bundle") if (A._isChromium()) A._sendConnectRequest(client.get$sink()); else A.runMain(); - else { + else A._sendConnectRequest(client.get$sink()); - if (A._asBool(t1.$useDwdsWebSocketConnection)) - A.runMain(); - } A._launchCommunicationWithDebugExtension(); // implicit return return A._asyncReturn(null, $async$completer); @@ -26905,7 +28148,12 @@ call$1(runId) { return this.call$2(runId, null); }, - $signature: 71 + "call*": "call$2", + $requiredArgCount: 1, + $defaultValues() { + return [null]; + }, + $signature: 74 }; A.main__closure2.prototype = { call$0() { @@ -26932,7 +28180,7 @@ A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._debug_event$_build$0()), null), type$.dynamic); } }, - $signature: 72 + $signature: 75 }; A.main___closure2.prototype = { call$1(b) { @@ -26941,7 +28189,7 @@ b.get$_debug_event$_$this().set$_events(t1); return t1; }, - $signature: 73 + $signature: 76 }; A.main__closure4.prototype = { call$2(kind, eventData) { @@ -26955,7 +28203,7 @@ A._trySendEvent(new A._StreamSinkWrapper(t1, A._instanceType(t1)._eval$1("_StreamSinkWrapper<1>")), t2._debug_event$_build$0(), type$.DebugEvent); } }, - $signature: 74 + $signature: 77 }; A.main___closure1.prototype = { call$1(b) { @@ -26965,7 +28213,7 @@ b.get$_debug_event$_$this()._eventData = this.eventData; return b; }, - $signature: 75 + $signature: 78 }; A.main__closure5.prototype = { call$1(eventData) { @@ -26977,7 +28225,7 @@ type$.nullable_void_Function_RegisterEventBuilder._as(new A.main___closure0(eventData)).call$1(t3); A._trySendEvent(t1, B.C_JsonCodec.encode$2$toEncodable(t2.serialize$1(t3._register_event$_build$0()), null), type$.dynamic); }, - $signature: 76 + $signature: 79 }; A.main___closure0.prototype = { call$1(b) { @@ -26986,13 +28234,13 @@ b.get$_register_event$_$this()._register_event$_eventData = this.eventData; return b; }, - $signature: 77 + $signature: 80 }; A.main__closure6.prototype = { call$0() { var t1, t2, t3; if (!A._isChromium()) { - type$.JSObject._as(init.G.window).alert("Dart DevTools is only supported on Chromium based browsers."); + A._asJSObject(init.G.window).alert("Dart DevTools is only supported on Chromium based browsers."); return; } t1 = this.client.get$sink(); @@ -27012,7 +28260,7 @@ b.get$_devtools_request$_$this()._devtools_request$_instanceId = t1; return b; }, - $signature: 78 + $signature: 81 }; A.main__closure7.prototype = { call$1(serialized) { @@ -27021,7 +28269,7 @@ $call$body$main__closure(serialized) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), - $async$self = this, t1, t2, $alert, t3, $event; + $async$self = this, t1, $alert, t2, $event; var $async$call$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -27039,8 +28287,7 @@ break; case 5: // then - t2 = type$.JSObject; - t2._as(t2._as(t1.window).location).reload(); + A._asJSObject(A._asJSObject(t1.window).location).reload(); // goto join $async$goto = 6; break; @@ -27089,13 +28336,12 @@ // then if (!$event.success) { $alert = "DevTools failed to open with:\n" + A.S($event.error); - t1 = $event.promptExtension && A._asBool(type$.JSObject._as(init.G.window).confirm($alert)); + t1 = $event.promptExtension && A._asBool(A._asJSObject(init.G.window).confirm($alert)); t2 = init.G; - t3 = type$.JSObject; if (t1) - type$.nullable_JSObject._as(t3._as(t2.window).open("https://dart.dev/to/web-debug-extension", "_blank")); + A._asJSObjectQ(A._asJSObject(t2.window).open("https://dart.dev/to/web-debug-extension", "_blank")); else - t3._as(t2.window).alert($alert); + A._asJSObject(t2.window).alert($alert); } // goto join $async$goto = 17; @@ -27116,20 +28362,50 @@ break; case 22: // then - type$.JSObject._as(init.G.window).reportError("Error from backend:\n\nError: " + $event.error + "\n\nStack Trace:\n" + $event.stackTrace); + A._asJSObject(init.G.window).reportError("Error from backend:\n\nError: " + $event.error + "\n\nStack Trace:\n" + $event.stackTrace); // goto join $async$goto = 23; break; case 24: // else - $async$goto = $event instanceof A._$HotReloadRequest ? 25 : 26; + $async$goto = $event instanceof A._$HotReloadRequest ? 25 : 27; break; case 25: // then - $async$goto = 27; + $async$goto = 28; return A._asyncAwait(A.handleWebSocketHotReloadRequest($event, $async$self.manager, $async$self.client.get$sink()), $async$call$1); + case 28: + // returning from await. + // goto join + $async$goto = 26; + break; case 27: + // else + $async$goto = $event instanceof A._$HotRestartRequest ? 29 : 31; + break; + case 29: + // then + $async$goto = 32; + return A._asyncAwait(A.handleWebSocketHotRestartRequest($event, $async$self.manager, $async$self.client.get$sink()), $async$call$1); + case 32: + // returning from await. + // goto join + $async$goto = 30; + break; + case 31: + // else + $async$goto = $event instanceof A._$ServiceExtensionRequest ? 33 : 34; + break; + case 33: + // then + $async$goto = 35; + return A._asyncAwait(A.handleServiceExtensionRequest($event, $async$self.client.get$sink(), $async$self.manager), $async$call$1); + case 35: // returning from await. + case 34: + // join + case 30: + // join case 26: // join case 23: @@ -27146,12 +28422,12 @@ }); return A._asyncStartSync($async$call$1, $async$completer); }, - $signature: 79 + $signature: 82 }; A.main__closure8.prototype = { call$1(error) { }, - $signature: 6 + $signature: 4 }; A.main__closure9.prototype = { call$1(e) { @@ -27166,11 +28442,11 @@ }; A.main_closure0.prototype = { call$2(error, stackTrace) { - type$.Object._as(error); + A._asObject(error); type$.StackTrace._as(stackTrace); A.print("Unhandled error detected in the injected client.js script.\n\nYou can disable this script in webdev by passing --no-injected-client if it\nis preventing your app from loading, but note that this will also prevent\nall debugging and hot reload/restart functionality from working.\n\nThe original error is below, please file an issue at\nhttps://github.com/dart-lang/webdev/issues/new and attach this output:\n\n" + A.S(error) + "\n" + stackTrace.toString$0(0) + "\n"); }, - $signature: 14 + $signature: 9 }; A._sendConnectRequest_closure.prototype = { call$1(b) { @@ -27183,11 +28459,11 @@ b.get$_connect_request$_$this()._entrypointPath = t1; return b; }, - $signature: 80 + $signature: 83 }; A._launchCommunicationWithDebugExtension_closure.prototype = { call$1(b) { - var t3, t4, + var t3, t1 = init.G, t2 = A._asString(t1.$dartEntrypointPath); b.get$_$this()._appEntrypointPath = t2; @@ -27196,10 +28472,9 @@ b.get$_$this()._appId = t3; t3 = A._asStringQ(t1.$dartAppInstanceId); b.get$_$this()._appInstanceId = t3; - t3 = type$.JSObject; - t4 = A._asString(t3._as(t3._as(t1.window).location).origin); - b.get$_$this()._appOrigin = t4; - t3 = A._asString(t3._as(t3._as(t1.window).location).href); + t3 = A._asString(A._asJSObject(A._asJSObject(t1.window).location).origin); + b.get$_$this()._appOrigin = t3; + t3 = A._asString(A._asJSObject(A._asJSObject(t1.window).location).href); b.get$_$this()._appUrl = t3; t3 = A._authUrl(); b.get$_$this()._authUrl = t3; @@ -27213,13 +28488,13 @@ b.get$_$this()._workspaceName = t1; return b; }, - $signature: 81 + $signature: 110 }; A._handleAuthRequest_closure.prototype = { call$1(isAuthenticated) { return A._dispatchEvent("dart-auth-response", "" + A._asBool(isAuthenticated)); }, - $signature: 82 + $signature: 85 }; A._sendResponse_closure.prototype = { call$1(b) { @@ -27263,7 +28538,7 @@ restart$2$readyToRunMain$runId(readyToRunMain, runId) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.bool), - $async$returnValue, $async$self = this, mainHandler, t1, t2; + $async$returnValue, $async$self = this, mainHandler, t1; var $async$restart$2$readyToRunMain$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -27272,15 +28547,14 @@ case 0: // Function start t1 = init.G; - t2 = type$.JSObject; $async$goto = 3; - return A._asyncAwait(A._Debugger_maybeInvokeFlutterDisassemble(t2._as(t2._as(t1.dartDevEmbedder).debugger)), $async$restart$2$readyToRunMain$runId); + return A._asyncAwait(A._Debugger_maybeInvokeFlutterDisassemble(A._asJSObject(A._asJSObject(t1.dartDevEmbedder).debugger)), $async$restart$2$readyToRunMain$runId); case 3: // returning from await. mainHandler = A._functionToJS1(new A.DdcLibraryBundleRestarter_restart_closure($async$self, readyToRunMain)); - t2._as(t2._as(t1.dartDevEmbedder).config).capturedMainHandler = mainHandler; + A._asJSObject(A._asJSObject(t1.dartDevEmbedder).config).capturedMainHandler = mainHandler; $async$goto = 4; - return A._asyncAwait(A.promiseToFuture(t2._as(t2._as(t1.dartDevEmbedder).hotRestart()), type$.nullable_Object), $async$restart$2$readyToRunMain$runId); + return A._asyncAwait(A.promiseToFuture(A._asJSObject(A._asJSObject(t1.dartDevEmbedder).hotRestart()), type$.nullable_Object), $async$restart$2$readyToRunMain$runId); case 4: // returning from await. $async$returnValue = true; @@ -27297,7 +28571,7 @@ hotReloadStart$1(hotReloadSourcesPath) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.JSArray_nullable_Object), - $async$returnValue, $async$self = this, t4, srcModuleLibraries, filesToLoad, librariesToReload, t5, t6, t7, srcModuleLibraryCast, src, libraries, t8, t1, t2, t3, xhr, $async$temp1, $async$temp2, $async$temp3; + $async$returnValue, $async$self = this, t3, srcModuleLibraries, filesToLoad, librariesToReload, t4, t5, t6, srcModuleLibraryCast, src, libraries, t7, t1, t2, xhr, $async$temp1, $async$temp2, $async$temp3; var $async$hotReloadStart$1 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -27307,15 +28581,14 @@ // Function start t1 = new A._Future($.Zone__current, type$._Future_String); t2 = init.G; - t3 = type$.JSObject; - xhr = t3._as(new t2.XMLHttpRequest()); + xhr = A._asJSObject(new t2.XMLHttpRequest()); xhr.withCredentials = true; xhr.onreadystatechange = A._functionToJS0(new A.DdcLibraryBundleRestarter_hotReloadStart_closure(xhr, new A._AsyncCompleter(t1, type$._AsyncCompleter_String))); xhr.open("GET", hotReloadSourcesPath, true); xhr.send(); - t4 = type$.List_dynamic; + t3 = type$.List_dynamic; $async$temp1 = J; - $async$temp2 = t4; + $async$temp2 = t3; $async$temp3 = B.C_JsonCodec; $async$goto = 3; return A._asyncAwait(t1, $async$hotReloadStart$1); @@ -27325,17 +28598,17 @@ t1 = type$.JSArray_nullable_Object; filesToLoad = t1._as(new t2.Array()); librariesToReload = t1._as(new t2.Array()); - for (t5 = srcModuleLibraries.get$iterator(srcModuleLibraries), t6 = type$.String, t7 = type$.Object; t5.moveNext$0();) { - srcModuleLibraryCast = t5.get$current().cast$2$0(0, t6, t7); + for (t4 = srcModuleLibraries.get$iterator(srcModuleLibraries), t5 = type$.String, t6 = type$.Object; t4.moveNext$0();) { + srcModuleLibraryCast = t4.get$current().cast$2$0(0, t5, t6); src = A._asString(srcModuleLibraryCast.$index(0, "src")); - libraries = J.cast$1$0$ax(t4._as(srcModuleLibraryCast.$index(0, "libraries")), t6); + libraries = J.cast$1$0$ax(t3._as(srcModuleLibraryCast.$index(0, "libraries")), t5); filesToLoad.push(src); - for (t8 = libraries.get$iterator(libraries); t8.moveNext$0();) - librariesToReload.push(t8.get$current()); + for (t7 = libraries.get$iterator(libraries); t7.moveNext$0();) + librariesToReload.push(t7.get$current()); } - t3._as(t3._as(t2.dartDevEmbedder).config).capturedHotReloadEndHandler = A._functionToJS1(new A.DdcLibraryBundleRestarter_hotReloadStart_closure0($async$self)); + A._asJSObject(A._asJSObject(t2.dartDevEmbedder).config).capturedHotReloadEndHandler = A._functionToJS1(new A.DdcLibraryBundleRestarter_hotReloadStart_closure0($async$self)); $async$goto = 4; - return A._asyncAwait(A.promiseToFuture(t3._as(t3._as(t2.dartDevEmbedder).hotReload(filesToLoad, librariesToReload)), type$.nullable_Object), $async$hotReloadStart$1); + return A._asyncAwait(A.promiseToFuture(A._asJSObject(A._asJSObject(t2.dartDevEmbedder).hotReload(filesToLoad, librariesToReload)), type$.nullable_Object), $async$hotReloadStart$1); case 4: // returning from await. $async$returnValue = t1._as(A.jsify(srcModuleLibraries)); @@ -27352,7 +28625,7 @@ hotReloadEnd$0() { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.void), - $async$self = this, t1; + $async$self = this; var $async$hotReloadEnd$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -27361,8 +28634,7 @@ case 0: // Function start $async$self._capturedHotReloadEndCallback.call(); - t1 = type$.JSObject; - t1._as(t1._as(init.G.dartDevEmbedder).config).capturedHotReloadEndHandler = null; + A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).config).capturedHotReloadEndHandler = null; $async$self._capturedHotReloadEndCallback = null; // implicit return return A._asyncReturn(null, $async$completer); @@ -27370,14 +28642,81 @@ }); return A._asyncStartSync($async$hotReloadEnd$0, $async$completer); }, + handleServiceExtension$2(method, args) { + return this.handleServiceExtension$body$DdcLibraryBundleRestarter(method, type$.Map_String_dynamic._as(args)); + }, + handleServiceExtension$body$DdcLibraryBundleRestarter(method, args) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.nullable_Map_String_dynamic), + $async$returnValue, t1, t2, params, $async$temp1, $async$temp2; + var $async$handleServiceExtension$2 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + switch ($async$goto) { + case 0: + // Function start + $async$goto = method === "ext.flutter.reassemble" ? 3 : 5; + break; + case 3: + // then + $async$goto = 6; + return A._asyncAwait(A._Debugger_maybeInvokeFlutterReassemble(A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).debugger)), $async$handleServiceExtension$2); + case 6: + // returning from await. + $async$returnValue = A.LinkedHashMap_LinkedHashMap$_literal(["status", "reassemble invoked"], type$.String, type$.dynamic); + // goto return + $async$goto = 1; + break; + // goto join + $async$goto = 4; + break; + case 5: + // else + $async$goto = method === "getExtensionRpcs" ? 7 : 9; + break; + case 7: + // then + t1 = type$.JSArray_nullable_Object._as(A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).debugger).extensionNames); + t1 = type$.List_String._is(t1) ? t1 : new A.CastList(t1, A._arrayInstanceType(t1)._eval$1("CastList<1,String>")); + t2 = type$.String; + $async$returnValue = A.LinkedHashMap_LinkedHashMap$_literal(["rpcs", J.cast$1$0$ax(t1, t2)], t2, type$.dynamic); + // goto return + $async$goto = 1; + break; + // goto join + $async$goto = 8; + break; + case 9: + // else + params = args.get$isNotEmpty(args) ? B.C_JsonCodec.encode$2$toEncodable(args, null) : "{}"; + $async$temp1 = type$.Map_String_dynamic; + $async$temp2 = B.C_JsonCodec; + $async$goto = 10; + return A._asyncAwait(A.promiseToFuture(A._asJSObject(A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).debugger).invokeExtension(method, params)), type$.String), $async$handleServiceExtension$2); + case 10: + // returning from await. + $async$returnValue = $async$temp1._as($async$temp2.decode$2$reviver($async$result, null)); + // goto return + $async$goto = 1; + break; + case 8: + // join + case 4: + // join + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$handleServiceExtension$2, $async$completer); + }, $isRestarter: 1 }; A.DdcLibraryBundleRestarter_restart_closure.prototype = { call$1(runMain) { - var t1; type$.JavaScriptFunction._as(runMain); - t1 = type$.JSObject; - t1._as(t1._as(init.G.dartDevEmbedder).config).capturedMainHandler = null; + A._asJSObject(A._asJSObject(init.G.dartDevEmbedder).config).capturedMainHandler = null; A.safeUnawaited(this.$this._runMainWhenReady$2(this.readyToRunMain, runMain)); }, $signature: 20 @@ -27413,8 +28752,7 @@ t3 = readyToRunMain == null ? null : A.FutureOfVoidToJSPromise_get_toJS(readyToRunMain); t2.reload(runId, t3); t3 = new A._Future($.Zone__current, type$._Future_bool); - t2 = type$.JSObject; - $async$returnValue = t3.then$1$1(new A.DdcRestarter_restart_closure(A._EventStreamSubscription$(t2._as(t1.window), "message", type$.nullable_void_Function_JSObject._as(new A.DdcRestarter_restart_closure0(new A._AsyncCompleter(t3, type$._AsyncCompleter_bool))), false, t2)), type$.bool); + $async$returnValue = t3.then$1$1(new A.DdcRestarter_restart_closure(A._EventStreamSubscription$(A._asJSObject(t1.window), "message", type$.nullable_void_Function_JSObject._as(new A.DdcRestarter_restart_closure0(new A._AsyncCompleter(t3, type$._AsyncCompleter_bool))), false, type$.JSObject)), type$.bool); // goto return $async$goto = 1; break; @@ -27448,7 +28786,7 @@ this.sub.cancel$0(); return value; }, - $signature: 84 + $signature: 87 }; A.ReloadingManager.prototype = { hotRestart$2$readyToRunMain$runId(readyToRunMain, runId) { @@ -27509,6 +28847,46 @@ }); return A._asyncStartSync($async$hotReloadEnd$0, $async$completer); }, + handleServiceExtension$2(method, args) { + return this.handleServiceExtension$body$ReloadingManager(method, type$.Map_String_dynamic._as(args)); + }, + handleServiceExtension$body$ReloadingManager(method, args) { + var $async$goto = 0, + $async$completer = A._makeAsyncAwaitCompleter(type$.nullable_Map_String_dynamic), + $async$returnValue, $async$self = this, restarter; + var $async$handleServiceExtension$2 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { + if ($async$errorCode === 1) + return A._asyncRethrow($async$result, $async$completer); + while (true) + switch ($async$goto) { + case 0: + // Function start + restarter = $async$self._restarter; + $async$goto = restarter instanceof A.DdcLibraryBundleRestarter ? 3 : 4; + break; + case 3: + // then + $async$goto = 5; + return A._asyncAwait(restarter.handleServiceExtension$2(method, args), $async$handleServiceExtension$2); + case 5: + // returning from await. + $async$returnValue = $async$result; + // goto return + $async$goto = 1; + break; + case 4: + // join + $async$returnValue = null; + // goto return + $async$goto = 1; + break; + case 1: + // return + return A._asyncReturn($async$returnValue, $async$completer); + } + }); + return A._asyncStartSync($async$handleServiceExtension$2, $async$completer); + }, _afterRestart$1(succeeded) { var t1, t2; if (!succeeded) @@ -27528,7 +28906,7 @@ restart$2$readyToRunMain$runId(readyToRunMain, runId) { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.bool), - $async$returnValue, $async$self = this, newDigests, modulesToLoad, t3, t4, t5, t6, t7, line, toZone, t8, result, t1, t2; + $async$returnValue, $async$self = this, newDigests, modulesToLoad, t3, t4, t5, t6, line, toZone, t7, result, t1, t2; var $async$restart$2$readyToRunMain$runId = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -27548,31 +28926,31 @@ // returning from await. newDigests = $async$result; modulesToLoad = A._setArrayType([], type$.JSArray_String); - for (t3 = newDigests.get$keys(), t3 = t3.get$iterator(t3), t4 = $.RequireRestarter____lastKnownDigests._name, t5 = type$.JSObject; t3.moveNext$0();) { - t6 = t3.get$current(); - t7 = $.RequireRestarter____lastKnownDigests.__late_helper$_value; - if (t7 === $.RequireRestarter____lastKnownDigests) + for (t3 = newDigests.get$keys(), t3 = t3.get$iterator(t3), t4 = $.RequireRestarter____lastKnownDigests._name; t3.moveNext$0();) { + t5 = t3.get$current(); + t6 = $.RequireRestarter____lastKnownDigests.__late_helper$_value; + if (t6 === $.RequireRestarter____lastKnownDigests) A.throwExpression(A.LateError$fieldNI(t4)); - if (!t7.containsKey$1(t6)) { - line = "Error during script reloading, refreshing the page. \nUnable to find an existing digest for module: " + t6 + "."; + if (!t6.containsKey$1(t5)) { + line = "Error during script reloading, refreshing the page. \nUnable to find an existing digest for module: " + t5 + "."; toZone = $.printToZone; if (toZone == null) A.printString(line); else toZone.call$1(line); - t5._as(t5._as(t1.window).location).reload(); + A._asJSObject(A._asJSObject(t1.window).location).reload(); } else { - t7 = $.RequireRestarter____lastKnownDigests.__late_helper$_value; - if (t7 === $.RequireRestarter____lastKnownDigests) + t6 = $.RequireRestarter____lastKnownDigests.__late_helper$_value; + if (t6 === $.RequireRestarter____lastKnownDigests) A.throwExpression(A.LateError$fieldNI(t4)); - if (t7.$index(0, t6) != newDigests.$index(0, t6)) { - t7 = $.RequireRestarter____lastKnownDigests.__late_helper$_value; - if (t7 === $.RequireRestarter____lastKnownDigests) + if (t6.$index(0, t5) != newDigests.$index(0, t5)) { + t6 = $.RequireRestarter____lastKnownDigests.__late_helper$_value; + if (t6 === $.RequireRestarter____lastKnownDigests) A.throwExpression(A.LateError$fieldNI(t4)); - t8 = newDigests.$index(0, t6); - t8.toString; - t7.$indexSet(0, t6, t8); - B.JSArray_methods.add$1(modulesToLoad, t6); + t7 = newDigests.$index(0, t5); + t7.toString; + t6.$indexSet(0, t5, t7); + B.JSArray_methods.add$1(modulesToLoad, t5); } } } @@ -27643,7 +29021,7 @@ _getDigests$0() { var $async$goto = 0, $async$completer = A._makeAsyncAwaitCompleter(type$.Map_String_String), - $async$returnValue, response, t1; + $async$returnValue, t1, response; var $async$_getDigests$0 = A._wrapJsFunctionForAsync(function($async$errorCode, $async$result) { if ($async$errorCode === 1) return A._asyncRethrow($async$result, $async$completer); @@ -27651,13 +29029,14 @@ switch ($async$goto) { case 0: // Function start + t1 = init.G; $async$goto = 3; - return A._asyncAwait(new A.BrowserClient(A.LinkedHashSet_LinkedHashSet$_empty(type$.JSObject))._sendUnstreamed$3("GET", A.Uri_parse(A._asString(type$.JavaScriptObject._as(init.G.$requireLoader).digestsPath)), null), $async$_getDigests$0); + return A._asyncAwait(new A.BrowserClient(A._asJSObject(new t1.AbortController()))._sendUnstreamed$3("GET", A.Uri_parse(A._asString(type$.JavaScriptObject._as(t1.$requireLoader).digestsPath)), null), $async$_getDigests$0); case 3: // returning from await. response = $async$result; t1 = type$.String; - $async$returnValue = type$.Map_dynamic_dynamic._as(B.C_JsonCodec.decode$2$reviver(A.encodingForCharset(A._contentTypeForHeaders(response.headers).parameters._collection$_map.$index(0, "charset")).decode$1(response.bodyBytes), null)).cast$2$0(0, t1, t1); + $async$returnValue = type$.Map_dynamic_dynamic._as(B.C_JsonCodec.decode$2$reviver(A.encodingForContentTypeHeader(A._contentTypeForHeaders(response.headers)).decode$1(response.bodyBytes), null)).cast$2$0(0, t1, t1); // goto return $async$goto = 1; break; @@ -27842,8 +29221,7 @@ if (t2 instanceof A.HotReloadFailedException) { e = t2; A.print("Error during script reloading. Firing full page reload. " + A.S(e)); - t2 = type$.JSObject; - t2._as(t2._as(t1.window).location).reload(); + A._asJSObject(A._asJSObject(t1.window).location).reload(); $async$self._running.complete$1(false); } else throw $async$exception; @@ -27884,7 +29262,7 @@ t2 = type$.JavaScriptObject; t2 = t2._as(t2._as(t1.$requireLoader).moduleParentsGraph); t3 = type$.String; - stronglyConnectedComponents = A.stronglyConnectedComponents(A.JSArrayExtension_toDartIterable(type$.JSArray_nullable_Object._as(t1.Array.from(type$.JSObject._as(t2.keys()))), t3), this.get$_moduleParents(), t3); + stronglyConnectedComponents = A.stronglyConnectedComponents(A.JSArrayExtension_toDartIterable(type$.JSArray_nullable_Object._as(t1.Array.from(A._asJSObject(t2.keys()))), t3), this.get$_moduleParents(), t3); t3 = this._moduleOrdering; if (t3._collection$_length > 0) { t3._strings = t3._nums = t3._collection$_rest = t3._keys = null; @@ -27898,7 +29276,7 @@ }; A.RequireRestarter__reload_closure.prototype = { call$0() { - var t1 = type$.JSObject._as(this.dart.getModuleLibraries(this._box_0.previousModuleId)); + var t1 = A._asJSObject(this.dart.getModuleLibraries(this._box_0.previousModuleId)); t1 = A.JSArrayExtension_toDartIterable(type$.JSArray_nullable_Object._as(init.G.Object.values(t1)), type$.nullable_Object).get$first(0); t1.toString; type$.JavaScriptObject._as(t1).main(); @@ -27915,7 +29293,7 @@ call$1(e) { this.completer.completeError$2(new A.HotReloadFailedException(A._asString(type$.JavaScriptObject._as(e).message)), this.stackTrace); }, - $signature: 87 + $signature: 90 }; A._createScript_closure.prototype = { call$0() { @@ -27924,19 +29302,17 @@ return new A._createScript__closure(); return new A._createScript__closure0(nonce); }, - $signature: 88 + $signature: 91 }; A._createScript__closure.prototype = { call$0() { - var t1 = type$.JSObject; - return t1._as(t1._as(init.G.document).createElement("script")); + return A._asJSObject(A._asJSObject(init.G.document).createElement("script")); }, $signature: 10 }; A._createScript__closure0.prototype = { call$0() { - var t1 = type$.JSObject, - scriptElement = t1._as(t1._as(init.G.document).createElement("script")); + var scriptElement = A._asJSObject(A._asJSObject(init.G.document).createElement("script")); scriptElement.setAttribute("nonce", this.nonce); return scriptElement; }, @@ -27987,48 +29363,58 @@ _instance = hunkHelpers.installInstanceTearOff, _instance_2_u = hunkHelpers._instance_2u, _instance_1_i = hunkHelpers._instance_1i, - _instance_0_u = hunkHelpers._instance_0u, - _instance_1_u = hunkHelpers._instance_1u; - _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 30); - _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 16); - _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 16); - _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 16); + _instance_1_u = hunkHelpers._instance_1u, + _instance_0_u = hunkHelpers._instance_0u; + _static_2(J, "_interceptors_JSArray__compareAny$closure", "JSArray__compareAny", 32); + _static_1(A, "async__AsyncRun__scheduleImmediateJsOverride$closure", "_AsyncRun__scheduleImmediateJsOverride", 13); + _static_1(A, "async__AsyncRun__scheduleImmediateWithSetImmediate$closure", "_AsyncRun__scheduleImmediateWithSetImmediate", 13); + _static_1(A, "async__AsyncRun__scheduleImmediateWithTimer$closure", "_AsyncRun__scheduleImmediateWithTimer", 13); _static_0(A, "async___startMicrotaskLoop$closure", "_startMicrotaskLoop", 0); _static_1(A, "async___nullDataHandler$closure", "_nullDataHandler", 7); - _static_2(A, "async___nullErrorHandler$closure", "_nullErrorHandler", 14); + _static_2(A, "async___nullErrorHandler$closure", "_nullErrorHandler", 9); _static_0(A, "async___nullDoneHandler$closure", "_nullDoneHandler", 0); - _static(A, "async___rootHandleUncaughtError$closure", 5, null, ["call$5"], ["_rootHandleUncaughtError"], 91, 0); + _static(A, "async___rootHandleUncaughtError$closure", 5, null, ["call$5"], ["_rootHandleUncaughtError"], 94, 0); _static(A, "async___rootRun$closure", 4, null, ["call$1$4", "call$4"], ["_rootRun", function($self, $parent, zone, f) { return A._rootRun($self, $parent, zone, f, type$.dynamic); - }], 92, 0); + }], 95, 1); _static(A, "async___rootRunUnary$closure", 5, null, ["call$2$5", "call$5"], ["_rootRunUnary", function($self, $parent, zone, f, arg) { var t1 = type$.dynamic; return A._rootRunUnary($self, $parent, zone, f, arg, t1, t1); - }], 93, 0); - _static(A, "async___rootRunBinary$closure", 6, null, ["call$3$6"], ["_rootRunBinary"], 94, 0); + }], 96, 1); + _static(A, "async___rootRunBinary$closure", 6, null, ["call$3$6", "call$6"], ["_rootRunBinary", function($self, $parent, zone, f, arg1, arg2) { + var t1 = type$.dynamic; + return A._rootRunBinary($self, $parent, zone, f, arg1, arg2, t1, t1, t1); + }], 97, 1); _static(A, "async___rootRegisterCallback$closure", 4, null, ["call$1$4", "call$4"], ["_rootRegisterCallback", function($self, $parent, zone, f) { return A._rootRegisterCallback($self, $parent, zone, f, type$.dynamic); - }], 95, 0); + }], 98, 0); _static(A, "async___rootRegisterUnaryCallback$closure", 4, null, ["call$2$4", "call$4"], ["_rootRegisterUnaryCallback", function($self, $parent, zone, f) { var t1 = type$.dynamic; return A._rootRegisterUnaryCallback($self, $parent, zone, f, t1, t1); - }], 96, 0); + }], 99, 0); _static(A, "async___rootRegisterBinaryCallback$closure", 4, null, ["call$3$4", "call$4"], ["_rootRegisterBinaryCallback", function($self, $parent, zone, f) { var t1 = type$.dynamic; return A._rootRegisterBinaryCallback($self, $parent, zone, f, t1, t1, t1); - }], 97, 0); - _static(A, "async___rootErrorCallback$closure", 5, null, ["call$5"], ["_rootErrorCallback"], 98, 0); - _static(A, "async___rootScheduleMicrotask$closure", 4, null, ["call$4"], ["_rootScheduleMicrotask"], 99, 0); - _static(A, "async___rootCreateTimer$closure", 5, null, ["call$5"], ["_rootCreateTimer"], 100, 0); - _static(A, "async___rootCreatePeriodicTimer$closure", 5, null, ["call$5"], ["_rootCreatePeriodicTimer"], 101, 0); - _static(A, "async___rootPrint$closure", 4, null, ["call$4"], ["_rootPrint"], 102, 0); - _static_1(A, "async___printToZone$closure", "_printToZone", 103); - _static(A, "async___rootFork$closure", 5, null, ["call$5"], ["_rootFork"], 104, 0); - _instance(A._Completer.prototype, "get$completeError", 0, 1, null, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 33, 0, 0); - _instance_2_u(A._Future.prototype, "get$_completeError", "_completeError$2", 14); + }], 100, 0); + _static(A, "async___rootErrorCallback$closure", 5, null, ["call$5"], ["_rootErrorCallback"], 101, 0); + _static(A, "async___rootScheduleMicrotask$closure", 4, null, ["call$4"], ["_rootScheduleMicrotask"], 102, 0); + _static(A, "async___rootCreateTimer$closure", 5, null, ["call$5"], ["_rootCreateTimer"], 103, 0); + _static(A, "async___rootCreatePeriodicTimer$closure", 5, null, ["call$5"], ["_rootCreatePeriodicTimer"], 104, 0); + _static(A, "async___rootPrint$closure", 4, null, ["call$4"], ["_rootPrint"], 105, 0); + _static_1(A, "async___printToZone$closure", "_printToZone", 106); + _static(A, "async___rootFork$closure", 5, null, ["call$5"], ["_rootFork"], 107, 0); + _instance(A._Completer.prototype, "get$completeError", 0, 1, function() { + return [null]; + }, ["call$2", "call$1"], ["completeError$2", "completeError$1"], 31, 0, 0); + _instance_2_u(A._Future.prototype, "get$_completeError", "_completeError$2", 9); var _; - _instance_1_i(_ = A._StreamController.prototype, "get$add", "add$1", 9); - _instance(_, "get$addError", 0, 1, null, ["call$2", "call$1"], ["addError$2", "addError$1"], 33, 0, 0); + _instance_1_i(_ = A._StreamController.prototype, "get$add", "add$1", 8); + _instance(_, "get$addError", 0, 1, function() { + return [null]; + }, ["call$2", "call$1"], ["addError$2", "addError$1"], 31, 0, 0); + _instance_1_u(_, "get$_add", "_add$1", 8); + _instance_2_u(_, "get$_addError", "_addError$2", 9); + _instance_0_u(_, "get$_close", "_close$0", 0); _instance_0_u(_ = A._ControllerSubscription.prototype, "get$_onPause", "_onPause$0", 0); _instance_0_u(_, "get$_onResume", "_onResume$0", 0); _instance_0_u(_ = A._BufferingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0); @@ -28036,42 +29422,45 @@ _instance_0_u(A._DoneStreamSubscription.prototype, "get$_onMicrotask", "_onMicrotask$0", 0); _instance_0_u(_ = A._ForwardingStreamSubscription.prototype, "get$_onPause", "_onPause$0", 0); _instance_0_u(_, "get$_onResume", "_onResume$0", 0); - _instance_1_u(_, "get$_handleData", "_handleData$1", 9); + _instance_1_u(_, "get$_handleData", "_handleData$1", 8); _instance_2_u(_, "get$_handleError", "_handleError$2", 21); _instance_0_u(_, "get$_handleDone", "_handleDone$0", 0); _static_2(A, "collection___defaultEquals$closure", "_defaultEquals0", 18); - _static_1(A, "collection___defaultHashCode$closure", "_defaultHashCode", 17); - _static_2(A, "collection_ListBase__compareAny$closure", "ListBase__compareAny", 30); - _static_1(A, "convert___defaultToEncodable$closure", "_defaultToEncodable", 4); - _instance_1_i(_ = A._ByteCallbackSink.prototype, "get$add", "add$1", 9); + _static_1(A, "collection___defaultHashCode$closure", "_defaultHashCode", 15); + _static_2(A, "collection_ListBase__compareAny$closure", "ListBase__compareAny", 32); + _static_1(A, "convert___defaultToEncodable$closure", "_defaultToEncodable", 6); + _instance_1_i(_ = A._ByteCallbackSink.prototype, "get$add", "add$1", 8); _instance_0_u(_, "get$close", "close$0", 0); - _static_1(A, "core__identityHashCode$closure", "identityHashCode", 17); + _static_1(A, "core__identityHashCode$closure", "identityHashCode", 15); _static_2(A, "core__identical$closure", "identical", 18); - _static_1(A, "core_Uri_decodeComponent$closure", "Uri_decodeComponent", 13); + _static_1(A, "core_Uri_decodeComponent$closure", "Uri_decodeComponent", 16); _static(A, "math__max$closure", 2, null, ["call$1$2", "call$2"], ["max", function(a, b) { return A.max(a, b, type$.num); - }], 105, 0); + }], 108, 1); _instance_2_u(_ = A.DeepCollectionEquality.prototype, "get$equals", "equals$2", 18); - _instance_1_u(_, "get$hash", "hash$1", 17); + _instance_1_u(_, "get$hash", "hash$1", 15); _instance_1_u(_, "get$isValidKey", "isValidKey$1", 12); _static(A, "hot_reload_response_HotReloadResponse___new_tearOff$closure", 0, null, ["call$1", "call$0"], ["HotReloadResponse___new_tearOff", function() { return A.HotReloadResponse___new_tearOff(null); - }], 70, 0); - _static_1(A, "case_insensitive_map_CaseInsensitiveMap__canonicalizer$closure", "CaseInsensitiveMap__canonicalizer", 13); + }], 109, 0); + _static(A, "hot_restart_response_HotRestartResponse___new_tearOff$closure", 0, null, ["call$1", "call$0"], ["HotRestartResponse___new_tearOff", function() { + return A.HotRestartResponse___new_tearOff(null); + }], 73, 0); + _static_1(A, "case_insensitive_map_CaseInsensitiveMap__canonicalizer$closure", "CaseInsensitiveMap__canonicalizer", 16); _instance_1_u(_ = A.SseClient.prototype, "get$_onIncomingControlMessage", "_onIncomingControlMessage$1", 2); _instance_1_u(_, "get$_onIncomingMessage", "_onIncomingMessage$1", 2); _instance_0_u(_, "get$_onOutgoingDone", "_onOutgoingDone$0", 0); - _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 64); + _instance_1_u(_, "get$_onOutgoingMessage", "_onOutgoingMessage$1", 67); _static_1(A, "client___handleAuthRequest$closure", "_handleAuthRequest", 2); - _instance_1_u(_ = A.RequireRestarter.prototype, "get$_moduleParents", "_moduleParents$1", 85); - _instance_2_u(_, "get$_moduleTopologicalCompare", "_moduleTopologicalCompare$2", 86); + _instance_1_u(_ = A.RequireRestarter.prototype, "get$_moduleParents", "_moduleParents$1", 88); + _instance_2_u(_, "get$_moduleTopologicalCompare", "_moduleTopologicalCompare$2", 89); })(); (function inheritance() { var _mixin = hunkHelpers.mixin, _inherit = hunkHelpers.inherit, _inheritMany = hunkHelpers.inheritMany; _inherit(A.Object, null); - _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, A.SafeToStringHook, J.ArrayIterator, A.Iterable, A.CastIterator, A.Closure, A.MapBase, A.Error, A.ListBase, A.SentinelValue, A.ListIterator, A.MappedIterator, A.WhereIterator, A.ExpandIterator, A.TakeIterator, A.SkipIterator, A.EmptyIterator, A.WhereTypeIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A.ConstantMap, A._KeysOrValuesOrElementsIterator, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.LinkedHashMapValueIterator, A.LinkedHashMapEntryIterator, A._Record, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A.AsyncError, A.TimeoutException, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A.Stream, A._StreamController, A._SyncStreamControllerDispatch, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._StreamSinkWrapper, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._DoneStreamSubscription, A._StreamIterator, A._ZoneFunction, A._ZoneSpecification, A._ZoneDelegate, A._Zone, A._HashMapKeyIterator, A.SetBase, A._HashSetIterator, A._LinkedHashSetCell, A._LinkedHashSetIterator, A._UnmodifiableMapMixin, A.MapView, A._ListQueueIterator, A._SplayTreeNode, A._SplayTree, A._SplayTreeIterator, A.Codec, A.Converter, A._Base64Encoder, A._Base64Decoder, A.ByteConversionSink, A._JsonStringifier, A._Utf8Encoder, A._Utf8Decoder, A._BigIntImpl, A.DateTime, A.Duration, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.IntegerDivisionByZeroException, A.MapEntry, A.Null, A._StringStackTrace, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.NullRejectionException, A._JSRandom, A.AsyncMemoizer, A.DelegatingStreamSink, A.ErrorResult, A.ValueResult, A.StreamQueue, A._NextRequest, A._HasNextRequest, A.BuiltList, A.ListBuilder, A.BuiltListMultimap, A.ListMultimapBuilder, A.BuiltMap, A.MapBuilder, A.BuiltSet, A.SetBuilder, A.BuiltSetMultimap, A.SetMultimapBuilder, A.EnumClass, A.IndentingBuiltValueToStringHelper, A.JsonObject, A.FullType, A.BigIntSerializer, A.BoolSerializer, A.BuiltJsonSerializers, A.BuiltJsonSerializersBuilder, A.BuiltListMultimapSerializer, A.BuiltListSerializer, A.BuiltMapSerializer, A.BuiltSetMultimapSerializer, A.BuiltSetSerializer, A.DateTimeSerializer, A.DoubleSerializer, A.DurationSerializer, A.Int32Serializer, A.Int64Serializer, A.IntSerializer, A.JsonObjectSerializer, A.ListSerializer, A.MapSerializer, A.NullSerializer, A.NumSerializer, A.RegExpSerializer, A.SetSerializer, A.StringSerializer, A.Uint8ListSerializer, A.UriSerializer, A.CanonicalizedMap, A.DefaultEquality, A.IterableEquality, A.ListEquality, A._UnorderedEquality, A._MapEntry, A.MapEquality, A.DeepCollectionEquality, A._QueueList_Object_ListMixin, A.BuildResult, A._$BuildStatusSerializer, A._$BuildResultSerializer, A.BuildResultBuilder, A.ConnectRequest, A._$ConnectRequestSerializer, A.ConnectRequestBuilder, A.DebugEvent, A.BatchedDebugEvents, A._$DebugEventSerializer, A._$BatchedDebugEventsSerializer, A.DebugEventBuilder, A.BatchedDebugEventsBuilder, A.DebugInfo, A._$DebugInfoSerializer, A.DebugInfoBuilder, A.DevToolsRequest, A.DevToolsResponse, A._$DevToolsRequestSerializer, A._$DevToolsResponseSerializer, A.DevToolsRequestBuilder, A.DevToolsResponseBuilder, A.ErrorResponse, A._$ErrorResponseSerializer, A.ErrorResponseBuilder, A.ExtensionRequest, A.ExtensionResponse, A.ExtensionEvent, A.BatchedEvents, A._$ExtensionRequestSerializer, A._$ExtensionResponseSerializer, A._$ExtensionEventSerializer, A._$BatchedEventsSerializer, A.ExtensionRequestBuilder, A.ExtensionResponseBuilder, A.ExtensionEventBuilder, A.BatchedEventsBuilder, A.HotReloadRequest, A._$HotReloadRequestSerializer, A.HotReloadRequestBuilder, A.HotReloadResponse, A._$HotReloadResponseSerializer, A.HotReloadResponseBuilder, A.IsolateExit, A.IsolateStart, A._$IsolateExitSerializer, A._$IsolateStartSerializer, A.IsolateExitBuilder, A.IsolateStartBuilder, A.RegisterEvent, A._$RegisterEventSerializer, A.RegisterEventBuilder, A.RunRequest, A._$RunRequestSerializer, A.BatchedStreamController, A.SocketClient, A.Int32, A.Int64, A._StackState, A.BaseClient, A.BaseRequest, A.BaseResponse, A.ClientException, A.MediaType, A.Level, A.LogRecord, A.Logger, A.Context, A.Style, A.ParsedPath, A.PathException, A.Pool, A.PoolResource, A.SourceFile, A.SourceLocationMixin, A.SourceSpanMixin, A.Highlighter, A._Highlight, A._Line, A.SourceLocation, A.SourceSpanException, A.StreamChannelMixin, A._GuaranteeSink, A.StreamChannelController, A.StringScanner, A.RNG, A.UuidV1, A.EventStreamProvider, A._EventStreamSubscription, A.BrowserWebSocket, A.WebSocketEvent, A.WebSocketException, A.WebSocketChannelException, A.DdcLibraryBundleRestarter, A.DdcRestarter, A.ReloadingManager, A.HotReloadFailedException, A.RequireRestarter]); + _inheritMany(A.Object, [A.JS_CONST, J.Interceptor, A.SafeToStringHook, J.ArrayIterator, A.Iterable, A.CastIterator, A.Closure, A.MapBase, A.Error, A.ListBase, A.SentinelValue, A.ListIterator, A.MappedIterator, A.WhereIterator, A.ExpandIterator, A.TakeIterator, A.SkipIterator, A.EmptyIterator, A.WhereTypeIterator, A.FixedLengthListMixin, A.UnmodifiableListMixin, A.ConstantMap, A._KeysOrValuesOrElementsIterator, A.TypeErrorDecoder, A.NullThrownFromJavaScriptException, A.ExceptionAndStackTrace, A._StackTrace, A.LinkedHashMapCell, A.LinkedHashMapKeyIterator, A.LinkedHashMapValueIterator, A.LinkedHashMapEntryIterator, A._Record, A.JSSyntaxRegExp, A._MatchImplementation, A._AllMatchesIterator, A.StringMatch, A._StringAllMatchesIterator, A._Cell, A._UnmodifiableNativeByteBufferView, A.Rti, A._FunctionParameters, A._Type, A._TimerImpl, A._AsyncAwaitCompleter, A._AsyncStarStreamController, A._IterationMarker, A.AsyncError, A.TimeoutException, A._Completer, A._FutureListener, A._Future, A._AsyncCallbackEntry, A.Stream, A._StreamController, A._SyncStreamControllerDispatch, A._AsyncStreamControllerDispatch, A._BufferingStreamSubscription, A._StreamSinkWrapper, A._AddStreamState, A._DelayedEvent, A._DelayedDone, A._PendingEvents, A._DoneStreamSubscription, A._StreamIterator, A._ZoneFunction, A._ZoneSpecification, A._ZoneDelegate, A._Zone, A._HashMapKeyIterator, A.SetBase, A._HashSetIterator, A._LinkedHashSetCell, A._LinkedHashSetIterator, A._UnmodifiableMapMixin, A.MapView, A._ListQueueIterator, A._SplayTreeNode, A._SplayTree, A._SplayTreeIterator, A.Codec, A.Converter, A._Base64Encoder, A._Base64Decoder, A.ByteConversionSink, A._JsonStringifier, A._Utf8Encoder, A._Utf8Decoder, A._BigIntImpl, A.DateTime, A.Duration, A.OutOfMemoryError, A.StackOverflowError, A._Exception, A.FormatException, A.IntegerDivisionByZeroException, A.MapEntry, A.Null, A._StringStackTrace, A.StringBuffer, A._Uri, A.UriData, A._SimpleUri, A.NullRejectionException, A._JSRandom, A._JSSecureRandom, A.AsyncMemoizer, A.DelegatingStreamSink, A.ErrorResult, A.ValueResult, A.StreamQueue, A._NextRequest, A._HasNextRequest, A.BuiltList, A.ListBuilder, A.BuiltListMultimap, A.ListMultimapBuilder, A.BuiltMap, A.MapBuilder, A.BuiltSet, A.SetBuilder, A.BuiltSetMultimap, A.SetMultimapBuilder, A.EnumClass, A.IndentingBuiltValueToStringHelper, A.JsonObject, A.FullType, A.BigIntSerializer, A.BoolSerializer, A.BuiltJsonSerializers, A.BuiltJsonSerializersBuilder, A.BuiltListMultimapSerializer, A.BuiltListSerializer, A.BuiltMapSerializer, A.BuiltSetMultimapSerializer, A.BuiltSetSerializer, A.DateTimeSerializer, A.DoubleSerializer, A.DurationSerializer, A.Int32Serializer, A.Int64Serializer, A.IntSerializer, A.JsonObjectSerializer, A.ListSerializer, A.MapSerializer, A.NullSerializer, A.NumSerializer, A.RegExpSerializer, A.SetSerializer, A.StringSerializer, A.Uint8ListSerializer, A.UriSerializer, A.CanonicalizedMap, A.DefaultEquality, A.IterableEquality, A.ListEquality, A._UnorderedEquality, A._MapEntry, A.MapEquality, A.DeepCollectionEquality, A._QueueList_Object_ListMixin, A.BuildResult, A._$BuildStatusSerializer, A._$BuildResultSerializer, A.BuildResultBuilder, A.ConnectRequest, A._$ConnectRequestSerializer, A.ConnectRequestBuilder, A.DebugEvent, A.BatchedDebugEvents, A._$DebugEventSerializer, A._$BatchedDebugEventsSerializer, A.DebugEventBuilder, A.BatchedDebugEventsBuilder, A.DebugInfo, A._$DebugInfoSerializer, A.DebugInfoBuilder, A.DevToolsRequest, A.DevToolsResponse, A._$DevToolsRequestSerializer, A._$DevToolsResponseSerializer, A.DevToolsRequestBuilder, A.DevToolsResponseBuilder, A.ErrorResponse, A._$ErrorResponseSerializer, A.ErrorResponseBuilder, A.ExtensionRequest, A.ExtensionResponse, A.ExtensionEvent, A.BatchedEvents, A._$ExtensionRequestSerializer, A._$ExtensionResponseSerializer, A._$ExtensionEventSerializer, A._$BatchedEventsSerializer, A.ExtensionRequestBuilder, A.ExtensionResponseBuilder, A.ExtensionEventBuilder, A.BatchedEventsBuilder, A.HotReloadRequest, A._$HotReloadRequestSerializer, A.HotReloadRequestBuilder, A.HotReloadResponse, A._$HotReloadResponseSerializer, A.HotReloadResponseBuilder, A.HotRestartRequest, A._$HotRestartRequestSerializer, A.HotRestartRequestBuilder, A.HotRestartResponse, A._$HotRestartResponseSerializer, A.HotRestartResponseBuilder, A.IsolateExit, A.IsolateStart, A._$IsolateExitSerializer, A._$IsolateStartSerializer, A.IsolateExitBuilder, A.IsolateStartBuilder, A.RegisterEvent, A._$RegisterEventSerializer, A.RegisterEventBuilder, A.RunRequest, A._$RunRequestSerializer, A.ServiceExtensionRequest, A._$ServiceExtensionRequestSerializer, A.ServiceExtensionRequestBuilder, A.ServiceExtensionResponse, A._$ServiceExtensionResponseSerializer, A.ServiceExtensionResponseBuilder, A.BatchedStreamController, A.SocketClient, A.Int32, A.Int64, A._StackState, A.BaseClient, A.BaseRequest, A.BaseResponse, A.ClientException, A.MediaType, A.Level, A.LogRecord, A.Logger, A.Context, A.Style, A.ParsedPath, A.PathException, A.Pool, A.PoolResource, A.SourceFile, A.SourceLocationMixin, A.SourceSpanMixin, A.Highlighter, A._Highlight, A._Line, A.SourceLocation, A.SourceSpanException, A.StreamChannelMixin, A._GuaranteeSink, A.StreamChannelController, A.StringScanner, A.RNG, A.UuidV1, A.EventStreamProvider, A._EventStreamSubscription, A.BrowserWebSocket, A.WebSocketEvent, A.WebSocketException, A.WebSocketChannelException, A.DdcLibraryBundleRestarter, A.DdcRestarter, A.ReloadingManager, A.HotReloadFailedException, A.RequireRestarter]); _inheritMany(J.Interceptor, [J.JSBool, J.JSNull, J.JavaScriptObject, J.JavaScriptBigInt, J.JavaScriptSymbol, J.JSNumber, J.JSString]); _inheritMany(J.JavaScriptObject, [J.LegacyJavaScriptObject, J.JSArray, A.NativeByteBuffer, A.NativeTypedData]); _inheritMany(J.LegacyJavaScriptObject, [J.PlainJavaScriptObject, J.UnknownJavaScriptObject, J.JavaScriptFunction]); @@ -28082,14 +29471,14 @@ _inheritMany(A._CastIterableBase, [A.CastIterable, A.__CastListBase__CastIterableBase_ListMixin]); _inherit(A._EfficientLengthCastIterable, A.CastIterable); _inherit(A._CastListBase, A.__CastListBase__CastIterableBase_ListMixin); - _inheritMany(A.Closure, [A.Closure2Args, A.Closure0Args, A.Instantiation, A.TearOffClosure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A._Future_timeout_closure0, A.Stream_length_closure, A.Stream_first_closure0, A._CustomZone_bindUnaryCallback_closure, A._CustomZone_bindUnaryCallbackGuarded_closure, A._RootZone_bindUnaryCallback_closure, A._RootZone_bindUnaryCallbackGuarded_closure, A.runZonedGuarded_closure, A._CustomHashMap_closure, A._LinkedCustomHashMap_closure, A._BigIntImpl_hashCode_finish, A._Uri__makePath_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure, A.FutureOfVoidToJSPromise_get_toJS__closure, A.jsify__convert, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.dartify_convert, A.StreamQueue__ensureListening_closure, A.BuiltListMultimap_BuiltListMultimap_closure, A.BuiltListMultimap_hashCode_closure, A.ListMultimapBuilder_replace_closure, A.BuiltMap_BuiltMap_closure, A.BuiltMap_hashCode_closure, A.BuiltSet_hashCode_closure, A.BuiltSetMultimap_hashCode_closure, A.SetMultimapBuilder_replace_closure, A.newBuiltValueToStringHelper_closure, A.BuiltListMultimapSerializer_serialize_closure, A.BuiltListMultimapSerializer_deserialize_closure, A.BuiltListSerializer_serialize_closure, A.BuiltListSerializer_deserialize_closure, A.BuiltSetMultimapSerializer_serialize_closure, A.BuiltSetMultimapSerializer_deserialize_closure, A.BuiltSetSerializer_serialize_closure, A.BuiltSetSerializer_deserialize_closure, A.ListSerializer_serialize_closure, A.SetSerializer_serialize_closure, A.CanonicalizedMap_keys_closure, A.WebSocketClient_stream_closure, A.BaseRequest_closure0, A.BrowserClient_send_closure, A.BrowserClient_send_closure0, A.ByteStream_toBytes_closure, A.MediaType_toString__closure, A.expectQuotedString_closure, A.Context_joinAll_closure, A.Context_split_closure, A._validateArgList_closure, A.Pool__runOnRelease_closure, A.Highlighter$__closure, A.Highlighter$___closure, A.Highlighter$__closure0, A.Highlighter__collateLines_closure, A.Highlighter__collateLines_closure1, A.Highlighter__collateLines__closure, A.Highlighter_highlight_closure, A.SseClient_closure0, A.SseClient_closure1, A.generateUuidV4_generateBits, A._GuaranteeSink__addError_closure, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure, A.BrowserWebSocket_connect_closure, A.BrowserWebSocket_connect_closure0, A.BrowserWebSocket_connect_closure1, A.BrowserWebSocket_connect_closure2, A.AdapterWebSocketChannel_closure, A.AdapterWebSocketChannel__closure, A.AdapterWebSocketChannel__closure0, A.AdapterWebSocketChannel_closure0, A.main__closure1, A.main__closure3, A.main___closure2, A.main___closure1, A.main__closure5, A.main___closure0, A.main___closure, A.main__closure7, A.main__closure8, A.main__closure9, A._sendConnectRequest_closure, A._launchCommunicationWithDebugExtension_closure, A._handleAuthRequest_closure, A._sendResponse_closure, A.DdcLibraryBundleRestarter_restart_closure, A.DdcLibraryBundleRestarter_hotReloadStart_closure0, A.DdcRestarter_restart_closure0, A.DdcRestarter_restart_closure, A.RequireRestarter__reloadModule_closure0, A.JSArrayExtension_toDartIterable_closure]); - _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.ConstantMap_map_closure, A.JsLinkedHashMap_addAll_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure0, A._Future_timeout_closure1, A._BufferingStreamSubscription_asFuture_closure0, A.LinkedHashMap_LinkedHashMap$from_closure, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A._BigIntImpl_hashCode_combine, A.Uri__parseIPv4Address_error, A.Uri_parseIPv6Address_error, A.Uri_parseIPv6Address_parseHex, A.FutureOfJSAnyToJSPromise_get_toJS_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure0, A.FutureOfVoidToJSPromise_get_toJS_closure, A.FutureOfVoidToJSPromise_get_toJS__closure0, A.StreamQueue__ensureListening_closure1, A.hashObjects_closure, A.MapBuilder_replace_closure, A.CanonicalizedMap_addAll_closure, A.CanonicalizedMap_forEach_closure, A.CanonicalizedMap_map_closure, A.safeUnawaited_closure, A.BaseRequest_closure, A.MediaType_toString_closure, A.Pool__runOnRelease_closure0, A.Highlighter__collateLines_closure0, A.generateUuidV4_printDigits, A.generateUuidV4_bitsDigits, A.main__closure4, A.main_closure0]); + _inheritMany(A.Closure, [A.Closure2Args, A.Closure0Args, A.Instantiation, A.TearOffClosure, A.initHooks_closure, A.initHooks_closure1, A._AsyncRun__initializeScheduleImmediate_internalCallback, A._AsyncRun__initializeScheduleImmediate_closure, A._awaitOnObject_closure, A._asyncStarHelper_closure0, A._Future__propagateToListeners_handleWhenCompleteCallback_closure, A._Future_timeout_closure0, A.Stream_length_closure, A.Stream_first_closure0, A._CustomZone_bindUnaryCallback_closure, A._CustomZone_bindUnaryCallbackGuarded_closure, A._RootZone_bindUnaryCallback_closure, A._RootZone_bindUnaryCallbackGuarded_closure, A.runZonedGuarded_closure, A._CustomHashMap_closure, A._LinkedCustomHashMap_closure, A._BigIntImpl_hashCode_finish, A._Uri__makePath_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure, A.FutureOfVoidToJSPromise_get_toJS__closure, A.jsify__convert, A.promiseToFuture_closure, A.promiseToFuture_closure0, A.dartify_convert, A.StreamQueue__ensureListening_closure, A.BuiltListMultimap_BuiltListMultimap_closure, A.BuiltListMultimap_hashCode_closure, A.ListMultimapBuilder_replace_closure, A.BuiltMap_BuiltMap_closure, A.BuiltMap_hashCode_closure, A.BuiltSet_hashCode_closure, A.BuiltSetMultimap_hashCode_closure, A.SetMultimapBuilder_replace_closure, A.newBuiltValueToStringHelper_closure, A.BuiltListMultimapSerializer_serialize_closure, A.BuiltListMultimapSerializer_deserialize_closure, A.BuiltListSerializer_serialize_closure, A.BuiltListSerializer_deserialize_closure, A.BuiltSetMultimapSerializer_serialize_closure, A.BuiltSetMultimapSerializer_deserialize_closure, A.BuiltSetSerializer_serialize_closure, A.BuiltSetSerializer_deserialize_closure, A.ListSerializer_serialize_closure, A.SetSerializer_serialize_closure, A.CanonicalizedMap_keys_closure, A.ServiceExtensionResponse_ServiceExtensionResponse$fromResult_closure, A.WebSocketClient_stream_closure, A.BaseRequest_closure0, A.BrowserClient_send_closure, A._readBody_closure, A._readBody_closure0, A.ByteStream_toBytes_closure, A.MediaType_toString__closure, A.expectQuotedString_closure, A.Context_joinAll_closure, A.Context_split_closure, A._validateArgList_closure, A.Pool__runOnRelease_closure, A.Highlighter$__closure, A.Highlighter$___closure, A.Highlighter$__closure0, A.Highlighter__collateLines_closure, A.Highlighter__collateLines_closure1, A.Highlighter__collateLines__closure, A.Highlighter_highlight_closure, A.SseClient_closure0, A.SseClient_closure1, A._GuaranteeSink__addError_closure, A._EventStreamSubscription_closure, A._EventStreamSubscription_onData_closure, A.BrowserWebSocket_connect_closure, A.BrowserWebSocket_connect_closure0, A.BrowserWebSocket_connect_closure1, A.BrowserWebSocket_connect_closure2, A.AdapterWebSocketChannel_closure, A.AdapterWebSocketChannel__closure, A.AdapterWebSocketChannel__closure0, A.AdapterWebSocketChannel_closure0, A.main__closure1, A.main__closure3, A.main___closure2, A.main___closure1, A.main__closure5, A.main___closure0, A.main___closure, A.main__closure7, A.main__closure8, A.main__closure9, A._sendConnectRequest_closure, A._launchCommunicationWithDebugExtension_closure, A._handleAuthRequest_closure, A._sendResponse_closure, A.DdcLibraryBundleRestarter_restart_closure, A.DdcLibraryBundleRestarter_hotReloadStart_closure0, A.DdcRestarter_restart_closure0, A.DdcRestarter_restart_closure, A.RequireRestarter__reloadModule_closure0, A.JSArrayExtension_toDartIterable_closure]); + _inheritMany(A.Closure2Args, [A._CastListBase_sort_closure, A.CastMap_forEach_closure, A.ConstantMap_map_closure, A.JsLinkedHashMap_addAll_closure, A.initHooks_closure0, A._awaitOnObject_closure0, A._wrapJsFunctionForAsync_closure, A._Future__propagateToListeners_handleWhenCompleteCallback_closure0, A._Future_timeout_closure1, A._AddStreamState_makeErrorHandler_closure, A._BufferingStreamSubscription_asFuture_closure0, A.LinkedHashMap_LinkedHashMap$from_closure, A.MapBase_mapToString_closure, A._JsonStringifier_writeMap_closure, A._BigIntImpl_hashCode_combine, A.Uri__parseIPv4Address_error, A.Uri_parseIPv6Address_error, A.Uri_parseIPv6Address_parseHex, A.FutureOfJSAnyToJSPromise_get_toJS_closure, A.FutureOfJSAnyToJSPromise_get_toJS__closure0, A.FutureOfVoidToJSPromise_get_toJS_closure, A.FutureOfVoidToJSPromise_get_toJS__closure0, A.StreamQueue__ensureListening_closure1, A.hashObjects_closure, A.MapBuilder_replace_closure, A.CanonicalizedMap_addAll_closure, A.CanonicalizedMap_forEach_closure, A.CanonicalizedMap_map_closure, A.safeUnawaited_closure, A.BaseRequest_closure, A.MediaType_toString_closure, A.Pool__runOnRelease_closure0, A.Highlighter__collateLines_closure0, A.main__closure4, A.main_closure0]); _inherit(A.CastList, A._CastListBase); _inheritMany(A.MapBase, [A.CastMap, A.JsLinkedHashMap, A._HashMap, A._JsonMap]); _inheritMany(A.Error, [A.LateError, A.TypeError, A.JsNoSuchMethodError, A.UnknownJsTypeError, A.RuntimeError, A._Error, A.JsonUnsupportedObjectError, A.AssertionError, A.ArgumentError, A.UnsupportedError, A.UnimplementedError, A.StateError, A.ConcurrentModificationError, A.BuiltValueNullFieldError, A.BuiltValueNestedFieldError, A.DeserializationError]); _inherit(A.UnmodifiableListBase, A.ListBase); _inheritMany(A.UnmodifiableListBase, [A.CodeUnits, A.UnmodifiableListView]); - _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A._TimerImpl$periodic_closure, A.Future_Future$microtask_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainCoreFuture_closure, A._Future__asyncCompleteWithValue_closure, A._Future__asyncCompleteErrorObject_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._Future_timeout_closure, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._BufferingStreamSubscription_asFuture_closure, A._BufferingStreamSubscription_asFuture__closure, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._cancelAndValue_closure, A._CustomZone_bindCallback_closure, A._CustomZone_bindCallbackGuarded_closure, A._rootHandleError_closure, A._RootZone_bindCallback_closure, A._RootZone_bindCallbackGuarded_closure, A._Utf8Decoder__decoder_closure, A._Utf8Decoder__decoderNonfatal_closure, A.StreamQueue__ensureListening_closure0, A.Serializers_Serializers_closure, A.Serializers_Serializers_closure0, A.Serializers_Serializers_closure1, A.Serializers_Serializers_closure2, A.Serializers_Serializers_closure3, A._$serializers_closure, A._$serializers_closure0, A.BatchedStreamController__hasEventOrTimeOut_closure, A.BatchedStreamController__hasEventDuring_closure, A.MediaType_MediaType$parse_closure, A.Logger_Logger_closure, A.Highlighter_closure, A.Highlighter__writeFileStart_closure, A.Highlighter__writeMultilineHighlights_closure, A.Highlighter__writeMultilineHighlights_closure0, A.Highlighter__writeMultilineHighlights_closure1, A.Highlighter__writeMultilineHighlights_closure2, A.Highlighter__writeMultilineHighlights__closure, A.Highlighter__writeMultilineHighlights__closure0, A.Highlighter__writeHighlightedText_closure, A.Highlighter__writeIndicator_closure, A.Highlighter__writeIndicator_closure0, A.Highlighter__writeIndicator_closure1, A.Highlighter__writeSidebar_closure, A._Highlight_closure, A.SseClient_closure, A.SseClient__closure, A.SseClient__onOutgoingMessage_closure, A.GuaranteeChannel_closure, A.GuaranteeChannel__closure, A.AdapterWebSocketChannel__closure1, A.main_closure, A.main__closure, A.main__closure0, A.main__closure2, A.main__closure6, A.DdcLibraryBundleRestarter_hotReloadStart_closure, A.RequireRestarter__reload_closure, A.RequireRestarter__reloadModule_closure, A._createScript_closure, A._createScript__closure, A._createScript__closure0, A.runMain_closure]); + _inheritMany(A.Closure0Args, [A.nullFuture_closure, A._AsyncRun__scheduleImmediateJsOverride_internalCallback, A._AsyncRun__scheduleImmediateWithSetImmediate_internalCallback, A._TimerImpl_internalCallback, A._TimerImpl$periodic_closure, A._asyncStarHelper_closure, A._AsyncStarStreamController__resumeBody, A._AsyncStarStreamController__resumeBody_closure, A._AsyncStarStreamController_closure0, A._AsyncStarStreamController_closure1, A._AsyncStarStreamController_closure, A._AsyncStarStreamController__closure, A.Future_Future$microtask_closure, A._Future__addListener_closure, A._Future__prependListeners_closure, A._Future__chainCoreFuture_closure, A._Future__asyncCompleteWithValue_closure, A._Future__asyncCompleteErrorObject_closure, A._Future__propagateToListeners_handleWhenCompleteCallback, A._Future__propagateToListeners_handleValueCallback, A._Future__propagateToListeners_handleError, A._Future_timeout_closure, A.Stream_length_closure0, A.Stream_first_closure, A._StreamController__subscribe_closure, A._StreamController__recordCancel_complete, A._AddStreamState_cancel_closure, A._BufferingStreamSubscription_asFuture_closure, A._BufferingStreamSubscription_asFuture__closure, A._BufferingStreamSubscription__sendError_sendError, A._BufferingStreamSubscription__sendDone_sendDone, A._PendingEvents_schedule_closure, A._cancelAndValue_closure, A._CustomZone_bindCallback_closure, A._CustomZone_bindCallbackGuarded_closure, A._rootHandleError_closure, A._RootZone_bindCallback_closure, A._RootZone_bindCallbackGuarded_closure, A._Utf8Decoder__decoder_closure, A._Utf8Decoder__decoderNonfatal_closure, A.StreamQueue__ensureListening_closure0, A.Serializers_Serializers_closure, A.Serializers_Serializers_closure0, A.Serializers_Serializers_closure1, A.Serializers_Serializers_closure2, A.Serializers_Serializers_closure3, A._$serializers_closure, A._$serializers_closure0, A.BatchedStreamController__hasEventOrTimeOut_closure, A.BatchedStreamController__hasEventDuring_closure, A.MediaType_MediaType$parse_closure, A.Logger_Logger_closure, A.Highlighter_closure, A.Highlighter__writeFileStart_closure, A.Highlighter__writeMultilineHighlights_closure, A.Highlighter__writeMultilineHighlights_closure0, A.Highlighter__writeMultilineHighlights_closure1, A.Highlighter__writeMultilineHighlights_closure2, A.Highlighter__writeMultilineHighlights__closure, A.Highlighter__writeMultilineHighlights__closure0, A.Highlighter__writeHighlightedText_closure, A.Highlighter__writeIndicator_closure, A.Highlighter__writeIndicator_closure0, A.Highlighter__writeIndicator_closure1, A.Highlighter__writeSidebar_closure, A._Highlight_closure, A.SseClient_closure, A.SseClient__closure, A.SseClient__onOutgoingMessage_closure, A.GuaranteeChannel_closure, A.GuaranteeChannel__closure, A.AdapterWebSocketChannel__closure1, A.main_closure, A.main__closure, A.main__closure0, A.main__closure2, A.main__closure6, A.DdcLibraryBundleRestarter_hotReloadStart_closure, A.RequireRestarter__reload_closure, A.RequireRestarter__reloadModule_closure, A._createScript_closure, A._createScript__closure, A._createScript__closure0, A.runMain_closure]); _inheritMany(A.EfficientLengthIterable, [A.ListIterable, A.EmptyIterable, A.LinkedHashMapKeysIterable, A.LinkedHashMapValuesIterable, A.LinkedHashMapEntriesIterable, A._HashMapKeyIterable]); _inheritMany(A.ListIterable, [A.SubListIterable, A.MappedListIterable, A.ReversedListIterable, A.ListQueue, A._JsonMapKeyIterable]); _inherit(A.EfficientLengthMappedIterable, A.MappedIterable); @@ -28100,6 +29489,7 @@ _inherit(A.NullError, A.TypeError); _inheritMany(A.TearOffClosure, [A.StaticClosure, A.BoundClosure]); _inheritMany(A.JsLinkedHashMap, [A.JsIdentityLinkedHashMap, A._LinkedCustomHashMap]); + _inherit(A.NativeArrayBuffer, A.NativeByteBuffer); _inheritMany(A.NativeTypedData, [A.NativeByteData, A.NativeTypedArray]); _inheritMany(A.NativeTypedArray, [A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin, A._NativeTypedArrayOfInt_NativeTypedArray_ListMixin]); _inherit(A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin, A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin); @@ -28114,6 +29504,7 @@ _inheritMany(A._StreamController, [A._AsyncStreamController, A._SyncStreamController]); _inherit(A._ControllerStream, A._StreamImpl); _inheritMany(A._BufferingStreamSubscription, [A._ControllerSubscription, A._ForwardingStreamSubscription]); + _inherit(A._StreamControllerAddStreamState, A._AddStreamState); _inheritMany(A._DelayedEvent, [A._DelayedData, A._DelayedError]); _inherit(A._MapStream, A._ForwardingStream); _inheritMany(A._Zone, [A._CustomZone, A._RootZone]); @@ -28161,10 +29552,14 @@ _inherit(A._$BatchedEvents, A.BatchedEvents); _inherit(A._$HotReloadRequest, A.HotReloadRequest); _inherit(A._$HotReloadResponse, A.HotReloadResponse); + _inherit(A._$HotRestartRequest, A.HotRestartRequest); + _inherit(A._$HotRestartResponse, A.HotRestartResponse); _inherit(A._$IsolateExit, A.IsolateExit); _inherit(A._$IsolateStart, A.IsolateStart); _inherit(A._$RegisterEvent, A.RegisterEvent); _inherit(A._$RunRequest, A.RunRequest); + _inherit(A._$ServiceExtensionRequest, A.ServiceExtensionRequest); + _inherit(A._$ServiceExtensionResponse, A.ServiceExtensionResponse); _inheritMany(A.SocketClient, [A.SseSocketClient, A.WebSocketClient]); _inherit(A.BrowserClient, A.BaseClient); _inherit(A.ByteStream, A.StreamView); @@ -28180,7 +29575,7 @@ _inherit(A.SourceSpanWithContext, A.SourceSpanBase); _inheritMany(A.StreamChannelMixin, [A.SseClient, A.GuaranteeChannel, A.AdapterWebSocketChannel]); _inherit(A.StringScannerException, A.SourceSpanFormatException); - _inherit(A.MathRNG, A.RNG); + _inherit(A.CryptoRNG, A.RNG); _inheritMany(A.WebSocketEvent, [A.TextDataReceived, A.BinaryDataReceived, A.CloseReceived]); _inherit(A.WebSocketConnectionClosed, A.WebSocketException); _inherit(A._WebSocketSink, A.DelegatingStreamSink); @@ -28200,15 +29595,15 @@ var init = { G: typeof self != "undefined" ? self : globalThis, typeUniverse: {eC: new Map(), tR: {}, eT: {}, tPV: {}, sEA: []}, - mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List", Object: "Object", Map: "Map"}, + mangledGlobalNames: {int: "int", double: "double", num: "num", String: "String", bool: "bool", Null: "Null", List: "List", Object: "Object", Map: "Map", JSObject: "JSObject"}, mangledNames: {}, - types: ["~()", "Null()", "~(JSObject)", "Object?(@)", "@(@)", "Null(Object,StackTrace)", "Null(@)", "~(@)", "Null(JSObject)", "~(Object?)", "JSObject()", "Object?(Object?)", "bool(Object?)", "String(String)", "~(Object,StackTrace)", "bool(_Highlight)", "~(~())", "int(Object?)", "bool(Object?,Object?)", "Future<~>()", "Null(JavaScriptFunction)", "~(@,StackTrace)", "String(int,int)", "~(@,@)", "~(Object?,Object?)", "@()", "int(int,int)", "int(int)", "int()", "Null(JavaScriptFunction,JavaScriptFunction)", "int(@,@)", "bool(String)", "String(Match)", "~(Object[StackTrace?])", "bool()", "SetBuilder()", "MapBuilder()", "~(int,@)", "ListMultimapBuilder()", "ListBuilder()", "ListBuilder()", "ListBuilder()", "IndentingBuiltValueToStringHelper(String)", "String(@)", "bool(String,String)", "int(String)", "int(int,@)", "~(List)", "MediaType()", "~(String,String)", "Object?(~)", "Logger()", "JSObject(Object,StackTrace)", "Null(@,StackTrace)", "String?()", "int(_Line)", "~(String,int?)", "Object(_Line)", "Object(_Highlight)", "int(_Highlight,_Highlight)", "List<_Line>(MapEntry>)", "~(String,int)", "SourceSpanWithContext()", "Null(~())", "~(String?)", "Future()", "~(Zone,ZoneDelegate,Zone,Object,StackTrace)", "Null(WebSocket)", "~(WebSocketEvent)", "Null(Object)", "HotReloadResponse([~(HotReloadResponseBuilder)])", "JSObject(String[bool?])", "~(List)", "ListBuilder(BatchedDebugEventsBuilder)", "Null(String,String)", "DebugEventBuilder(DebugEventBuilder)", "Null(String)", "RegisterEventBuilder(RegisterEventBuilder)", "DevToolsRequestBuilder(DevToolsRequestBuilder)", "Future<~>(String)", "ConnectRequestBuilder(ConnectRequestBuilder)", "DebugInfoBuilder(DebugInfoBuilder)", "~(bool)", "@(@,String)", "bool(bool)", "List(String)", "int(String,String)", "Null(JavaScriptObject)", "JSObject()()", "SetMultimapBuilder()", "@(String)", "~(Zone?,ZoneDelegate?,Zone,Object,StackTrace)", "0^(Zone?,ZoneDelegate?,Zone,0^())", "0^(Zone?,ZoneDelegate?,Zone,0^(1^),1^)", "0^(Zone?,ZoneDelegate?,Zone,0^(1^,2^),1^,2^)", "0^()(Zone,ZoneDelegate,Zone,0^())", "0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))", "0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))", "AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)", "~(Zone?,ZoneDelegate?,Zone,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))", "~(Zone,ZoneDelegate,Zone,String)", "~(String)", "Zone(Zone?,ZoneDelegate?,Zone,ZoneSpecification?,Map?)", "0^(0^,0^)", "String(String?)"], + types: ["~()", "Null()", "~(JSObject)", "Object?(@)", "Null(@)", "Null(Object,StackTrace)", "@(@)", "~(@)", "~(Object?)", "~(Object,StackTrace)", "JSObject()", "Object?(Object?)", "bool(Object?)", "~(~())", "Null(JSObject)", "int(Object?)", "String(String)", "bool(_Highlight)", "bool(Object?,Object?)", "Future<~>()", "Null(JavaScriptFunction)", "~(@,StackTrace)", "bool(String)", "int()", "~(@,@)", "~(Object?,Object?)", "@()", "int(int,int)", "String(Match)", "bool()", "Null(JavaScriptFunction,JavaScriptFunction)", "~(Object[StackTrace?])", "int(@,@)", "int(_Line)", "ListMultimapBuilder()", "MapBuilder()", "SetBuilder()", "int(int,@)", "Object?(~)", "JSObject(Object,StackTrace)", "~(String,int?)", "ListBuilder()", "ListBuilder()", "~(ServiceExtensionResponseBuilder)", "~(String,int)", "String(@)", "bool(String,String)", "int(String)", "Null(String,String[Object?])", "bool(Object)", "~(List)", "MediaType()", "~(String,String)", "int(int)", "Logger()", "~(Zone,ZoneDelegate,Zone,Object,StackTrace)", "String(String?)", "String?()", "ListBuilder()", "_Future<@>?()", "Object(_Line)", "Object(_Highlight)", "int(_Highlight,_Highlight)", "List<_Line>(MapEntry>)", "~(int,@)", "SourceSpanWithContext()", "Null(@,StackTrace)", "~(String?)", "Future()", "Null(~())", "Null(WebSocket)", "~(WebSocketEvent)", "Null(Object)", "HotRestartResponse([~(HotRestartResponseBuilder)])", "JSObject(String[bool?])", "~(List)", "ListBuilder(BatchedDebugEventsBuilder)", "Null(String,String)", "DebugEventBuilder(DebugEventBuilder)", "Null(String)", "RegisterEventBuilder(RegisterEventBuilder)", "DevToolsRequestBuilder(DevToolsRequestBuilder)", "Future<~>(String)", "ConnectRequestBuilder(ConnectRequestBuilder)", "IndentingBuiltValueToStringHelper(String)", "~(bool)", "@(String)", "bool(bool)", "List(String)", "int(String,String)", "Null(JavaScriptObject)", "JSObject()()", "SetMultimapBuilder()", "@(@,String)", "~(Zone?,ZoneDelegate?,Zone,Object,StackTrace)", "0^(Zone?,ZoneDelegate?,Zone,0^())", "0^(Zone?,ZoneDelegate?,Zone,0^(1^),1^)", "0^(Zone?,ZoneDelegate?,Zone,0^(1^,2^),1^,2^)", "0^()(Zone,ZoneDelegate,Zone,0^())", "0^(1^)(Zone,ZoneDelegate,Zone,0^(1^))", "0^(1^,2^)(Zone,ZoneDelegate,Zone,0^(1^,2^))", "AsyncError?(Zone,ZoneDelegate,Zone,Object,StackTrace?)", "~(Zone?,ZoneDelegate?,Zone,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~())", "Timer(Zone,ZoneDelegate,Zone,Duration,~(Timer))", "~(Zone,ZoneDelegate,Zone,String)", "~(String)", "Zone(Zone?,ZoneDelegate?,Zone,ZoneSpecification?,Map?)", "0^(0^,0^)", "HotReloadResponse([~(HotReloadResponseBuilder)])", "DebugInfoBuilder(DebugInfoBuilder)"], interceptorsByTag: null, leafTags: null, arrayRti: Symbol("$ti"), rttc: {} }; - A._Universe_addRules(init.typeUniverse, JSON.parse('{"JavaScriptFunction":"LegacyJavaScriptObject","PlainJavaScriptObject":"LegacyJavaScriptObject","UnknownJavaScriptObject":"LegacyJavaScriptObject","JavaScriptObject":{"JSObject":[]},"JSArray":{"List":["1"],"JavaScriptObject":[],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"JSIndexable":["1"],"Iterable.E":"1"},"JSBool":{"bool":[],"TrustedGetRuntimeType":[]},"JSNull":{"Null":[],"TrustedGetRuntimeType":[]},"LegacyJavaScriptObject":{"JavaScriptObject":[],"JSObject":[]},"JSArraySafeToStringHook":{"SafeToStringHook":[]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"JavaScriptObject":[],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"JSIndexable":["1"],"Iterable.E":"1"},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSNumNotInt":{"double":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSString":{"String":[],"Comparable":["String"],"Pattern":[],"JSIndexable":["@"],"TrustedGetRuntimeType":[]},"_CastIterableBase":{"Iterable":["2"]},"CastIterator":{"Iterator":["2"]},"CastIterable":{"_CastIterableBase":["1","2"],"Iterable":["2"],"Iterable.E":"2"},"_EfficientLengthCastIterable":{"CastIterable":["1","2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_CastListBase":{"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","Iterable.E":"2"},"CastMap":{"MapBase":["3","4"],"Map":["3","4"],"MapBase.K":"3","MapBase.V":"4"},"LateError":{"Error":[]},"CodeUnits":{"ListBase":["int"],"UnmodifiableListMixin":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListBase.E":"int","Iterable.E":"int","UnmodifiableListMixin.E":"int"},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"SubListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"ListIterator":{"Iterator":["1"]},"MappedIterable":{"Iterable":["2"],"Iterable.E":"2"},"EfficientLengthMappedIterable":{"MappedIterable":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MappedIterator":{"Iterator":["2"]},"MappedListIterable":{"ListIterable":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListIterable.E":"2","Iterable.E":"2"},"WhereIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereIterator":{"Iterator":["1"]},"ExpandIterable":{"Iterable":["2"],"Iterable.E":"2"},"ExpandIterator":{"Iterator":["2"]},"TakeIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthTakeIterable":{"TakeIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"TakeIterator":{"Iterator":["1"]},"SkipIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthSkipIterable":{"SkipIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipIterator":{"Iterator":["1"]},"EmptyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"EmptyIterator":{"Iterator":["1"]},"WhereTypeIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereTypeIterator":{"Iterator":["1"]},"UnmodifiableListBase":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"_KeysOrValues":{"Iterable":["1"],"Iterable.E":"1"},"_KeysOrValuesOrElementsIterator":{"Iterator":["1"]},"Instantiation":{"Closure":[],"Function":[]},"Instantiation1":{"Closure":[],"Function":[]},"NullError":{"TypeError":[],"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"NullThrownFromJavaScriptException":{"Exception":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"Closure0Args":{"Closure":[],"Function":[]},"Closure2Args":{"Closure":[],"Function":[]},"TearOffClosure":{"Closure":[],"Function":[]},"StaticClosure":{"Closure":[],"Function":[]},"BoundClosure":{"Closure":[],"Function":[]},"RuntimeError":{"Error":[]},"JsLinkedHashMap":{"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"LinkedHashMapKeysIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"LinkedHashMapValuesIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapValueIterator":{"Iterator":["1"]},"LinkedHashMapEntriesIterable":{"EfficientLengthIterable":["MapEntry<1,2>"],"Iterable":["MapEntry<1,2>"],"Iterable.E":"MapEntry<1,2>"},"LinkedHashMapEntryIterator":{"Iterator":["MapEntry<1,2>"]},"JsIdentityLinkedHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"JSSyntaxRegExp":{"RegExp":[],"Pattern":[]},"_MatchImplementation":{"RegExpMatch":[],"Match":[]},"_AllMatchesIterable":{"Iterable":["RegExpMatch"],"Iterable.E":"RegExpMatch"},"_AllMatchesIterator":{"Iterator":["RegExpMatch"]},"StringMatch":{"Match":[]},"_StringAllMatchesIterable":{"Iterable":["Match"],"Iterable.E":"Match"},"_StringAllMatchesIterator":{"Iterator":["Match"]},"NativeByteBuffer":{"JavaScriptObject":[],"JSObject":[],"ByteBuffer":[],"TrustedGetRuntimeType":[]},"NativeTypedData":{"JavaScriptObject":[],"JSObject":[]},"NativeByteData":{"JavaScriptObject":[],"ByteData":[],"JSObject":[],"TrustedGetRuntimeType":[]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"],"JavaScriptObject":[],"JSObject":[],"JSIndexable":["1"]},"NativeTypedArrayOfDouble":{"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"Float32List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double","FixedLengthListMixin.E":"double"},"NativeFloat64List":{"Float64List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double","FixedLengthListMixin.E":"double"},"NativeInt16List":{"NativeTypedArrayOfInt":[],"Int16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeInt32List":{"NativeTypedArrayOfInt":[],"Int32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeInt8List":{"NativeTypedArrayOfInt":[],"Int8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint16List":{"NativeTypedArrayOfInt":[],"Uint16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint32List":{"NativeTypedArrayOfInt":[],"Uint32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8ClampedList":{"NativeTypedArrayOfInt":[],"Uint8ClampedList":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8List":{"NativeTypedArrayOfInt":[],"Uint8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"_Type":{"Type":[]},"_Error":{"Error":[]},"_TypeError":{"TypeError":[],"Error":[]},"AsyncError":{"Error":[]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_SyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_Future":{"Future":["1"]},"StreamView":{"Stream":["1"]},"_StreamController":{"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_SyncStreamController":{"_SyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamSinkWrapper":{"StreamSink":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_DoneStreamSubscription":{"StreamSubscription":["1"]},"_EmptyStream":{"Stream":["1"],"Stream.T":"1"},"_ForwardingStream":{"Stream":["2"]},"_ForwardingStreamSubscription":{"_BufferingStreamSubscription":["2"],"StreamSubscription":["2"],"_EventSink":["2"],"_EventDispatch":["2"],"_BufferingStreamSubscription.T":"2"},"_MapStream":{"_ForwardingStream":["1","2"],"Stream":["2"],"Stream.T":"2"},"_ZoneSpecification":{"ZoneSpecification":[]},"_ZoneDelegate":{"ZoneDelegate":[]},"_Zone":{"Zone":[]},"_CustomZone":{"_Zone":[],"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"_SplayTreeSetNode":{"_SplayTreeNode":["1","_SplayTreeSetNode<1>"],"_SplayTreeNode.K":"1","_SplayTreeNode.1":"_SplayTreeSetNode<1>"},"_HashMap":{"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_IdentityHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_CustomHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashMapKeyIterator":{"Iterator":["1"]},"_LinkedCustomHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashSetIterator":{"Iterator":["1"]},"_LinkedHashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_LinkedHashSetIterator":{"Iterator":["1"]},"UnmodifiableListView":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","Iterable.E":"1","UnmodifiableListMixin.E":"1"},"ListBase":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"MapBase":{"Map":["1","2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ListQueue":{"Queue":["1"],"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_ListQueueIterator":{"Iterator":["1"]},"SetBase":{"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SetBase":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SplayTreeIterator":{"Iterator":["3"]},"_SplayTreeKeyIterator":{"_SplayTreeIterator":["1","2","1"],"Iterator":["1"],"_SplayTreeIterator.K":"1","_SplayTreeIterator.T":"1","_SplayTreeIterator.1":"2"},"SplayTreeSet":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"_SplayTree":["1","_SplayTreeSetNode<1>"],"Iterable":["1"],"Iterable.E":"1","_SplayTree.1":"_SplayTreeSetNode<1>","_SplayTree.K":"1"},"Encoding":{"Codec":["String","List"]},"_JsonMap":{"MapBase":["String","@"],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ListIterable.E":"String","Iterable.E":"String"},"AsciiCodec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"_UnicodeSubsetEncoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"AsciiEncoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"_UnicodeSubsetDecoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"AsciiDecoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"Base64Codec":{"Codec":["List","String"],"Codec.S":"List"},"Base64Encoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"Base64Decoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"Converter":{"StreamTransformer":["1","2"]},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"JsonEncoder":{"Converter":["Object?","String"],"StreamTransformer":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"],"StreamTransformer":["String","Object?"]},"Latin1Codec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"Latin1Encoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"Latin1Decoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"Utf8Codec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"Utf8Encoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"Utf8Decoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"BigInt":{"Comparable":["BigInt"]},"DateTime":{"Comparable":["DateTime"]},"double":{"num":[],"Comparable":["num"]},"Duration":{"Comparable":["Duration"]},"int":{"num":[],"Comparable":["num"]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"num":{"Comparable":["num"]},"RegExp":{"Pattern":[]},"RegExpMatch":{"Match":[]},"Set":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"String":{"Comparable":["String"],"Pattern":[]},"_BigIntImpl":{"BigInt":[],"Comparable":["BigInt"]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"_Exception":{"Exception":[]},"FormatException":{"Exception":[]},"IntegerDivisionByZeroException":{"Exception":[],"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"NullRejectionException":{"Exception":[]},"_JSRandom":{"Random":[]},"DelegatingStreamSink":{"StreamSink":["1"]},"ErrorResult":{"Result":["0&"]},"ValueResult":{"Result":["1"]},"_NextRequest":{"_EventRequest":["1"]},"_HasNextRequest":{"_EventRequest":["1"]},"BuiltList":{"Iterable":["1"]},"_BuiltList":{"BuiltList":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltListMultimap":{"BuiltListMultimap":["1","2"]},"_BuiltMap":{"BuiltMap":["1","2"]},"BuiltSet":{"Iterable":["1"]},"_BuiltSet":{"BuiltSet":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltSetMultimap":{"BuiltSetMultimap":["1","2"]},"BuiltValueNullFieldError":{"Error":[]},"BuiltValueNestedFieldError":{"Error":[]},"BoolJsonObject":{"JsonObject":[]},"ListJsonObject":{"JsonObject":[]},"MapJsonObject":{"JsonObject":[]},"NumJsonObject":{"JsonObject":[]},"StringJsonObject":{"JsonObject":[]},"DeserializationError":{"Error":[]},"BigIntSerializer":{"PrimitiveSerializer":["BigInt"],"Serializer":["BigInt"]},"BoolSerializer":{"PrimitiveSerializer":["bool"],"Serializer":["bool"]},"BuiltJsonSerializers":{"Serializers":[]},"BuiltListMultimapSerializer":{"StructuredSerializer":["BuiltListMultimap<@,@>"],"Serializer":["BuiltListMultimap<@,@>"]},"BuiltListSerializer":{"StructuredSerializer":["BuiltList<@>"],"Serializer":["BuiltList<@>"]},"BuiltMapSerializer":{"StructuredSerializer":["BuiltMap<@,@>"],"Serializer":["BuiltMap<@,@>"]},"BuiltSetMultimapSerializer":{"StructuredSerializer":["BuiltSetMultimap<@,@>"],"Serializer":["BuiltSetMultimap<@,@>"]},"BuiltSetSerializer":{"StructuredSerializer":["BuiltSet<@>"],"Serializer":["BuiltSet<@>"]},"DateTimeSerializer":{"PrimitiveSerializer":["DateTime"],"Serializer":["DateTime"]},"DoubleSerializer":{"PrimitiveSerializer":["double"],"Serializer":["double"]},"DurationSerializer":{"PrimitiveSerializer":["Duration"],"Serializer":["Duration"]},"Int32Serializer":{"PrimitiveSerializer":["Int32"],"Serializer":["Int32"]},"Int64Serializer":{"PrimitiveSerializer":["Int64"],"Serializer":["Int64"]},"IntSerializer":{"PrimitiveSerializer":["int"],"Serializer":["int"]},"JsonObjectSerializer":{"PrimitiveSerializer":["JsonObject"],"Serializer":["JsonObject"]},"ListSerializer":{"StructuredSerializer":["List<@>"],"Serializer":["List<@>"]},"MapSerializer":{"StructuredSerializer":["Map<@,@>"],"Serializer":["Map<@,@>"]},"NullSerializer":{"PrimitiveSerializer":["Null"],"Serializer":["Null"]},"NumSerializer":{"PrimitiveSerializer":["num"],"Serializer":["num"]},"RegExpSerializer":{"PrimitiveSerializer":["RegExp"],"Serializer":["RegExp"]},"SetSerializer":{"StructuredSerializer":["Set<@>"],"Serializer":["Set<@>"]},"StringSerializer":{"PrimitiveSerializer":["String"],"Serializer":["String"]},"Uint8ListSerializer":{"PrimitiveSerializer":["Uint8List"],"Serializer":["Uint8List"]},"UriSerializer":{"PrimitiveSerializer":["Uri"],"Serializer":["Uri"]},"CanonicalizedMap":{"Map":["2","3"]},"DefaultEquality":{"Equality":["1"]},"IterableEquality":{"Equality":["Iterable<1>"]},"ListEquality":{"Equality":["List<1>"]},"_UnorderedEquality":{"Equality":["2"]},"SetEquality":{"_UnorderedEquality":["1","Set<1>"],"Equality":["Set<1>"],"_UnorderedEquality.E":"1","_UnorderedEquality.T":"Set<1>"},"MapEquality":{"Equality":["Map<1,2>"]},"DeepCollectionEquality":{"Equality":["@"]},"QueueList":{"ListBase":["1"],"List":["1"],"Queue":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","QueueList.E":"1","Iterable.E":"1"},"_CastQueueList":{"QueueList":["2"],"ListBase":["2"],"List":["2"],"Queue":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","QueueList.E":"2","Iterable.E":"2"},"_$BuildStatusSerializer":{"PrimitiveSerializer":["BuildStatus"],"Serializer":["BuildStatus"]},"_$BuildResultSerializer":{"StructuredSerializer":["BuildResult"],"Serializer":["BuildResult"]},"_$BuildResult":{"BuildResult":[]},"_$ConnectRequestSerializer":{"StructuredSerializer":["ConnectRequest"],"Serializer":["ConnectRequest"]},"_$ConnectRequest":{"ConnectRequest":[]},"_$DebugEventSerializer":{"StructuredSerializer":["DebugEvent"],"Serializer":["DebugEvent"]},"_$BatchedDebugEventsSerializer":{"StructuredSerializer":["BatchedDebugEvents"],"Serializer":["BatchedDebugEvents"]},"_$DebugEvent":{"DebugEvent":[]},"_$BatchedDebugEvents":{"BatchedDebugEvents":[]},"_$DebugInfoSerializer":{"StructuredSerializer":["DebugInfo"],"Serializer":["DebugInfo"]},"_$DebugInfo":{"DebugInfo":[]},"_$DevToolsRequestSerializer":{"StructuredSerializer":["DevToolsRequest"],"Serializer":["DevToolsRequest"]},"_$DevToolsResponseSerializer":{"StructuredSerializer":["DevToolsResponse"],"Serializer":["DevToolsResponse"]},"_$DevToolsRequest":{"DevToolsRequest":[]},"_$DevToolsResponse":{"DevToolsResponse":[]},"_$ErrorResponseSerializer":{"StructuredSerializer":["ErrorResponse"],"Serializer":["ErrorResponse"]},"_$ErrorResponse":{"ErrorResponse":[]},"_$ExtensionRequestSerializer":{"StructuredSerializer":["ExtensionRequest"],"Serializer":["ExtensionRequest"]},"_$ExtensionResponseSerializer":{"StructuredSerializer":["ExtensionResponse"],"Serializer":["ExtensionResponse"]},"_$ExtensionEventSerializer":{"StructuredSerializer":["ExtensionEvent"],"Serializer":["ExtensionEvent"]},"_$BatchedEventsSerializer":{"StructuredSerializer":["BatchedEvents"],"Serializer":["BatchedEvents"]},"_$ExtensionRequest":{"ExtensionRequest":[]},"_$ExtensionResponse":{"ExtensionResponse":[]},"_$ExtensionEvent":{"ExtensionEvent":[]},"_$BatchedEvents":{"BatchedEvents":[]},"_$HotReloadRequestSerializer":{"StructuredSerializer":["HotReloadRequest"],"Serializer":["HotReloadRequest"]},"_$HotReloadRequest":{"HotReloadRequest":[]},"_$HotReloadResponseSerializer":{"StructuredSerializer":["HotReloadResponse"],"Serializer":["HotReloadResponse"]},"_$HotReloadResponse":{"HotReloadResponse":[]},"_$IsolateExitSerializer":{"StructuredSerializer":["IsolateExit"],"Serializer":["IsolateExit"]},"_$IsolateStartSerializer":{"StructuredSerializer":["IsolateStart"],"Serializer":["IsolateStart"]},"_$IsolateExit":{"IsolateExit":[]},"_$IsolateStart":{"IsolateStart":[]},"_$RegisterEventSerializer":{"StructuredSerializer":["RegisterEvent"],"Serializer":["RegisterEvent"]},"_$RegisterEvent":{"RegisterEvent":[]},"_$RunRequestSerializer":{"StructuredSerializer":["RunRequest"],"Serializer":["RunRequest"]},"_$RunRequest":{"RunRequest":[]},"SseSocketClient":{"SocketClient":[]},"WebSocketClient":{"SocketClient":[]},"Int32":{"Comparable":["Object"]},"Int64":{"Comparable":["Object"]},"ByteStream":{"StreamView":["List"],"Stream":["List"],"Stream.T":"List","StreamView.T":"List"},"ClientException":{"Exception":[]},"Request":{"BaseRequest":[]},"StreamedResponseV2":{"StreamedResponse":[]},"CaseInsensitiveMap":{"CanonicalizedMap":["String","String","1"],"Map":["String","1"],"CanonicalizedMap.K":"String","CanonicalizedMap.V":"1","CanonicalizedMap.C":"String"},"Level":{"Comparable":["Level"]},"PathException":{"Exception":[]},"PosixStyle":{"InternalStyle":[]},"UrlStyle":{"InternalStyle":[]},"WindowsStyle":{"InternalStyle":[]},"FileLocation":{"SourceLocation":[],"Comparable":["SourceLocation"]},"_FileSpan":{"SourceSpanWithContext":[],"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceLocation":{"Comparable":["SourceLocation"]},"SourceLocationMixin":{"SourceLocation":[],"Comparable":["SourceLocation"]},"SourceSpan":{"Comparable":["SourceSpan"]},"SourceSpanBase":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanException":{"Exception":[]},"SourceSpanFormatException":{"FormatException":[],"Exception":[]},"SourceSpanMixin":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanWithContext":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SseClient":{"StreamChannel":["String?"]},"GuaranteeChannel":{"StreamChannel":["1"]},"_GuaranteeSink":{"StreamSink":["1"]},"StreamChannelMixin":{"StreamChannel":["1"]},"StringScannerException":{"FormatException":[],"Exception":[]},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"BrowserWebSocket":{"WebSocket":[]},"TextDataReceived":{"WebSocketEvent":[]},"BinaryDataReceived":{"WebSocketEvent":[]},"CloseReceived":{"WebSocketEvent":[]},"WebSocketException":{"Exception":[]},"WebSocketConnectionClosed":{"Exception":[]},"AdapterWebSocketChannel":{"WebSocketChannel":[],"StreamChannel":["@"]},"_WebSocketSink":{"WebSocketSink":[],"DelegatingStreamSink":["@"],"StreamSink":["@"],"DelegatingStreamSink.T":"@"},"WebSocketChannelException":{"Exception":[]},"DdcLibraryBundleRestarter":{"Restarter":[]},"DdcRestarter":{"Restarter":[]},"RequireRestarter":{"Restarter":[]},"HotReloadFailedException":{"Exception":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]}}')); + A._Universe_addRules(init.typeUniverse, JSON.parse('{"JavaScriptFunction":"LegacyJavaScriptObject","PlainJavaScriptObject":"LegacyJavaScriptObject","UnknownJavaScriptObject":"LegacyJavaScriptObject","NativeSharedArrayBuffer":"NativeByteBuffer","JavaScriptObject":{"JSObject":[]},"JSArray":{"List":["1"],"JavaScriptObject":[],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"JSIndexable":["1"],"Iterable.E":"1"},"JSBool":{"bool":[],"TrustedGetRuntimeType":[]},"JSNull":{"Null":[],"TrustedGetRuntimeType":[]},"LegacyJavaScriptObject":{"JavaScriptObject":[],"JSObject":[]},"JSArraySafeToStringHook":{"SafeToStringHook":[]},"JSUnmodifiableArray":{"JSArray":["1"],"List":["1"],"JavaScriptObject":[],"EfficientLengthIterable":["1"],"JSObject":[],"Iterable":["1"],"JSIndexable":["1"],"Iterable.E":"1"},"ArrayIterator":{"Iterator":["1"]},"JSNumber":{"double":[],"num":[],"Comparable":["num"]},"JSInt":{"double":[],"int":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSNumNotInt":{"double":[],"num":[],"Comparable":["num"],"TrustedGetRuntimeType":[]},"JSString":{"String":[],"Comparable":["String"],"Pattern":[],"JSIndexable":["@"],"TrustedGetRuntimeType":[]},"_CastIterableBase":{"Iterable":["2"]},"CastIterator":{"Iterator":["2"]},"CastIterable":{"_CastIterableBase":["1","2"],"Iterable":["2"],"Iterable.E":"2"},"_EfficientLengthCastIterable":{"CastIterable":["1","2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"_CastListBase":{"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"]},"CastList":{"_CastListBase":["1","2"],"ListBase":["2"],"List":["2"],"_CastIterableBase":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","Iterable.E":"2"},"CastMap":{"MapBase":["3","4"],"Map":["3","4"],"MapBase.K":"3","MapBase.V":"4"},"LateError":{"Error":[]},"CodeUnits":{"ListBase":["int"],"UnmodifiableListMixin":["int"],"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"],"ListBase.E":"int","Iterable.E":"int","UnmodifiableListMixin.E":"int"},"EfficientLengthIterable":{"Iterable":["1"]},"ListIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"SubListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"ListIterator":{"Iterator":["1"]},"MappedIterable":{"Iterable":["2"],"Iterable.E":"2"},"EfficientLengthMappedIterable":{"MappedIterable":["1","2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"Iterable.E":"2"},"MappedIterator":{"Iterator":["2"]},"MappedListIterable":{"ListIterable":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListIterable.E":"2","Iterable.E":"2"},"WhereIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereIterator":{"Iterator":["1"]},"ExpandIterable":{"Iterable":["2"],"Iterable.E":"2"},"ExpandIterator":{"Iterator":["2"]},"TakeIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthTakeIterable":{"TakeIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"TakeIterator":{"Iterator":["1"]},"SkipIterable":{"Iterable":["1"],"Iterable.E":"1"},"EfficientLengthSkipIterable":{"SkipIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"SkipIterator":{"Iterator":["1"]},"EmptyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"EmptyIterator":{"Iterator":["1"]},"WhereTypeIterable":{"Iterable":["1"],"Iterable.E":"1"},"WhereTypeIterator":{"Iterator":["1"]},"UnmodifiableListBase":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"ReversedListIterable":{"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"ConstantMap":{"Map":["1","2"]},"ConstantStringMap":{"ConstantMap":["1","2"],"Map":["1","2"]},"_KeysOrValues":{"Iterable":["1"],"Iterable.E":"1"},"_KeysOrValuesOrElementsIterator":{"Iterator":["1"]},"Instantiation":{"Closure":[],"Function":[]},"Instantiation1":{"Closure":[],"Function":[]},"NullError":{"TypeError":[],"Error":[]},"JsNoSuchMethodError":{"Error":[]},"UnknownJsTypeError":{"Error":[]},"NullThrownFromJavaScriptException":{"Exception":[]},"_StackTrace":{"StackTrace":[]},"Closure":{"Function":[]},"Closure0Args":{"Closure":[],"Function":[]},"Closure2Args":{"Closure":[],"Function":[]},"TearOffClosure":{"Closure":[],"Function":[]},"StaticClosure":{"Closure":[],"Function":[]},"BoundClosure":{"Closure":[],"Function":[]},"RuntimeError":{"Error":[]},"JsLinkedHashMap":{"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"LinkedHashMapKeysIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapKeyIterator":{"Iterator":["1"]},"LinkedHashMapValuesIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"LinkedHashMapValueIterator":{"Iterator":["1"]},"LinkedHashMapEntriesIterable":{"EfficientLengthIterable":["MapEntry<1,2>"],"Iterable":["MapEntry<1,2>"],"Iterable.E":"MapEntry<1,2>"},"LinkedHashMapEntryIterator":{"Iterator":["MapEntry<1,2>"]},"JsIdentityLinkedHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"JSSyntaxRegExp":{"RegExp":[],"Pattern":[]},"_MatchImplementation":{"RegExpMatch":[],"Match":[]},"_AllMatchesIterable":{"Iterable":["RegExpMatch"],"Iterable.E":"RegExpMatch"},"_AllMatchesIterator":{"Iterator":["RegExpMatch"]},"StringMatch":{"Match":[]},"_StringAllMatchesIterable":{"Iterable":["Match"],"Iterable.E":"Match"},"_StringAllMatchesIterator":{"Iterator":["Match"]},"NativeByteBuffer":{"JavaScriptObject":[],"JSObject":[],"ByteBuffer":[],"TrustedGetRuntimeType":[]},"NativeArrayBuffer":{"NativeByteBuffer":[],"JavaScriptObject":[],"JSObject":[],"ByteBuffer":[],"TrustedGetRuntimeType":[]},"NativeTypedData":{"JavaScriptObject":[],"JSObject":[]},"_UnmodifiableNativeByteBufferView":{"ByteBuffer":[]},"NativeByteData":{"JavaScriptObject":[],"ByteData":[],"JSObject":[],"TrustedGetRuntimeType":[]},"NativeTypedArray":{"JavaScriptIndexingBehavior":["1"],"JavaScriptObject":[],"JSObject":[],"JSIndexable":["1"]},"NativeTypedArrayOfDouble":{"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"]},"NativeTypedArrayOfInt":{"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"]},"NativeFloat32List":{"Float32List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double","FixedLengthListMixin.E":"double"},"NativeFloat64List":{"Float64List":[],"ListBase":["double"],"NativeTypedArray":["double"],"List":["double"],"JavaScriptIndexingBehavior":["double"],"JavaScriptObject":[],"EfficientLengthIterable":["double"],"JSObject":[],"JSIndexable":["double"],"Iterable":["double"],"FixedLengthListMixin":["double"],"TrustedGetRuntimeType":[],"ListBase.E":"double","Iterable.E":"double","FixedLengthListMixin.E":"double"},"NativeInt16List":{"NativeTypedArrayOfInt":[],"Int16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeInt32List":{"NativeTypedArrayOfInt":[],"Int32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeInt8List":{"NativeTypedArrayOfInt":[],"Int8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint16List":{"NativeTypedArrayOfInt":[],"Uint16List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint32List":{"NativeTypedArrayOfInt":[],"Uint32List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8ClampedList":{"NativeTypedArrayOfInt":[],"Uint8ClampedList":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"NativeUint8List":{"NativeTypedArrayOfInt":[],"Uint8List":[],"ListBase":["int"],"NativeTypedArray":["int"],"List":["int"],"JavaScriptIndexingBehavior":["int"],"JavaScriptObject":[],"EfficientLengthIterable":["int"],"JSObject":[],"JSIndexable":["int"],"Iterable":["int"],"FixedLengthListMixin":["int"],"TrustedGetRuntimeType":[],"ListBase.E":"int","Iterable.E":"int","FixedLengthListMixin.E":"int"},"_Type":{"Type":[]},"_Error":{"Error":[]},"_TypeError":{"TypeError":[],"Error":[]},"AsyncError":{"Error":[]},"_Future":{"Future":["1"]},"_TimerImpl":{"Timer":[]},"_AsyncAwaitCompleter":{"Completer":["1"]},"_Completer":{"Completer":["1"]},"_AsyncCompleter":{"_Completer":["1"],"Completer":["1"]},"_SyncCompleter":{"_Completer":["1"],"Completer":["1"]},"StreamView":{"Stream":["1"]},"_StreamController":{"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_AsyncStreamController":{"_AsyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_SyncStreamController":{"_SyncStreamControllerDispatch":["1"],"_StreamController":["1"],"StreamController":["1"],"StreamSink":["1"],"_StreamControllerLifecycle":["1"],"_EventSink":["1"],"_EventDispatch":["1"]},"_ControllerStream":{"_StreamImpl":["1"],"Stream":["1"],"Stream.T":"1"},"_ControllerSubscription":{"_BufferingStreamSubscription":["1"],"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamSinkWrapper":{"StreamSink":["1"]},"_StreamControllerAddStreamState":{"_AddStreamState":["1"]},"_BufferingStreamSubscription":{"StreamSubscription":["1"],"_EventSink":["1"],"_EventDispatch":["1"],"_BufferingStreamSubscription.T":"1"},"_StreamImpl":{"Stream":["1"]},"_DelayedData":{"_DelayedEvent":["1"]},"_DelayedError":{"_DelayedEvent":["@"]},"_DelayedDone":{"_DelayedEvent":["@"]},"_DoneStreamSubscription":{"StreamSubscription":["1"]},"_EmptyStream":{"Stream":["1"],"Stream.T":"1"},"_ForwardingStream":{"Stream":["2"]},"_ForwardingStreamSubscription":{"_BufferingStreamSubscription":["2"],"StreamSubscription":["2"],"_EventSink":["2"],"_EventDispatch":["2"],"_BufferingStreamSubscription.T":"2"},"_MapStream":{"_ForwardingStream":["1","2"],"Stream":["2"],"Stream.T":"2"},"_ZoneSpecification":{"ZoneSpecification":[]},"_ZoneDelegate":{"ZoneDelegate":[]},"_Zone":{"Zone":[]},"_CustomZone":{"_Zone":[],"Zone":[]},"_RootZone":{"_Zone":[],"Zone":[]},"_SplayTreeSetNode":{"_SplayTreeNode":["1","_SplayTreeSetNode<1>"],"_SplayTreeNode.K":"1","_SplayTreeNode.1":"_SplayTreeSetNode<1>"},"_HashMap":{"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_IdentityHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_CustomHashMap":{"_HashMap":["1","2"],"MapBase":["1","2"],"HashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashMapKeyIterable":{"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashMapKeyIterator":{"Iterator":["1"]},"_LinkedCustomHashMap":{"JsLinkedHashMap":["1","2"],"MapBase":["1","2"],"LinkedHashMap":["1","2"],"Map":["1","2"],"MapBase.K":"1","MapBase.V":"2"},"_HashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_HashSetIterator":{"Iterator":["1"]},"_LinkedHashSet":{"_SetBase":["1"],"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"Iterable.E":"1"},"_LinkedHashSetIterator":{"Iterator":["1"]},"UnmodifiableListView":{"ListBase":["1"],"UnmodifiableListMixin":["1"],"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","Iterable.E":"1","UnmodifiableListMixin.E":"1"},"ListBase":{"List":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"MapBase":{"Map":["1","2"]},"MapView":{"Map":["1","2"]},"UnmodifiableMapView":{"_UnmodifiableMapView_MapView__UnmodifiableMapMixin":["1","2"],"MapView":["1","2"],"_UnmodifiableMapMixin":["1","2"],"Map":["1","2"]},"ListQueue":{"Queue":["1"],"ListIterable":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListIterable.E":"1","Iterable.E":"1"},"_ListQueueIterator":{"Iterator":["1"]},"SetBase":{"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SetBase":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"]},"_SplayTreeIterator":{"Iterator":["3"]},"_SplayTreeKeyIterator":{"_SplayTreeIterator":["1","2","1"],"Iterator":["1"],"_SplayTreeIterator.K":"1","_SplayTreeIterator.T":"1","_SplayTreeIterator.1":"2"},"SplayTreeSet":{"SetBase":["1"],"Set":["1"],"EfficientLengthIterable":["1"],"_SplayTree":["1","_SplayTreeSetNode<1>"],"Iterable":["1"],"Iterable.E":"1","_SplayTree.1":"_SplayTreeSetNode<1>","_SplayTree.K":"1"},"Encoding":{"Codec":["String","List"]},"_JsonMap":{"MapBase":["String","@"],"Map":["String","@"],"MapBase.K":"String","MapBase.V":"@"},"_JsonMapKeyIterable":{"ListIterable":["String"],"EfficientLengthIterable":["String"],"Iterable":["String"],"ListIterable.E":"String","Iterable.E":"String"},"AsciiCodec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"_UnicodeSubsetEncoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"AsciiEncoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"_UnicodeSubsetDecoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"AsciiDecoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"Base64Codec":{"Codec":["List","String"],"Codec.S":"List"},"Base64Encoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"Base64Decoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"Converter":{"StreamTransformer":["1","2"]},"JsonUnsupportedObjectError":{"Error":[]},"JsonCyclicError":{"Error":[]},"JsonCodec":{"Codec":["Object?","String"],"Codec.S":"Object?"},"JsonEncoder":{"Converter":["Object?","String"],"StreamTransformer":["Object?","String"]},"JsonDecoder":{"Converter":["String","Object?"],"StreamTransformer":["String","Object?"]},"Latin1Codec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"Latin1Encoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"Latin1Decoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"Utf8Codec":{"Encoding":[],"Codec":["String","List"],"Codec.S":"String"},"Utf8Encoder":{"Converter":["String","List"],"StreamTransformer":["String","List"]},"Utf8Decoder":{"Converter":["List","String"],"StreamTransformer":["List","String"]},"BigInt":{"Comparable":["BigInt"]},"DateTime":{"Comparable":["DateTime"]},"double":{"num":[],"Comparable":["num"]},"Duration":{"Comparable":["Duration"]},"int":{"num":[],"Comparable":["num"]},"List":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"num":{"Comparable":["num"]},"RegExp":{"Pattern":[]},"RegExpMatch":{"Match":[]},"Set":{"EfficientLengthIterable":["1"],"Iterable":["1"]},"String":{"Comparable":["String"],"Pattern":[]},"_BigIntImpl":{"BigInt":[],"Comparable":["BigInt"]},"AssertionError":{"Error":[]},"TypeError":{"Error":[]},"ArgumentError":{"Error":[]},"RangeError":{"Error":[]},"IndexError":{"Error":[]},"UnsupportedError":{"Error":[]},"UnimplementedError":{"Error":[]},"StateError":{"Error":[]},"ConcurrentModificationError":{"Error":[]},"OutOfMemoryError":{"Error":[]},"StackOverflowError":{"Error":[]},"_Exception":{"Exception":[]},"FormatException":{"Exception":[]},"IntegerDivisionByZeroException":{"Exception":[],"Error":[]},"_StringStackTrace":{"StackTrace":[]},"StringBuffer":{"StringSink":[]},"_Uri":{"Uri":[]},"_SimpleUri":{"Uri":[]},"_DataUri":{"Uri":[]},"NullRejectionException":{"Exception":[]},"DelegatingStreamSink":{"StreamSink":["1"]},"ErrorResult":{"Result":["0&"]},"ValueResult":{"Result":["1"]},"_NextRequest":{"_EventRequest":["1"]},"_HasNextRequest":{"_EventRequest":["1"]},"BuiltList":{"Iterable":["1"]},"_BuiltList":{"BuiltList":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltListMultimap":{"BuiltListMultimap":["1","2"]},"_BuiltMap":{"BuiltMap":["1","2"]},"BuiltSet":{"Iterable":["1"]},"_BuiltSet":{"BuiltSet":["1"],"Iterable":["1"],"Iterable.E":"1"},"_BuiltSetMultimap":{"BuiltSetMultimap":["1","2"]},"BuiltValueNullFieldError":{"Error":[]},"BuiltValueNestedFieldError":{"Error":[]},"BoolJsonObject":{"JsonObject":[]},"ListJsonObject":{"JsonObject":[]},"MapJsonObject":{"JsonObject":[]},"NumJsonObject":{"JsonObject":[]},"StringJsonObject":{"JsonObject":[]},"DeserializationError":{"Error":[]},"BigIntSerializer":{"PrimitiveSerializer":["BigInt"],"Serializer":["BigInt"]},"BoolSerializer":{"PrimitiveSerializer":["bool"],"Serializer":["bool"]},"BuiltJsonSerializers":{"Serializers":[]},"BuiltListMultimapSerializer":{"StructuredSerializer":["BuiltListMultimap<@,@>"],"Serializer":["BuiltListMultimap<@,@>"]},"BuiltListSerializer":{"StructuredSerializer":["BuiltList<@>"],"Serializer":["BuiltList<@>"]},"BuiltMapSerializer":{"StructuredSerializer":["BuiltMap<@,@>"],"Serializer":["BuiltMap<@,@>"]},"BuiltSetMultimapSerializer":{"StructuredSerializer":["BuiltSetMultimap<@,@>"],"Serializer":["BuiltSetMultimap<@,@>"]},"BuiltSetSerializer":{"StructuredSerializer":["BuiltSet<@>"],"Serializer":["BuiltSet<@>"]},"DateTimeSerializer":{"PrimitiveSerializer":["DateTime"],"Serializer":["DateTime"]},"DoubleSerializer":{"PrimitiveSerializer":["double"],"Serializer":["double"]},"DurationSerializer":{"PrimitiveSerializer":["Duration"],"Serializer":["Duration"]},"Int32Serializer":{"PrimitiveSerializer":["Int32"],"Serializer":["Int32"]},"Int64Serializer":{"PrimitiveSerializer":["Int64"],"Serializer":["Int64"]},"IntSerializer":{"PrimitiveSerializer":["int"],"Serializer":["int"]},"JsonObjectSerializer":{"PrimitiveSerializer":["JsonObject"],"Serializer":["JsonObject"]},"ListSerializer":{"StructuredSerializer":["List<@>"],"Serializer":["List<@>"]},"MapSerializer":{"StructuredSerializer":["Map<@,@>"],"Serializer":["Map<@,@>"]},"NullSerializer":{"PrimitiveSerializer":["Null"],"Serializer":["Null"]},"NumSerializer":{"PrimitiveSerializer":["num"],"Serializer":["num"]},"RegExpSerializer":{"PrimitiveSerializer":["RegExp"],"Serializer":["RegExp"]},"SetSerializer":{"StructuredSerializer":["Set<@>"],"Serializer":["Set<@>"]},"StringSerializer":{"PrimitiveSerializer":["String"],"Serializer":["String"]},"Uint8ListSerializer":{"PrimitiveSerializer":["Uint8List"],"Serializer":["Uint8List"]},"UriSerializer":{"PrimitiveSerializer":["Uri"],"Serializer":["Uri"]},"CanonicalizedMap":{"Map":["2","3"]},"DefaultEquality":{"Equality":["1"]},"IterableEquality":{"Equality":["Iterable<1>"]},"ListEquality":{"Equality":["List<1>"]},"_UnorderedEquality":{"Equality":["2"]},"SetEquality":{"_UnorderedEquality":["1","Set<1>"],"Equality":["Set<1>"],"_UnorderedEquality.E":"1","_UnorderedEquality.T":"Set<1>"},"MapEquality":{"Equality":["Map<1,2>"]},"DeepCollectionEquality":{"Equality":["@"]},"QueueList":{"ListBase":["1"],"List":["1"],"Queue":["1"],"EfficientLengthIterable":["1"],"Iterable":["1"],"ListBase.E":"1","QueueList.E":"1","Iterable.E":"1"},"_CastQueueList":{"QueueList":["2"],"ListBase":["2"],"List":["2"],"Queue":["2"],"EfficientLengthIterable":["2"],"Iterable":["2"],"ListBase.E":"2","QueueList.E":"2","Iterable.E":"2"},"_$BuildStatusSerializer":{"PrimitiveSerializer":["BuildStatus"],"Serializer":["BuildStatus"]},"_$BuildResultSerializer":{"StructuredSerializer":["BuildResult"],"Serializer":["BuildResult"]},"_$BuildResult":{"BuildResult":[]},"_$ConnectRequestSerializer":{"StructuredSerializer":["ConnectRequest"],"Serializer":["ConnectRequest"]},"_$ConnectRequest":{"ConnectRequest":[]},"_$DebugEventSerializer":{"StructuredSerializer":["DebugEvent"],"Serializer":["DebugEvent"]},"_$BatchedDebugEventsSerializer":{"StructuredSerializer":["BatchedDebugEvents"],"Serializer":["BatchedDebugEvents"]},"_$DebugEvent":{"DebugEvent":[]},"_$BatchedDebugEvents":{"BatchedDebugEvents":[]},"_$DebugInfoSerializer":{"StructuredSerializer":["DebugInfo"],"Serializer":["DebugInfo"]},"_$DebugInfo":{"DebugInfo":[]},"_$DevToolsRequestSerializer":{"StructuredSerializer":["DevToolsRequest"],"Serializer":["DevToolsRequest"]},"_$DevToolsResponseSerializer":{"StructuredSerializer":["DevToolsResponse"],"Serializer":["DevToolsResponse"]},"_$DevToolsRequest":{"DevToolsRequest":[]},"_$DevToolsResponse":{"DevToolsResponse":[]},"_$ErrorResponseSerializer":{"StructuredSerializer":["ErrorResponse"],"Serializer":["ErrorResponse"]},"_$ErrorResponse":{"ErrorResponse":[]},"_$ExtensionRequestSerializer":{"StructuredSerializer":["ExtensionRequest"],"Serializer":["ExtensionRequest"]},"_$ExtensionResponseSerializer":{"StructuredSerializer":["ExtensionResponse"],"Serializer":["ExtensionResponse"]},"_$ExtensionEventSerializer":{"StructuredSerializer":["ExtensionEvent"],"Serializer":["ExtensionEvent"]},"_$BatchedEventsSerializer":{"StructuredSerializer":["BatchedEvents"],"Serializer":["BatchedEvents"]},"_$ExtensionRequest":{"ExtensionRequest":[]},"_$ExtensionResponse":{"ExtensionResponse":[]},"_$ExtensionEvent":{"ExtensionEvent":[]},"_$BatchedEvents":{"BatchedEvents":[]},"_$HotReloadRequestSerializer":{"StructuredSerializer":["HotReloadRequest"],"Serializer":["HotReloadRequest"]},"_$HotReloadRequest":{"HotReloadRequest":[]},"_$HotReloadResponseSerializer":{"StructuredSerializer":["HotReloadResponse"],"Serializer":["HotReloadResponse"]},"_$HotReloadResponse":{"HotReloadResponse":[]},"_$HotRestartRequestSerializer":{"StructuredSerializer":["HotRestartRequest"],"Serializer":["HotRestartRequest"]},"_$HotRestartRequest":{"HotRestartRequest":[]},"_$HotRestartResponseSerializer":{"StructuredSerializer":["HotRestartResponse"],"Serializer":["HotRestartResponse"]},"_$HotRestartResponse":{"HotRestartResponse":[]},"_$IsolateExitSerializer":{"StructuredSerializer":["IsolateExit"],"Serializer":["IsolateExit"]},"_$IsolateStartSerializer":{"StructuredSerializer":["IsolateStart"],"Serializer":["IsolateStart"]},"_$IsolateExit":{"IsolateExit":[]},"_$IsolateStart":{"IsolateStart":[]},"_$RegisterEventSerializer":{"StructuredSerializer":["RegisterEvent"],"Serializer":["RegisterEvent"]},"_$RegisterEvent":{"RegisterEvent":[]},"_$RunRequestSerializer":{"StructuredSerializer":["RunRequest"],"Serializer":["RunRequest"]},"_$RunRequest":{"RunRequest":[]},"_$ServiceExtensionRequestSerializer":{"StructuredSerializer":["ServiceExtensionRequest"],"Serializer":["ServiceExtensionRequest"]},"_$ServiceExtensionRequest":{"ServiceExtensionRequest":[]},"_$ServiceExtensionResponseSerializer":{"StructuredSerializer":["ServiceExtensionResponse"],"Serializer":["ServiceExtensionResponse"]},"_$ServiceExtensionResponse":{"ServiceExtensionResponse":[]},"SseSocketClient":{"SocketClient":[]},"WebSocketClient":{"SocketClient":[]},"Int32":{"Comparable":["Object"]},"Int64":{"Comparable":["Object"]},"ByteStream":{"StreamView":["List"],"Stream":["List"],"Stream.T":"List","StreamView.T":"List"},"ClientException":{"Exception":[]},"Request":{"BaseRequest":[]},"StreamedResponseV2":{"StreamedResponse":[]},"CaseInsensitiveMap":{"CanonicalizedMap":["String","String","1"],"Map":["String","1"],"CanonicalizedMap.K":"String","CanonicalizedMap.V":"1","CanonicalizedMap.C":"String"},"Level":{"Comparable":["Level"]},"PathException":{"Exception":[]},"PosixStyle":{"InternalStyle":[]},"UrlStyle":{"InternalStyle":[]},"WindowsStyle":{"InternalStyle":[]},"FileLocation":{"SourceLocation":[],"Comparable":["SourceLocation"]},"_FileSpan":{"SourceSpanWithContext":[],"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceLocation":{"Comparable":["SourceLocation"]},"SourceLocationMixin":{"SourceLocation":[],"Comparable":["SourceLocation"]},"SourceSpan":{"Comparable":["SourceSpan"]},"SourceSpanBase":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanException":{"Exception":[]},"SourceSpanFormatException":{"FormatException":[],"Exception":[]},"SourceSpanMixin":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SourceSpanWithContext":{"SourceSpan":[],"Comparable":["SourceSpan"]},"SseClient":{"StreamChannel":["String?"]},"GuaranteeChannel":{"StreamChannel":["1"]},"_GuaranteeSink":{"StreamSink":["1"]},"StreamChannelMixin":{"StreamChannel":["1"]},"StringScannerException":{"FormatException":[],"Exception":[]},"_EventStream":{"Stream":["1"],"Stream.T":"1"},"_EventStreamSubscription":{"StreamSubscription":["1"]},"BrowserWebSocket":{"WebSocket":[]},"TextDataReceived":{"WebSocketEvent":[]},"BinaryDataReceived":{"WebSocketEvent":[]},"CloseReceived":{"WebSocketEvent":[]},"WebSocketException":{"Exception":[]},"WebSocketConnectionClosed":{"Exception":[]},"AdapterWebSocketChannel":{"WebSocketChannel":[],"StreamChannel":["@"]},"_WebSocketSink":{"WebSocketSink":[],"DelegatingStreamSink":["@"],"StreamSink":["@"],"DelegatingStreamSink.T":"@"},"WebSocketChannelException":{"Exception":[]},"DdcLibraryBundleRestarter":{"Restarter":[]},"DdcRestarter":{"Restarter":[]},"RequireRestarter":{"Restarter":[]},"HotReloadFailedException":{"Exception":[]},"Int8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint8ClampedList":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint16List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Int32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Uint32List":{"List":["int"],"EfficientLengthIterable":["int"],"Iterable":["int"]},"Float32List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]},"Float64List":{"List":["double"],"EfficientLengthIterable":["double"],"Iterable":["double"]}}')); A._Universe_addErasedTypes(init.typeUniverse, JSON.parse('{"UnmodifiableListBase":1,"__CastListBase__CastIterableBase_ListMixin":2,"NativeTypedArray":1,"_DelayedEvent":1,"_SplayTreeSet__SplayTree_Iterable":1,"_SplayTreeSet__SplayTree_Iterable_SetMixin":1,"_QueueList_Object_ListMixin":1,"StreamChannelMixin":1}')); var string$ = { x00_____: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\u03f6\x00\u0404\u03f4 \u03f4\u03f6\u01f6\u01f6\u03f6\u03fc\u01f4\u03ff\u03ff\u0584\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u05d4\u01f4\x00\u01f4\x00\u0504\u05c4\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u0400\x00\u0400\u0200\u03f7\u0200\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u03ff\u0200\u0200\u0200\u03f7\x00", @@ -28221,6 +29616,7 @@ Error_: "Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type", Hot_reA: "Hot reload is not supported for the AMD module format.", Hot_reD: "Hot reload is not supported for the DDC module format.", + max_mu: "max must be in range 0 < max \u2264 2^32, was ", serial: "serializer must be StructuredSerializer or PrimitiveSerializer" }; var type$ = (function rtii() { @@ -28270,6 +29666,8 @@ Future_void: findType("Future<~>"), HotReloadRequest: findType("HotReloadRequest"), HotReloadResponse: findType("HotReloadResponse"), + HotRestartRequest: findType("HotRestartRequest"), + HotRestartResponse: findType("HotRestartResponse"), Int16List: findType("Int16List"), Int32: findType("Int32"), Int32List: findType("Int32List"), @@ -28318,11 +29716,12 @@ MapEntry_of_Object_and_List__Highlight: findType("MapEntry>"), MapEquality_dynamic_dynamic: findType("MapEquality<@,@>"), Map_String_String: findType("Map"), + Map_String_dynamic: findType("Map"), Map_dynamic_dynamic: findType("Map<@,@>"), Map_of_String_and_nullable_Object: findType("Map"), MappedListIterable_String_dynamic: findType("MappedListIterable"), MediaType: findType("MediaType"), - NativeByteBuffer: findType("NativeByteBuffer"), + NativeArrayBuffer: findType("NativeArrayBuffer"), NativeTypedArrayOfInt: findType("NativeTypedArrayOfInt"), NativeUint8List: findType("NativeUint8List"), Null: findType("Null"), @@ -28341,6 +29740,8 @@ RunRequest: findType("RunRequest"), SerializerPlugin: findType("SerializerPlugin"), Serializer_dynamic: findType("Serializer<@>"), + ServiceExtensionRequest: findType("ServiceExtensionRequest"), + ServiceExtensionResponse: findType("ServiceExtensionResponse"), SetBuilder_dynamic: findType("SetBuilder<@>"), SetEquality_dynamic: findType("SetEquality<@>"), SetMultimapBuilder_dynamic_dynamic: findType("SetMultimapBuilder<@,@>"), @@ -28352,6 +29753,7 @@ StackTrace: findType("StackTrace"), StreamChannelController_nullable_Object: findType("StreamChannelController"), StreamQueue_DebugEvent: findType("StreamQueue"), + Stream_dynamic: findType("Stream<@>"), StreamedResponse: findType("StreamedResponse"), String: findType("String"), String_Function_Match: findType("String(Match)"), @@ -28375,19 +29777,18 @@ Zone: findType("Zone"), _AsyncCompleter_BrowserWebSocket: findType("_AsyncCompleter"), _AsyncCompleter_PoolResource: findType("_AsyncCompleter"), - _AsyncCompleter_StreamedResponse: findType("_AsyncCompleter"), _AsyncCompleter_String: findType("_AsyncCompleter"), _AsyncCompleter_Uint8List: findType("_AsyncCompleter"), _AsyncCompleter_bool: findType("_AsyncCompleter"), _AsyncCompleter_dynamic: findType("_AsyncCompleter<@>"), _AsyncCompleter_void: findType("_AsyncCompleter<~>"), + _AsyncStreamController_List_int: findType("_AsyncStreamController>"), _BigIntImpl: findType("_BigIntImpl"), _BuiltMap_dynamic_dynamic: findType("_BuiltMap<@,@>"), _EventRequest_dynamic: findType("_EventRequest<@>"), _EventStream_JSObject: findType("_EventStream"), _Future_BrowserWebSocket: findType("_Future"), _Future_PoolResource: findType("_Future"), - _Future_StreamedResponse: findType("_Future"), _Future_String: findType("_Future"), _Future_Uint8List: findType("_Future"), _Future_bool: findType("_Future"), @@ -28417,6 +29818,7 @@ nullable_ListBuilder_DebugEvent: findType("ListBuilder?"), nullable_ListBuilder_ExtensionEvent: findType("ListBuilder?"), nullable_List_dynamic: findType("List<@>?"), + nullable_Map_String_dynamic: findType("Map?"), nullable_Map_of_nullable_Object_and_nullable_Object: findType("Map?"), nullable_Object: findType("Object?"), nullable_Result_DebugEvent: findType("Result?"), @@ -28431,6 +29833,7 @@ nullable__Highlight: findType("_Highlight?"), nullable__LinkedHashSetCell: findType("_LinkedHashSetCell?"), nullable_bool: findType("bool?"), + nullable_bool_Function_Object: findType("bool(Object)?"), nullable_double: findType("double?"), nullable_int: findType("int?"), nullable_num: findType("num?"), @@ -28441,17 +29844,21 @@ nullable_void_Function_DebugInfoBuilder: findType("~(DebugInfoBuilder)?"), nullable_void_Function_DevToolsRequestBuilder: findType("~(DevToolsRequestBuilder)?"), nullable_void_Function_HotReloadResponseBuilder: findType("~(HotReloadResponseBuilder)?"), + nullable_void_Function_HotRestartResponseBuilder: findType("~(HotRestartResponseBuilder)?"), nullable_void_Function_JSObject: findType("~(JSObject)?"), nullable_void_Function_RegisterEventBuilder: findType("~(RegisterEventBuilder)?"), + nullable_void_Function_ServiceExtensionResponseBuilder: findType("~(ServiceExtensionResponseBuilder)?"), num: findType("num"), void: findType("~"), void_Function: findType("~()"), void_Function_HotReloadResponseBuilder: findType("~(HotReloadResponseBuilder)"), + void_Function_HotRestartResponseBuilder: findType("~(HotRestartResponseBuilder)"), void_Function_List_int: findType("~(List)"), void_Function_Object: findType("~(Object)"), void_Function_Object_StackTrace: findType("~(Object,StackTrace)"), void_Function_String_dynamic: findType("~(String,@)"), - void_Function_Timer: findType("~(Timer)") + void_Function_Timer: findType("~(Timer)"), + void_Function_int_dynamic: findType("~(int,@)") }; })(); (function constants() { @@ -28464,6 +29871,7 @@ B.JSString_methods = J.JSString.prototype; B.JavaScriptFunction_methods = J.JavaScriptFunction.prototype; B.JavaScriptObject_methods = J.JavaScriptObject.prototype; + B.NativeByteData_methods = A.NativeByteData.prototype; B.NativeUint32List_methods = A.NativeUint32List.prototype; B.NativeUint8List_methods = A.NativeUint8List.prototype; B.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype; @@ -28662,12 +30070,21 @@ B.Type_ExtensionRequest_9GR = A.typeLiteral("ExtensionRequest"); B.Type__$ExtensionRequest_o1C = A.typeLiteral("_$ExtensionRequest"); B.List_2dD = makeConstList([B.Type_ExtensionRequest_9GR, B.Type__$ExtensionRequest_o1C], type$.JSArray_Type); + B.Type_ServiceExtensionRequest_K8g = A.typeLiteral("ServiceExtensionRequest"); + B.Type__$ServiceExtensionRequest_n9i = A.typeLiteral("_$ServiceExtensionRequest"); + B.List_4i4 = makeConstList([B.Type_ServiceExtensionRequest_K8g, B.Type__$ServiceExtensionRequest_n9i], type$.JSArray_Type); B.Type_DebugInfo_ua9 = A.typeLiteral("DebugInfo"); B.Type__$DebugInfo_ywz = A.typeLiteral("_$DebugInfo"); B.List_55I = makeConstList([B.Type_DebugInfo_ua9, B.Type__$DebugInfo_ywz], type$.JSArray_Type); B.Type_ErrorResponse_WMn = A.typeLiteral("ErrorResponse"); B.Type__$ErrorResponse_9Ps = A.typeLiteral("_$ErrorResponse"); B.List_5LV = makeConstList([B.Type_ErrorResponse_WMn, B.Type__$ErrorResponse_9Ps], type$.JSArray_Type); + B.Type_ServiceExtensionResponse_84R = A.typeLiteral("ServiceExtensionResponse"); + B.Type__$ServiceExtensionResponse_UiR = A.typeLiteral("_$ServiceExtensionResponse"); + B.List_5rA = makeConstList([B.Type_ServiceExtensionResponse_84R, B.Type__$ServiceExtensionResponse_UiR], type$.JSArray_Type); + B.Type_HotRestartRequest_xnM = A.typeLiteral("HotRestartRequest"); + B.Type__$HotRestartRequest_rYI = A.typeLiteral("_$HotRestartRequest"); + B.List_9I1 = makeConstList([B.Type_HotRestartRequest_xnM, B.Type__$HotRestartRequest_rYI], type$.JSArray_Type); B.Type_HotReloadResponse_Gqc = A.typeLiteral("HotReloadResponse"); B.Type__$HotReloadResponse_56g = A.typeLiteral("_$HotReloadResponse"); B.List_DqJ = makeConstList([B.Type_HotReloadResponse_Gqc, B.Type__$HotReloadResponse_56g], type$.JSArray_Type); @@ -28696,6 +30113,9 @@ B.Type_BatchedDebugEvents_v7B = A.typeLiteral("BatchedDebugEvents"); B.Type__$BatchedDebugEvents_LFV = A.typeLiteral("_$BatchedDebugEvents"); B.List_WAE = makeConstList([B.Type_BatchedDebugEvents_v7B, B.Type__$BatchedDebugEvents_LFV], type$.JSArray_Type); + B.Type_HotRestartResponse_F1y = A.typeLiteral("HotRestartResponse"); + B.Type__$HotRestartResponse_9cS = A.typeLiteral("_$HotRestartResponse"); + B.List_YhA = makeConstList([B.Type_HotRestartResponse_F1y, B.Type__$HotRestartResponse_9cS], type$.JSArray_Type); B.List_ZNA = makeConstList([0, 0, 1048576, 531441, 1048576, 390625, 279936, 823543, 262144, 531441, 1000000, 161051, 248832, 371293, 537824, 759375, 1048576, 83521, 104976, 130321, 160000, 194481, 234256, 279841, 331776, 390625, 456976, 531441, 614656, 707281, 810000, 923521, 1048576, 35937, 39304, 42875, 46656], type$.JSArray_int); B.Type_HotReloadRequest_EsW = A.typeLiteral("HotReloadRequest"); B.Type__$HotReloadRequest_ynq = A.typeLiteral("_$HotReloadRequest"); @@ -28878,6 +30298,11 @@ _lazyFinal($, "_Uri__needsNoEncoding", "$get$_Uri__needsNoEncoding", () => A.RegExp_RegExp("^[\\-\\.0-9A-Z_a-z~]*$", true, false)); _lazyFinal($, "_hashSeed", "$get$_hashSeed", () => A.objectHashCode(B.Type_Object_A4p)); _lazyFinal($, "_jsBoxedDartObjectProperty", "$get$_jsBoxedDartObjectProperty", () => Symbol("jsBoxedDartObjectProperty")); + _lazyFinal($, "Random__secureRandom", "$get$Random__secureRandom", () => { + var t1 = new A._JSSecureRandom(new DataView(new ArrayBuffer(A._checkLength(8)))); + t1._JSSecureRandom$0(); + return t1; + }); _lazyFinal($, "isSoundMode", "$get$isSoundMode", () => !type$.List_int._is(A._setArrayType([], A.findType("JSArray")))); _lazy($, "newBuiltValueToStringHelper", "$get$newBuiltValueToStringHelper", () => new A.newBuiltValueToStringHelper_closure()); _lazyFinal($, "_runtimeType", "$get$_runtimeType", () => A.getRuntimeTypeOfDartObject(A.RegExp_RegExp("", true, false))); @@ -28896,6 +30321,8 @@ _lazy($, "_$batchedEventsSerializer", "$get$_$batchedEventsSerializer", () => new A._$BatchedEventsSerializer()); _lazy($, "_$hotReloadRequestSerializer", "$get$_$hotReloadRequestSerializer", () => new A._$HotReloadRequestSerializer()); _lazy($, "_$hotReloadResponseSerializer", "$get$_$hotReloadResponseSerializer", () => new A._$HotReloadResponseSerializer()); + _lazy($, "_$hotRestartRequestSerializer", "$get$_$hotRestartRequestSerializer", () => new A._$HotRestartRequestSerializer()); + _lazy($, "_$hotRestartResponseSerializer", "$get$_$hotRestartResponseSerializer", () => new A._$HotRestartResponseSerializer()); _lazy($, "_$isolateExitSerializer", "$get$_$isolateExitSerializer", () => new A._$IsolateExitSerializer()); _lazy($, "_$isolateStartSerializer", "$get$_$isolateStartSerializer", () => new A._$IsolateStartSerializer()); _lazy($, "_$registerEventSerializer", "$get$_$registerEventSerializer", () => new A._$RegisterEventSerializer()); @@ -28919,21 +30346,26 @@ t1.add$1(0, $.$get$_$extensionResponseSerializer()); t1.add$1(0, $.$get$_$hotReloadRequestSerializer()); t1.add$1(0, $.$get$_$hotReloadResponseSerializer()); + t1.add$1(0, $.$get$_$hotRestartRequestSerializer()); + t1.add$1(0, $.$get$_$hotRestartResponseSerializer()); t1.add$1(0, $.$get$_$isolateExitSerializer()); t1.add$1(0, $.$get$_$isolateStartSerializer()); t1.add$1(0, $.$get$_$registerEventSerializer()); t1.add$1(0, $.$get$_$runRequestSerializer()); + t1.add$1(0, $.$get$_$serviceExtensionRequestSerializer()); + t1.add$1(0, $.$get$_$serviceExtensionResponseSerializer()); t1.addBuilderFactory$2(B.FullType_3Xm, new A._$serializers_closure()); t1.addBuilderFactory$2(B.FullType_ahP, new A._$serializers_closure0()); return t1.build$0(); }); + _lazy($, "_$serviceExtensionRequestSerializer", "$get$_$serviceExtensionRequestSerializer", () => new A._$ServiceExtensionRequestSerializer()); + _lazy($, "_$serviceExtensionResponseSerializer", "$get$_$serviceExtensionResponseSerializer", () => new A._$ServiceExtensionResponseSerializer()); _lazyFinal($, "_logger", "$get$_logger", () => A.Logger_Logger("Utilities")); _lazyFinal($, "BaseRequest__tokenRE", "$get$BaseRequest__tokenRE", () => A.RegExp_RegExp("^[\\w!#%&'*+\\-.^`|~]+$", true, false)); - _lazyFinal($, "_digitRegex", "$get$_digitRegex", () => A.RegExp_RegExp("^\\d+$", true, false)); _lazyFinal($, "_escapedChar", "$get$_escapedChar", () => A.RegExp_RegExp('["\\x00-\\x1F\\x7F]', true, false)); _lazyFinal($, "token", "$get$token", () => A.RegExp_RegExp('[^()<>@,;:"\\\\/[\\]?={} \\t\\x00-\\x1F\\x7F]+', true, false)); _lazyFinal($, "_lws", "$get$_lws", () => A.RegExp_RegExp("(?:\\r\\n)?[ \\t]+", true, false)); - _lazyFinal($, "_quotedString", "$get$_quotedString", () => A.RegExp_RegExp('"(?:[^"\\x00-\\x1F\\x7F]|\\\\.)*"', true, false)); + _lazyFinal($, "_quotedString", "$get$_quotedString", () => A.RegExp_RegExp('"(?:[^"\\x00-\\x1F\\x7F\\\\]|\\\\.)*"', true, false)); _lazyFinal($, "_quotedPair", "$get$_quotedPair", () => A.RegExp_RegExp("\\\\(.)", true, false)); _lazyFinal($, "nonToken", "$get$nonToken", () => A.RegExp_RegExp('[()<>@,;:"\\\\/\\[\\]?={} \\t\\x00-\\x1F\\x7F]', true, false)); _lazyFinal($, "whitespace", "$get$whitespace", () => A.RegExp_RegExp("(?:" + $.$get$_lws().pattern + ")*", true, false)); @@ -28952,10 +30384,8 @@ t4 = A.Completer_Completer(type$.dynamic); return new A.Pool(t2, t3, t1, 1000, new A.AsyncMemoizer(t4, A.findType("AsyncMemoizer<@>"))); }); - _lazy($, "V1State_random", "$get$V1State_random", () => { - var t1 = A.Random_Random(null); - return new A.MathRNG(t1); - }); + _lazy($, "V1State_random", "$get$V1State_random", () => new A.CryptoRNG()); + _lazy($, "V4State_random", "$get$V4State_random", () => new A.CryptoRNG()); _lazyFinal($, "UuidParsing__byteToHex", "$get$UuidParsing__byteToHex", () => { var i, _list = J.JSArray_JSArray$allocateGrowable(256, type$.String); @@ -28963,6 +30393,7 @@ _list[i] = B.JSString_methods.padLeft$2(B.JSInt_methods.toRadixString$1(i, 16), 2, "0"); return _list; }); + _lazyFinal($, "CryptoRNG__secureRandom", "$get$CryptoRNG__secureRandom", () => $.$get$Random__secureRandom()); _lazyFinal($, "_noncePattern", "$get$_noncePattern", () => A.RegExp_RegExp("^[\\w+/_-]+[=]{0,2}$", true, false)); _lazyFinal($, "_createScript", "$get$_createScript", () => new A._createScript_closure().call$0()); })(); @@ -28989,8 +30420,8 @@ } init.dispatchPropertyName = init.getIsolateTag("dispatch_record"); }(); - hunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer: A.NativeByteBuffer, ArrayBufferView: A.NativeTypedData, DataView: A.NativeByteData, Float32Array: A.NativeFloat32List, Float64Array: A.NativeFloat64List, Int16Array: A.NativeInt16List, Int32Array: A.NativeInt32List, Int8Array: A.NativeInt8List, Uint16Array: A.NativeUint16List, Uint32Array: A.NativeUint32List, Uint8ClampedArray: A.NativeUint8ClampedList, CanvasPixelArray: A.NativeUint8ClampedList, Uint8Array: A.NativeUint8List}); - hunkHelpers.setOrUpdateLeafTags({ArrayBuffer: true, ArrayBufferView: false, DataView: true, Float32Array: true, Float64Array: true, Int16Array: true, Int32Array: true, Int8Array: true, Uint16Array: true, Uint32Array: true, Uint8ClampedArray: true, CanvasPixelArray: true, Uint8Array: false}); + hunkHelpers.setOrUpdateInterceptorsByTag({SharedArrayBuffer: A.NativeByteBuffer, ArrayBuffer: A.NativeArrayBuffer, ArrayBufferView: A.NativeTypedData, DataView: A.NativeByteData, Float32Array: A.NativeFloat32List, Float64Array: A.NativeFloat64List, Int16Array: A.NativeInt16List, Int32Array: A.NativeInt32List, Int8Array: A.NativeInt8List, Uint16Array: A.NativeUint16List, Uint32Array: A.NativeUint32List, Uint8ClampedArray: A.NativeUint8ClampedList, CanvasPixelArray: A.NativeUint8ClampedList, Uint8Array: A.NativeUint8List}); + hunkHelpers.setOrUpdateLeafTags({SharedArrayBuffer: true, ArrayBuffer: true, ArrayBufferView: false, DataView: true, Float32Array: true, Float64Array: true, Int16Array: true, Int32Array: true, Int8Array: true, Uint16Array: true, Uint32Array: true, Uint8ClampedArray: true, CanvasPixelArray: true, Uint8Array: false}); A.NativeTypedArray.$nativeSuperclassTag = "ArrayBufferView"; A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin.$nativeSuperclassTag = "ArrayBufferView"; A._NativeTypedArrayOfDouble_NativeTypedArray_ListMixin_FixedLengthListMixin.$nativeSuperclassTag = "ArrayBufferView"; diff --git a/dwds/lib/src/services/app_debug_services.dart b/dwds/lib/src/services/app_debug_services.dart index fb9d18667..4d262281b 100644 --- a/dwds/lib/src/services/app_debug_services.dart +++ b/dwds/lib/src/services/app_debug_services.dart @@ -4,37 +4,93 @@ import 'package:dwds/src/dwds_vm_client.dart'; import 'package:dwds/src/events.dart'; -import 'package:dwds/src/services/chrome_proxy_service.dart' - show ChromeProxyService; import 'package:dwds/src/services/debug_service.dart'; +import 'package:dwds/src/services/proxy_service.dart'; -/// A container for all the services required for debugging an application. -class AppDebugServices { - final DebugService debugService; - final DwdsVmClient dwdsVmClient; - final DwdsStats dwdsStats; - final Uri? ddsUri; - - ChromeProxyService get chromeProxyService => - debugService.chromeProxyService as ChromeProxyService; +/// Common interface for debug service containers. +abstract class AppDebugServices { + DebugService get debugService; + DwdsVmClient get dwdsVmClient; + DwdsStats? get dwdsStats; + Uri? get ddsUri; + String? get connectedInstanceId; + set connectedInstanceId(String? id); + Future close(); + ProxyService get proxyService; +} - /// Null until [close] is called. - /// - /// All subsequent calls to [close] will return this future. +/// Chrome-based debug services container. +class ChromeAppDebugServices implements AppDebugServices { + final ChromeDebugService _debugService; + final ChromeDwdsVmClient _dwdsVmClient; + final DwdsStats _dwdsStats; + final Uri? _ddsUri; Future? _closed; + String? _connectedInstanceId; - /// The instance ID for the currently connected application, if there is one. - /// - /// We only allow a given app to be debugged in a single tab at a time. - String? connectedInstanceId; - - AppDebugServices( - this.debugService, - this.dwdsVmClient, - this.dwdsStats, - this.ddsUri, + ChromeAppDebugServices( + this._debugService, + this._dwdsVmClient, + this._dwdsStats, + this._ddsUri, ); + @override + ChromeDebugService get debugService => _debugService; + + @override + DwdsVmClient get dwdsVmClient => _dwdsVmClient; + + @override + DwdsStats get dwdsStats => _dwdsStats; + + @override + Uri? get ddsUri => _ddsUri; + + @override + String? get connectedInstanceId => _connectedInstanceId; + + @override + set connectedInstanceId(String? id) => _connectedInstanceId = id; + + @override + ProxyService get proxyService => debugService.chromeProxyService; + + @override Future close() => _closed ??= Future.wait([debugService.close(), dwdsVmClient.close()]); } + +/// WebSocket-based implementation of app debug services. +class WebSocketAppDebugServices implements AppDebugServices { + final WebSocketDebugService _debugService; + final WebSocketDwdsVmClient _dwdsVmClient; + Future? _closed; + @override + String? connectedInstanceId; + + WebSocketAppDebugServices(this._debugService, this._dwdsVmClient); + + @override + WebSocketDebugService get debugService => _debugService; + + @override + DwdsVmClient get dwdsVmClient => _dwdsVmClient; + + // WebSocket-only service - Chrome/DDS features not available + @override + DwdsStats? get dwdsStats => null; + @override + Uri? get ddsUri => null; + + @override + ProxyService get proxyService => _debugService.webSocketProxyService; + + @override + Future close() { + return _closed ??= Future.wait([ + debugService.close(), + dwdsVmClient.close(), + ]); + } +} diff --git a/dwds/lib/src/services/chrome_proxy_service.dart b/dwds/lib/src/services/chrome_proxy_service.dart index 37c50be82..27080471c 100644 --- a/dwds/lib/src/services/chrome_proxy_service.dart +++ b/dwds/lib/src/services/chrome_proxy_service.dart @@ -7,8 +7,6 @@ import 'dart:convert'; import 'dart:io'; import 'package:dwds/data/debug_event.dart'; -import 'package:dwds/data/hot_reload_request.dart'; -import 'package:dwds/data/hot_reload_response.dart'; import 'package:dwds/data/register_event.dart'; import 'package:dwds/src/config/tool_configuration.dart'; import 'package:dwds/src/connections/app_connection.dart'; @@ -27,34 +25,16 @@ import 'package:dwds/src/services/batched_expression_evaluator.dart'; import 'package:dwds/src/services/debug_service.dart'; import 'package:dwds/src/services/expression_compiler.dart'; import 'package:dwds/src/services/expression_evaluator.dart'; +import 'package:dwds/src/services/proxy_service.dart'; import 'package:dwds/src/utilities/dart_uri.dart'; import 'package:dwds/src/utilities/shared.dart'; import 'package:logging/logging.dart' hide LogRecord; -import 'package:pub_semver/pub_semver.dart' as semver; import 'package:vm_service/vm_service.dart' hide vmServiceVersion; import 'package:vm_service_interface/vm_service_interface.dart'; import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart'; -/// Defines callbacks for sending messages to the connected client application. -typedef SendClientRequest = void Function(Object request); - /// A proxy from the chrome debug protocol to the dart vm service protocol. -class ChromeProxyService implements VmServiceInterface { - final bool useWebSocket; - - /// Cache of all existing StreamControllers. - /// - /// These are all created through [onEvent]. - final _streamControllers = >{}; - - /// The root `VM` instance. There can only be one of these, but its isolates - /// are dynamic and roughly map to chrome tabs. - final VM _vm; - - /// Signals when isolate is initialized. - Future get isInitialized => _initializedCompleter.future; - Completer _initializedCompleter = Completer(); - +class ChromeProxyService extends ProxyService { /// Signals when isolate starts. Future get isStarted => _startedCompleter.future; Completer _startedCompleter = Completer(); @@ -100,34 +80,6 @@ class ChromeProxyService implements VmServiceInterface { StreamSubscription? _consoleSubscription; - /// The flags that can be set at runtime via [setFlag] and their respective - /// values. - final Map _currentVmServiceFlags = { - _pauseIsolatesOnStartFlag: false, - }; - - /// The value of the [_pauseIsolatesOnStartFlag]. - /// - /// This value can be updated at runtime via [setFlag]. - bool get pauseIsolatesOnStart => - _currentVmServiceFlags[_pauseIsolatesOnStartFlag] ?? false; - - /// Whether or not the connected app has a pending restart. - bool get hasPendingRestart => _resumeAfterRestartEventsController.hasListener; - - final _resumeAfterRestartEventsController = - StreamController.broadcast(); - - /// A global stream of resume events for hot restart. - /// - /// The values in the stream are the isolates IDs for the resume event. - /// - /// IMPORTANT: This should only be listened to during a hot-restart or page - /// refresh. The debugger ignores any resume events as long as there is a - /// subscriber to this stream. - Stream get resumeAfterRestartEventsStream => - _resumeAfterRestartEventsController.stream; - /// If non-null, a resume event should await the result of this after resuming /// execution. /// @@ -141,14 +93,8 @@ class ChromeProxyService implements VmServiceInterface { bool terminatingIsolates = false; - /// Callback function to send messages to the connected client application. - final SendClientRequest sendClientRequest; - - /// Pending hot reload request waiting for a response from the client. - Completer? _pendingHotReload; - ChromeProxyService._( - this._vm, + super.vm, this.root, this._assetReader, this.remoteDebugger, @@ -157,12 +103,10 @@ class ChromeProxyService implements VmServiceInterface { this._skipLists, this.executionContext, this._compiler, - this.sendClientRequest, { - this.useWebSocket = false, - }) { + ) { final debugger = Debugger.create( remoteDebugger, - _streamNotify, + streamNotify, _locations, _skipLists, root, @@ -177,9 +121,7 @@ class ChromeProxyService implements VmServiceInterface { AppConnection appConnection, ExecutionContext executionContext, ExpressionCompiler? expressionCompiler, - SendClientRequest sendClientRequest, { - bool useWebSocket = false, - }) async { + ) async { final vm = VM( name: 'ChromeDebugProxy', operatingSystem: Platform.operatingSystem, @@ -208,32 +150,11 @@ class ChromeProxyService implements VmServiceInterface { skipLists, executionContext, expressionCompiler, - sendClientRequest, - useWebSocket: useWebSocket, ); safeUnawaited(service.createIsolate(appConnection, newConnection: true)); return service; } - /// Completes the hot reload completer associated with the response ID. - void completeHotReload(HotReloadResponse response) { - final completer = _pendingHotReload; - _pendingHotReload = null; - if (completer != null) { - if (response.success) { - completer.complete(response); - } else { - completer.completeError( - response.errorMessage ?? 'Unknown client error during hot reload', - ); - } - } else { - _logger.warning( - 'Received hot reload response but no pending completer was found (id: ${response.id})', - ); - } - } - /// Reinitializes any caches so that they can be recomputed across hot reload. /// /// We use the [ModifiedModuleReport] to more efficiently invalidate caches. @@ -341,6 +262,7 @@ class ChromeProxyService implements VmServiceInterface { /// /// If [newConnection] is true, this method does not recompute metadata /// information as the metadata couldn't have changed. + @override Future createIsolate( AppConnection appConnection, { bool newConnection = false, @@ -406,9 +328,9 @@ class ChromeProxyService implements VmServiceInterface { // Listen for `registerExtension` and `postEvent` calls. _setUpChromeConsoleListeners(isolateRef); - _vm.isolates?.add(isolateRef); + vm.isolates?.add(isolateRef); - _streamNotify( + streamNotify( 'Isolate', Event( kind: EventKind.kIsolateStart, @@ -416,7 +338,7 @@ class ChromeProxyService implements VmServiceInterface { isolate: isolateRef, ), ); - _streamNotify( + streamNotify( 'Isolate', Event( kind: EventKind.kIsolateRunnable, @@ -429,7 +351,7 @@ class ChromeProxyService implements VmServiceInterface { // isolate, but devtools doesn't recognize extensions after a page refresh // otherwise. for (final extensionRpc in await inspector.getExtensionRpcs()) { - _streamNotify( + streamNotify( 'Isolate', Event( kind: EventKind.kServiceExtensionAdded, @@ -443,7 +365,7 @@ class ChromeProxyService implements VmServiceInterface { // kPausePostRequest event to notify client that the app is paused so that // it can resume: if (hasPendingRestart) { - _streamNotify( + streamNotify( 'Debug', Event( kind: EventKind.kPausePostRequest, @@ -454,12 +376,13 @@ class ChromeProxyService implements VmServiceInterface { } // The service is considered initialized when the first isolate is created. - if (!_initializedCompleter.isCompleted) _initializedCompleter.complete(); + if (!initializedCompleter.isCompleted) initializedCompleter.complete(); } /// Should be called when there is a hot restart or full page refresh. /// /// Clears out the [_inspector] and all related cached information. + @override void destroyIsolate() { _logger.fine('Destroying isolate'); if (!_isIsolateRunning) return; @@ -467,10 +390,10 @@ class ChromeProxyService implements VmServiceInterface { final isolate = inspector.isolate; final isolateRef = inspector.isolateRef; - _initializedCompleter = Completer(); + initializedCompleter = Completer(); _startedCompleter = Completer(); _compilerCompleter = Completer(); - _streamNotify( + streamNotify( 'Isolate', Event( kind: EventKind.kIsolateExit, @@ -478,7 +401,7 @@ class ChromeProxyService implements VmServiceInterface { isolate: isolateRef, ), ); - _vm.isolates?.removeWhere((ref) => ref.id == isolate.id); + vm.isolates?.removeWhere((ref) => ref.id == isolate.id); _inspector = null; _expressionEvaluator?.close(); _consoleSubscription?.cancel(); @@ -523,7 +446,7 @@ class ChromeProxyService implements VmServiceInterface { @override Future addBreakpointAtEntry(String isolateId, String functionId) { - return _rpcNotSupportedFuture('addBreakpointAtEntry'); + return rpcNotSupportedFuture('addBreakpointAtEntry'); } @override @@ -625,11 +548,6 @@ class ChromeProxyService implements VmServiceInterface { } } - @override - Future clearVMTimeline() { - return _rpcNotSupportedFuture('clearVMTimeline'); - } - Future _getEvaluationResult( String isolateId, Future Function() evaluation, @@ -842,46 +760,6 @@ class ChromeProxyService implements VmServiceInterface { }, (result) => DwdsEvent.evaluateInFrame(expression, result)); } - @override - Future getAllocationProfile( - String isolateId, { - bool? gc, - bool? reset, - }) { - return _rpcNotSupportedFuture('getAllocationProfile'); - } - - @override - Future getClassList(String isolateId) { - // See dart-lang/webdev/issues/971. - return _rpcNotSupportedFuture('getClassList'); - } - - @override - Future getFlagList() { - return wrapInErrorHandlerAsync('getFlagList', _getFlagList); - } - - Future _getFlagList() { - final flags = _currentVmServiceFlags.entries.map( - (entry) => Flag(name: entry.key, valueAsString: '${entry.value}'), - ); - - return Future.value(FlagList(flags: flags.toList())); - } - - @override - Future getInstances( - String isolateId, - String classId, - int limit, { - bool? includeImplementers, - bool? includeSubclasses, - String? idZoneId, - }) { - return _rpcNotSupportedFuture('getInstances'); - } - @override Future getIsolate(String isolateId) => wrapInErrorHandlerAsync('getIsolate', () => _getIsolate(isolateId)); @@ -1030,32 +908,10 @@ class ChromeProxyService implements VmServiceInterface { Future _getVM() { return captureElapsedTime(() async { await isInitialized; - return _vm; + return vm; }, (result) => DwdsEvent.getVM()); } - @override - Future getVMTimeline({ - int? timeOriginMicros, - int? timeExtentMicros, - }) { - return _rpcNotSupportedFuture('getVMTimeline'); - } - - @override - Future getVMTimelineFlags() { - return _rpcNotSupportedFuture('getVMTimelineFlags'); - } - - @override - Future getVersion() => - wrapInErrorHandlerAsync('getVersion', _getVersion); - - Future _getVersion() async { - final version = semver.Version.parse(vmServiceVersion); - return Version(major: version.major, minor: version.minor); - } - @override Future invoke( String isolateId, @@ -1086,14 +942,9 @@ class ChromeProxyService implements VmServiceInterface { return _instanceRef(remote); } - @override - Future kill(String isolateId) { - return _rpcNotSupportedFuture('kill'); - } - @override Stream onEvent(String streamId) { - return _streamControllers.putIfAbsent(streamId, () { + return streamControllers.putIfAbsent(streamId, () { switch (streamId) { case EventStreams.kExtension: return StreamController.broadcast(); @@ -1181,7 +1032,7 @@ class ChromeProxyService implements VmServiceInterface { @override Future registerService(String service, String alias) { - return _rpcNotSupportedFuture('registerService'); + return rpcNotSupportedFuture('registerService'); } @override @@ -1203,11 +1054,7 @@ class ChromeProxyService implements VmServiceInterface { ], }; try { - if (useWebSocket) { - await _performWebSocketHotReload(); - } else { - await _performClientSideHotReload(isolateId); - } + await _performClientSideHotReload(isolateId); } catch (e) { _logger.info('Hot reload failed: $e'); return getFailedReloadReport(e.toString()); @@ -1295,7 +1142,7 @@ class ChromeProxyService implements VmServiceInterface { // This lets the client know that we're ready for breakpoint management // and a resume. - _streamNotify( + streamNotify( 'Debug', Event( kind: EventKind.kPausePostRequest, @@ -1305,37 +1152,6 @@ class ChromeProxyService implements VmServiceInterface { ); } - /// Performs a WebSocket-based hot reload by sending a request and waiting for a response. - /// If [requestId] is provided, it will be used for the request; otherwise, a new one is generated. - Future _performWebSocketHotReload({String? requestId}) async { - final id = requestId ?? createId(); - if (_pendingHotReload != null) { - throw StateError('A hot reload is already pending.'); - } - final completer = Completer(); - _pendingHotReload = completer; - const timeout = Duration(seconds: 10); - - _logger.info('Issuing HotReloadRequest with ID ($id) to client.'); - sendClientRequest(HotReloadRequest((b) => b.id = id)); - - final response = await completer.future.timeout( - timeout, - onTimeout: - () => - throw TimeoutException( - 'Client did not respond to hot reload request', - timeout, - ), - ); - - if (!response.success) { - throw Exception( - response.errorMessage ?? 'Client reported hot reload failure.', - ); - } - } - @override Future removeBreakpoint(String isolateId, String breakpointId) => wrapInErrorHandlerAsync( @@ -1366,8 +1182,8 @@ class ChromeProxyService implements VmServiceInterface { }) async { // If there is a subscriber listening for a resume event after hot-restart, // then add the event to the stream and skip processing it. - if (_resumeAfterRestartEventsController.hasListener) { - _resumeAfterRestartEventsController.add(isolateId); + if (resumeAfterRestartEventsController.hasListener) { + resumeAfterRestartEventsController.add(isolateId); return Success(); } @@ -1431,12 +1247,12 @@ class ChromeProxyService implements VmServiceInterface { wrapInErrorHandlerAsync('setFlag', () => _setFlag(name, value)); Future _setFlag(String name, String value) async { - if (!_currentVmServiceFlags.containsKey(name)) { - return _rpcNotSupportedFuture('setFlag'); + if (!currentVmServiceFlags.containsKey(name)) { + return rpcNotSupportedFuture('setFlag'); } assert(value == 'true' || value == 'false'); - _currentVmServiceFlags[name] = value == 'true'; + currentVmServiceFlags[name] = value == 'true'; return Success(); } @@ -1447,7 +1263,7 @@ class ChromeProxyService implements VmServiceInterface { String libraryId, bool isDebuggable, ) { - return _rpcNotSupportedFuture('setLibraryDebuggable'); + return rpcNotSupportedFuture('setLibraryDebuggable'); } @override @@ -1466,31 +1282,19 @@ class ChromeProxyService implements VmServiceInterface { wrapInErrorHandlerAsync('setVMName', () => _setVMName(name)); Future _setVMName(String name) async { - _vm.name = name; - _streamNotify( + vm.name = name; + streamNotify( 'VM', Event( kind: EventKind.kVMUpdate, timestamp: DateTime.now().millisecondsSinceEpoch, // We are not guaranteed to have an isolate at this point in time. isolate: null, - )..vm = toVMRef(_vm), + )..vm = toVMRef(vm), ); return Success(); } - @override - Future setVMTimelineFlags(List recordedStreams) { - return _rpcNotSupportedFuture('setVMTimelineFlags'); - } - - @override - Future streamCancel(String streamId) { - // TODO: We should implement this (as we've already implemented - // streamListen). - return _rpcNotSupportedFuture('streamCancel'); - } - @override Future streamListen(String streamId) => wrapInErrorHandlerAsync('streamListen', () => _streamListen(streamId)); @@ -1502,20 +1306,6 @@ class ChromeProxyService implements VmServiceInterface { return Success(); } - @override - Future clearCpuSamples(String isolateId) { - return _rpcNotSupportedFuture('clearCpuSamples'); - } - - @override - Future getCpuSamples( - String isolateId, - int timeOriginMicros, - int timeExtentMicros, - ) { - return _rpcNotSupportedFuture('getCpuSamples'); - } - /// Returns a streamController that listens for console logs from chrome and /// adds all events passing [filter] to the stream. StreamController _chromeConsoleStreamController( @@ -1580,6 +1370,7 @@ class ChromeProxyService implements VmServiceInterface { /// Parses the [BatchedDebugEvents] and emits corresponding Dart VM Service /// protocol [Event]s. + @override void parseBatchedDebugEvents(BatchedDebugEvents debugEvents) { for (final debugEvent in debugEvents.events) { parseDebugEvent(debugEvent); @@ -1588,12 +1379,13 @@ class ChromeProxyService implements VmServiceInterface { /// Parses the [DebugEvent] and emits a corresponding Dart VM Service /// protocol [Event]. + @override void parseDebugEvent(DebugEvent debugEvent) { if (terminatingIsolates) return; if (!_isIsolateRunning) return; final isolateRef = inspector.isolateRef; - _streamNotify( + streamNotify( EventStreams.kExtension, Event( kind: EventKind.kExtension, @@ -1609,6 +1401,7 @@ class ChromeProxyService implements VmServiceInterface { /// Parses the [RegisterEvent] and emits a corresponding Dart VM Service /// protocol [Event]. + @override void parseRegisterEvent(RegisterEvent registerEvent) { if (terminatingIsolates) return; if (!_isIsolateRunning) return; @@ -1618,7 +1411,7 @@ class ChromeProxyService implements VmServiceInterface { final service = registerEvent.eventData; isolate.extensionRPCs?.add(service); - _streamNotify( + streamNotify( EventStreams.kIsolate, Event( kind: EventKind.kServiceExtensionAdded, @@ -1648,7 +1441,7 @@ class ChromeProxyService implements VmServiceInterface { if (event.args[1].type != 'object') break; final inspectee = await _instanceRef(event.args[1]); - _streamNotify( + streamNotify( EventStreams.kDebug, Event( kind: EventKind.kInspect, @@ -1674,14 +1467,8 @@ class ChromeProxyService implements VmServiceInterface { }); } - void _streamNotify(String streamId, Event event) { - final controller = _streamControllers[streamId]; - if (controller == null) return; - controller.add(event); - } - Future _firstStreamEvent(String streamId, String eventKind) { - final controller = _streamControllers[streamId]!; + final controller = streamControllers[streamId]!; return controller.stream.firstWhere((event) => event.kind == eventKind); } @@ -1716,7 +1503,7 @@ class ChromeProxyService implements VmServiceInterface { zone: await _instanceRef(logParams['zone']), ); - _streamNotify( + streamNotify( EventStreams.kLogging, Event( kind: EventKind.kLogging, @@ -1759,14 +1546,9 @@ class ChromeProxyService implements VmServiceInterface { return logParams; } - @override - Future getVMTimelineMicros() { - return _rpcNotSupportedFuture('getVMTimelineMicros'); - } - @override Future yieldControlToDDS(String uri) async { - final canYield = DebugService.yieldControlToDDS(uri); + final canYield = ChromeDebugService.yieldControlToDDS(uri); if (!canYield) { throw RPCError( @@ -1777,115 +1559,11 @@ class ChromeProxyService implements VmServiceInterface { } } - @override - Future getInboundReferences( - String isolateId, - String targetId, - int limit, { - String? idZoneId, - }) { - return _rpcNotSupportedFuture('getInboundReferences'); - } - - @override - Future getRetainingPath( - String isolateId, - String targetId, - int limit, { - String? idZoneId, - }) { - return _rpcNotSupportedFuture('getRetainingPath'); - } - - @override - Future requestHeapSnapshot(String isolateId) { - return _rpcNotSupportedFuture('requestHeapSnapshot'); - } - - @override - Future getIsolateGroup(String isolateGroupId) { - return _rpcNotSupportedFuture('getIsolateGroup'); - } - - @override - Future getIsolateGroupMemoryUsage(String isolateGroupId) { - return _rpcNotSupportedFuture('getIsolateGroupMemoryUsage'); - } - - @override - Future getSupportedProtocols() => - wrapInErrorHandlerAsync('getSupportedProtocols', _getSupportedProtocols); - - Future _getSupportedProtocols() async { - final version = semver.Version.parse(vmServiceVersion); - return ProtocolList( - protocols: [ - Protocol( - protocolName: 'VM Service', - major: version.major, - minor: version.minor, - ), - ], - ); - } - Future _instanceRef(RemoteObject? obj) async { final instance = obj == null ? null : await inspector.instanceRefFor(obj); return instance ?? InstanceHelper.kNullInstanceRef; } - static RPCError _rpcNotSupported(String method) { - return RPCError( - method, - RPCErrorKind.kMethodNotFound.code, - '$method: Not supported on web devices', - ); - } - - static Future _rpcNotSupportedFuture(String method) { - return Future.error(_rpcNotSupported(method)); - } - - @override - Future getProcessMemoryUsage() => - _rpcNotSupportedFuture('getProcessMemoryUsage'); - - @override - Future getPorts(String isolateId) => throw UnimplementedError(); - - @override - Future getAllocationTraces( - String isolateId, { - int? timeOriginMicros, - int? timeExtentMicros, - String? classId, - }) => throw UnimplementedError(); - - @override - Future setTraceClassAllocation( - String isolateId, - String classId, - bool enable, - ) => throw UnimplementedError(); - - @override - Future setBreakpointState( - String isolateId, - String breakpointId, - bool enable, - ) => throw UnimplementedError(); - - @override - Future streamCpuSamplesWithUserTag(List userTags) => - _rpcNotSupportedFuture('streamCpuSamplesWithUserTag'); - - /// Prevent DWDS from blocking Dart SDK rolls if changes in package:vm_service - /// are unimplemented in DWDS. - @override - dynamic noSuchMethod(Invocation invocation) { - return super.noSuchMethod(invocation); - } - /// Validate that isolateId matches the current isolate we're connected to and /// return that isolate. /// @@ -1939,5 +1617,3 @@ const _stderrTypes = ['error']; /// The `type`s of [ConsoleAPIEvent]s that are treated as `stdout` logs. const _stdoutTypes = ['log', 'info', 'warning']; - -const _pauseIsolatesOnStartFlag = 'pause_isolates_on_start'; diff --git a/dwds/lib/src/services/debug_service.dart b/dwds/lib/src/services/debug_service.dart index ac90a0e17..a9c2537e2 100644 --- a/dwds/lib/src/services/debug_service.dart +++ b/dwds/lib/src/services/debug_service.dart @@ -17,6 +17,7 @@ import 'package:dwds/src/events.dart'; import 'package:dwds/src/readers/asset_reader.dart'; import 'package:dwds/src/services/chrome_proxy_service.dart'; import 'package:dwds/src/services/expression_compiler.dart'; +import 'package:dwds/src/services/web_socket_proxy_service.dart'; import 'package:dwds/src/utilities/server.dart'; import 'package:dwds/src/utilities/shared.dart'; import 'package:logging/logging.dart'; @@ -126,15 +127,28 @@ Future _handleSseConnections( } } +/// Common interface for debug services (Chrome or WebSocket based). +abstract class DebugService { + String get hostname; + int get port; + String get uri; + Future get encodedUri; + ServiceExtensionRegistry get serviceExtensionRegistry; + Future close(); +} + /// A Dart Web Debug Service. /// /// Creates a [ChromeProxyService] from an existing Chrome instance. -class DebugService { +class ChromeDebugService implements DebugService { static String? _ddsUri; - final VmServiceInterface chromeProxyService; + final ChromeProxyService chromeProxyService; + @override final String hostname; + @override final ServiceExtensionRegistry serviceExtensionRegistry; + @override final int port; final String authToken; final HttpServer _server; @@ -149,7 +163,7 @@ class DebugService { /// All subsequent calls to [close] will return this future. Future? _closed; - DebugService._( + ChromeDebugService._( this.chromeProxyService, this.hostname, this.port, @@ -162,6 +176,7 @@ class DebugService { this._urlEncoder, ); + @override Future close() => _closed ??= Future.wait([ _server.close(), @@ -183,6 +198,7 @@ class DebugService { return _dds!; } + @override String get uri { final dds = _dds; if (_spawnDds && dds != null) { @@ -200,6 +216,7 @@ class DebugService { } String? _encodedUri; + @override Future get encodedUri async { if (_encodedUri != null) return _encodedUri!; var encoded = uri; @@ -218,7 +235,7 @@ class DebugService { return true; } - static Future start( + static Future start( String hostname, RemoteDebugger remoteDebugger, ExecutionContext executionContext, @@ -231,7 +248,6 @@ class DebugService { int? ddsPort, bool useSse = false, ExpressionCompiler? expressionCompiler, - required SendClientRequest sendClientRequest, }) async { final root = assetReader.basePath; final chromeProxyService = await ChromeProxyService.create( @@ -241,7 +257,6 @@ class DebugService { appConnection, executionContext, expressionCompiler, - sendClientRequest, ); final authToken = _makeAuthToken(); final serviceExtensionRegistry = ServiceExtensionRegistry(); @@ -290,7 +305,7 @@ class DebugService { _logger.warning('Error serving requests', e); emitEvent(DwdsEvent.httpRequestException('DebugService', '$e:$s')); }); - return DebugService._( + return ChromeDebugService._( chromeProxyService, server.address.host, server.port, @@ -305,6 +320,154 @@ class DebugService { } } +/// Defines callbacks for sending messages to the connected client. +/// Returns the number of clients the request was successfully sent to. +typedef SendClientRequest = int Function(Object request); + +/// WebSocket-based debug service for web debugging. +class WebSocketDebugService implements DebugService { + @override + final String hostname; + @override + final int port; + final String authToken; + final HttpServer _server; + final WebSocketProxyService _webSocketProxyService; + final ServiceExtensionRegistry _serviceExtensionRegistry; + final UrlEncoder? _urlEncoder; + + Future? _closed; + DartDevelopmentServiceLauncher? _dds; + String? _encodedUri; + + WebSocketDebugService._( + this.hostname, + this.port, + this.authToken, + this._webSocketProxyService, + this._serviceExtensionRegistry, + this._server, + this._urlEncoder, + ); + + /// Returns the WebSocketProxyService instance. + WebSocketProxyService get webSocketProxyService => _webSocketProxyService; + + /// Returns the ServiceExtensionRegistry instance. + @override + ServiceExtensionRegistry get serviceExtensionRegistry => + _serviceExtensionRegistry; + + /// Closes the debug service and associated resources. + @override + Future close() => + _closed ??= Future.wait([ + _server.close(), + if (_dds != null) _dds!.shutdown(), + ]); + + /// Starts DDS (Dart Development Service). + Future startDartDevelopmentService({ + int? ddsPort, + }) async { + const timeout = Duration(seconds: 10); + + try { + _dds = await DartDevelopmentServiceLauncher.start( + remoteVmServiceUri: Uri( + scheme: 'http', + host: hostname, + port: port, + path: authToken, + ), + serviceUri: Uri(scheme: 'http', host: hostname, port: ddsPort ?? 0), + ).timeout(timeout); + } catch (e) { + throw Exception('Failed to start DDS: $e'); + } + return _dds!; + } + + @override + String get uri => + Uri(scheme: 'ws', host: hostname, port: port, path: authToken).toString(); + + @override + Future get encodedUri async { + if (_encodedUri != null) return _encodedUri!; + var encoded = uri; + if (_urlEncoder != null) encoded = await _urlEncoder(encoded); + return _encodedUri = encoded; + } + + static Future start( + String hostname, + AppConnection appConnection, { + required SendClientRequest sendClientRequest, + UrlEncoder? urlEncoder, + }) async { + final authToken = _makeAuthToken(); + final serviceExtensionRegistry = ServiceExtensionRegistry(); + + final webSocketProxyService = await WebSocketProxyService.create( + sendClientRequest, + appConnection, + ); + + final handler = _createWebSocketHandler( + serviceExtensionRegistry, + webSocketProxyService, + ); + + final server = await startHttpServer(hostname, port: 44456); + serveHttpRequests(server, handler, (e, s) { + Logger('WebSocketDebugService').warning('Error serving requests', e); + }); + + return WebSocketDebugService._( + server.address.host, + server.port, + authToken, + webSocketProxyService, + serviceExtensionRegistry, + server, + urlEncoder, + ); + } + + /// Creates the WebSocket handler for incoming connections. + static dynamic _createWebSocketHandler( + ServiceExtensionRegistry serviceExtensionRegistry, + WebSocketProxyService webSocketProxyService, + ) { + return webSocketHandler((WebSocketChannel webSocket) { + final responseController = StreamController>(); + webSocket.sink.addStream(responseController.stream.map(jsonEncode)); + + final inputStream = webSocket.stream.map((value) { + if (value is List) { + value = utf8.decode(value); + } else if (value is! String) { + throw StateError( + 'Unexpected value type from web socket: ${value.runtimeType}', + ); + } + return Map.from(jsonDecode(value)); + }); + + ++_clientsConnected; + VmServerConnection( + inputStream, + responseController.sink, + serviceExtensionRegistry, + webSocketProxyService, + ).done.whenComplete(() { + --_clientsConnected; + }); + }); + } +} + // Creates a random auth token for more secure connections. String _makeAuthToken() { final tokenBytes = 8; diff --git a/dwds/lib/src/services/proxy_service.dart b/dwds/lib/src/services/proxy_service.dart new file mode 100644 index 000000000..cc260c0c7 --- /dev/null +++ b/dwds/lib/src/services/proxy_service.dart @@ -0,0 +1,396 @@ +// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:dwds/data/debug_event.dart'; +import 'package:dwds/data/hot_reload_response.dart'; +import 'package:dwds/data/hot_restart_response.dart'; +import 'package:dwds/data/register_event.dart'; +import 'package:dwds/data/service_extension_response.dart'; +import 'package:dwds/src/connections/app_connection.dart'; +import 'package:dwds/src/events.dart'; +import 'package:dwds/src/utilities/shared.dart'; +import 'package:pub_semver/pub_semver.dart' as semver; +import 'package:vm_service/vm_service.dart' as vm_service; +import 'package:vm_service_interface/vm_service_interface.dart'; + +const pauseIsolatesOnStartFlag = 'pause_isolates_on_start'; + +/// Abstract base class for VM service proxy implementations. +abstract class ProxyService implements VmServiceInterface { + /// Cache of all existing StreamControllers. + /// + /// These are all created through [onEvent]. + final Map> _streamControllers = {}; + + /// The root `VM` instance. + final vm_service.VM _vm; + + /// Signals when isolate is initialized. + Future get isInitialized => initializedCompleter.future; + Completer initializedCompleter = Completer(); + + /// The flags that can be set at runtime via [setFlag] and their respective + /// values. + final Map _currentVmServiceFlags = { + pauseIsolatesOnStartFlag: false, + }; + + /// The value of the [pauseIsolatesOnStartFlag]. + /// + /// This value can be updated at runtime via [setFlag]. + bool get pauseIsolatesOnStart => + _currentVmServiceFlags[pauseIsolatesOnStartFlag] ?? false; + + /// Stream controller for resume events after restart. + final _resumeAfterRestartEventsController = + StreamController.broadcast(); + + /// A global stream of resume events for hot restart. + /// + /// The values in the stream are the isolates IDs for the resume event. + /// + /// IMPORTANT: This should only be listened to during a hot-restart or page + /// refresh. The debugger ignores any resume events as long as there is a + /// subscriber to this stream. + Stream get resumeAfterRestartEventsStream => + _resumeAfterRestartEventsController.stream; + + /// Whether or not the connected app has a pending restart. + bool get hasPendingRestart => _resumeAfterRestartEventsController.hasListener; + + // Protected accessors for subclasses + vm_service.VM get vm => _vm; + Map> get streamControllers => + _streamControllers; + StreamController get resumeAfterRestartEventsController => + _resumeAfterRestartEventsController; + Map get currentVmServiceFlags => _currentVmServiceFlags; + + ProxyService(this._vm); + + /// Sends events to stream controllers. + void streamNotify(String streamId, vm_service.Event event) { + final controller = _streamControllers[streamId]; + if (controller == null) return; + controller.add(event); + } + + /// Returns a broadcast stream for the given streamId. + @override + Stream onEvent(String streamId) { + return _streamControllers.putIfAbsent(streamId, () { + return StreamController.broadcast(); + }).stream; + } + + @override + Future streamListen(String streamId) => + wrapInErrorHandlerAsync('streamListen', () => _streamListen(streamId)); + + Future _streamListen(String streamId) async { + onEvent(streamId); + return vm_service.Success(); + } + + @override + Future streamCancel(String streamId) { + // TODO: We should implement this (as we've already implemented + // streamListen). + return _rpcNotSupportedFuture('streamCancel'); + } + + @override + Future getVM() => wrapInErrorHandlerAsync('getVM', _getVM); + + Future _getVM() { + return captureElapsedTime(() async { + return _vm; + }, (result) => DwdsEvent.getVM()); + } + + @override + Future getFlagList() => + wrapInErrorHandlerAsync('getFlagList', _getFlagList); + + Future _getFlagList() async { + final flags = _currentVmServiceFlags.entries.map( + (entry) => + vm_service.Flag(name: entry.key, valueAsString: '${entry.value}'), + ); + return vm_service.FlagList(flags: flags.toList()); + } + + @override + Future setFlag(String name, String value) => + wrapInErrorHandlerAsync('setFlag', () => _setFlag(name, value)); + + Future _setFlag(String name, String value) async { + if (!_currentVmServiceFlags.containsKey(name)) { + throw vm_service.RPCError( + 'setFlag', + vm_service.RPCErrorKind.kInvalidRequest.code, + 'Cannot set flag "$name" (invalid flag)', + ); + } + + assert(value == 'true' || value == 'false'); + _currentVmServiceFlags[name] = value == 'true'; + return vm_service.Success(); + } + + @override + Future getSupportedProtocols() => + wrapInErrorHandlerAsync('getSupportedProtocols', _getSupportedProtocols); + + Future _getSupportedProtocols() async { + final version = semver.Version.parse(vm_service.vmServiceVersion); + return vm_service.ProtocolList( + protocols: [ + vm_service.Protocol( + protocolName: 'VM Service', + major: version.major, + minor: version.minor, + ), + ], + ); + } + + @override + Future getVersion() => + wrapInErrorHandlerAsync('getVersion', _getVersion); + + Future _getVersion() async { + final version = semver.Version.parse(vm_service.vmServiceVersion); + return vm_service.Version(major: version.major, minor: version.minor); + } + + /// Parses the [BatchedDebugEvents] and emits corresponding Dart VM Service + /// protocol [Event]s. + void parseBatchedDebugEvents(BatchedDebugEvents debugEvents) { + for (final debugEvent in debugEvents.events) { + parseDebugEvent(debugEvent); + } + } + + /// Parses the [DebugEvent] and emits a corresponding Dart VM Service + /// protocol [Event]. + void parseDebugEvent(DebugEvent debugEvent); + + /// Parses the [RegisterEvent] and emits a corresponding Dart VM Service + /// protocol [Event]. + void parseRegisterEvent(RegisterEvent registerEvent); + + /// Completes hot reload with response from client. + /// + /// Default implementation throws UnimplementedError. + /// Override in subclasses that support hot reload completion. + void completeHotReload(HotReloadResponse response) { + throw UnimplementedError('completeHotReload not supported'); + } + + /// Completes hot restart with response from client. + /// + /// Default implementation throws UnimplementedError. + /// Override in subclasses that support hot restart completion. + void completeHotRestart(HotRestartResponse response) { + throw UnimplementedError('completeHotRestart not supported'); + } + + /// Completes service extension with response from client. + /// + /// Default implementation throws UnimplementedError. + /// Override in subclasses that support service extension completion. + void completeServiceExtension(ServiceExtensionResponse response) { + throw UnimplementedError('completeServiceExtension not supported'); + } + + /// Standard RPC error for unsupported methods. + static vm_service.RPCError _rpcNotSupported(String method) { + return vm_service.RPCError( + method, + vm_service.RPCErrorKind.kMethodNotFound.code, + '$method: Not supported on web devices', + ); + } + + /// Standard future error for unsupported methods. + static Future _rpcNotSupportedFuture(String method) { + return Future.error(_rpcNotSupported(method)); + } + + /// Protected accessor for _rpcNotSupportedFuture for subclasses + Future rpcNotSupportedFuture(String method) { + return _rpcNotSupportedFuture(method); + } + + // Default implementations for unsupported methods + @override + Future getAllocationProfile( + String isolateId, { + bool? gc, + bool? reset, + }) { + return _rpcNotSupportedFuture('getAllocationProfile'); + } + + @override + Future getClassList(String isolateId) { + return _rpcNotSupportedFuture('getClassList'); + } + + @override + Future getInstances( + String isolateId, + String classId, + int limit, { + bool? includeImplementers, + bool? includeSubclasses, + String? idZoneId, + }) { + return _rpcNotSupportedFuture('getInstances'); + } + + @override + Future kill(String isolateId) { + return _rpcNotSupportedFuture('kill'); + } + + @override + Future clearVMTimeline() { + return _rpcNotSupportedFuture('clearVMTimeline'); + } + + @override + Future getVMTimeline({ + int? timeOriginMicros, + int? timeExtentMicros, + }) { + return _rpcNotSupportedFuture('getVMTimeline'); + } + + @override + Future getVMTimelineFlags() { + return _rpcNotSupportedFuture('getVMTimelineFlags'); + } + + @override + Future setVMTimelineFlags(List recordedStreams) { + return _rpcNotSupportedFuture('setVMTimelineFlags'); + } + + @override + Future getVMTimelineMicros() { + return _rpcNotSupportedFuture('getVMTimelineMicros'); + } + + @override + Future getInboundReferences( + String isolateId, + String targetId, + int limit, { + String? idZoneId, + }) { + return _rpcNotSupportedFuture('getInboundReferences'); + } + + @override + Future getRetainingPath( + String isolateId, + String targetId, + int limit, { + String? idZoneId, + }) { + return _rpcNotSupportedFuture('getRetainingPath'); + } + + @override + Future requestHeapSnapshot(String isolateId) { + return _rpcNotSupportedFuture('requestHeapSnapshot'); + } + + @override + Future getIsolateGroup(String isolateGroupId) { + return _rpcNotSupportedFuture('getIsolateGroup'); + } + + @override + Future getIsolateGroupMemoryUsage( + String isolateGroupId, + ) { + return _rpcNotSupportedFuture('getIsolateGroupMemoryUsage'); + } + + @override + Future getProcessMemoryUsage() => + _rpcNotSupportedFuture('getProcessMemoryUsage'); + + @override + Future getPorts(String isolateId) => + throw UnimplementedError(); + + @override + Future getAllocationTraces( + String isolateId, { + int? timeOriginMicros, + int? timeExtentMicros, + String? classId, + }) => throw UnimplementedError(); + + @override + Future setTraceClassAllocation( + String isolateId, + String classId, + bool enable, + ) => throw UnimplementedError(); + + @override + Future setBreakpointState( + String isolateId, + String breakpointId, + bool enable, + ) => throw UnimplementedError(); + + @override + Future streamCpuSamplesWithUserTag( + List userTags, + ) => _rpcNotSupportedFuture('streamCpuSamplesWithUserTag'); + + @override + Future getCpuSamples( + String isolateId, + int timeOriginMicros, + int timeExtentMicros, + ) { + return _rpcNotSupportedFuture('getCpuSamples'); + } + + @override + Future clearCpuSamples(String isolateId) { + return _rpcNotSupportedFuture('clearCpuSamples'); + } + + /// Creates a new isolate for debugging. + /// + /// Implementations should handle isolate lifecycle management according to + /// their specific debugging mode (Chrome vs WebSocket). + Future createIsolate( + AppConnection appConnection, { + bool newConnection = false, + }); + + /// Destroys the isolate and cleans up debugging state. + /// + /// Implementations should handle cleanup according to their specific + /// debugging mode and connection management strategy. + void destroyIsolate(); + + /// Prevent DWDS from blocking Dart SDK rolls if changes in package:vm_service + /// are unimplemented in DWDS. + @override + dynamic noSuchMethod(Invocation invocation) { + return super.noSuchMethod(invocation); + } +} diff --git a/dwds/lib/src/services/web_socket_proxy_service.dart b/dwds/lib/src/services/web_socket_proxy_service.dart new file mode 100644 index 000000000..1de6ccb63 --- /dev/null +++ b/dwds/lib/src/services/web_socket_proxy_service.dart @@ -0,0 +1,1067 @@ +// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; +import 'dart:convert'; + +import 'package:dwds/data/debug_event.dart'; +import 'package:dwds/data/hot_reload_request.dart'; +import 'package:dwds/data/hot_reload_response.dart'; +import 'package:dwds/data/hot_restart_request.dart'; +import 'package:dwds/data/hot_restart_response.dart'; +import 'package:dwds/data/register_event.dart'; +import 'package:dwds/data/service_extension_request.dart'; +import 'package:dwds/data/service_extension_response.dart'; +import 'package:dwds/src/connections/app_connection.dart'; +import 'package:dwds/src/events.dart'; +import 'package:dwds/src/services/proxy_service.dart'; +import 'package:dwds/src/utilities/dart_uri.dart'; +import 'package:dwds/src/utilities/shared.dart'; +import 'package:logging/logging.dart'; +import 'package:vm_service/vm_service.dart' as vm_service; +import 'package:vm_service/vm_service.dart'; + +/// Defines callbacks for sending messages to the connected client. +/// Returns the number of clients the request was successfully sent to. +typedef SendClientRequest = int Function(Object request); + +const _pauseIsolatesOnStartFlag = 'pause_isolates_on_start'; + +/// Tracks hot reload responses from multiple browser windows/tabs. +class _HotReloadTracker { + final String requestId; + final Completer completer; + final int expectedResponses; + final List responses = []; + final Timer timeoutTimer; + + _HotReloadTracker({ + required this.requestId, + required this.completer, + required this.expectedResponses, + required this.timeoutTimer, + }); + + bool get isComplete => responses.length >= expectedResponses; + + void addResponse(HotReloadResponse response) { + responses.add(response); + } + + bool get allSuccessful => responses.every((r) => r.success); + + void dispose() { + timeoutTimer.cancel(); + } +} + +/// Tracks hot restart responses from multiple browser windows/tabs. +class _HotRestartTracker { + final String requestId; + final Completer completer; + final int expectedResponses; + final List responses = []; + final Timer timeoutTimer; + + _HotRestartTracker({ + required this.requestId, + required this.completer, + required this.expectedResponses, + required this.timeoutTimer, + }); + + bool get isComplete => responses.length >= expectedResponses; + + void addResponse(HotRestartResponse response) { + responses.add(response); + } + + bool get allSuccessful => responses.every((r) => r.success); + + void dispose() { + timeoutTimer.cancel(); + } +} + +/// Tracks service extension responses from multiple browser windows/tabs. +class _ServiceExtensionTracker { + final String requestId; + final Completer completer; + final int expectedResponses; + final List responses = []; + final Timer timeoutTimer; + + _ServiceExtensionTracker({ + required this.requestId, + required this.completer, + required this.expectedResponses, + required this.timeoutTimer, + }); + + bool get isComplete => responses.length >= expectedResponses; + + void addResponse(ServiceExtensionResponse response) { + responses.add(response); + } + + bool get allSuccessful => responses.every((r) => r.success); + + void dispose() { + timeoutTimer.cancel(); + } +} + +/// WebSocket-based VM service proxy for web debugging. +class WebSocketProxyService extends ProxyService { + final _logger = Logger('WebSocketProxyService'); + + /// Active service extension trackers by request ID. + final Map _pendingServiceExtensionTrackers = + {}; + + /// Sends messages to the client. + final SendClientRequest sendClientRequest; + + /// App connection for this service. + AppConnection appConnection; + + /// Active hot reload trackers by request ID. + final Map _pendingHotReloads = {}; + + /// Active hot restart trackers by request ID. + final Map _pendingHotRestarts = {}; + + /// App connection cleanup subscriptions by connection instance ID. + final Map> _appConnectionDoneSubscriptions = + {}; + + /// Active connection count for this service. + int _activeConnectionCount = 0; + + /// Counter for generating unique isolate IDs across page refreshes + static int _globalIsolateIdCounter = 0; + + bool get _isIsolateRunning => _isolateRunning; + + WebSocketProxyService._( + this.sendClientRequest, + vm_service.VM vm, + this.appConnection, + ) : super(vm); // Isolate state + vm_service.IsolateRef? _isolateRef; + bool _isolateRunning = false; + vm_service.Event? _currentPauseEvent; + bool _mainHasStarted = false; + + /// Creates a new isolate for WebSocket debugging. + @override + Future createIsolate( + AppConnection appConnection, { + bool newConnection = false, + }) async { + // Update app connection + this.appConnection = appConnection; + + // Track this connection + final connectionId = appConnection.request.instanceId; + + // Check if this connection is already being tracked + final isNewConnection = + newConnection || + !_appConnectionDoneSubscriptions.containsKey(connectionId); + + if (isNewConnection) { + _activeConnectionCount++; + _logger.fine( + 'Adding new connection: $connectionId (total: $_activeConnectionCount)', + ); + } else { + _logger.fine( + 'Reconnecting existing connection: $connectionId (total: $_activeConnectionCount)', + ); + } + + // Auto-cleanup on connection close + final existingSubscription = _appConnectionDoneSubscriptions[connectionId]; + await existingSubscription?.cancel(); + _appConnectionDoneSubscriptions[connectionId] = appConnection.onDone + .asStream() + .listen((_) { + _handleConnectionClosed(connectionId); + }); + + // If we already have a running isolate, just update the connection and return + if (_isIsolateRunning && _isolateRef != null) { + _logger.fine( + 'Reusing existing isolate ${_isolateRef!.id} for connection: $connectionId', + ); + return; + } + + // Create isolate reference with unique ID + final isolateId = '${++_globalIsolateIdCounter}'; + final isolateRef = vm_service.IsolateRef( + id: isolateId, + name: 'main()', + number: isolateId, + isSystemIsolate: false, + ); + + _isolateRef = isolateRef; + _isolateRunning = true; + vm.isolates?.add(isolateRef); + final timestamp = DateTime.now().millisecondsSinceEpoch; + + _logger.fine( + 'Created new isolate: $isolateId for connection: $connectionId', + ); + + // Send lifecycle events + _streamNotify( + vm_service.EventStreams.kIsolate, + vm_service.Event( + kind: vm_service.EventKind.kIsolateStart, + timestamp: timestamp, + isolate: isolateRef, + ), + ); + _streamNotify( + vm_service.EventStreams.kIsolate, + vm_service.Event( + kind: vm_service.EventKind.kIsolateRunnable, + timestamp: timestamp, + isolate: isolateRef, + ), + ); + + // Send pause event if enabled + if (pauseIsolatesOnStart) { + final pauseEvent = vm_service.Event( + kind: vm_service.EventKind.kPauseStart, + timestamp: timestamp, + isolate: isolateRef, + ); + _currentPauseEvent = pauseEvent; + _streamNotify(vm_service.EventStreams.kDebug, pauseEvent); + } + + // Complete initialization after isolate is set up + if (!initializedCompleter.isCompleted) initializedCompleter.complete(); + } + + /// Handles a connection being closed. + void _handleConnectionClosed(String connectionId) { + _logger.fine('Connection closed: $connectionId'); + + // Only decrement if this connection was actually being tracked + if (_appConnectionDoneSubscriptions.containsKey(connectionId)) { + // Remove the subscription for this connection + _appConnectionDoneSubscriptions[connectionId]?.cancel(); + _appConnectionDoneSubscriptions.remove(connectionId); + + // Decrease active connection count + _activeConnectionCount--; + _logger.fine( + 'Removed connection: $connectionId (remaining: $_activeConnectionCount)', + ); + _logger.fine( + 'Current tracked connections: ${_appConnectionDoneSubscriptions.keys.toList()}', + ); + + // Instead of destroying the isolate immediately, check if there are still + // clients that can receive hot reload requests + if (_activeConnectionCount <= 0) { + // Double-check by asking the sendClientRequest callback how many clients are available + final actualClientCount = sendClientRequest({'type': 'ping'}); + _logger.fine( + 'Actual client count from sendClientRequest: $actualClientCount', + ); + + if (actualClientCount == 0) { + _logger.fine( + 'No clients available for hot reload, scheduling isolate destruction', + ); + // Add a delay before destroying the isolate to handle page refresh race condition + Timer(const Duration(milliseconds: 1000), () { + // Double-check client count again before destroying + final finalClientCount = sendClientRequest({'type': 'ping'}); + if (finalClientCount == 0) { + destroyIsolate(); + } else { + _activeConnectionCount = finalClientCount; + } + }); + } else { + _logger.fine( + 'Still have $actualClientCount clients available, keeping isolate alive', + ); + // Update our internal counter to match reality + _activeConnectionCount = actualClientCount; + } + } else { + _logger.fine( + 'Still have $_activeConnectionCount active connections, keeping isolate alive', + ); + } + } else { + _logger.warning( + 'Attempted to close connection that was not tracked: $connectionId', + ); + } + } + + /// Destroys the isolate and cleans up state. + @override + void destroyIsolate() { + _logger.fine('Destroying isolate'); + + if (!_isIsolateRunning) { + _logger.fine('Isolate already destroyed, ignoring'); + return; + } + + final isolateRef = _isolateRef; + + // Cancel all connection subscriptions + for (final subscription in _appConnectionDoneSubscriptions.values) { + subscription.cancel(); + } + _appConnectionDoneSubscriptions.clear(); + _activeConnectionCount = 0; + + // Send exit event + if (isolateRef != null) { + _streamNotify( + vm_service.EventStreams.kIsolate, + vm_service.Event( + kind: vm_service.EventKind.kIsolateExit, + timestamp: DateTime.now().millisecondsSinceEpoch, + isolate: isolateRef, + ), + ); + } + + vm.isolates?.removeWhere((ref) => ref.id == isolateRef?.id); + + // Reset state + _isolateRef = null; + _isolateRunning = false; + _currentPauseEvent = null; + _mainHasStarted = false; + + if (initializedCompleter.isCompleted) { + initializedCompleter = Completer(); + } + } + + /// Sends events to stream controllers. + void _streamNotify(String streamId, vm_service.Event event) { + final controller = streamControllers[streamId]; + if (controller == null) return; + controller.add(event); + } + + @override + Future setLibraryDebuggable( + String isolateId, + String libraryId, + bool isDebuggable, + ) { + return rpcNotSupportedFuture('setLibraryDebuggable'); + } + + @override + Future setIsolatePauseMode( + String isolateId, { + String? exceptionPauseMode, + bool? shouldPauseOnExit, + }) async { + // Not supported in WebSocket mode - return success for compatibility + return Success(); + } + + @override + Future getIsolate(String isolateId) => + wrapInErrorHandlerAsync('getIsolate', () => _getIsolate(isolateId)); + + Future _getIsolate(String isolateId) async { + if (!_isIsolateRunning || _isolateRef == null) { + throw vm_service.RPCError( + 'getIsolate', + vm_service.RPCErrorKind.kInvalidParams.code, + 'No running isolate found for id: $isolateId', + ); + } + if (_isolateRef!.id != isolateId) { + throw vm_service.RPCError( + 'getIsolate', + vm_service.RPCErrorKind.kInvalidParams.code, + 'Isolate with id $isolateId not found.', + ); + } + + return vm_service.Isolate( + id: _isolateRef!.id!, + name: _isolateRef!.name, + number: _isolateRef!.number, + startTime: DateTime.now().millisecondsSinceEpoch, + isSystemIsolate: _isolateRef!.isSystemIsolate, + runnable: true, + pauseEvent: _currentPauseEvent, + ); + } + + /// Adds events to stream controllers. + void addEvent(String streamId, vm_service.Event event) { + final controller = streamControllers[streamId]; + if (controller != null && !controller.isClosed) { + controller.add(event); + } else { + _logger.warning('Cannot add event to closed/missing stream: $streamId'); + } + } + + static Future create( + SendClientRequest sendClientRequest, + AppConnection appConnection, + ) async { + final vm = vm_service.VM( + name: 'WebSocketDebugProxy', + operatingSystem: 'web', + startTime: DateTime.now().millisecondsSinceEpoch, + version: 'unknown', + isolates: [], + isolateGroups: [], + systemIsolates: [], + systemIsolateGroups: [], + targetCPU: 'Web', + hostCPU: 'DWDS', + architectureBits: -1, + pid: -1, + ); + final service = WebSocketProxyService._( + sendClientRequest, + vm, + appConnection, + ); + safeUnawaited(service.createIsolate(appConnection)); + return service; + } + + /// Returns the root VM object. + @override + Future getVM() => wrapInErrorHandlerAsync('getVM', _getVM); + + Future _getVM() { + return captureElapsedTime(() async { + // Ensure the VM's isolate list is synchronized with our actual state + if (_isIsolateRunning && _isolateRef != null) { + // Make sure our isolate is in the VM's isolate list + final isolateExists = + vm.isolates?.any((ref) => ref.id == _isolateRef!.id) ?? false; + if (!isolateExists) { + vm.isolates?.add(_isolateRef!); + } + } else { + // If no isolate is running, make sure the list is empty + vm.isolates?.clear(); + } + + return vm; + }, (result) => DwdsEvent.getVM()); + } + + /// Not available in WebSocket mode. + dynamic get remoteDebugger { + throw UnsupportedError( + 'remoteDebugger not available in WebSocketProxyService.\n' + 'Called from:\n${StackTrace.current}', + ); + } + + @override + Future reloadSources( + String isolateId, { + bool? force, + bool? pause, + String? rootLibUri, + String? packagesUri, + }) async { + _logger.info('Attempting a hot reload'); + try { + await _performWebSocketHotReload(); + _logger.info('Hot reload completed successfully'); + return _ReloadReportWithMetadata(success: true); + } catch (e) { + _logger.warning('Hot reload failed: $e'); + return _ReloadReportWithMetadata(success: false, notices: [e.toString()]); + } + } + + /// Handles hot restart requests. + Future> hotRestart() async { + _logger.info('Attempting a hot restart'); + + try { + await _performWebSocketHotRestart(); + _logger.info('Hot restart completed successfully'); + return {'result': vm_service.Success().toJson()}; + } catch (e) { + _logger.warning('Hot restart failed: $e'); + return { + 'error': { + 'code': vm_service.RPCErrorKind.kInternalError.code, + 'message': 'Hot restart failed: $e', + }, + }; + } + } + + /// Completes hot reload with response from client. + @override + void completeHotReload(HotReloadResponse response) { + final tracker = _pendingHotReloads[response.id]; + + if (tracker == null) { + _logger.warning( + 'Received hot reload response but no pending tracker found (id: ${response.id})', + ); + return; + } + + tracker.addResponse(response); + + if (tracker.isComplete) { + _pendingHotReloads.remove(response.id); + tracker.dispose(); + + if (tracker.allSuccessful) { + tracker.completer.complete(response); + } else { + final failedResponses = tracker.responses.where((r) => !r.success); + final errorMessages = failedResponses + .map((r) => r.errorMessage ?? 'Unknown error') + .join('; '); + tracker.completer.completeError( + 'Hot reload failed in some clients: $errorMessages', + ); + } + } + } + + /// Completes hot restart with response from client. + @override + void completeHotRestart(HotRestartResponse response) { + final tracker = _pendingHotRestarts[response.id]; + + if (tracker == null) { + _logger.warning( + 'Received hot restart response but no pending tracker found (id: ${response.id})', + ); + return; + } + + tracker.addResponse(response); + + if (tracker.isComplete) { + _pendingHotRestarts.remove(response.id); + tracker.dispose(); + + if (tracker.allSuccessful) { + tracker.completer.complete(response); + } else { + final failedResponses = tracker.responses.where((r) => !r.success); + final errorMessages = failedResponses + .map((r) => r.errorMessage ?? 'Unknown error') + .join('; '); + tracker.completer.completeError( + 'Hot restart failed in some clients: $errorMessages', + ); + } + } + } + + /// Performs WebSocket-based hot reload. + Future _performWebSocketHotReload({String? requestId}) async { + final id = requestId ?? createId(); + + // Check if there's already a pending hot reload with this ID + if (_pendingHotReloads.containsKey(id)) { + throw StateError('Hot reload already pending for ID: $id'); + } + + const timeout = Duration(seconds: 10); + _logger.info('Sending HotReloadRequest with ID ($id) to client'); + + // Send the request and get the number of connected clients + final clientCount = await Future.microtask(() { + return sendClientRequest(HotReloadRequest((b) => b.id = id)); + }); + + if (clientCount == 0) { + throw StateError('No clients available for hot reload'); + } + + // Create tracker for this hot reload request + final completer = Completer(); + final timeoutTimer = Timer(timeout, () { + final tracker = _pendingHotReloads.remove(id); + if (tracker != null) { + tracker.dispose(); + if (!completer.isCompleted) { + completer.completeError( + TimeoutException( + 'Hot reload timed out - received ${tracker.responses.length}/$clientCount responses', + timeout, + ), + ); + } + } + }); + + final tracker = _HotReloadTracker( + requestId: id, + completer: completer, + expectedResponses: clientCount, + timeoutTimer: timeoutTimer, + ); + + _pendingHotReloads[id] = tracker; + + try { + final response = await completer.future; + if (!response.success) { + throw Exception(response.errorMessage ?? 'Client reported failure'); + } + } catch (e) { + // Clean up tracker if still present + final remainingTracker = _pendingHotReloads.remove(id); + remainingTracker?.dispose(); + rethrow; + } + } + + /// Performs WebSocket-based hot restart. + Future _performWebSocketHotRestart({String? requestId}) async { + final id = requestId ?? createId(); + + // Check if there's already a pending hot restart with this ID + if (_pendingHotRestarts.containsKey(id)) { + throw StateError('Hot restart already pending for ID: $id'); + } + + const timeout = Duration(seconds: 15); + _logger.info('Sending HotRestartRequest with ID ($id) to client'); + + // Send the request and get the number of connected clients + final clientCount = await Future.microtask(() { + return sendClientRequest(HotRestartRequest((b) => b.id = id)); + }); + + if (clientCount == 0) { + throw StateError('No clients available for hot restart'); + } + + // Create tracker for this hot restart request + final completer = Completer(); + final timeoutTimer = Timer(timeout, () { + final tracker = _pendingHotRestarts.remove(id); + if (tracker != null) { + tracker.dispose(); + if (!completer.isCompleted) { + completer.completeError( + TimeoutException( + 'Hot restart timed out - received ${tracker.responses.length}/$clientCount responses', + timeout, + ), + ); + } + } + }); + + final tracker = _HotRestartTracker( + requestId: id, + completer: completer, + expectedResponses: clientCount, + timeoutTimer: timeoutTimer, + ); + + _pendingHotRestarts[id] = tracker; + + try { + final response = await completer.future; + if (!response.success) { + throw Exception(response.errorMessage ?? 'Client reported failure'); + } + } catch (e) { + // Clean up tracker if still present + final remainingTracker = _pendingHotRestarts.remove(id); + remainingTracker?.dispose(); + rethrow; + } + } + + @override + Future callServiceExtension( + String method, { + String? isolateId, + Map? args, + }) => wrapInErrorHandlerAsync( + 'callServiceExtension', + () => _callServiceExtension(method, args: args), + ); + + /// Calls a service extension on the client. + Future _callServiceExtension(String method, {Map? args}) async { + final requestId = createId(); + + // Check if there's already a pending service extension with this ID + if (_pendingServiceExtensionTrackers.containsKey(requestId)) { + throw StateError( + 'Service extension call already pending for ID: $requestId', + ); + } + + final request = ServiceExtensionRequest.fromArgs( + id: requestId, + method: method, + args: + args != null ? Map.from(args) : {}, + ); + + // Send the request and get the number of connected clients + final clientCount = sendClientRequest(request); + + if (clientCount == 0) { + throw StateError('No clients available for service extension'); + } + + // Create tracker for this service extension request + const timeout = Duration(seconds: 10); + final completer = Completer(); + final timeoutTimer = Timer(timeout, () { + final tracker = _pendingServiceExtensionTrackers.remove(requestId); + if (tracker != null) { + tracker.dispose(); + if (!completer.isCompleted) { + completer.completeError( + TimeoutException( + 'Service extension $method timed out - received ${tracker.responses.length}/$clientCount responses', + timeout, + ), + ); + } + } + }); + + final tracker = _ServiceExtensionTracker( + requestId: requestId, + completer: completer, + expectedResponses: clientCount, + timeoutTimer: timeoutTimer, + ); + + _pendingServiceExtensionTrackers[requestId] = tracker; + + try { + final response = await completer.future; + + if (response.errorMessage != null) { + throw RPCError( + method, + response.errorCode ?? RPCErrorKind.kServerError.code, + response.errorMessage!, + ); + } + return Response()..json = response.result; + } catch (e) { + // Clean up tracker if still present + final remainingTracker = _pendingServiceExtensionTrackers.remove( + requestId, + ); + remainingTracker?.dispose(); + rethrow; + } + } + + /// Completes service extension with response. + @override + void completeServiceExtension(ServiceExtensionResponse response) { + final id = response.id; + + final tracker = _pendingServiceExtensionTrackers[id]; + + if (tracker == null) { + _logger.warning( + 'No pending tracker found for service extension (id: $id)', + ); + return; + } + + tracker.addResponse(response); + + if (tracker.isComplete) { + _pendingServiceExtensionTrackers.remove(id); + tracker.dispose(); + + if (tracker.allSuccessful) { + tracker.completer.complete(response); + } else { + final failedResponses = tracker.responses.where((r) => !r.success); + final errorMessages = failedResponses + .map((r) => r.errorMessage ?? 'Unknown error') + .join('; '); + tracker.completer.completeError( + 'Service extension failed in some clients: $errorMessages', + ); + } + } + } + + /// Parses the [RegisterEvent] and emits a corresponding Dart VM Service + /// protocol [Event]. + @override + void parseRegisterEvent(RegisterEvent registerEvent) { + if (!_isIsolateRunning || _isolateRef == null) { + _logger.warning('Cannot register service extension - no isolate running'); + return; + } + + final service = registerEvent.eventData; + + // Emit ServiceExtensionAdded event for tooling + final event = vm_service.Event( + kind: vm_service.EventKind.kServiceExtensionAdded, + timestamp: DateTime.now().millisecondsSinceEpoch, + isolate: _isolateRef!, + ); + event.extensionRPC = service; + + _streamNotify(vm_service.EventStreams.kIsolate, event); + } + + /// Parses the [BatchedDebugEvents] and emits corresponding Dart VM Service + /// protocol [Event]s. + @override + void parseBatchedDebugEvents(BatchedDebugEvents debugEvents) { + for (final debugEvent in debugEvents.events) { + parseDebugEvent(debugEvent); + } + } + + /// Parses the [DebugEvent] and emits a corresponding Dart VM Service + /// protocol [Event]. + @override + void parseDebugEvent(DebugEvent debugEvent) { + if (!_isIsolateRunning || _isolateRef == null) { + _logger.warning('Cannot parse debug event - no isolate running'); + return; + } + + _streamNotify( + vm_service.EventStreams.kExtension, + vm_service.Event( + kind: vm_service.EventKind.kExtension, + timestamp: DateTime.now().millisecondsSinceEpoch, + isolate: _isolateRef!, + ) + ..extensionKind = debugEvent.kind + ..extensionData = vm_service.ExtensionData.parse( + jsonDecode(debugEvent.eventData) as Map, + ), + ); + } + + @override + Future setFlag(String name, String value) => + wrapInErrorHandlerAsync('setFlag', () => _setFlag(name, value)); + + Future _setFlag(String name, String value) async { + if (!currentVmServiceFlags.containsKey(name)) { + return rpcNotSupportedFuture('setFlag'); + } + + assert(value == 'true' || value == 'false'); + final oldValue = currentVmServiceFlags[name]; + currentVmServiceFlags[name] = value == 'true'; + + // Handle pause_isolates_on_start flag changes + if (name == _pauseIsolatesOnStartFlag && + value == 'true' && + oldValue == false) { + // Send pause event for existing isolate if not already paused + if (_isIsolateRunning && + _isolateRef != null && + _currentPauseEvent == null) { + final pauseEvent = vm_service.Event( + kind: vm_service.EventKind.kPauseStart, + timestamp: DateTime.now().millisecondsSinceEpoch, + isolate: _isolateRef!, + ); + _currentPauseEvent = pauseEvent; + _streamNotify(vm_service.EventStreams.kDebug, pauseEvent); + } + } + + return Success(); + } + + @override + Future lookupResolvedPackageUris( + String isolateId, + List uris, { + bool? local, + }) => wrapInErrorHandlerAsync( + 'lookupResolvedPackageUris', + () => _lookupResolvedPackageUris(isolateId, uris), + ); + + Future _lookupResolvedPackageUris( + String _, + List uris, + ) async { + await isInitialized; + return UriList(uris: uris.map(DartUri.toResolvedUri).toList()); + } + + /// Pauses execution of the isolate. + @override + Future pause(String isolateId) => + wrapInErrorHandlerAsync('pause', () => _pause(isolateId)); + + Future _pause(String _) async { + // Create a pause event and store it + if (_isolateRef != null) { + final pauseEvent = vm_service.Event( + kind: vm_service.EventKind.kPauseInterrupted, + timestamp: DateTime.now().millisecondsSinceEpoch, + isolate: _isolateRef!, + ); + _currentPauseEvent = pauseEvent; + _streamNotify(vm_service.EventStreams.kDebug, pauseEvent); + } + + return Success(); + } + + /// Resumes execution of the isolate. + @override + Future resume(String isolateId, {String? step, int? frameIndex}) => + wrapInErrorHandlerAsync('resume', () => _resume(isolateId)); + + Future _resume(String isolateId) async { + if (hasPendingRestart && !resumeAfterRestartEventsController.isClosed) { + resumeAfterRestartEventsController.add(isolateId); + } else { + if (!_mainHasStarted) { + try { + appConnection.runMain(); + _mainHasStarted = true; + } catch (e) { + if (e.toString().contains('Main has already started')) { + _mainHasStarted = true; + } else { + rethrow; + } + } + } + } + + // Clear pause state and send resume event to notify debugging tools + if (_currentPauseEvent != null && _isolateRef != null) { + _currentPauseEvent = null; + final resumeEvent = vm_service.Event( + kind: vm_service.EventKind.kResume, + timestamp: DateTime.now().millisecondsSinceEpoch, + isolate: _isolateRef!, + ); + _streamNotify(vm_service.EventStreams.kDebug, resumeEvent); + } + + return Success(); + } + + @override + Future lookupPackageUris(String isolateId, List uris) => + wrapInErrorHandlerAsync( + 'lookupPackageUris', + () => _lookupPackageUris(isolateId, uris), + ); + + Future _lookupPackageUris(String _, List uris) async { + await isInitialized; + return UriList(uris: uris.map(DartUri.toPackageUri).toList()); + } + + @override + Future registerService(String service, String alias) { + return rpcNotSupportedFuture('registerService'); + } + + @override + Future getFlagList() => + wrapInErrorHandlerAsync('getFlagList', _getFlagList); + + Future _getFlagList() async { + // Return basic flag list for WebSocket mode + return FlagList( + flags: [ + Flag( + name: _pauseIsolatesOnStartFlag, + comment: 'If enabled, isolates are paused on start', + valueAsString: pauseIsolatesOnStart.toString(), + ), + ], + ); + } + + @override + Future getStack( + String isolateId, { + String? idZoneId, + int? limit, + }) => wrapInErrorHandlerAsync('getStack', () => _getStack(isolateId)); + + Future _getStack(String isolateId) async { + if (!_isIsolateRunning || _isolateRef == null) { + throw vm_service.RPCError( + 'getStack', + vm_service.RPCErrorKind.kInvalidParams.code, + 'No running isolate found for id: $isolateId', + ); + } + if (_isolateRef!.id != isolateId) { + throw vm_service.RPCError( + 'getStack', + vm_service.RPCErrorKind.kInvalidParams.code, + 'Isolate with id $isolateId not found.', + ); + } + + // Return empty stack since we're in WebSocket mode without Chrome debugging + return vm_service.Stack( + frames: [], + asyncCausalFrames: [], + awaiterFrames: [], + ); + } +} + +/// Extended ReloadReport that includes additional metadata in JSON output. +class _ReloadReportWithMetadata extends vm_service.ReloadReport { + final List? notices; + _ReloadReportWithMetadata({super.success, this.notices}); + + @override + Map toJson() { + final jsonified = { + 'type': 'ReloadReport', + 'success': success ?? false, + }; + if (notices != null) { + jsonified['notices'] = notices!.map((e) => {'message': e}).toList(); + } + return jsonified; + } +} diff --git a/dwds/lib/src/version.dart b/dwds/lib/src/version.dart index c8bd103ab..056d15cd2 100644 --- a/dwds/lib/src/version.dart +++ b/dwds/lib/src/version.dart @@ -1,2 +1,2 @@ // Generated code. Do not modify. -const packageVersion = '24.4.1-wip'; +const packageVersion = '24.4.1'; diff --git a/dwds/pubspec.yaml b/dwds/pubspec.yaml index da11ad7f1..b487f3f98 100644 --- a/dwds/pubspec.yaml +++ b/dwds/pubspec.yaml @@ -1,6 +1,6 @@ name: dwds # Every time this changes you need to run `dart run build_runner build`. -version: 24.4.1-wip +version: 24.4.1 description: >- A service that proxies between the Chrome debug protocol and the Dart VM diff --git a/dwds/web/client.dart b/dwds/web/client.dart index b824cf5e9..d95b4912f 100644 --- a/dwds/web/client.dart +++ b/dwds/web/client.dart @@ -16,9 +16,13 @@ import 'package:dwds/data/error_response.dart'; import 'package:dwds/data/extension_request.dart'; import 'package:dwds/data/hot_reload_request.dart'; import 'package:dwds/data/hot_reload_response.dart'; +import 'package:dwds/data/hot_restart_request.dart'; +import 'package:dwds/data/hot_restart_response.dart'; import 'package:dwds/data/register_event.dart'; import 'package:dwds/data/run_request.dart'; import 'package:dwds/data/serializers.dart'; +import 'package:dwds/data/service_extension_request.dart'; +import 'package:dwds/data/service_extension_response.dart'; import 'package:dwds/shared/batched_stream.dart'; import 'package:dwds/src/sockets.dart'; import 'package:http/browser_client.dart'; @@ -208,6 +212,10 @@ Future? main() { ); } else if (event is HotReloadRequest) { await handleWebSocketHotReloadRequest(event, manager, client.sink); + } else if (event is HotRestartRequest) { + await handleWebSocketHotRestartRequest(event, manager, client.sink); + } else if (event is ServiceExtensionRequest) { + await handleServiceExtensionRequest(event, client.sink, manager); } }, onError: (error) { @@ -247,10 +255,6 @@ Future? main() { } } else { _sendConnectRequest(client.sink); - // TODO(yjessy): Remove this when the DWDS WebSocket connection is implemented. - if (useDwdsWebSocketConnection) { - runMain(); - } } _launchCommunicationWithDebugExtension(); }, @@ -416,6 +420,45 @@ void _sendHotReloadResponse( ); } +void _sendHotRestartResponse( + StreamSink clientSink, + String requestId, { + bool success = true, + String? errorMessage, +}) { + _sendResponse( + clientSink, + HotRestartResponse.new, + requestId, + success: success, + errorMessage: errorMessage, + ); +} + +void _sendServiceExtensionResponse( + StreamSink clientSink, + String requestId, { + bool success = true, + String? errorMessage, + int? errorCode, + Map? result, +}) { + _trySendEvent( + clientSink, + jsonEncode( + serializers.serialize( + ServiceExtensionResponse.fromResult( + id: requestId, + success: success, + errorMessage: errorMessage, + errorCode: errorCode, + result: result, + ), + ), + ), + ); +} + Future handleWebSocketHotReloadRequest( HotReloadRequest event, ReloadingManager manager, @@ -436,6 +479,64 @@ Future handleWebSocketHotReloadRequest( } } +Future handleWebSocketHotRestartRequest( + HotRestartRequest event, + ReloadingManager manager, + StreamSink clientSink, +) async { + final requestId = event.id; + try { + final runId = const Uuid().v4().toString(); + await manager.hotRestart(runId: runId); + _sendHotRestartResponse(clientSink, requestId, success: true); + } catch (e) { + _sendHotRestartResponse( + clientSink, + requestId, + success: false, + errorMessage: e.toString(), + ); + } +} + +Future handleServiceExtensionRequest( + ServiceExtensionRequest request, + StreamSink clientSink, + ReloadingManager manager, +) async { + try { + final result = await manager.handleServiceExtension( + request.method, + request.args, + ); + + if (result != null) { + _sendServiceExtensionResponse( + clientSink, + request.id, + success: true, + result: result, + ); + } else { + // Service extension not supported by this restarter type + _sendServiceExtensionResponse( + clientSink, + request.id, + success: false, + errorMessage: 'Service extension not supported', + errorCode: -32601, // Method not found + ); + } + } catch (e) { + _sendServiceExtensionResponse( + clientSink, + request.id, + success: false, + errorMessage: e.toString(), + ); + } +} + @JS(r'$dartAppId') external String get dartAppId; @@ -488,10 +589,6 @@ external String get reloadConfiguration; @JS(r'$dartEntrypointPath') external String get dartEntrypointPath; -// TODO(yjessy): Remove this when the DWDS WebSocket connection is implemented. -@JS(r'$useDwdsWebSocketConnection') -external bool get useDwdsWebSocketConnection; - @JS(r'$dwdsEnableDevToolsLaunch') external bool get dwdsEnableDevToolsLaunch; diff --git a/dwds/web/reloader/ddc_library_bundle_restarter.dart b/dwds/web/reloader/ddc_library_bundle_restarter.dart index 5752cb983..0f4ee3021 100644 --- a/dwds/web/reloader/ddc_library_bundle_restarter.dart +++ b/dwds/web/reloader/ddc_library_bundle_restarter.dart @@ -38,6 +38,13 @@ extension type _Debugger._(JSObject _) implements JSObject { await invokeExtension(method, '{}').toDart; } } + + Future maybeInvokeFlutterReassemble() async { + final method = 'ext.flutter.reassemble'; + if (extensionNames.toDart.contains(method.toJS)) { + await invokeExtension(method, '{}').toDart; + } + } } @JS('XMLHttpRequest') @@ -129,4 +136,27 @@ class DdcLibraryBundleRestarter implements Restarter { _dartDevEmbedder.config.capturedHotReloadEndHandler = null; _capturedHotReloadEndCallback = null; } + + /// Handles service extension requests using the dart dev embedder + Future?> handleServiceExtension( + String method, + Map args, + ) async { + if (method == 'ext.flutter.reassemble') { + await _dartDevEmbedder.debugger.maybeInvokeFlutterReassemble(); + return {'status': 'reassemble invoked'}; + } else if (method == 'getExtensionRpcs') { + final rpcs = + _dartDevEmbedder.debugger.extensionNames.toDart.cast(); + return {'rpcs': rpcs}; + } else { + // For other extension methods, delegate to the debugger + final params = args.isNotEmpty ? jsonEncode(args) : '{}'; + final resultJson = + await _dartDevEmbedder.debugger + .invokeExtension(method, params) + .toDart; + return jsonDecode(resultJson.toDart) as Map; + } + } } diff --git a/dwds/web/reloader/manager.dart b/dwds/web/reloader/manager.dart index 52ee179b5..d6ace566b 100644 --- a/dwds/web/reloader/manager.dart +++ b/dwds/web/reloader/manager.dart @@ -10,6 +10,7 @@ import 'package:dwds/data/serializers.dart'; import 'package:dwds/src/sockets.dart'; import 'package:web/web.dart'; +import 'ddc_library_bundle_restarter.dart'; import 'restarter.dart'; class ReloadingManager { @@ -71,6 +72,19 @@ class ReloadingManager { window.location.reload(); } + /// Handles service extension requests by delegating to the appropriate restarter + Future?> handleServiceExtension( + String method, + Map args, + ) async { + final restarter = _restarter; + if (restarter is DdcLibraryBundleRestarter) { + return await restarter.handleServiceExtension(method, args); + } + // For other restarter types, return null to indicate not supported + return null; + } + void _afterRestart(bool succeeded) { if (!succeeded) return; // Notify package:dwds that the isolate has been created.