discovery-media-player 0.1.115 → 0.1.116
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/package.json +1 -1
- package/server/presentations.js +26 -9
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "discovery-media-player",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.116",
|
|
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/presentations.js
CHANGED
|
@@ -6,7 +6,7 @@ const crypto = require("crypto");
|
|
|
6
6
|
// ⚠️ Le contexte est REÇU, pas construit. Ce module ne doit pas savoir d'où il vient : c'est ce
|
|
7
7
|
// qui lui permettra de partir dans le dépôt du player sans emporter le studio avec lui.
|
|
8
8
|
let PLAYER = null;
|
|
9
|
-
function init(ctx) { PLAYER = ctx; _bumpSansDurcissementJusqua = 0; _avertRpcPresence = false;
|
|
9
|
+
function init(ctx) { PLAYER = ctx; _bumpSansDurcissementJusqua = 0; _avertRpcPresence = false; _dernierSuccesDurcissement = 0; _dernierEchecDurcissement = 0; }
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* L'état OBSERVÉ du durcissement des bootstraps — pas sa configuration.
|
|
@@ -23,7 +23,14 @@ function init(ctx) { PLAYER = ctx; _bumpSansDurcissementJusqua = 0; _avertRpcPre
|
|
|
23
23
|
*/
|
|
24
24
|
function etatDurcissementBootstrap() {
|
|
25
25
|
if (Date.now() < _bumpSansDurcissementJusqua) return "degrade";
|
|
26
|
-
|
|
26
|
+
// ⚠️ « actif » EXIGE UN SUCCÈS PLUS RÉCENT QUE LE DERNIER ÉCHEC — pas un simple drapeau. Deux
|
|
27
|
+
// défauts tenaient dans la version précédente (relevés par le second hôte) : (1) le drapeau était
|
|
28
|
+
// posé AVANT l'appel, donc il enregistrait une TENTATIVE et non un succès ; (2) l'expiration du
|
|
29
|
+
// mémo ne rétrogradait pas l'état, elle le PROMOUVAIT — un hôte sans 0018 rendait « degrade »
|
|
30
|
+
// 60 s, puis « actif », sur la foi d'une tentative dont la seule chose prouvée était l'échec.
|
|
31
|
+
// Comparer les deux instants traite les deux d'un coup : le repli d'une preuve périmée est
|
|
32
|
+
// l'IGNORANCE, jamais la confiance.
|
|
33
|
+
return _dernierSuccesDurcissement > _dernierEchecDurcissement ? "actif" : "inconnu";
|
|
27
34
|
}
|
|
28
35
|
|
|
29
36
|
|
|
@@ -829,20 +836,29 @@ function signatureAbsente(erreur) {
|
|
|
829
836
|
// silence. Un « oui » (la signature existe) n'a pas besoin d'expirer : une fonction ne disparaît pas.
|
|
830
837
|
let _bumpSansDurcissementJusqua = 0;
|
|
831
838
|
const MEMO_SANS_DURCISSEMENT_MS = 60 * 1000;
|
|
839
|
+
// ⚠️ DEUX INSTANTS, PAS UN DRAPEAU — parce que l'ORDRE est ce qui distingue « réparé » de « cassé ».
|
|
840
|
+
// Un booléen « on a essayé » ne peut pas dire si le dernier mot fut un succès ou un échec, et c'est
|
|
841
|
+
// exactement le mot qui décide. Un succès plus récent que le dernier échec ⇒ la signature existe
|
|
842
|
+
// (une fonction ne disparaît pas toute seule) ; un échec plus récent, mémo expiré ⇒ on ne sait plus.
|
|
843
|
+
let _dernierSuccesDurcissement = 0;
|
|
844
|
+
let _dernierEchecDurcissement = 0;
|
|
832
845
|
// ⚠️ A-T-ON SEULEMENT ESSAYÉ ? « Pas dégradé » n'est pas « vérifié » : un processus qui vient de
|
|
833
|
-
// démarrer n'a rien tenté, et rendre
|
|
834
|
-
// absence d'observation. Trois états, donc — la même règle que le verdict du schéma, où « rien
|
|
835
|
-
// manquant » se lisait « tout va bien » tant qu'on ne distinguait pas « rien demandé ».
|
|
836
|
-
let _bumpDurcissementTente = false;
|
|
846
|
+
// démarrer n'a rien tenté, et rendre « actif » reviendrait à annoncer une garde active sur la foi
|
|
847
|
+
// d'une absence d'observation. Trois états, donc — la même règle que le verdict du schéma, où « rien
|
|
848
|
+
// de manquant » se lisait « tout va bien » tant qu'on ne distinguait pas « rien demandé ».
|
|
837
849
|
async function appelerBump(corps, durcissementVoulu) {
|
|
838
850
|
const appel = (b) => PLAYER.db.request("rpc/player_attendance_bump", { method: "POST", body: b });
|
|
839
851
|
if (durcissementVoulu && Date.now() < _bumpSansDurcissementJusqua) {
|
|
840
852
|
const { p_only_if_unclaimed: _retire, ...sansDurcissement } = corps;
|
|
841
853
|
return appel(sansDurcissement);
|
|
842
854
|
}
|
|
843
|
-
if (durcissementVoulu) _bumpDurcissementTente = true;
|
|
844
855
|
try {
|
|
845
|
-
|
|
856
|
+
const r = await appel(corps);
|
|
857
|
+
// ⚠️ ON NE MARQUE LE SUCCÈS QU'ICI — l'appel est REVENU, donc la signature à 12 arguments existe.
|
|
858
|
+
// Un rendu `{ok:false, usurpe:true}` compte : seule 0018 sait répondre ça. Ce qui se mesure est
|
|
859
|
+
// le RETOUR, jamais l'intention de partir.
|
|
860
|
+
if (durcissementVoulu) _dernierSuccesDurcissement = Date.now();
|
|
861
|
+
return r;
|
|
846
862
|
} catch (erreur) {
|
|
847
863
|
if (!durcissementVoulu) throw erreur; // rien à retirer : l'échec est réel
|
|
848
864
|
// ⚠️ ON NE SE REPLIE QUE SUR LA PREUVE. Toute autre erreur remonte telle quelle : l'appelant
|
|
@@ -850,7 +866,8 @@ async function appelerBump(corps, durcissementVoulu) {
|
|
|
850
866
|
if (!signatureAbsente(erreur)) throw erreur;
|
|
851
867
|
// La signature à 12 arguments n'existe pas (0018 non appliquée) : on retire l'argument et on
|
|
852
868
|
// réessaie. Le durcissement n'est alors PAS appliqué — et ça se dit, une fois, plus bas.
|
|
853
|
-
|
|
869
|
+
_dernierEchecDurcissement = Date.now();
|
|
870
|
+
_bumpSansDurcissementJusqua = _dernierEchecDurcissement + MEMO_SANS_DURCISSEMENT_MS;
|
|
854
871
|
// ⚠️ CE QUI DISPARAÎT SE DIT. Le durcissement demandé n'est pas appliqué : sous
|
|
855
872
|
// PLAYER_PRESENCE_STRICT, la porte se fermerait sur les battements legacy tout en laissant un
|
|
856
873
|
// bootstrap auto-déclaré s'emparer d'une présence réclamée — c'est-à-dire une fermeture qui
|