cfw-graphql-bootstrap 1.0.12 → 1.0.13

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.
package/dist/index.js CHANGED
@@ -1827,9 +1827,6 @@ var AbstractDatasource = class {
1827
1827
  * Override this method to add custom initialization logic
1828
1828
  */
1829
1829
  initialize() {
1830
- if (this.name) {
1831
- this.logger?.info(`Initializing datasource: ${this.name}`);
1832
- }
1833
1830
  }
1834
1831
  async init() {
1835
1832
  this.logger?.info(`Initializing datasource: ${this.name}`);
@@ -2052,7 +2049,6 @@ var PrismaD1Datasource = class extends AbstractDatasource {
2052
2049
  return this._client;
2053
2050
  }
2054
2051
  async connect() {
2055
- const startTotal = Date.now();
2056
2052
  try {
2057
2053
  this.logger.info("Connecting Prisma D1 datasource...");
2058
2054
  if (!this.context.db) {
@@ -2068,24 +2064,16 @@ var PrismaD1Datasource = class extends AbstractDatasource {
2068
2064
  this._client = global.__prismaD1Clients.get(clientKey);
2069
2065
  this.logger.debug(`Using cached Prisma client for ${clientKey}`);
2070
2066
  } else {
2071
- const startAdapter = Date.now();
2072
2067
  this.logger.debug("Creating new PrismaD1 adapter and client...");
2073
2068
  const d1Module = await import("@prisma/adapter-d1");
2074
2069
  const PrismaD1 = d1Module.PrismaD1 ?? d1Module.default;
2075
2070
  const adapter = new PrismaD1(this.context.db);
2076
- this.logger.debug(`Adapter created in ${Date.now() - startAdapter}ms`);
2077
- const startClient = Date.now();
2078
2071
  this._client = this.createClient(adapter);
2079
- this.logger.debug(`Client created in ${Date.now() - startClient}ms`);
2080
2072
  global.__prismaD1Clients.set(clientKey, this._client);
2081
2073
  this.logger.debug(`Cached new Prisma client for ${clientKey}`);
2082
2074
  }
2083
- const startConnect = Date.now();
2084
2075
  await this._client.$connect();
2085
- this.logger.info(
2086
- `\u2713 Prisma D1 datasource connected in ${Date.now() - startConnect}ms`
2087
- );
2088
- this.logger.info(`Total connection time: ${Date.now() - startTotal}ms`);
2076
+ this.logger.info("\u2713 Prisma D1 datasource connected");
2089
2077
  } catch (error) {
2090
2078
  this.logger.error("Failed to connect Prisma D1 datasource:", error);
2091
2079
  throw new Error(
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/prisma-error.util.ts","../src/plugins/error-handler.plugin.ts","../src/logger/index.ts","../src/cache/kv-cache.ts","../src/cache/batching-datasource.ts","../src/cache/apollo-cache-adapter.ts","../src/cache/index.ts","../src/context/constants.ts","../src/context/auth.ts","../src/env/config.ts","../src/context/index.ts","../src/utils/builder.util.ts","../src/server/server.builder.ts","../src/datasources/apollo-plugin.datasource.ts","../src/server/hono.configure.ts","../src/middleware/validation.ts","../src/middleware/rate-limit.ts","../src/tracing/tracer.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/plugins/tracing.plugin.ts","../src/server/index.ts","../src/utils/error.util.ts","../src/utils/schema.util.ts","../src/index.ts","../src/datasources/base.datasource.ts","../src/datasources/rest.datasource.ts","../src/datasources/prisma.datasource.ts"],"sourcesContent":["import {GraphQLError} from 'graphql';\nimport type {Logger} from 'pino';\n\n// Prisma error types (we'll check by name since we can't import from runtime)\ninterface PrismaError extends Error {\n code?: string;\n meta?: Record<string, any>;\n clientVersion?: string;\n}\n\n/**\n * Maps Prisma error codes to user-friendly messages\n * Hides internal implementation details from client\n */\nconst prismaErrorMap: Record<string, (error: PrismaError) => GraphQLError> = {\n // Unique constraint violation\n P2002: (error) => {\n const field = error.meta?.target || error.meta?.field_name || 'field';\n const fields = Array.isArray(field) ? field.join(', ') : field;\n return new GraphQLError(`A record with this ${fields} already exists`, {\n extensions: {\n code: 'CONFLICT',\n field: fields,\n },\n });\n },\n\n // Foreign key constraint violation\n P2003: (error) => {\n return new GraphQLError(\n 'The operation failed due to a reference constraint',\n {\n extensions: {\n code: 'FOREIGN_KEY_VIOLATION',\n field: error.meta?.field_name,\n },\n }\n );\n },\n\n // Record not found\n P2001: (error) => {\n return new GraphQLError('The requested record was not found', {\n extensions: {\n code: 'NOT_FOUND',\n },\n });\n },\n\n // Record not found for operation\n P2025: (error) => {\n const operation = error.meta?.cause || 'operation';\n return new GraphQLError(`Record to ${operation} not found`, {\n extensions: {\n code: 'NOT_FOUND',\n },\n });\n },\n\n // Required field missing\n P2012: (error) => {\n const field = error.meta?.field_name || 'field';\n return new GraphQLError(`Missing required field: ${field}`, {\n extensions: {\n code: 'VALIDATION_ERROR',\n field,\n },\n });\n },\n\n // Required argument missing\n P2013: (error) => {\n const argument = error.meta?.argument_name || 'argument';\n return new GraphQLError(`Missing required argument: ${argument}`, {\n extensions: {\n code: 'VALIDATION_ERROR',\n argument,\n },\n });\n },\n\n // Invalid value\n P2006: (error) => {\n const field = error.meta?.field_name || 'field';\n return new GraphQLError(`Invalid value provided for ${field}`, {\n extensions: {\n code: 'VALIDATION_ERROR',\n field,\n },\n });\n },\n\n // Value too long\n P2000: (error) => {\n const column = error.meta?.column_name || 'field';\n return new GraphQLError(`The value provided for ${column} is too long`, {\n extensions: {\n code: 'VALIDATION_ERROR',\n field: column,\n },\n });\n },\n\n // Null constraint violation\n P2011: (error) => {\n return new GraphQLError('A required field cannot be null', {\n extensions: {\n code: 'NULL_CONSTRAINT_VIOLATION',\n },\n });\n },\n\n // Transaction timeout\n P2024: (error) => {\n return new GraphQLError('The operation timed out. Please try again.', {\n extensions: {\n code: 'TIMEOUT',\n },\n });\n },\n\n // Transaction conflict\n P2034: (error) => {\n return new GraphQLError(\n 'The operation could not be completed due to a conflict. Please try again.',\n {\n extensions: {\n code: 'TRANSACTION_CONFLICT',\n },\n }\n );\n },\n};\n\n/**\n * Sanitizes Prisma errors before sending to client\n * Removes implementation details like \"prisma.speaker.create()\"\n */\nexport function sanitizePrismaError(error: any, logger?: Logger): GraphQLError {\n // Log the original error for debugging\n if (logger) {\n logger.error(\n {\n name: error.name,\n code: error.code,\n meta: error.meta,\n message: error.message,\n stack: error.stack,\n },\n 'Prisma error occurred'\n );\n }\n\n // Check if it's a Prisma error\n const isPrismaError =\n error.name &&\n (error.name.includes('PrismaClient') ||\n error.name === 'PrismaClientKnownRequestError' ||\n error.name === 'PrismaClientUnknownRequestError' ||\n error.name === 'PrismaClientRustPanicError' ||\n error.name === 'PrismaClientInitializationError' ||\n error.name === 'PrismaClientValidationError');\n\n if (!isPrismaError) {\n // Not a Prisma error, return as-is\n return error instanceof GraphQLError\n ? error\n : new GraphQLError('An unexpected error occurred', {\n extensions: {\n code: 'INTERNAL_SERVER_ERROR',\n },\n });\n }\n\n // Handle specific Prisma error codes\n if (error.code && prismaErrorMap[error.code]) {\n return prismaErrorMap[error.code](error);\n }\n\n // Handle different Prisma error types\n switch (error.name) {\n case 'PrismaClientValidationError':\n // Remove Prisma-specific details from validation errors\n return new GraphQLError('Invalid input data provided', {\n extensions: {\n code: 'VALIDATION_ERROR',\n },\n });\n\n case 'PrismaClientInitializationError':\n return new GraphQLError(\n 'Database connection error. Please try again later.',\n {\n extensions: {\n code: 'SERVICE_UNAVAILABLE',\n },\n }\n );\n\n case 'PrismaClientRustPanicError':\n return new GraphQLError(\n 'A critical database error occurred. Please contact support.',\n {\n extensions: {\n code: 'INTERNAL_SERVER_ERROR',\n },\n }\n );\n\n case 'PrismaClientUnknownRequestError':\n return new GraphQLError('An unexpected database error occurred', {\n extensions: {\n code: 'INTERNAL_SERVER_ERROR',\n },\n });\n\n default:\n // Generic Prisma error\n return new GraphQLError('A database operation failed', {\n extensions: {\n code: error.code || 'DATABASE_ERROR',\n },\n });\n }\n}\n\n/**\n * Wraps async resolver functions to catch and sanitize Prisma errors\n */\nexport function withPrismaErrorHandling<\n T extends (...args: any[]) => Promise<any>,\n>(fn: T, logger?: Logger): T {\n return (async (...args: Parameters<T>) => {\n try {\n return await fn(...args);\n } catch (error) {\n throw sanitizePrismaError(error, logger);\n }\n }) as T;\n}\n","import type {GraphQLFormattedError} from 'graphql';\nimport {GraphQLError} from 'graphql';\nimport type {BaseContext} from '@/context';\nimport {sanitizePrismaError} from '@/utils/prisma-error.util';\n\n/**\n * Format error function that sanitizes Prisma errors\n * This is used in Apollo Server configuration\n */\nexport function formatError(\n formattedError: GraphQLFormattedError,\n error: unknown\n): GraphQLFormattedError {\n // Get the original error\n const originalError =\n error instanceof GraphQLError ? error.originalError : error;\n\n // Check if it's a Prisma error\n if (\n originalError &&\n typeof originalError === 'object' &&\n 'name' in originalError &&\n ((originalError.name as string)?.includes('PrismaClient') ||\n ('code' in originalError &&\n typeof originalError.code === 'string' &&\n originalError.code.startsWith('P')))\n ) {\n // Sanitize the Prisma error\n const sanitized = sanitizePrismaError(originalError, undefined);\n\n // Return the sanitized error formatted\n return {\n message: sanitized.message,\n extensions: sanitized.extensions,\n path: formattedError.path,\n locations: formattedError.locations,\n };\n }\n\n // Return the original formatted error if not a Prisma error\n return formattedError;\n}\n","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","/**\n * KV Cache implementation for Cloudflare Workers\n * Provides caching capabilities for GraphQL resolvers using Cloudflare KV\n */\n\nexport interface CacheOptions {\n ttl?: number; // Time to live in seconds\n namespace?: string; // Cache namespace prefix\n cacheKey?: string; // Custom cache key\n}\n\nexport class KVCache {\n private defaultTTL: number = 300; // 5 minutes default\n private defaultNamespace: string = 'cache';\n\n constructor(\n private kv: KVNamespace,\n defaultNamespace?: string\n ) {\n if (defaultNamespace) {\n this.defaultNamespace = defaultNamespace;\n }\n }\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 with metadata\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 ttl = options.ttl || this.defaultTTL;\n const kvOptions: KVNamespacePutOptions = {\n expirationTtl: ttl,\n metadata: {\n createdAt: new Date().toISOString(),\n ttl: ttl,\n namespace: options.namespace || this.defaultNamespace,\n },\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<number> {\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 return list.keys.length;\n } catch (error) {\n console.error(`Cache clear prefix error for ${prefix}:`, error);\n return 0;\n }\n }\n\n /**\n * Invalidate cache by pattern\n */\n async invalidate(pattern: string): Promise<number> {\n return this.clearPrefix(pattern);\n }\n\n /**\n * Clear all cache in a namespace\n */\n async clearNamespace(namespace?: string): Promise<number> {\n const prefix = namespace ? `${namespace}:` : `${this.defaultNamespace}:`;\n return this.invalidate(prefix);\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 (non-blocking)\n this.set(key, fresh, options).catch((error) => {\n console.error(`Background cache write error for ${key}:`, error);\n });\n\n return fresh;\n }\n\n /**\n * Memoize function with automatic key generation\n */\n async memoize<T>(\n cacheKey: string,\n params: any,\n fetchFn: () => Promise<T>,\n options: CacheOptions = {}\n ): Promise<T> {\n const namespace = options.namespace || this.defaultNamespace;\n const key = this.generateKey(`${namespace}:${cacheKey}`, params);\n\n try {\n // Try to get from cache\n const cached = await this.get<T>(key);\n if (cached !== null) {\n return cached;\n }\n } catch (error) {\n console.warn(`Cache read error for ${key}:`, error);\n }\n\n // Cache miss - fetch data\n const data = await fetchFn();\n\n // Store in cache (non-blocking)\n this.set(key, data, options).catch((error) => {\n console.warn(`Cache write error for ${key}:`, error);\n });\n\n return data;\n }\n\n /**\n * Generate cache key with namespace and params\n */\n private generateKey(namespace: string, params: any): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((obj: any, key) => {\n if (params[key] !== undefined && params[key] !== null) {\n obj[key] = params[key];\n }\n return obj;\n }, {});\n\n const paramString = JSON.stringify(sortedParams);\n const hash = this.simpleHash(paramString);\n return `${namespace}:${hash}`;\n }\n\n /**\n * Simple hash function for generating cache keys\n */\n private simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36);\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","import DataLoader, {type BatchLoadFn, type Options} from 'dataloader';\nimport type {BaseContext} from '@/context';\nimport {KVCache} from './kv-cache';\n\n/**\n * Ensures that output items has the same order as input keys (dataloader requirement).\n * Returns error objects for non-existent ids.\n *\n * @param keys list of input keys\n * @param items list of output items\n * @param primaryKey name of the key-holding property\n */\nexport function ensureBatchOrder<\n K extends string | number,\n T extends Record<string, any>,\n>(keys: readonly K[], items: T[], primaryKey = 'id'): Array<T | Error> {\n const itemsMap = new Map<K, T>();\n\n // Build a map for O(1) lookups\n for (const item of items) {\n const key = item[primaryKey] as K;\n if (key !== undefined) {\n itemsMap.set(key, item);\n }\n }\n\n // Return items in the same order as keys\n return keys.map(\n (key) =>\n itemsMap.get(key) || new Error(`Missing value for ${primaryKey} ${key}`)\n );\n}\n\n/**\n * Ensures that output items has the same order as input keys (dataloader requirement).\n * Returns null for non-existent ids.\n *\n * @param keys list of input keys\n * @param items list of output items\n * @param primaryKey name of the key-holding property\n */\nexport function ensureBatchOrderNullable<\n K extends string | number,\n T extends Record<string, any>,\n>(keys: readonly K[], items: T[], primaryKey = 'id'): Array<T | null> {\n const itemsMap = new Map<K, T>();\n\n // Build a map for O(1) lookups\n for (const item of items) {\n const key = item[primaryKey] as K;\n if (key !== undefined) {\n itemsMap.set(key, item);\n }\n }\n\n // Return items in the same order as keys, with nulls for missing\n return keys.map((key) => itemsMap.get(key) || null);\n}\n\n/**\n * Base class for batching data sources with caching support.\n * Uses DataLoader for request batching and deduplication.\n *\n * @typeParam TContext - Apollo context type\n * @typeParam K - Primary key type\n * @typeParam V - Output item type\n * @typeParam CK - Cache key type (same as K by default)\n *\n * @example\n * ```typescript\n * export class UserBatchingDataSource extends BatchingDataSource<BaseContext, string, User> {\n * constructor() {\n * super(async (ids: readonly string[]) => {\n * const users = await fetchUsersFromDB(ids);\n * return ensureBatchOrder(ids, users);\n * });\n * }\n * }\n * ```\n */\nexport class BatchingDataSource<TContext extends BaseContext, K, V, CK = K> {\n protected context!: TContext;\n protected loader: DataLoader<K, V, CK>;\n protected cache?: KVCache;\n\n /**\n * Creates a new batching data source\n *\n * @param resolveBatch - Batch resolving function\n * @param options - DataLoader options\n * @param cacheNamespace - Optional namespace for KV caching\n */\n constructor(\n resolveBatch: BatchLoadFn<K, V>,\n options: Options<K, V, CK> = {},\n protected cacheNamespace?: string\n ) {\n // Bind context to the batch function\n const boundResolveBatch: BatchLoadFn<K, V> = async (keys) => {\n // If we have cache, try to load from cache first\n if (this.cache && this.cacheNamespace) {\n const results: Array<V | undefined> = [];\n const uncachedKeys: K[] = [];\n const uncachedIndexes: number[] = [];\n\n // Check cache for each key\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const cacheKey = `${this.cacheNamespace}:${String(key)}`;\n const cached = await this.cache.get<V>(cacheKey);\n\n if (cached !== null) {\n results[i] = cached;\n } else {\n uncachedKeys.push(key);\n uncachedIndexes.push(i);\n }\n }\n\n // If all items were cached, return them\n if (uncachedKeys.length === 0) {\n return results as V[];\n }\n\n // Fetch uncached items\n const freshItems = await resolveBatch.call(this, uncachedKeys);\n\n // Merge fresh items back and cache them\n for (let i = 0; i < uncachedIndexes.length; i++) {\n const index = uncachedIndexes[i];\n const item = freshItems[i] as V;\n const key = uncachedKeys[i];\n\n results[index] = item;\n\n // Cache the fresh item (non-blocking)\n if (!(item instanceof Error) && item !== null && item !== undefined) {\n const cacheKey = `${this.cacheNamespace}:${String(key)}`;\n this.cache.set(cacheKey, item, {ttl: 300}).catch((err) => {\n console.warn(`Failed to cache item ${cacheKey}:`, err);\n });\n }\n }\n\n return results as V[];\n }\n\n // No cache, just resolve normally\n return resolveBatch.call(this, keys);\n };\n\n this.loader = new DataLoader(boundResolveBatch, {\n ...options,\n // Default to caching within the request\n cache: options.cache !== false,\n });\n }\n\n /**\n * Initialize with Apollo context\n */\n initialize(config: {contextValue: TContext}) {\n this.context = config.contextValue;\n this.cache = config.contextValue.cache;\n }\n\n /**\n * Load a single item by key\n */\n async load(id: K): Promise<V> {\n return this.loader.load(id);\n }\n\n /**\n * Load multiple items by keys\n */\n async loadMany(ids: readonly K[]): Promise<Array<V | Error>> {\n return this.loader.loadMany(ids);\n }\n\n /**\n * Clear a single item from the DataLoader cache\n */\n clear(id: K): this {\n this.loader.clear(id);\n return this;\n }\n\n /**\n * Clear all items from the DataLoader cache\n */\n clearAll(): this {\n this.loader.clearAll();\n return this;\n }\n\n /**\n * Prime the cache with a specific value\n */\n prime(key: K, value: V): this {\n this.loader.prime(key, value);\n return this;\n }\n}\n\n/**\n * Factory function for creating batching data sources\n *\n * @example\n * ```typescript\n * const userDataSource = createBatchingDataSource<BaseContext, string, User>(\n * async (ids) => {\n * const users = await fetchUsersFromDB(ids);\n * return ensureBatchOrder(ids, users);\n * },\n * { cache: true },\n * 'users'\n * );\n * ```\n */\nexport function createBatchingDataSource<\n TContext extends BaseContext,\n K,\n V,\n CK = K,\n>(\n resolveBatch: BatchLoadFn<K, V>,\n options?: Options<K, V, CK>,\n cacheNamespace?: string\n): BatchingDataSource<TContext, K, V, CK> {\n return new BatchingDataSource(resolveBatch, options, cacheNamespace);\n}\n","/**\n * Apollo KeyValueCache adapter for Cloudflare KV\n *\n * Implements the Apollo Server KeyValueCache interface to work with\n * Cloudflare Workers KV storage.\n */\n\nimport type {\n KeyValueCache,\n KeyValueCacheSetOptions,\n} from '@apollo/utils.keyvaluecache';\nimport {KVCache} from './kv-cache';\n\n/**\n * Adapter that makes our KVCache compatible with Apollo's KeyValueCache interface\n *\n * Apollo Server uses this for:\n * - Response caching\n * - APQ (Automatic Persisted Queries)\n * - DataSource caching\n *\n * @example\n * ```typescript\n * const apolloCache = new ApolloKVAdapter(new KVCache(env.KV));\n *\n * const server = new ApolloServer({\n * cache: apolloCache,\n * // ... other options\n * });\n * ```\n */\nexport class ApolloKVAdapter implements KeyValueCache<string> {\n constructor(private kvCache: KVCache) {}\n\n /**\n * Get a value from cache\n * Apollo expects undefined for cache misses\n */\n async get(key: string): Promise<string | undefined> {\n const value = await this.kvCache.get<string>(key);\n // Apollo expects undefined, not null for cache misses\n return value === null ? undefined : value;\n }\n\n /**\n * Set a value in cache with TTL support\n * Apollo passes TTL in seconds via options\n */\n async set(\n key: string,\n value: string,\n options?: KeyValueCacheSetOptions\n ): Promise<void> {\n await this.kvCache.set(key, value, {\n ttl: options?.ttl, // Apollo's TTL is already in seconds\n });\n }\n\n /**\n * Delete a value from cache\n * Apollo expects boolean or void return\n */\n async delete(key: string): Promise<boolean | void> {\n await this.kvCache.delete(key);\n return true;\n }\n}\n\n/**\n * Factory function to create an Apollo-compatible cache from KV namespace\n *\n * @param kv - Cloudflare KV namespace binding\n * @returns Apollo-compatible KeyValueCache\n */\nexport function createApolloCache(kv: KVNamespace): KeyValueCache<string> {\n return new ApolloKVAdapter(new KVCache(kv));\n}\n\n/**\n * In-memory LRU cache for development/testing\n * Falls back to simple Map-based implementation\n */\nexport class InMemoryCache implements KeyValueCache<string> {\n private cache = new Map<string, {value: string; expires?: number}>();\n\n async get(key: string): Promise<string | undefined> {\n const item = this.cache.get(key);\n if (!item) return undefined;\n\n // Check expiration\n if (item.expires && Date.now() > item.expires) {\n this.cache.delete(key);\n return undefined;\n }\n\n return item.value;\n }\n\n async set(\n key: string,\n value: string,\n options?: KeyValueCacheSetOptions\n ): Promise<void> {\n const expires = options?.ttl\n ? Date.now() + options.ttl * 1000 // Convert seconds to milliseconds\n : undefined;\n\n this.cache.set(key, {value, expires});\n }\n\n async delete(key: string): Promise<boolean> {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cache entries\n */\n clear(): void {\n this.cache.clear();\n }\n}\n","/**\n * Cache module for GraphQL resolvers\n * Provides caching interface for Cloudflare Workers KV\n */\n\nimport {KVCache, createCacheKey, CacheKeys} from './kv-cache';\nimport type {CacheOptions} from './kv-cache';\nimport {\n BatchingDataSource,\n createBatchingDataSource,\n ensureBatchOrder,\n ensureBatchOrderNullable,\n} from './batching-datasource';\nimport {\n ApolloKVAdapter,\n createApolloCache,\n InMemoryCache,\n} from './apollo-cache-adapter';\n\nexport {KVCache, createCacheKey, CacheKeys};\nexport type {CacheOptions};\nexport {\n BatchingDataSource,\n createBatchingDataSource,\n ensureBatchOrder,\n ensureBatchOrderNullable,\n};\nexport {ApolloKVAdapter, createApolloCache, InMemoryCache};\n\n/**\n * Cache factory - creates KV cache if available\n */\nexport function createCache(env: Env): KVCache | null {\n // Check for KV namespace (Cloudflare Workers KV)\n if (env.KV) {\n return new KVCache(env.KV);\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;\n\n constructor(\n batchFn: (keys: K[]) => Promise<V[]>,\n cache: KVCache,\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","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 * 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 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 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';\nimport type {TraceContext, WorkerTracer} from '@/tracing/tracer';\n\nexport type {ContextUser} from './types';\n\nexport interface BaseContext extends ApolloBaseContext {\n user?: ContextUser;\n logger: typeof logger;\n executionCtx: ExecutionContext;\n cache?: KVCache; // KV cache for resolvers\n db?: D1Database; // D1 database binding for datasources\n env: EnvConfig; // Validated environment configuration\n\n // Tracing context (set by tracing middleware)\n traceContext?: TraceContext;\n tracer?: WorkerTracer;\n traceId?: string;\n spanId?: string;\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 - KV is now required\n // Pass raw env for KV bindings, not the parsed config\n const cache = createCache(rawEnv) as KVCache | undefined;\n if (!cache) {\n // This should not happen as ServerBuilder validates KV exists\n logger.warn(\n 'KV cache not found in context - this should not happen if using ServerBuilder'\n );\n }\n\n // Get D1 database binding (optional - datasources will validate if needed)\n const db = rawEnv?.DB as D1Database | undefined;\n\n return {\n user,\n logger,\n cache,\n db, // Raw D1 binding for datasources\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 {createApolloCache} from '@/cache';\nimport {\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 {ApolloDataSources} from '../datasources/apollo-plugin.datasource';\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\nimport type {KVCache} from '@/cache';\n\nexport type ServerConfig<TDatasource, TContext extends BaseContext> = {\n path?: string;\n apollo: Partial<ApolloServerOptions<BaseContext>>;\n datasources: (cache: KVCache, context: TContext) => TDatasource;\n extendContext?: ContextExtendFunction<TContext>;\n};\n\nexport class ServerBuilder<TDatasource, TContext extends BaseContext> {\n readonly app: Hono<{\n Variables: {\n env: any;\n };\n }>;\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\n // Build plugins array with datasources\n const plugins: ApolloServerPlugin<TContext>[] = [...this.plugins];\n\n // Add datasources plugin (now required)\n plugins.push(\n ApolloDataSources({\n datasources: this.config.datasources as any,\n }) as any\n );\n\n // We need to create the Apollo server for each request to pass the correct cache\n const createHandler = (env: any) => {\n // Validate KV binding exists\n if (!env?.KV) {\n throw new Error(\n 'Missing required KV namespace binding. ' +\n 'Please add KV namespace binding in your wrangler.toml:\\n' +\n '[[kv_namespaces]]\\n' +\n 'binding = \"KV\"\\n' +\n 'id = \"your-kv-namespace-id\"'\n );\n }\n\n // Create Apollo cache from KV\n const apolloCache = createApolloCache(env.KV);\n\n // Create Apollo server with cache\n // We need to ensure we don't include gateway if schema is provided\n const {gateway, ...apolloConfigWithoutGateway} = this.config.apollo || {};\n\n const server = new ApolloServer<TContext>({\n ...apolloConfigWithoutGateway, // User config without gateway\n schema: this.schema, // Our schema\n plugins, // Our plugins\n cache: apolloCache, // Apollo cache for APQ and response caching (override any user cache)\n formatError: (formattedError, error) => {\n // Import formatError dynamically to avoid circular dependency\n const {formatError} = require('@/plugins/error-handler.plugin');\n return formatError(formattedError, error);\n },\n } as ApolloServerOptions<TContext>);\n\n return startServerAndCreateCloudflareWorkersHandler<any, any>(server, {\n context: async (c) =>\n createContextFunction(this.config.extendContext)(c),\n });\n };\n\n // Cache handlers per environment (for efficiency)\n const handlerCache = new WeakMap();\n\n const getOrCreateHandler = (env: any) => {\n if (!handlerCache.has(env)) {\n handlerCache.set(env, createHandler(env));\n }\n return handlerCache.get(env);\n };\n\n honoApp.all(this.config.path ?? '/', async (c) => {\n // Get or create handler for this environment\n const cfHandler = getOrCreateHandler(c.env);\n\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 async fetch(request, env, ctx) {\n return honoApp.fetch(request, env, ctx);\n },\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 type {ApolloServerPlugin} from '@apollo/server';\nimport type {BaseContext} from '../context';\nimport type {ServerConfig} from '../server/server.builder';\nimport type {KVCache} from '../cache';\n\ntype DataSources = Record<string, any>;\ntype DataSourcesFn = <TContext extends BaseContext = BaseContext>(\n cache: KVCache,\n contextValue: TContext\n) => DataSources;\n\nexport type ComputedContext<\n TDatasource,\n TContext extends BaseContext,\n> = TContext & {\n datasources: ReturnType<\n NonNullable<ServerConfig<TDatasource, TContext>['datasources']>\n >;\n};\n\nexport const ApolloDataSources = <\n TDatasource,\n TContext extends BaseContext,\n>(options: {\n datasources: DataSourcesFn;\n}): ApolloServerPlugin<ComputedContext<TDatasource, TContext>> => ({\n async requestDidStart(requestContext) {\n // Get KVCache from context instead of Apollo's cache\n const kvCache = requestContext.contextValue.cache;\n if (!kvCache) {\n // Don't throw for missing cache, just log and continue\n console.warn(\n 'KVCache not found in context. Datasources may not function properly.'\n );\n requestContext.contextValue.datasources = {} as TDatasource;\n return;\n }\n\n try {\n const dataSources = options.datasources(\n kvCache,\n requestContext.contextValue\n );\n\n // Skip connection for introspection queries to avoid errors\n const query = requestContext.request.query;\n if (\n query &&\n (query.includes('__schema') || query.includes('IntrospectionQuery'))\n ) {\n // This is an introspection query, assign datasources but skip connection\n requestContext.contextValue.datasources =\n dataSources as unknown as TDatasource;\n return;\n }\n\n // Auto-connect datasources that have connect method for actual queries\n const connectPromises = Object.entries(dataSources).map(\n async ([name, dataSource]) => {\n if (dataSource && typeof dataSource.connect === 'function') {\n await dataSource.connect();\n }\n }\n );\n\n await Promise.all(connectPromises);\n\n requestContext.contextValue.datasources =\n dataSources as unknown as TDatasource;\n } catch (error) {\n // Log error but don't throw to avoid breaking the request\n console.error('Failed to initialize datasources:', error);\n requestContext.contextValue.datasources = {} as TDatasource;\n }\n },\n});\n","import {BaseContext} from '@/context';\nimport {Hono} from 'hono';\nimport {cors} from 'hono/cors';\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 Variables: {\n env: any;\n };\n }>();\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 = rawEnv as any; // Type assertion for environment variables\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 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.get('env') as any;\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') as any;\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 {ExecutionContext} from '@cloudflare/workers-types';\n\n/**\n * Cloudflare Workers Tracing Wrapper\n *\n * Cloudflare Workers now provides automatic tracing with zero configuration.\n * This wrapper provides additional context and manual span creation when needed.\n *\n * Key features:\n * - Automatic instrumentation of all I/O operations (KV, R2, D1, etc.)\n * - OpenTelemetry-compliant spans\n * - Zero-config setup when enabled in wrangler.toml\n */\n\nexport interface TraceContext {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n baggage?: Record<string, string>;\n}\n\n/**\n * Extract W3C Trace Context from headers\n * Format: traceparent: 00-{traceId}-{spanId}-{flags}\n */\nexport function extractTraceContext(headers: Headers): TraceContext | null {\n const traceparent = headers.get('traceparent');\n if (!traceparent) return null;\n\n const parts = traceparent.split('-');\n if (parts.length !== 4) return null;\n\n const [version, traceId, spanId, flags] = parts;\n if (version !== '00') return null; // Only support version 00\n\n // Extract baggage if present\n const baggageHeader = headers.get('baggage');\n const baggage: Record<string, string> = {};\n\n if (baggageHeader) {\n baggageHeader.split(',').forEach((item) => {\n const [key, value] = item.trim().split('=');\n if (key && value) {\n baggage[key] = decodeURIComponent(value);\n }\n });\n }\n\n return {\n traceId,\n spanId,\n parentSpanId: spanId,\n baggage: Object.keys(baggage).length > 0 ? baggage : undefined,\n };\n}\n\n/**\n * Generate W3C Trace Context header\n */\nexport function generateTraceHeader(context: TraceContext): string {\n return `00-${context.traceId}-${context.spanId}-01`;\n}\n\n/**\n * Generate trace ID (32 hex chars / 128 bits)\n */\nexport function generateTraceId(): string {\n return Array.from(crypto.getRandomValues(new Uint8Array(16)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Generate span ID (16 hex chars / 64 bits)\n */\nexport function generateSpanId(): string {\n return Array.from(crypto.getRandomValues(new Uint8Array(8)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Custom span for manual instrumentation\n * This is useful when you want to track specific operations\n * that aren't automatically instrumented\n */\nexport class WorkerSpan {\n private startTime: number;\n private endTime?: number;\n private attributes: Record<string, any> = {};\n private events: Array<{\n name: string;\n timestamp: number;\n attributes?: Record<string, any>;\n }> = [];\n\n constructor(\n public readonly name: string,\n public readonly spanId: string,\n public readonly traceId: string,\n public readonly parentSpanId?: string\n ) {\n this.startTime = Date.now();\n }\n\n setAttribute(key: string, value: any): this {\n this.attributes[key] = value;\n return this;\n }\n\n setAttributes(attributes: Record<string, any>): this {\n Object.assign(this.attributes, attributes);\n return this;\n }\n\n addEvent(name: string, attributes?: Record<string, any>): this {\n this.events.push({\n name,\n timestamp: Date.now(),\n attributes,\n });\n return this;\n }\n\n end(): void {\n if (!this.endTime) {\n this.endTime = Date.now();\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n spanId: this.spanId,\n traceId: this.traceId,\n parentSpanId: this.parentSpanId,\n startTime: this.startTime,\n endTime: this.endTime || Date.now(),\n duration: (this.endTime || Date.now()) - this.startTime,\n attributes: this.attributes,\n events: this.events,\n };\n }\n}\n\n/**\n * Tracer for Cloudflare Workers\n * Provides manual span creation for custom instrumentation\n */\nexport class WorkerTracer {\n private spans: WorkerSpan[] = [];\n\n constructor(\n private readonly traceContext: TraceContext,\n private readonly executionContext?: ExecutionContext\n ) {}\n\n createSpan(name: string, parentSpanId?: string): WorkerSpan {\n const span = new WorkerSpan(\n name,\n generateSpanId(),\n this.traceContext.traceId,\n parentSpanId || this.traceContext.spanId\n );\n\n this.spans.push(span);\n return span;\n }\n\n /**\n * Run a function within a span\n */\n async trace<T>(\n name: string,\n fn: (span: WorkerSpan) => Promise<T>\n ): Promise<T> {\n const span = this.createSpan(name);\n\n try {\n const result = await fn(span);\n span.end();\n return result;\n } catch (error) {\n span.setAttribute('error', true);\n span.setAttribute(\n 'error.message',\n error instanceof Error ? error.message : String(error)\n );\n span.end();\n throw error;\n }\n }\n\n /**\n * Export spans (for custom logging or external systems)\n */\n exportSpans(): Array<ReturnType<WorkerSpan['toJSON']>> {\n return this.spans.map((span) => span.toJSON());\n }\n\n /**\n * Log spans to console (useful for development)\n */\n logSpans(): void {\n const spans = this.exportSpans();\n console.log('[Trace]', {\n traceId: this.traceContext.traceId,\n spans,\n });\n }\n\n /**\n * Send spans to external observability platform via fetch\n * This can be used with waitUntil to avoid blocking the response\n */\n async sendToObservabilityPlatform(\n endpoint: string,\n headers?: Record<string, string>\n ): Promise<void> {\n const spans = this.exportSpans();\n\n const promise = fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({\n traceId: this.traceContext.traceId,\n spans,\n timestamp: new Date().toISOString(),\n }),\n });\n\n // Use waitUntil to ensure the request completes without blocking\n if (this.executionContext?.waitUntil) {\n this.executionContext.waitUntil(promise);\n } else {\n await promise;\n }\n }\n}\n\n/**\n * Create a tracer instance for the current request\n */\nexport function createTracer(\n headers: Headers,\n executionContext?: ExecutionContext\n): WorkerTracer {\n // Try to extract existing trace context from headers\n let traceContext = extractTraceContext(headers);\n\n // If no trace context, create a new one\n if (!traceContext) {\n traceContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n };\n }\n\n return new WorkerTracer(traceContext, executionContext);\n}\n","import type {MiddlewareHandler} from 'hono';\nimport {logger} from '@/logger';\nimport {\n extractTraceContext,\n generateTraceId,\n generateSpanId,\n generateTraceHeader,\n createTracer,\n type TraceContext,\n} from '@/tracing/tracer';\n\n/**\n * Cloudflare Workers Native Tracing Middleware\n *\n * This middleware integrates with Cloudflare's automatic tracing feature.\n * When enabled in wrangler.toml, CF automatically traces all I/O operations.\n *\n * This middleware:\n * 1. Extracts or creates W3C Trace Context (traceparent header)\n * 2. Propagates trace context through the request\n * 3. Provides manual tracing capabilities for custom spans\n * 4. Logs trace information for correlation\n */\nexport function createTracingMiddleware(): MiddlewareHandler {\n return async (c, next) => {\n // Extract W3C Trace Context from headers or create new one\n let traceContext = extractTraceContext(c.req.raw.headers);\n\n if (!traceContext) {\n // Create new trace context\n traceContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n };\n } else {\n // Create new span for this request\n traceContext = {\n ...traceContext,\n parentSpanId: traceContext.spanId,\n spanId: generateSpanId(),\n };\n }\n\n // Create tracer for manual instrumentation\n const tracer = createTracer(c.req.raw.headers, c.executionCtx);\n\n // Store in context for other middleware/resolvers\n c.set('traceContext', traceContext);\n c.set('tracer', tracer);\n c.set('traceId', traceContext.traceId);\n c.set('spanId', traceContext.spanId);\n\n // Set global request context for pino logger\n globalThis.requestContext = {\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n userId: c.get('userId'),\n };\n\n // Add W3C Trace Context headers to response\n c.header('traceparent', generateTraceHeader(traceContext));\n\n // Add legacy headers for backwards compatibility\n c.header('x-trace-id', traceContext.traceId);\n c.header('x-span-id', traceContext.spanId);\n\n // Add CF Ray ID for correlation with Cloudflare logs\n const cfRay = c.req.header('cf-ray');\n if (cfRay) {\n c.header('cf-ray', cfRay);\n }\n\n const startTime = Date.now();\n const requestSpan = tracer.createSpan('http.request');\n\n // Set span attributes\n requestSpan.setAttributes({\n 'http.method': c.req.method,\n 'http.url': c.req.url,\n 'http.target': c.req.path,\n 'http.host': c.req.header('host'),\n 'http.scheme': new URL(c.req.url).protocol.replace(':', ''),\n 'http.user_agent': c.req.header('user-agent'),\n 'net.peer.ip':\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for'),\n 'cf.ray': cfRay,\n 'cf.worker.subrequest': c.req.header('cf-worker-subrequest') === 'true',\n });\n\n try {\n await next();\n\n // Set response attributes\n requestSpan.setAttributes({\n 'http.status_code': c.res.status,\n 'http.response_content_length': c.res.headers.get('content-length'),\n });\n\n requestSpan.end();\n } catch (error) {\n // Record error on span\n requestSpan.setAttribute('error', true);\n requestSpan.setAttribute(\n 'error.message',\n error instanceof Error ? error.message : String(error)\n );\n requestSpan.end();\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n\n // Log request with trace correlation\n logger.info(\n {\n type: 'request',\n trace: {\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n parentSpanId: traceContext.parentSpanId,\n },\n http: {\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') ||\n c.req.header('x-forwarded-for'),\n },\n cf: {\n ray: cfRay,\n colo: c.req.header('cf-ipcountry'),\n tlsVersion: c.req.header('cf-tls-version'),\n },\n },\n `${c.req.method} ${c.req.path} - ${c.res.status} (${duration}ms)`\n );\n\n // Add Server-Timing header with trace ID for correlation\n c.header(\n 'Server-Timing',\n `total;dur=${duration}, trace;desc=\"${traceContext.traceId}\"`\n );\n\n // Clean up global context\n delete globalThis.requestContext;\n\n // Export custom spans if any (useful for debugging)\n if (c.env?.TRACE_DEBUG === 'true') {\n tracer.logSpans();\n }\n }\n };\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 Variables: {\n env: any;\n };\n }>,\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 type {GraphQLRequestContext} from '@apollo/server';\nimport type {BaseContext} from '../context';\n\n/**\n * Tracing utilities for GraphQL operations\n * Works with W3C Trace Context and Cloudflare's native tracing\n */\n\nexport enum TraceBaggage {\n ROOT_OP_NAME = 'root_op_name',\n USER_ID = 'user_id',\n CLIENT_ID = 'client_id',\n}\n\n/**\n * Get the operation name from GraphQL context\n * Checks multiple sources in order of preference\n */\nexport const getOpsName = (gqlCtx: GraphQLRequestContext<BaseContext>) => {\n // Check baggage from trace context first\n const baggage = gqlCtx.contextValue.traceContext?.baggage;\n const baggageOpName = baggage?.[TraceBaggage.ROOT_OP_NAME];\n\n if (baggageOpName) {\n return baggageOpName;\n }\n\n // Fall back to GraphQL operation name\n return gqlCtx.request.operationName || gqlCtx.operationName || 'UNKNOWN';\n};\n\n/**\n * Get trace ID from context\n */\nexport const getTraceId = (ctx: BaseContext): string | undefined => {\n return ctx.traceId || ctx.traceContext?.traceId;\n};\n\n/**\n * Get span ID from context\n */\nexport const getSpanId = (ctx: BaseContext): string | undefined => {\n return ctx.spanId || ctx.traceContext?.spanId;\n};\n\n/**\n * Check if tracing is enabled for this request\n */\nexport const isTracingEnabled = (ctx: BaseContext): boolean => {\n return !!(ctx.tracer && ctx.traceContext);\n};\n\n/**\n * Create trace metadata for logging\n */\nexport const getTraceMetadata = (ctx: BaseContext) => {\n if (!isTracingEnabled(ctx)) {\n return {};\n }\n\n return {\n traceId: getTraceId(ctx),\n spanId: getSpanId(ctx),\n parentSpanId: ctx.traceContext?.parentSpanId,\n };\n};\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 {createTracingPlugin} from '@/plugins/tracing.plugin';\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 // tracing - integrates with Cloudflare's native tracing\n builder.plugins.push(createTracingPlugin());\n}\n","import type {ApolloServerPlugin, GraphQLRequestListener} from '@apollo/server';\nimport type {BaseContext} from '@/context';\nimport type {WorkerTracer} from '@/tracing/tracer';\n\n/**\n * Apollo Server plugin for GraphQL operation tracing\n * Integrates with Cloudflare Workers native tracing\n */\nexport function createTracingPlugin<\n TContext extends BaseContext,\n>(): ApolloServerPlugin<TContext> {\n return {\n async requestDidStart(\n requestContext\n ): Promise<GraphQLRequestListener<TContext>> {\n const {contextValue} = requestContext;\n\n // Get tracer from context (set by middleware)\n const tracer = contextValue.tracer;\n const traceContext = contextValue.traceContext;\n\n if (!tracer || !traceContext) {\n // No tracing available, return empty listener\n return {};\n }\n\n // Create spans for GraphQL operations\n let parseSpan: any;\n let validateSpan: any;\n let executeSpan: any;\n\n return {\n async parsingDidStart() {\n parseSpan = tracer.createSpan('graphql.parse');\n return async (err) => {\n if (err) {\n parseSpan.setAttribute('error', true);\n parseSpan.setAttribute('error.message', err.message);\n }\n parseSpan.end();\n };\n },\n\n async validationDidStart() {\n validateSpan = tracer.createSpan('graphql.validate');\n return async (errs) => {\n if (errs && errs.length > 0) {\n validateSpan.setAttribute('error', true);\n validateSpan.setAttribute('error.count', errs.length);\n validateSpan.setAttribute(\n 'error.messages',\n errs.map((e) => e.message).join(', ')\n );\n }\n validateSpan.end();\n };\n },\n\n async executionDidStart() {\n const operation = requestContext.request.operationName || 'anonymous';\n const operationType = requestContext.operation?.operation || 'query';\n\n executeSpan = tracer.createSpan(`graphql.${operationType}`);\n executeSpan.setAttributes({\n 'graphql.operation.name': operation,\n 'graphql.operation.type': operationType,\n 'graphql.document': requestContext.request.query,\n });\n\n return {\n async executionDidEnd(err) {\n if (err) {\n executeSpan.setAttribute('error', true);\n executeSpan.setAttribute('error.message', err.message);\n }\n executeSpan.end();\n },\n\n willResolveField({info}) {\n const fieldName = info.fieldName;\n const parentType = info.parentType.name;\n const fieldPath = `${parentType}.${fieldName}`;\n\n // Only trace non-trivial fields (skip scalar fields on Query/Mutation)\n const shouldTrace =\n parentType !== 'Query' &&\n parentType !== 'Mutation' &&\n parentType !== 'Subscription';\n\n if (\n !shouldTrace &&\n !(contextValue as any).env?.TRACE_ALL_FIELDS\n ) {\n return;\n }\n\n const fieldSpan = tracer.createSpan(`graphql.field.${fieldPath}`);\n fieldSpan.setAttributes({\n 'graphql.field.name': fieldName,\n 'graphql.field.type': parentType,\n 'graphql.field.path': fieldPath,\n 'graphql.field.return_type': info.returnType.toString(),\n });\n\n return (err: any) => {\n if (err) {\n fieldSpan.setAttribute('error', true);\n fieldSpan.setAttribute('error.message', err.message);\n }\n fieldSpan.end();\n };\n },\n };\n },\n\n async didEncounterErrors(requestContext) {\n // Log errors with trace context\n const {errors} = requestContext;\n if (errors && errors.length > 0) {\n contextValue.logger.error(\n {\n trace: {\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n },\n graphql: {\n operation: requestContext.request.operationName,\n errors: errors.map((e) => ({\n message: e.message,\n path: e.path,\n extensions: e.extensions,\n })),\n },\n },\n 'GraphQL errors encountered'\n );\n }\n },\n\n async willSendResponse(requestContext) {\n // Add trace ID to response extensions for client correlation\n if (requestContext.response.body.kind === 'single') {\n const result = requestContext.response.body.singleResult;\n result.extensions = {\n ...result.extensions,\n tracing: {\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n },\n };\n }\n },\n };\n },\n };\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","// Core exports\nexport {createGraphQLServer} from './server';\nexport type {ServerOptions, BaseServerOptions} from './server';\nexport {ServerBuilder} from './server/server.builder';\nexport type {ServerConfig, Runner} from './server/server.builder';\n\n// Context exports\nexport {\n createContextFunction,\n type BaseContext,\n type ContextUser,\n} from './context';\nexport type {ContextExtendFunction} from './context';\n\n// Environment exports\nexport {envLoader, type EnvConfig} from './env';\n\n// Logger exports\nexport {logger} from './logger';\nexport {createApolloLoggingPlugin} from './logger/apollo.logger';\n\n// Cache exports\nexport {\n createCache,\n KVCache,\n cached,\n CachedDataLoader,\n BatchingDataSource,\n createBatchingDataSource,\n ensureBatchOrder,\n ensureBatchOrderNullable,\n ApolloKVAdapter,\n createApolloCache,\n InMemoryCache,\n} from './cache';\nexport type {CacheOptions} from './cache';\n\n// Middleware exports\nexport {createRateLimitMiddleware} from './middleware/rate-limit';\nexport {createValidationMiddleware} from './middleware/validation';\nexport {createTracingMiddleware} from './middleware/tracing';\nexport {configureHealthChecks} from './middleware/health';\n\n// Tracing exports\nexport {\n WorkerTracer,\n WorkerSpan,\n createTracer,\n extractTraceContext,\n generateTraceId,\n generateSpanId,\n generateTraceHeader,\n type TraceContext,\n} from './tracing/tracer';\nexport {createTracingPlugin} from './plugins/tracing.plugin';\n\n// Utility exports\nexport {AppError, ErrorCode} from './utils/error.util';\nexport {createSchemaModule, gql} from './utils/schema.util';\nexport type {SchemaModule} from './utils/schema.util';\nexport {getNonUserInputErrors} from './utils/graphql.util';\nexport {\n sanitizePrismaError,\n withPrismaErrorHandling,\n} from './utils/prisma-error.util';\nexport {formatError} from './plugins/error-handler.plugin';\n\n// DataSource exports\nexport {ApolloDataSources} from './datasources/apollo-plugin.datasource';\nexport type {ComputedContext} from './datasources/apollo-plugin.datasource';\n\n// Datasource classes\nexport {\n type BaseDatasource,\n AbstractDatasource,\n RestDatasource,\n PrismaD1Datasource,\n} from './datasources';\nexport type {\n RestClientOptions,\n PrismaClientLike,\n PrismaD1,\n} from './datasources';\n","import type {BaseContext} from '@/context';\nimport type {KVCache} from '@/cache';\n\nexport interface BaseDatasource<TContext extends BaseContext = BaseContext> {\n readonly name: string;\n context?: TContext;\n\n init?(): Promise<void> | void;\n connect?(): Promise<void> | void;\n disconnect?(): Promise<void> | void;\n healthCheck?(): Promise<boolean> | boolean;\n clear?(): Promise<void> | void;\n}\n\n/**\n * Abstract base class for all datasources in the GraphQL bootstrap\n * Provides common functionality like caching, logging, and lifecycle management\n */\nexport abstract class AbstractDatasource<\n TContext extends BaseContext = BaseContext,\n> implements BaseDatasource<TContext> {\n abstract readonly name: string;\n context: TContext;\n protected cache: KVCache;\n protected logger: TContext['logger'];\n\n constructor(cache: KVCache, context: TContext) {\n this.cache = cache;\n this.context = context;\n this.logger = context.logger;\n\n // Call initialize after construction\n this.initialize();\n }\n\n /**\n * Initialize datasource-specific configuration\n * Override this method to add custom initialization logic\n */\n protected initialize(): void {\n // Default implementation - override in subclasses\n // Only log if name is defined to avoid \"undefined\" in logs\n if (this.name) {\n this.logger?.info(`Initializing datasource: ${this.name}`);\n }\n }\n\n async init(): Promise<void> {\n // Default implementation - override in subclasses\n this.logger?.info(`Initializing datasource: ${this.name}`);\n }\n\n async connect(): Promise<void> {\n // Default implementation - override in subclasses\n this.logger?.info(`Connecting datasource: ${this.name}`);\n }\n\n async disconnect(): Promise<void> {\n // Default implementation - override in subclasses\n this.logger?.info(`Disconnecting datasource: ${this.name}`);\n }\n\n async healthCheck(): Promise<boolean> {\n this.logger?.debug(`Health check for datasource: ${this.name}`);\n return true;\n }\n\n async clear(): Promise<void> {\n // Default implementation - override in subclasses\n this.logger?.info(`Clearing datasource: ${this.name}`);\n }\n\n /**\n * Helper method to get a cached result or fetch fresh data\n * Uses the enhanced KVCache memoize function\n */\n protected async cached<T>(\n key: string,\n fetchFn: () => Promise<T>,\n ttl?: number\n ): Promise<T> {\n return this.cache.memoize(key, {}, fetchFn, {ttl});\n }\n\n /**\n * Helper method to invalidate cache entries by pattern\n */\n protected async invalidateCache(pattern: string): Promise<number> {\n return this.cache.invalidate(pattern);\n }\n}\n","import type {BaseContext} from '@/context';\nimport type {KVCache} from '@/cache';\nimport {AbstractDatasource} from './base.datasource';\n\nexport interface RestClientOptions {\n baseURL: string;\n timeout?: number;\n headers?: Record<string, string>;\n retries?: number;\n}\n\n/**\n * REST datasource for making HTTP API calls with caching and error handling\n * Optimized for Cloudflare Workers environment\n */\nexport class RestDatasource<\n TContext extends BaseContext = BaseContext,\n> extends AbstractDatasource<TContext> {\n readonly name = 'rest';\n private baseURL: string;\n private timeout: number;\n private headers: Record<string, string>;\n private retries: number;\n\n constructor(cache: KVCache, context: TContext, options: RestClientOptions) {\n super(cache, context);\n this.baseURL = options.baseURL.replace(/\\/$/, ''); // Remove trailing slash\n this.timeout = options.timeout ?? 10000;\n this.headers = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'cfw-graphql-bootstrap/1.0',\n ...options.headers,\n };\n this.retries = options.retries ?? 3;\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n this.logger?.debug(`Health check for REST datasource: ${this.baseURL}`);\n const response = await this.get('/health');\n const isHealthy = response.status < 400;\n this.logger?.info(\n `REST datasource health check: ${isHealthy ? 'OK' : 'FAILED'}`\n );\n return isHealthy;\n } catch (error) {\n this.logger?.error('REST datasource health check failed:', error);\n return false;\n }\n }\n\n /**\n * GET request with caching\n */\n async get<T = any>(\n path: string,\n options?: {\n cache?: boolean;\n ttl?: number;\n params?: Record<string, string>;\n }\n ): Promise<T> {\n const url = this.buildURL(path, options?.params);\n const cacheKey = `rest:get:${url}`;\n\n if (options?.cache !== false) {\n return this.cached(\n cacheKey,\n () => this.fetchWithRetry(url, {method: 'GET'}),\n options?.ttl\n );\n }\n\n return this.fetchWithRetry(url, {method: 'GET'});\n }\n\n /**\n * POST request (no caching)\n */\n async post<T = any>(\n path: string,\n data?: any,\n options?: {\n invalidatePattern?: string;\n }\n ): Promise<T> {\n const url = this.buildURL(path);\n const result = await this.fetchWithRetry(url, {\n method: 'POST',\n body: data ? JSON.stringify(data) : undefined,\n });\n\n // Invalidate cache if pattern provided\n if (options?.invalidatePattern) {\n await this.invalidateCache(options.invalidatePattern);\n }\n\n return result;\n }\n\n /**\n * PUT request (no caching)\n */\n async put<T = any>(\n path: string,\n data?: any,\n options?: {\n invalidatePattern?: string;\n }\n ): Promise<T> {\n const url = this.buildURL(path);\n const result = await this.fetchWithRetry(url, {\n method: 'PUT',\n body: data ? JSON.stringify(data) : undefined,\n });\n\n // Invalidate cache if pattern provided\n if (options?.invalidatePattern) {\n await this.invalidateCache(options.invalidatePattern);\n }\n\n return result;\n }\n\n /**\n * DELETE request (no caching)\n */\n async delete<T = any>(\n path: string,\n options?: {\n invalidatePattern?: string;\n }\n ): Promise<T> {\n const url = this.buildURL(path);\n const result = await this.fetchWithRetry(url, {method: 'DELETE'});\n\n // Invalidate cache if pattern provided\n if (options?.invalidatePattern) {\n await this.invalidateCache(options.invalidatePattern);\n }\n\n return result;\n }\n\n private buildURL(path: string, params?: Record<string, string>): string {\n const url = `${this.baseURL}${path.startsWith('/') ? path : `/${path}`}`;\n\n if (params) {\n const searchParams = new URLSearchParams(params);\n return `${url}?${searchParams.toString()}`;\n }\n\n return url;\n }\n\n private async fetchWithRetry<T = any>(\n url: string,\n options: RequestInit,\n attempt = 1\n ): Promise<T> {\n try {\n this.logger?.debug(\n `[${attempt}/${this.retries}] ${options.method || 'GET'} ${url}`\n );\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n this.logger?.debug(\n `✓ ${options.method || 'GET'} ${url} - ${response.status}`\n );\n return await response.json();\n } catch (error) {\n this.logger?.warn(\n `✗ ${options.method || 'GET'} ${url} - Attempt ${attempt} failed:`,\n error\n );\n\n if (attempt < this.retries && this.shouldRetry(error)) {\n const delay = Math.pow(2, attempt) * 1000;\n this.logger?.info(`Retrying in ${delay}ms...`);\n await this.delay(delay); // Exponential backoff\n return this.fetchWithRetry(url, options, attempt + 1);\n }\n\n this.logger?.error(`Failed after ${attempt} attempts:`, error);\n throw error;\n }\n }\n\n private shouldRetry(error: any): boolean {\n // Retry on network errors and 5xx status codes\n return (\n error.name === 'AbortError' ||\n error.message?.includes('fetch') ||\n (error.message?.includes('HTTP 5') ?? false)\n );\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import type {KVCache} from '@/cache';\nimport type {BaseContext} from '@/context';\nimport {AbstractDatasource} from './base.datasource';\n\n// Minimal Prisma Client interface for type safety\nexport interface PrismaClientLike {\n $connect(): Promise<void>;\n $disconnect(): Promise<void>;\n $queryRaw: any;\n $queryRawUnsafe(sql: string, ...values: any[]): Promise<any>;\n $executeRawUnsafe(sql: string, ...values: any[]): Promise<number>;\n // Event-based logging support - using 'any' to allow different Prisma versions\n $on?: any;\n // Additional properties that actual PrismaClient has\n [key: string]: any;\n}\n\n// PrismaD1 adapter type (imported dynamically)\nexport interface PrismaD1 {\n // We don't need to define the full interface since it's used opaquely\n // The actual implementation comes from '@prisma/adapter-d1'\n}\n\n// Global Prisma client cache for reuse\ndeclare global {\n var __prismaD1Clients: Map<string, any> | undefined;\n}\n\n/**\n * Abstract Prisma datasource optimized for Cloudflare D1\n * Automatically creates PrismaD1 adapter and requires user to implement createClient()\n *\n * @example\n * ```typescript\n * import { PrismaClient } from '@prisma/client';\n * import { PrismaD1 } from '@prisma/adapter-d1';\n *\n * class UserDatasource extends PrismaD1Datasource<BaseContext, PrismaClient> {\n * createClient(adapter: PrismaD1): PrismaClient {\n * // Use the helper method for optimized Cloudflare Workers logging\n * return this.createClientWithLogging(adapter, PrismaClient);\n * }\n *\n * async getUser(id: string) {\n * // Just use Prisma normally - errors are sanitized by Apollo plugin\n * return this.client.user.findUnique({ where: { id } });\n * }\n *\n * async createUser(data: CreateUserInput) {\n * // Prisma errors like \"Unique constraint\" are automatically sanitized\n * return this.client.user.create({ data });\n * }\n *\n * async updateUser(id: string, data: UpdateUserInput) {\n * // Clean, simple code - error handling is in the GraphQL layer\n * return this.client.user.update({\n * where: { id },\n * data\n * });\n * }\n * }\n *\n * // Multiple instances share the same client efficiently:\n * datasources: (cache: KVCache, context: TContext) => ({\n * user: new UserDatasource(cache, context), // Client cached by class name\n * admin: new UserDatasource(cache, context), // Reuses same client!\n * })\n * ```\n */\nexport abstract class PrismaD1Datasource<\n TContext extends BaseContext = BaseContext,\n TPrismaClient extends PrismaClientLike = PrismaClientLike,\n> extends AbstractDatasource<TContext> {\n readonly name = 'prisma-d1';\n private _client: TPrismaClient | null = null;\n\n constructor(cache: KVCache, context: TContext) {\n super(cache, context);\n }\n\n /**\n * Abstract method to create Prisma client with D1 adapter\n * Called only once per datasource class, then cached globally\n *\n * Best practice for Cloudflare Workers:\n * - Use minimal log configuration to avoid bundle size issues\n * - Leverage event-based logging for performance monitoring\n * - Avoid Node.js-specific logging libraries\n */\n abstract createClient(adapter: PrismaD1): TPrismaClient;\n\n /**\n * Helper method to create client with recommended logging configuration\n * for Cloudflare Workers environment\n */\n protected createClientWithLogging(\n adapter: PrismaD1,\n clientConstructor: any\n ): TPrismaClient {\n const isDev = this.context.env?.NODE_ENV !== 'production';\n\n // Minimal logging config optimized for Workers\n const logConfig = isDev\n ? [\n {level: 'warn', emit: 'event'},\n {level: 'error', emit: 'event'},\n ]\n : [{level: 'error', emit: 'event'}];\n\n const client = new clientConstructor({\n adapter,\n log: logConfig,\n errorFormat: 'minimal', // Reduces bundle size\n });\n\n // Set up event-based logging that integrates with our logger\n if (client.$on && typeof client.$on === 'function') {\n try {\n // Handle typed PrismaClient $on method\n client.$on('error' as any, (e: any) => {\n this.logger.error('Prisma error:', {\n target: e.target,\n message: e.message,\n timestamp: e.timestamp,\n });\n });\n\n if (isDev) {\n client.$on('warn' as any, (e: any) => {\n this.logger.warn('Prisma warning:', {\n target: e.target,\n message: e.message,\n timestamp: e.timestamp,\n });\n });\n }\n } catch (err) {\n // Fallback if $on method doesn't work as expected\n this.logger.debug('Could not set up Prisma event logging:', err);\n }\n }\n\n return client;\n }\n\n get client(): TPrismaClient {\n if (!this._client) {\n throw new Error('Prisma client not initialized. Call connect() first.');\n }\n return this._client;\n }\n\n async connect(): Promise<void> {\n const startTotal = Date.now();\n try {\n this.logger.info('Connecting Prisma D1 datasource...');\n\n // Get D1 database binding from context\n if (!this.context.db) {\n const error =\n 'D1 database binding not found. Add to wrangler.toml:\\n' +\n '[[d1_databases]]\\n' +\n 'binding = \"DB\"\\n' +\n 'database_name = \"your-database-name\"\\n' +\n 'database_id = \"your-database-id\"';\n this.logger.error(error);\n throw new Error(error);\n }\n\n // Create cache key based on datasource constructor name\n const clientKey = this.constructor.name;\n\n // Initialize global client cache if needed\n if (!global.__prismaD1Clients) {\n global.__prismaD1Clients = new Map();\n }\n\n // Check if we have a cached client for this datasource class\n if (global.__prismaD1Clients.has(clientKey)) {\n this._client = global.__prismaD1Clients.get(clientKey);\n this.logger.debug(`Using cached Prisma client for ${clientKey}`);\n } else {\n const startAdapter = Date.now();\n this.logger.debug('Creating new PrismaD1 adapter and client...');\n\n // Create PrismaD1 adapter\n const d1Module = await import('@prisma/adapter-d1');\n const PrismaD1 = (d1Module as any).PrismaD1 ?? d1Module.default;\n const adapter = new PrismaD1(this.context.db);\n\n this.logger.debug(`Adapter created in ${Date.now() - startAdapter}ms`);\n\n // Create client only once per datasource class with optimized logging\n const startClient = Date.now();\n this._client = this.createClient(adapter);\n this.logger.debug(`Client created in ${Date.now() - startClient}ms`);\n\n // Cache the client globally\n global.__prismaD1Clients.set(clientKey, this._client);\n this.logger.debug(`Cached new Prisma client for ${clientKey}`);\n }\n\n const startConnect = Date.now();\n await this._client.$connect();\n this.logger.info(\n `✓ Prisma D1 datasource connected in ${Date.now() - startConnect}ms`\n );\n this.logger.info(`Total connection time: ${Date.now() - startTotal}ms`);\n } catch (error) {\n this.logger.error('Failed to connect Prisma D1 datasource:', error);\n throw new Error(\n `Prisma D1 connection failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n // Helper method for proper resource cleanup in Workers context\n async disconnectWithContext(ctx?: {\n waitUntil: (promise: Promise<any>) => void;\n }): Promise<void> {\n if (!this._client) return;\n\n const disconnectPromise = this._client.$disconnect();\n\n // Use ctx.waitUntil() if available to ensure cleanup completes\n if (ctx?.waitUntil) {\n ctx.waitUntil(disconnectPromise);\n } else {\n await disconnectPromise;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this._client) {\n await this._client.$disconnect();\n }\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n this.logger.debug('Prisma D1 datasource health check...');\n if (this._client) {\n await this._client.$queryRaw`SELECT 1`;\n }\n this.logger.info('Prisma D1 datasource health check: OK');\n return true;\n } catch (error) {\n this.logger.error('Prisma D1 datasource health check failed:', error);\n return false;\n }\n }\n\n /**\n * Execute a cached query using raw SQL with performance logging\n */\n async queryRaw<T = any>(\n sql: string,\n values?: any[],\n options?: {\n cache?: boolean;\n ttl?: number;\n }\n ): Promise<T> {\n const cacheKey = `prisma-d1:raw:${sql}:${JSON.stringify(values || [])}`;\n const startTime = Date.now();\n\n try {\n let result: T;\n\n if (options?.cache !== false) {\n result = await this.cached(\n cacheKey,\n () => this._client!.$queryRawUnsafe(sql, ...(values || [])),\n options?.ttl\n );\n } else {\n result = await this._client!.$queryRawUnsafe(sql, ...(values || []));\n }\n\n const duration = Date.now() - startTime;\n\n // Log slow queries (>1000ms) for performance monitoring\n if (duration > 1000) {\n this.logger.warn('Slow Prisma query detected:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n cached: options?.cache !== false,\n });\n } else if (this.context.env?.NODE_ENV !== 'production') {\n this.logger.debug('Prisma query executed:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n cached: options?.cache !== false,\n });\n }\n\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.logger.error('Prisma query failed:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Execute a mutation and invalidate cache with performance logging\n */\n async executeRaw(\n sql: string,\n values?: any[],\n options?: {\n invalidatePattern?: string;\n }\n ): Promise<number> {\n if (!this._client) {\n throw new Error('Prisma client not initialized. Call connect() first.');\n }\n\n const startTime = Date.now();\n\n try {\n const result = await this._client.$executeRawUnsafe(\n sql,\n ...(values || [])\n );\n const duration = Date.now() - startTime;\n\n // Log mutation performance\n if (duration > 1000) {\n this.logger.warn('Slow Prisma mutation detected:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n affectedRows: result,\n });\n } else if (this.context.env?.NODE_ENV !== 'production') {\n this.logger.debug('Prisma mutation executed:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n affectedRows: result,\n });\n }\n\n // Invalidate cache if pattern provided\n if (options?.invalidatePattern) {\n await this.invalidateCache(options.invalidatePattern);\n this.logger.debug(\n `Cache invalidated with pattern: ${options.invalidatePattern}`\n );\n }\n\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.logger.error('Prisma mutation failed:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n}\n"],"mappings":"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","names":["logger","GraphQLError","cached","cached","requestContext","formatError","GraphQLError","ApolloServerErrorCode","ErrorCode","isDev"]}
1
+ {"version":3,"sources":["../src/utils/prisma-error.util.ts","../src/plugins/error-handler.plugin.ts","../src/logger/index.ts","../src/cache/kv-cache.ts","../src/cache/batching-datasource.ts","../src/cache/apollo-cache-adapter.ts","../src/cache/index.ts","../src/context/constants.ts","../src/context/auth.ts","../src/env/config.ts","../src/context/index.ts","../src/utils/builder.util.ts","../src/server/server.builder.ts","../src/datasources/apollo-plugin.datasource.ts","../src/server/hono.configure.ts","../src/middleware/validation.ts","../src/middleware/rate-limit.ts","../src/tracing/tracer.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/plugins/tracing.plugin.ts","../src/server/index.ts","../src/utils/error.util.ts","../src/utils/schema.util.ts","../src/index.ts","../src/datasources/base.datasource.ts","../src/datasources/rest.datasource.ts","../src/datasources/prisma.datasource.ts"],"sourcesContent":["import {GraphQLError} from 'graphql';\nimport type {Logger} from 'pino';\n\n// Prisma error types (we'll check by name since we can't import from runtime)\ninterface PrismaError extends Error {\n code?: string;\n meta?: Record<string, any>;\n clientVersion?: string;\n}\n\n/**\n * Maps Prisma error codes to user-friendly messages\n * Hides internal implementation details from client\n */\nconst prismaErrorMap: Record<string, (error: PrismaError) => GraphQLError> = {\n // Unique constraint violation\n P2002: (error) => {\n const field = error.meta?.target || error.meta?.field_name || 'field';\n const fields = Array.isArray(field) ? field.join(', ') : field;\n return new GraphQLError(`A record with this ${fields} already exists`, {\n extensions: {\n code: 'CONFLICT',\n field: fields,\n },\n });\n },\n\n // Foreign key constraint violation\n P2003: (error) => {\n return new GraphQLError(\n 'The operation failed due to a reference constraint',\n {\n extensions: {\n code: 'FOREIGN_KEY_VIOLATION',\n field: error.meta?.field_name,\n },\n }\n );\n },\n\n // Record not found\n P2001: (error) => {\n return new GraphQLError('The requested record was not found', {\n extensions: {\n code: 'NOT_FOUND',\n },\n });\n },\n\n // Record not found for operation\n P2025: (error) => {\n const operation = error.meta?.cause || 'operation';\n return new GraphQLError(`Record to ${operation} not found`, {\n extensions: {\n code: 'NOT_FOUND',\n },\n });\n },\n\n // Required field missing\n P2012: (error) => {\n const field = error.meta?.field_name || 'field';\n return new GraphQLError(`Missing required field: ${field}`, {\n extensions: {\n code: 'VALIDATION_ERROR',\n field,\n },\n });\n },\n\n // Required argument missing\n P2013: (error) => {\n const argument = error.meta?.argument_name || 'argument';\n return new GraphQLError(`Missing required argument: ${argument}`, {\n extensions: {\n code: 'VALIDATION_ERROR',\n argument,\n },\n });\n },\n\n // Invalid value\n P2006: (error) => {\n const field = error.meta?.field_name || 'field';\n return new GraphQLError(`Invalid value provided for ${field}`, {\n extensions: {\n code: 'VALIDATION_ERROR',\n field,\n },\n });\n },\n\n // Value too long\n P2000: (error) => {\n const column = error.meta?.column_name || 'field';\n return new GraphQLError(`The value provided for ${column} is too long`, {\n extensions: {\n code: 'VALIDATION_ERROR',\n field: column,\n },\n });\n },\n\n // Null constraint violation\n P2011: (error) => {\n return new GraphQLError('A required field cannot be null', {\n extensions: {\n code: 'NULL_CONSTRAINT_VIOLATION',\n },\n });\n },\n\n // Transaction timeout\n P2024: (error) => {\n return new GraphQLError('The operation timed out. Please try again.', {\n extensions: {\n code: 'TIMEOUT',\n },\n });\n },\n\n // Transaction conflict\n P2034: (error) => {\n return new GraphQLError(\n 'The operation could not be completed due to a conflict. Please try again.',\n {\n extensions: {\n code: 'TRANSACTION_CONFLICT',\n },\n }\n );\n },\n};\n\n/**\n * Sanitizes Prisma errors before sending to client\n * Removes implementation details like \"prisma.speaker.create()\"\n */\nexport function sanitizePrismaError(error: any, logger?: Logger): GraphQLError {\n // Log the original error for debugging\n if (logger) {\n logger.error(\n {\n name: error.name,\n code: error.code,\n meta: error.meta,\n message: error.message,\n stack: error.stack,\n },\n 'Prisma error occurred'\n );\n }\n\n // Check if it's a Prisma error\n const isPrismaError =\n error.name &&\n (error.name.includes('PrismaClient') ||\n error.name === 'PrismaClientKnownRequestError' ||\n error.name === 'PrismaClientUnknownRequestError' ||\n error.name === 'PrismaClientRustPanicError' ||\n error.name === 'PrismaClientInitializationError' ||\n error.name === 'PrismaClientValidationError');\n\n if (!isPrismaError) {\n // Not a Prisma error, return as-is\n return error instanceof GraphQLError\n ? error\n : new GraphQLError('An unexpected error occurred', {\n extensions: {\n code: 'INTERNAL_SERVER_ERROR',\n },\n });\n }\n\n // Handle specific Prisma error codes\n if (error.code && prismaErrorMap[error.code]) {\n return prismaErrorMap[error.code](error);\n }\n\n // Handle different Prisma error types\n switch (error.name) {\n case 'PrismaClientValidationError':\n // Remove Prisma-specific details from validation errors\n return new GraphQLError('Invalid input data provided', {\n extensions: {\n code: 'VALIDATION_ERROR',\n },\n });\n\n case 'PrismaClientInitializationError':\n return new GraphQLError(\n 'Database connection error. Please try again later.',\n {\n extensions: {\n code: 'SERVICE_UNAVAILABLE',\n },\n }\n );\n\n case 'PrismaClientRustPanicError':\n return new GraphQLError(\n 'A critical database error occurred. Please contact support.',\n {\n extensions: {\n code: 'INTERNAL_SERVER_ERROR',\n },\n }\n );\n\n case 'PrismaClientUnknownRequestError':\n return new GraphQLError('An unexpected database error occurred', {\n extensions: {\n code: 'INTERNAL_SERVER_ERROR',\n },\n });\n\n default:\n // Generic Prisma error\n return new GraphQLError('A database operation failed', {\n extensions: {\n code: error.code || 'DATABASE_ERROR',\n },\n });\n }\n}\n\n/**\n * Wraps async resolver functions to catch and sanitize Prisma errors\n */\nexport function withPrismaErrorHandling<\n T extends (...args: any[]) => Promise<any>,\n>(fn: T, logger?: Logger): T {\n return (async (...args: Parameters<T>) => {\n try {\n return await fn(...args);\n } catch (error) {\n throw sanitizePrismaError(error, logger);\n }\n }) as T;\n}\n","import type {GraphQLFormattedError} from 'graphql';\nimport {GraphQLError} from 'graphql';\nimport type {BaseContext} from '@/context';\nimport {sanitizePrismaError} from '@/utils/prisma-error.util';\n\n/**\n * Format error function that sanitizes Prisma errors\n * This is used in Apollo Server configuration\n */\nexport function formatError(\n formattedError: GraphQLFormattedError,\n error: unknown\n): GraphQLFormattedError {\n // Get the original error\n const originalError =\n error instanceof GraphQLError ? error.originalError : error;\n\n // Check if it's a Prisma error\n if (\n originalError &&\n typeof originalError === 'object' &&\n 'name' in originalError &&\n ((originalError.name as string)?.includes('PrismaClient') ||\n ('code' in originalError &&\n typeof originalError.code === 'string' &&\n originalError.code.startsWith('P')))\n ) {\n // Sanitize the Prisma error\n const sanitized = sanitizePrismaError(originalError, undefined);\n\n // Return the sanitized error formatted\n return {\n message: sanitized.message,\n extensions: sanitized.extensions,\n path: formattedError.path,\n locations: formattedError.locations,\n };\n }\n\n // Return the original formatted error if not a Prisma error\n return formattedError;\n}\n","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","/**\n * KV Cache implementation for Cloudflare Workers\n * Provides caching capabilities for GraphQL resolvers using Cloudflare KV\n */\n\nexport interface CacheOptions {\n ttl?: number; // Time to live in seconds\n namespace?: string; // Cache namespace prefix\n cacheKey?: string; // Custom cache key\n}\n\nexport class KVCache {\n private defaultTTL: number = 300; // 5 minutes default\n private defaultNamespace: string = 'cache';\n\n constructor(\n private kv: KVNamespace,\n defaultNamespace?: string\n ) {\n if (defaultNamespace) {\n this.defaultNamespace = defaultNamespace;\n }\n }\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 with metadata\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 ttl = options.ttl || this.defaultTTL;\n const kvOptions: KVNamespacePutOptions = {\n expirationTtl: ttl,\n metadata: {\n createdAt: new Date().toISOString(),\n ttl: ttl,\n namespace: options.namespace || this.defaultNamespace,\n },\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<number> {\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 return list.keys.length;\n } catch (error) {\n console.error(`Cache clear prefix error for ${prefix}:`, error);\n return 0;\n }\n }\n\n /**\n * Invalidate cache by pattern\n */\n async invalidate(pattern: string): Promise<number> {\n return this.clearPrefix(pattern);\n }\n\n /**\n * Clear all cache in a namespace\n */\n async clearNamespace(namespace?: string): Promise<number> {\n const prefix = namespace ? `${namespace}:` : `${this.defaultNamespace}:`;\n return this.invalidate(prefix);\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 (non-blocking)\n this.set(key, fresh, options).catch((error) => {\n console.error(`Background cache write error for ${key}:`, error);\n });\n\n return fresh;\n }\n\n /**\n * Memoize function with automatic key generation\n */\n async memoize<T>(\n cacheKey: string,\n params: any,\n fetchFn: () => Promise<T>,\n options: CacheOptions = {}\n ): Promise<T> {\n const namespace = options.namespace || this.defaultNamespace;\n const key = this.generateKey(`${namespace}:${cacheKey}`, params);\n\n try {\n // Try to get from cache\n const cached = await this.get<T>(key);\n if (cached !== null) {\n return cached;\n }\n } catch (error) {\n console.warn(`Cache read error for ${key}:`, error);\n }\n\n // Cache miss - fetch data\n const data = await fetchFn();\n\n // Store in cache (non-blocking)\n this.set(key, data, options).catch((error) => {\n console.warn(`Cache write error for ${key}:`, error);\n });\n\n return data;\n }\n\n /**\n * Generate cache key with namespace and params\n */\n private generateKey(namespace: string, params: any): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((obj: any, key) => {\n if (params[key] !== undefined && params[key] !== null) {\n obj[key] = params[key];\n }\n return obj;\n }, {});\n\n const paramString = JSON.stringify(sortedParams);\n const hash = this.simpleHash(paramString);\n return `${namespace}:${hash}`;\n }\n\n /**\n * Simple hash function for generating cache keys\n */\n private simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return Math.abs(hash).toString(36);\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","import DataLoader, {type BatchLoadFn, type Options} from 'dataloader';\nimport type {BaseContext} from '@/context';\nimport {KVCache} from './kv-cache';\n\n/**\n * Ensures that output items has the same order as input keys (dataloader requirement).\n * Returns error objects for non-existent ids.\n *\n * @param keys list of input keys\n * @param items list of output items\n * @param primaryKey name of the key-holding property\n */\nexport function ensureBatchOrder<\n K extends string | number,\n T extends Record<string, any>,\n>(keys: readonly K[], items: T[], primaryKey = 'id'): Array<T | Error> {\n const itemsMap = new Map<K, T>();\n\n // Build a map for O(1) lookups\n for (const item of items) {\n const key = item[primaryKey] as K;\n if (key !== undefined) {\n itemsMap.set(key, item);\n }\n }\n\n // Return items in the same order as keys\n return keys.map(\n (key) =>\n itemsMap.get(key) || new Error(`Missing value for ${primaryKey} ${key}`)\n );\n}\n\n/**\n * Ensures that output items has the same order as input keys (dataloader requirement).\n * Returns null for non-existent ids.\n *\n * @param keys list of input keys\n * @param items list of output items\n * @param primaryKey name of the key-holding property\n */\nexport function ensureBatchOrderNullable<\n K extends string | number,\n T extends Record<string, any>,\n>(keys: readonly K[], items: T[], primaryKey = 'id'): Array<T | null> {\n const itemsMap = new Map<K, T>();\n\n // Build a map for O(1) lookups\n for (const item of items) {\n const key = item[primaryKey] as K;\n if (key !== undefined) {\n itemsMap.set(key, item);\n }\n }\n\n // Return items in the same order as keys, with nulls for missing\n return keys.map((key) => itemsMap.get(key) || null);\n}\n\n/**\n * Base class for batching data sources with caching support.\n * Uses DataLoader for request batching and deduplication.\n *\n * @typeParam TContext - Apollo context type\n * @typeParam K - Primary key type\n * @typeParam V - Output item type\n * @typeParam CK - Cache key type (same as K by default)\n *\n * @example\n * ```typescript\n * export class UserBatchingDataSource extends BatchingDataSource<BaseContext, string, User> {\n * constructor() {\n * super(async (ids: readonly string[]) => {\n * const users = await fetchUsersFromDB(ids);\n * return ensureBatchOrder(ids, users);\n * });\n * }\n * }\n * ```\n */\nexport class BatchingDataSource<TContext extends BaseContext, K, V, CK = K> {\n protected context!: TContext;\n protected loader: DataLoader<K, V, CK>;\n protected cache?: KVCache;\n\n /**\n * Creates a new batching data source\n *\n * @param resolveBatch - Batch resolving function\n * @param options - DataLoader options\n * @param cacheNamespace - Optional namespace for KV caching\n */\n constructor(\n resolveBatch: BatchLoadFn<K, V>,\n options: Options<K, V, CK> = {},\n protected cacheNamespace?: string\n ) {\n // Bind context to the batch function\n const boundResolveBatch: BatchLoadFn<K, V> = async (keys) => {\n // If we have cache, try to load from cache first\n if (this.cache && this.cacheNamespace) {\n const results: Array<V | undefined> = [];\n const uncachedKeys: K[] = [];\n const uncachedIndexes: number[] = [];\n\n // Check cache for each key\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const cacheKey = `${this.cacheNamespace}:${String(key)}`;\n const cached = await this.cache.get<V>(cacheKey);\n\n if (cached !== null) {\n results[i] = cached;\n } else {\n uncachedKeys.push(key);\n uncachedIndexes.push(i);\n }\n }\n\n // If all items were cached, return them\n if (uncachedKeys.length === 0) {\n return results as V[];\n }\n\n // Fetch uncached items\n const freshItems = await resolveBatch.call(this, uncachedKeys);\n\n // Merge fresh items back and cache them\n for (let i = 0; i < uncachedIndexes.length; i++) {\n const index = uncachedIndexes[i];\n const item = freshItems[i] as V;\n const key = uncachedKeys[i];\n\n results[index] = item;\n\n // Cache the fresh item (non-blocking)\n if (!(item instanceof Error) && item !== null && item !== undefined) {\n const cacheKey = `${this.cacheNamespace}:${String(key)}`;\n this.cache.set(cacheKey, item, {ttl: 300}).catch((err) => {\n console.warn(`Failed to cache item ${cacheKey}:`, err);\n });\n }\n }\n\n return results as V[];\n }\n\n // No cache, just resolve normally\n return resolveBatch.call(this, keys);\n };\n\n this.loader = new DataLoader(boundResolveBatch, {\n ...options,\n // Default to caching within the request\n cache: options.cache !== false,\n });\n }\n\n /**\n * Initialize with Apollo context\n */\n initialize(config: {contextValue: TContext}) {\n this.context = config.contextValue;\n this.cache = config.contextValue.cache;\n }\n\n /**\n * Load a single item by key\n */\n async load(id: K): Promise<V> {\n return this.loader.load(id);\n }\n\n /**\n * Load multiple items by keys\n */\n async loadMany(ids: readonly K[]): Promise<Array<V | Error>> {\n return this.loader.loadMany(ids);\n }\n\n /**\n * Clear a single item from the DataLoader cache\n */\n clear(id: K): this {\n this.loader.clear(id);\n return this;\n }\n\n /**\n * Clear all items from the DataLoader cache\n */\n clearAll(): this {\n this.loader.clearAll();\n return this;\n }\n\n /**\n * Prime the cache with a specific value\n */\n prime(key: K, value: V): this {\n this.loader.prime(key, value);\n return this;\n }\n}\n\n/**\n * Factory function for creating batching data sources\n *\n * @example\n * ```typescript\n * const userDataSource = createBatchingDataSource<BaseContext, string, User>(\n * async (ids) => {\n * const users = await fetchUsersFromDB(ids);\n * return ensureBatchOrder(ids, users);\n * },\n * { cache: true },\n * 'users'\n * );\n * ```\n */\nexport function createBatchingDataSource<\n TContext extends BaseContext,\n K,\n V,\n CK = K,\n>(\n resolveBatch: BatchLoadFn<K, V>,\n options?: Options<K, V, CK>,\n cacheNamespace?: string\n): BatchingDataSource<TContext, K, V, CK> {\n return new BatchingDataSource(resolveBatch, options, cacheNamespace);\n}\n","/**\n * Apollo KeyValueCache adapter for Cloudflare KV\n *\n * Implements the Apollo Server KeyValueCache interface to work with\n * Cloudflare Workers KV storage.\n */\n\nimport type {\n KeyValueCache,\n KeyValueCacheSetOptions,\n} from '@apollo/utils.keyvaluecache';\nimport {KVCache} from './kv-cache';\n\n/**\n * Adapter that makes our KVCache compatible with Apollo's KeyValueCache interface\n *\n * Apollo Server uses this for:\n * - Response caching\n * - APQ (Automatic Persisted Queries)\n * - DataSource caching\n *\n * @example\n * ```typescript\n * const apolloCache = new ApolloKVAdapter(new KVCache(env.KV));\n *\n * const server = new ApolloServer({\n * cache: apolloCache,\n * // ... other options\n * });\n * ```\n */\nexport class ApolloKVAdapter implements KeyValueCache<string> {\n constructor(private kvCache: KVCache) {}\n\n /**\n * Get a value from cache\n * Apollo expects undefined for cache misses\n */\n async get(key: string): Promise<string | undefined> {\n const value = await this.kvCache.get<string>(key);\n // Apollo expects undefined, not null for cache misses\n return value === null ? undefined : value;\n }\n\n /**\n * Set a value in cache with TTL support\n * Apollo passes TTL in seconds via options\n */\n async set(\n key: string,\n value: string,\n options?: KeyValueCacheSetOptions\n ): Promise<void> {\n await this.kvCache.set(key, value, {\n ttl: options?.ttl, // Apollo's TTL is already in seconds\n });\n }\n\n /**\n * Delete a value from cache\n * Apollo expects boolean or void return\n */\n async delete(key: string): Promise<boolean | void> {\n await this.kvCache.delete(key);\n return true;\n }\n}\n\n/**\n * Factory function to create an Apollo-compatible cache from KV namespace\n *\n * @param kv - Cloudflare KV namespace binding\n * @returns Apollo-compatible KeyValueCache\n */\nexport function createApolloCache(kv: KVNamespace): KeyValueCache<string> {\n return new ApolloKVAdapter(new KVCache(kv));\n}\n\n/**\n * In-memory LRU cache for development/testing\n * Falls back to simple Map-based implementation\n */\nexport class InMemoryCache implements KeyValueCache<string> {\n private cache = new Map<string, {value: string; expires?: number}>();\n\n async get(key: string): Promise<string | undefined> {\n const item = this.cache.get(key);\n if (!item) return undefined;\n\n // Check expiration\n if (item.expires && Date.now() > item.expires) {\n this.cache.delete(key);\n return undefined;\n }\n\n return item.value;\n }\n\n async set(\n key: string,\n value: string,\n options?: KeyValueCacheSetOptions\n ): Promise<void> {\n const expires = options?.ttl\n ? Date.now() + options.ttl * 1000 // Convert seconds to milliseconds\n : undefined;\n\n this.cache.set(key, {value, expires});\n }\n\n async delete(key: string): Promise<boolean> {\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cache entries\n */\n clear(): void {\n this.cache.clear();\n }\n}\n","/**\n * Cache module for GraphQL resolvers\n * Provides caching interface for Cloudflare Workers KV\n */\n\nimport {KVCache, createCacheKey, CacheKeys} from './kv-cache';\nimport type {CacheOptions} from './kv-cache';\nimport {\n BatchingDataSource,\n createBatchingDataSource,\n ensureBatchOrder,\n ensureBatchOrderNullable,\n} from './batching-datasource';\nimport {\n ApolloKVAdapter,\n createApolloCache,\n InMemoryCache,\n} from './apollo-cache-adapter';\n\nexport {KVCache, createCacheKey, CacheKeys};\nexport type {CacheOptions};\nexport {\n BatchingDataSource,\n createBatchingDataSource,\n ensureBatchOrder,\n ensureBatchOrderNullable,\n};\nexport {ApolloKVAdapter, createApolloCache, InMemoryCache};\n\n/**\n * Cache factory - creates KV cache if available\n */\nexport function createCache(env: Env): KVCache | null {\n // Check for KV namespace (Cloudflare Workers KV)\n if (env.KV) {\n return new KVCache(env.KV);\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;\n\n constructor(\n batchFn: (keys: K[]) => Promise<V[]>,\n cache: KVCache,\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","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 * 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 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 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';\nimport type {TraceContext, WorkerTracer} from '@/tracing/tracer';\n\nexport type {ContextUser} from './types';\n\nexport interface BaseContext extends ApolloBaseContext {\n user?: ContextUser;\n logger: typeof logger;\n executionCtx: ExecutionContext;\n cache?: KVCache; // KV cache for resolvers\n db?: D1Database; // D1 database binding for datasources\n env: EnvConfig; // Validated environment configuration\n\n // Tracing context (set by tracing middleware)\n traceContext?: TraceContext;\n tracer?: WorkerTracer;\n traceId?: string;\n spanId?: string;\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 - KV is now required\n // Pass raw env for KV bindings, not the parsed config\n const cache = createCache(rawEnv) as KVCache | undefined;\n if (!cache) {\n // This should not happen as ServerBuilder validates KV exists\n logger.warn(\n 'KV cache not found in context - this should not happen if using ServerBuilder'\n );\n }\n\n // Get D1 database binding (optional - datasources will validate if needed)\n const db = rawEnv?.DB as D1Database | undefined;\n\n return {\n user,\n logger,\n cache,\n db, // Raw D1 binding for datasources\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 {createApolloCache} from '@/cache';\nimport {\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 {ApolloDataSources} from '../datasources/apollo-plugin.datasource';\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\nimport type {KVCache} from '@/cache';\n\nexport type ServerConfig<TDatasource, TContext extends BaseContext> = {\n path?: string;\n apollo: Partial<ApolloServerOptions<BaseContext>>;\n datasources: (cache: KVCache, context: TContext) => TDatasource;\n extendContext?: ContextExtendFunction<TContext>;\n};\n\nexport class ServerBuilder<TDatasource, TContext extends BaseContext> {\n readonly app: Hono<{\n Variables: {\n env: any;\n };\n }>;\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\n // Build plugins array with datasources\n const plugins: ApolloServerPlugin<TContext>[] = [...this.plugins];\n\n // Add datasources plugin (now required)\n plugins.push(\n ApolloDataSources({\n datasources: this.config.datasources as any,\n }) as any\n );\n\n // We need to create the Apollo server for each request to pass the correct cache\n const createHandler = (env: any) => {\n // Validate KV binding exists\n if (!env?.KV) {\n throw new Error(\n 'Missing required KV namespace binding. ' +\n 'Please add KV namespace binding in your wrangler.toml:\\n' +\n '[[kv_namespaces]]\\n' +\n 'binding = \"KV\"\\n' +\n 'id = \"your-kv-namespace-id\"'\n );\n }\n\n // Create Apollo cache from KV\n const apolloCache = createApolloCache(env.KV);\n\n // Create Apollo server with cache\n // We need to ensure we don't include gateway if schema is provided\n const {gateway, ...apolloConfigWithoutGateway} = this.config.apollo || {};\n\n const server = new ApolloServer<TContext>({\n ...apolloConfigWithoutGateway, // User config without gateway\n schema: this.schema, // Our schema\n plugins, // Our plugins\n cache: apolloCache, // Apollo cache for APQ and response caching (override any user cache)\n formatError: (formattedError, error) => {\n // Import formatError dynamically to avoid circular dependency\n const {formatError} = require('@/plugins/error-handler.plugin');\n return formatError(formattedError, error);\n },\n } as ApolloServerOptions<TContext>);\n\n return startServerAndCreateCloudflareWorkersHandler<any, any>(server, {\n context: async (c) =>\n createContextFunction(this.config.extendContext)(c),\n });\n };\n\n // Cache handlers per environment (for efficiency)\n const handlerCache = new WeakMap();\n\n const getOrCreateHandler = (env: any) => {\n if (!handlerCache.has(env)) {\n handlerCache.set(env, createHandler(env));\n }\n return handlerCache.get(env);\n };\n\n honoApp.all(this.config.path ?? '/', async (c) => {\n // Get or create handler for this environment\n const cfHandler = getOrCreateHandler(c.env);\n\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 async fetch(request, env, ctx) {\n return honoApp.fetch(request, env, ctx);\n },\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 type {ApolloServerPlugin} from '@apollo/server';\nimport type {BaseContext} from '../context';\nimport type {ServerConfig} from '../server/server.builder';\nimport type {KVCache} from '../cache';\n\ntype DataSources = Record<string, any>;\ntype DataSourcesFn = <TContext extends BaseContext = BaseContext>(\n cache: KVCache,\n contextValue: TContext\n) => DataSources;\n\nexport type ComputedContext<\n TDatasource,\n TContext extends BaseContext,\n> = TContext & {\n datasources: ReturnType<\n NonNullable<ServerConfig<TDatasource, TContext>['datasources']>\n >;\n};\n\nexport const ApolloDataSources = <\n TDatasource,\n TContext extends BaseContext,\n>(options: {\n datasources: DataSourcesFn;\n}): ApolloServerPlugin<ComputedContext<TDatasource, TContext>> => ({\n async requestDidStart(requestContext) {\n // Get KVCache from context instead of Apollo's cache\n const kvCache = requestContext.contextValue.cache;\n if (!kvCache) {\n // Don't throw for missing cache, just log and continue\n console.warn(\n 'KVCache not found in context. Datasources may not function properly.'\n );\n requestContext.contextValue.datasources = {} as TDatasource;\n return;\n }\n\n try {\n const dataSources = options.datasources(\n kvCache,\n requestContext.contextValue\n );\n\n // Skip connection for introspection queries to avoid errors\n const query = requestContext.request.query;\n if (\n query &&\n (query.includes('__schema') || query.includes('IntrospectionQuery'))\n ) {\n // This is an introspection query, assign datasources but skip connection\n requestContext.contextValue.datasources =\n dataSources as unknown as TDatasource;\n return;\n }\n\n // Auto-connect datasources that have connect method for actual queries\n const connectPromises = Object.entries(dataSources).map(\n async ([name, dataSource]) => {\n if (dataSource && typeof dataSource.connect === 'function') {\n await dataSource.connect();\n }\n }\n );\n\n await Promise.all(connectPromises);\n\n requestContext.contextValue.datasources =\n dataSources as unknown as TDatasource;\n } catch (error) {\n // Log error but don't throw to avoid breaking the request\n console.error('Failed to initialize datasources:', error);\n requestContext.contextValue.datasources = {} as TDatasource;\n }\n },\n});\n","import {BaseContext} from '@/context';\nimport {Hono} from 'hono';\nimport {cors} from 'hono/cors';\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 Variables: {\n env: any;\n };\n }>();\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 = rawEnv as any; // Type assertion for environment variables\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 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.get('env') as any;\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') as any;\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 {ExecutionContext} from '@cloudflare/workers-types';\n\n/**\n * Cloudflare Workers Tracing Wrapper\n *\n * Cloudflare Workers now provides automatic tracing with zero configuration.\n * This wrapper provides additional context and manual span creation when needed.\n *\n * Key features:\n * - Automatic instrumentation of all I/O operations (KV, R2, D1, etc.)\n * - OpenTelemetry-compliant spans\n * - Zero-config setup when enabled in wrangler.toml\n */\n\nexport interface TraceContext {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n baggage?: Record<string, string>;\n}\n\n/**\n * Extract W3C Trace Context from headers\n * Format: traceparent: 00-{traceId}-{spanId}-{flags}\n */\nexport function extractTraceContext(headers: Headers): TraceContext | null {\n const traceparent = headers.get('traceparent');\n if (!traceparent) return null;\n\n const parts = traceparent.split('-');\n if (parts.length !== 4) return null;\n\n const [version, traceId, spanId, flags] = parts;\n if (version !== '00') return null; // Only support version 00\n\n // Extract baggage if present\n const baggageHeader = headers.get('baggage');\n const baggage: Record<string, string> = {};\n\n if (baggageHeader) {\n baggageHeader.split(',').forEach((item) => {\n const [key, value] = item.trim().split('=');\n if (key && value) {\n baggage[key] = decodeURIComponent(value);\n }\n });\n }\n\n return {\n traceId,\n spanId,\n parentSpanId: spanId,\n baggage: Object.keys(baggage).length > 0 ? baggage : undefined,\n };\n}\n\n/**\n * Generate W3C Trace Context header\n */\nexport function generateTraceHeader(context: TraceContext): string {\n return `00-${context.traceId}-${context.spanId}-01`;\n}\n\n/**\n * Generate trace ID (32 hex chars / 128 bits)\n */\nexport function generateTraceId(): string {\n return Array.from(crypto.getRandomValues(new Uint8Array(16)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Generate span ID (16 hex chars / 64 bits)\n */\nexport function generateSpanId(): string {\n return Array.from(crypto.getRandomValues(new Uint8Array(8)))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Custom span for manual instrumentation\n * This is useful when you want to track specific operations\n * that aren't automatically instrumented\n */\nexport class WorkerSpan {\n private startTime: number;\n private endTime?: number;\n private attributes: Record<string, any> = {};\n private events: Array<{\n name: string;\n timestamp: number;\n attributes?: Record<string, any>;\n }> = [];\n\n constructor(\n public readonly name: string,\n public readonly spanId: string,\n public readonly traceId: string,\n public readonly parentSpanId?: string\n ) {\n this.startTime = Date.now();\n }\n\n setAttribute(key: string, value: any): this {\n this.attributes[key] = value;\n return this;\n }\n\n setAttributes(attributes: Record<string, any>): this {\n Object.assign(this.attributes, attributes);\n return this;\n }\n\n addEvent(name: string, attributes?: Record<string, any>): this {\n this.events.push({\n name,\n timestamp: Date.now(),\n attributes,\n });\n return this;\n }\n\n end(): void {\n if (!this.endTime) {\n this.endTime = Date.now();\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n spanId: this.spanId,\n traceId: this.traceId,\n parentSpanId: this.parentSpanId,\n startTime: this.startTime,\n endTime: this.endTime || Date.now(),\n duration: (this.endTime || Date.now()) - this.startTime,\n attributes: this.attributes,\n events: this.events,\n };\n }\n}\n\n/**\n * Tracer for Cloudflare Workers\n * Provides manual span creation for custom instrumentation\n */\nexport class WorkerTracer {\n private spans: WorkerSpan[] = [];\n\n constructor(\n private readonly traceContext: TraceContext,\n private readonly executionContext?: ExecutionContext\n ) {}\n\n createSpan(name: string, parentSpanId?: string): WorkerSpan {\n const span = new WorkerSpan(\n name,\n generateSpanId(),\n this.traceContext.traceId,\n parentSpanId || this.traceContext.spanId\n );\n\n this.spans.push(span);\n return span;\n }\n\n /**\n * Run a function within a span\n */\n async trace<T>(\n name: string,\n fn: (span: WorkerSpan) => Promise<T>\n ): Promise<T> {\n const span = this.createSpan(name);\n\n try {\n const result = await fn(span);\n span.end();\n return result;\n } catch (error) {\n span.setAttribute('error', true);\n span.setAttribute(\n 'error.message',\n error instanceof Error ? error.message : String(error)\n );\n span.end();\n throw error;\n }\n }\n\n /**\n * Export spans (for custom logging or external systems)\n */\n exportSpans(): Array<ReturnType<WorkerSpan['toJSON']>> {\n return this.spans.map((span) => span.toJSON());\n }\n\n /**\n * Log spans to console (useful for development)\n */\n logSpans(): void {\n const spans = this.exportSpans();\n console.log('[Trace]', {\n traceId: this.traceContext.traceId,\n spans,\n });\n }\n\n /**\n * Send spans to external observability platform via fetch\n * This can be used with waitUntil to avoid blocking the response\n */\n async sendToObservabilityPlatform(\n endpoint: string,\n headers?: Record<string, string>\n ): Promise<void> {\n const spans = this.exportSpans();\n\n const promise = fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({\n traceId: this.traceContext.traceId,\n spans,\n timestamp: new Date().toISOString(),\n }),\n });\n\n // Use waitUntil to ensure the request completes without blocking\n if (this.executionContext?.waitUntil) {\n this.executionContext.waitUntil(promise);\n } else {\n await promise;\n }\n }\n}\n\n/**\n * Create a tracer instance for the current request\n */\nexport function createTracer(\n headers: Headers,\n executionContext?: ExecutionContext\n): WorkerTracer {\n // Try to extract existing trace context from headers\n let traceContext = extractTraceContext(headers);\n\n // If no trace context, create a new one\n if (!traceContext) {\n traceContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n };\n }\n\n return new WorkerTracer(traceContext, executionContext);\n}\n","import type {MiddlewareHandler} from 'hono';\nimport {logger} from '@/logger';\nimport {\n extractTraceContext,\n generateTraceId,\n generateSpanId,\n generateTraceHeader,\n createTracer,\n type TraceContext,\n} from '@/tracing/tracer';\n\n/**\n * Cloudflare Workers Native Tracing Middleware\n *\n * This middleware integrates with Cloudflare's automatic tracing feature.\n * When enabled in wrangler.toml, CF automatically traces all I/O operations.\n *\n * This middleware:\n * 1. Extracts or creates W3C Trace Context (traceparent header)\n * 2. Propagates trace context through the request\n * 3. Provides manual tracing capabilities for custom spans\n * 4. Logs trace information for correlation\n */\nexport function createTracingMiddleware(): MiddlewareHandler {\n return async (c, next) => {\n // Extract W3C Trace Context from headers or create new one\n let traceContext = extractTraceContext(c.req.raw.headers);\n\n if (!traceContext) {\n // Create new trace context\n traceContext = {\n traceId: generateTraceId(),\n spanId: generateSpanId(),\n };\n } else {\n // Create new span for this request\n traceContext = {\n ...traceContext,\n parentSpanId: traceContext.spanId,\n spanId: generateSpanId(),\n };\n }\n\n // Create tracer for manual instrumentation\n const tracer = createTracer(c.req.raw.headers, c.executionCtx);\n\n // Store in context for other middleware/resolvers\n c.set('traceContext', traceContext);\n c.set('tracer', tracer);\n c.set('traceId', traceContext.traceId);\n c.set('spanId', traceContext.spanId);\n\n // Set global request context for pino logger\n globalThis.requestContext = {\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n userId: c.get('userId'),\n };\n\n // Add W3C Trace Context headers to response\n c.header('traceparent', generateTraceHeader(traceContext));\n\n // Add legacy headers for backwards compatibility\n c.header('x-trace-id', traceContext.traceId);\n c.header('x-span-id', traceContext.spanId);\n\n // Add CF Ray ID for correlation with Cloudflare logs\n const cfRay = c.req.header('cf-ray');\n if (cfRay) {\n c.header('cf-ray', cfRay);\n }\n\n const startTime = Date.now();\n const requestSpan = tracer.createSpan('http.request');\n\n // Set span attributes\n requestSpan.setAttributes({\n 'http.method': c.req.method,\n 'http.url': c.req.url,\n 'http.target': c.req.path,\n 'http.host': c.req.header('host'),\n 'http.scheme': new URL(c.req.url).protocol.replace(':', ''),\n 'http.user_agent': c.req.header('user-agent'),\n 'net.peer.ip':\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for'),\n 'cf.ray': cfRay,\n 'cf.worker.subrequest': c.req.header('cf-worker-subrequest') === 'true',\n });\n\n try {\n await next();\n\n // Set response attributes\n requestSpan.setAttributes({\n 'http.status_code': c.res.status,\n 'http.response_content_length': c.res.headers.get('content-length'),\n });\n\n requestSpan.end();\n } catch (error) {\n // Record error on span\n requestSpan.setAttribute('error', true);\n requestSpan.setAttribute(\n 'error.message',\n error instanceof Error ? error.message : String(error)\n );\n requestSpan.end();\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n\n // Log request with trace correlation\n logger.info(\n {\n type: 'request',\n trace: {\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n parentSpanId: traceContext.parentSpanId,\n },\n http: {\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') ||\n c.req.header('x-forwarded-for'),\n },\n cf: {\n ray: cfRay,\n colo: c.req.header('cf-ipcountry'),\n tlsVersion: c.req.header('cf-tls-version'),\n },\n },\n `${c.req.method} ${c.req.path} - ${c.res.status} (${duration}ms)`\n );\n\n // Add Server-Timing header with trace ID for correlation\n c.header(\n 'Server-Timing',\n `total;dur=${duration}, trace;desc=\"${traceContext.traceId}\"`\n );\n\n // Clean up global context\n delete globalThis.requestContext;\n\n // Export custom spans if any (useful for debugging)\n if (c.env?.TRACE_DEBUG === 'true') {\n tracer.logSpans();\n }\n }\n };\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 Variables: {\n env: any;\n };\n }>,\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 type {GraphQLRequestContext} from '@apollo/server';\nimport type {BaseContext} from '../context';\n\n/**\n * Tracing utilities for GraphQL operations\n * Works with W3C Trace Context and Cloudflare's native tracing\n */\n\nexport enum TraceBaggage {\n ROOT_OP_NAME = 'root_op_name',\n USER_ID = 'user_id',\n CLIENT_ID = 'client_id',\n}\n\n/**\n * Get the operation name from GraphQL context\n * Checks multiple sources in order of preference\n */\nexport const getOpsName = (gqlCtx: GraphQLRequestContext<BaseContext>) => {\n // Check baggage from trace context first\n const baggage = gqlCtx.contextValue.traceContext?.baggage;\n const baggageOpName = baggage?.[TraceBaggage.ROOT_OP_NAME];\n\n if (baggageOpName) {\n return baggageOpName;\n }\n\n // Fall back to GraphQL operation name\n return gqlCtx.request.operationName || gqlCtx.operationName || 'UNKNOWN';\n};\n\n/**\n * Get trace ID from context\n */\nexport const getTraceId = (ctx: BaseContext): string | undefined => {\n return ctx.traceId || ctx.traceContext?.traceId;\n};\n\n/**\n * Get span ID from context\n */\nexport const getSpanId = (ctx: BaseContext): string | undefined => {\n return ctx.spanId || ctx.traceContext?.spanId;\n};\n\n/**\n * Check if tracing is enabled for this request\n */\nexport const isTracingEnabled = (ctx: BaseContext): boolean => {\n return !!(ctx.tracer && ctx.traceContext);\n};\n\n/**\n * Create trace metadata for logging\n */\nexport const getTraceMetadata = (ctx: BaseContext) => {\n if (!isTracingEnabled(ctx)) {\n return {};\n }\n\n return {\n traceId: getTraceId(ctx),\n spanId: getSpanId(ctx),\n parentSpanId: ctx.traceContext?.parentSpanId,\n };\n};\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 {createTracingPlugin} from '@/plugins/tracing.plugin';\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 // tracing - integrates with Cloudflare's native tracing\n builder.plugins.push(createTracingPlugin());\n}\n","import type {ApolloServerPlugin, GraphQLRequestListener} from '@apollo/server';\nimport type {BaseContext} from '@/context';\nimport type {WorkerTracer} from '@/tracing/tracer';\n\n/**\n * Apollo Server plugin for GraphQL operation tracing\n * Integrates with Cloudflare Workers native tracing\n */\nexport function createTracingPlugin<\n TContext extends BaseContext,\n>(): ApolloServerPlugin<TContext> {\n return {\n async requestDidStart(\n requestContext\n ): Promise<GraphQLRequestListener<TContext>> {\n const {contextValue} = requestContext;\n\n // Get tracer from context (set by middleware)\n const tracer = contextValue.tracer;\n const traceContext = contextValue.traceContext;\n\n if (!tracer || !traceContext) {\n // No tracing available, return empty listener\n return {};\n }\n\n // Create spans for GraphQL operations\n let parseSpan: any;\n let validateSpan: any;\n let executeSpan: any;\n\n return {\n async parsingDidStart() {\n parseSpan = tracer.createSpan('graphql.parse');\n return async (err) => {\n if (err) {\n parseSpan.setAttribute('error', true);\n parseSpan.setAttribute('error.message', err.message);\n }\n parseSpan.end();\n };\n },\n\n async validationDidStart() {\n validateSpan = tracer.createSpan('graphql.validate');\n return async (errs) => {\n if (errs && errs.length > 0) {\n validateSpan.setAttribute('error', true);\n validateSpan.setAttribute('error.count', errs.length);\n validateSpan.setAttribute(\n 'error.messages',\n errs.map((e) => e.message).join(', ')\n );\n }\n validateSpan.end();\n };\n },\n\n async executionDidStart() {\n const operation = requestContext.request.operationName || 'anonymous';\n const operationType = requestContext.operation?.operation || 'query';\n\n executeSpan = tracer.createSpan(`graphql.${operationType}`);\n executeSpan.setAttributes({\n 'graphql.operation.name': operation,\n 'graphql.operation.type': operationType,\n 'graphql.document': requestContext.request.query,\n });\n\n return {\n async executionDidEnd(err) {\n if (err) {\n executeSpan.setAttribute('error', true);\n executeSpan.setAttribute('error.message', err.message);\n }\n executeSpan.end();\n },\n\n willResolveField({info}) {\n const fieldName = info.fieldName;\n const parentType = info.parentType.name;\n const fieldPath = `${parentType}.${fieldName}`;\n\n // Only trace non-trivial fields (skip scalar fields on Query/Mutation)\n const shouldTrace =\n parentType !== 'Query' &&\n parentType !== 'Mutation' &&\n parentType !== 'Subscription';\n\n if (\n !shouldTrace &&\n !(contextValue as any).env?.TRACE_ALL_FIELDS\n ) {\n return;\n }\n\n const fieldSpan = tracer.createSpan(`graphql.field.${fieldPath}`);\n fieldSpan.setAttributes({\n 'graphql.field.name': fieldName,\n 'graphql.field.type': parentType,\n 'graphql.field.path': fieldPath,\n 'graphql.field.return_type': info.returnType.toString(),\n });\n\n return (err: any) => {\n if (err) {\n fieldSpan.setAttribute('error', true);\n fieldSpan.setAttribute('error.message', err.message);\n }\n fieldSpan.end();\n };\n },\n };\n },\n\n async didEncounterErrors(requestContext) {\n // Log errors with trace context\n const {errors} = requestContext;\n if (errors && errors.length > 0) {\n contextValue.logger.error(\n {\n trace: {\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n },\n graphql: {\n operation: requestContext.request.operationName,\n errors: errors.map((e) => ({\n message: e.message,\n path: e.path,\n extensions: e.extensions,\n })),\n },\n },\n 'GraphQL errors encountered'\n );\n }\n },\n\n async willSendResponse(requestContext) {\n // Add trace ID to response extensions for client correlation\n if (requestContext.response.body.kind === 'single') {\n const result = requestContext.response.body.singleResult;\n result.extensions = {\n ...result.extensions,\n tracing: {\n traceId: traceContext.traceId,\n spanId: traceContext.spanId,\n },\n };\n }\n },\n };\n },\n };\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","// Core exports\nexport {createGraphQLServer} from './server';\nexport type {ServerOptions, BaseServerOptions} from './server';\nexport {ServerBuilder} from './server/server.builder';\nexport type {ServerConfig, Runner} from './server/server.builder';\n\n// Context exports\nexport {\n createContextFunction,\n type BaseContext,\n type ContextUser,\n} from './context';\nexport type {ContextExtendFunction} from './context';\n\n// Environment exports\nexport {envLoader, type EnvConfig} from './env';\n\n// Logger exports\nexport {logger} from './logger';\nexport {createApolloLoggingPlugin} from './logger/apollo.logger';\n\n// Cache exports\nexport {\n createCache,\n KVCache,\n cached,\n CachedDataLoader,\n BatchingDataSource,\n createBatchingDataSource,\n ensureBatchOrder,\n ensureBatchOrderNullable,\n ApolloKVAdapter,\n createApolloCache,\n InMemoryCache,\n} from './cache';\nexport type {CacheOptions} from './cache';\n\n// Middleware exports\nexport {createRateLimitMiddleware} from './middleware/rate-limit';\nexport {createValidationMiddleware} from './middleware/validation';\nexport {createTracingMiddleware} from './middleware/tracing';\nexport {configureHealthChecks} from './middleware/health';\n\n// Tracing exports\nexport {\n WorkerTracer,\n WorkerSpan,\n createTracer,\n extractTraceContext,\n generateTraceId,\n generateSpanId,\n generateTraceHeader,\n type TraceContext,\n} from './tracing/tracer';\nexport {createTracingPlugin} from './plugins/tracing.plugin';\n\n// Utility exports\nexport {AppError, ErrorCode} from './utils/error.util';\nexport {createSchemaModule, gql} from './utils/schema.util';\nexport type {SchemaModule} from './utils/schema.util';\nexport {getNonUserInputErrors} from './utils/graphql.util';\nexport {\n sanitizePrismaError,\n withPrismaErrorHandling,\n} from './utils/prisma-error.util';\nexport {formatError} from './plugins/error-handler.plugin';\n\n// DataSource exports\nexport {ApolloDataSources} from './datasources/apollo-plugin.datasource';\nexport type {ComputedContext} from './datasources/apollo-plugin.datasource';\n\n// Datasource classes\nexport {\n type BaseDatasource,\n AbstractDatasource,\n RestDatasource,\n PrismaD1Datasource,\n} from './datasources';\nexport type {\n RestClientOptions,\n PrismaClientLike,\n PrismaD1,\n} from './datasources';\n","import type {BaseContext} from '@/context';\nimport type {KVCache} from '@/cache';\n\nexport interface BaseDatasource<TContext extends BaseContext = BaseContext> {\n readonly name: string;\n context?: TContext;\n\n init?(): Promise<void> | void;\n connect?(): Promise<void> | void;\n disconnect?(): Promise<void> | void;\n healthCheck?(): Promise<boolean> | boolean;\n clear?(): Promise<void> | void;\n}\n\n/**\n * Abstract base class for all datasources in the GraphQL bootstrap\n * Provides common functionality like caching, logging, and lifecycle management\n */\nexport abstract class AbstractDatasource<\n TContext extends BaseContext = BaseContext,\n> implements BaseDatasource<TContext> {\n abstract readonly name: string;\n context: TContext;\n protected cache: KVCache;\n protected logger: TContext['logger'];\n\n constructor(cache: KVCache, context: TContext) {\n this.cache = cache;\n this.context = context;\n this.logger = context.logger;\n\n // Call initialize after construction\n this.initialize();\n }\n\n /**\n * Initialize datasource-specific configuration\n * Override this method to add custom initialization logic\n */\n protected initialize(): void {\n // Default implementation - override in subclasses\n }\n\n async init(): Promise<void> {\n // Default implementation - override in subclasses\n this.logger?.info(`Initializing datasource: ${this.name}`);\n }\n\n async connect(): Promise<void> {\n // Default implementation - override in subclasses\n this.logger?.info(`Connecting datasource: ${this.name}`);\n }\n\n async disconnect(): Promise<void> {\n // Default implementation - override in subclasses\n this.logger?.info(`Disconnecting datasource: ${this.name}`);\n }\n\n async healthCheck(): Promise<boolean> {\n this.logger?.debug(`Health check for datasource: ${this.name}`);\n return true;\n }\n\n async clear(): Promise<void> {\n // Default implementation - override in subclasses\n this.logger?.info(`Clearing datasource: ${this.name}`);\n }\n\n /**\n * Helper method to get a cached result or fetch fresh data\n * Uses the enhanced KVCache memoize function\n */\n protected async cached<T>(\n key: string,\n fetchFn: () => Promise<T>,\n ttl?: number\n ): Promise<T> {\n return this.cache.memoize(key, {}, fetchFn, {ttl});\n }\n\n /**\n * Helper method to invalidate cache entries by pattern\n */\n protected async invalidateCache(pattern: string): Promise<number> {\n return this.cache.invalidate(pattern);\n }\n}\n","import type {BaseContext} from '@/context';\nimport type {KVCache} from '@/cache';\nimport {AbstractDatasource} from './base.datasource';\n\nexport interface RestClientOptions {\n baseURL: string;\n timeout?: number;\n headers?: Record<string, string>;\n retries?: number;\n}\n\n/**\n * REST datasource for making HTTP API calls with caching and error handling\n * Optimized for Cloudflare Workers environment\n */\nexport class RestDatasource<\n TContext extends BaseContext = BaseContext,\n> extends AbstractDatasource<TContext> {\n readonly name = 'rest';\n private baseURL: string;\n private timeout: number;\n private headers: Record<string, string>;\n private retries: number;\n\n constructor(cache: KVCache, context: TContext, options: RestClientOptions) {\n super(cache, context);\n this.baseURL = options.baseURL.replace(/\\/$/, ''); // Remove trailing slash\n this.timeout = options.timeout ?? 10000;\n this.headers = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'cfw-graphql-bootstrap/1.0',\n ...options.headers,\n };\n this.retries = options.retries ?? 3;\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n this.logger?.debug(`Health check for REST datasource: ${this.baseURL}`);\n const response = await this.get('/health');\n const isHealthy = response.status < 400;\n this.logger?.info(\n `REST datasource health check: ${isHealthy ? 'OK' : 'FAILED'}`\n );\n return isHealthy;\n } catch (error) {\n this.logger?.error('REST datasource health check failed:', error);\n return false;\n }\n }\n\n /**\n * GET request with caching\n */\n async get<T = any>(\n path: string,\n options?: {\n cache?: boolean;\n ttl?: number;\n params?: Record<string, string>;\n }\n ): Promise<T> {\n const url = this.buildURL(path, options?.params);\n const cacheKey = `rest:get:${url}`;\n\n if (options?.cache !== false) {\n return this.cached(\n cacheKey,\n () => this.fetchWithRetry(url, {method: 'GET'}),\n options?.ttl\n );\n }\n\n return this.fetchWithRetry(url, {method: 'GET'});\n }\n\n /**\n * POST request (no caching)\n */\n async post<T = any>(\n path: string,\n data?: any,\n options?: {\n invalidatePattern?: string;\n }\n ): Promise<T> {\n const url = this.buildURL(path);\n const result = await this.fetchWithRetry(url, {\n method: 'POST',\n body: data ? JSON.stringify(data) : undefined,\n });\n\n // Invalidate cache if pattern provided\n if (options?.invalidatePattern) {\n await this.invalidateCache(options.invalidatePattern);\n }\n\n return result;\n }\n\n /**\n * PUT request (no caching)\n */\n async put<T = any>(\n path: string,\n data?: any,\n options?: {\n invalidatePattern?: string;\n }\n ): Promise<T> {\n const url = this.buildURL(path);\n const result = await this.fetchWithRetry(url, {\n method: 'PUT',\n body: data ? JSON.stringify(data) : undefined,\n });\n\n // Invalidate cache if pattern provided\n if (options?.invalidatePattern) {\n await this.invalidateCache(options.invalidatePattern);\n }\n\n return result;\n }\n\n /**\n * DELETE request (no caching)\n */\n async delete<T = any>(\n path: string,\n options?: {\n invalidatePattern?: string;\n }\n ): Promise<T> {\n const url = this.buildURL(path);\n const result = await this.fetchWithRetry(url, {method: 'DELETE'});\n\n // Invalidate cache if pattern provided\n if (options?.invalidatePattern) {\n await this.invalidateCache(options.invalidatePattern);\n }\n\n return result;\n }\n\n private buildURL(path: string, params?: Record<string, string>): string {\n const url = `${this.baseURL}${path.startsWith('/') ? path : `/${path}`}`;\n\n if (params) {\n const searchParams = new URLSearchParams(params);\n return `${url}?${searchParams.toString()}`;\n }\n\n return url;\n }\n\n private async fetchWithRetry<T = any>(\n url: string,\n options: RequestInit,\n attempt = 1\n ): Promise<T> {\n try {\n this.logger?.debug(\n `[${attempt}/${this.retries}] ${options.method || 'GET'} ${url}`\n );\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n this.logger?.debug(\n `✓ ${options.method || 'GET'} ${url} - ${response.status}`\n );\n return await response.json();\n } catch (error) {\n this.logger?.warn(\n `✗ ${options.method || 'GET'} ${url} - Attempt ${attempt} failed:`,\n error\n );\n\n if (attempt < this.retries && this.shouldRetry(error)) {\n const delay = Math.pow(2, attempt) * 1000;\n this.logger?.info(`Retrying in ${delay}ms...`);\n await this.delay(delay); // Exponential backoff\n return this.fetchWithRetry(url, options, attempt + 1);\n }\n\n this.logger?.error(`Failed after ${attempt} attempts:`, error);\n throw error;\n }\n }\n\n private shouldRetry(error: any): boolean {\n // Retry on network errors and 5xx status codes\n return (\n error.name === 'AbortError' ||\n error.message?.includes('fetch') ||\n (error.message?.includes('HTTP 5') ?? false)\n );\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import type {KVCache} from '@/cache';\nimport type {BaseContext} from '@/context';\nimport {AbstractDatasource} from './base.datasource';\n\n// Minimal Prisma Client interface for type safety\nexport interface PrismaClientLike {\n $connect(): Promise<void>;\n $disconnect(): Promise<void>;\n $queryRaw: any;\n $queryRawUnsafe(sql: string, ...values: any[]): Promise<any>;\n $executeRawUnsafe(sql: string, ...values: any[]): Promise<number>;\n // Event-based logging support - using 'any' to allow different Prisma versions\n $on?: any;\n // Additional properties that actual PrismaClient has\n [key: string]: any;\n}\n\n// PrismaD1 adapter type (imported dynamically)\nexport interface PrismaD1 {\n // We don't need to define the full interface since it's used opaquely\n // The actual implementation comes from '@prisma/adapter-d1'\n}\n\n// Global Prisma client cache for reuse\ndeclare global {\n var __prismaD1Clients: Map<string, any> | undefined;\n}\n\n/**\n * Abstract Prisma datasource optimized for Cloudflare D1\n * Automatically creates PrismaD1 adapter and requires user to implement createClient()\n *\n * @example\n * ```typescript\n * import { PrismaClient } from '@prisma/client';\n * import { PrismaD1 } from '@prisma/adapter-d1';\n *\n * class UserDatasource extends PrismaD1Datasource<BaseContext, PrismaClient> {\n * createClient(adapter: PrismaD1): PrismaClient {\n * // Use the helper method for optimized Cloudflare Workers logging\n * return this.createClientWithLogging(adapter, PrismaClient);\n * }\n *\n * async getUser(id: string) {\n * // Just use Prisma normally - errors are sanitized by Apollo plugin\n * return this.client.user.findUnique({ where: { id } });\n * }\n *\n * async createUser(data: CreateUserInput) {\n * // Prisma errors like \"Unique constraint\" are automatically sanitized\n * return this.client.user.create({ data });\n * }\n *\n * async updateUser(id: string, data: UpdateUserInput) {\n * // Clean, simple code - error handling is in the GraphQL layer\n * return this.client.user.update({\n * where: { id },\n * data\n * });\n * }\n * }\n *\n * // Multiple instances share the same client efficiently:\n * datasources: (cache: KVCache, context: TContext) => ({\n * user: new UserDatasource(cache, context), // Client cached by class name\n * admin: new UserDatasource(cache, context), // Reuses same client!\n * })\n * ```\n */\nexport abstract class PrismaD1Datasource<\n TContext extends BaseContext = BaseContext,\n TPrismaClient extends PrismaClientLike = PrismaClientLike,\n> extends AbstractDatasource<TContext> {\n readonly name = 'prisma-d1';\n private _client: TPrismaClient | null = null;\n\n constructor(cache: KVCache, context: TContext) {\n super(cache, context);\n }\n\n /**\n * Abstract method to create Prisma client with D1 adapter\n * Called only once per datasource class, then cached globally\n *\n * Best practice for Cloudflare Workers:\n * - Use minimal log configuration to avoid bundle size issues\n * - Leverage event-based logging for performance monitoring\n * - Avoid Node.js-specific logging libraries\n */\n abstract createClient(adapter: PrismaD1): TPrismaClient;\n\n /**\n * Helper method to create client with recommended logging configuration\n * for Cloudflare Workers environment\n */\n protected createClientWithLogging(\n adapter: PrismaD1,\n clientConstructor: any\n ): TPrismaClient {\n const isDev = this.context.env?.NODE_ENV !== 'production';\n\n // Minimal logging config optimized for Workers\n const logConfig = isDev\n ? [\n {level: 'warn', emit: 'event'},\n {level: 'error', emit: 'event'},\n ]\n : [{level: 'error', emit: 'event'}];\n\n const client = new clientConstructor({\n adapter,\n log: logConfig,\n errorFormat: 'minimal', // Reduces bundle size\n });\n\n // Set up event-based logging that integrates with our logger\n if (client.$on && typeof client.$on === 'function') {\n try {\n // Handle typed PrismaClient $on method\n client.$on('error' as any, (e: any) => {\n this.logger.error('Prisma error:', {\n target: e.target,\n message: e.message,\n timestamp: e.timestamp,\n });\n });\n\n if (isDev) {\n client.$on('warn' as any, (e: any) => {\n this.logger.warn('Prisma warning:', {\n target: e.target,\n message: e.message,\n timestamp: e.timestamp,\n });\n });\n }\n } catch (err) {\n // Fallback if $on method doesn't work as expected\n this.logger.debug('Could not set up Prisma event logging:', err);\n }\n }\n\n return client;\n }\n\n get client(): TPrismaClient {\n if (!this._client) {\n throw new Error('Prisma client not initialized. Call connect() first.');\n }\n return this._client;\n }\n\n async connect(): Promise<void> {\n try {\n this.logger.info('Connecting Prisma D1 datasource...');\n\n // Get D1 database binding from context\n if (!this.context.db) {\n const error =\n 'D1 database binding not found. Add to wrangler.toml:\\n' +\n '[[d1_databases]]\\n' +\n 'binding = \"DB\"\\n' +\n 'database_name = \"your-database-name\"\\n' +\n 'database_id = \"your-database-id\"';\n this.logger.error(error);\n throw new Error(error);\n }\n\n // Create cache key based on datasource constructor name\n const clientKey = this.constructor.name;\n\n // Initialize global client cache if needed\n if (!global.__prismaD1Clients) {\n global.__prismaD1Clients = new Map();\n }\n\n // Check if we have a cached client for this datasource class\n if (global.__prismaD1Clients.has(clientKey)) {\n this._client = global.__prismaD1Clients.get(clientKey);\n this.logger.debug(`Using cached Prisma client for ${clientKey}`);\n } else {\n this.logger.debug('Creating new PrismaD1 adapter and client...');\n\n // Create PrismaD1 adapter\n const d1Module = await import('@prisma/adapter-d1');\n const PrismaD1 = (d1Module as any).PrismaD1 ?? d1Module.default;\n const adapter = new PrismaD1(this.context.db);\n\n // Create client only once per datasource class with optimized logging\n this._client = this.createClient(adapter);\n\n // Cache the client globally\n global.__prismaD1Clients.set(clientKey, this._client);\n this.logger.debug(`Cached new Prisma client for ${clientKey}`);\n }\n\n await this._client.$connect();\n this.logger.info('✓ Prisma D1 datasource connected');\n } catch (error) {\n this.logger.error('Failed to connect Prisma D1 datasource:', error);\n throw new Error(\n `Prisma D1 connection failed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n // Helper method for proper resource cleanup in Workers context\n async disconnectWithContext(ctx?: {\n waitUntil: (promise: Promise<any>) => void;\n }): Promise<void> {\n if (!this._client) return;\n\n const disconnectPromise = this._client.$disconnect();\n\n // Use ctx.waitUntil() if available to ensure cleanup completes\n if (ctx?.waitUntil) {\n ctx.waitUntil(disconnectPromise);\n } else {\n await disconnectPromise;\n }\n }\n\n async disconnect(): Promise<void> {\n if (this._client) {\n await this._client.$disconnect();\n }\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n this.logger.debug('Prisma D1 datasource health check...');\n if (this._client) {\n await this._client.$queryRaw`SELECT 1`;\n }\n this.logger.info('Prisma D1 datasource health check: OK');\n return true;\n } catch (error) {\n this.logger.error('Prisma D1 datasource health check failed:', error);\n return false;\n }\n }\n\n /**\n * Execute a cached query using raw SQL with performance logging\n */\n async queryRaw<T = any>(\n sql: string,\n values?: any[],\n options?: {\n cache?: boolean;\n ttl?: number;\n }\n ): Promise<T> {\n const cacheKey = `prisma-d1:raw:${sql}:${JSON.stringify(values || [])}`;\n const startTime = Date.now();\n\n try {\n let result: T;\n\n if (options?.cache !== false) {\n result = await this.cached(\n cacheKey,\n () => this._client!.$queryRawUnsafe(sql, ...(values || [])),\n options?.ttl\n );\n } else {\n result = await this._client!.$queryRawUnsafe(sql, ...(values || []));\n }\n\n const duration = Date.now() - startTime;\n\n // Log slow queries (>1000ms) for performance monitoring\n if (duration > 1000) {\n this.logger.warn('Slow Prisma query detected:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n cached: options?.cache !== false,\n });\n } else if (this.context.env?.NODE_ENV !== 'production') {\n this.logger.debug('Prisma query executed:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n cached: options?.cache !== false,\n });\n }\n\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.logger.error('Prisma query failed:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n\n /**\n * Execute a mutation and invalidate cache with performance logging\n */\n async executeRaw(\n sql: string,\n values?: any[],\n options?: {\n invalidatePattern?: string;\n }\n ): Promise<number> {\n if (!this._client) {\n throw new Error('Prisma client not initialized. Call connect() first.');\n }\n\n const startTime = Date.now();\n\n try {\n const result = await this._client.$executeRawUnsafe(\n sql,\n ...(values || [])\n );\n const duration = Date.now() - startTime;\n\n // Log mutation performance\n if (duration > 1000) {\n this.logger.warn('Slow Prisma mutation detected:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n affectedRows: result,\n });\n } else if (this.context.env?.NODE_ENV !== 'production') {\n this.logger.debug('Prisma mutation executed:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n affectedRows: result,\n });\n }\n\n // Invalidate cache if pattern provided\n if (options?.invalidatePattern) {\n await this.invalidateCache(options.invalidatePattern);\n this.logger.debug(\n `Cache invalidated with pattern: ${options.invalidatePattern}`\n );\n }\n\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n this.logger.error('Prisma mutation failed:', {\n sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),\n duration: `${duration}ms`,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n}\n"],"mappings":"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","names":["logger","GraphQLError","cached","cached","requestContext","formatError","GraphQLError","ApolloServerErrorCode","ErrorCode","isDev"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cfw-graphql-bootstrap",
3
- "version": "1.0.12",
3
+ "version": "1.0.13",
4
4
  "description": "Enterprise-grade GraphQL server for Cloudflare Workers",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",