Ajouter @lightweight-sdk/service-discovery (packages/server) #3

Open
kyuno wants to merge 1 commit from feat/service-discovery-package into feat/service-registry-package
Owner

Résumé

⚠️ Empilée sur #2 (feat/service-registry-package), pas encore mergée — base à retargeter vers main une fois #2 mergée (cohérent avec "PR successives, pas en parallèle" du CLAUDE.md).

Nouveau package @lightweight-sdk/service-discovery (packages/server/) : agrégateur d'API reverse-proxy avec enregistrement et découverte de services au runtime. Deux points d'entrée séparés partageant un même protocole :

  • ./client (DiscoveryClient) — enregistre un service et maintient un heartbeat périodique (qui sert aussi de mécanisme de retry : un échec est journalisé et laissé au tick suivant). stop() est best-effort et ne rejette jamais.
  • ./aggregator (ServiceAggregator) — handlers Node natifs à monter dans Express/Fastify/node:http brut (les trois documentés dans le README), zéro dépendance framework. Routage par préfixe de nom de service, TTL avec balayage périodique, secret partagé comparé en temps constant, proxy HTTP fait main (streaming, filtrage hop-by-hop, distinction 502/504).

Limites documentées dans le README plutôt que corrigées : pas de matching :param (v1, match exact), pas de secret par service, risque SSRF-like assumé vu le threat model homelab (un service compromis pourrait déclarer un baseUrl arbitraire).

Détails techniques notables

  • Résolution des sous-chemins (./client, ./aggregator) via des stubs package.json (le repo cible moduleResolution: Node10, pas de champ exports moderne) — pattern documenté dans spec/architecture.md pour de futurs packages server/ multi-points d'entrée.
  • Bug trouvé et corrigé en cours de route : req.on('close') se déclenche dès que le corps de la requête entrante est lu (immédiat pour un GET sans body), pas à la déconnexion réelle du client — ça détruisait ma propre requête sortante juste après l'avoir envoyée, causant un ECONNRESET systématique. Le bon signal est res.on('close').
  • Correction connexe : create-package.mjs insérait la nouvelle ligne du tableau de spec/packages.md en fin de fichier au lieu de l'insérer dans le tableau — corrigé pour les deux packages précédents au passage.

Vérifié localement

pnpm lint, pnpm build, pnpm test (66/66), pnpm docs:check (3 points d'entrée validés), pnpm install --frozen-lockfile tous verts. Résolution runtime des sous-chemins ./client/./aggregator vérifiée manuellement (require() direct).

🤖 Generated with Claude Code

## Résumé ⚠️ Empilée sur [#2](https://git.dev.kyuno.fr/kyuno/lightweight-sdk/pulls/2) (`feat/service-registry-package`), pas encore mergée — base à retargeter vers `main` une fois #2 mergée (cohérent avec "PR successives, pas en parallèle" du CLAUDE.md). Nouveau package `@lightweight-sdk/service-discovery` (`packages/server/`) : agrégateur d'API reverse-proxy avec enregistrement et découverte de services au runtime. Deux points d'entrée séparés partageant un même protocole : - **`./client`** (`DiscoveryClient`) — enregistre un service et maintient un heartbeat périodique (qui sert aussi de mécanisme de retry : un échec est journalisé et laissé au tick suivant). `stop()` est best-effort et ne rejette jamais. - **`./aggregator`** (`ServiceAggregator`) — handlers Node natifs à monter dans Express/Fastify/`node:http` brut (les trois documentés dans le README), **zéro dépendance framework**. Routage par préfixe de nom de service, TTL avec balayage périodique, secret partagé comparé en temps constant, proxy HTTP fait main (streaming, filtrage hop-by-hop, distinction 502/504). Limites documentées dans le README plutôt que corrigées : pas de matching `:param` (v1, match exact), pas de secret par service, risque SSRF-like assumé vu le threat model homelab (un service compromis pourrait déclarer un `baseUrl` arbitraire). ## Détails techniques notables - Résolution des sous-chemins (`./client`, `./aggregator`) via des stubs `package.json` (le repo cible `moduleResolution: Node10`, pas de champ `exports` moderne) — pattern documenté dans `spec/architecture.md` pour de futurs packages `server/` multi-points d'entrée. - **Bug trouvé et corrigé en cours de route** : `req.on('close')` se déclenche dès que le corps de la requête *entrante* est lu (immédiat pour un GET sans body), pas à la déconnexion réelle du client — ça détruisait ma propre requête sortante juste après l'avoir envoyée, causant un `ECONNRESET` systématique. Le bon signal est `res.on('close')`. - Correction connexe : `create-package.mjs` insérait la nouvelle ligne du tableau de `spec/packages.md` en fin de fichier au lieu de l'insérer dans le tableau — corrigé pour les deux packages précédents au passage. ## Vérifié localement `pnpm lint`, `pnpm build`, `pnpm test` (66/66), `pnpm docs:check` (3 points d'entrée validés), `pnpm install --frozen-lockfile` tous verts. Résolution runtime des sous-chemins `./client`/`./aggregator` vérifiée manuellement (`require()` direct). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-18 19:01:59 +02:00
Agregateur d'API reverse-proxy avec enregistrement et decouverte de
services au runtime, deux points d'entree separes partageant un meme
protocole :

- ./client (DiscoveryClient) : enregistre un service et maintient un
  heartbeat periodique (qui sert aussi de mecanisme de retry - un echec
  est journalise et laisse au tick suivant, pas de logique separee).
  stop() est best-effort et ne rejette jamais.
- ./aggregator (ServiceAggregator) : handlers Node natifs a monter dans
  Express/Fastify/http brut (exemples des trois dans le README), zero
  dependance framework. Routage par prefixe de nom de service, TTL avec
  balayage periodique, secret partage compare en temps constant, proxy
  HTTP fait main (node:http/https, streaming, filtrage hop-by-hop,
  distinction 502/504).

Limites documentees dans le README plutot que corrigees : pas de
matching :param (v1, match exact), pas de secret par service, risque
SSRF-like assume vu le threat model homelab.

Resolution des sous-chemins via des stubs package.json (client/,
aggregator/) puisque le repo cible moduleResolution: Node10, pas de
champ exports moderne - pattern documente dans spec/architecture.md
pour de futurs packages server/ multi-points d'entree.

Bug trouve et corrige en cours de route : req.on('close') se declenche
des que le corps de la requete entrante est lu (immediat pour un GET
sans body), pas a la deconnexion reelle du client - detruisait ma
propre requete sortante juste apres l'avoir envoyee. Le bon signal est
res.on('close').

Correction connexe : create-package.mjs inserait la nouvelle ligne en
fin de fichier de spec/packages.md au lieu de l'inserer dans le
tableau - corrige pour les deux packages precedents au passage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/service-discovery-package:feat/service-discovery-package
git checkout feat/service-discovery-package

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git checkout feat/service-registry-package
git merge --no-ff feat/service-discovery-package
git checkout feat/service-discovery-package
git rebase feat/service-registry-package
git checkout feat/service-registry-package
git merge --ff-only feat/service-discovery-package
git checkout feat/service-discovery-package
git rebase feat/service-registry-package
git checkout feat/service-registry-package
git merge --no-ff feat/service-discovery-package
git checkout feat/service-registry-package
git merge --squash feat/service-discovery-package
git checkout feat/service-registry-package
git merge --ff-only feat/service-discovery-package
git checkout feat/service-registry-package
git merge feat/service-discovery-package
git push origin feat/service-registry-package
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/lightweight-sdk#3
No description provided.