send method
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;
}