mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-03-07 06:00:03 +00:00
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:
133
src/examples/headerProviderExample.ts
Normal file
133
src/examples/headerProviderExample.ts
Normal 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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user