All files / lib/awareness snapshot.ts

100% Statements 49/49
100% Branches 10/10
100% Functions 3/3
100% Lines 49/49

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 651x 1x                   1x 1x 1x 1x 1x 1x 1x   1x   1x 24x 24x   24x 24x 10x 10x 10x 10x 10x 10x 24x 4x 4x 24x 4x 4x   4x 4x 3x 3x 4x 24x 5x 5x 5x 24x 24x   1x 6x 6x   1x 1x 7x 7x 7x 7x 7x 7x  
// lib/awareness/snapshot.ts
import { AwarenessEvent, AwarenessEventPayload } from './events';
 
export interface SystemSnapshot {
  openWindows: string[];
  activeWindow: string | null;
  windowCount: number;
  lastEvent: AwarenessEvent | null;
  lastEventTimestamp: number | null;
}
 
const initialState: SystemSnapshot = {
  openWindows: [],
  activeWindow: null,
  windowCount: 0,
  lastEvent: null,
  lastEventTimestamp: null,
};
 
let snapshot: SystemSnapshot = { ...initialState };
 
export function updateSnapshot(event: AwarenessEventPayload): void {
  snapshot.lastEvent = event.type;
  snapshot.lastEventTimestamp = Date.now();
 
  switch (event.type) {
    case AwarenessEvent.WINDOW_OPENED:
      if (!snapshot.openWindows.includes(event.payload.windowId)) {
        snapshot.openWindows.push(event.payload.windowId);
        snapshot.windowCount = snapshot.openWindows.length;
      }
      snapshot.activeWindow = event.payload.windowId;
      break;
    case AwarenessEvent.WINDOW_FOCUSED:
      snapshot.activeWindow = event.payload.windowId;
      break;
    case AwarenessEvent.WINDOW_CLOSED:
      snapshot.openWindows = snapshot.openWindows.filter(
        id => id !== event.payload.windowId
      );
      snapshot.windowCount = snapshot.openWindows.length;
      if (snapshot.activeWindow === event.payload.windowId) {
        snapshot.activeWindow = snapshot.openWindows[snapshot.openWindows.length - 1] || null;
      }
      break;
    case AwarenessEvent.DESKTOP_LOADED:
        snapshot.windowCount = event.payload.openWindows;
        snapshot.activeWindow = event.payload.activeWindow;
        break;
  }
}
 
export function getSnapshot(): Readonly<SystemSnapshot> {
  return snapshot;
}
 
// This is for testing purposes to reset the state between tests.
export function resetSnapshot(): void {
    snapshot.openWindows = [];
    snapshot.activeWindow = null;
    snapshot.windowCount = 0;
    snapshot.lastEvent = null;
    snapshot.lastEventTimestamp = null;
}