send method

  1. @internal
Future<ChannelResponse> send({
  1. required RealtimeListenTypes type,
  2. String? event,
  3. required Map<String, dynamic> payload,
  4. Map<String, dynamic> opts = const {},
})

Implementation

@internal
Future<ChannelResponse> send({
  required RealtimeListenTypes type,
  String? event,
  required Map<String, dynamic> payload,
  Map<String, dynamic> opts = const {},
}) async {
  final completer = Completer<ChannelResponse>();

  payload['type'] = type.toType();
  if (event != null) {
    payload['event'] = event;
  }

  if (!canPush && type == RealtimeListenTypes.broadcast) {
    final headers = {'Content-Type': 'application/json', ...socket.headers};
    final body = {
      'messages': [
        {
          'topic': subTopic,
          'payload': payload,
          'event': event,
        }
      ]
    };
    try {
      final res = await (socket.httpClient?.post ?? post)(
        Uri.parse(broadcastEndpointURL),
        headers: headers,
        body: json.encode(body),
      );
      if (200 <= res.statusCode && res.statusCode < 300) {
        completer.complete(ChannelResponse.ok);
      } else {
        completer.complete(ChannelResponse.error);
      }
    } catch (e) {
      completer.complete(ChannelResponse.error);
    }
  } else {
    final push = this.push(
      ChannelEventsExtended.fromType(payload['type']),
      payload,
      opts['timeout'] ?? _timeout,
    );

    if (payload['type'] == 'broadcast' &&
        (params['config']?['broadcast']?['ack'] == null ||
            params['config']?['broadcast']?['ack'] == false)) {
      if (!completer.isCompleted) {
        completer.complete(ChannelResponse.ok);
      }
    }

    push.receive('ok', (_) {
      if (!completer.isCompleted) {
        completer.complete(ChannelResponse.ok);
      }
    });
    push.receive('error', (_) {
      if (!completer.isCompleted) {
        completer.complete(ChannelResponse.error);
      }
    });
    push.receive('timeout', (_) {
      if (!completer.isCompleted) {
        completer.complete(ChannelResponse.timedOut);
      }
    });
  }
  return completer.future;
}