| // 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; | |
| } |