discovery-media-player 0.1.143 → 0.1.145

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.
@@ -139,7 +139,7 @@ say what it knows:
139
139
  "schema": {
140
140
  "couvre": "colonnes-conditionnelles",
141
141
  "attendues": 10, "sondees": 10, "verdict": "complet", "manquant": [],
142
- "connues": ["supabase/migrations/0001-destinataire-atteste.sql", "…", "supabase/migrations/0024-rotation-en-direct.sql"]
142
+ "connues": ["0001-destinataire-atteste.sql", "…", "0024-rotation-en-direct.sql"]
143
143
  }
144
144
  ```
145
145
 
@@ -312,10 +312,24 @@ Each `manquant` entry has **exactly this shape** — pin your parser to it, not
312
312
  probe "should" return:
313
313
 
314
314
  ```json
315
- { "migration": "supabase/migrations/0006-reactions-ordonnees.sql",
315
+ { "migration": "0006-reactions-ordonnees.sql",
316
316
  "fonction": "empêcher deux réactions simultanées de s'écraser" }
317
317
  ```
318
318
 
319
+ ⚠️ **`migration` is a FILE NAME, not a path — it lives in `supabase/migrations/` in this
320
+ repository.** It used to carry that prefix. A host's own guard refuses any identity card containing
321
+ `supabase|secret|key|token` — a deliberately coarse text sweep, protecting a public response against
322
+ leaking a project URL, a key or a token — and the prefix made it fire on every migration named. The
323
+ prefix is gone from what the card publishes; the directory is stated here, once, and the operator
324
+ log still prints the full path because that message is for the person reading it, not for a sweep.
325
+
326
+ ⚠️ **You do not need an exception in such a guard, and you should not add one.** Nothing this card
327
+ publishes matches that pattern, and a bench renders the real card and sweeps it — keys included —
328
+ on every change. If you carry an exception for the old prefix, remove it: an exception whose subject
329
+ can no longer appear is a pre-authorised widening nobody watches. A second bench sweeps the
330
+ migration directory itself, so a future file named `0031-refresh-token-rotation.sql` is refused
331
+ here, when it is written, rather than months later at your end.
332
+
319
333
  ⚠️ This shape went **undocumented** for two releases, and the second host typed it from memory as
320
334
  `{table, colonne, migration}` — their monitoring filter then discarded every real entry and would
321
335
  have shown an empty table on a database that was actually missing something. **No mutation on
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discovery-media-player",
3
- "version": "0.1.143",
3
+ "version": "0.1.145",
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/schema.js CHANGED
@@ -28,40 +28,66 @@
28
28
  * colonne — il n'existe plus qu'un endroit où se tromper. Une étape de la forge vérifie en outre
29
29
  * que chaque fichier nommé ici existe, et qu'aucun appel ne contourne cette table.
30
30
  */
31
+ // ⚠️ UN NOM DE FICHIER, PAS UN CHEMIN — ET C'EST UNE GARDE DE SÉCURITÉ D'HÔTE QUI L'IMPOSE.
32
+ //
33
+ // Ces valeurs sont PUBLIÉES dans la carte d'identité (`manquant`, `connues`). Une garde de l'hôte
34
+ // refuse toute carte contenant `supabase|secret|key|token` : un préfixe `supabase/migrations/` la
35
+ // faisait tirer sur chaque migration nommée. Faux positif — ce sont nos chemins, identiques chez
36
+ // tous les hôtes, sans URL ni identifiant de projet — mais le commentaire de `presenceJetons` pose
37
+ // déjà la doctrine, et elle vaut ici : LE BON GESTE EST DE CHANGER CE QU'ON ÉMET, JAMAIS DE
38
+ // DESSERRER LA GARDE. Desserrer est ce qui vide une garde, et à ce compte-là chaque hôte devrait
39
+ // tailler la sienne.
40
+ //
41
+ // ⚠️ Relevé par la session STUDIO le 30/08, et voici ce qui rend le cas instructif : `manquant`
42
+ // portait ces chemins depuis toujours, mais restait `[]` chez eux — la garde était donc VERTE depuis
43
+ // des mois dans une configuration où son sujet ne pouvait pas apparaître. Il a fallu `connues`, qui
44
+ // les liste SANS CONDITION, pour la réveiller.
45
+ //
46
+ // Le répertoire ne se perd pas : il est écrit une fois dans `RACINE_MIGRATIONS` ci-dessous et dit
47
+ // par `docs/HOST-CONTRACT.md`. Ce qui disparaît de la carte, c'est le mot qui déclenchait le refus.
48
+ //
49
+ // ⚠️ ET LE NOM DE FICHIER RESTE UNE VALEUR QUE NOUS CHOISISSONS. Retirer le préfixe règle la
50
+ // collision d'aujourd'hui, pas la classe : `0031-refresh-token-rotation.sql` la rouvrirait des mois
51
+ // plus tard, chez tous les hôtes à la fois. C'est `nomsDeMigrationPublicables.test.js` qui ferme ça
52
+ // — il balaie le dossier et refuse un nom qui déclencherait la garde, au moment où on l'écrit.
53
+ // (La forme de la règle vient du STUDIO : une règle tenue par habitude a un taux de couverture que
54
+ // personne ne mesure.)
55
+ const RACINE_MIGRATIONS = "supabase/migrations/";
56
+
31
57
  const ATTENDUES = {
32
58
  destinataireAtteste: {
33
59
  table: "commercial_doc_shares", colonne: "attested_recipient_email",
34
- migration: "supabase/migrations/0001-destinataire-atteste.sql",
60
+ migration: "0001-destinataire-atteste.sql",
35
61
  fonction: "attribuer une lecture au destinataire attesté par l'hôte",
36
62
  },
37
63
  rangEcriture: {
38
64
  table: "doc_presentations", colonne: "write_seq",
39
- migration: "supabase/migrations/0002-ordre-des-ecritures.sql",
65
+ migration: "0002-ordre-des-ecritures.sql",
40
66
  fonction: "refuser une écriture de pilotage doublée en vol",
41
67
  },
42
68
  rotationDirecte: {
43
69
  table: "doc_presentations", colonne: "view_rotation",
44
- migration: "supabase/migrations/0024-rotation-en-direct.sql",
70
+ migration: "0024-rotation-en-direct.sql",
45
71
  fonction: "faire suivre à l'audience l'orientation que le présentateur donne au document",
46
72
  },
47
73
  envoiUnique: {
48
74
  table: "doc_presentation_messages", colonne: "client_key",
49
- migration: "supabase/migrations/0005-envoi-unique.sql",
75
+ migration: "0005-envoi-unique.sql",
50
76
  fonction: "empêcher qu'un renvoi crée un second message",
51
77
  },
52
78
  liensUniques: {
53
79
  table: "commercial_doc_shares", colonne: "idem_key",
54
- migration: "supabase/migrations/0011-liens-uniques.sql",
80
+ migration: "0011-liens-uniques.sql",
55
81
  fonction: "empêcher deux demandes simultanées de créer deux liens système pour le même usage",
56
82
  },
57
83
  revocationDatee: {
58
84
  table: "commercial_doc_shares", colonne: "revoked_at",
59
- migration: "supabase/migrations/0013-revocation-datee.sql",
85
+ migration: "0013-revocation-datee.sql",
60
86
  fonction: "dater la révocation pour borner la rétention des liens révoqués",
61
87
  },
62
88
  reactionsOrdonnees: {
63
89
  table: "doc_presentation_messages", colonne: "reactions_seq",
64
- migration: "supabase/migrations/0006-reactions-ordonnees.sql",
90
+ migration: "0006-reactions-ordonnees.sql",
65
91
  fonction: "empêcher deux réactions simultanées de s'écraser",
66
92
  },
67
93
  // ⚠️ ENTRÉE DE REPORT, PAS DE GATE D'ÉCRITURE. Les six ci-dessus sont sondées par les chemins
@@ -73,7 +99,7 @@ const ATTENDUES = {
73
99
  // cette entrée, la carte annonçait « complet » à un hôte sans la 0015, présence dégradée (relevé ADV).
74
100
  presenceAtomique: {
75
101
  table: "doc_presentation_attendees", colonne: "creator_ip_hash",
76
- migration: "supabase/migrations/0015-presence-atomique.sql",
102
+ migration: "0015-presence-atomique.sql",
77
103
  fonction: "écrire la présence atomiquement et plafonner la création de faux participants anonymes",
78
104
  },
79
105
  // Chat différentiel : la colonne `mod_seq` (bumpée par trigger) est ce que le code sonde AVANT de
@@ -81,7 +107,7 @@ const ATTENDUES = {
81
107
  // colonne EST le vrai signal de dégradation (le code la sonde), pas seulement un témoin — cas franc.
82
108
  chatDifferentiel: {
83
109
  table: "doc_presentation_messages", colonne: "mod_seq",
84
- migration: "supabase/migrations/0016-chat-differentiel.sql",
110
+ migration: "0016-chat-differentiel.sql",
85
111
  fonction: "relire le chat en différentiel (mod_seq > curseur) au lieu des 300 derniers à chaque signal",
86
112
  },
87
113
  // Jeton de présence (P1c étape 2). `last_token_at` est sondée AVANT d'écrire les colonnes de
@@ -90,7 +116,7 @@ const ATTENDUES = {
90
116
  // n'écrit pas les colonnes et le compteur n'apparaît pas ; la présence continue de fonctionner.
91
117
  jetonPresence: {
92
118
  table: "doc_presentation_attendees", colonne: "last_token_at",
93
- migration: "supabase/migrations/0017-jeton-presence.sql",
119
+ migration: "0017-jeton-presence.sql",
94
120
  fonction: "mesurer la transition du jeton de présence (avecJeton / sansJeton) pour savoir quand fermer",
95
121
  },
96
122
  };
@@ -651,7 +677,12 @@ function noter(cle, present, migration) {
651
677
  * les deux se compte en heures.
652
678
  */
653
679
  function signaler(cle, migration) {
654
- const quoi = migration ? `Appliquez ${migration}.` : "Une migration est en attente.";
680
+ // ⚠️ LE JOURNAL GARDE LE CHEMIN COMPLET, LA CARTE NON — et c'est la même décision vue des deux
681
+ // côtés. Ce message s'adresse à l'exploitant de CETTE instance, dans SA sortie : il doit être
682
+ // copiable tel quel. La garde d'hôte qui a imposé de retirer le préfixe balaie la CARTE, une
683
+ // réponse HTTP publique ; elle ne lit pas les journaux. Retirer le répertoire ici n'aurait rendu
684
+ // service à personne et aurait coûté une recherche à celui qui lit la ligne.
685
+ const quoi = migration ? `Appliquez ${RACINE_MIGRATIONS}${migration}.` : "Une migration est en attente.";
655
686
  try {
656
687
  console.warn(`[player] la colonne « ${cle} » manque : la fonction qui en dépend reste inactive. ${quoi}`);
657
688
  } catch { /* sans console */ }