discovery-media-player 0.1.42 → 0.1.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/server/handler.js +16 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discovery-media-player",
3
- "version": "0.1.42",
3
+ "version": "0.1.43",
4
4
  "description": "Self-hosted document viewer: per-recipient tracked links, reading analytics, live presentation. The core knows nothing about the application hosting it — everything it borrows arrives through an injected context.",
5
5
  "keywords": [
6
6
  "pdf-viewer",
package/server/handler.js CHANGED
@@ -1385,6 +1385,11 @@ const CLE_INVITE = "dmp-present-me";
1385
1385
  * Une clé absente ou hors forme n'est pas une erreur : elle vaut « inconnu ». Un participant mal
1386
1386
  * compté vaut mieux qu'une audience refusée.
1387
1387
  */
1388
+ /** La clé d'un membre : son adresse, normalisée — la recherche de ligne est exacte. */
1389
+ function lcMembre(email) {
1390
+ return String(email || "").trim().toLowerCase();
1391
+ }
1392
+
1388
1393
  function cleAnonyme(brut) {
1389
1394
  const v = String(brut == null ? "" : brut).trim().slice(0, 120);
1390
1395
  return /^anon-[A-Za-z0-9_-]{4,}$/.test(v) ? v : "anon-inconnu";
@@ -2871,7 +2876,17 @@ async function handler(req, res) {
2871
2876
  // lui, ne peut rien prouver : sa clé reste la sienne, mais enfermée dans un espace de noms
2872
2877
  // dont elle ne peut pas sortir — elle ne pourra jamais ressembler à l'e-mail d'un membre.
2873
2878
  const r = await recordAttendance(String(body.slug || ""), {
2874
- key: profil ? profil.email : cleAnonyme(body.key),
2879
+ // ⚠️ MINUSCULÉE, ET CE DÉTAIL EST UNE LIGNE DE PRÉSENCE. La clé cliente que 0.1.42 a
2880
+ // remplacée l'était (`me.email.toLowerCase()`) ; la clé dérivée ne l'était pas, et la
2881
+ // ligne se retrouve par `attendee_key=eq.` — une correspondance EXACTE. Un hôte dont
2882
+ // l'identité rend l'adresse telle qu'elle a été saisie aurait donc vu, pour un même
2883
+ // membre, une SECONDE ligne apparaître : temps cumulé reparti de zéro, et le collègue
2884
+ // affiché deux fois dans la liste des participants.
2885
+ //
2886
+ // Sans effet là où les adresses sont déjà normalisées — c'est le cas des deux hôtes
2887
+ // actuels, et c'est pour ça que rien ne l'aurait signalé. Un contrat ouvert ne se
2888
+ // repose pas sur ce que ses deux premiers hôtes font.
2889
+ key: profil ? lcMembre(profil.email) : cleAnonyme(body.key),
2875
2890
  name: (profil && profil.name) || body.name,
2876
2891
  email: profil ? profil.email : body.email,
2877
2892
  avatar: (profil && profil.avatar) || body.avatar,