* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
14 KiB
Webhooks (Norsk)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Sannhetskilde:
src/lib/webhookDispatcher.ts,src/lib/db/webhooks.ts,src/app/api/webhooks/Sist oppdatert: 2026-06-28 — v3.8.40
OmniRoute kan utløse HTTP-webhooks ved plattformhendelser. Bruk dem til å integrere med Slack, PagerDuty, Datadog, interne varslingstjenester eller en hvilken som helst HTTP-mottaker.
Dispatcher-komponenten signerer hver levering med HMAC-SHA256, prøver på nytt ved midlertidige feil, sporer leveringsstatusen for hver webhook og deaktiverer automatisk endepunkter som fortsetter å feile.
Støttede hendelser
Typen WebhookEvent (src/lib/webhooks/eventDescriptions.ts, brukt av src/lib/webhookDispatcher.ts) modellerer for øyeblikket nøyaktig fire hendelser:
| Hendelse | Utløses når |
|---|---|
request.completed |
En videresendt forespørsel fullføres uten feil |
request.failed |
En videresendt forespørsel mislykkes etter alle nye forsøk/reserveløsninger |
quota.exceeded |
En API-nøkkel overskrider en budsjett-/kvoteterskel |
test.ping |
Syntetisk hendelse som brukes av testendepunktet |
Abonnementer godtar den bokstavelige verdien "*" for å motta alle hendelser. Ukjente
hendelsesnavn i events ignoreres ved utsendelse.
Merk: Dispatcher-API-et er koblet opp, men produksjonskallestedene for noen av hendelsene som ikke er
test.ping, er fortsatt under innføring. Sjekkgrep dispatchEventfor å se hvilke kodebaner som for øyeblikket kaller dispatcher-komponenten i din utgivelse.
Arkitektur
Kallende part (håndterer, tjeneste, overvåker)
dispatchEvent(event, data) [src/lib/webhookDispatcher.ts]
-> getEnabledWebhooks() [src/lib/db/webhooks.ts]
-> filtrer etter webhook.events
-> for hvert treff (parallelt):
deliverWebhook(url, payload, secret)
bygg nyttelast { event, timestamp, data }
signer brødteksten med HMAC-SHA256 (hvis en hemmelighet finnes)
POST med 10 s tidsavbrudd
prøv på nytt opptil 3 ganger ved 5xx-feil / nettverksfeil
recordWebhookDelivery(id, status, success)
-> disableWebhooksWithHighFailures(10)
Utsendelsen skjer asynkront uten at den kallende parten venter på resultatet: Promise.allSettled absorberer
feil per webhook, slik at én defekt mottaker ikke kan blokkere de andre.
HMAC-signering
Når en webhook har en secret, signerer OmniRoute JSON-brødteksten og sender:
Content-Type: application/json
User-Agent: OmniRoute-Webhook/1.0
X-Webhook-Event: <hendelse>
X-Webhook-Timestamp: <ISO-8601>
X-Webhook-Signature: sha256=<heksadesimal HMAC-SHA256(secret, brødtekst)>
Topptekstnavn bruker prefikset
X-Webhook-*(ikkeX-OmniRoute-*). Signaturverdien ersha256=<hex>— verifiser hele prefikset.
Hvis createWebhook kalles uten en hemmelighet, genererer databasemodulen en
(whsec_<48 hex>), slik at alle webhooks signeres som standard.
Verifisering hos mottakeren
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(rawBody: string, signature: string, secret: string) {
const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
const a = Buffer.from(expected);
const b = Buffer.from(signature);
return a.length === b.length && timingSafeEqual(a, b);
}
Verifiser alltid mot den rå forespørselsbrødteksten før JSON-parsing.
Retningslinjer for nye forsøk og feil
deliverWebhook(url, payload, secret, maxRetries = 3):
- Tidsavbrudd på 10 sekunder per forsøk (
AbortController). - HTTP 2xx regnes som vellykket.
- HTTP 3xx/4xx regnes som en endelig status uten nye forsøk — registrert som levert
med
success = res.ok. - HTTP 5xx og nettverksfeil prøves på nytt med eksponentiell ventetid:
2^attempt * 1000 ms(1s, 2s, 4s). - Etter
maxRetriesregistreres leveringen som mislykket. - Hver levering oppdaterer
last_triggered_at,last_statusog enten nullstiller eller økerfailure_count. - Dispatcher-funksjonen kaller
disableWebhooksWithHighFailures(10)etter hver fan-out, slik at alle webhooks medfailure_count >= 10deaktiveres automatisk.
Database
Tabellen webhooks (migrering 011_webhooks.sql):
| Kolonne | Type | Merknader |
|---|---|---|
id |
TEXT PK | UUID |
url |
TEXT | Destinasjons-URL |
events |
TEXT | JSON-array; standardverdi ["*"] |
secret |
TEXT | HMAC-hemmelighet (autogenerert hvis utelatt) |
enabled |
INT | 0/1; standardverdi er 1 |
description |
TEXT | Valgfri lesbar etikett |
created_at |
TEXT | datetime('now') |
last_triggered_at |
TEXT | Oppdateres ved hvert leveringsforsøk |
last_status |
INT | HTTP-status for siste forsøk (0 = nettverk) |
failure_count |
INT | Nullstilles ved suksess, +1 ved feil |
Leveringshistorikken lagres i den dedikerte tabellen webhook_deliveries
(migrering 069_webhook_deliveries.sql, skrevet via
src/lib/db/webhookDeliveries.ts::insertDelivery ved hvert forsøk), i tillegg
til de aggregerte tellerne i webhooks-raden. Metadata om type (Slack / Discord /
Telegram / egendefinerte payload-transformatorer) ble lagt til av 070_webhooks_kind_metadata.sql.
REST-API
Alle endepunkter krever administrasjonsautentisering (requireManagementAuth).
| Endepunkt | Metode | Beskrivelse |
|---|---|---|
/api/webhooks |
GET | Vis webhooks (hemmeligheter maskert) |
/api/webhooks |
POST | Opprett webhook |
/api/webhooks/[id] |
GET | Webhook-detaljer (full hemmelighet) |
/api/webhooks/[id] |
PUT | Oppdater felter |
/api/webhooks/[id] |
DELETE | Fjern |
/api/webhooks/[id]/test |
POST | Utløs en test.ping (ingen nye forsøk) |
/api/webhooks/[id]/deliveries |
GET | Nylige leveringsforsøk for én webhook |
/api/webhooks/validate-url |
POST | Forhåndsvalidering av URL (SSRF-beskyttelse) |
GET /api/webhooks maskerer hemmeligheten som <første 10 tegn>... for å unngå lekkasje
på listesider. Bruk GET-forespørselen for [id] når du faktisk trenger hemmeligheten.
Opprett webhook
curl -X POST http://localhost:20128/api/webhooks \
-H "Cookie: auth_token=..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.slack.com/services/...",
"secret": "whsec_my_shared_secret",
"events": ["quota.exceeded", "request.failed"],
"description": "Slack alerts"
}'
Hvis secret utelates, genererer serveren en whsec_<hex>-hemmelighet og returnerer
den i responsen.
Test webhook
curl -X POST http://localhost:20128/api/webhooks/<id>/test \
-H "Cookie: auth_token=..."
Returnerer { delivered, status, error }. Ingen nye forsøk utføres — nyttig for
raskt å kontrollere at mottakeren godtar payloaden og signaturen.
Kontrollpanel
Kontrollpanelsiden på /dashboard/webhooks (se
src/app/(dashboard)/dashboard/webhooks/page.tsx) tilbyr:
- Oppretting/redigering av webhooks med en hendelsesvelger
- Statusindikator (aktiv / inaktiv / feil) basert på
enabled,failure_countoglast_status - Testlevering med ett klikk
- Manuell aktivering/deaktivering
Eksempler på nyttelast
request.completed
{
"event": "request.completed",
"timestamp": "2026-05-13T20:30:00.123Z",
"data": {
"trace_id": "...",
"api_key_id": "...",
"provider": "openai",
"model": "gpt-5",
"status": 200,
"tokens_in": 142,
"tokens_out": 350,
"cost_usd": 0.0042
}
}
test.ping
{
"event": "test.ping",
"timestamp": "2026-05-13T20:32:00.000Z",
"data": {
"message": "Testlevering av webhook fra OmniRoute",
"webhookId": "<uuid>"
}
}
Feltstrukturene for andre hendelser enn test.ping defineres av kallestedene som sender
dem. Behandle data-objektet som foroverkompatibelt (legg til felt, ikke vær avhengig av
at felt mangler).
Anbefalte fremgangsmåter
- Verifiser signaturen ved hver levering mot den ubehandlede forespørselskroppen — dette hindrer forfalskede POST-forespørsler fra hvem som helst som gjetter webhook-URL-en din.
- Svar med 2xx innen ~5 sekunder — dispatcheren får tidsavbrudd etter 10 s. Trege
mottakere vil bruke opp nye forsøk og øke
failure_count. - Gjør behandlerne idempotente — nye forsøk og leveringssemantikk med minst én levering betyr at duplikater kan forekomme.
- Abonner minimalt — oppgi bare hendelsene du faktisk bruker.
"*"vil påføre mottakere du ikke kontrollerer ekstra kostnader. - Overvåk
failure_count— endepunkter deaktiveres automatisk etter 10 påfølgende feil. Tilbakestill ved å kallePUT /api/webhooks/[id]medenabled: trueetter at mottakeren er rettet. - Roter hemmeligheter regelmessig — bruk
PUTfor å angi en nysecret, distribuer den nye verdien til mottakeren, og bekreft via testendepunktet.
Se også
- API_REFERENCE.md — fullstendig administrasjons-API
- RESILIENCE_GUIDE.md — semantikk for effektbryter / nedkjøling
ved leverandørfeil som eksponeres via
request.failed - Kilde:
src/lib/webhookDispatcher.ts,src/lib/db/webhooks.ts