declare module "zklib-js" {
  export = ZKLibClass;
  interface ZKUserInfo {
    uid?: number;
    userId?: string;
    name?: string;
    role?: number;
    cardNumber?: number;
    password?: string;
  }
  interface ZKAttendanceLog {
    userSn?: number;
    deviceUserId: number | string;
    recordTime: string; // date-as-string from the device
    ip?: string;
    type?: number;
    state?: number;
  }
  interface ZKInfo {
    serialNumber?: string;
    deviceName?: string;
    userCounts?: number;
    logCapacity?: number;
    logCounts?: number;
    [key: string]: unknown;
  }
  declare class ZKLibClass {
    constructor(ip: string, port: number, timeout?: number, inport?: number);
    createSocket(cbErr?: () => void, cbClose?: () => void): Promise<void>;
    connect(): Promise<void>;
    disconnect(): Promise<void>;
    getInfo(): Promise<ZKInfo>;
    getUsers(): Promise<{ data: ZKUserInfo[] }>;
    getAttendances(cb?: (err: Error | null, logs: ZKAttendanceLog[]) => void): Promise<{ data: ZKAttendanceLog[] }>;
    getSocketStatus(): Promise<number>;
    [key: string]: unknown;
  }
}
