@zevra/support
v0.2.0
Published
Client serveur et relais /api/support de Zevra Support.
Readme
@zevra/support — le client SERVEUR de Zevra Support
Client typé de l'API v1 (PLAN.md §4), sans aucune dépendance, et le
relais /api/support/* que le navigateur appelle à sa place.
La clé
sk_support_…ne va jamais dans un navigateur.creerClientSupport()jette siwindowetdocumentexistent. Ce n'est pas une précaution : la clé authentifie l'app entière, elle est lisible en clair dans un bundle, et le chemin qui l'y amène ne commence jamais par une mauvaise intention (voirsrc/garde-serveur.ts, qui le raconte en entier).
Le guide d'intégration complet — installation, exemple de bout en bout, pièges
— vit dans docs/integration.md du dépôt et sur
https://support.zevra.tech/integration.
En trente secondes
// app/api/support/[...chemin]/route.ts — le relais, côté serveur
import { creerRoutesSupport } from '@zevra/support'
export const { GET, POST } = creerRoutesSupport({
identifier: async (requete) => {
const session = await maSession(requete)
return session ? { email: session.email, idExterne: session.id } : null
},
})// n'importe où au serveur
import { creerClientSupport } from '@zevra/support'
const client = creerClientSupport() // lit SUPPORT_URL / SUPPORT_API_KEY / SUPPORT_APP
await client.creerDemande({ type: 'bug', titre, description, requerant: { email } })Ce qu'il y a dedans
| Module | Rôle | Pur ? |
|---|---|---|
| garde-serveur.ts | refuse le chargement dans un navigateur | la décision l'est |
| configuration.ts | ce qui manque, et comment le dire | oui |
| requete.ts | URL, en-têtes, corps, borne des 256 Ko | oui |
| reessai.ts | 429 / 5xx, Retry-After, budget de temps | oui |
| erreurs.ts | la liste FERMÉE des codes | oui |
| client.ts | la boucle d'appel | non (réseau) |
| relais/chemins.ts | la liste blanche des six routes | oui |
| relais/corps.ts | l'identité imposée, les champs acceptés | oui |
| relais/routes.ts | les gestionnaires Next | non |
Tests
Le paquet a sa propre chaîne — la configuration vitest de la racine ne ramasse que les tests de l'app. Depuis la racine du dépôt :
npx vitest run --config packages/sdk/vitest.config.tsCe qui est couvert : la clé dans X-Support-Key et jamais dans
Authorization, la borne de corps comptée en octets UTF-8, le Retry-After
illisible qui rend null et non 0, l'attente qui ne tient pas dans le budget,
la liste blanche face à /admin/apps et aux segments de remontée, l'identité du
corps reçu qui est ignorée, le fil d'autrui qui rend 404, url_portail retiré,
et Cache-Control: no-store sur toutes les réponses.
