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);
}
}
}