UNPKG

@warriorteam/zalo-personal

Version:

Unofficial Zalo Personal API for JavaScript - A powerful library for interacting with Zalo personal accounts with URL attachment support

635 lines (537 loc) 22 kB
# Kiến Trúc Thư Viện Zalo Personal SDK ## 📋 Tổng Quan Zalo Personal SDK một thư viện TypeScript được thiết kế theo kiến trúc **modular** **event-driven**, sử dụng **factory pattern** để tạo ra một API mạnh mẽ dễ mở rộng cho việc tương tác với Zalo. ## 🏗️ Architecture Overview ``` ┌─────────────────────────────────────────────────────────────┐ Zalo Personal SDK ├─────────────────────────────────────────────────────────────┤ Entry Point (index.ts) ├── Error Handling ├── Data Models └── Main API Class ├─────────────────────────────────────────────────────────────┤ Core Modules ├── Authentication & Session (context.ts) ├── Utility System (utils.ts) └── API Factory System ├─────────────────────────────────────────────────────────────┤ API Modules (80+ methods) ├── Authentication APIs ├── Messaging APIs ├── Friends Management APIs ├── Group Management APIs └── Advanced Features APIs ├─────────────────────────────────────────────────────────────┤ Event System ├── WebSocket Listener ├── Real-time Events └── Event Handlers └─────────────────────────────────────────────────────────────┘ ``` ## 📁 Cấu Trúc Thư Mục Chi Tiết ### 1. **Root Level Files** ``` zalo-personal-sdk/ ├── 📦 package.json # Metadata và dependencies ├── 📦 package-lock.json # Lock file cho npm ├── 📦 bun.lock # Lock file cho Bun runtime ├── 🔧 tsconfig.json # TypeScript configuration ├── 🔧 rollup.config.js # Build configuration ├── 📄 index.d.ts # TypeScript definitions ├── 📚 README.md # Main documentation ├── 📚 HUONG_DAN_SU_DUNG.md # Vietnamese guide ├── 📋 CONTRIBUTING.md # Contribution guidelines ├── 📋 CODE_OF_CONDUCT.md # Code of conduct └── 📄 LICENSE # MIT License ``` ### 2. **Source Code Structure** (`src/`) ``` src/ ├── 🎯 index.ts # Main entry point ├── 🏛️ zalo.ts # Core API classes ├── ⚙️ context.ts # Session & configuration ├── 🛠️ utils.ts # Utility functions ├── 🔄 update.ts # Version checking ├── 📁 Errors/ # Error handling ├── ZaloApiError.ts # Custom error class └── index.ts # Error exports ├── 📁 models/ # Data structures ├── Enum.ts # Enumerations ├── Attachment.ts # File attachments ├── Message.ts # Message types ├── FriendEvent.ts # Friend events ├── GroupEvent.ts # Group events ├── Reaction.ts # Reactions ├── Reminder.ts # Reminders ├── Board.ts # Group boards ├── QuickMessage.ts # Quick messages ├── Typing.ts # Typing indicators ├── Undo.ts # Undo operations ├── SeenMessage.ts # Read status ├── DeliveredMessage.ts # Delivery status └── index.ts # Model exports └── 📁 apis/ # API implementations ├── 🔐 Authentication (4 files) ├── 💬 Messaging (12 files) ├── 👥 Friends (15 files) ├── 👨‍👩‍👧‍👦 Groups (20 files) ├── 🎧 Events (3 files) └── 🔧 Utilities (30+ files) ``` ### 3. **API Modules Breakdown** #### **🔐 Authentication & Session** ``` apis/ ├── login.ts # Cookie-based login ├── loginQR.ts # QR code login ├── keepAlive.ts # Session maintenance └── fetchAccountInfo.ts # Account information ``` #### **💬 Messaging APIs** (12 files) ``` ├── sendMessage.ts # ⭐ Core messaging ├── sendSticker.ts # Sticker messages ├── sendVideo.ts # Video messages ├── sendVoice.ts # Voice messages ├── sendLink.ts # Link sharing ├── sendCard.ts # Contact cards ├── forwardMessage.ts # Message forwarding ├── deleteMessage.ts # Message deletion ├── undo.ts # Message recall ├── addReaction.ts # Message reactions ├── sendDeliveredEvent.ts # Delivery notifications └── sendSeenEvent.ts # Read receipts ``` #### **👥 Friends Management** (15 files) ``` ├── getAllFriends.ts # Friends list ├── findUser.ts # User search ├── getUserInfo.ts # User information ├── sendFriendRequest.ts # Send friend requests ├── acceptFriendRequest.ts # Accept requests ├── getReceivedFriendRequests.ts # Incoming requests ├── getSentFriendRequest.ts # Outgoing requests ├── undoFriendRequest.ts # Cancel requests ├── removeFriend.ts # Remove friends ├── blockUser.ts # Block users ├── unblockUser.ts # Unblock users ├── changeFriendAlias.ts # Set nicknames ├── removeFriendAlias.ts # Remove nicknames ├── getAliasList.ts # Nicknames list └── lastOnline.ts # Online status ``` #### **👨‍👩‍👧‍👦 Group Management** (20 files) ``` ├── createGroup.ts # Create groups ├── getAllGroups.ts # Groups list ├── getGroupInfo.ts # Group details ├── getGroupMembersInfo.ts # Member information ├── addUserToGroup.ts # Add members ├── removeUserFromGroup.ts # Remove members ├── inviteUserToGroups.ts # Invite to multiple groups ├── leaveGroup.ts # Leave groups ├── disperseGroup.ts # Delete groups ├── joinGroup.ts # Join via link ├── changeGroupName.ts # Change name ├── changeGroupAvatar.ts # Change avatar ├── changeGroupOwner.ts # Transfer ownership ├── addGroupDeputy.ts # Add admins ├── removeGroupDeputy.ts # Remove admins ├── enableGroupLink.ts # Enable join link ├── disableGroupLink.ts # Disable join link ├── getGroupLinkInfo.ts # Link information ├── updateGroupSettings.ts # Group settings └── createPoll.ts # Create polls ``` #### **🎧 Events & Listener** ``` ├── listen.ts # WebSocket listener ├── sendTypingEvent.ts # Typing indicators └── addUnreadMark.ts # Unread markers ``` #### **🔧 Advanced Features** (30+ files) ``` ├── uploadAttachment.ts # File uploads ├── parseLink.ts # Link previews ├── createReminder.ts # Reminders ├── getStickers.ts # Sticker catalog ├── getStickersDetail.ts # Sticker details ├── createNoteGroup.ts # Group notes ├── getListBoard.ts # Board items ├── updateAutoDeleteChat.ts # Auto-delete messages ├── setMute.ts # Mute conversations ├── setPinnedConversations.ts # Pin conversations ├── getQR.ts # QR code generation ├── custom.ts # Custom API calls └── ... (20+ more utilities) ``` ### 4. **Documentation Structure** (`docs/`) ``` docs/ ├── 📖 authentication.md # Login & authentication ├── 📖 messaging.md # Messaging APIs ├── 📖 friends.md # Friends management ├── 📖 groups.md # Group management ├── 📖 events.md # Event handling ├── 📖 types.md # Type reference └── 📖 architecture.md # This document ``` ### 5. **Testing & Examples** ``` ├── 📁 test/ # Test suite ├── credentials.example.json # Auth template ├── feat.ts # Feature tests ├── test.ts # Main tests ├── url-attachment-test.ts # Upload tests └── a.png # Test asset ├── 📁 examples/ # Usage examples └── send-message-with-url.ts # URL attachment example └── 📁 dist/ # Build output ├── index.js # ESM build └── cjs/ # CommonJS build ``` ## 🏛️ Core Architecture Components ### 1. **Main API Classes** (`src/zalo.ts`) ```typescript export class Zalo { // Configuration private enableEncryptParam = true; constructor(private options: Partial<Options> = {}) {} // Authentication Methods public async login(credentials: Credentials): Promise<API> public async loginQR(options?, callback?): Promise<API> // Internal Methods private parseCookies(cookie): CookieJar private validateParams(credentials): void private async loginCookie(ctx, credentials): Promise<API> } export class API { // Core Properties public zpwServiceMap: ZPWServiceMap; public listener: Listener; // 80+ API Methods (auto-generated) public sendMessage: ReturnType<typeof sendMessageFactory>; public getAllFriends: ReturnType<typeof getAllFriendsFactory>; public createGroup: ReturnType<typeof createGroupFactory>; // ... all other APIs constructor(ctx: ContextSession, zpwServiceMap, wsUrls) { // Initialize all API methods using factories } } ``` ### 2. **Context Management** (`src/context.ts`) ```typescript // Base Context (before login) export type ContextBase = { imei: string; cookie: CookieJar; userAgent: string; language: string; options: Partial<Options>; } // Session Context (after login) export type ContextSession = ContextBase & { uid: string; secretKey: string; settings: ServerSettings; extraVer: string; } // Server Settings type ServerSettings = { features: { sharefile: ShareFileSettings; socket: SocketSettings; // ... many more settings }; setttings: any; // Zalo API typo settings: any; // Fallback } ``` ### 3. **Factory Pattern Implementation** Mỗi API được implement theo factory pattern: ```typescript // Generic Factory Type export const apiFactory = () => <T extends (api: API, ctx: ContextSession, utils: Utils) => any>( factory: T ): T => factory; // Example: sendMessage API export const sendMessageFactory = apiFactory()((api, ctx, utils) => { // Private utilities const serviceURLs = { /* ... */ }; function handleMessage() { /* ... */ } function handleAttachment() { /* ... */ } function send() { /* ... */ } // Return public API function return async function sendMessage( message: MessageContent | string, threadId: string, type: ThreadType = ThreadType.User ): Promise<SendMessageResponse> { // Implementation }; }); ``` ### 4. **Utility System** (`src/utils.ts`) ```typescript // Core Utilities export function makeURL(base: string, params?: Record<string, any>): string export function request(url: string, options?: RequestInit): Promise<Response> export function resolveResponse<T>(ctx: ContextSession, response: Response): Promise<T> export function encodeAES(data: string, key: string): string export function removeUndefinedKeys(obj: any): void // File Utilities export function getFileName(path: string): string export function getFileExtension(path: string): string export function getMd5LargeFileObject(source: AttachmentSource, size: number): Promise<{data: string}> export function getGifMetaData(path: string): Promise<GifMetaData> export function downloadFileFromUrl(url: string, headers?: Record<string, string>): Promise<DownloadResult> // Validation Utilities export function isValidUrl(url: string): boolean export function getClientMessageType(msgType: string): number // ID Generation export function generateZaloUUID(userAgent: string): string // Logging export function logger(ctx: ContextBase): Logger ``` ## 🔄 Data Flow Architecture ### 1. **Authentication Flow** ```mermaid graph TB A[User] --> B[Zalo.login() / loginQR()] B --> C[Create ContextBase] C --> D[Parse Cookies] D --> E[Validate Credentials] E --> F[Login to Zalo API] F --> G[Get Server Settings] G --> H[Create ContextSession] H --> I[Initialize API Instance] I --> J[Return API Object] ``` ### 2. **API Call Flow** ```mermaid graph TB A[API Method Call] --> B[Factory Function] B --> C[Access Context & Utils] C --> D[Prepare Request Data] D --> E[Encrypt Parameters] E --> F[Make HTTP Request] F --> G[Parse Response] G --> H[Return Typed Result] ``` ### 3. **Event Listener Flow** ```mermaid graph TB A[api.listener.start()] --> B[Create WebSocket Connection] B --> C[Listen for Events] C --> D[Parse Event Data] D --> E[Emit Typed Events] E --> F[User Event Handlers] F --> G[Process Events] ``` ## 🏗️ Design Patterns Used ### 1. **Factory Pattern** - **Sử dụng**: Tạo API methods - **Lợi ích**: Dependency injection, consistent API - **Implementation**: `apiFactory()` wrapper ### 2. **Observer Pattern** - **Sử dụng**: Event system - **Lợi ích**: Real-time updates, loose coupling - **Implementation**: EventEmitter-based listener ### 3. **Builder Pattern** - **Sử dụng**: Message construction - **Lợi ích**: Flexible message building - **Implementation**: MessageContent objects ### 4. **Singleton Pattern** - **Sử dụng**: Context management - **Lợi ích**: Shared session state - **Implementation**: Single context per API instance ### 5. **Strategy Pattern** - **Sử dụng**: Multiple authentication methods - **Lợi ích**: Flexible auth options - **Implementation**: login() vs loginQR() ### 6. **Decorator Pattern** - **Sử dụng**: API method wrapping - **Lợi ích**: Add functionality without changing core - **Implementation**: Error handling, logging wrappers ## 📊 Type System Architecture ### 1. **Core Types Hierarchy** ```typescript // Base Types export enum ThreadType { User, Group } export enum Gender { Male, Female } export enum TextStyle { Bold, Italic, Red, /* ... */ } // Message Types export type MessageContent = { msg: string; styles?: Style[]; urgency?: Urgency; quote?: SendMessageQuote; mentions?: Mention[]; attachments?: AttachmentSource | AttachmentSource[]; ttl?: number; } // Response Types export type SendMessageResponse = { message: SendMessageResult | null; attachment: SendMessageResult[]; } // Event Types export type MessageEvent = { threadId: string; threadType: ThreadType; messageId: string; senderId: string; content: string; timestamp: number; // ... more properties } ``` ### 2. **Generic Response Pattern** ```typescript // All API responses follow this pattern export type BaseResponse<T = any> = { data: T; error_code: number; error_message: string; } // Specific implementations export type GetAllFriendsResponse = BaseResponse<{ friends: ProfileInfo[]; }> export type CreateGroupResponse = BaseResponse<{ groupId: string; }> ``` ## 🔧 Build System Architecture ### 1. **Dual Package Support** ```json { "type": "module", "main": "dist/index.js", "exports": { ".": { "require": "./dist/cjs/index.cjs", "types": "./index.d.ts", "default": "./dist/index.js" } } } ``` ### 2. **Build Pipeline** ```bash # Build Process npm run build:clean # Remove old builds npm run build:esm # TypeScript → ESM npm run build:cjs # Rollup → CommonJS npm run build # Full build ``` ### 3. **TypeScript Configuration** ```json { "compilerOptions": { "target": "ES2022", "module": "ESNext", "moduleResolution": "node", "declaration": true, "outDir": "./dist", "strict": true, "esModuleInterop": true } } ``` ## 📈 Performance Architecture ### 1. **Memory Management** - **Lazy Loading**: APIs chỉ được khởi tạo khi cần - **Weak References**: Tránh memory leaks - **Automatic Cleanup**: Context cleanup khi disconnect ### 2. **Connection Management** - **Connection Pooling**: Reuse HTTP connections - **WebSocket Persistence**: Maintain real-time connection - **Auto Reconnect**: Tự động kết nối lại khi mất kết nối ### 3. **Request Optimization** - **Request Batching**: Gộp multiple requests - **Response Caching**: Cache static responses - **Compression**: Sử dụng gzip/deflate ## 🔒 Security Architecture ### 1. **Encryption Layer** ```typescript // All API parameters are AES encrypted const encryptedParams = utils.encodeAES(JSON.stringify(params)); ``` ### 2. **Session Security** - **No Persistent Storage**: Credentials không được lưu - **Automatic Expiry**: Sessions tự động hết hạn - **Secure Cookie Handling**: HttpOnly, Secure flags ### 3. **Rate Limiting** - **Built-in Throttling**: Tự động giới hạn requests - **Exponential Backoff**: Retry với delay tăng dần - **Error Recovery**: Graceful handling của rate limits ## 📊 Metrics & Statistics ### **Codebase Metrics** ``` Total Files: 100+ files Source Code: ~15,000+ lines API Methods: 80+ methods Type Definitions: 200+ exported types Test Coverage: Comprehensive test suite ``` ### **API Coverage** ``` 🔐 Authentication: 4 methods 💬 Messaging: 12 methods 👥 Friends: 15 methods 👨‍👩‍👧‍👦 Groups: 20 methods 🎧 Events: 5 event types 🔧 Utilities: 30+ helper methods ``` ### **Dependencies Analysis** ``` Production Dependencies: 8 packages Development Dependencies: 12 packages Bundle Size (ESM): ~2MB Bundle Size (CJS): ~2.2MB Node.js Requirement: ≥18.0.0 ``` ## 🚀 Extensibility Architecture ### 1. **Plugin System** ```typescript // Custom API extensions const customAPI = api.custom({ url: '/custom/endpoint', method: 'POST', params: { custom: 'data' } }); ``` ### 2. **Event Extensions** ```typescript // Custom event handlers api.listener.on('custom_event', (data) => { // Handle custom events }); ``` ### 3. **Type Extensions** ```typescript // Extend existing types declare module 'zalo-personal-sdk' { interface MessageContent { customField?: string; } } ``` ## 🔄 Future Architecture Considerations ### 1. **Scalability** - **Microservices**: Tách thành các service riêng biệt - **Load Balancing**: Hỗ trợ multiple instances - **Horizontal Scaling**: Scale theo số lượng tài khoản ### 2. **Monitoring** - **Metrics Collection**: Performance monitoring - **Health Checks**: Service health monitoring - **Alerting**: Automatic issue detection ### 3. **Documentation** - **Auto-generated Docs**: From TypeScript definitions - **Interactive Examples**: Runnable code examples - **API Playground**: Browser-based testing --- **Tổng kết**: Zalo Personal SDK được thiết kế với kiến trúc **modular**, **type-safe**, **extensible**. Sử dụng các design patterns hiện đại best practices để tạo ra một thư viện **production-ready** với khả năng **maintainability** **scalability** cao.