trigger method

void trigger(
  1. String type, [
  2. dynamic payload,
  3. String? ref
])

Implementation

void trigger(String type, [dynamic payload, String? ref]) {
  final typeLower = type.toLowerCase();

  final events = [
    ChannelEvents.close,
    ChannelEvents.error,
    ChannelEvents.leave,
    ChannelEvents.join,
  ].map((e) => e.eventName()).toSet();

  if (ref != null && events.contains(typeLower) && ref != joinRef) {
    return;
  }

  var handledPayload = onMessage(typeLower, payload, ref);
  if (payload != null && handledPayload == null) {
    throw 'channel onMessage callbacks must return the payload, modified or unmodified';
  }

  if (['insert', 'update', 'delete'].contains(typeLower)) {
    final bindings = _bindings['postgres_changes']?.where((bind) {
      return (bind.filter['event'] == '*' ||
          bind.filter['event']?.toLowerCase() == typeLower);
    });

    for (final bind in (bindings ?? <Binding>[])) {
      handledPayload = getEnrichedPayload(handledPayload);
      bind.callback(handledPayload, ref);
    }
  } else {
    final bindings = (_bindings[typeLower] ?? []).where((bind) {
      if (['broadcast', 'presence', 'postgres_changes'].contains(typeLower)) {
        final bindId = bind.id;
        if (bindId != null) {
          final bindEvent = bind.filter['event'];

          return ((payload['ids'] as List?)?.contains(int.parse(bindId)) ==
                  true &&
              (bindEvent == '*' ||
                  bindEvent?.toLowerCase() ==
                      (payload['data']?['type'] as String?)?.toLowerCase()));
        } else {
          final bindEvent = bind.filter['event']?.toLowerCase();
          return (bindEvent == '*' ||
              bindEvent == (payload?['event'] as String?)?.toLowerCase());
        }
      } else {
        return bind.type.toLowerCase() == typeLower;
      }
    });
    for (final bind in bindings) {
      if (handledPayload is Map<String, dynamic> &&
          handledPayload.keys.contains('ids')) {
        handledPayload = getEnrichedPayload(handledPayload);
      }

      bind.callback(handledPayload, ref);
    }
  }
}