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