Kode-cli/src/types/RequestContext.ts
CrazyBoyM 7a3c4a7baa Refactor project structure and update documentation
- Update project branding from claude-cli to Kode
- Reorganize documentation with new development guides
- Add CONTRIBUTING.md and Chinese README
- Remove worktree_merge command and relocate system-design.md
- Update dependencies and package configuration
- Improve custom commands service with better error handling
- Clean up storage utilities and debug logging
2025-08-11 21:31:18 +08:00

73 lines
1.6 KiB
TypeScript

// Request Context for perfect state isolation
// Based on official Kode patterns
export interface RequestContext {
id: string
abortController: AbortController
startTime: number
isActive: boolean
type: 'query' | 'tool' | 'koding'
}
export interface AbortBarrier {
requestId: string
checkAbort(): boolean
onAbort(callback: () => void): void
cleanup(): void
}
export function createRequestContext(
type: RequestContext['type'] = 'query',
): RequestContext {
return {
id: crypto.randomUUID(),
abortController: new AbortController(),
startTime: Date.now(),
isActive: true,
type,
}
}
export function createAbortBarrier(
requestContext: RequestContext,
): AbortBarrier {
let cleanupCallbacks: (() => void)[] = []
return {
requestId: requestContext.id,
checkAbort(): boolean {
// Only respond to aborts for THIS specific request
return (
requestContext.isActive && requestContext.abortController.signal.aborted
)
},
onAbort(callback: () => void): void {
if (requestContext.isActive) {
const abortHandler = () => {
if (requestContext.isActive) {
callback()
}
}
requestContext.abortController.signal.addEventListener(
'abort',
abortHandler,
)
cleanupCallbacks.push(() => {
requestContext.abortController.signal.removeEventListener(
'abort',
abortHandler,
)
})
}
},
cleanup(): void {
cleanupCallbacks.forEach(cleanup => cleanup())
cleanupCallbacks = []
requestContext.isActive = false
},
}
}