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.
- package/docs/HOST-CONTRACT.md +16 -2
- package/package.json +1 -1
- package/server/schema.js +42 -11
package/docs/HOST-CONTRACT.md
CHANGED
|
@@ -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": ["
|
|
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": "
|
|
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.
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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
|
-
|
|
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 */ }
|