Claude Code: ชั้นบริการ (Services Layer)

🇹🇭 Thai claude-codeservicesarchitectureanalysisthai
📋 Table of Contents (13 sections)
  1. ชั้นบริการ (Services Layer)
  2. ภาพรวม
  3. โครงสร้างไดเรกทอรีบริการ
  4. บริการหลัก
  5. รูปแบบการผสานรวมบริการ
  6. แนวปฏิบัติที่ดีของบริการ
  7. ความพึ่งพาระหว่างบริการ
  8. ลำดับการเริ่มต้นบริการ
  9. การสื่อสารระหว่างบริการ
  10. การจัดการข้อผิดพลาดของบริการ
  11. การเพิ่มประสิทธิภาพของบริการ
  12. ข้อควรพิจารณาด้านความปลอดภัย
  13. การตั้งค่าบริการ

ชั้นบริการ (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 หลักของ API
  • fetchBootstrapData() - ดึงข้อมูล 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() - รวมเครื่องมือจาก MCP
  • prefetchOfficialMcpUrls() - โหลดล่วงหน้า URL ทางการของ MCP
  • parseMcpConfig() - วิเคราะห์การตั้งค่าเซิร์ฟเวอร์
  • 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 {
  // อัปเดตสถานะของบริการ
}

แนวปฏิบัติที่ดีของบริการ

  1. Lazy Loading: โหลดบริการหนักเมื่อต้องการ
  2. การจัดการข้อผิดพลาด: การลดผลกระทบจากข้อผิดพลาดอย่างนุ่มนวล
  3. Caching: ผลลัพธ์ถูก cache เพื่อประสิทธิภาพ
  4. Event-Driven: บริการปล่อย events สำหรับการเปลี่ยนแปลงสถานะ
  5. การตั้งค่า: บริการเคารพการตั้งค่าทั่วโลก

ความพึ่งพาระหว่างบริการ

ความพึ่งพาของบริการ 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 });
  }
}

การเพิ่มประสิทธิภาพของบริการ

  1. การเริ่มต้นแบบขนาน: บริการหลายตัวเริ่มต้นพร้อมกัน
  2. การโหลดล่วงหน้า: ข้อมูลถูกโหลดก่อนที่จำเป็น
  3. Caching: ผลลัพธ์ถูก cache เพื่อหลีกเลี่ยงการเรียกใช้ซ้ำ
  4. Lazy Loading: โหลดบริการหนักเมื่อต้องการ
  5. งานพื้นหลัง: งานที่ไม่วิกฤตถูกระงับ

ข้อควรพิจารณาด้านความปลอดภัย

  1. การตรวจสอบ Permission: บริการเคารพโหมด permission
  2. ไดเรกทอรีการทำงาน: บริการเคารพข้อจำกัดของ cwd
  3. Feature Flags: ความพร้อมใช้งานของบริการตามเงื่อนไข
  4. ขอบเขตข้อผิดพลาด: การจัดการข้อผิดพลาดแบบแยกออกมา
  5. การแยกสถานะ: สถานะของบริการแยกจากสถานะของแอป

การตั้งค่าบริการ

บริการสามารถตั้งค่าผ่าน:

  • ไฟล์การตั้งค่า: settings.json
  • ตัวแปรสภาพแวดล้อม: CLAUDE_CODE_*
  • Flags ของ Command Line: --settings, --model
  • การตั้งค่าระยะไกล: การตั้งค่า enterprise ของ MCP
← Back to claudecodeanalysis