IR
irwinrodriguez.dev
Zuruck zur Dokumentation

Erweiterte Funktionen

FoxServer enthalt erweiterte Funktionen fur moderne Anwendungsfalle: Echtzeit-Event-Streaming, Webhooks mit Wiederholungsversuchen, Hot-Reload von Controllern, Metriken und Windows-Dienstmodus.

Server-Sent Events (SSE)

SSE ermoglicht es dem Server, Ereignisse uber eine persistente HTTP-Verbindung an den Client zu pushen. Ideal fur Echtzeit-Benachrichtigungen, Fortschritt langer Operationen und Daten-Feeds.

In JSON aktivieren:

{ "middleware": { "sse": true } }

Implementierung im Controller:

PROCEDURE GetLiveData(req, res) HELP "GET: stream/live public"
    LOCAL i, lcData

    res.header("Content-Type",  "text/event-stream")
       .header("Cache-Control", "no-cache")
       .header("Connection",    "keep-alive")

    FOR i = 1 TO 20
        lcData = '{"tick":' + TRANSFORM(i) + ',"ts":"' + DTOC(DATETIME()) + '"}'
        res.send("data: " + lcData + CHR(13) + CHR(10) + CHR(13) + CHR(10))
        INKEY(1)   && 1-second pause between events
    NEXT
ENDPROC

JavaScript-Client:

const es = new EventSource('/api/stream/live');
es.onmessage = (e) => {
  const data = JSON.parse(e.data);
  console.log('tick', data.tick, 'at', data.ts);
};
es.onerror = () => es.close();

Webhook-System

FoxServer enthalt einen Webhook-Prozessor mit persistenter Warteschlange, automatischen Wiederholungsversuchen mit exponentiellem Backoff und HMAC-SHA256-Signierung.

  • Persistente Warteschlange (uberlebt Server-Neustarts)
  • Automatische Wiederholungsversuche mit konfigurierbarem exponentiellem Backoff
  • Automatische HMAC-SHA256-Signierung bei jeder Lieferung
  • Gleichzeitige Worker fur parallele Lieferungen
  • Protokoll aller Lieferversuche

Konfiguration:

"middleware": {
  "webhooks": {
    "enabled": true,
    "global": {
      "retries": 3,
      "timeout": 30,
      "backoff": [5, 15, 30],
      "queue": { "path": "queue/webhooks", "workers": 2 },
      "logging": { "enabled": true, "path": "logs/webhooks/" }
    }
  }
}

Einen Webhook aus einem Controller auslosen:

PROCEDURE PostOrder(req, res) HELP "POST: orders public"
    LOCAL lcOrderId, loEvt, loResp

    lcOrderId = THIS.CreateOrder(req.json)

    * Build the webhook event
    loEvt = THIS.newObject("event,data")
    loEvt.event      = "order.created"
    loEvt.data       = THIS.newObject("orderId,customer,total")
    loEvt.data.orderId   = lcOrderId
    loEvt.data.customer  = req.json.customer
    loEvt.data.total     = req.json.total

    * Queue — FoxServer handles delivery, retries, signing
    THIS.QueueWebhook("https://partner.com/webhooks", "shared-secret", loEvt)

    loResp = THIS.newObject("orderId,status")
    loResp.orderId = lcOrderId
    loResp.status  = "created"
    res.status(201).json(THIS.ToJson(loResp))
ENDPROC

Der Empfanger erhalt:

POST https://partner.com/webhooks
webhook-id: 550e8400-e29b-41d4-a716-446655440000
webhook-timestamp: 2026-04-11T14:23:45Z
webhook-signature: sha256=hmac-sha256-of-body

{
  "event": "order.created",
  "data": { "orderId": "ORD-001", "customer": "Irwin", "total": 99.99 }
}

Hot Reload

Hot Reload erkennt Anderungen in der kompilierten DLL und ladt Controller neu, ohne den Server neu zu starten. Laufende Anfragen enden auf der alten Version; neue Anfragen verwenden die aktualisierte Version.

Funktionsweise:

  1. Bearbeiten und speichern Sie Ihre .prg-Datei in VFP.
  2. WinFx oder der VFP-Compiler regeneriert die Interop-DLL.
  3. FoxServer erkennt die Anderung in der DLL-Datei (FileSystemWatcher).
  4. Wartet auf den Abschluss aktiver Anfragen (graceful drain).
  5. Gibt COM-Referenzen auf alte Controller frei.
  6. Ladt die neue DLL in eine isolierte AppDomain.
  7. Protokolliert: 'Hot reload complete'.

In JSON aktivieren:

{
  "hotreload": {
    "enabled": true,
    "watchpaths": ["C:\\projects\\myapi\\build"],
    "excludepatterns": ["*.log", "*.tmp"]
  }
}

Server-Metriken

Der /status-Endpunkt (wenn aktiviert) gibt den aktuellen Serverzustand einschliesslich Leistungsmetriken zuruck.

GET /status
{
  "status": "ok",
  "version": "0.7.0",
  "license": "Commercial",
  "uptime": "5d 3h 22m",
  "totalRequests": 182043,
  "successRequests": 181998,
  "errorRequests": 45,
  "avgResponseMs": 12,
  "activeConnections": 7,
  "memoryMB": 245
}

Metriken aus einem Controller abrufen:

PROCEDURE GetStatus(req, res) HELP "GET: status public"
    LOCAL loMetrics, loResp
    loMetrics = THIS.GetServerMetrics()
    loResp = THIS.newObject("status,metrics")
    loResp.status  = "ok"
    loResp.metrics = loMetrics
    res.status(200).json(THIS.ToJson(loResp))
ENDPROC

White Label

Ermoglicht es, zu verbergen, dass der Server mit FoxServer erstellt wurde. Nutzlich, wenn Sie ein Produkt unter Ihrer eigenen Marke vertreiben.

{
  "whitelabel": {
    "serverName": "Acme API Gateway",
    "headerTitle": "Acme Corp",
    "hideVersion": true
  }
}

Windows-Dienstmodus

FoxServer kann als Windows-Dienst installiert werden fur automatischen Start und Hintergrundbetrieb ohne Konsolenfenster.

Befehle:

# Install as service
FoxServer.exe --install-service --name "AcmeAPIServer"

# Uninstall service
FoxServer.exe --uninstall-service --name "AcmeAPIServer"

# Manage via Windows Services
services.msc
Im Dienstmodus werden Protokolle zusatzlich zu den konfigurierten Protokolldateien in der Windows-Ereignisanzeige (Anwendung) geschrieben.

Weiter: API-Referenz →