/// <reference types="vite/client" />

declare const __APP_VERSION__: string;

declare module 'browser-encrypt-attachment' {
  export interface EncryptedAttachmentInfo {
    v: string;
    key: {
      alg: string;
      key_ops: string[];
      kty: string;
      k: string;
      ext: boolean;
    };
    iv: string;
    hashes: {
      [alg: string]: string;
    };
  }

  export interface EncryptedAttachment {
    data: ArrayBuffer;
    info: EncryptedAttachmentInfo;
  }

  export function encryptAttachment(dataBuffer: ArrayBuffer): Promise<EncryptedAttachment>;

  export function decryptAttachment(
    dataBuffer: ArrayBuffer,
    info: EncryptedAttachmentInfo
  ): Promise<ArrayBuffer>;
}

declare module '*.svg' {
  const content: string;
  export default content;
}

// opus-recorder ships no types. We only touch a small slice of the API: the
// constructor config, start/stop, and the data/stop callbacks. See
// docs/plans/voice_messages.md §3 (Phase 2).
declare module 'opus-recorder' {
  export interface OpusRecorderConfig {
    encoderPath?: string;
    sourceNode?: MediaStreamAudioSourceNode;
    encoderSampleRate?: number;
    numberOfChannels?: number;
    encoderApplication?: number;
    encoderBitRate?: number;
    encoderFrameSize?: number;
    maxFramesPerPage?: number;
    resampleQuality?: number;
    streamPages?: boolean;
    mediaTrackConstraints?: boolean | MediaTrackConstraints;
  }

  export default class Recorder {
    constructor(config?: OpusRecorderConfig);

    ondataavailable: ((data: Uint8Array) => void) | null;

    onstart: (() => void) | null;

    onstop: (() => void) | null;

    start(): Promise<void>;

    stop(): Promise<void>;

    readonly audioContext?: AudioContext;
  }
}
