Documentation
¶
Overview ¶
Package hooks watches filesystem paths and spawns tasks when things change.
Index ¶
- Constants
- func DecodeToken(stored []byte) (string, error)
- func EncodeToken(raw string) ([]byte, error)
- func NormalizePath(p string) string
- func ParseUint(v any) uint
- type Engine
- type QueryRefresher
- type SeenTracker
- func (t *SeenTracker) Commit(ctx context.Context, key string, current []string) error
- func (t *SeenTracker) Compare(ctx context.Context, key string, current []string) ([]string, error)
- func (t *SeenTracker) Diff(ctx context.Context, key string, current []string) ([]string, error)
- func (t *SeenTracker) TrySetCooldown(ctx context.Context, key string, ttl time.Duration) (bool, error)
- type Service
- func (s *Service) Create(ctx context.Context, wsId uint, memberId, tokenId *uint, ...) (*types.Hook, error)
- func (s *Service) Delete(ctx context.Context, externalId string) error
- func (s *Service) Get(ctx context.Context, externalId string) (*types.Hook, error)
- func (s *Service) List(ctx context.Context, wsId uint) ([]*types.Hook, error)
- func (s *Service) ListRuns(ctx context.Context, hookId uint) ([]*types.Task, error)
- func (s *Service) Update(ctx context.Context, externalId string, prompt *string, active *bool) (*types.Hook, error)
- type SourcePoller
- type TaskCreator
Constants ¶
const ( EventFsCreate = "fs.create" EventFsWrite = "fs.write" EventFsDelete = "fs.delete" EventSourceChange = "source.change" )
Variables ¶
This section is empty.
Functions ¶
func DecodeToken ¶
func EncodeToken ¶
func NormalizePath ¶
Types ¶
type Engine ¶
type Engine struct {
// contains filtered or unexported fields
}
func NewEngine ¶
func NewEngine(store repository.FilesystemStore, creator TaskCreator, backend repository.BackendRepository) *Engine
func (*Engine) InvalidateCache ¶
type QueryRefresher ¶
type QueryRefresher interface {
RefreshQuery(ctx context.Context, query *types.FilesystemQuery) error
}
QueryRefresher executes a source query and emits change events. Implemented by SourceService in the gateway layer.
type SeenTracker ¶
type SeenTracker struct {
// contains filtered or unexported fields
}
SeenTracker detects new query result IDs by diffing against the previous set. Usage: Compare (read-only) → act on new IDs → Commit (update stored set). This two-phase approach ensures the stored set only advances after the caller has successfully processed the new IDs.
func NewSeenTracker ¶
func NewSeenTracker(rdb *common.RedisClient) *SeenTracker
func (*SeenTracker) Commit ¶
Commit replaces the stored set with current and refreshes the TTL. Call only after the caller has successfully acted on the new IDs from Compare.
func (*SeenTracker) Compare ¶
Compare returns IDs in current that weren't in the previous set at key. Does NOT modify the stored set -- call Commit after successful processing. Returns nil on first call (empty stored set) to avoid a false-positive flood.
func (*SeenTracker) Diff ¶
Diff is a convenience that combines Compare + Commit in one call. Use Compare + Commit separately when you need to confirm delivery before advancing.
func (*SeenTracker) TrySetCooldown ¶ added in v0.1.31
func (t *SeenTracker) TrySetCooldown(ctx context.Context, key string, ttl time.Duration) (bool, error)
TrySetCooldown attempts to set a cooldown key via SETNX. Returns true if the key was set (no active cooldown), false if a cooldown is already active. Used to prevent duplicate event emissions from multiple gateway replicas.
type Service ¶
type Service struct {
Store repository.FilesystemStore
Backend repository.BackendRepository
EventBus *common.EventBus
}
Service handles hook CRUD. Shared by HTTP and gRPC handlers.
type SourcePoller ¶
type SourcePoller struct {
// contains filtered or unexported fields
}
SourcePoller periodically refreshes source queries watched by active hooks. Each query is locked via Redis SETNX so only one replica refreshes it per interval.
func NewSourcePoller ¶
func NewSourcePoller(store repository.FilesystemStore, refresher QueryRefresher, rdb *common.RedisClient) *SourcePoller
func (*SourcePoller) Poll ¶
func (p *SourcePoller) Poll(ctx context.Context)
Poll fetches stale watched queries and refreshes them with distributed locking.
func (*SourcePoller) Start ¶
func (p *SourcePoller) Start(ctx context.Context)
Start runs the poll loop. Call as a goroutine.