UNPKG

eufy-security-client

Version:

Client to comunicate with Eufy-Security devices

389 lines (388 loc) 12.2 kB
import * as NodeRSA from "node-rsa"; import { Readable } from "stream"; import { SortedMap } from "sweet-collections"; import { AlarmMode, DeviceType, MicStatus, ParamType, TriggerType, VideoType } from "../http/types"; import { Address, CmdCameraInfoResponse, CommandResult, CustomData, StorageInfoBodyHB3 } from "./models"; import { TalkbackStream } from "./talkback"; import { AlarmEvent, AudioCodec, CommandType, DatabaseReturnCode, IndoorSoloSmartdropCommandType, P2PDataType, SmartSafeAlarm911Event, SmartSafeShakeAlarmEvent, P2PStorageType, TFCardStatus, VideoCodec, InternalP2PCommandType } from "./types"; export interface P2PClientProtocolEvents { "alarm mode": (mode: AlarmMode) => void; "camera info": (cameraInfo: CmdCameraInfoResponse) => void; "connect": (address: Address) => void; "close": () => void; "command": (result: CommandResult) => void; "download started": (channel: number, metadata: StreamMetadata, videoStream: Readable, audioStream: Readable) => void; "download finished": (channel: number) => void; "livestream started": (channel: number, metadata: StreamMetadata, videoStream: Readable, audioStream: Readable) => void; "livestream stopped": (channel: number) => void; "livestream error": (channel: number, error: Error) => void; "wifi rssi": (channel: number, rssi: number) => void; "rtsp url": (channel: number, rtspUrl: string) => void; "parameter": (channel: number, param: number, value: string) => void; "timeout": () => void; "runtime state": (channel: number, batteryLevel: number, temperature: number) => void; "charging state": (channel: number, chargeType: number, batteryLevel: number) => void; "rtsp livestream started": (channel: number) => void; "rtsp livestream stopped": (channel: number) => void; "floodlight manual switch": (channel: number, enabled: boolean) => void; "alarm delay": (alarmDelayEvent: AlarmEvent, alarmDelay: number) => void; "alarm armed": () => void; "alarm event": (alarmEvent: AlarmEvent) => void; "talkback started": (channel: number, talkbackStream: TalkbackStream) => void; "talkback stopped": (channel: number) => void; "talkback error": (channel: number, error: Error) => void; "secondary command": (result: CommandResult) => void; "jammed": (channel: number) => void; "low battery": (channel: number) => void; "shake alarm": (channel: number, detail: SmartSafeShakeAlarmEvent) => void; "911 alarm": (channel: number, detail: SmartSafeAlarm911Event) => void; "wrong try-protect alarm": (channel: number) => void; "sd info ex": (sdStatus: TFCardStatus, sdCapacity: number, sdCapacityAvailable: number) => void; "image download": (file: string, image: Buffer) => void; "tfcard status": (channel: number, status: TFCardStatus) => void; "database query latest": (returnCode: DatabaseReturnCode, data: Array<DatabaseQueryLatestInfo>) => void; "database query local": (returnCode: DatabaseReturnCode, data: Array<DatabaseQueryLocal>) => void; "database count by date": (returnCode: DatabaseReturnCode, data: Array<DatabaseCountByDate>) => void; "database delete": (returnCode: DatabaseReturnCode, failedIds: Array<unknown>) => void; "sensor status": (channel: number, status: number) => void; "garage door status": (channel: number, doorId: number, status: number) => void; "storage info hb3": (channel: number, storageInfo: StorageInfoBodyHB3) => void; "sequence error": (channel: number, command: number, sequence: number, serialnumber: string) => void; } export interface P2PQueueMessage { p2pCommandType: InternalP2PCommandType; p2pCommand: P2PCommand; nestedCommandType?: CommandType; nestedCommandType2?: number; timestamp: number; customData?: CustomData; } export interface P2PMessageState { sequence: number; commandType: CommandType; nestedCommandType?: CommandType | IndoorSoloSmartdropCommandType | ParamType; nestedCommandType2?: number; channel: number; data: Buffer; retries: number; acknowledged: boolean; returnCode?: number; retryTimeout?: NodeJS.Timeout; timeout?: NodeJS.Timeout; customData?: CustomData; } export interface P2PMessageParts { [index: number]: Buffer; } export interface P2PMessage { bytesToRead: number; type: P2PDataType; seqNo: number; data: Buffer; } export interface P2PDataHeader { commandId: number; bytesToRead: number; channel: number; signCode: number; type: number; } export interface P2PDataMessage extends P2PDataHeader { seqNo: number; dataType: P2PDataType; data: Buffer; } export interface P2PDataMessageBuilder { header: P2PDataHeader; bytesRead: number; messages: P2PMessageParts; } export interface P2PDataMessageState { leftoverData: Buffer; queuedData: SortedMap<number, P2PMessage>; rsaKey: NodeRSA | null; videoStream: Readable | null; audioStream: Readable | null; invalidStream: boolean; p2pStreaming: boolean; p2pStreamNotStarted: boolean; p2pStreamChannel: number; p2pStreamFirstAudioDataReceived: boolean; p2pStreamFirstVideoDataReceived: boolean; p2pStreamMetadata: StreamMetadata; p2pStreamingTimeout?: NodeJS.Timeout; rtspStream: { [index: number]: boolean; }; rtspStreaming: { [index: number]: boolean; }; waitForSeqNoTimeout?: NodeJS.Timeout; waitForAudioData?: NodeJS.Timeout; receivedFirstIFrame: boolean; preFrameVideoData: Buffer; p2pTalkback: boolean; p2pTalkbackChannel: number; } export interface P2PDataMessageVideo { streamType: number; videoSeqNo: number; videoFPS: number; videoWidth: number; videoHeight: number; videoTimestamp: number; videoDataLength: number; aesKey: string; } export interface P2PDataMessageAudio { audioType: number; audioSeqNo: number; audioTimestamp: number; audioDataLength: number; } export interface StreamMetadata { videoCodec: VideoCodec; videoFPS: number; videoWidth: number; videoHeight: number; audioCodec: AudioCodec; } export interface DeviceSerial { [index: number]: { sn: string; adminUserId: string; }; } export interface P2PCommand { commandType: CommandType; value?: number | string; valueSub?: number; strValue?: string; strValueSub?: string; channel?: number; } export interface P2PVideoMessageState { sequence: number; channel: number; data: Buffer; retries: number; timeout?: NodeJS.Timeout; } export interface P2PDatabaseQueryLatestInfoResponse { device_sn: string; payload: { event_count: number; crop_hb3_path: string; crop_cloud_path: string; }; } export interface P2PDatabaseCountByDateResponse { days: string; count: number; } export interface P2PDatabaseQueryLocalHistoryRecordInfo { record_id: number; account: string; station_sn: string; device_sn: string; device_type: DeviceType; start_time: string; end_time: string; frame_num: number; storage_type: P2PStorageType; storage_cloud: boolean; cipher_id: number; vision: number; video_type: VideoType; has_lock: boolean; automation_id: number; trigger_type: TriggerType; push_mode: number; mic_status: MicStatus; res_change: number; res_best_width: number; res_best_height: number; self_learning: number; int_reserve: number; int_extra: number; storage_path: string; thumb_path: string; write_status: number; str_extra: string; cloud_path: string; folder_size: number; storage_status: number; storage_label: string; time_zone: string; mp4_cloud: string; snapshot_cloud: string; table_version: string; update_time: string; } export interface P2PDatabaseQueryLocalRecordCropPictureInfo { picture_id: number; record_id: number; station_sn: string; device_sn: string; detection_type: number; person_id: number; crop_path: string; event_time: string; str_reserve: string; person_recog_flag: boolean; crop_pic_quality: number; pic_marking_flag: boolean; group_id: number; int_reserve: number; crop_id: number; start_time: string; reserve2_int: number; reserve2_date: string; reserve2_string: string; storage_type: P2PStorageType; storage_status: number; storage_label: string; table_version: string; update_time: string; } export interface P2PDatabaseQueryLocalResponse { payload: Array<P2PDatabaseQueryLocalHistoryRecordInfo> | Array<P2PDatabaseQueryLocalRecordCropPictureInfo>; table_name: string; } export interface P2PDatabaseDeleteResponse { failed_delete: Array<unknown>; } export interface P2PDatabaseResponse { data: Array<P2PDatabaseQueryLatestInfoResponse> | Array<P2PDatabaseCountByDateResponse> | Array<P2PDatabaseQueryLocalResponse> | P2PDatabaseDeleteResponse; start_id?: number; end_id?: number; count?: number; transaction: string; table: string; cmd: number; mIntRet: DatabaseReturnCode; version: string; msg: string; } export interface DatabaseQueryLatestInfoBase { device_sn: string; event_count: number; } export interface DatabaseQueryLatestInfoCloud extends DatabaseQueryLatestInfoBase { crop_cloud_path: string; } export interface DatabaseQueryLatestInfoLocal extends DatabaseQueryLatestInfoBase { crop_local_path: string; } export type DatabaseQueryLatestInfo = DatabaseQueryLatestInfoCloud | DatabaseQueryLatestInfoLocal; export interface DatabaseCountByDate { day: Date; count: number; } export interface HistoryRecordInfo { device_type: DeviceType; account: string; start_time: Date; end_time: Date; frame_num: number; storage_type: P2PStorageType; storage_cloud: boolean; cipher_id: number; vision: number; video_type: VideoType; has_lock: boolean; automation_id: number; trigger_type: TriggerType; push_mode: number; mic_status: MicStatus; res_change: number; res_best_width: number; res_best_height: number; self_learning: number; storage_path: string; thumb_path: string; write_status: number; cloud_path: string; folder_size: number; storage_status: number; storage_label: string; time_zone: string; mp4_cloud: string; snapshot_cloud: string; table_version: string; } export interface CropPictureInfo { picture_id: number; detection_type: number; person_id: number; crop_path: string; event_time: Date | null; person_recog_flag: boolean; crop_pic_quality: number; pic_marking_flag: boolean; group_id: number; crop_id: number; start_time: Date; storage_type: P2PStorageType; storage_status: number; storage_label: string; table_version: string; update_time: string; } export interface DatabaseQueryLocal { record_id: number; station_sn: string; device_sn?: string; history: HistoryRecordInfo; picture: Array<CropPictureInfo>; } export interface RGBColor { red: number; green: number; blue: number; } export interface InternalColoredLighting { color: number; } export interface DynamicLighting { name: string; mode: number; speed: number; colors: Array<RGBColor>; } export interface InternalDynamicLighting { name: string; mode: number; id: number; speed: number; colors: Array<number>; } export interface MotionZonePoint { x: number; y: number; } export interface MotionZonePoints { points: Array<MotionZonePoint>; } export interface MotionZone { polygens: Array<MotionZonePoints>; } export interface VideoStreamingRecordingQuality { mode_0: { quality: number; }; mode_1: { quality: number; }; cur_mode: number; } export interface CrossTrackingGroupEntry { value: Array<string>; } export interface CustomDataType { [index: number]: { channel: number; customData: CustomData; timestamp: number; }; }