blob: fedf77ea315fae9be11c9555e1ee952ece4438b5 [file]
// Copyright (c) 2015, 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:js_interop';
import 'package:stream_channel/stream_channel.dart';
import 'dom.dart' as dom;
/// Constructs a [StreamChannel] wrapping a new [MessageChannel] communicating
/// with the host page.
///
/// Sends a [MessagePort] to the host page for the channel.
StreamChannel<Object?> postMessageChannel() {
dom.window.console.log('Suite starting, sending channel to host'.toJS);
var controller = StreamChannelController<Object?>(sync: true);
var channel = dom.createMessageChannel();
dom.window.parent.postMessage('port', dom.window.location.origin, [
channel.port2,
]);
var portSubscription = dom.Subscription(channel.port1, 'message', (
dom.Event event,
) {
controller.local.sink.add((event as dom.MessageEvent).data);
});
channel.port1.start();
controller.local.stream.listen(
channel.port1.postMessage,
onDone: portSubscription.cancel,
);
return controller.foreign;
}