Connector Open-Source Code

Browse connector files locally. Exchange API keys stay on your device.

lib/events.php

<?php
// /opt/nuxvision_connector/lib/events.php
declare(strict_types=1);

/**
 * Connector EVENTS (actions + errors)
 * - Centralise l’envoi des events vers NuxVision
 * - Throttle RAM pour éviter le spam
 * - Utilisable par runner.php et tracker.php
 */

require_once __DIR__ . '/core.php';
require_once __DIR__ . '/nuxvision.php';

/* =========================================================
   NORMALIZATION
   ========================================================= */

if (!function_exists('nv_event_type_normalize')) {
    function nv_event_type_normalize(string $eventType): string {
        $s = strtoupper(trim($eventType));
        if ($s === '') return '';
        $s = str_replace(['-', ' '], '_', $s);
        $s = preg_replace('/[^A-Z0-9_]/', '_', $s);
        $s = preg_replace('/_+/', '_', $s);
        return trim($s, '_');
    }
}

if (!function_exists('nv_event_severity_normalize')) {
    function nv_event_severity_normalize(string $severity): string {
        $s = strtoupper(trim($severity));
        return match ($s) {
            'ERROR' => 'ERROR',
            'WARN', 'WARNING' => 'WARN',
            default => 'INFO',
        };
    }
}

/* =========================================================
   THROTTLE
   ========================================================= */

if (!function_exists('nv_event_fingerprint')) {
    function nv_event_fingerprint(string $eventType, array $payload): string {
        return $eventType . ':' . sha1(json_encode(
            $payload,
            JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE
        ));
    }
}

if (!function_exists('nv_should_emit_event')) {
    function nv_should_emit_event(array &$mem, string $key, int $cooldownSec, int $now): bool {
        if ($cooldownSec <= 0) return true;

        if (!isset($mem['event_throttle']) || !is_array($mem['event_throttle'])) {
            $mem['event_throttle'] = [];
        }

        $last = isset($mem['event_throttle'][$key])
            ? (int)$mem['event_throttle'][$key]
            : 0;

        if ($last > 0 && ($now - $last) < $cooldownSec) {
            return false;
        }

        $mem['event_throttle'][$key] = $now;
        return true;
    }
}

/* =========================================================
   MAIN EMITTER
   ========================================================= */

if (!function_exists('nv_emit_event')) {
    function nv_emit_event(
        string $nvBase,
        string $nvKey,
        int $nvTimeout,
        int $instanceId,
        string $eventType,
        string $severity,
        string $source,
        array $payload,
        string $logFile,
        int $tickId,
        array &$mem,
        int $cooldownSec = 15
    ): void {
        $eventType = nv_event_type_normalize($eventType);
        $severity  = nv_event_severity_normalize($severity);
        $source    = strtolower(trim($source));

        if ($instanceId <= 0 || $eventType === '' || $source === '') {
            return;
        }

        $now = now_ts();
        $key = nv_event_fingerprint($eventType, $payload);

        if (!nv_should_emit_event($mem, $key, $cooldownSec, $now)) {
            return;
        }

        // sécurité : ne jamais envoyer de clés
        $payloadMasked = mask_api_keys($payload);

        $t0 = microtime(true);
        $r = nv_connector_event_create(
            $nvBase,
            $nvKey,
            $nvTimeout,
            $instanceId,
            $eventType,
            $severity,
            $source,
            $payloadMasked
        );
        $ms = (int)round((microtime(true) - $t0) * 1000);

        if (empty($r['ok']) || empty($r['json']['ok'])) {
            log_event($logFile, 'WARN', 'EVT', 'event push failed', [
                'event_type' => $eventType,
                'severity' => $severity,
                'http' => (int)($r['code'] ?? 0),
                'ms' => $ms,
                'err' => $r['err'] ?? null,
                'raw_head' => substr((string)($r['raw'] ?? ''), 0, 200),
            ], $tickId);
        } else {
            log_event($logFile, 'DEBUG', 'EVT', 'event pushed', [
                'event_type' => $eventType,
                'severity' => $severity,
                'http' => (int)($r['code'] ?? 0),
                'ms' => $ms,
            ], $tickId);
        }
    }
}