discovery-media-player 0.1.44 → 0.1.45

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.44",
3
+ "version": "0.1.45",
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 C=Object.defineProperty,Ne=Object.defineProperties,$e=Object.getOwnPropertyDescriptor,He=Object.getOwnPropertyDescriptors,Ue=Object.getOwnPropertyNames,be=Object.getOwnPropertySymbols;var he=Object.prototype.hasOwnProperty,De=Object.prototype.propertyIsEnumerable;var ye=(e,n,t)=>n in e?C(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,K=(e,n)=>{for(var t in n||(n={}))he.call(n,t)&&ye(e,t,n[t]);if(be)for(var t of be(n))De.call(n,t)&&ye(e,t,n[t]);return e},ve=(e,n)=>Ne(e,He(n));var v=(e,n)=>{for(var t in n)C(e,t,{get:n[t],enumerable:!0})},We=(e,n,t,r)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let o of Ue(n))!he.call(e,o)&&o!==t&&C(e,o,{get:()=>n[o],enumerable:!(r=$e(n,o))||r.enumerable});return e};var Ve=e=>We(C({},\"__esModule\",{value:!0}),e);var Nn={};v(Nn,{bridge:()=>L,cadence:()=>O,chat:()=>H,live:()=>$,presentation:()=>U,presentationState:()=>W,tracking:()=>N,viewer:()=>D});var L={};v(L,{onHostMessage:()=>Xe,onPlayerMessage:()=>qe,parseHostMessage:()=>_e,parsePlayerMessage:()=>xe,sendToHost:()=>Be,sendToPlayer:()=>Ye,toWire:()=>Y});var B=\"3dd-doc-\",Fe=/^[A-Za-z0-9_-]{1,64}$/,ze=[\"close\",\"share\",\"embed-ready\",\"present-left\",\"present-denied\"],je=[\"embed-denied\"],Ge=[\"present-invite\",\"present-handover\",\"present-switch\"],Ke=[\"handover-done\"];function Y(e){let n={type:B+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 Me(e,n,t){if(!e||typeof e!=\"object\")return null;let r=e.type;if(typeof r!=\"string\"||!r.startsWith(B))return null;let o=r.slice(B.length);if(n.includes(o))return{type:o};if(je.includes(o)){let a=e.reason;return{type:o,reason:/^[a-z-]{1,40}$/.test(String(a||\"\"))?String(a):\"unknown\"}}if(!t.includes(o))return null;let s=e.slug;return typeof s!=\"string\"||!Fe.test(s)?null:{type:o,slug:s}}function xe(e){return Me(e,ze,Ge)}function _e(e){return Me(e,Ke,[])}function Be(e,n){try{let t=n||(typeof window!=\"undefined\"?window.parent:null);t&&t.postMessage(Y(e),\"*\")}catch(t){}}function Ye(e,n){var t;try{(t=e==null?void 0:e.contentWindow)==null||t.postMessage(Y(n),\"*\")}catch(r){}}function Ze(e,n){var r;if(!e)return!0;let t=(r=e.contentWindow)!=null?r:e;return n===t}function qe(e,n,t){let r=n||(typeof window!=\"undefined\"?window:null);if(!r)return()=>{};let o=s=>{if(!Ze(t,s.source))return;let a=xe(s.data);a&&e(a)};return r.addEventListener(\"message\",o),()=>r.removeEventListener(\"message\",o)}function Xe(e,n){var s;let t=n||(typeof window!=\"undefined\"?window:null);if(!t)return()=>{};let r=(s=t.parent)!=null?s:null,o=a=>{if(!r||r===t||a.source!==r)return;let l=_e(a.data);l&&e(l)};return t.addEventListener(\"message\",o),()=>t.removeEventListener(\"message\",o)}var N={};v(N,{createTracker:()=>rn});var O={};v(O,{PRESENTER_ACTIONS_PER_HOUR:()=>Se,PRESENT_QUOTA_PER_HOUR:()=>Je,PRESENT_READS_PER_HOUR:()=>ke,PRESENT_RESYNC_MS:()=>we,PRESENT_WRITE_TIMEOUT_MS:()=>Q,READERS_PER_EGRESS:()=>q,RESYNC_READS_PER_HOUR:()=>Ee,SESSION_IDLE_MS:()=>X,SESSION_INTERVAL_MS:()=>Z,SESSION_QUOTA_PER_HOUR:()=>Qe,SESSION_WRITES_PER_HOUR:()=>Te});var Z=12e3,Te=Math.ceil(300),q=25,Qe=Te*q,X=18e4,we=25e3,Ee=Math.ceil(36e5/we),Se=720,ke=Ee+Se,Je=ke*q,Q=1e4;var en=[\"mousemove\",\"mousedown\",\"keydown\",\"wheel\",\"touchstart\",\"pointerdown\"];function nn(){let e=typeof globalThis!=\"undefined\"?globalThis.crypto:void 0;if(e&&typeof e.randomUUID==\"function\")return e.randomUUID().replace(/-/g,\"\");if(e&&typeof e.getRandomValues==\"function\"){let n=e.getRandomValues(new Uint8Array(16));return Array.from(n,t=>t.toString(16).padStart(2,\"0\")).join(\"\")}return Math.random().toString(36).slice(2)+Date.now().toString(36)}function tn(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 rn(e={}){var fe,me;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\",s=(fe=e.idleMs)!=null?fe:X,a=(me=e.sessionEveryMs)!=null?me:12e3,l=e.slug||\"\",p=e.internal||null,m=e.sessionId||nn(),b=e.send||tn(o,n),f={},u=0,y=0,c=0,M=0,h=null,w=r(),E=!1,V=!1,P=[],Oe=()=>!!l||!!p,le=i=>{if(Oe())try{b(i)}catch(d){}},F=()=>!!t&&t.visibilityState===\"visible\"&&!E,ue=i=>{let d=r()-i,x=Math.max(0,w-i)+s;return Math.max(0,Math.min(d,x))},z=()=>{h!=null&&u>0&&(f[u]=(f[u]||0)+ue(h)/1e3),h=F()?r():null},ce=()=>{z(),h=null},j=()=>{h==null&&F()&&(h=r())},G=()=>{let i=0;for(let d in f)i+=f[d];return h!=null&&(i+=ue(h)/1e3),Math.round(i)},de=()=>{let i={};for(let d in f)i[d]=Math.round(f[d]);return i},S=()=>{w=r(),E&&(E=!1,j())},pe=(i,d)=>{p||le({slug:l,event:i,page:d||y,maxPage:c,seconds:G(),sessionId:m})},A=()=>{z();let i={event:\"session\",sessionId:m,numPages:M,maxPage:c,totalSeconds:G(),pagesTime:de()};p?(i.internal=!0,i.docId=p.docId,i.email=p.email,i.name=p.name,p.it&&(i.it=p.it)):i.slug=l,le(i)},k=(i,d,x,ge)=>{!i||typeof i.addEventListener!=\"function\"||(i.addEventListener(d,x,ge),P.push(()=>{i.removeEventListener(d,x,ge)}))};return{sessionId:m,totalSeconds:G,maxPage:()=>c,pageTimes:de,start(){if(V)return;V=!0,pe(\"open\",1),u=1,w=r(),h=F()?r():null,k(t,\"visibilitychange\",()=>{t.visibilityState===\"hidden\"?(ce(),A()):(S(),j())}),k(n,\"focus\",()=>{S(),j()});for(let x of en)k(n,x,S,{passive:!0});k(e.scrollElement,\"scroll\",S,{passive:!0}),k(n,\"beforeunload\",A);let i=n.setInterval(()=>{!E&&r()-w>s&&(E=!0,ce())},5e3),d=n.setInterval(A,a);P.push(()=>{n.clearInterval(i),n.clearInterval(d)})},setPage(i){!i||i===y||(w=r(),z(),u=i,y=i,i>c&&(c=i,pe(\"page\",i)))},setPageCount(i){M=i||0},noteActivity:S,flush:A,stop(){for(;P.length;){let i=P.pop();try{i==null||i()}catch(d){}}V=!1}}}var $={};v($,{STORAGE_KEYS:()=>R,attendeeKey:()=>ln,authorToken:()=>un,avatarHtml:()=>J,canModerate:()=>te,createScheduler:()=>fn,escapeHtml:()=>g,fetchBorne:()=>mn,flattenPresence:()=>on,formatMessageBody:()=>ee,initials:()=>Re,isMentioned:()=>cn,isMine:()=>_,reactorId:()=>ne,shouldNotify:()=>dn,unreadLabel:()=>pn});var R={attendeeKey:\"3dd-present-attkey\",authorToken:\"3dd-present-authtoken\",chatMuted:\"3dd-present-mute\"};function g(e){return String(e==null?\"\":e).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\")}function Re(e){let n=(e||\"?\").trim().split(/\\s+/);return(((n[0]||\"\")[0]||\"?\")+((n[1]||\"\")[0]||\"\")).toUpperCase()}function J(e,n){return e?`<img src=\"${g(e)}\" alt=\"\">`:g(Re(n))}function ee(e){let n=g(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 on(e){let n={},t=[];for(let r in e||{})for(let o of(e||{})[r]||[]){let s=String(o.uid||o.email||o.name||\"\").toLowerCase()||`_${r}_${t.length}`;n[s]?o.role===\"presenter\"&&(n[s]=o):(n[s]=o,t.push(s))}return t.map(r=>n[r])}function sn(e,n){try{return e?e.getItem(n):null}catch(t){return null}}function an(e,n,t){try{e==null||e.setItem(n,t)}catch(r){}}function ln(e,n=\"anon\",t=Ie){try{if(!e)return`anon-${n}`;let r=e.getItem(R.attendeeKey);if(r)return r;let o=`anon-${t()}`;return e.setItem(R.attendeeKey,o),o}catch(r){return`anon-${n}`}}function Ie(){let e=typeof globalThis!=\"undefined\"?globalThis.crypto:void 0;if(e&&typeof e.randomUUID==\"function\")return e.randomUUID().replace(/-/g,\"\");if(e&&typeof e.getRandomValues==\"function\"){let n=e.getRandomValues(new Uint8Array(24));return Array.from(n,t=>t.toString(16).padStart(2,\"0\")).join(\"\")}try{console.warn(\"[player] crypto indisponible : jeton d'auteur affaibli\")}catch(n){}return Math.random().toString(36).slice(2)+Math.random().toString(36).slice(2)}function un(e,n=Ie){let t=sn(e,R.authorToken);if(t)return t;let r=n();return an(e,R.authorToken,r),r}function ne(e){return String(e&&(e.email||e.name)||\"\").toLowerCase()}function _(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 te(e){return!!(e&&e.role===\"presenter\")}function cn(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}`)&&!_(e,n):!1}function dn(e){let{msg:n,me:t,historyLoaded:r,chatHidden:o}=e;return!r||!n||n.deleted||_(n,t)?!1:o}function pn(e){return!e||e<=0?\"\":e>9?\"9+\":String(e)}function fn(e,n={}){var y;let t=(y=n.minMs)!=null?y:300,r=n.now||(()=>Date.now()),o=n.setTimer||((c,M)=>setTimeout(c,M)),s=n.clearTimer||(c=>clearTimeout(c)),a=!1,l=!1,p=-1/0,m=null,b=!1;function f(){if(b||a){l=!0;return}let c=t-(r()-p);if(c>0){u(c);return}a=!0,l=!1,p=r();let M=!1;e(()=>{M||(M=!0,a=!1,l&&!b&&f())})}function u(c){b||m!==null||(m=o(()=>{m=null,f()},Math.max(0,c)))}return{signaler(){b||f()},maintenant(){b||(p=-1/0,f())},arreter(){b=!0,m!==null&&(s(m),m=null)}}}function mn(e,n,t=Q,r={}){let o=r.fetch||(typeof fetch==\"function\"?fetch:void 0);if(!o)return Promise.reject(new Error(\"fetch indisponible\"));let s=r.setTimer||((u,y)=>setTimeout(u,y)),a=r.clearTimer||(u=>clearTimeout(u)),l=null;try{l=new AbortController}catch(u){}let p=l?ve(K({},n||{}),{signal:l.signal}):K({},n||{}),m=null,b=new Promise((u,y)=>{m=s(()=>{try{l==null||l.abort()}catch(c){}y(new Error(\"delai\"))},t)}),f=()=>{try{a(m)}catch(u){}};return Promise.race([o(e,p),b]).then(u=>(f(),u),u=>{throw f(),u})}var H={};v(H,{messageClassName:()=>bn,renderActions:()=>Ce,renderAttachment:()=>Ae,renderMessage:()=>gn,renderReactions:()=>Pe});function Pe(e,n){let t=e&&e.reactions||{},r=ne(n),o=\"\";for(let s in t){let a=t[s]||[];if(!a.length)continue;let l=a.indexOf(r)>=0;o+=`<button class=\"re-chip${l?\" on\":\"\"}\" data-e=\"${g(s)}\">${g(s)} ${a.length}</button>`}return o}function Ae(e){if(!e||!e.url)return\"\";let n=g(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=g(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 Ce(e,n){let t=_(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||te(n.me))&&(r+='<button class=cm-del-btn title=\"Supprimer\">\\u{1F5D1}</button>'),r}function gn(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>${g(e.reply_name||\"\")}</b> ${g(e.reply_text||\"\")}</div>`:\"\",r=e.edited?\" <span class=cm-ed>(modifi\\xE9)</span>\":\"\",o=e.body?`<div class=txt>${ee(e.body)}${r}</div>`:\"\",s=e.is_presenter?\" <span class=tag>pr\\xE9sentateur</span>\":\"\";return`<span class=a>${J(e.author_avatar,e.author_name)}</span><span class=b><div class=who><b>${g(e.author_name||\"Invit\\xE9\")}</b>${s}</div>`+t+o+Ae(e.attachment)+`<div class=cm-re>${Pe(e,n.me)}</div></span><span class=cm-act>${Ce(e,n)}</span>`}function bn(e,n,t){return\"cm\"+(_(e,n)?\" me\":\"\")+(e.deleted?\" isdel\":\"\")+(t?\" mentioned\":\"\")}var U={};v(U,{DEFAULT_CENTER:()=>ie,DEFAULT_ZOOM:()=>se,MAP_TYPES:()=>I,cycleMapType:()=>yn,initialMapContent:()=>vn,mapTypeLabel:()=>hn,sanitizeContent:()=>ae});var I=[\"roadmap\",\"satellite\",\"hybrid\"],ie=[46.6,2.5],se=6;function T(e){let n=Number(e);return Number.isFinite(n)?n:null}function re(e){if(!Array.isArray(e))return null;let n=T(e[0]),t=T(e[1]);return n!=null&&t!=null?[n,t]:null}var oe=(e,n,t)=>Math.max(n,Math.min(t,e));function ae(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=re(n.position);if(!t)return null;let r=n.pov&&typeof n.pov==\"object\"?n.pov:null,o=r?{heading:T(r.heading)||0,pitch:oe(T(r.pitch)||0,-90,90)}:{heading:0,pitch:0};return{kind:\"streetview\",position:t,pov:o,zoom:oe(T(n.zoom)||1,0,5)}}return n.kind!==\"map\"?null:{kind:\"map\",center:re(n.center)||[...ie],zoom:oe(Math.trunc(T(n.zoom)||se),1,21),marker:re(n.marker),mapType:I.includes(n.mapType)?n.mapType:null,label:String(n.label||\"\").slice(0,160)||null}}function yn(e){let n=I.indexOf(e);return I[(n+1)%I.length]}function hn(e){return e===\"roadmap\"?\"\\u{1F6F0} Satellite\":e===\"satellite\"?\"\\u{1F5FA} Hybride\":\"\\u{1F5FA} Plan\"}function vn(){return{kind:\"map\",center:[...ie],zoom:se,marker:null,mapType:null,label:null}}var D={};v(D,{CURRENT_PAGE_MARGIN:()=>En,DEFAULT_ASPECT:()=>_n,MAX_ZOOM:()=>xn,MIN_PAGE_WIDTH:()=>Tn,MIN_ZOOM:()=>Mn,PRERENDER_MARGIN:()=>wn,arrowState:()=>Rn,averageColor:()=>An,clampPage:()=>Le,clampZoom:()=>Sn,fitWidth:()=>Pn,isImageDocument:()=>Cn,progressPercent:()=>kn});var Mn=.5,xn=3,_n=1.35,Tn=280,wn=\"500px 0px\",En=\"-48% 0px -48% 0px\";function Sn(e){let n=Math.round((Number(e)||0)*10)/10;return Math.max(.5,Math.min(3,n))}function Le(e,n){return Math.max(1,Math.min(n||1,Number(e)||1))}function kn(e,n){return n?Math.round(Le(e,n)/n*100):0}function Rn(e,n){return{prevDisabled:e<=1,nextDisabled:!!n&&e>=n}}var In=28;function Pn(e){var a;let n=(a=e.zoom)!=null?a:1,t=Math.max(280,e.containerWidth||900)*n;if(!e.onePage)return t;let r=e.aspect||1.35,s=((e.containerHeight||600)-In-(e.overlap||0)-(e.reserve||0))/r;return s>120?Math.min(t,s):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 s=0;s<e.length;s+=4)t+=e[s],r+=e[s+1],o+=e[s+2];return`rgb(${Math.round(t/n)},${Math.round(r/n)},${Math.round(o/n)})`}function Cn(e,n){return/[.](png|jpe?g|webp|gif|avif)($|[?])/i.test(String(e||n||\"\"))}var W={};v(W,{presentationTransition:()=>Ln,switchDocUrl:()=>On});function Ln(e,n={}){if(!e)return[{kind:\"nothing\"}];if(e.active===!1)return[{kind:\"ended\"}];let t=ae(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 On(e,n){let t=encodeURIComponent(n||String(Date.now()));return`${e}${e.includes(\"?\")?\"&\":\"?\"}v=${t}`}return Ve(Nn);})();", SOURCE_HASH: "23da6b6df4f91661" };
7
+ module.exports = { PLAYER_BROWSER_JS: "\"use strict\";var Player=(()=>{var C=Object.defineProperty,$e=Object.defineProperties,He=Object.getOwnPropertyDescriptor,Ue=Object.getOwnPropertyDescriptors,De=Object.getOwnPropertyNames,he=Object.getOwnPropertySymbols;var ve=Object.prototype.hasOwnProperty,We=Object.prototype.propertyIsEnumerable;var ye=(e,n,t)=>n in e?C(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,B=(e,n)=>{for(var t in n||(n={}))ve.call(n,t)&&ye(e,t,n[t]);if(he)for(var t of he(n))We.call(n,t)&&ye(e,t,n[t]);return e},Me=(e,n)=>$e(e,Ue(n));var v=(e,n)=>{for(var t in n)C(e,t,{get:n[t],enumerable:!0})},Ve=(e,n,t,r)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let o of De(n))!ve.call(e,o)&&o!==t&&C(e,o,{get:()=>n[o],enumerable:!(r=He(n,o))||r.enumerable});return e};var Fe=e=>Ve(C({},\"__esModule\",{value:!0}),e);var Un={};v(Un,{bridge:()=>L,cadence:()=>N,chat:()=>H,live:()=>$,presentation:()=>U,presentationState:()=>W,tracking:()=>O,viewer:()=>D});var L={};v(L,{onHostMessage:()=>Qe,onPlayerMessage:()=>Xe,parseHostMessage:()=>Te,parsePlayerMessage:()=>_e,sendToHost:()=>Ye,sendToPlayer:()=>Ze,toWire:()=>Y});var K=\"3dd-doc-\",ze=/^[A-Za-z0-9_-]{1,64}$/,je=[\"close\",\"share\",\"embed-ready\",\"present-left\",\"present-denied\"],Ge=[\"embed-denied\"],Be=[\"present-invite\",\"present-handover\",\"present-switch\"],Ke=[\"handover-done\"];function Y(e){let n={type:K+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 xe(e,n,t){if(!e||typeof e!=\"object\")return null;let r=e.type;if(typeof r!=\"string\"||!r.startsWith(K))return null;let o=r.slice(K.length);if(n.includes(o))return{type:o};if(Ge.includes(o)){let a=e.reason;return{type:o,reason:/^[a-z-]{1,40}$/.test(String(a||\"\"))?String(a):\"unknown\"}}if(!t.includes(o))return null;let s=e.slug;return typeof s!=\"string\"||!ze.test(s)?null:{type:o,slug:s}}function _e(e){return xe(e,je,Be)}function Te(e){return xe(e,Ke,[])}function Ye(e,n){try{let t=n||(typeof window!=\"undefined\"?window.parent:null);t&&t.postMessage(Y(e),\"*\")}catch(t){}}function Ze(e,n){var t;try{(t=e==null?void 0:e.contentWindow)==null||t.postMessage(Y(n),\"*\")}catch(r){}}function qe(e,n){var r;if(!e)return!0;let t=(r=e.contentWindow)!=null?r:e;return n===t}function Xe(e,n,t){let r=n||(typeof window!=\"undefined\"?window:null);if(!r)return()=>{};let o=s=>{if(!qe(t,s.source))return;let a=_e(s.data);a&&e(a)};return r.addEventListener(\"message\",o),()=>r.removeEventListener(\"message\",o)}function Qe(e,n){var s;let t=n||(typeof window!=\"undefined\"?window:null);if(!t)return()=>{};let r=(s=t.parent)!=null?s:null,o=a=>{if(!r||r===t||a.source!==r)return;let l=Te(a.data);l&&e(l)};return t.addEventListener(\"message\",o),()=>t.removeEventListener(\"message\",o)}var O={};v(O,{createTracker:()=>sn});var N={};v(N,{PRESENTER_ACTIONS_PER_HOUR:()=>Q,PRESENT_QUOTA_PER_HOUR:()=>nn,PRESENT_READS_PER_HOUR:()=>ke,PRESENT_READ_BURST:()=>Re,PRESENT_RESYNC_MS:()=>Ee,PRESENT_SIGNAL_BUDGET_PER_HOUR:()=>en,PRESENT_WRITE_TIMEOUT_MS:()=>J,READERS_PER_EGRESS:()=>q,RESYNC_READS_PER_HOUR:()=>Se,SESSION_IDLE_MS:()=>X,SESSION_INTERVAL_MS:()=>Z,SESSION_QUOTA_PER_HOUR:()=>Je,SESSION_WRITES_PER_HOUR:()=>we});var Z=12e3,we=Math.ceil(300),q=25,Je=we*q,X=18e4,Ee=25e3,Se=Math.ceil(36e5/Ee),Q=720,ke=Se+Q,en=Q,Re=20,nn=(ke+Re)*q,J=1e4;var tn=[\"mousemove\",\"mousedown\",\"keydown\",\"wheel\",\"touchstart\",\"pointerdown\"];function rn(){let e=typeof globalThis!=\"undefined\"?globalThis.crypto:void 0;if(e&&typeof e.randomUUID==\"function\")return e.randomUUID().replace(/-/g,\"\");if(e&&typeof e.getRandomValues==\"function\"){let n=e.getRandomValues(new Uint8Array(16));return Array.from(n,t=>t.toString(16).padStart(2,\"0\")).join(\"\")}return Math.random().toString(36).slice(2)+Date.now().toString(36)}function on(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 sn(e={}){var me,ge;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\",s=(me=e.idleMs)!=null?me:X,a=(ge=e.sessionEveryMs)!=null?ge:12e3,l=e.slug||\"\",p=e.internal||null,m=e.sessionId||rn(),b=e.send||on(o,n),f={},u=0,h=0,c=0,M=0,y=null,w=r(),E=!1,V=!1,P=[],Oe=()=>!!l||!!p,ue=i=>{if(Oe())try{b(i)}catch(d){}},F=()=>!!t&&t.visibilityState===\"visible\"&&!E,ce=i=>{let d=r()-i,x=Math.max(0,w-i)+s;return Math.max(0,Math.min(d,x))},z=()=>{y!=null&&u>0&&(f[u]=(f[u]||0)+ce(y)/1e3),y=F()?r():null},de=()=>{z(),y=null},j=()=>{y==null&&F()&&(y=r())},G=()=>{let i=0;for(let d in f)i+=f[d];return y!=null&&(i+=ce(y)/1e3),Math.round(i)},pe=()=>{let i={};for(let d in f)i[d]=Math.round(f[d]);return i},S=()=>{w=r(),E&&(E=!1,j())},fe=(i,d)=>{p||ue({slug:l,event:i,page:d||h,maxPage:c,seconds:G(),sessionId:m})},A=()=>{z();let i={event:\"session\",sessionId:m,numPages:M,maxPage:c,totalSeconds:G(),pagesTime:pe()};p?(i.internal=!0,i.docId=p.docId,i.email=p.email,i.name=p.name,p.it&&(i.it=p.it)):i.slug=l,ue(i)},k=(i,d,x,be)=>{!i||typeof i.addEventListener!=\"function\"||(i.addEventListener(d,x,be),P.push(()=>{i.removeEventListener(d,x,be)}))};return{sessionId:m,totalSeconds:G,maxPage:()=>c,pageTimes:pe,start(){if(V)return;V=!0,fe(\"open\",1),u=1,w=r(),y=F()?r():null,k(t,\"visibilitychange\",()=>{t.visibilityState===\"hidden\"?(de(),A()):(S(),j())}),k(n,\"focus\",()=>{S(),j()});for(let x of tn)k(n,x,S,{passive:!0});k(e.scrollElement,\"scroll\",S,{passive:!0}),k(n,\"beforeunload\",A);let i=n.setInterval(()=>{!E&&r()-w>s&&(E=!0,de())},5e3),d=n.setInterval(A,a);P.push(()=>{n.clearInterval(i),n.clearInterval(d)})},setPage(i){!i||i===h||(w=r(),z(),u=i,h=i,i>c&&(c=i,fe(\"page\",i)))},setPageCount(i){M=i||0},noteActivity:S,flush:A,stop(){for(;P.length;){let i=P.pop();try{i==null||i()}catch(d){}}V=!1}}}var $={};v($,{STORAGE_KEYS:()=>R,attendeeKey:()=>cn,authorToken:()=>dn,avatarHtml:()=>ee,canModerate:()=>re,createBudget:()=>hn,createScheduler:()=>gn,escapeHtml:()=>g,fetchBorne:()=>bn,flattenPresence:()=>an,formatMessageBody:()=>ne,initials:()=>Ie,isMentioned:()=>pn,isMine:()=>_,reactorId:()=>te,shouldNotify:()=>fn,unreadLabel:()=>mn});var R={attendeeKey:\"3dd-present-attkey\",authorToken:\"3dd-present-authtoken\",chatMuted:\"3dd-present-mute\"};function g(e){return String(e==null?\"\":e).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\")}function Ie(e){let n=(e||\"?\").trim().split(/\\s+/);return(((n[0]||\"\")[0]||\"?\")+((n[1]||\"\")[0]||\"\")).toUpperCase()}function ee(e,n){return e?`<img src=\"${g(e)}\" alt=\"\">`:g(Ie(n))}function ne(e){let n=g(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 an(e){let n={},t=[];for(let r in e||{})for(let o of(e||{})[r]||[]){let s=String(o.uid||o.email||o.name||\"\").toLowerCase()||`_${r}_${t.length}`;n[s]?o.role===\"presenter\"&&(n[s]=o):(n[s]=o,t.push(s))}return t.map(r=>n[r])}function ln(e,n){try{return e?e.getItem(n):null}catch(t){return null}}function un(e,n,t){try{e==null||e.setItem(n,t)}catch(r){}}function cn(e,n=\"anon\",t=Pe){try{if(!e)return`anon-${n}`;let r=e.getItem(R.attendeeKey);if(r)return r;let o=`anon-${t()}`;return e.setItem(R.attendeeKey,o),o}catch(r){return`anon-${n}`}}function Pe(){let e=typeof globalThis!=\"undefined\"?globalThis.crypto:void 0;if(e&&typeof e.randomUUID==\"function\")return e.randomUUID().replace(/-/g,\"\");if(e&&typeof e.getRandomValues==\"function\"){let n=e.getRandomValues(new Uint8Array(24));return Array.from(n,t=>t.toString(16).padStart(2,\"0\")).join(\"\")}try{console.warn(\"[player] crypto indisponible : jeton d'auteur affaibli\")}catch(n){}return Math.random().toString(36).slice(2)+Math.random().toString(36).slice(2)}function dn(e,n=Pe){let t=ln(e,R.authorToken);if(t)return t;let r=n();return un(e,R.authorToken,r),r}function te(e){return String(e&&(e.email||e.name)||\"\").toLowerCase()}function _(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 re(e){return!!(e&&e.role===\"presenter\")}function pn(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}`)&&!_(e,n):!1}function fn(e){let{msg:n,me:t,historyLoaded:r,chatHidden:o}=e;return!r||!n||n.deleted||_(n,t)?!1:o}function mn(e){return!e||e<=0?\"\":e>9?\"9+\":String(e)}function gn(e,n={}){var h;let t=(h=n.minMs)!=null?h:300,r=n.now||(()=>Date.now()),o=n.setTimer||((c,M)=>setTimeout(c,M)),s=n.clearTimer||(c=>clearTimeout(c)),a=!1,l=!1,p=-1/0,m=null,b=!1;function f(){if(b||a){l=!0;return}let c=t-(r()-p);if(c>0){u(c);return}a=!0,l=!1,p=r();let M=!1;e(()=>{M||(M=!0,a=!1,l&&!b&&f())})}function u(c){b||m!==null||(m=o(()=>{m=null,f()},Math.max(0,c)))}return{signaler(){b||f()},maintenant(){b||(p=-1/0,f())},arreter(){b=!0,m!==null&&(s(m),m=null)}}}function bn(e,n,t=J,r={}){let o=r.fetch||(typeof fetch==\"function\"?fetch:void 0);if(!o)return Promise.reject(new Error(\"fetch indisponible\"));let s=r.setTimer||((u,h)=>setTimeout(u,h)),a=r.clearTimer||(u=>clearTimeout(u)),l=null;try{l=new AbortController}catch(u){}let p=l?Me(B({},n||{}),{signal:l.signal}):B({},n||{}),m=null,b=new Promise((u,h)=>{m=s(()=>{try{l==null||l.abort()}catch(c){}h(new Error(\"delai\"))},t)}),f=()=>{try{a(m)}catch(u){}};return Promise.race([o(e,p),b]).then(u=>(f(),u),u=>{throw f(),u})}function hn(e){let n=e.now||(()=>Date.now()),t=Math.max(1,e.rafale),r=t,o=n();return{prendre(){let s=n();return r=Math.min(t,r+(s-o)*e.parHeure/36e5),o=s,r<1?!1:(r-=1,!0)},restants:()=>r}}var H={};v(H,{messageClassName:()=>vn,renderActions:()=>Le,renderAttachment:()=>Ce,renderMessage:()=>yn,renderReactions:()=>Ae});function Ae(e,n){let t=e&&e.reactions||{},r=te(n),o=\"\";for(let s in t){let a=t[s]||[];if(!a.length)continue;let l=a.indexOf(r)>=0;o+=`<button class=\"re-chip${l?\" on\":\"\"}\" data-e=\"${g(s)}\">${g(s)} ${a.length}</button>`}return o}function Ce(e){if(!e||!e.url)return\"\";let n=g(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=g(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 Le(e,n){let t=_(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||re(n.me))&&(r+='<button class=cm-del-btn title=\"Supprimer\">\\u{1F5D1}</button>'),r}function yn(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>${g(e.reply_name||\"\")}</b> ${g(e.reply_text||\"\")}</div>`:\"\",r=e.edited?\" <span class=cm-ed>(modifi\\xE9)</span>\":\"\",o=e.body?`<div class=txt>${ne(e.body)}${r}</div>`:\"\",s=e.is_presenter?\" <span class=tag>pr\\xE9sentateur</span>\":\"\";return`<span class=a>${ee(e.author_avatar,e.author_name)}</span><span class=b><div class=who><b>${g(e.author_name||\"Invit\\xE9\")}</b>${s}</div>`+t+o+Ce(e.attachment)+`<div class=cm-re>${Ae(e,n.me)}</div></span><span class=cm-act>${Le(e,n)}</span>`}function vn(e,n,t){return\"cm\"+(_(e,n)?\" me\":\"\")+(e.deleted?\" isdel\":\"\")+(t?\" mentioned\":\"\")}var U={};v(U,{DEFAULT_CENTER:()=>se,DEFAULT_ZOOM:()=>ae,MAP_TYPES:()=>I,cycleMapType:()=>Mn,initialMapContent:()=>_n,mapTypeLabel:()=>xn,sanitizeContent:()=>le});var I=[\"roadmap\",\"satellite\",\"hybrid\"],se=[46.6,2.5],ae=6;function T(e){let n=Number(e);return Number.isFinite(n)?n:null}function oe(e){if(!Array.isArray(e))return null;let n=T(e[0]),t=T(e[1]);return n!=null&&t!=null?[n,t]:null}var ie=(e,n,t)=>Math.max(n,Math.min(t,e));function le(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=oe(n.position);if(!t)return null;let r=n.pov&&typeof n.pov==\"object\"?n.pov:null,o=r?{heading:T(r.heading)||0,pitch:ie(T(r.pitch)||0,-90,90)}:{heading:0,pitch:0};return{kind:\"streetview\",position:t,pov:o,zoom:ie(T(n.zoom)||1,0,5)}}return n.kind!==\"map\"?null:{kind:\"map\",center:oe(n.center)||[...se],zoom:ie(Math.trunc(T(n.zoom)||ae),1,21),marker:oe(n.marker),mapType:I.includes(n.mapType)?n.mapType:null,label:String(n.label||\"\").slice(0,160)||null}}function Mn(e){let n=I.indexOf(e);return I[(n+1)%I.length]}function xn(e){return e===\"roadmap\"?\"\\u{1F6F0} Satellite\":e===\"satellite\"?\"\\u{1F5FA} Hybride\":\"\\u{1F5FA} Plan\"}function _n(){return{kind:\"map\",center:[...se],zoom:ae,marker:null,mapType:null,label:null}}var D={};v(D,{CURRENT_PAGE_MARGIN:()=>Rn,DEFAULT_ASPECT:()=>En,MAX_ZOOM:()=>wn,MIN_PAGE_WIDTH:()=>Sn,MIN_ZOOM:()=>Tn,PRERENDER_MARGIN:()=>kn,arrowState:()=>An,averageColor:()=>Nn,clampPage:()=>Ne,clampZoom:()=>In,fitWidth:()=>Ln,isImageDocument:()=>On,progressPercent:()=>Pn});var Tn=.5,wn=3,En=1.35,Sn=280,kn=\"500px 0px\",Rn=\"-48% 0px -48% 0px\";function In(e){let n=Math.round((Number(e)||0)*10)/10;return Math.max(.5,Math.min(3,n))}function Ne(e,n){return Math.max(1,Math.min(n||1,Number(e)||1))}function Pn(e,n){return n?Math.round(Ne(e,n)/n*100):0}function An(e,n){return{prevDisabled:e<=1,nextDisabled:!!n&&e>=n}}var Cn=28;function Ln(e){var a;let n=(a=e.zoom)!=null?a:1,t=Math.max(280,e.containerWidth||900)*n;if(!e.onePage)return t;let r=e.aspect||1.35,s=((e.containerHeight||600)-Cn-(e.overlap||0)-(e.reserve||0))/r;return s>120?Math.min(t,s):t}function Nn(e){let n=e.length/4;if(!n)return\"rgb(0,0,0)\";let t=0,r=0,o=0;for(let s=0;s<e.length;s+=4)t+=e[s],r+=e[s+1],o+=e[s+2];return`rgb(${Math.round(t/n)},${Math.round(r/n)},${Math.round(o/n)})`}function On(e,n){return/[.](png|jpe?g|webp|gif|avif)($|[?])/i.test(String(e||n||\"\"))}var W={};v(W,{presentationTransition:()=>$n,switchDocUrl:()=>Hn});function $n(e,n={}){if(!e)return[{kind:\"nothing\"}];if(e.active===!1)return[{kind:\"ended\"}];let t=le(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 Hn(e,n){let t=encodeURIComponent(n||String(Date.now()));return`${e}${e.includes(\"?\")?\"&\":\"?\"}v=${t}`}return Fe(Un);})();", SOURCE_HASH: "5d92c853f7d8ba79" };
package/server/handler.js CHANGED
@@ -474,41 +474,36 @@ var Live=(function(){
474
474
  // Et à l'inverse, des signaux un peu plus espacés produisaient une requête chacun, POUR
475
475
  // CHAQUE SPECTATEUR : le canal public devenait un amplificateur vers l'API.
476
476
  // Détail et propriétés : src/live.ts + src/__tests__/ordonnanceur.test.ts. (audit P0-2)
477
- // UNE REQUÊTE QUI NE REVIENT PAS BLOQUE TOUT CE QUI L'ATTEND.
477
+ // ⚠️ LE BUDGET GATE LE SIGNAL, JAMAIS LE FILET ET C'EST TOUTE LA DIFFÉRENCE.
478
478
  //
479
- // ⚠️ Ce risque est d'un correctif. Avant 0.1.41 l'ordonnanceur appelait « fini() » tout de
480
- // suite : le désordre était possible, le blocage non. En rendant les écritures séquentielles on a
481
- // échangé un défaut de correction contre un risque de disponibilité — une requête suspendue ne
482
- // règle jamais sa promesse, la file ne repart pas, et le présentateur pilote dans le vide sans
483
- // qu'aucun message ne le dise. Un navigateur ne garantit aucun délai de son côté.
479
+ // « signaler() » est déclenché par le canal, donc par n'importe quel participant : c'est la
480
+ // porte par laquelle un diffuseur hostile faisait relire toute une salle jusqu'au quota, et
481
+ // au-delà. On la rationne.
484
482
  //
485
- // ⚠️ Ce que ça restaure : la VIVACITÉ. Pas l'ORDRE une requête abandonnée peut être arrivée au
486
- // serveur et atterrir après celle qui l'a remplacée. L'ordre malgré un abandon demande un numéro
487
- // de version porté par l'écriture, et c'est le chantier de la file unique.
483
+ // « maintenant() » est le filet périodique, déclenché par NOUS toutes les 25 s. Le rationner
484
+ // rendrait une audience à budget épuisé définitivement muette on aurait remplacé un déni de
485
+ // service venu du dehors par un déni de service maison. C'est le plancher : quoi qu'il arrive,
486
+ // l'audience finit toujours par se resynchroniser.
488
487
  //
489
- // L'abandon est BEST-EFFORT : sans AbortController on laisse la requête vivre, on cesse seulement
490
- // de l'attendre. Rendre la main compte plus que couper le fil.
491
- function fetchBorne(url,opts,ms){
492
- var limite=ms||(window.Player&&Player.cadence&&Player.cadence.PRESENT_WRITE_TIMEOUT_MS)||10000;
493
- var ctl=null; try{ ctl=new AbortController(); }catch(e){}
494
- var o=opts||{};
495
- if(ctl){ o=Object.assign({},o); o.signal=ctl.signal; }
496
- var minuteur=null;
497
- var expiration=new Promise(function(_,ko){
498
- minuteur=setTimeout(function(){ try{ if(ctl)ctl.abort(); }catch(e){} ko(new Error('delai')); },limite);
499
- });
500
- function rendreLaMain(v,echec){ try{ clearTimeout(minuteur); }catch(e){} if(echec)throw v; return v; }
501
- return Promise.race([fetch(url,o),expiration])
502
- .then(function(r){return rendreLaMain(r,false);},function(e){return rendreLaMain(e,true);});
503
- }
488
+ // Refuser un signal ne perd donc rien : la relecture suivante lira l'état le plus récent. On
489
+ // arrive en retard, jamais à côté.
504
490
  function relireAvec(url,applique){
505
- return Player.live.createScheduler(function(fini){
506
- fetchBorne('/api/doc?present='+encodeURIComponent(SLUG)+url)
491
+ var ord=Player.live.createScheduler(function(fini){
492
+ Player.live.fetchBorne('/api/doc?present='+encodeURIComponent(SLUG)+url)
507
493
  .then(function(r){return r.json();})
508
494
  .then(function(d){if(d&&d.ok)applique(d);})
509
495
  .catch(function(){})
510
496
  .then(fini,fini);
511
497
  },{minMs:400});
498
+ var budget=Player.live.createBudget({
499
+ parHeure:Player.cadence.PRESENT_SIGNAL_BUDGET_PER_HOUR,
500
+ rafale:Player.cadence.PRESENT_READ_BURST,
501
+ });
502
+ return {
503
+ signaler:function(){ if(budget.prendre()) ord.signaler(); },
504
+ maintenant:function(){ ord.maintenant(); },
505
+ arreter:function(){ ord.arreter(); },
506
+ };
512
507
  }
513
508
  var _ordEtat=relireAvec('&state=1',function(d){if(d.state)etatDuServeur(d.state);});
514
509
  // ⚠️ Exposé hors de cette fermeture : la carte vit dans un AUTRE bloc de script et doit
@@ -31,7 +31,9 @@ __export(shared_exports, {
31
31
  PRESENTER_ACTIONS_PER_HOUR: () => PRESENTER_ACTIONS_PER_HOUR,
32
32
  PRESENT_QUOTA_PER_HOUR: () => PRESENT_QUOTA_PER_HOUR,
33
33
  PRESENT_READS_PER_HOUR: () => PRESENT_READS_PER_HOUR,
34
+ PRESENT_READ_BURST: () => PRESENT_READ_BURST,
34
35
  PRESENT_RESYNC_MS: () => PRESENT_RESYNC_MS,
36
+ PRESENT_SIGNAL_BUDGET_PER_HOUR: () => PRESENT_SIGNAL_BUDGET_PER_HOUR,
35
37
  PRESENT_WRITE_TIMEOUT_MS: () => PRESENT_WRITE_TIMEOUT_MS,
36
38
  READERS_PER_EGRESS: () => READERS_PER_EGRESS,
37
39
  RESYNC_READS_PER_HOUR: () => RESYNC_READS_PER_HOUR,
@@ -105,7 +107,9 @@ var PRESENT_RESYNC_MS = 25e3;
105
107
  var RESYNC_READS_PER_HOUR = Math.ceil(36e5 / PRESENT_RESYNC_MS);
106
108
  var PRESENTER_ACTIONS_PER_HOUR = 720;
107
109
  var PRESENT_READS_PER_HOUR = RESYNC_READS_PER_HOUR + PRESENTER_ACTIONS_PER_HOUR;
108
- var PRESENT_QUOTA_PER_HOUR = PRESENT_READS_PER_HOUR * READERS_PER_EGRESS;
110
+ var PRESENT_SIGNAL_BUDGET_PER_HOUR = PRESENTER_ACTIONS_PER_HOUR;
111
+ var PRESENT_READ_BURST = 20;
112
+ var PRESENT_QUOTA_PER_HOUR = (PRESENT_READS_PER_HOUR + PRESENT_READ_BURST) * READERS_PER_EGRESS;
109
113
  var PRESENT_WRITE_TIMEOUT_MS = 1e4;
110
114
  // Annotate the CommonJS export names for ESM import in node:
111
115
  0 && (module.exports = {
@@ -115,7 +119,9 @@ var PRESENT_WRITE_TIMEOUT_MS = 1e4;
115
119
  PRESENTER_ACTIONS_PER_HOUR,
116
120
  PRESENT_QUOTA_PER_HOUR,
117
121
  PRESENT_READS_PER_HOUR,
122
+ PRESENT_READ_BURST,
118
123
  PRESENT_RESYNC_MS,
124
+ PRESENT_SIGNAL_BUDGET_PER_HOUR,
119
125
  PRESENT_WRITE_TIMEOUT_MS,
120
126
  READERS_PER_EGRESS,
121
127
  RESYNC_READS_PER_HOUR,