blob: 6c3ec5371717aa76c5065cc59ac5d08d383458f1 [file]
// Copyright (c) 2019, 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:js_interop';
import 'package:web/web.dart';
import 'restarter.dart';
@anonymous
@JS()
@staticInterop
class DartLibrary {}
@JS(r'dart_library')
external DartLibrary dartLibrary;
extension DartLibraryExtension on DartLibrary {
external void reload(String? runId, JSPromise? readyToRunMain);
}
class DdcRestarter implements Restarter {
@override
Future<bool> restart({String? runId, Future? readyToRunMain}) async {
dartLibrary.reload(runId, readyToRunMain?.toJS);
final reloadCompleter = Completer<bool>();
final sub = window.onMessage.listen((event) {
final message = event.data?.dartify();
if (message is Map &&
message['type'] == 'DDC_STATE_CHANGE' &&
message['state'] == 'restart_end') {
reloadCompleter.complete(true);
}
});
return reloadCompleter.future.then((value) {
sub.cancel();
return value;
});
}
@override
Future<void> reload() =>
throw UnimplementedError(
'Hot reload is not supported for the DDC module format.',
);
}