executeAction method

Future<void> executeAction(
  1. NotificationActionEvent event, {
  2. bool skipReplayCheck = false,
  3. bool queueOnFailure = true,
})

Implementation

Future<void> executeAction(
  NotificationActionEvent event, {
  bool skipReplayCheck = false,
  bool queueOnFailure = true,
}) async {
  if (!skipReplayCheck &&
      !await _replayGuard.claim(
        'action:${event.notificationId}:${event.actionId}:'
        '${event.message.messageId}',
        event.timestamp,
      )) {
    config.logger.log(
      FcmLogLevel.warning,
      'Ignored duplicate action "${event.actionId}".',
    );
    return;
  }

  try {
    var current = event;
    for (final interceptor in config.actionInterceptors) {
      final intercepted = await interceptor.beforeAction(current);
      if (intercepted == null) return;
      current = intercepted;
    }
    await _runMiddleware(current, 0);
    for (final interceptor in config.actionInterceptors.reversed) {
      await interceptor.afterAction(current);
    }
    events.action(current);
    if (current.replyText != null) events.reply(current);
    await _forEachAnalytics((analytics) => analytics.actionExecuted(current));
  } on Object catch (error, stackTrace) {
    config.logger.log(
      FcmLogLevel.error,
      'Action "${event.actionId}" failed.',
      error: error,
      stackTrace: stackTrace,
    );
    if (queueOnFailure && config.queueFailedActions) {
      await _actionQueue.enqueue(event);
    }
  }
}