ชั้นบริการ (Services Layer)
ภาพรวม
ชั้นบริการให้ การแยกชั้นที่ชัดเจน สำหรับการเชื่อมต่อภายนอก แยกตรรกะหลักออกจากความพึ่งพาภายนอก ทำให้ระบบเป็นโมดูลาร์และดูแลรักษาง่าย
โครงสร้างไดเรกทอรีบริการ
src/services/
├── api/ - SDK ของ Anthropic, อัปโหลดไฟล์, bootstrap
├── mcp/ - ระบบ Model Context Protocol
├── oauth/ - การไหลของการยืนยันตัวตน
├── lsp/ - ระบบจัดการ Language Server Protocol
├── analytics/ - Feature Flags ของ GrowthBook
├── policyLimits/ - การจัดการขีดจำกัดของ policy
├── remoteManagedSettings/ - การซิงค์การตั้งค่าระยะไกล
├── tips/ - ระบบลงทะเบียนเคล็ดลับ
└── [10+ โมดูลบริการ]
บริการหลัก
บริการ API (src/services/api/)
จัดการการโต้ตอบทั้งหมดกับ API ของ Anthropic:
// src/services/api/claude.ts
export async function query(
messages: Message[],
options: QueryOptions
): Promise<QueryResult> {
// ส่งคำขอไปยัง API ของ Anthropic
// จัดการการตอบกลับแบบ streaming
// ติดตามการใช้งานและต้นทุน
}
export function accumulateUsage(usage: Usage): void {
// รวมการใช้งาน token ค่อย query
}
export function getTotalCost(usage: Usage): number {
// คำนวณต้นทุนรวมของ API
}
ฟังก์ชันหลัก:
query()- ฟังก์ชัน query หลักของ APIfetchBootstrapData()- ดึงข้อมูล bootstrap เริ่มต้นdownloadSessionFiles()- ดาวน์โหลดไฟล์ของเซสชันcategorizeRetryableAPIError()- การจำแนกประเภทข้อผิดพลาด
บริการ MCP (src/services/mcp/)
การผสานรวม Model Context Protocol:
// src/services/mcp/client.ts
export async function getMcpToolsCommandsAndResources(
servers: MCPServerConnection[]
): Promise<Tools> {
// ดึงเครื่องมือจากเซิร์ฟเวอร์ MCP ที่เชื่อมต่อ
}
export async function prefetchAllMcpResources(): Promise<void> {
// โหลดล่วงหน้าทรัพยากร MCP เพื่อประสิทธิภาพ
}
export function parseMcpConfig(configPath: string): McpServerConfig {
// วิเคราะห์การตั้งค่าเซิร์ฟเวอร์ MCP
}
ฟังก์ชันหลัก:
getMcpToolsCommandsAndResources()- รวมเครื่องมือจาก MCPprefetchOfficialMcpUrls()- โหลดล่วงหน้า URL ทางการของ MCPparseMcpConfig()- วิเคราะห์การตั้งค่าเซิร์ฟเวอร์clearServerCache()- ล้าง cache ของเซิร์ฟเวอร์ MCP
บริการ OAuth (src/services/oauth/)
การจัดการการยืนยันตัวตนและเซสชัน:
// src/services/oauth/index.ts
export async function authenticateUser(): Promise<AuthResult> {
// ยืนยันตัวตนผู้ใช้ผ่านกระบวนการ OAuth
}
export function getOauthConfig(): OauthConfig {
// ดึงการตั้งค่า OAuth
}
export function refreshAuthToken(): Promise<string> {
// รีเฟรช token การยืนยันตัวตน
}
บริการ LSP (src/services/lsp/)
การผสานรวม Language Server Protocol:
// src/services/lsp/manager.ts
export function initializeLspServerManager(): void {
// เริ่มต้นระบบจัดการเซิร์ฟเวอร์ LSP
}
export function getDiagnostics(filePath: string): Diagnostic[] {
// ดึง diagnostics ของ LSP สำหรับไฟล์
}
export function completeSymbol(symbol: string): Completion[] {
// ดึงการเติมอัตโนมัติของ symbol
}
บริการ Analytics (src/services/analytics/)
Feature Flags และ telemetry:
// src/services/analytics/growthbook.ts
export function initializeGrowthBook(): void {
// เริ่มต้น Feature Flags ของ GrowthBook
}
export function getFeatureValue_CACHED_MAY_BE_STALE(flag: string): unknown {
// ดึงค่า feature flag ที่ cache ไว้
}
export function refreshGrowthBookAfterAuthChange(): void {
// รีเฟรช feature flags หลังการเปลี่ยนแปลงการยืนยันตัวตน
}
// src/services/analytics/index.ts
export function logEvent(
eventName: string,
metadata: AnalyticsMetadata
): void {
// บันทึกเหตุการณ์ analytics
}
รูปแบบการผสานรวมบริการ
บริการใช้รูปแบบการผสานรวมที่สม่ำเสมอ:
// การเริ่มต้นบริการ
export async function initializeService(): Promise<void> {
// เริ่มต้นความพึ่งพาของบริการ
// ตั้งค่า event listeners
// โหลดล่วงหน้าข้อมูลถ้าจำเป็น
}
// การดำเนินการของบริการ
export async function performOperation(params: Params): Promise<Result> {
// ดำเนินการการดำเนินการของบริการ
// จัดการข้อผิดพลาดอย่างนุ่มนวล
// ส่งคืนผลลัพธ์ที่มีโครงสร้าง
}
// การจัดการสถานะของบริการ
export function getServiceState(): ServiceState {
// ดึงสถานะปัจจุบันของบริการ
}
export function updateServiceState(updater: StateUpdater): void {
// อัปเดตสถานะของบริการ
}
แนวปฏิบัติที่ดีของบริการ
- Lazy Loading: โหลดบริการหนักเมื่อต้องการ
- การจัดการข้อผิดพลาด: การลดผลกระทบจากข้อผิดพลาดอย่างนุ่มนวล
- Caching: ผลลัพธ์ถูก cache เพื่อประสิทธิภาพ
- Event-Driven: บริการปล่อย events สำหรับการเปลี่ยนแปลงสถานะ
- การตั้งค่า: บริการเคารพการตั้งค่าทั่วโลก
ความพึ่งพาระหว่างบริการ
ความพึ่งพาของบริการ API
- SDK ของ Anthropic
- การดำเนินการกับระบบไฟล์
- คำขอเครือข่าย
ความพึ่งพาของบริการ MCP
- SDK ของ MCP
- ไฟล์การตั้งค่า
- การเชื่อมต่อเซิร์ฟเวอร์
ความพึ่งพาของบริการ OAuth
- การเข้าถึง Keychain
- การเก็บ token
- การไหลของการยืนยันตัวตน
ความพึ่งพาของบริการ LSP
- เซิร์ฟเวอร์ภาษา
- ระบบเฝ้าระวังไฟล์
- เครื่องยนต์ diagnostics
ความพึ่งพาของบริการ Analytics
- SDK ของ GrowthBook
- การบันทึก events
- การจัดการ Feature Flags
ลำดับการเริ่มต้นบริการ
บริการถูกเริ่มต้นตามลำดับเฉพาะเพื่อประสิทธิภาพสูงสุด:
// src/main.tsx
// 1. บริการ API (ข้อมูล bootstrap)
await fetchBootstrapData();
// 2. บริการ OAuth (การยืนยันตัวตน)
await authenticateUser();
// 3. บริการ MCP (การเชื่อมต่อเซิร์ฟเวอร์)
await prefetchAllMcpResources();
// 4. บริการ LSP (เซิร์ฟเวอร์ภาษา)
initializeLspServerManager();
// 5. บริการ Analytics (Feature Flags)
initializeGrowthBook();
การสื่อสารระหว่างบริการ
บริการสื่อสารผ่าน:
- Event Emitters: การเปลี่ยนแปลงสถานะแบบ real-time
- สถานะร่วม: สถานะของแอป
- การเรียกใช้ตรง: การดำเนินการแบบซิงค์
- Callbacks: การแจ้งเตือนแบบ async
การจัดการข้อผิดพลาดของบริการ
try {
await serviceOperation();
} catch (error) {
if (isRetryableError(error)) {
// ลองใหม่ด้วยการหน่วงเวลา
await retryOperation(error);
} else {
// บันทึกและดำเนินการต่อ
logEvent('service_error', { service: 'api', error: error.message });
}
}
การเพิ่มประสิทธิภาพของบริการ
- การเริ่มต้นแบบขนาน: บริการหลายตัวเริ่มต้นพร้อมกัน
- การโหลดล่วงหน้า: ข้อมูลถูกโหลดก่อนที่จำเป็น
- Caching: ผลลัพธ์ถูก cache เพื่อหลีกเลี่ยงการเรียกใช้ซ้ำ
- Lazy Loading: โหลดบริการหนักเมื่อต้องการ
- งานพื้นหลัง: งานที่ไม่วิกฤตถูกระงับ
ข้อควรพิจารณาด้านความปลอดภัย
- การตรวจสอบ Permission: บริการเคารพโหมด permission
- ไดเรกทอรีการทำงาน: บริการเคารพข้อจำกัดของ cwd
- Feature Flags: ความพร้อมใช้งานของบริการตามเงื่อนไข
- ขอบเขตข้อผิดพลาด: การจัดการข้อผิดพลาดแบบแยกออกมา
- การแยกสถานะ: สถานะของบริการแยกจากสถานะของแอป
การตั้งค่าบริการ
บริการสามารถตั้งค่าผ่าน:
- ไฟล์การตั้งค่า:
settings.json - ตัวแปรสภาพแวดล้อม:
CLAUDE_CODE_* - Flags ของ Command Line:
--settings,--model - การตั้งค่าระยะไกล: การตั้งค่า enterprise ของ MCP