cfw-graphql-bootstrap 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/logger/index.ts","../src/context/constants.ts","../src/context/auth.ts","../src/cache/kv-cache.ts","../src/cache/redis-cache.ts","../src/cache/index.ts","../src/env/config.ts","../src/context/index.ts","../src/utils/builder.util.ts","../src/server/server.builder.ts","../src/server/hono.configure.ts","../src/middleware/validation.ts","../src/middleware/rate-limit.ts","../src/middleware/tracing.ts","../src/middleware/health.ts","../src/utils/graphql.util.ts","../src/utils/tracing.util.ts","../src/logger/apollo.logger.ts","../src/server/plugin.configure.ts","../src/server/index.ts","../src/utils/error.util.ts","../src/utils/schema.util.ts"],"sourcesContent":["import pino from 'pino/browser';\n\n// Configuration for Cloudflare Workers environment\nconst isDev = process.env.NODE_ENV !== 'production';\nconst logLevel = process.env.LOG_LEVEL || (isDev ? 'debug' : 'info');\n\n// Custom serializers for Cloudflare Workers\nconst serializers = {\n err: (err: any) => {\n if (!err) return err;\n return {\n type: err.constructor?.name || err.name,\n message: err.message,\n stack: err.stack,\n code: err.code,\n statusCode: err.statusCode,\n };\n },\n req: (req: Request) => {\n if (!req) return req;\n return {\n method: req.method,\n url: req.url,\n headers: Object.fromEntries(req.headers.entries()),\n };\n },\n res: (res: Response) => {\n if (!res) return res;\n return {\n statusCode: res.status,\n headers: Object.fromEntries(res.headers.entries()),\n };\n },\n};\n\n// Create pino logger optimized for Cloudflare Workers\nexport const logger = pino({\n browser: {\n asObject: true,\n write: {\n info: (o: any) => {\n // In production, send to external logging service\n if (!isDev && globalThis.logshipper) {\n globalThis.logshipper.log(o);\n }\n console.log(JSON.stringify(o));\n },\n error: (o: any) => {\n if (!isDev && globalThis.logshipper) {\n globalThis.logshipper.log(o);\n }\n console.error(JSON.stringify(o));\n },\n debug: (o: any) => {\n if (isDev) {\n console.debug(JSON.stringify(o));\n }\n },\n warn: (o: any) => {\n if (!isDev && globalThis.logshipper) {\n globalThis.logshipper.log(o);\n }\n console.warn(JSON.stringify(o));\n },\n fatal: (o: any) => {\n if (!isDev && globalThis.logshipper) {\n globalThis.logshipper.log(o);\n }\n console.error(JSON.stringify(o));\n },\n trace: (o: any) => {\n if (isDev) {\n console.trace(JSON.stringify(o));\n }\n },\n },\n },\n level: logLevel,\n base: {\n env: process.env.NODE_ENV,\n service: 'graphql-subgraph',\n runtime: 'cloudflare-workers',\n },\n serializers,\n timestamp: () => `,\"timestamp\":\"${new Date().toISOString()}\"`,\n formatters: {\n level: (label: string) => {\n return {level: label.toUpperCase()};\n },\n log: (object: any) => {\n // Add request context if available\n if (globalThis.requestContext) {\n object.traceId = globalThis.requestContext.traceId;\n object.spanId = globalThis.requestContext.spanId;\n object.userId = globalThis.requestContext.userId;\n }\n return object;\n },\n },\n});\n\n// Helper for creating child loggers with context\nexport function createLogger(context: Record<string, any>) {\n return logger.child(context);\n}\n\n// Export pino types for TypeScript\nexport type Logger = typeof logger;\n\n// Declare global types for Cloudflare Workers\ndeclare global {\n var logshipper: {\n log: (data: any) => void;\n };\n var requestContext: {\n traceId?: string;\n spanId?: string;\n userId?: string;\n };\n}\n","export const Headers = {\n GATEWAY_USER: 'x-gateway-user',\n GATEWAY_USER_SIGNATURE: 'x-gateway-user-signature',\n AUTH: 'authorization',\n CLIENT_ID: 'x-client-id',\n} as const;\n","import type {ContextUser} from './types';\n\n/**\n * Verifies and parses user context from gateway headers\n * For Cloudflare Workers deployment, we use HMAC signature verification\n * to ensure the user data hasn't been tampered with\n */\nexport async function verifyAndParseUser(\n encodedUser: string | null,\n signature: string | null,\n secret: string\n): Promise<ContextUser | undefined> {\n if (!encodedUser || !signature) {\n return undefined;\n }\n\n try {\n // Verify HMAC signature\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n {name: 'HMAC', hash: 'SHA-256'},\n false,\n ['verify']\n );\n\n const signatureBuffer = hexToBuffer(signature);\n const dataBuffer = encoder.encode(encodedUser);\n\n const isValid = await crypto.subtle.verify(\n 'HMAC',\n key,\n signatureBuffer,\n dataBuffer\n );\n\n if (!isValid) {\n console.error('Invalid user signature');\n return undefined;\n }\n\n // Parse the verified user data\n const user = JSON.parse(atob(encodedUser));\n return user;\n } catch (error) {\n console.error('Error verifying user:', error);\n return undefined;\n }\n}\n\nfunction hexToBuffer(hex: string): ArrayBuffer {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n }\n // Return the ArrayBuffer directly, not SharedArrayBuffer\n return bytes.buffer as ArrayBuffer;\n}\n","/**\n * KV Cache implementation for Cloudflare Workers\n * Provides caching capabilities for GraphQL resolvers using Cloudflare KV\n */\n\nimport type {\n KVNamespace,\n KVNamespacePutOptions,\n} from '@cloudflare/workers-types';\n\nexport interface CacheOptions {\n ttl?: number; // Time to live in seconds\n cacheKey?: string; // Custom cache key\n}\n\nexport class KVCache {\n constructor(private kv: KVNamespace) {}\n\n /**\n * Get a value from cache\n */\n async get<T = any>(key: string): Promise<T | null> {\n try {\n const value = await this.kv.get(key);\n if (!value) return null;\n\n // Try to parse JSON, fallback to raw value\n try {\n return JSON.parse(value);\n } catch {\n return value as T;\n }\n } catch (error) {\n console.error(`Cache get error for key ${key}:`, error);\n return null;\n }\n }\n\n /**\n * Set a value in cache\n */\n async set(\n key: string,\n value: any,\n options: CacheOptions = {}\n ): Promise<void> {\n try {\n const serialized =\n typeof value === 'string' ? value : JSON.stringify(value);\n\n const kvOptions: KVNamespacePutOptions = {};\n if (options.ttl) {\n kvOptions.expirationTtl = options.ttl;\n }\n\n await this.kv.put(key, serialized, kvOptions);\n } catch (error) {\n console.error(`Cache set error for key ${key}:`, error);\n }\n }\n\n /**\n * Delete a value from cache\n */\n async delete(key: string): Promise<void> {\n try {\n await this.kv.delete(key);\n } catch (error) {\n console.error(`Cache delete error for key ${key}:`, error);\n }\n }\n\n /**\n * Check if a key exists in cache\n */\n async has(key: string): Promise<boolean> {\n try {\n const value = await this.kv.get(key);\n return value !== null;\n } catch (error) {\n console.error(`Cache has error for key ${key}:`, error);\n return false;\n }\n }\n\n /**\n * Clear multiple keys matching a prefix\n */\n async clearPrefix(prefix: string): Promise<void> {\n try {\n const list = await this.kv.list({prefix});\n const promises = list.keys.map((key) => this.kv.delete(key.name));\n await Promise.all(promises);\n } catch (error) {\n console.error(`Cache clear prefix error for ${prefix}:`, error);\n }\n }\n\n /**\n * Get or set a value with a factory function\n * Useful for cache-aside pattern\n */\n async getOrSet<T>(\n key: string,\n factory: () => Promise<T>,\n options: CacheOptions = {}\n ): Promise<T> {\n // Try to get from cache first\n const cached = await this.get<T>(key);\n if (cached !== null) {\n return cached;\n }\n\n // Fetch fresh value\n const fresh = await factory();\n\n // Cache the fresh value\n await this.set(key, fresh, options);\n\n return fresh;\n }\n}\n\n/**\n * Create a cache key from multiple parts\n */\nexport function createCacheKey(\n ...parts: (string | number | undefined)[]\n): string {\n return parts\n .filter((part) => part !== undefined)\n .map((part) => String(part))\n .join(':');\n}\n\n/**\n * Cache key patterns for different data types\n */\nexport const CacheKeys = {\n user: (id: string) => createCacheKey('user', id),\n query: (name: string, variables?: string) =>\n createCacheKey('query', name, variables),\n list: (type: string, page?: number) => createCacheKey('list', type, page),\n permission: (userId: string, resource: string) =>\n createCacheKey('perm', userId, resource),\n} as const;\n","/**\n * Redis Cache implementation for Cloudflare Workers\n * Alternative to KV for more advanced caching needs\n */\n\nimport type {CacheOptions} from './kv-cache';\n\nexport class RedisCache {\n private redis: any; // Use Bun.redis or @upstash/redis\n\n constructor(config: {url?: string; token?: string} = {}) {\n // Initialize Redis client\n // For Cloudflare Workers, use Upstash Redis REST API\n if (config.url && config.token) {\n // @upstash/redis setup\n this.initUpstash({url: config.url, token: config.token});\n } else if (typeof globalThis !== 'undefined' && (globalThis as any).Bun) {\n // Bun.redis for local development\n this.redis = (globalThis as any).Bun.redis;\n } else {\n // Mock redis for development without actual Redis\n this.redis = this.createMockRedis();\n }\n }\n\n private async initUpstash(config: {url: string; token: string}) {\n // Note: Install @upstash/redis if you want to use Redis\n // For now, using mock implementation\n this.redis = this.createMockRedis();\n }\n\n private createMockRedis() {\n const store = new Map<string, any>();\n return {\n get: async (key: string) => store.get(key),\n set: async (key: string, value: any) => {\n store.set(key, value);\n return 'OK';\n },\n setex: async (key: string, ttl: number, value: any) => {\n store.set(key, value);\n return 'OK';\n },\n del: async (...keys: string[]) => {\n keys.forEach((k) => store.delete(k));\n return keys.length;\n },\n exists: async (key: string) => (store.has(key) ? 1 : 0),\n keys: async (pattern: string) => {\n const regex = new RegExp(pattern.replace('*', '.*'));\n return Array.from(store.keys()).filter((k) => regex.test(k));\n },\n incrby: async (key: string, by: number) => {\n const val = store.get(key) || 0;\n const newVal = val + by;\n store.set(key, newVal);\n return newVal;\n },\n expire: async (key: string, seconds: number) => true,\n ttl: async (key: string) => -1,\n };\n }\n\n async get<T = any>(key: string): Promise<T | null> {\n try {\n const value = await this.redis.get(key);\n if (!value) return null;\n\n // Upstash automatically handles JSON\n return value as T;\n } catch (error) {\n console.error(`Redis get error for key ${key}:`, error);\n return null;\n }\n }\n\n async set(\n key: string,\n value: any,\n options: CacheOptions = {}\n ): Promise<void> {\n try {\n if (options.ttl) {\n await this.redis.setex(key, options.ttl, value);\n } else {\n await this.redis.set(key, value);\n }\n } catch (error) {\n console.error(`Redis set error for key ${key}:`, error);\n }\n }\n\n async delete(key: string): Promise<void> {\n try {\n await this.redis.del(key);\n } catch (error) {\n console.error(`Redis delete error for key ${key}:`, error);\n }\n }\n\n async has(key: string): Promise<boolean> {\n try {\n const exists = await this.redis.exists(key);\n return exists === 1;\n } catch (error) {\n console.error(`Redis has error for key ${key}:`, error);\n return false;\n }\n }\n\n async clearPrefix(prefix: string): Promise<void> {\n try {\n // Note: SCAN operations are not available in Upstash free tier\n // Consider using sets to track keys by prefix\n const keys = await this.redis.keys(`${prefix}*`);\n if (keys.length > 0) {\n await this.redis.del(...keys);\n }\n } catch (error) {\n console.error(`Redis clear prefix error for ${prefix}:`, error);\n }\n }\n\n async getOrSet<T>(\n key: string,\n factory: () => Promise<T>,\n options: CacheOptions = {}\n ): Promise<T> {\n const cached = await this.get<T>(key);\n if (cached !== null) {\n return cached;\n }\n\n const fresh = await factory();\n await this.set(key, fresh, options);\n\n return fresh;\n }\n\n // Additional Redis-specific methods\n\n async increment(key: string, by: number = 1): Promise<number> {\n return this.redis.incrby(key, by);\n }\n\n async expire(key: string, seconds: number): Promise<boolean> {\n return this.redis.expire(key, seconds);\n }\n\n async ttl(key: string): Promise<number> {\n return this.redis.ttl(key);\n }\n}\n","/**\n * Cache module for GraphQL resolvers\n * Provides unified caching interface with multiple backends\n */\n\nimport {KVCache, createCacheKey, CacheKeys} from './kv-cache';\nimport {RedisCache} from './redis-cache';\nimport type {CacheOptions} from './kv-cache';\n\nexport {KVCache, RedisCache, createCacheKey, CacheKeys};\nexport type {CacheOptions};\n\n/**\n * Cache factory - creates appropriate cache based on environment\n */\nexport function createCache(env: any): KVCache | RedisCache | null {\n // Check for KV namespace (Cloudflare Workers KV)\n if (env.CACHE_KV) {\n return new KVCache(env.CACHE_KV);\n }\n\n // Check for Redis configuration (Upstash)\n if (env.REDIS_URL && env.REDIS_TOKEN) {\n return new RedisCache({\n url: env.REDIS_URL,\n token: env.REDIS_TOKEN,\n });\n }\n\n // No cache available\n return null;\n}\n\n/**\n * Decorator for caching resolver results\n */\nexport function cached(\n options: CacheOptions & {keyGenerator?: (...args: any[]) => string} = {}\n) {\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (...args: any[]) {\n const context = args[2]; // GraphQL context is third argument\n const cache = context?.cache;\n\n if (!cache) {\n // No cache available, run original method\n return originalMethod.apply(this, args);\n }\n\n // Generate cache key\n const key = options.keyGenerator\n ? options.keyGenerator(...args)\n : createCacheKey(propertyKey, JSON.stringify(args[1])); // Use field name and arguments\n\n // Try cache-aside pattern\n return cache.getOrSet(\n key,\n () => originalMethod.apply(this, args),\n options\n );\n };\n\n return descriptor;\n };\n}\n\n/**\n * GraphQL DataLoader integration for batching and caching\n */\nexport class CachedDataLoader<K, V> {\n private loader: any; // DataLoader instance\n private cache: KVCache | RedisCache;\n\n constructor(\n batchFn: (keys: K[]) => Promise<V[]>,\n cache: KVCache | RedisCache,\n private options: CacheOptions = {}\n ) {\n this.cache = cache;\n\n // Initialize DataLoader with cache\n // Note: DataLoader is not included by default, install if needed\n // this.loader = new DataLoader(batchFn, { cache: this.createCacheMap() });\n }\n\n async load(key: K): Promise<V> {\n const cacheKey = createCacheKey('loader', String(key));\n\n return this.cache.getOrSet(\n cacheKey,\n async () => {\n // Fallback to batch function for single key\n // In production, use actual DataLoader\n return this.loader ? this.loader.load(key) : null;\n },\n this.options\n );\n }\n\n async loadMany(keys: K[]): Promise<V[]> {\n return Promise.all(keys.map((key) => this.load(key)));\n }\n\n async clear(key: K): Promise<void> {\n const cacheKey = createCacheKey('loader', String(key));\n await this.cache.delete(cacheKey);\n }\n\n async clearAll(): Promise<void> {\n await this.cache.clearPrefix('loader:');\n }\n}\n","/**\n * Environment configuration type\n */\nexport interface EnvConfig {\n // Core\n NODE_ENV: 'development' | 'test' | 'production';\n PORT: number;\n\n // Security\n GATEWAY_SECRET?: string;\n ALLOWED_ORIGINS: string[];\n\n // Logging\n LOG_LEVEL: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';\n\n // Rate limiting\n RATE_LIMIT_WINDOW_MS: number;\n RATE_LIMIT_MAX: number;\n\n // Monitoring\n ENABLE_METRICS: boolean;\n ENABLE_TRACING: boolean;\n\n // GraphQL\n MAX_QUERY_DEPTH: number;\n MAX_QUERY_COMPLEXITY: number;\n INTROSPECTION_ENABLED: boolean;\n\n // External services (optional)\n REDIS_URL?: string;\n REDIS_TOKEN?: string;\n LOG_SERVICE_URL?: string;\n LOG_SERVICE_TOKEN?: string;\n}\n\n/**\n * Lightweight environment parser inspired by @ltv/env\n */\nclass EnvParser {\n constructor(private env: Record<string, any>) {}\n\n string(key: string): string | undefined;\n string(key: string, defaultValue: string): string;\n string(key: string, defaultValue?: string): string | undefined {\n const value = this.env[key];\n return value !== undefined && value !== '' ? String(value) : defaultValue;\n }\n\n int(key: string): number | undefined;\n int(key: string, defaultValue: number): number;\n int(key: string, defaultValue?: number): number | undefined {\n const value = this.env[key];\n if (value === undefined || value === '') return defaultValue;\n const parsed = parseInt(String(value), 10);\n return isNaN(parsed) ? defaultValue : parsed;\n }\n\n bool(key: string): boolean | undefined;\n bool(key: string, defaultValue: boolean): boolean;\n bool(key: string, defaultValue?: boolean): boolean | undefined {\n const value = this.env[key];\n if (value === undefined || value === '') return defaultValue;\n const str = String(value).toLowerCase();\n return str === 'true' || str === '1';\n }\n\n array(key: string): string[] | undefined;\n array(key: string, defaultValue: string[]): string[];\n array(key: string, defaultValue?: string[]): string[] | undefined {\n const value = this.env[key];\n if (value === undefined || value === '') return defaultValue;\n if (Array.isArray(value)) return value;\n return String(value)\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n }\n\n enum<T extends string>(key: string, validValues: T[]): T | undefined;\n enum<T extends string>(key: string, validValues: T[], defaultValue: T): T;\n enum<T extends string>(\n key: string,\n validValues: T[],\n defaultValue?: T\n ): T | undefined {\n const value = this.string(key);\n if (value && validValues.includes(value as T)) {\n return value as T;\n }\n return defaultValue;\n }\n}\n\n/**\n * Environment loader for Cloudflare Workers\n */\nexport class EnvironmentLoader {\n private config: EnvConfig | null = null;\n\n /**\n * Load environment from Cloudflare Workers env object\n */\n load(env: Record<string, any>): EnvConfig {\n const parser = new EnvParser(env);\n\n this.config = {\n NODE_ENV: parser.enum(\n 'NODE_ENV',\n ['development', 'test', 'production'],\n 'production'\n ),\n PORT: parser.int('PORT', 3344),\n GATEWAY_SECRET: parser.string('GATEWAY_SECRET'),\n ALLOWED_ORIGINS: parser.array('ALLOWED_ORIGINS', [\n 'http://localhost:3000',\n ]),\n LOG_LEVEL: parser.enum(\n 'LOG_LEVEL',\n ['trace', 'debug', 'info', 'warn', 'error', 'fatal'],\n 'info'\n ),\n RATE_LIMIT_WINDOW_MS: parser.int('RATE_LIMIT_WINDOW_MS', 60000),\n RATE_LIMIT_MAX: parser.int('RATE_LIMIT_MAX', 100),\n ENABLE_METRICS: parser.bool('ENABLE_METRICS', true),\n ENABLE_TRACING: parser.bool('ENABLE_TRACING', true),\n MAX_QUERY_DEPTH: parser.int('MAX_QUERY_DEPTH', 10),\n MAX_QUERY_COMPLEXITY: parser.int('MAX_QUERY_COMPLEXITY', 1000),\n INTROSPECTION_ENABLED: parser.bool('INTROSPECTION_ENABLED', false),\n REDIS_URL: parser.string('REDIS_URL'),\n REDIS_TOKEN: parser.string('REDIS_TOKEN'),\n LOG_SERVICE_URL: parser.string('LOG_SERVICE_URL'),\n LOG_SERVICE_TOKEN: parser.string('LOG_SERVICE_TOKEN'),\n };\n\n return this.config;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): EnvConfig {\n if (!this.config) {\n throw new Error('Environment not loaded. Call load() first.');\n }\n return this.config;\n }\n\n /**\n * Helper getters for common checks\n */\n get isDev(): boolean {\n return this.config?.NODE_ENV === 'development';\n }\n\n get isTest(): boolean {\n return this.config?.NODE_ENV === 'test';\n }\n\n get isProd(): boolean {\n return this.config?.NODE_ENV === 'production';\n }\n}\n\n// Singleton instance\nexport const envLoader = new EnvironmentLoader();\n","import type {BaseContext as ApolloBaseContext} from '@apollo/server';\nimport type {ExecutionContext} from '@cloudflare/workers-types';\nimport type {CloudflareContextFunctionArgument} from '@as-integrations/cloudflare-workers';\nimport {logger} from '../logger';\nimport {Headers} from './constants';\nimport {verifyAndParseUser} from './auth';\nimport type {ContextUser} from './types';\nimport {createCache} from '@/cache';\nimport type {KVCache} from '@/cache';\nimport {envLoader, type EnvConfig} from '@/env';\n\nexport type {ContextUser} from './types';\n\n// TODO: Replace with actual jaeger types when available\nexport interface JaegerContext {\n rootSpan?: {\n getBaggageItem: (key: string) => string | undefined;\n };\n}\n\nexport interface BaseContext extends JaegerContext, ApolloBaseContext {\n user?: ContextUser;\n logger: typeof logger;\n executionCtx: ExecutionContext;\n cache?: KVCache; // KV cache for resolvers\n env: EnvConfig; // Validated environment configuration\n\n /** @deprecated should not be used directly */\n authorization: string;\n clientId: string;\n}\n\nexport type ContextExtendFunction<T extends BaseContext> = (\n ctx: BaseContext,\n honoContext: CloudflareContextFunctionArgument<unknown>\n) => T | Promise<T>;\n\nasync function createBaseContext(\n honoContext: CloudflareContextFunctionArgument<any>\n): Promise<BaseContext> {\n const request = honoContext.request;\n const rawEnv = honoContext.env;\n\n // Load and validate environment configuration\n const env = envLoader.load(rawEnv);\n\n // Parse user from gateway headers with signature verification\n let user: ContextUser | undefined;\n\n // Check if this is a subgraph request from gateway\n const encodedUser = request.headers.get(Headers.GATEWAY_USER);\n if (encodedUser) {\n // In production, verify signature. In dev, allow without signature\n if (env.GATEWAY_SECRET) {\n const signature = request.headers.get(Headers.GATEWAY_USER_SIGNATURE);\n user = await verifyAndParseUser(\n encodedUser,\n signature,\n env.GATEWAY_SECRET\n );\n } else if (env.NODE_ENV !== 'production') {\n // Development mode: parse without verification\n try {\n user = JSON.parse(atob(encodedUser));\n } catch (e) {\n console.error('Failed to parse user in dev mode:', e);\n }\n }\n }\n\n // Create cache instance if KV namespace is available\n // Pass raw env for KV bindings, not the parsed config\n const cache = createCache(rawEnv) as KVCache | undefined;\n if (cache) {\n logger.info('KV cache initialized for GraphQL resolvers');\n }\n\n return {\n user,\n logger,\n cache,\n env, // Pass validated env config\n executionCtx: honoContext.ctx,\n authorization: request.headers.get(Headers.AUTH) || '',\n clientId: request.headers.get(Headers.CLIENT_ID) || '',\n };\n}\n\nexport function createContextFunction<T extends BaseContext>(\n extendContext?: ContextExtendFunction<T>\n) {\n if (!extendContext) {\n return (honoContext: CloudflareContextFunctionArgument<unknown>) =>\n createBaseContext(honoContext);\n }\n\n return async (honoContext: CloudflareContextFunctionArgument<unknown>) => {\n const baseContext = await createBaseContext(honoContext);\n return extendContext(baseContext, honoContext);\n };\n}\n","export function assertDefined<T>(t: T | undefined, msg: string): t is T {\n if (t === undefined) {\n throw new Error('Assertion failed when configuring server: ' + msg);\n }\n return true;\n}\n","import {\n createContextFunction,\n type BaseContext,\n type ContextExtendFunction,\n} from '@/context';\nimport {assertDefined} from '@/utils/builder.util';\nimport type {ApolloServerOptions, ApolloServerPlugin} from '@apollo/server';\nimport {ApolloServer} from '@apollo/server';\nimport {startServerAndCreateCloudflareWorkersHandler} from '@as-integrations/cloudflare-workers';\nimport type {GraphQLSchema} from 'graphql';\nimport type {Hono} from 'hono';\nimport {configureHono} from './hono.configure';\nimport {configurePlugins} from './plugin.configure';\n\nexport type Runner = {\n fetch: typeof Hono.prototype.fetch;\n port?: number;\n};\n\nexport type ServerConfig<TDatasource, TContext extends BaseContext> = {\n path?: string;\n apollo: Partial<ApolloServerOptions<BaseContext>>;\n datasources: (cache: any, context: TContext) => TDatasource;\n extendContext?: ContextExtendFunction<TContext>;\n};\n\nexport class ServerBuilder<TDatasource, TContext extends BaseContext> {\n readonly app: Hono;\n\n readonly schema: GraphQLSchema;\n readonly plugins: ApolloServerPlugin<BaseContext>[] = [];\n\n constructor(readonly config: ServerConfig<TDatasource, TContext>) {\n this.assert();\n\n // TODO: Configure metrics\n this.app = configureHono(this);\n this.schema = this.config.apollo.schema as GraphQLSchema;\n }\n\n configure(): Runner {\n const honoApp = this.app;\n configurePlugins(this);\n const server = new ApolloServer<TContext>({\n schema: this.schema,\n plugins: this.plugins,\n });\n\n const cfHandler = startServerAndCreateCloudflareWorkersHandler<any, any>(\n server,\n {\n context: async (c) =>\n createContextFunction(this.config.extendContext)(c),\n }\n );\n\n honoApp.all(this.config.path ?? '/', async (c) => {\n // In local development, executionCtx doesn't exist\n // In Cloudflare Workers, it's provided\n let executionCtx;\n try {\n executionCtx = c.executionCtx;\n } catch (e) {\n // Create a mock executionCtx for local development\n executionCtx = {\n waitUntil: (promise: Promise<any>) => promise,\n passThroughOnException: () => {},\n };\n }\n return cfHandler(c.req.raw, c.env, executionCtx);\n });\n\n return {\n // fetch: app.fetch,\n async fetch(request, env, ctx) {\n await Promise.resolve();\n return honoApp.fetch(request, env, ctx);\n },\n port: 3344, // Only used in local development\n };\n }\n\n assert() {\n assertDefined(\n this.config.apollo.schema,\n 'Apollo server config must have a schema'\n );\n }\n}\n","import {BaseContext} from '@/context';\nimport {Hono} from 'hono';\nimport {cors} from 'hono/cors';\nimport {compress} from 'hono/compress';\nimport {ServerBuilder} from './server.builder';\nimport {createValidationMiddleware} from '@/middleware/validation';\nimport {createRateLimitMiddleware} from '@/middleware/rate-limit';\nimport {createTracingMiddleware} from '@/middleware/tracing';\nimport {configureHealthChecks} from '@/middleware/health';\n\nexport function configureHono<TContext extends BaseContext>(\n builder: ServerBuilder<unknown, TContext>\n) {\n const app = new Hono();\n\n // Add environment to context for all middleware\n app.use('*', async (c, next) => {\n // Get environment from Cloudflare or set default\n const rawEnv = c.env || {};\n const env =\n typeof rawEnv.NODE_ENV !== 'undefined'\n ? rawEnv // Cloudflare Workers env\n : {}; // Local development fallback\n c.set('env', env);\n await next();\n });\n\n // Add request tracing first for all requests\n app.use('*', createTracingMiddleware());\n\n // Add compression for responses\n app.use('*', compress());\n\n // Add validation middleware\n app.use('*', createValidationMiddleware());\n\n // Add rate limiting\n app.use('*', createRateLimitMiddleware());\n\n // Configure health checks\n configureHealthChecks(app, {\n checks: {\n graphql: async () => true, // Check GraphQL schema is loaded\n },\n });\n\n // Configure CORS for development and production\n app.use(\n '/*',\n cors({\n origin: (origin, c) => {\n // Get environment from context\n const env = c.env;\n const isProd = env.NODE_ENV === 'production';\n const allowedOrigins = env.ALLOWED_ORIGINS\n ? typeof env.ALLOWED_ORIGINS === 'string'\n ? env.ALLOWED_ORIGINS.split(',').map((s) => s.trim())\n : env.ALLOWED_ORIGINS\n : ['http://localhost:3000'];\n\n // Allow all origins in development\n if (!isProd) {\n return origin || '*';\n }\n // In production, configure allowed origins\n return allowedOrigins.includes(origin) ? origin : allowedOrigins[0];\n },\n allowHeaders: [\n 'Content-Type',\n 'Authorization',\n 'x-apollo-operation-name',\n 'apollo-require-preflight',\n ],\n allowMethods: ['POST', 'GET', 'OPTIONS'],\n credentials: true,\n maxAge: 86400,\n })\n );\n\n // Add security headers\n app.use('*', async (c, next) => {\n await next();\n\n const env = c.get('env');\n const isProd = env?.NODE_ENV === 'production';\n\n // Security headers for GraphQL endpoints\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('X-Frame-Options', 'DENY');\n c.header('X-XSS-Protection', '1; mode=block');\n c.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n\n // Remove server identification\n c.header('Server', 'GraphQL');\n\n // Content Security Policy for GraphQL\n if (isProd) {\n c.header(\n 'Content-Security-Policy',\n \"default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';\"\n );\n // HSTS for production\n c.header(\n 'Strict-Transport-Security',\n 'max-age=31536000; includeSubDomains; preload'\n );\n }\n });\n\n return app;\n}\n","import type {MiddlewareHandler} from 'hono';\nimport {AppError, ErrorCode} from '@/utils/error.util';\n\ninterface ValidationOptions {\n maxQueryDepth?: number;\n maxQueryComplexity?: number;\n maxAliasCount?: number;\n}\n\nexport function createValidationMiddleware(\n options: ValidationOptions = {}\n): MiddlewareHandler {\n return async (c, next) => {\n try {\n // Get environment from context\n const env = c.get('env');\n const maxQueryDepth = options.maxQueryDepth || env?.MAX_QUERY_DEPTH || 10;\n const maxQueryComplexity =\n options.maxQueryComplexity || env?.MAX_QUERY_COMPLEXITY || 1000;\n const maxAliasCount = options.maxAliasCount || 15;\n // Validate content type for GraphQL\n const contentType = c.req.header('content-type');\n if (\n c.req.method === 'POST' &&\n !contentType?.includes('application/json')\n ) {\n return c.json(\n {\n errors: [\n {\n message: 'Content-Type must be application/json',\n extensions: {code: 'BAD_REQUEST'},\n },\n ],\n },\n 400\n );\n }\n\n // Rate limiting headers check\n const clientId = c.req.header('x-client-id');\n if (!clientId && env?.NODE_ENV === 'production') {\n return c.json(\n {\n errors: [\n {\n message: 'Client identification required',\n extensions: {code: 'BAD_REQUEST'},\n },\n ],\n },\n 400\n );\n }\n\n await next();\n } catch (error) {\n console.error('Validation middleware error:', error);\n return c.json(\n {\n errors: [\n {\n message: 'Request validation failed',\n extensions: {code: 'INTERNAL_SERVER_ERROR'},\n },\n ],\n },\n 500\n );\n }\n };\n}\n","import type {MiddlewareHandler} from 'hono';\n\ninterface RateLimitOptions {\n windowMs?: number;\n max?: number;\n keyGenerator?: (c: any) => string;\n}\n\nexport function createRateLimitMiddleware(\n options: RateLimitOptions = {}\n): MiddlewareHandler {\n const {\n keyGenerator = (c) =>\n c.req.header('x-client-id') ||\n c.req.header('cf-connecting-ip') ||\n 'anonymous',\n } = options;\n\n return async (c, next) => {\n // Get environment from context\n const env = c.get('env');\n const windowMs = options.windowMs || env?.RATE_LIMIT_WINDOW_MS || 60 * 1000;\n const max = options.max || env?.RATE_LIMIT_MAX || 100;\n\n const key = keyGenerator(c);\n const rateLimitKey = `rate_limit:${key}`;\n\n // In Cloudflare Workers, use KV or Durable Objects for rate limiting\n // This is a simplified example\n if (c.env?.RATE_LIMIT_KV) {\n const current = await c.env.RATE_LIMIT_KV.get(rateLimitKey);\n const count = current ? parseInt(current, 10) : 0;\n\n if (count >= max) {\n return c.json(\n {\n errors: [\n {\n message: 'Too many requests',\n extensions: {\n code: 'RATE_LIMITED',\n retryAfter: windowMs / 1000,\n },\n },\n ],\n },\n 429,\n {\n 'Retry-After': String(windowMs / 1000),\n 'X-RateLimit-Limit': String(max),\n 'X-RateLimit-Remaining': '0',\n 'X-RateLimit-Reset': String(Date.now() + windowMs),\n }\n );\n }\n\n // Increment counter\n await c.env.RATE_LIMIT_KV.put(rateLimitKey, String(count + 1), {\n expirationTtl: windowMs / 1000,\n });\n\n // Add rate limit headers\n c.header('X-RateLimit-Limit', String(max));\n c.header('X-RateLimit-Remaining', String(max - count - 1));\n c.header('X-RateLimit-Reset', String(Date.now() + windowMs));\n }\n\n await next();\n };\n}\n","import type {MiddlewareHandler} from 'hono';\nimport {logger} from '@/logger';\n\nexport function createTracingMiddleware(): MiddlewareHandler {\n return async (c, next) => {\n // Get environment from context\n const env = c.get('env');\n // Extract or generate trace ID\n const traceId = c.req.header('x-trace-id') || generateTraceId();\n const spanId = generateSpanId();\n const parentSpanId = c.req.header('x-parent-span-id');\n const userId = c.get('userId');\n\n // Set global request context for pino logger\n globalThis.requestContext = {\n traceId,\n spanId,\n userId,\n };\n\n // Store in Hono context for other middleware\n c.set('traceId', traceId);\n c.set('spanId', spanId);\n\n // Add to response headers for correlation\n c.header('x-trace-id', traceId);\n c.header('x-span-id', spanId);\n\n const startTime = Date.now();\n\n try {\n await next();\n } finally {\n const duration = Date.now() - startTime;\n\n // Log request metrics using pino\n logger.info(\n {\n type: 'request',\n traceId,\n spanId,\n parentSpanId,\n method: c.req.method,\n path: c.req.path,\n status: c.res.status,\n duration,\n userAgent: c.req.header('user-agent'),\n ip:\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for'),\n },\n `${c.req.method} ${c.req.path} - ${c.res.status} (${duration}ms)`\n );\n\n // Add Server-Timing header for performance monitoring\n c.header('Server-Timing', `total;dur=${duration}`);\n\n // Clear global request context\n delete globalThis.requestContext;\n }\n };\n}\n\nfunction generateTraceId(): string {\n // Generate a 32-character hex string (128 bits)\n return Array.from(crypto.getRandomValues(new Uint8Array(16)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction generateSpanId(): string {\n // Generate a 16-character hex string (64 bits)\n return Array.from(crypto.getRandomValues(new Uint8Array(8)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n","import type {Hono} from 'hono';\n\ninterface HealthCheckOptions {\n checks?: {\n [key: string]: () => Promise<boolean>;\n };\n}\n\nexport function configureHealthChecks(\n app: Hono,\n options: HealthCheckOptions = {}\n) {\n // Liveness probe - is the service running?\n app.get('/health', (c) => {\n return c.json({\n status: 'ok',\n timestamp: new Date().toISOString(),\n uptime: process.uptime ? process.uptime() : 0,\n });\n });\n\n // Readiness probe - is the service ready to accept traffic?\n app.get('/ready', async (c) => {\n const checks = options.checks || {};\n const results: Record<string, boolean> = {};\n let allHealthy = true;\n\n for (const [name, check] of Object.entries(checks)) {\n try {\n results[name] = await check();\n if (!results[name]) allHealthy = false;\n } catch (error) {\n results[name] = false;\n allHealthy = false;\n }\n }\n\n const status = allHealthy ? 200 : 503;\n return c.json(\n {\n status: allHealthy ? 'ready' : 'not_ready',\n checks: results,\n timestamp: new Date().toISOString(),\n },\n status\n );\n });\n\n // Metrics endpoint (for Prometheus)\n app.get('/metrics', (c) => {\n // In production, integrate with Prometheus client\n return c.text(`# HELP graphql_requests_total Total number of GraphQL requests\n# TYPE graphql_requests_total counter\ngraphql_requests_total 0\n\n# HELP graphql_errors_total Total number of GraphQL errors\n# TYPE graphql_errors_total counter\ngraphql_errors_total 0\n\n# HELP graphql_duration_seconds GraphQL request duration\n# TYPE graphql_duration_seconds histogram\ngraphql_duration_seconds_bucket{le=\"0.1\"} 0\ngraphql_duration_seconds_bucket{le=\"0.5\"} 0\ngraphql_duration_seconds_bucket{le=\"1\"} 0\ngraphql_duration_seconds_bucket{le=\"+Inf\"} 0\ngraphql_duration_seconds_sum 0\ngraphql_duration_seconds_count 0`);\n });\n}\n","import type {GraphQLError} from 'graphql';\nimport {ApolloServerErrorCode} from '@apollo/server/errors';\n\n// Unfortunately, this string constant is not exposed separately\nconst BAD_USER_INPUT_CODE = ApolloServerErrorCode.BAD_USER_INPUT;\n\nexport const getNonUserInputErrors = (errors: readonly GraphQLError[]) =>\n errors.filter((e) => e.extensions?.code !== BAD_USER_INPUT_CODE);\n","// import {CommonBaggageItems} from '@hiliosai/jaeger-apollo-plugin';\n\nimport type {GraphQLRequestContext} from '@apollo/server';\nimport {BaseContext} from '../context';\n\nexport enum CommonBaggageItems {\n ROOT_OP_NAME = 'root_op_name',\n}\n\nexport const getOpsName = (gqlCtx: GraphQLRequestContext<BaseContext>) =>\n gqlCtx.contextValue.rootSpan?.getBaggageItem(\n CommonBaggageItems.ROOT_OP_NAME\n ) ||\n gqlCtx.request.operationName ||\n gqlCtx.operationName ||\n 'UNKNOWN';\n","import {getNonUserInputErrors} from '@/utils/graphql.util';\nimport {getOpsName} from '@/utils/tracing.util';\nimport type {ApolloServerPlugin} from '@apollo/server';\nimport type {BaseContext} from '../context';\nimport {createLogger} from './index';\n\nconst getUserId = (gqlCtx: BaseContext) => gqlCtx.user?.id ?? 'UNKNOWN';\n\nexport function createApolloLoggingPlugin(): ApolloServerPlugin<BaseContext> {\n return {\n async requestDidStart(requestContext) {\n const start = Date.now();\n const operationName = requestContext.request.operationName;\n\n // Create a logger with request context\n const requestLogger = createLogger({\n source: 'apollo',\n operationName,\n });\n\n return {\n async didResolveOperation(gqlCtx) {\n const userId = getUserId(gqlCtx.contextValue);\n const operation = getOpsName(gqlCtx);\n\n requestLogger.info(\n {\n event: 'operation_resolved',\n operation,\n userId,\n operationName: gqlCtx.operationName,\n variables: gqlCtx.request.variables,\n },\n `Operation [${operation}] resolved for user [${userId}]`\n );\n },\n\n async willSendResponse(gqlCtx) {\n const errors = getNonUserInputErrors(gqlCtx.errors || []);\n const duration = Date.now() - start;\n const userId = getUserId(gqlCtx.contextValue);\n const operation = getOpsName(gqlCtx);\n\n if (errors.length > 0) {\n // Log errors with full context\n requestLogger.error(\n {\n event: 'operation_error',\n operation,\n userId,\n duration,\n errors: errors.map((e) => ({\n message: e.message,\n path: e.path,\n extensions: e.extensions,\n stack: e.stack,\n })),\n },\n `Operation [${operation}] failed with ${errors.length} error(s)`\n );\n }\n\n // Log completion with metrics\n requestLogger.info(\n {\n event: 'operation_complete',\n operation,\n userId,\n duration,\n success: errors.length === 0,\n errorCount: errors.length,\n },\n `Operation [${operation}] completed in ${duration}ms${errors.length > 0 ? ' with errors' : ' successfully'}`\n );\n },\n\n async didEncounterErrors(gqlCtx) {\n const errors = gqlCtx.errors || [];\n const userId = getUserId(gqlCtx.contextValue);\n\n requestLogger.error(\n {\n event: 'graphql_errors',\n userId,\n errors: errors.map((e) => ({\n message: e.message,\n path: e.path,\n extensions: e.extensions,\n })),\n },\n `GraphQL execution encountered ${errors.length} error(s)`\n );\n },\n };\n },\n };\n}\n","import type {BaseContext} from '@/context';\nimport {createApolloLoggingPlugin} from '@/logger/apollo.logger';\nimport {ApolloServerPluginLandingPageDisabled} from '@apollo/server/plugin/disabled';\nimport {ServerBuilder} from './server.builder';\n\nexport function configurePlugins<TContext extends BaseContext>(\n builder: ServerBuilder<unknown, TContext>\n) {\n // disable landing page\n builder.plugins.push(ApolloServerPluginLandingPageDisabled());\n\n // logger\n builder.plugins.push(createApolloLoggingPlugin());\n}\n","import {BaseContext} from '@/context';\nimport {logger} from '@/logger';\nimport {ServerBuilder, ServerConfig} from './server.builder';\n\nexport type BaseServerOptions = {\n /**\n * The version of the server\n *\n * @type {string}\n */\n version: string;\n /**\n * The name of the server\n *\n * @type {string}\n */\n name: string;\n\n /**\n * The port to listen on\n *\n * @type {number}\n */\n port?: number;\n\n /**\n * The hostname to listen on\n *\n * @type {string}\n */\n hostname?: string;\n};\n\nexport type ServerOptions<\n TDatasource,\n TContext extends BaseContext,\n> = BaseServerOptions & {\n config: ServerConfig<TDatasource, TContext>;\n};\n\nconst SERVICE_NAME_REGEX = /^[a-z0-9\\-_]+$/i;\n\nexport function createGraphQLServer<TDatasource, TContext extends BaseContext>(\n options: ServerOptions<TDatasource, TContext>\n) {\n if (!SERVICE_NAME_REGEX.test(options.name)) {\n throw new Error('Service name must be alphanumeric, hyphen, or underscore');\n }\n logger.info(`Creating GraphQL server ${options.name} v${options.version}`);\n return new ServerBuilder<TDatasource, TContext>(options.config);\n}\n","import {GraphQLError} from 'graphql';\nimport {ApolloServerErrorCode} from '@apollo/server/errors';\n\nexport enum ErrorCode {\n // Authentication & Authorization\n UNAUTHENTICATED = 'UNAUTHENTICATED',\n FORBIDDEN = 'FORBIDDEN',\n\n // Validation\n VALIDATION_FAILED = 'VALIDATION_FAILED',\n\n // Rate Limiting\n RATE_LIMITED = 'RATE_LIMITED',\n\n // External Service\n EXTERNAL_SERVICE_ERROR = 'EXTERNAL_SERVICE_ERROR',\n\n // Data\n NOT_FOUND = 'NOT_FOUND',\n CONFLICT = 'CONFLICT',\n}\n\nexport class AppError extends GraphQLError {\n constructor(\n message: string,\n code: ErrorCode | ApolloServerErrorCode,\n extensions?: Record<string, any>\n ) {\n super(message, {\n extensions: {\n code,\n ...extensions,\n },\n });\n }\n}\n\nexport function createErrorHandler(logger: any) {\n return (error: Error, context: any) => {\n const errorId = generateErrorId();\n\n logger.error({\n errorId,\n message: error.message,\n stack: error.stack,\n context: {\n user: context.user?.id,\n operation: context.operation?.name,\n },\n });\n\n if (error instanceof GraphQLError) {\n return error;\n }\n\n // Don't expose internal errors in production\n if (process.env.NODE_ENV === 'production') {\n return new AppError(\n 'Internal server error',\n ApolloServerErrorCode.INTERNAL_SERVER_ERROR,\n {errorId}\n );\n }\n\n return error;\n };\n}\n\nfunction generateErrorId(): string {\n return `err_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n","import type {DocumentNode} from 'graphql';\n\nexport const createSchemaModule = (\n typeDefs: DocumentNode,\n resolvers?: any\n) => ({\n typeDefs,\n resolvers,\n});\n\nexport type SchemaModule = ReturnType<typeof createSchemaModule>;\nexport {gql} from 'graphql-tag';\n"],"mappings":"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","names":["cached","cached","ApolloServerErrorCode","ErrorCode"]}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "cfw-graphql-bootstrap",
3
+ "version": "1.0.0",
4
+ "description": "Enterprise-grade GraphQL server for Cloudflare Workers",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "dev": "tsup --watch",
21
+ "clean": "rm -rf dist",
22
+ "prepublishOnly": "bun run build",
23
+ "test-server": "bun run --watch src/test-server.ts",
24
+ "format": "prettier --write .",
25
+ "cf-typegen": "wrangler types"
26
+ },
27
+ "dependencies": {
28
+ "@apollo/subgraph": "2.12.2",
29
+ "@as-integrations/cloudflare-workers": "1.1.1",
30
+ "graphql": "16.12.0",
31
+ "graphql-tag": "2.12.6",
32
+ "pino": "10.2.0"
33
+ },
34
+ "peerDependencies": {
35
+ "@apollo/server": "^5.0.0",
36
+ "@cloudflare/workers-types": "^4.0.0",
37
+ "hono": "^4.0.0",
38
+ "typescript": "^5.0.0"
39
+ },
40
+ "devDependencies": {
41
+ "@apollo/server": "5.2.0",
42
+ "@cloudflare/workers-types": "4.20260116.0",
43
+ "@hiliosai/prettier": "1.0.2",
44
+ "@hiliosai/typescript": "1.0.1",
45
+ "@types/bun": "latest",
46
+ "hono": "4.11.4",
47
+ "tsup": "^8.0.2",
48
+ "wrangler": "4.59.2"
49
+ },
50
+ "prettier": "@hiliosai/prettier"
51
+ }