# 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;
    }