Skip to content

监听数据变化

Go Cursor SDK 提供了 Watcher 功能,可以实时监听 Cursor IDE 数据的变化,并在数据更新时触发回调函数。

启用 Watcher

基本配置

go
config := &cursor.ClientConfig{
    EnableWatcher: true,
    LogLevel:      cursor.LogLevelInfo,
}

client, err := cursor.NewCursorClient(config)
if err != nil {
    log.Fatal(err)
}
defer client.Close()

监听事件

监听会话变化

go
watcher := client.Watcher()

// 监听会话变化
watcher.WatchSessions(func(event cursor.WatchEvent) {
    fmt.Printf("会话事件:%s - %s\n", event.Type, event.Action)
    fmt.Printf("会话 ID:%s\n", event.ID)
})

监听 Composer 变化

go
// 监听 Composer 变化
watcher.WatchComposers(func(event cursor.WatchEvent) {
    fmt.Printf("Composer 事件:%s - %s\n", event.Type, event.Action)
    fmt.Printf("Composer ID:%s\n", event.ID)
})

监听统计数据变化

go
// 监听统计数据变化
watcher.WatchStats(func(event cursor.WatchEvent) {
    fmt.Printf("统计数据更新:%s\n", event.Action)
})

监听配置变化

go
// 监听配置变化
watcher.WatchConfig(func(event cursor.WatchEvent) {
    fmt.Printf("配置更新:%s\n", event.Action)
})

启动和停止监听

启动监听

go
// 启动 Watcher
if err := watcher.Start(); err != nil {
    log.Fatal(err)
}

fmt.Println("Watcher 已启动,正在监听数据变化...")

停止监听

go
// 停止 Watcher
watcher.Stop()
fmt.Println("Watcher 已停止")

事件类型

WatchEvent 结构

go
type WatchEvent struct {
    Type      string    // 事件类型:session, composer, stats, config
    Action    string    // 操作类型:create, update, delete
    ID        string    // 资源 ID
    Timestamp time.Time // 事件时间
    Data      interface{} // 事件数据
}

事件操作类型

  • create:创建新记录
  • update:更新现有记录
  • delete:删除记录

实际示例

完整的监听示例

go
package main

import (
    "fmt"
    "log"
    "os"
    "os/signal"
    "syscall"
    
    cursor "github.com/vibe-coding-labs/go-cursor-sdk"
)

func main() {
    // 创建配置
    config := &cursor.ClientConfig{
        EnableWatcher: true,
        LogLevel:      cursor.LogLevelInfo,
    }
    
    // 创建客户端
    client, err := cursor.NewCursorClient(config)
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()
    
    // 获取 Watcher
    watcher := client.Watcher()
    
    // 监听会话变化
    watcher.WatchSessions(func(event cursor.WatchEvent) {
        fmt.Printf("[会话] %s - %s (ID: %s)\n", 
            event.Action, event.Type, event.ID)
    })
    
    // 监听 Composer 变化
    watcher.WatchComposers(func(event cursor.WatchEvent) {
        fmt.Printf("[Composer] %s - %s (ID: %s)\n", 
            event.Action, event.Type, event.ID)
    })
    
    // 监听统计数据变化
    watcher.WatchStats(func(event cursor.WatchEvent) {
        fmt.Printf("[统计] %s\n", event.Action)
    })
    
    // 启动监听
    if err := watcher.Start(); err != nil {
        log.Fatal(err)
    }
    
    fmt.Println("正在监听数据变化,按 Ctrl+C 退出...")
    
    // 等待中断信号
    sigChan := make(chan os.Signal, 1)
    signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
    <-sigChan
    
    // 停止监听
    watcher.Stop()
    fmt.Println("已停止监听")
}

结合缓存使用

go
// 监听数据变化,自动清除缓存
watcher := client.Watcher()

watcher.WatchSessions(func(event cursor.WatchEvent) {
    // 会话变化时清除缓存
    client.Cache().ClearSessions()
    fmt.Println("会话缓存已清除")
})

watcher.WatchComposers(func(event cursor.WatchEvent) {
    // Composer 变化时清除缓存
    client.Cache().ClearComposers()
    fmt.Println("Composer 缓存已清除")
})

if err := watcher.Start(); err != nil {
    log.Fatal(err)
}

实时数据同步

go
// 监听数据变化,实时同步到外部系统
watcher := client.Watcher()

watcher.WatchSessions(func(event cursor.WatchEvent) {
    switch event.Action {
    case "create":
        // 同步新会话到外部系统
        syncNewSession(event.ID)
    case "update":
        // 更新外部系统中的会话
        updateSession(event.ID)
    case "delete":
        // 从外部系统删除会话
        deleteSession(event.ID)
    }
})

if err := watcher.Start(); err != nil {
    log.Fatal(err)
}

性能考虑

监听频率

Watcher 使用文件系统监听机制,性能开销较小:

  • 不会轮询数据库
  • 只在文件变化时触发事件
  • 支持批量处理事件

回调函数

  • 回调函数应该快速执行
  • 避免在回调中执行耗时操作
  • 考虑使用 goroutine 处理复杂逻辑
go
watcher.WatchSessions(func(event cursor.WatchEvent) {
    // 使用 goroutine 处理耗时操作
    go func() {
        // 复杂的处理逻辑
        processEvent(event)
    }()
})

错误处理

go
watcher := client.Watcher()

// 设置错误处理器
watcher.OnError(func(err error) {
    log.Printf("Watcher 错误:%v\n", err)
})

if err := watcher.Start(); err != nil {
    log.Fatal(err)
}

下一步

Released under the MIT License.