// Copyright (c) 2017, 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 'package:analyzer_plugin/protocol/protocol.dart';

/// A communication channel that allows a [ServerPlugin] to receive [Request]s
/// from, and to return both [Response]s and [Notification]s to, an analysis
/// server.
///
/// Clients may not extend, implement or mix-in this class.
abstract class PluginCommunicationChannel {
  /// Close the communication channel.
  void close();

  /// Listen to the channel for requests. If a request is received, invoke the
  /// [onRequest] function. If an error is encountered while trying to read from
  /// the socket, invoke the [onError] function. If the socket is closed by the
  /// client, invoke the [onDone] function. Only one listener is allowed per
  /// channel.
  void listen(void Function(Request request) onRequest,
      {Function? onError, void Function()? onDone});

  /// Send the given [notification] to the server.
  void sendNotification(Notification notification);

  /// Send the given [response] to the server.
  void sendResponse(Response response);
}

/// A communication channel that allows an analysis server to send [Request]s
/// to, and to receive both [Response]s and [Notification]s from, a plugin.
///
/// Clients may not extend, implement or mix-in this class.
abstract class ServerCommunicationChannel {
  /// Close the communication channel.
  void close();

  /// Cause the plugin to terminate as soon as possible. This should only be used
  /// when the plugin has failed to terminate after sending it a 'plugin.shutdown'
  /// request.
  void kill();

  /// Listen to the channel for responses and notifications. If a response is
  /// received, invoke the [onResponse] function. If a notification is received,
  /// invoke the [onNotification] function. If an error is encountered while
  /// trying to read from the socket, invoke the [onError] function. If the
  /// socket is closed by the plugin, invoke the [onDone] function. Only one
  /// listener is allowed per channel.
  void listen(void Function(Response response) onResponse,
      void Function(Notification notification) onNotification,
      {void Function(dynamic error)? onError, void Function()? onDone});

  /// Send the given [request] to the plugin.
  void sendRequest(Request request);
}
