Skip to content
net.ts 2.75 KiB
Newer Older
export interface ServerToClientEvents {
  canvas: (pixels: string[]) => void;
  user: (user: AuthSession) => void;
  config: (config: ClientConfig) => void;
  pixel: (pixel: Pixel) => void;
  online: (count: { count: number }) => void;
Grant's avatar
Grant committed
  availablePixels: (count: number) => void;
  pixelLastPlaced: (time: number) => void;
Grant's avatar
Grant committed
  undo: (
    data: { available: false } | { available: true; expireAt: number }
  ) => void;

  /* --- subscribe events --- */

  /**
   * Emitted to room `sub:heatmap`
   * @param heatmap
   * @returns
   */
  heatmap: (heatmap: string) => void;
}

export interface ClientToServerEvents {
Grant's avatar
Grant committed
  place: (
    pixel: Pixel,
    bypassCooldown: boolean,
Grant's avatar
Grant committed
    ack: (
      _: PacketAck<
        Pixel,
        | "no_user"
        | "invalid_pixel"
        | "pixel_cooldown"
        | "palette_color_invalid"
        | "you_already_placed_that"
Grant's avatar
Grant committed
      >
    ) => void
  ) => void;
Grant's avatar
Grant committed
  undo: (ack: (_: PacketAck<{}, "no_user" | "unavailable">) => void) => void;
  subscribe: (topic: Subscription) => void;
  unsubscribe: (topic: Subscription) => void;
Grant's avatar
Grant committed
  x: number;
  y: number;
Grant's avatar
Grant committed

export interface IPaletteContext {
  color?: number;
Grant's avatar
Grant committed

export type Pixel = {
Grant's avatar
Grant committed
  x: number;
  y: number;
Grant's avatar
Grant committed
  /**
   * Palette color ID or -1 for nothing
   */
Grant's avatar
Grant committed
  color: number;
};

export type PalleteColor = {
  id: number;
  name: string;
  hex: string;
Grant's avatar
Grant committed
};

export type CanvasConfig = {
  size: [number, number];
  zoom: number;
Grant's avatar
Grant committed
  pixel: {
    maxStack: number;
    cooldown: number;
    multiplier: number;
  };
Grant's avatar
Grant committed
  undo: {
    /**
     * time in ms to allow undos
     */
    grace_period: number;
  };
Grant's avatar
Grant committed
};

export type ClientConfig = {
  /**
   * Monolith git hash, if it doesn't match, client will reload
   */
  version: string;
  pallete: {
    colors: PalleteColor[];
    pixel_cooldown: number;
  };
  canvas: CanvasConfig;
  chat: {
    enabled: boolean;
    /**
     * @example aftermath.gg
     */
    matrix_homeserver: string;
    /**
     * @example https://chat.fediverse.events
     */
    element_host: string;
    /**
     * URI encoded alias
     * @example %23canvas-general:aftermath.gg
     */
    general_alias: string;
Grant's avatar
Grant committed
};

Grant's avatar
Grant committed
/**
 * @template T the packet data
 * @template E union type of errors possible
 */
export type PacketAck<T, E = string> =
Grant's avatar
Grant committed
  | {
      success: true;
      data: T;
    }
Grant's avatar
Grant committed
  | { success: false; error: E };
Grant's avatar
Grant committed

export type AuthSession = {
  service: {
    software: {
      name: string;
      version: string;
Grant's avatar
Grant committed
      logo_uri?: string;
      repository?: string;
      homepage?: string;
Grant's avatar
Grant committed
    };
    instance: {
      hostname: string;
Grant's avatar
Grant committed
      logo_uri?: string;
      banner_uri?: string;
      name?: string;
Grant's avatar
Grant committed
    };
  };
  user: {
    username: string;
Grant's avatar
Grant committed
    picture_url?: string;
Grant's avatar
Grant committed
  };
};