event-sourcing : durcir le parsing des stream ids (garde de préfixe partagée) #43

Open
opened 2026-07-04 12:11:36 +00:00 by momsse · 0 comments
Owner

Migré depuis viziertronic/octant#95 — ouvert le 2026-06-26 par @momsse.

Les helpers xIdFromStreamId font streamId.slice(PREFIX.length) sans vérifier que le streamId commence bien par le préfixe attendu. Pattern présent dans tout le repo (authentication, authorization, banking, documents, reconciliation).

Risque (relevé par les reviews locales/distantes successives) : un streamId mal routé est silencieusement réinterprété en un id valide-mais-faux au lieu d'échouer. Aggravé dans @octant/reconciliationMatchCandidate: et Reconciliation: font tous deux 15 caractères → un id de l'un peut être interprété comme l'autre.

En pratique le streamId est toujours construit en interne par streamIdOf, donc non déclenchable aujourd'hui — d'où le report. Mais à durcir de façon transverse plutôt que package par package.

Proposition

  • Helper partagé dans @octant/event-sourcing, p.ex. parseBrandedStreamId(prefix, streamId, brand) qui vérifie startsWith et renvoie une erreur typée / Option au lieu de slicer aveuglément.
  • Migrer les 6+ fichiers *.ids.ts existants vers ce helper.

Découvert pendant #31 / #34 / #37 (reviews). Décliné dans ces PRs pour rester cohérent ; à traiter ici globalement.

> _Migré depuis [viziertronic/octant#95](https://github.com/viziertronic/octant/issues/95) — ouvert le 2026-06-26 par @momsse._ Les helpers `xIdFromStreamId` font `streamId.slice(PREFIX.length)` **sans** vérifier que le `streamId` commence bien par le préfixe attendu. Pattern présent dans tout le repo (authentication, authorization, banking, documents, reconciliation). Risque (relevé par les reviews locales/distantes successives) : un `streamId` mal routé est silencieusement réinterprété en un id valide-mais-faux au lieu d'échouer. Aggravé dans `@octant/reconciliation` où `MatchCandidate:` et `Reconciliation:` font tous deux 15 caractères → un id de l'un peut être interprété comme l'autre. En pratique le `streamId` est toujours construit en interne par `streamIdOf`, donc non déclenchable aujourd'hui — d'où le report. Mais à durcir de façon **transverse** plutôt que package par package. ## Proposition - Helper partagé dans `@octant/event-sourcing`, p.ex. `parseBrandedStreamId(prefix, streamId, brand)` qui vérifie `startsWith` et renvoie une erreur typée / `Option` au lieu de slicer aveuglément. - Migrer les 6+ fichiers `*.ids.ts` existants vers ce helper. Découvert pendant #31 / #34 / #37 (reviews). Décliné dans ces PRs pour rester cohérent ; à traiter ici globalement.
Sign in to join this conversation.
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
momsse/octant#43
No description provided.