feat: Add header registry infrastructure

- Create TypeScript interfaces for header providers
- Implement header registry with priority-based ordering
- Add network client adapters that integrate with the registry
- Add comprehensive unit tests

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
bymyself
2025-08-17 13:43:58 -07:00
parent 2e80a5789c
commit 0d6e5a75a9
6 changed files with 952 additions and 0 deletions

View File

@@ -0,0 +1,133 @@
/**
* Example of how extensions can register header providers
* This file demonstrates the header registration API for extension developers
*/
import { headerRegistry } from '@/services/headerRegistry'
import type {
HeaderMap,
HeaderProviderContext,
IHeaderProvider
} from '@/types/headerTypes'
/**
* Example 1: Simple static header provider
*/
class StaticHeaderProvider implements IHeaderProvider {
provideHeaders(_context: HeaderProviderContext): HeaderMap {
return {
'X-Extension-Name': 'my-extension',
'X-Extension-Version': '1.0.0'
}
}
}
/**
* Example 2: Dynamic header provider that adds headers based on the request
*/
class DynamicHeaderProvider implements IHeaderProvider {
async provideHeaders(context: HeaderProviderContext): Promise<HeaderMap> {
const headers: HeaderMap = {}
// Add different headers based on the URL
if (context.url.includes('/api/')) {
headers['X-API-Version'] = 'v2'
}
// Add headers based on request method
if (context.method === 'POST' || context.method === 'PUT') {
headers['X-Request-ID'] = () => crypto.randomUUID()
}
// Add timestamp header
headers['X-Timestamp'] = () => new Date().toISOString()
return headers
}
}
/**
* Example 3: Auth token provider
*/
class AuthTokenProvider implements IHeaderProvider {
private getToken(): string | null {
// This could retrieve a token from storage, state, etc.
return localStorage.getItem('auth-token')
}
provideHeaders(_context: HeaderProviderContext): HeaderMap {
const token = this.getToken()
if (token) {
return {
Authorization: `Bearer ${token}`
}
}
return {}
}
}
/**
* Example of how to register providers in an extension
*/
export function setupHeaderProviders() {
// Register a simple static provider
const staticRegistration = headerRegistry.registerHeaderProvider(
new StaticHeaderProvider()
)
// Register a dynamic provider with higher priority
const dynamicRegistration = headerRegistry.registerHeaderProvider(
new DynamicHeaderProvider(),
{ priority: 10 }
)
// Register an auth provider that only applies to API endpoints
const authRegistration = headerRegistry.registerHeaderProvider(
new AuthTokenProvider(),
{
priority: 20, // Higher priority to override other auth headers
filter: (context) => context.url.includes('/api/')
}
)
// Return cleanup function for when extension is unloaded
return () => {
staticRegistration.dispose()
dynamicRegistration.dispose()
authRegistration.dispose()
}
}
/**
* Example of a provider that integrates with a cloud service
*/
export class CloudServiceHeaderProvider implements IHeaderProvider {
constructor(
private apiKey: string,
private workspaceId: string
) {}
async provideHeaders(context: HeaderProviderContext): Promise<HeaderMap> {
// Only add headers for requests to the cloud service
if (!context.url.includes('cloud.comfyui.com')) {
return {}
}
return {
'X-API-Key': this.apiKey,
'X-Workspace-ID': this.workspaceId,
'X-Client-Version': '1.0.0',
'X-Session-ID': async () => {
// Could fetch or generate session ID asynchronously
const sessionId = await this.getOrCreateSessionId()
return sessionId
}
}
}
private async getOrCreateSessionId(): Promise<string> {
// Simulate async session creation
return 'session-' + Date.now()
}
}