discovery-media-player 0.1.11 → 0.1.13
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/context/standalone.js +11 -0
- package/package.json +1 -1
- package/server/browser.generated.js +1 -1
- package/server/handler.js +37 -4
package/context/standalone.js
CHANGED
|
@@ -335,6 +335,17 @@ function createStandaloneContext(env = process.env) {
|
|
|
335
335
|
get sourceUrl() { return String(env.PLAYER_SOURCE_URL || "https://github.com/Juli1artha/discovery-media-player").trim(); },
|
|
336
336
|
get legalUrl() { return String(env.PLAYER_LEGAL_URL || "").trim(); },
|
|
337
337
|
get privacyUrl() { return String(env.PLAYER_PRIVACY_URL || "").trim(); },
|
|
338
|
+
/**
|
|
339
|
+
* ⚠️ Mention d'un lien que PERSONNE n'a envoyé — plaquette publique ouverte depuis une carte.
|
|
340
|
+
* Parler d'« expéditeur » y serait faux, et c'est la seule phrase du produit dont l'objet
|
|
341
|
+
* est d'être exacte. Le player choisit d'après le lien lui-même : ni destinataire, ni
|
|
342
|
+
* créateur.
|
|
343
|
+
*/
|
|
344
|
+
get trackingNoticeAnonymous() {
|
|
345
|
+
const perso = String(env.PLAYER_TRACKING_NOTICE_ANON || "").trim();
|
|
346
|
+
return perso || "La consultation de ce document est mesurée (pages vues, temps de lecture).";
|
|
347
|
+
},
|
|
348
|
+
|
|
338
349
|
get trackingNotice() {
|
|
339
350
|
const perso = String(env.PLAYER_TRACKING_NOTICE || "").trim();
|
|
340
351
|
return perso || "La consultation de ce document est mesurée (pages vues, temps de lecture) et transmise à son expéditeur.";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "discovery-media-player",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
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",
|
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
// Injecté par api/doc.js dans un <script nonce=…> de la visionneuse. Le code navigateur du
|
|
5
5
|
// player vit en modules TypeScript testés sous player/src/ — c'est ici qu'il atterrit.
|
|
6
6
|
"use strict";
|
|
7
|
-
module.exports = { PLAYER_BROWSER_JS: "\"use strict\";var Player=(()=>{var U=Object.defineProperty;var ye=Object.getOwnPropertyDescriptor;var ve=Object.getOwnPropertyNames;var Me=Object.prototype.hasOwnProperty;var d=(e,n)=>{for(var t in n)U(e,t,{get:n[t],enumerable:!0})},xe=(e,n,t,r)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let o of ve(n))!Me.call(e,o)&&o!==t&&U(e,o,{get:()=>n[o],enumerable:!(r=ye(n,o))||r.enumerable});return e};var we=e=>xe(U({},\"__esModule\",{value:!0}),e);var dn={};d(dn,{bridge:()=>E,chat:()=>I,live:()=>A,presentation:()=>C,presentationState:()=>$,tracking:()=>S,viewer:()=>L});var E={};d(E,{onHostMessage:()=>Ce,onPlayerMessage:()=>Ie,parseHostMessage:()=>ce,parsePlayerMessage:()=>ue,sendToHost:()=>Se,sendToPlayer:()=>Ae,toWire:()=>K});var V=\"3dd-doc-\",ke=/^[A-Za-z0-9_-]{1,64}$/,Te=[\"close\",\"share\",\"embed-ready\",\"present-left\",\"present-denied\"],_e=[\"embed-denied\"],Pe=[\"present-invite\",\"present-handover\",\"present-switch\"],Ee=[\"handover-done\"];function K(e){let n={type:V+e.type};return\"slug\"in e&&e.slug&&(n.slug=e.slug),\"reason\"in e&&e.reason&&(n.reason=String(e.reason).slice(0,40)),n}function le(e,n,t){if(!e||typeof e!=\"object\")return null;let r=e.type;if(typeof r!=\"string\"||!r.startsWith(V))return null;let o=r.slice(V.length);if(n.includes(o))return{type:o};if(_e.includes(o)){let u=e.reason;return{type:o,reason:/^[a-z-]{1,40}$/.test(String(u||\"\"))?String(u):\"unknown\"}}if(!t.includes(o))return null;let i=e.slug;return typeof i!=\"string\"||!ke.test(i)?null:{type:o,slug:i}}function ue(e){return le(e,Te,Pe)}function ce(e){return le(e,Ee,[])}function Se(e,n){try{let t=n||(typeof window!=\"undefined\"?window.parent:null);t&&t.postMessage(K(e),\"*\")}catch(t){}}function Ae(e,n){var t;try{(t=e==null?void 0:e.contentWindow)==null||t.postMessage(K(n),\"*\")}catch(r){}}function Ie(e,n){let t=n||(typeof window!=\"undefined\"?window:null);if(!t)return()=>{};let r=o=>{let i=ue(o.data);i&&e(i)};return t.addEventListener(\"message\",r),()=>t.removeEventListener(\"message\",r)}function Ce(e,n){let t=n||(typeof window!=\"undefined\"?window:null);if(!t)return()=>{};let r=o=>{let i=ce(o.data);i&&e(i)};return t.addEventListener(\"message\",r),()=>t.removeEventListener(\"message\",r)}var S={};d(S,{createTracker:()=>He});var Le=[\"mousemove\",\"mousedown\",\"keydown\",\"wheel\",\"touchstart\",\"pointerdown\"];function $e(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function Re(e,n){return t=>{try{let r=JSON.stringify(t),o=n.navigator;o&&typeof o.sendBeacon==\"function\"?o.sendBeacon(e,new Blob([r],{type:\"application/json\"})):n.fetch(e,{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},body:r,keepalive:!0})}catch(r){}}}function He(e={}){var se,ie;let n=e.win||(typeof window!=\"undefined\"?window:null),t=e.doc||n&&n.document,r=e.now||(()=>Date.now()),o=e.endpoint||\"/api/doc\",i=(se=e.idleMs)!=null?se:6e4,u=(ie=e.sessionEveryMs)!=null?ie:12e3,h=e.slug||\"\",p=e.internal||null,R=e.sessionId||$e(),be=e.send||Re(o,n),g={},y=0,H=0,v=0,ee=0,c=null,N=r(),M=!1,O=!1,T=[],he=()=>!!h||!!p,ne=s=>{if(he())try{be(s)}catch(a){}},te=()=>!!t&&t.visibilityState===\"visible\"&&(typeof t.hasFocus==\"function\"?t.hasFocus():!0)&&!M,W=()=>{c!=null&&y>0&&(g[y]=(g[y]||0)+(r()-c)/1e3),c=te()?r():null},D=()=>{W(),c=null},F=()=>{c==null&&te()&&(c=r())},z=()=>{let s=0;for(let a in g)s+=g[a];return c!=null&&(s+=(r()-c)/1e3),Math.round(s)},re=()=>{let s={};for(let a in g)s[a]=Math.round(g[a]);return s},x=()=>{N=r(),M&&(M=!1,F())},oe=(s,a)=>{p||ne({slug:h,event:s,page:a||H,maxPage:v,seconds:z(),sessionId:R})},_=()=>{W();let s={event:\"session\",sessionId:R,numPages:ee,maxPage:v,totalSeconds:z(),pagesTime:re()};p?(s.internal=!0,s.docId=p.docId,s.email=p.email,s.name=p.name):s.slug=h,ne(s)},f=(s,a,P,ae)=>{!s||typeof s.addEventListener!=\"function\"||(s.addEventListener(a,P,ae),T.push(()=>{s.removeEventListener(a,P,ae)}))};return{sessionId:R,totalSeconds:z,maxPage:()=>v,pageTimes:re,start(){if(O)return;O=!0,oe(\"open\",1),y=1,c=r(),N=r(),f(t,\"visibilitychange\",()=>{t.visibilityState===\"hidden\"?(D(),_()):(x(),F())}),f(n,\"blur\",D),f(n,\"focus\",()=>{x(),F()});for(let P of Le)f(n,P,x,{passive:!0});f(e.scrollElement,\"scroll\",x,{passive:!0}),f(n,\"beforeunload\",_);let s=n.setInterval(()=>{!M&&r()-N>i&&(M=!0,D())},5e3),a=n.setInterval(_,u);T.push(()=>{n.clearInterval(s),n.clearInterval(a)})},setPage(s){!s||s===H||(W(),y=s,H=s,s>v&&(v=s,oe(\"page\",s)))},setPageCount(s){ee=s||0},noteActivity:x,flush:_,stop(){for(;T.length;){let s=T.pop();try{s==null||s()}catch(a){}}O=!1}}}var A={};d(A,{STORAGE_KEYS:()=>w,attendeeKey:()=>De,authorToken:()=>Fe,avatarHtml:()=>G,canModerate:()=>Z,escapeHtml:()=>l,flattenPresence:()=>Ne,formatMessageBody:()=>j,initials:()=>de,isMentioned:()=>ze,isMine:()=>m,reactorId:()=>B,shouldNotify:()=>Ue,unreadLabel:()=>Ve});var w={attendeeKey:\"3dd-present-attkey\",authorToken:\"3dd-present-authtoken\",chatMuted:\"3dd-present-mute\"};function l(e){return String(e==null?\"\":e).replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\").replace(/\"/g,\""\")}function de(e){let n=(e||\"?\").trim().split(/\\s+/);return(((n[0]||\"\")[0]||\"?\")+((n[1]||\"\")[0]||\"\")).toUpperCase()}function G(e,n){return e?`<img src=\"${l(e)}\" alt=\"\">`:l(de(n))}function j(e){let n=l(e);return n=n.replace(/(https?:\\/\\/[^\\s<]+)/g,t=>`<a href=\"${t}\" target=_blank rel=noreferrer class=cm-link>${t}</a>`),n=n.replace(/(^|\\s)@([\\p{L}0-9_'.-]+)/gu,(t,r,o)=>`${r}<span class=cm-mention>@${o}</span>`),n}function Ne(e){let n={},t=[];for(let r in e||{})for(let o of(e||{})[r]||[]){let i=String(o.uid||o.email||o.name||\"\").toLowerCase()||`_${r}_${t.length}`;n[i]?o.role===\"presenter\"&&(n[i]=o):(n[i]=o,t.push(i))}return t.map(r=>n[r])}function Oe(e,n){try{return e?e.getItem(n):null}catch(t){return null}}function We(e,n,t){try{e==null||e.setItem(n,t)}catch(r){}}function De(e,n,t=\"anon\",r=()=>Math.random().toString(36).slice(2,10)){if(e!=null&&e.email)return String(e.email).toLowerCase();try{if(!n)return`anon-${t}`;let o=n.getItem(w.attendeeKey);if(o)return o;let i=`anon-${r()}`;return n.setItem(w.attendeeKey,i),i}catch(o){return`anon-${t}`}}function Fe(e,n=()=>Math.random().toString(36).slice(2)+Math.random().toString(36).slice(2)){let t=Oe(e,w.authorToken);if(t)return t;let r=n();return We(e,w.authorToken,r),r}function B(e){return String(e&&(e.email||e.name)||\"\").toLowerCase()}function m(e,n){return!e||!n?!1:e.author_email&&n.email?e.author_email===n.email:!e.author_email&&!n.email?e.author_name===n.name:!1}function Z(e){return!!(e&&e.role===\"presenter\")}function ze(e,n){if(!n||!n.name)return!1;let t=(n.name.split(/\\s+/)[0]||\"\").toLowerCase();return t?String(e&&e.body||\"\").toLowerCase().includes(`@${t}`)&&!m(e,n):!1}function Ue(e){let{msg:n,me:t,historyLoaded:r,chatHidden:o}=e;return!r||!n||n.deleted||m(n,t)?!1:o}function Ve(e){return!e||e<=0?\"\":e>9?\"9+\":String(e)}var I={};d(I,{messageClassName:()=>Ge,renderActions:()=>fe,renderAttachment:()=>ge,renderMessage:()=>Ke,renderReactions:()=>pe});function pe(e,n){let t=e&&e.reactions||{},r=B(n),o=\"\";for(let i in t){let u=t[i]||[];if(!u.length)continue;let h=u.indexOf(r)>=0;o+=`<button class=\"re-chip${h?\" on\":\"\"}\" data-e=\"${l(i)}\">${l(i)} ${u.length}</button>`}return o}function ge(e){if(!e||!e.url)return\"\";let n=l(e.url);if(e.kind===\"image\")return`<a class=cm-att href=\"${n}\" target=_blank rel=noreferrer><img src=\"${n}\" alt=\"\" loading=lazy></a>`;let t=l(e.name||\"Document.pdf\");return`<a class=cm-att-pdf href=\"${n}\" target=_blank rel=noreferrer data-pdf=\"${n}\"><span class=cm-att-ph></span><span class=cm-pdflabel>${t}</span></a>`}function fe(e,n){let t=m(e,n.me),r=`<button class=cm-react title=\"R\\xE9agir\">${n.reactIcon||\"\"}</button><button class=cm-reply title=\"R\\xE9pondre\">\\u21A9</button>`;return t&&(r+='<button class=cm-edit title=\"Modifier\">\\u270E</button>'),(t||Z(n.me))&&(r+='<button class=cm-del-btn title=\"Supprimer\">\\u{1F5D1}</button>'),r}function Ke(e,n){if(e.deleted)return'<span class=a></span><span class=b><div class=\"txt cm-del\">Message supprim\\xE9</div></span>';let t=e.reply_to?`<div class=cm-q><b>${l(e.reply_name||\"\")}</b> ${l(e.reply_text||\"\")}</div>`:\"\",r=e.edited?\" <span class=cm-ed>(modifi\\xE9)</span>\":\"\",o=e.body?`<div class=txt>${j(e.body)}${r}</div>`:\"\",i=e.is_presenter?\" <span class=tag>pr\\xE9sentateur</span>\":\"\";return`<span class=a>${G(e.author_avatar,e.author_name)}</span><span class=b><div class=who><b>${l(e.author_name||\"Invit\\xE9\")}</b>${i}</div>`+t+o+ge(e.attachment)+`<div class=cm-re>${pe(e,n.me)}</div></span><span class=cm-act>${fe(e,n)}</span>`}function Ge(e,n,t){return\"cm\"+(m(e,n)?\" me\":\"\")+(e.deleted?\" isdel\":\"\")+(t?\" mentioned\":\"\")}var C={};d(C,{DEFAULT_CENTER:()=>X,DEFAULT_ZOOM:()=>J,MAP_TYPES:()=>k,cycleMapType:()=>je,initialMapContent:()=>Ze,mapTypeLabel:()=>Be,sanitizeContent:()=>Q});var k=[\"roadmap\",\"satellite\",\"hybrid\"],X=[46.6,2.5],J=6;function b(e){let n=Number(e);return Number.isFinite(n)?n:null}function Y(e){if(!Array.isArray(e))return null;let n=b(e[0]),t=b(e[1]);return n!=null&&t!=null?[n,t]:null}var q=(e,n,t)=>Math.max(n,Math.min(t,e));function Q(e){if(!e||typeof e!=\"object\")return null;let n=e;if(n.kind===\"pdf\"||n.kind==null)return null;if(n.kind===\"streetview\"){let t=Y(n.position);if(!t)return null;let r=n.pov&&typeof n.pov==\"object\"?n.pov:null,o=r?{heading:b(r.heading)||0,pitch:q(b(r.pitch)||0,-90,90)}:{heading:0,pitch:0};return{kind:\"streetview\",position:t,pov:o,zoom:q(b(n.zoom)||1,0,5)}}return n.kind!==\"map\"?null:{kind:\"map\",center:Y(n.center)||[...X],zoom:q(Math.trunc(b(n.zoom)||J),1,21),marker:Y(n.marker),mapType:k.includes(n.mapType)?n.mapType:null,label:String(n.label||\"\").slice(0,160)||null}}function je(e){let n=k.indexOf(e);return k[(n+1)%k.length]}function Be(e){return e===\"roadmap\"?\"\\u{1F6F0} Satellite\":e===\"satellite\"?\"\\u{1F5FA} Hybride\":\"\\u{1F5FA} Plan\"}function Ze(){return{kind:\"map\",center:[...X],zoom:J,marker:null,mapType:null,label:null}}var L={};d(L,{CURRENT_PAGE_MARGIN:()=>en,DEFAULT_ASPECT:()=>Xe,MAX_ZOOM:()=>qe,MIN_PAGE_WIDTH:()=>Je,MIN_ZOOM:()=>Ye,PRERENDER_MARGIN:()=>Qe,arrowState:()=>rn,averageColor:()=>an,clampPage:()=>me,clampZoom:()=>nn,fitWidth:()=>sn,isImageDocument:()=>ln,progressPercent:()=>tn});var Ye=.5,qe=3,Xe=1.35,Je=280,Qe=\"500px 0px\",en=\"-48% 0px -48% 0px\";function nn(e){let n=Math.round((Number(e)||0)*10)/10;return Math.max(.5,Math.min(3,n))}function me(e,n){return Math.max(1,Math.min(n||1,Number(e)||1))}function tn(e,n){return n?Math.round(me(e,n)/n*100):0}function rn(e,n){return{prevDisabled:e<=1,nextDisabled:!!n&&e>=n}}var on=28;function sn(e){var u;let n=(u=e.zoom)!=null?u:1,t=Math.max(280,e.containerWidth||900)*n;if(!e.onePage)return t;let r=e.aspect||1.35,i=((e.containerHeight||600)-on-(e.overlap||0)-(e.reserve||0))/r;return i>120?Math.min(t,i):t}function an(e){let n=e.length/4;if(!n)return\"rgb(0,0,0)\";let t=0,r=0,o=0;for(let i=0;i<e.length;i+=4)t+=e[i],r+=e[i+1],o+=e[i+2];return`rgb(${Math.round(t/n)},${Math.round(r/n)},${Math.round(o/n)})`}function ln(e,n){return/[.](png|jpe?g|webp|gif|avif)($|[?])/i.test(String(e||n||\"\"))}var $={};d($,{presentationTransition:()=>un,switchDocUrl:()=>cn});function un(e,n={}){if(!e)return[{kind:\"nothing\"}];if(e.active===!1)return[{kind:\"ended\"}];let t=Q(e.content);if(t)return[{kind:\"show-map\",content:t}];let r=[{kind:\"leave-map\"}];return e.file_url&&e.file_url!==n.docUrl?(r.push({kind:\"switch-doc\",url:e.file_url,name:e.file_name||void 0,title:e.doc_title||void 0,updatedAt:e.updated_at||void 0}),r):(e.current_page&&r.push({kind:\"show-page\",page:e.current_page}),r)}function cn(e,n){let t=encodeURIComponent(n||String(Date.now()));return`${e}${e.includes(\"?\")?\"&\":\"?\"}v=${t}`}return we(dn);})();", SOURCE_HASH: "dbdf24ce25f84ac7" };
|
|
7
|
+
module.exports = { PLAYER_BROWSER_JS: "\"use strict\";var Player=(()=>{var U=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var Me=Object.getOwnPropertyNames;var xe=Object.prototype.hasOwnProperty;var d=(e,n)=>{for(var t in n)U(e,t,{get:n[t],enumerable:!0})},we=(e,n,t,r)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let o of Me(n))!xe.call(e,o)&&o!==t&&U(e,o,{get:()=>n[o],enumerable:!(r=ve(n,o))||r.enumerable});return e};var ke=e=>we(U({},\"__esModule\",{value:!0}),e);var pn={};d(pn,{bridge:()=>S,chat:()=>C,live:()=>I,presentation:()=>L,presentationState:()=>R,tracking:()=>A,viewer:()=>$});var S={};d(S,{onHostMessage:()=>Le,onPlayerMessage:()=>Ce,parseHostMessage:()=>de,parsePlayerMessage:()=>ce,sendToHost:()=>Ae,sendToPlayer:()=>Ie,toWire:()=>K});var V=\"3dd-doc-\",Te=/^[A-Za-z0-9_-]{1,64}$/,_e=[\"close\",\"share\",\"embed-ready\",\"present-left\",\"present-denied\"],Pe=[\"embed-denied\"],Ee=[\"present-invite\",\"present-handover\",\"present-switch\"],Se=[\"handover-done\"];function K(e){let n={type:V+e.type};return\"slug\"in e&&e.slug&&(n.slug=e.slug),\"reason\"in e&&e.reason&&(n.reason=String(e.reason).slice(0,40)),n}function ue(e,n,t){if(!e||typeof e!=\"object\")return null;let r=e.type;if(typeof r!=\"string\"||!r.startsWith(V))return null;let o=r.slice(V.length);if(n.includes(o))return{type:o};if(Pe.includes(o)){let u=e.reason;return{type:o,reason:/^[a-z-]{1,40}$/.test(String(u||\"\"))?String(u):\"unknown\"}}if(!t.includes(o))return null;let i=e.slug;return typeof i!=\"string\"||!Te.test(i)?null:{type:o,slug:i}}function ce(e){return ue(e,_e,Ee)}function de(e){return ue(e,Se,[])}function Ae(e,n){try{let t=n||(typeof window!=\"undefined\"?window.parent:null);t&&t.postMessage(K(e),\"*\")}catch(t){}}function Ie(e,n){var t;try{(t=e==null?void 0:e.contentWindow)==null||t.postMessage(K(n),\"*\")}catch(r){}}function Ce(e,n){let t=n||(typeof window!=\"undefined\"?window:null);if(!t)return()=>{};let r=o=>{let i=ce(o.data);i&&e(i)};return t.addEventListener(\"message\",r),()=>t.removeEventListener(\"message\",r)}function Le(e,n){let t=n||(typeof window!=\"undefined\"?window:null);if(!t)return()=>{};let r=o=>{let i=de(o.data);i&&e(i)};return t.addEventListener(\"message\",r),()=>t.removeEventListener(\"message\",r)}var A={};d(A,{createTracker:()=>Ne});var $e=[\"mousemove\",\"mousedown\",\"keydown\",\"wheel\",\"touchstart\",\"pointerdown\"];function Re(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function He(e,n){return t=>{try{let r=JSON.stringify(t),o=n.navigator;o&&typeof o.sendBeacon==\"function\"?o.sendBeacon(e,new Blob([r],{type:\"application/json\"})):n.fetch(e,{method:\"POST\",headers:{\"Content-Type\":\"application/json\"},body:r,keepalive:!0})}catch(r){}}}function Ne(e={}){var ie,ae;let n=e.win||(typeof window!=\"undefined\"?window:null),t=e.doc||n&&n.document,r=e.now||(()=>Date.now()),o=e.endpoint||\"/api/doc\",i=(ie=e.idleMs)!=null?ie:6e4,u=(ae=e.sessionEveryMs)!=null?ae:12e3,y=e.slug||\"\",p=e.internal||null,H=e.sessionId||Re(),he=e.send||He(o,n),f={},v=0,N=0,M=0,ee=0,c=null,_=r(),x=!1,O=!1,P=[],ye=()=>!!y||!!p,ne=s=>{if(ye())try{he(s)}catch(a){}},te=()=>!!t&&t.visibilityState===\"visible\"&&(typeof t.hasFocus==\"function\"?t.hasFocus():!0)&&!x,re=s=>{let a=r()-s,m=Math.max(0,_-s)+i;return Math.max(0,Math.min(a,m))},W=()=>{c!=null&&v>0&&(f[v]=(f[v]||0)+re(c)/1e3),c=te()?r():null},D=()=>{W(),c=null},F=()=>{c==null&&te()&&(c=r())},z=()=>{let s=0;for(let a in f)s+=f[a];return c!=null&&(s+=re(c)/1e3),Math.round(s)},oe=()=>{let s={};for(let a in f)s[a]=Math.round(f[a]);return s},w=()=>{_=r(),x&&(x=!1,F())},se=(s,a)=>{p||ne({slug:y,event:s,page:a||N,maxPage:M,seconds:z(),sessionId:H})},E=()=>{W();let s={event:\"session\",sessionId:H,numPages:ee,maxPage:M,totalSeconds:z(),pagesTime:oe()};p?(s.internal=!0,s.docId=p.docId,s.email=p.email,s.name=p.name):s.slug=y,ne(s)},g=(s,a,m,le)=>{!s||typeof s.addEventListener!=\"function\"||(s.addEventListener(a,m,le),P.push(()=>{s.removeEventListener(a,m,le)}))};return{sessionId:H,totalSeconds:z,maxPage:()=>M,pageTimes:oe,start(){if(O)return;O=!0,se(\"open\",1),v=1,c=r(),_=r(),g(t,\"visibilitychange\",()=>{t.visibilityState===\"hidden\"?(D(),E()):(w(),F())}),g(n,\"blur\",D),g(n,\"focus\",()=>{w(),F()});for(let m of $e)g(n,m,w,{passive:!0});g(e.scrollElement,\"scroll\",w,{passive:!0}),g(n,\"beforeunload\",E);let s=n.setInterval(()=>{!x&&r()-_>i&&(x=!0,D())},5e3),a=n.setInterval(E,u);P.push(()=>{n.clearInterval(s),n.clearInterval(a)})},setPage(s){!s||s===N||(W(),v=s,N=s,s>M&&(M=s,se(\"page\",s)))},setPageCount(s){ee=s||0},noteActivity:w,flush:E,stop(){for(;P.length;){let s=P.pop();try{s==null||s()}catch(a){}}O=!1}}}var I={};d(I,{STORAGE_KEYS:()=>k,attendeeKey:()=>Fe,authorToken:()=>ze,avatarHtml:()=>G,canModerate:()=>Z,escapeHtml:()=>l,flattenPresence:()=>Oe,formatMessageBody:()=>j,initials:()=>pe,isMentioned:()=>Ue,isMine:()=>b,reactorId:()=>B,shouldNotify:()=>Ve,unreadLabel:()=>Ke});var k={attendeeKey:\"3dd-present-attkey\",authorToken:\"3dd-present-authtoken\",chatMuted:\"3dd-present-mute\"};function l(e){return String(e==null?\"\":e).replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\").replace(/\"/g,\""\")}function pe(e){let n=(e||\"?\").trim().split(/\\s+/);return(((n[0]||\"\")[0]||\"?\")+((n[1]||\"\")[0]||\"\")).toUpperCase()}function G(e,n){return e?`<img src=\"${l(e)}\" alt=\"\">`:l(pe(n))}function j(e){let n=l(e);return n=n.replace(/(https?:\\/\\/[^\\s<]+)/g,t=>`<a href=\"${t}\" target=_blank rel=noreferrer class=cm-link>${t}</a>`),n=n.replace(/(^|\\s)@([\\p{L}0-9_'.-]+)/gu,(t,r,o)=>`${r}<span class=cm-mention>@${o}</span>`),n}function Oe(e){let n={},t=[];for(let r in e||{})for(let o of(e||{})[r]||[]){let i=String(o.uid||o.email||o.name||\"\").toLowerCase()||`_${r}_${t.length}`;n[i]?o.role===\"presenter\"&&(n[i]=o):(n[i]=o,t.push(i))}return t.map(r=>n[r])}function We(e,n){try{return e?e.getItem(n):null}catch(t){return null}}function De(e,n,t){try{e==null||e.setItem(n,t)}catch(r){}}function Fe(e,n,t=\"anon\",r=()=>Math.random().toString(36).slice(2,10)){if(e!=null&&e.email)return String(e.email).toLowerCase();try{if(!n)return`anon-${t}`;let o=n.getItem(k.attendeeKey);if(o)return o;let i=`anon-${r()}`;return n.setItem(k.attendeeKey,i),i}catch(o){return`anon-${t}`}}function ze(e,n=()=>Math.random().toString(36).slice(2)+Math.random().toString(36).slice(2)){let t=We(e,k.authorToken);if(t)return t;let r=n();return De(e,k.authorToken,r),r}function B(e){return String(e&&(e.email||e.name)||\"\").toLowerCase()}function b(e,n){return!e||!n?!1:e.author_email&&n.email?e.author_email===n.email:!e.author_email&&!n.email?e.author_name===n.name:!1}function Z(e){return!!(e&&e.role===\"presenter\")}function Ue(e,n){if(!n||!n.name)return!1;let t=(n.name.split(/\\s+/)[0]||\"\").toLowerCase();return t?String(e&&e.body||\"\").toLowerCase().includes(`@${t}`)&&!b(e,n):!1}function Ve(e){let{msg:n,me:t,historyLoaded:r,chatHidden:o}=e;return!r||!n||n.deleted||b(n,t)?!1:o}function Ke(e){return!e||e<=0?\"\":e>9?\"9+\":String(e)}var C={};d(C,{messageClassName:()=>je,renderActions:()=>me,renderAttachment:()=>ge,renderMessage:()=>Ge,renderReactions:()=>fe});function fe(e,n){let t=e&&e.reactions||{},r=B(n),o=\"\";for(let i in t){let u=t[i]||[];if(!u.length)continue;let y=u.indexOf(r)>=0;o+=`<button class=\"re-chip${y?\" on\":\"\"}\" data-e=\"${l(i)}\">${l(i)} ${u.length}</button>`}return o}function ge(e){if(!e||!e.url)return\"\";let n=l(e.url);if(e.kind===\"image\")return`<a class=cm-att href=\"${n}\" target=_blank rel=noreferrer><img src=\"${n}\" alt=\"\" loading=lazy></a>`;let t=l(e.name||\"Document.pdf\");return`<a class=cm-att-pdf href=\"${n}\" target=_blank rel=noreferrer data-pdf=\"${n}\"><span class=cm-att-ph></span><span class=cm-pdflabel>${t}</span></a>`}function me(e,n){let t=b(e,n.me),r=`<button class=cm-react title=\"R\\xE9agir\">${n.reactIcon||\"\"}</button><button class=cm-reply title=\"R\\xE9pondre\">\\u21A9</button>`;return t&&(r+='<button class=cm-edit title=\"Modifier\">\\u270E</button>'),(t||Z(n.me))&&(r+='<button class=cm-del-btn title=\"Supprimer\">\\u{1F5D1}</button>'),r}function Ge(e,n){if(e.deleted)return'<span class=a></span><span class=b><div class=\"txt cm-del\">Message supprim\\xE9</div></span>';let t=e.reply_to?`<div class=cm-q><b>${l(e.reply_name||\"\")}</b> ${l(e.reply_text||\"\")}</div>`:\"\",r=e.edited?\" <span class=cm-ed>(modifi\\xE9)</span>\":\"\",o=e.body?`<div class=txt>${j(e.body)}${r}</div>`:\"\",i=e.is_presenter?\" <span class=tag>pr\\xE9sentateur</span>\":\"\";return`<span class=a>${G(e.author_avatar,e.author_name)}</span><span class=b><div class=who><b>${l(e.author_name||\"Invit\\xE9\")}</b>${i}</div>`+t+o+ge(e.attachment)+`<div class=cm-re>${fe(e,n.me)}</div></span><span class=cm-act>${me(e,n)}</span>`}function je(e,n,t){return\"cm\"+(b(e,n)?\" me\":\"\")+(e.deleted?\" isdel\":\"\")+(t?\" mentioned\":\"\")}var L={};d(L,{DEFAULT_CENTER:()=>X,DEFAULT_ZOOM:()=>J,MAP_TYPES:()=>T,cycleMapType:()=>Be,initialMapContent:()=>Ye,mapTypeLabel:()=>Ze,sanitizeContent:()=>Q});var T=[\"roadmap\",\"satellite\",\"hybrid\"],X=[46.6,2.5],J=6;function h(e){let n=Number(e);return Number.isFinite(n)?n:null}function Y(e){if(!Array.isArray(e))return null;let n=h(e[0]),t=h(e[1]);return n!=null&&t!=null?[n,t]:null}var q=(e,n,t)=>Math.max(n,Math.min(t,e));function Q(e){if(!e||typeof e!=\"object\")return null;let n=e;if(n.kind===\"pdf\"||n.kind==null)return null;if(n.kind===\"streetview\"){let t=Y(n.position);if(!t)return null;let r=n.pov&&typeof n.pov==\"object\"?n.pov:null,o=r?{heading:h(r.heading)||0,pitch:q(h(r.pitch)||0,-90,90)}:{heading:0,pitch:0};return{kind:\"streetview\",position:t,pov:o,zoom:q(h(n.zoom)||1,0,5)}}return n.kind!==\"map\"?null:{kind:\"map\",center:Y(n.center)||[...X],zoom:q(Math.trunc(h(n.zoom)||J),1,21),marker:Y(n.marker),mapType:T.includes(n.mapType)?n.mapType:null,label:String(n.label||\"\").slice(0,160)||null}}function Be(e){let n=T.indexOf(e);return T[(n+1)%T.length]}function Ze(e){return e===\"roadmap\"?\"\\u{1F6F0} Satellite\":e===\"satellite\"?\"\\u{1F5FA} Hybride\":\"\\u{1F5FA} Plan\"}function Ye(){return{kind:\"map\",center:[...X],zoom:J,marker:null,mapType:null,label:null}}var $={};d($,{CURRENT_PAGE_MARGIN:()=>nn,DEFAULT_ASPECT:()=>Je,MAX_ZOOM:()=>Xe,MIN_PAGE_WIDTH:()=>Qe,MIN_ZOOM:()=>qe,PRERENDER_MARGIN:()=>en,arrowState:()=>on,averageColor:()=>ln,clampPage:()=>be,clampZoom:()=>tn,fitWidth:()=>an,isImageDocument:()=>un,progressPercent:()=>rn});var qe=.5,Xe=3,Je=1.35,Qe=280,en=\"500px 0px\",nn=\"-48% 0px -48% 0px\";function tn(e){let n=Math.round((Number(e)||0)*10)/10;return Math.max(.5,Math.min(3,n))}function be(e,n){return Math.max(1,Math.min(n||1,Number(e)||1))}function rn(e,n){return n?Math.round(be(e,n)/n*100):0}function on(e,n){return{prevDisabled:e<=1,nextDisabled:!!n&&e>=n}}var sn=28;function an(e){var u;let n=(u=e.zoom)!=null?u:1,t=Math.max(280,e.containerWidth||900)*n;if(!e.onePage)return t;let r=e.aspect||1.35,i=((e.containerHeight||600)-sn-(e.overlap||0)-(e.reserve||0))/r;return i>120?Math.min(t,i):t}function ln(e){let n=e.length/4;if(!n)return\"rgb(0,0,0)\";let t=0,r=0,o=0;for(let i=0;i<e.length;i+=4)t+=e[i],r+=e[i+1],o+=e[i+2];return`rgb(${Math.round(t/n)},${Math.round(r/n)},${Math.round(o/n)})`}function un(e,n){return/[.](png|jpe?g|webp|gif|avif)($|[?])/i.test(String(e||n||\"\"))}var R={};d(R,{presentationTransition:()=>cn,switchDocUrl:()=>dn});function cn(e,n={}){if(!e)return[{kind:\"nothing\"}];if(e.active===!1)return[{kind:\"ended\"}];let t=Q(e.content);if(t)return[{kind:\"show-map\",content:t}];let r=[{kind:\"leave-map\"}];return e.file_url&&e.file_url!==n.docUrl?(r.push({kind:\"switch-doc\",url:e.file_url,name:e.file_name||void 0,title:e.doc_title||void 0,updatedAt:e.updated_at||void 0}),r):(e.current_page&&r.push({kind:\"show-page\",page:e.current_page}),r)}function dn(e,n){let t=encodeURIComponent(n||String(Date.now()));return`${e}${e.includes(\"?\")?\"&\":\"?\"}v=${t}`}return ke(pn);})();", SOURCE_HASH: "51c05545eb241d37" };
|
package/server/handler.js
CHANGED
|
@@ -1145,7 +1145,17 @@ async function relayerFichier(res, r, disposition) {
|
|
|
1145
1145
|
res.end(buf);
|
|
1146
1146
|
}
|
|
1147
1147
|
|
|
1148
|
-
|
|
1148
|
+
// ⚠️ UNE MENTION DONT L'OBJET EST D'ÊTRE EXACTE NE DOIT PAS INVENTER UN EXPÉDITEUR.
|
|
1149
|
+
//
|
|
1150
|
+
// Le texte par défaut disait « transmise à son expéditeur ». Vrai pour un lien nominatif, faux
|
|
1151
|
+
// pour un lien que PERSONNE n'a envoyé — la plaquette publique d'un programme, ouverte depuis une
|
|
1152
|
+
// carte par un visiteur qui n'a reçu aucun message. Le défaut est antérieur au mode serveur à
|
|
1153
|
+
// serveur ; c'est lui qui l'a rendu visible, puisqu'il crée précisément des liens sans
|
|
1154
|
+
// destinataire NI créateur.
|
|
1155
|
+
//
|
|
1156
|
+
// La distinction ne demande aucune donnée nouvelle : c'est déjà la clé d'idempotence de ces
|
|
1157
|
+
// liens-là. Signalé par le second hôte en regardant son propre écran — ce qu'aucun test ne fait.
|
|
1158
|
+
function legalFooter({ tracked, sansExpediteur }) {
|
|
1149
1159
|
const L = PLAYER.legal;
|
|
1150
1160
|
const liens = [
|
|
1151
1161
|
L.legalUrl ? `<a href="${esc(L.legalUrl)}" target=_blank rel=noreferrer>Mentions légales</a>` : "",
|
|
@@ -1153,7 +1163,10 @@ function legalFooter({ tracked }) {
|
|
|
1153
1163
|
// Obligation AGPL : l'accès au source se propose à qui UTILISE le logiciel, pas seulement à qui le distribue.
|
|
1154
1164
|
L.sourceUrl ? `<a href="${esc(L.sourceUrl)}" target=_blank rel=noreferrer>Code source</a>` : "",
|
|
1155
1165
|
].filter(Boolean).join("<span class=lgl-sep>·</span>");
|
|
1156
|
-
|
|
1166
|
+
// Un contexte qui ne fournit pas le second texte retombe sur le premier : rien ne casse chez un
|
|
1167
|
+
// hôte qui n'a pas encore de liens sans expéditeur.
|
|
1168
|
+
const texte = sansExpediteur ? (L.trackingNoticeAnonymous || L.trackingNotice) : L.trackingNotice;
|
|
1169
|
+
const mesure = tracked ? `<span class=lgl-note>${esc(texte)}</span>` : "";
|
|
1157
1170
|
if (!liens && !mesure) return "";
|
|
1158
1171
|
return `<div class=lgl>${mesure}${liens ? `<span class=lgl-links>${liens}</span>` : ""}</div>`;
|
|
1159
1172
|
}
|
|
@@ -1363,6 +1376,26 @@ ${gcid ? `<script nonce="${nonce}" src="https://accounts.google.com/gsi/client"
|
|
|
1363
1376
|
</body></html>`;
|
|
1364
1377
|
}
|
|
1365
1378
|
|
|
1379
|
+
/**
|
|
1380
|
+
* ⚠️ LE VISITEUR EST VENU SOUS UNE MARQUE ; C'EST CELLE-LÀ QU'IL DOIT LIRE.
|
|
1381
|
+
*
|
|
1382
|
+
* Le titre ajoutait le nom de l'INSTANCE — celui de la société qui exploite l'outil. Vrai tant
|
|
1383
|
+
* qu'une instance ne sert qu'un public ; faux dès qu'elle en sert deux, et le visiteur d'une
|
|
1384
|
+
* marque cliente voit alors le nom d'une société qui ne le concerne pas.
|
|
1385
|
+
*
|
|
1386
|
+
* Aucune configuration nouvelle : la marque du lien est DÉJÀ résolue (`brandForShare`, la même
|
|
1387
|
+
* qui habille le loader) et posée sur `share.brand_name` avant qu'on arrive ici. Le titre ne la
|
|
1388
|
+
* consultait simplement pas.
|
|
1389
|
+
*
|
|
1390
|
+
* Le « propulsé par » reste celui de l'instance, lui, et c'est délibéré : dire qui opère l'outil
|
|
1391
|
+
* est une information honnête, pas une trahison de marque.
|
|
1392
|
+
*/
|
|
1393
|
+
function titreOnglet(share) {
|
|
1394
|
+
const base = share.doc_title || share.file_name || "Document";
|
|
1395
|
+
const marque = String((share && share.brand_name) || "").trim();
|
|
1396
|
+
return marque ? `${base} — ${marque}` : PLAYER.branding.title(base);
|
|
1397
|
+
}
|
|
1398
|
+
|
|
1366
1399
|
function viewerHtml(share, nonce, logoUrl, pitch) {
|
|
1367
1400
|
const title = esc(share.doc_title || share.file_name || "Document");
|
|
1368
1401
|
// Aperçu interne : slug vide (= pas de tracking, pas de bouton de re-partage) + stream depuis le bucket public.
|
|
@@ -1394,7 +1427,7 @@ function viewerHtml(share, nonce, logoUrl, pitch) {
|
|
|
1394
1427
|
<meta name=robots content="noindex,nofollow">
|
|
1395
1428
|
<link rel=icon href="data:,">
|
|
1396
1429
|
<link rel=preconnect href="https://cdnjs.cloudflare.com" crossorigin>
|
|
1397
|
-
<title>${esc(
|
|
1430
|
+
<title>${esc(titreOnglet(share))}</title>
|
|
1398
1431
|
<style>
|
|
1399
1432
|
:root{--bg:#33312e;--bar:#26241f}
|
|
1400
1433
|
*{box-sizing:border-box}
|
|
@@ -1582,7 +1615,7 @@ ${LEGAL_CSS}
|
|
|
1582
1615
|
${botOn ? botMarkup(share, pitch) : ""}
|
|
1583
1616
|
</div>
|
|
1584
1617
|
${PLAYER.branding.poweredBy ? `<div class=brand>Propulsé par ${esc(PLAYER.branding.poweredBy)}</div>` : ""}
|
|
1585
|
-
${legalFooter({ tracked: !preview && !!share.slug })}
|
|
1618
|
+
${legalFooter({ tracked: !preview && !!share.slug, sansExpediteur: !share.recipient_email && !share.created_by })}
|
|
1586
1619
|
${brandLogo || !brandIntroRuntime ? "" : `<script nonce="${nonce}">(${brandIntroRuntime.toString()})();</script>`}
|
|
1587
1620
|
<script nonce="${nonce}">${PLAYER_BROWSER_JS}</script>
|
|
1588
1621
|
<script nonce="${nonce}" src="${PDFJS}/pdf.min.js"></script>
|