discovery-media-player 0.1.108 → 0.1.110

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discovery-media-player",
3
- "version": "0.1.108",
3
+ "version": "0.1.110",
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",
@@ -1134,4 +1134,4 @@ async function listPresentationsForDoc(docId, email, isAdmin, autoriseLarge) {
1134
1134
  module.exports = {
1135
1135
  reacteurDepuisJeton,
1136
1136
  purgerPerimees,
1137
- messagePublic, CHAMPS_PUBLICS, cheminPieceJointe, init, createPresentation, getPresentation, setPage, endPresentation, addMessage, listMessages, toggleReaction, editMessage, deleteMessage, setChatLock, createUploadUrl, reclaimPresentation, touchPresentation, listActivePresentations, handoverPresentation, endPresentationByOwner, recordAttendance, presentationStats, listPresentationsForDoc, switchPresentationDoc, setPresentationContent };
1137
+ messagePublic, CHAMPS_PUBLICS, cheminPieceJointe, init, createPresentation, getPresentation, setPage, endPresentation, addMessage, listMessages, toggleReaction, editMessage, deleteMessage, setChatLock, createUploadUrl, reclaimPresentation, touchPresentation, listActivePresentations, handoverPresentation, endPresentationByOwner, recordAttendance, presentationStats, listPresentationsForDoc, switchPresentationDoc, setPresentationContent , STALE_MS};
package/server/schema.js CHANGED
@@ -403,7 +403,20 @@ async function ajouterPresence(etat) {
403
403
  // lecteur, dans six mois, c'est nous. On adjoint donc le nombre qui désambiguïse, comme
404
404
  // `dontScellees` l'a fait pour `sansRang` : 0 actives + 0 avecJeton = repos ; N actives + 0
405
405
  // avecJeton = ANOMALIE. (Précision du second hôte.)
406
- const actives = await PLAYER.db.request(`doc_presentations?active=eq.true&select=slug${bornee}`);
406
+ // ⚠️ « ACTIVE » N'EST PAS « VIVANTE », ET LE DÉNOMINATEUR A BESOIN DE LA SECONDE. Une présentation
407
+ // dont le présentateur a fermé l'onglet sans clôturer reste `active = true` : la compter ferait
408
+ // annoncer « N actives et 0 avecJeton = ANOMALIE » alors que personne n'est parti nulle part. La
409
+ // fiabilité de ce nombre dépendrait alors de la DISCIPLINE DE CLÔTURE — et le second hôte, dont la
410
+ // clôture a été impossible trois jours durant (0008), est bien placé pour le dire : ses sept
411
+ // présentations sont inactives mais gardent toutes leur control_hash, donc aucune n'a été close
412
+ // proprement. Un dénominateur qui dépend d'une discipline humaine produit des anomalies fantômes.
413
+ //
414
+ // On réutilise donc LE seuil qui définit déjà « vivante » ailleurs dans le code — `STALE_MS`, le
415
+ // même que celui du balayage des présentations orphelines — plutôt que d'inventer un second
416
+ // nombre qui divergerait. Le présentateur bat toutes les 30 s (`present-touch`) : une présentation
417
+ // sans battement depuis trois minutes est abandonnée, pas silencieuse. (Relevé du second hôte.)
418
+ const vivantDepuis = new Date(Date.now() - require("./presentations").STALE_MS).toISOString();
419
+ const actives = await PLAYER.db.request(`doc_presentations?active=eq.true&last_seen=gt.${encodeURIComponent(vivantDepuis)}&select=slug${bornee}`);
407
420
  const nActives = Array.isArray(actives) ? actives.length : 0;
408
421
  // ⚠️ `couvre` VOYAGE AVEC LES NOMBRES, ET C'EST LE POINT. Le commentaire ci-dessus protège celui
409
422
  // qui lit la SOURCE ; celui qui court un risque, lui, lit le JSON — dans six mois, dans un cockpit,
@@ -429,10 +442,20 @@ async function ajouterPresence(etat) {
429
442
  // `avecJeton` qui prend le relais comme SIGNE DE VIE — nul pendant une présentation en cours
430
443
  // veut alors dire que quelque chose est cassé.
431
444
  couvre: (PLAYER.config && PLAYER.config.presenceStrict)
445
+ // ⚠️ LA RÈGLE PORTE SUR LE CAS PRÉSENT, PAS SUR UN GABARIT. Une première version injectait
446
+ // `nActives` dans une phrase écrite pour N > 0 et rendait, à N = 0 : « 0 active et 0 avecJeton
447
+ // = ANOMALIE ; 0 active et 0 avecJeton = repos normal » — une contradiction dans la même ligne.
448
+ // Formellement construite, fausse dans le cas du moment : exactement le défaut que ce champ
449
+ // existe pour éviter. On BRANCHE donc sur l'état réel plutôt que d'interpoler un nombre dans un
450
+ // texte générique — et au repos on annonce ce que le nombre voudra dire quand ça tournera.
432
451
  ? "jauge de transition PÉRIMÉE — porte fermée : sansJeton est structurellement nul et ne mesure "
433
- + "plus rien. Le signe de vie est avecJeton, À CROISER AVEC presentationsActives : "
434
- + nActives + " active(s) et 0 avecJeton = ANOMALIE ; 0 active et 0 avecJeton = repos normal. "
435
- + "avecJeton inclut les bootstraps auto-déclarés — pas une preuve d'identité."
452
+ + "plus rien. Le signe de vie est avecJeton, à croiser avec presentationsActives. "
453
+ + (nActives > 0
454
+ ? nActives + " présentation(s) en cours : avecJeton DOIT être non nul — " + nAvec + " observé"
455
+ + (nAvec > 0 ? ", donc les présences s'enregistrent." : " : ANOMALIE, les présences ne s'enregistrent plus.")
456
+ : "aucune présentation en cours : avecJeton nul est le repos NORMAL. Le jour où une "
457
+ + "présentation tournera, un avecJeton nul voudra dire que les présences ne s'enregistrent plus.")
458
+ + " avecJeton inclut les bootstraps auto-déclarés — pas une preuve d'identité."
436
459
  : "jauge-de-migration — sansJeton dit combien de clients ANCIENS battent encore (0 = on peut "
437
460
  + "fermer). Instrument de TRANSITION : après fermeture il vaudra 0 quoi qu'il arrive, et le "
438
461
  + "relais sera avecJeton croisé avec presentationsActives. "