const OPENS_PER_WINDOW = 30; const WINDOW_MS = 60 * 1000; /** Read-only viewers may open files, but not churn the shared doc for every writer at will. */ export class ReadonlyOpenLimiter { private readonly windows = new WeakMap(); allow(socket: object, now = Date.now()): boolean { const current = this.windows.get(socket); const window = current && now - current.since < WINDOW_MS ? current : { count: 0, since: now }; window.count++; this.windows.set(socket, window); return window.count <= OPENS_PER_WINDOW; } }