/// WebSocket plugin for Angel.
library platform_websocket;

/// A notification from the server that something has occurred.
class WebSocketEvent<Data> {
  String? eventName;
  Data? data;

  WebSocketEvent({this.eventName, this.data});

  factory WebSocketEvent.fromJson(Map data) => WebSocketEvent(
      eventName: data['eventName'].toString(), data: data['data'] as Data?);

  WebSocketEvent<T> cast<T>() {
    if (T == Data) {
      return this as WebSocketEvent<T>;
    } else {
      return WebSocketEvent<T>(eventName: eventName, data: data as T?);
    }
  }

  Map<String, dynamic> toJson() {
    return {'eventName': eventName, 'data': data};
  }
}

/// A command sent to the server, usually corresponding to a service method.
class WebSocketAction {
  String? id;
  String? eventName;
  dynamic data;
  Map<String, dynamic> params;

  WebSocketAction({this.id, this.eventName, this.data, this.params = const {}});

  factory WebSocketAction.fromJson(Map data) => WebSocketAction(
      id: data['id'].toString(),
      eventName: data['eventName'].toString(),
      data: data['data'],
      params: data['params'] as Map<String, dynamic>? ?? {});

  Map<String, dynamic> toJson() {
    return {'id': id, 'eventName': eventName, 'data': data, 'params': params};
  }
}