5.1 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Overview
This is a TypeScript client library for controlling Eufy Security devices by connecting to Eufy cloud servers and local/remote stations over P2P. The library is published to npm as eufy-security-client.
Important: This project is NOT affiliated with Anker/Eufy Security. It is a personal project maintained in spare time.
Development Commands
Build
npm run build # Full build (compiles TypeScript)
npm run build:ts # TypeScript compilation + copy proto files
Development
npm run watch # Watch mode (auto-recompile on changes)
npm run watch:ts # Watch TypeScript files only
Linting
npm run lint # Run ESLint on TypeScript source files
Testing
Currently, there are no tests configured (npm test exits with error).
Architecture
Core Components
The library is organized into four major subsystems, each with its own directory:
-
HTTP API (
src/http/) - Eufy Cloud API communicationapi.ts: Main HTTPApi class handling authentication and cloud requestsdevice.ts: Device class hierarchy (Camera, Lock, Doorbell, Sensor types, etc.)station.ts: Station/Hub management- Uses encrypted API v2 communication with RSA/ECDH key exchange
- Handles authentication including 2FA and captcha
-
P2P Communication (
src/p2p/) - Direct peer-to-peer connection with stations/devicessession.ts: P2PClientProtocol handles UDP-based P2P protocol- Supports local and remote connectivity to stations
- Handles livestreaming, video download, commands (lock/unlock, enable/disable, etc.)
- Complex packet sequencing and encryption handling
- Supports multiple encryption types (none, type1, type2)
-
Push Notifications (
src/push/) - Unified push message interfaceservice.ts: PushNotificationService manages FCM-based notificationsparser.ts: Normalizes different push notification types- Handles motion, person detection, doorbell ring events, etc.
-
MQTT (
src/mqtt/) - MQTT subscription for certain devices- Supports Smart Lock Touch & Wifi and similar MQTT-enabled devices
Main Entry Point
src/eufysecurity.ts: TheEufySecurityclass is the high-level orchestrator- Must be initialized with
EufySecurity.initialize()(async factory pattern) - Manages all stations, devices, and houses
- Coordinates HTTP API, P2P connections, push notifications, and MQTT
- Emits typed events for device/station state changes
- Handles persistent data storage for credentials and state
- Must be initialized with
Key Design Patterns
- Typed Event Emitters: Uses
tiny-typed-emitterthroughout for type-safe events - Async Initialization: Main classes use static
initialize()factory methods instead of constructors - Persistent Data: Credentials and session data saved to filesystem (default:
.eufy-security-client/) - Property System: Devices/stations have a metadata-driven property system with read-only/write restrictions
- Command Queue: P2P commands are queued and executed sequentially per station
Communication Layers
EufySecurity (High-level API)
├── HTTPApi (Cloud API for device metadata, authentication)
├── P2PClientProtocol (Direct station communication for commands/streaming)
├── PushNotificationService (Real-time event notifications)
└── MQTTService (MQTT-enabled device events)
Device Hierarchy
All devices inherit from base Device class with specialized subclasses:
- Camera types:
Camera,IndoorCamera,SoloCamera,FloodlightCamera,WallLightCam,GarageCamera - Doorbell types:
BatteryDoorbellCamera,WiredDoorbellCamera,DoorbellLock - Lock types:
Lock,LockKeypad - Sensors:
EntrySensor,MotionSensor - Other:
Keypad,SmartSafe,SmartDrop,Tracker
Each device type has specific properties and commands based on hardware capabilities.
TypeScript Configuration
- Target: ES2022
- Module: Node16 with Node16 resolution
- Strict mode enabled
- Build output:
build/directory - Source maps generated
- Declaration files (
.d.ts) generated for npm package
Publishing
- Main entry:
build/index.js - Requires Node.js >= 20.0.0
- Uses
prepublishOnlyscript to ensure build runs before publishing - Proto files (
.proto) and certificates (.crt) are copied to build directory
P2P Protocol Notes
The P2P protocol is UDP-based with custom sequencing and encryption:
- Supports local (LAN) and remote (through Eufy cloud) connections
- Uses magic word
0xf1e2d3c4in packet headers - Multiple encryption modes with AES and RSA
- Handles livestreaming with separate video/audio packet sequencing
- Energy-saving devices have different keepalive/timeout strategies
- Smart locks use BLE-style command structures wrapped in P2P
Logging
Uses typescript-logging with category-based logging:
- Categories: HTTP, P2P, PUSH, MQTT
- Configurable log levels per category
- Default logger can be replaced via
EufySecurity.initialize()config