@burdenoff/be-sdk 2026.602.2 → 2026.618.1

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.
Files changed (93) hide show
  1. package/dist/auth/index.d.ts +2 -2
  2. package/dist/auth/index.js +3 -3
  3. package/dist/cache/index.d.ts +2 -2
  4. package/dist/cache/index.js +2 -2
  5. package/dist/{chunk-RDGQEBNS.js → chunk-5FEOFBQ4.js} +4 -4
  6. package/dist/{chunk-RDGQEBNS.js.map → chunk-5FEOFBQ4.js.map} +1 -1
  7. package/dist/chunk-DXX6C6X6.js +210 -0
  8. package/dist/chunk-DXX6C6X6.js.map +1 -0
  9. package/dist/{chunk-KKCC3Z4I.js → chunk-FKSMQLIV.js} +3 -3
  10. package/dist/{chunk-KKCC3Z4I.js.map → chunk-FKSMQLIV.js.map} +1 -1
  11. package/dist/{chunk-BNJFEOGH.js → chunk-FTDQ6NY5.js} +4 -4
  12. package/dist/{chunk-BNJFEOGH.js.map → chunk-FTDQ6NY5.js.map} +1 -1
  13. package/dist/{chunk-VWCN5PMD.js → chunk-HRCWJLCZ.js} +8 -3
  14. package/dist/chunk-HRCWJLCZ.js.map +1 -0
  15. package/dist/{chunk-5SD7DU3L.js → chunk-IC7YDBGE.js} +3 -3
  16. package/dist/{chunk-5SD7DU3L.js.map → chunk-IC7YDBGE.js.map} +1 -1
  17. package/dist/{chunk-4NFZOFRS.js → chunk-L2P4CJUR.js} +2 -2
  18. package/dist/{chunk-4NFZOFRS.js.map → chunk-L2P4CJUR.js.map} +1 -1
  19. package/dist/{chunk-OJWJVZY5.js → chunk-N7UJFZQH.js} +24 -25
  20. package/dist/chunk-N7UJFZQH.js.map +1 -0
  21. package/dist/{chunk-VWNL2O3G.js → chunk-OQLDXOZ3.js} +5 -4
  22. package/dist/chunk-OQLDXOZ3.js.map +1 -0
  23. package/dist/{chunk-O6RHB2YP.js → chunk-SMGTXYFR.js} +2 -2
  24. package/dist/chunk-SMGTXYFR.js.map +1 -0
  25. package/dist/{chunk-GSEPF2B6.js → chunk-UIMPJNWC.js} +3 -3
  26. package/dist/{chunk-GSEPF2B6.js.map → chunk-UIMPJNWC.js.map} +1 -1
  27. package/dist/{chunk-7NYCLQFJ.js → chunk-UYE4IEPT.js} +3 -3
  28. package/dist/{chunk-7NYCLQFJ.js.map → chunk-UYE4IEPT.js.map} +1 -1
  29. package/dist/{chunk-5HL47UH2.js → chunk-X7QMT2P6.js} +3 -3
  30. package/dist/{chunk-5HL47UH2.js.map → chunk-X7QMT2P6.js.map} +1 -1
  31. package/dist/{chunk-UFQQSQG6.js → chunk-XNQUN3AE.js} +3 -3
  32. package/dist/{chunk-UFQQSQG6.js.map → chunk-XNQUN3AE.js.map} +1 -1
  33. package/dist/{chunk-TIINMQSD.js → chunk-XR3KUHJ5.js} +3 -3
  34. package/dist/{chunk-TIINMQSD.js.map → chunk-XR3KUHJ5.js.map} +1 -1
  35. package/dist/{chunk-HP6JTFNR.js → chunk-YFOHAHZE.js} +2 -2
  36. package/dist/{chunk-HP6JTFNR.js.map → chunk-YFOHAHZE.js.map} +1 -1
  37. package/dist/{chunk-RMDKB5O7.js → chunk-ZHQUXD6S.js} +3 -3
  38. package/dist/{chunk-RMDKB5O7.js.map → chunk-ZHQUXD6S.js.map} +1 -1
  39. package/dist/{chunk-PPIDJP2W.js → chunk-ZPEDC5V3.js} +5 -5
  40. package/dist/{chunk-PPIDJP2W.js.map → chunk-ZPEDC5V3.js.map} +1 -1
  41. package/dist/database/index.js +3 -3
  42. package/dist/event-queue/index.d.ts +4 -4
  43. package/dist/export/index.d.ts +2 -2
  44. package/dist/export/index.js +6 -5
  45. package/dist/feature-flags/index.js +2 -1
  46. package/dist/gateway/index.d.ts +2 -2
  47. package/dist/gateway/index.js +5 -4
  48. package/dist/gateway/security/index.js +1 -1
  49. package/dist/graph/index.d.ts +3 -3
  50. package/dist/graph/index.js +3 -3
  51. package/dist/{graphql-DH3L5Hj7.d.ts → graphql-CNhiZ89U.d.ts} +1 -1
  52. package/dist/{index-DLyc5o_K.d.ts → index-B-w7NWpD.d.ts} +1 -1
  53. package/dist/{index-BqSh1K8I.d.ts → index-B0ebYV9W.d.ts} +1 -1
  54. package/dist/{index-Dg4kH1VJ.d.ts → index-B4ciT3OZ.d.ts} +1 -1
  55. package/dist/{index-BVjR9llq.d.ts → index-BCUkR8sC.d.ts} +1 -1
  56. package/dist/{index-KA3gg4es.d.ts → index-BKjt3X8L.d.ts} +1 -1
  57. package/dist/{index-fhOvuvlv.d.ts → index-CVFEyBvK.d.ts} +1 -1
  58. package/dist/{index-C7T0Xx19.d.ts → index-D7BJuXP3.d.ts} +3 -3
  59. package/dist/{index-Caqvetqq.d.ts → index-D9RN6jp1.d.ts} +2 -0
  60. package/dist/{index-Cz9_vPi7.d.ts → index-DYQF_AIz.d.ts} +2 -2
  61. package/dist/{index-DBF8VqIf.d.ts → index-DkObbJD_.d.ts} +1 -1
  62. package/dist/{index-BZPEyVOl.d.ts → index-DohlGQGw.d.ts} +3 -3
  63. package/dist/{index-DohaJRZP.d.ts → index-DraeealK.d.ts} +2 -2
  64. package/dist/index.d.ts +23 -19
  65. package/dist/index.js +35 -161
  66. package/dist/index.js.map +1 -1
  67. package/dist/init/index.d.ts +2 -2
  68. package/dist/init/index.js +6 -5
  69. package/dist/instrumentation/index.d.ts +3 -3
  70. package/dist/layer/index.d.ts +2 -2
  71. package/dist/layer/index.js +2 -2
  72. package/dist/{layer-CUu_cZ7d.d.ts → layer-GNAVXBMf.d.ts} +2 -0
  73. package/dist/logger/index.d.ts +2 -2
  74. package/dist/notifications/index.d.ts +3 -3
  75. package/dist/notifications/index.js +3 -3
  76. package/dist/rbac/index.d.ts +3 -3
  77. package/dist/rbac/index.js +3 -3
  78. package/dist/resource-caps/index.d.ts +2 -2
  79. package/dist/server/index.js +5 -3
  80. package/dist/server/index.js.map +1 -1
  81. package/dist/telemetry/index.d.ts +4 -4
  82. package/dist/temporal/index.d.ts +1 -1
  83. package/dist/temporal/index.js +2 -2
  84. package/dist/tracker/index.d.ts +4 -4
  85. package/dist/tracker/index.js +5 -5
  86. package/dist/workspace-guard-4BUG4ZP2.js +5 -0
  87. package/dist/{workspace-guard-3JLBFAMH.js.map → workspace-guard-4BUG4ZP2.js.map} +1 -1
  88. package/package.json +3 -7
  89. package/dist/chunk-O6RHB2YP.js.map +0 -1
  90. package/dist/chunk-OJWJVZY5.js.map +0 -1
  91. package/dist/chunk-VWCN5PMD.js.map +0 -1
  92. package/dist/chunk-VWNL2O3G.js.map +0 -1
  93. package/dist/workspace-guard-3JLBFAMH.js +0 -5
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gateway/index.ts","../src/gateway/service-jwt.ts","../src/gateway/types.ts","../src/gateway/client.ts"],"names":["SIGNING_ENV_VAR","KEY_ID","DEFAULT_TTL_SECONDS","REFRESH_BEFORE_EXP_MS","joseModule","getJose","cache","Map","cacheKey","actorId","ttlSeconds","signServiceJwt","secret","process","env","key","cached","get","expiresAtMs","Date","now","token","joseLib","encoder","TextEncoder","keyBytes","encode","nowSec","Math","floor","expSec","SignJWT","actor_type","setProtectedHeader","alg","typ","kid","setSubject","setIssuer","setIssuedAt","setExpirationTime","sign","set","CircuitState","GatewayErrorType","GatewayError","Error","type","gatewayUrl","statusCode","graphqlErrors","cause","message","options","name","Object","setPrototypeOf","prototype","uuidv4","crypto","randomUUID","hasAuthorizationHeader","headers","keys","toLowerCase","resolveBypassPermissionValue","normalizedToken","trim","CircuitBreaker","state","CLOSED","failures","successes","consecutiveFailures","lastFailureTime","lastSuccessTime","openedAt","failureTimestamps","config","getState","checkStateTransition","recordSuccess","HALF_OPEN","logger","info","recordFailure","push","windowStart","failureWindow","filter","t","length","failureThreshold","OPEN","warn","threshold","allowRequest","forceOpen","forceClose","getStats","elapsed","resetTimeout","GatewayClient","layerManager","internalCircuitBreaker","crossLayerCircuitBreaker","retryConfig","defaultHeaders","timeout","enableLogging","LayerManager","layer","serviceName","serviceIdentity","internalGatewayUrl","crossLayerGatewayUrl","cbConfig","DEFAULT_CIRCUIT_BREAKER_CONFIG","circuitBreaker","DEFAULT_GATEWAY_RETRY_CONFIG","retry","getServiceIdentity","debug","internalUrl","getInternalUrl","crossLayerUrl","getCrossLayerUrl","getInternalGatewayUrl","getCrossLayerGatewayUrl","internalQuery","context","createRequestContext","executeWithRetry","bypassPermission","crossLayerQuery","query","getInternalCircuitBreaker","getCrossLayerCircuitBreaker","getHealthStatus","internal","url","circuitState","stats","crossLayer","updateDefaultHeaders","callType","requestId","workspaceId","startTime","shouldRetryError","error","GRAPHQL_ERROR","CIRCUIT_OPEN","calculateRetryDelay","attempt","min","initialDelay","pow","backoffMultiplier","maxDelay","logRetryAttempt","maxAttempts","delay","settings","skipCircuitBreaker","skipRetry","lastError","result","executeRequest","String","sleep","UNKNOWN_ERROR","buildRequestHeaders","value","entries","undefined","toString","handleGraphQLErrors","duration","errors","errorMessages","map","e","join","handleFetchError","TIMEOUT_ERROR","NETWORK_ERROR","serviceActorId","serviceJwt","body","JSON","stringify","variables","operationName","controller","AbortController","timeoutId","setTimeout","abort","response","fetch","method","signal","clearTimeout","ok","status","statusText","json","hasData","data","ms","Promise","resolve","createGatewayClient","createGatewayClientFromEnv"],"mappings":"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","file":"chunk-OJWJVZY5.js","sourcesContent":["/**\n * Gateway Module\n *\n * Provides unified gateway client for layer-aware M2M communication\n * with circuit breaker and retry logic.\n *\n * @module gateway\n * @category Gateway\n *\n * @example\n * ```typescript\n * import { GatewayClient, createGatewayClientFromEnv } from '@burdenoff/be-sdk/gateway';\n *\n * // Create from environment variables\n * const client = createGatewayClientFromEnv();\n *\n * // Or create manually\n * const client = new GatewayClient({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * });\n *\n * // Internal call (same layer, uses int-gateway with bypass)\n * const internalResult = await client.internalQuery({\n * query: `query { getTag(id: \"123\") { id name } }`,\n * });\n *\n * // Cross-layer call (via public gateway)\n * const crossLayerResult = await client.crossLayerQuery({\n * query: `query { getCurrentUser { id email } }`,\n * });\n * ```\n */\n\n// Client exports\nexport { GatewayClient, createGatewayClient, createGatewayClientFromEnv } from './client.js';\n\n// Type exports\nexport {\n CircuitState,\n GatewayErrorType,\n GatewayError,\n type GatewayClientConfig,\n type GraphQLRequestOptions,\n type GraphQLResponse,\n type GraphQLError,\n type IGatewayClient,\n type ICircuitBreaker,\n type CircuitBreakerStats,\n type GatewayClientHealth,\n type RequestContext,\n} from './types.js';\n\n// Gateway-side security plugin stack (for public gateways).\n// Imported by consumers as `@burdenoff/be-sdk/gateway/security` — this\n// re-export lets `@burdenoff/be-sdk/gateway` also resolve the namespace.\nexport * as Security from './security/index.js';\n","/**\n * Service JWT minting + caching for M2M cross-layer calls.\n *\n * The public gateways (global-public-gateway, wspace-public-gateway) validate\n * every incoming request's Authorization header and only propagate `x-actor-*`\n * context headers to subgraphs when the JWT is valid. Without a JWT, raw\n * actor headers are stripped as potential client spoofing. For service-to-\n * service cross-layer calls there is no user JWT to forward — we mint a short-\n * lived service JWT with `actor_type: 'service'` so the gateway admits the\n * call and the subgraph sees a trusted service context.\n *\n * Signing key: SERVICE_JWT_SECRET — a dedicated, separate secret from\n * GLOBAL_AUTH_SECRET (which signs user tokens). Keeping them distinct means a\n * service minter that leaks its env cannot forge user logins. The gateways\n * hold both secrets and pick between them by the JWT's `kid` header\n * (this minter stamps `kid: service-v1`).\n */\nimport type * as jose from 'jose';\n\n/**\n * Dedicated secret for service-minted JWTs.\n *\n * Deliberately separate from `GLOBAL_AUTH_SECRET` (which signs user tokens)\n * so that services that mint service JWTs do not also hold the ability to\n * forge user logins. Blast radius of a leaked secret stays scoped to 60s\n * service tokens with no PII.\n *\n * Gateways hold both secrets and select by the JWT's `kid` header.\n */\nconst SIGNING_ENV_VAR = 'SERVICE_JWT_SECRET';\nconst KEY_ID = 'service-v1';\nconst DEFAULT_TTL_SECONDS = 60;\nconst REFRESH_BEFORE_EXP_MS = 10_000;\n\nlet joseModule: typeof jose | null = null;\n\nasync function getJose(): Promise<typeof jose> {\n if (!joseModule) {\n joseModule = await import('jose');\n }\n return joseModule;\n}\n\ninterface CachedToken {\n token: string;\n expiresAtMs: number;\n}\n\nconst cache = new Map<string, CachedToken>();\n\nfunction cacheKey(actorId: string, ttlSeconds: number): string {\n return `${actorId}:${ttlSeconds}`;\n}\n\n/**\n * Sign a service-actor JWT.\n * Returns null when no signing secret is configured (opt-in).\n */\nexport async function signServiceJwt(\n actorId: string,\n ttlSeconds: number = DEFAULT_TTL_SECONDS\n): Promise<string | null> {\n const secret = process.env[SIGNING_ENV_VAR];\n if (!secret) {\n return null;\n }\n\n const key = cacheKey(actorId, ttlSeconds);\n const cached = cache.get(key);\n if (cached && cached.expiresAtMs - REFRESH_BEFORE_EXP_MS > Date.now()) {\n return cached.token;\n }\n\n const joseLib = await getJose();\n const encoder = new TextEncoder();\n const keyBytes = encoder.encode(secret);\n\n const nowSec = Math.floor(Date.now() / 1000);\n const expSec = nowSec + ttlSeconds;\n\n const token = await new joseLib.SignJWT({\n actor_type: 'service',\n })\n .setProtectedHeader({ alg: 'HS256', typ: 'JWT', kid: KEY_ID })\n .setSubject(actorId)\n // `iss` = the service identity that minted the token. Matches `sub`\n // because these are self-minted tokens (caller is asserting itself).\n // Gives the gateway room to enforce a minter allowlist later without\n // a token-format change.\n .setIssuer(actorId)\n .setIssuedAt(nowSec)\n .setExpirationTime(expSec)\n .sign(keyBytes);\n\n cache.set(key, { token, expiresAtMs: expSec * 1000 });\n return token;\n}\n\n/** Test hook to clear the cache between tests. */\nexport function __clearServiceJwtCache(): void {\n cache.clear();\n}\n","/**\n * Gateway Client Types\n *\n * Type definitions for the unified gateway client with\n * circuit breaker and retry logic.\n *\n * @module gateway/types\n * @category Gateway\n */\n\nimport type { ServiceLayer, CircuitBreakerConfig, GatewayRetryConfig, GatewayRequestHeaders } from '../types/layer.js';\n\n/**\n * Gateway client configuration\n */\nexport interface GatewayClientConfig {\n /**\n * Layer this client belongs to\n */\n layer: ServiceLayer;\n\n /**\n * Service name (for logging and headers)\n */\n serviceName: string;\n\n /**\n * Service identity for bypass headers\n * @default serviceName\n */\n serviceIdentity?: string;\n\n /**\n * Internal gateway URL (same layer M2M)\n * @default Resolved from layer defaults or environment\n */\n internalGatewayUrl?: string;\n\n /**\n * Cross-layer gateway URL (cross layer via public gateway)\n * @default Resolved from layer defaults or environment\n */\n crossLayerGatewayUrl?: string;\n\n /**\n * Request timeout in milliseconds\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Circuit breaker configuration\n */\n circuitBreaker?: Partial<CircuitBreakerConfig>;\n\n /**\n * Retry configuration\n */\n retry?: Partial<GatewayRetryConfig>;\n\n /**\n * Enable request logging\n * @default true\n */\n enableLogging?: boolean;\n\n /**\n * Default headers to include in all requests\n */\n defaultHeaders?: GatewayRequestHeaders;\n}\n\n/**\n * Circuit breaker states\n */\nexport enum CircuitState {\n CLOSED = 'CLOSED',\n OPEN = 'OPEN',\n HALF_OPEN = 'HALF_OPEN',\n}\n\n/**\n * Circuit breaker instance interface\n */\nexport interface ICircuitBreaker {\n /**\n * Get current circuit state\n */\n getState(): CircuitState;\n\n /**\n * Record a successful call\n */\n recordSuccess(): void;\n\n /**\n * Record a failed call\n */\n recordFailure(): void;\n\n /**\n * Check if circuit allows calls\n */\n allowRequest(): boolean;\n\n /**\n * Force open the circuit\n */\n forceOpen(): void;\n\n /**\n * Force close the circuit\n */\n forceClose(): void;\n\n /**\n * Get circuit statistics\n */\n getStats(): CircuitBreakerStats;\n}\n\n/**\n * Circuit breaker statistics\n */\nexport interface CircuitBreakerStats {\n state: CircuitState;\n failures: number;\n successes: number;\n consecutiveFailures: number;\n lastFailureTime: number | null;\n lastSuccessTime: number | null;\n openedAt: number | null;\n}\n\n/**\n * GraphQL request options\n */\nexport interface GraphQLRequestOptions {\n /**\n * GraphQL query or mutation string\n */\n query: string;\n\n /**\n * GraphQL variables\n */\n variables?: Record<string, unknown>;\n\n /**\n * Operation name (for multi-operation documents)\n */\n operationName?: string;\n\n /**\n * Additional headers for this request\n */\n headers?: GatewayRequestHeaders;\n\n /**\n * Override timeout for this request\n */\n timeout?: number;\n\n /**\n * Skip circuit breaker for this request\n * @default false\n */\n skipCircuitBreaker?: boolean;\n\n /**\n * Skip retry logic for this request\n * @default false\n */\n skipRetry?: boolean;\n}\n\n/**\n * GraphQL response\n */\nexport interface GraphQLResponse<T = unknown> {\n /**\n * Response data\n */\n data?: T;\n\n /**\n * GraphQL errors\n */\n errors?: GraphQLError[];\n}\n\n/**\n * GraphQL error structure\n */\nexport interface GraphQLError {\n message: string;\n locations?: Array<{ line: number; column: number }>;\n path?: Array<string | number>;\n extensions?: Record<string, unknown>;\n}\n\n/**\n * Gateway client interface\n */\nexport interface IGatewayClient {\n /**\n * Execute internal (same layer) GraphQL query/mutation\n *\n * Uses internal gateway with bypass headers for M2M communication.\n *\n * @param options - Request options\n * @returns GraphQL response\n */\n internalQuery<T = unknown>(options: GraphQLRequestOptions): Promise<GraphQLResponse<T>>;\n\n /**\n * Execute cross-layer GraphQL query/mutation\n *\n * Uses public gateway for cross-layer communication.\n *\n * @param options - Request options\n * @returns GraphQL response\n */\n crossLayerQuery<T = unknown>(options: GraphQLRequestOptions): Promise<GraphQLResponse<T>>;\n\n /**\n * Execute GraphQL query/mutation with explicit gateway URL\n *\n * @param gatewayUrl - Gateway URL to use\n * @param options - Request options\n * @returns GraphQL response\n */\n query<T = unknown>(gatewayUrl: string, options: GraphQLRequestOptions): Promise<GraphQLResponse<T>>;\n\n /**\n * Get internal gateway circuit breaker\n */\n getInternalCircuitBreaker(): ICircuitBreaker;\n\n /**\n * Get cross-layer gateway circuit breaker\n */\n getCrossLayerCircuitBreaker(): ICircuitBreaker;\n\n /**\n * Get client health status\n */\n getHealthStatus(): GatewayClientHealth;\n\n /**\n * Update default headers\n */\n updateDefaultHeaders(headers: Partial<GatewayRequestHeaders>): void;\n}\n\n/**\n * Gateway client health status\n */\nexport interface GatewayClientHealth {\n /**\n * Internal gateway status\n */\n internal: {\n url: string;\n circuitState: CircuitState;\n stats: CircuitBreakerStats;\n };\n\n /**\n * Cross-layer gateway status\n */\n crossLayer: {\n url: string;\n circuitState: CircuitState;\n stats: CircuitBreakerStats;\n };\n}\n\n/**\n * Gateway error types\n */\nexport enum GatewayErrorType {\n NETWORK_ERROR = 'NETWORK_ERROR',\n TIMEOUT_ERROR = 'TIMEOUT_ERROR',\n CIRCUIT_OPEN = 'CIRCUIT_OPEN',\n GRAPHQL_ERROR = 'GRAPHQL_ERROR',\n UNKNOWN_ERROR = 'UNKNOWN_ERROR',\n}\n\n/**\n * Gateway error class\n */\nexport class GatewayError extends Error {\n type: GatewayErrorType;\n gatewayUrl: string;\n statusCode?: number;\n graphqlErrors?: GraphQLError[];\n override cause?: Error;\n\n constructor(\n message: string,\n type: GatewayErrorType,\n gatewayUrl: string,\n options?: {\n statusCode?: number;\n graphqlErrors?: GraphQLError[];\n cause?: Error;\n }\n ) {\n super(message);\n this.name = 'GatewayError';\n this.type = type;\n this.gatewayUrl = gatewayUrl;\n this.statusCode = options?.statusCode;\n this.graphqlErrors = options?.graphqlErrors;\n this.cause = options?.cause;\n Object.setPrototypeOf(this, GatewayError.prototype);\n }\n}\n\n/**\n * Request context for logging and tracing\n */\nexport interface RequestContext {\n /**\n * Request ID for tracing\n */\n requestId: string;\n\n /**\n * Actor ID making the request\n */\n actorId?: string;\n\n /**\n * Workspace ID context\n */\n workspaceId?: string;\n\n /**\n * Timestamp when request started\n */\n startTime: number;\n\n /**\n * Call type\n */\n callType: 'internal' | 'cross-layer' | 'direct';\n}\n","/**\n * Unified Gateway Client\n *\n * Provides a layer-aware GraphQL client with circuit breaker,\n * retry logic, and automatic header management for M2M communication.\n *\n * @module gateway/client\n * @category Gateway\n *\n * @example\n * ```typescript\n * import { GatewayClient } from '@burdenoff/be-sdk/gateway';\n *\n * const client = new GatewayClient({\n * layer: 'wspace',\n * serviceName: 'wspace-tags-svc',\n * });\n *\n * // Internal call (same layer)\n * const result = await client.internalQuery({\n * query: `query { getTag(id: \"123\") { id name } }`,\n * });\n *\n * // Cross-layer call\n * const authResult = await client.crossLayerQuery({\n * query: `query { getCurrentUser { id email } }`,\n * });\n * ```\n */\n\nimport { LayerManager } from '../layer/index.js';\nimport { logger } from '../logger/index.js';\nimport { signServiceJwt } from './service-jwt.js';\nimport {\n DEFAULT_CIRCUIT_BREAKER_CONFIG,\n DEFAULT_GATEWAY_RETRY_CONFIG,\n type CircuitBreakerConfig,\n type GatewayRequestHeaders,\n type GatewayRetryConfig,\n type ServiceLayer,\n} from '../types/layer.js';\nimport {\n CircuitState,\n GatewayError,\n GatewayErrorType,\n type CircuitBreakerStats,\n type GatewayClientConfig,\n type GatewayClientHealth,\n type GraphQLError,\n type GraphQLRequestOptions,\n type GraphQLResponse,\n type ICircuitBreaker,\n type IGatewayClient,\n type RequestContext,\n} from './types.js';\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Case-insensitive presence check for the `Authorization` header. HTTP header\n * names are case-insensitive (RFC 7230), and while the outbound `fetch` will\n * preserve whatever casing the caller supplies, callers may legitimately set\n * `authorization` / `Authorization` / even `AUTHORIZATION` via defaultHeaders\n * or options.headers. We must not overwrite an already-supplied token.\n */\nfunction hasAuthorizationHeader(headers: Record<string, string>): boolean {\n for (const key of Object.keys(headers)) {\n if (key.toLowerCase() === 'authorization') return true;\n }\n return false;\n}\n\nexport function resolveBypassPermissionValue(\n token: string | undefined = process.env['INTERNAL_SERVICE_TOKEN']\n): string {\n const normalizedToken = token?.trim();\n\n if (!normalizedToken) {\n throw new Error('INTERNAL_SERVICE_TOKEN must be configured for bypass-enabled gateway calls');\n }\n\n return normalizedToken;\n}\n\n/**\n * Circuit Breaker Implementation\n */\nclass CircuitBreaker implements ICircuitBreaker {\n private state: CircuitState = CircuitState.CLOSED;\n private failures = 0;\n private successes = 0;\n private consecutiveFailures = 0;\n private lastFailureTime: number | null = null;\n private lastSuccessTime: number | null = null;\n private openedAt: number | null = null;\n private failureTimestamps: number[] = [];\n private config: CircuitBreakerConfig;\n\n constructor(config: CircuitBreakerConfig) {\n this.config = config;\n }\n\n getState(): CircuitState {\n this.checkStateTransition();\n return this.state;\n }\n\n recordSuccess(): void {\n this.successes++;\n this.consecutiveFailures = 0;\n this.lastSuccessTime = Date.now();\n\n if (this.state === CircuitState.HALF_OPEN) {\n this.state = CircuitState.CLOSED;\n this.failures = 0;\n this.failureTimestamps = [];\n this.openedAt = null;\n logger.info('[CircuitBreaker] Circuit closed after successful test');\n }\n }\n\n recordFailure(): void {\n this.failures++;\n this.consecutiveFailures++;\n this.lastFailureTime = Date.now();\n this.failureTimestamps.push(Date.now());\n\n // Clean up old timestamps\n const windowStart = Date.now() - this.config.failureWindow;\n this.failureTimestamps = this.failureTimestamps.filter((t) => t > windowStart);\n\n // Check if we should open the circuit\n if (this.state === CircuitState.CLOSED && this.failureTimestamps.length >= this.config.failureThreshold) {\n this.state = CircuitState.OPEN;\n this.openedAt = Date.now();\n logger.warn('[CircuitBreaker] Circuit opened due to failures', {\n failures: this.failureTimestamps.length,\n threshold: this.config.failureThreshold,\n });\n }\n\n // If we're half-open and fail, go back to open\n if (this.state === CircuitState.HALF_OPEN) {\n this.state = CircuitState.OPEN;\n this.openedAt = Date.now();\n logger.warn('[CircuitBreaker] Circuit re-opened after failed test');\n }\n }\n\n allowRequest(): boolean {\n this.checkStateTransition();\n\n switch (this.state) {\n case CircuitState.CLOSED:\n return true;\n case CircuitState.OPEN:\n return false;\n case CircuitState.HALF_OPEN:\n // Allow one test request\n return true;\n default:\n return true;\n }\n }\n\n forceOpen(): void {\n this.state = CircuitState.OPEN;\n this.openedAt = Date.now();\n logger.info('[CircuitBreaker] Circuit force-opened');\n }\n\n forceClose(): void {\n this.state = CircuitState.CLOSED;\n this.failures = 0;\n this.consecutiveFailures = 0;\n this.failureTimestamps = [];\n this.openedAt = null;\n logger.info('[CircuitBreaker] Circuit force-closed');\n }\n\n getStats(): CircuitBreakerStats {\n return {\n state: this.state,\n failures: this.failures,\n successes: this.successes,\n consecutiveFailures: this.consecutiveFailures,\n lastFailureTime: this.lastFailureTime,\n lastSuccessTime: this.lastSuccessTime,\n openedAt: this.openedAt,\n };\n }\n\n private checkStateTransition(): void {\n if (this.state === CircuitState.OPEN && this.openedAt) {\n const elapsed = Date.now() - this.openedAt;\n if (elapsed >= this.config.resetTimeout) {\n this.state = CircuitState.HALF_OPEN;\n logger.info('[CircuitBreaker] Circuit transitioning to half-open');\n }\n }\n }\n}\n\n/**\n * Unified Gateway Client\n */\nexport class GatewayClient implements IGatewayClient {\n private config: GatewayClientConfig;\n private layerManager: LayerManager;\n private internalCircuitBreaker: CircuitBreaker;\n private crossLayerCircuitBreaker: CircuitBreaker;\n private retryConfig: GatewayRetryConfig;\n private defaultHeaders: GatewayRequestHeaders;\n\n constructor(config: GatewayClientConfig) {\n this.config = {\n timeout: 30000,\n enableLogging: true,\n ...config,\n };\n\n // Initialize layer manager\n this.layerManager = new LayerManager({\n layer: config.layer,\n serviceName: config.serviceName,\n serviceIdentity: config.serviceIdentity,\n });\n\n // Override URLs if provided\n if (config.internalGatewayUrl) {\n // Use getter internally, but we'll store the override\n }\n if (config.crossLayerGatewayUrl) {\n // Use getter internally, but we'll store the override\n }\n\n // Initialize circuit breakers\n const cbConfig: CircuitBreakerConfig = {\n ...DEFAULT_CIRCUIT_BREAKER_CONFIG,\n ...config.circuitBreaker,\n };\n this.internalCircuitBreaker = new CircuitBreaker(cbConfig);\n this.crossLayerCircuitBreaker = new CircuitBreaker(cbConfig);\n\n // Initialize retry config\n this.retryConfig = {\n ...DEFAULT_GATEWAY_RETRY_CONFIG,\n ...config.retry,\n };\n\n // Initialize default headers\n this.defaultHeaders = {\n 'x-service-identity': this.layerManager.getServiceIdentity(),\n 'x-actor-type': 'service',\n ...config.defaultHeaders,\n };\n\n logger.debug('[GatewayClient] Initialized', {\n layer: config.layer,\n serviceName: config.serviceName,\n internalUrl: this.getInternalUrl(),\n crossLayerUrl: this.getCrossLayerUrl(),\n });\n }\n\n private getInternalUrl(): string {\n return this.config.internalGatewayUrl || this.layerManager.getInternalGatewayUrl();\n }\n\n private getCrossLayerUrl(): string {\n return this.config.crossLayerGatewayUrl || this.layerManager.getCrossLayerGatewayUrl();\n }\n\n /**\n * Execute internal (same layer) GraphQL query/mutation\n */\n async internalQuery<T = unknown>(options: GraphQLRequestOptions): Promise<GraphQLResponse<T>> {\n const context = this.createRequestContext('internal', options);\n\n return this.executeWithRetry(this.getInternalUrl(), options, this.internalCircuitBreaker, context, {\n bypassPermission: true,\n });\n }\n\n /**\n * Execute cross-layer GraphQL query/mutation\n */\n async crossLayerQuery<T = unknown>(options: GraphQLRequestOptions): Promise<GraphQLResponse<T>> {\n const context = this.createRequestContext('cross-layer', options);\n\n return this.executeWithRetry(\n this.getCrossLayerUrl(),\n options,\n this.crossLayerCircuitBreaker,\n context,\n { bypassPermission: false } // Cross-layer calls go through public gateway\n );\n }\n\n /**\n * Execute GraphQL query/mutation with explicit gateway URL\n */\n async query<T = unknown>(gatewayUrl: string, options: GraphQLRequestOptions): Promise<GraphQLResponse<T>> {\n const context = this.createRequestContext('direct', options);\n\n // Use internal circuit breaker for direct calls\n return this.executeWithRetry(gatewayUrl, options, this.internalCircuitBreaker, context, {\n bypassPermission: false,\n });\n }\n\n getInternalCircuitBreaker(): ICircuitBreaker {\n return this.internalCircuitBreaker;\n }\n\n getCrossLayerCircuitBreaker(): ICircuitBreaker {\n return this.crossLayerCircuitBreaker;\n }\n\n getHealthStatus(): GatewayClientHealth {\n return {\n internal: {\n url: this.getInternalUrl(),\n circuitState: this.internalCircuitBreaker.getState(),\n stats: this.internalCircuitBreaker.getStats(),\n },\n crossLayer: {\n url: this.getCrossLayerUrl(),\n circuitState: this.crossLayerCircuitBreaker.getState(),\n stats: this.crossLayerCircuitBreaker.getStats(),\n },\n };\n }\n\n updateDefaultHeaders(headers: Partial<GatewayRequestHeaders>): void {\n this.defaultHeaders = { ...this.defaultHeaders, ...headers };\n }\n\n private createRequestContext(\n callType: 'internal' | 'cross-layer' | 'direct',\n options: GraphQLRequestOptions\n ): RequestContext {\n return {\n requestId: uuidv4(),\n actorId: options.headers?.['x-actor-id'] || this.defaultHeaders['x-actor-id'],\n workspaceId: options.headers?.['x-workspace-id'] || this.defaultHeaders['x-workspace-id'],\n startTime: Date.now(),\n callType,\n };\n }\n\n /**\n * Check if an error should be retried\n */\n private shouldRetryError(error: unknown): boolean {\n if (!(error instanceof GatewayError)) {\n return true;\n }\n // Don't retry GraphQL errors or circuit open errors\n return error.type !== GatewayErrorType.GRAPHQL_ERROR && error.type !== GatewayErrorType.CIRCUIT_OPEN;\n }\n\n /**\n * Calculate retry delay with exponential backoff\n */\n private calculateRetryDelay(attempt: number): number {\n return Math.min(\n this.retryConfig.initialDelay * Math.pow(this.retryConfig.backoffMultiplier, attempt - 1),\n this.retryConfig.maxDelay\n );\n }\n\n /**\n * Log retry attempt if logging is enabled\n */\n private logRetryAttempt(\n context: RequestContext,\n attempt: number,\n maxAttempts: number,\n delay: number,\n error: Error\n ): void {\n if (this.config.enableLogging) {\n logger.warn('[GatewayClient] Request failed, retrying', {\n requestId: context.requestId,\n attempt,\n maxAttempts,\n delay,\n error: error.message,\n });\n }\n }\n\n private async executeWithRetry<T>(\n gatewayUrl: string,\n options: GraphQLRequestOptions,\n circuitBreaker: CircuitBreaker,\n context: RequestContext,\n settings: { bypassPermission: boolean }\n ): Promise<GraphQLResponse<T>> {\n // Check circuit breaker\n if (!options.skipCircuitBreaker && !circuitBreaker.allowRequest()) {\n throw new GatewayError(`Circuit breaker is open for ${gatewayUrl}`, GatewayErrorType.CIRCUIT_OPEN, gatewayUrl);\n }\n\n const maxAttempts = options.skipRetry ? 1 : this.retryConfig.maxAttempts;\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n const result = await this.executeRequest<T>(gatewayUrl, options, context, settings.bypassPermission);\n if (!options.skipCircuitBreaker) {\n circuitBreaker.recordSuccess();\n }\n return result;\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n if (!options.skipCircuitBreaker) {\n circuitBreaker.recordFailure();\n }\n\n if (!this.shouldRetryError(error)) {\n throw error;\n }\n\n if (attempt < maxAttempts) {\n const delay = this.calculateRetryDelay(attempt);\n this.logRetryAttempt(context, attempt, maxAttempts, delay, lastError);\n await this.sleep(delay);\n }\n }\n }\n\n throw lastError || new GatewayError('Request failed after retries', GatewayErrorType.UNKNOWN_ERROR, gatewayUrl);\n }\n\n /**\n * Build headers for a request\n */\n private buildRequestHeaders(\n context: RequestContext,\n options: GraphQLRequestOptions,\n bypassPermission: boolean\n ): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-request-id': context.requestId,\n 'x-call-type': context.callType,\n };\n\n // Add default headers\n for (const [key, value] of Object.entries(this.defaultHeaders)) {\n if (value !== undefined) {\n headers[key] = String(value);\n }\n }\n\n // Add request-specific headers\n if (options.headers) {\n for (const [key, value] of Object.entries(options.headers)) {\n if (value !== undefined) {\n headers[key] = String(value);\n }\n }\n }\n\n // Add bypass headers for internal calls\n if (bypassPermission) {\n headers['x-bypass-permission'] = resolveBypassPermissionValue();\n headers['x-bypass-source'] = this.layerManager.getServiceIdentity();\n headers['x-bypass-timestamp'] = Date.now().toString();\n }\n\n return headers;\n }\n\n /**\n * Handle GraphQL errors in response\n */\n private handleGraphQLErrors<T>(\n result: GraphQLResponse<T>,\n context: RequestContext,\n gatewayUrl: string,\n duration: number\n ): void {\n if (!result.errors || result.errors.length === 0) {\n return;\n }\n\n const errorMessages = result.errors.map((e: GraphQLError) => e.message).join(', ');\n\n if (this.config.enableLogging) {\n logger.warn('[GatewayClient] GraphQL errors', {\n requestId: context.requestId,\n errors: result.errors,\n duration,\n });\n }\n\n throw new GatewayError(`GraphQL error: ${errorMessages}`, GatewayErrorType.GRAPHQL_ERROR, gatewayUrl, {\n graphqlErrors: result.errors,\n });\n }\n\n /**\n * Handle fetch errors\n */\n private handleFetchError(\n error: unknown,\n context: RequestContext,\n gatewayUrl: string,\n timeout: number,\n duration: number\n ): never {\n if (error instanceof GatewayError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new GatewayError(`Request timed out after ${timeout}ms`, GatewayErrorType.TIMEOUT_ERROR, gatewayUrl, {\n cause: error,\n });\n }\n\n if (this.config.enableLogging) {\n logger.error('[GatewayClient] Request failed', {\n requestId: context.requestId,\n error: error.message,\n duration,\n });\n }\n\n throw new GatewayError(error.message, GatewayErrorType.NETWORK_ERROR, gatewayUrl, {\n cause: error,\n });\n }\n\n throw new GatewayError(String(error), GatewayErrorType.UNKNOWN_ERROR, gatewayUrl);\n }\n\n private async executeRequest<T>(\n gatewayUrl: string,\n options: GraphQLRequestOptions,\n context: RequestContext,\n bypassPermission: boolean\n ): Promise<GraphQLResponse<T>> {\n const timeout = options.timeout || this.config.timeout || 30000;\n const headers = this.buildRequestHeaders(context, options, bypassPermission);\n\n // Cross-layer calls transit the peer layer's PUBLIC gateway, which\n // requires JWT auth to propagate actor context. Mint a short-lived\n // service-actor JWT so the gateway admits the call and preserves\n // `x-actor-type: service` downstream. Skipped when the caller has\n // already supplied an Authorization header (e.g., user-originated\n // cross-layer flows) or when SERVICE_JWT_SECRET is unset.\n if (context.callType === 'cross-layer' && !hasAuthorizationHeader(headers)) {\n const serviceActorId = this.layerManager.getServiceIdentity();\n const serviceJwt = await signServiceJwt(serviceActorId);\n if (serviceJwt) {\n headers['Authorization'] = `Bearer ${serviceJwt}`;\n } else if (this.config.enableLogging) {\n // Subtle failure mode: without the JWT the public gateway strips\n // actor headers and the subgraph rejects with `authenticationRequired`.\n // Surface the root cause so operators rolling out a new caller don't\n // spend time debugging the downstream error.\n logger.debug(\n '[GatewayClient] SERVICE_JWT_SECRET not configured — cross-layer call will proceed without service JWT',\n { requestId: context.requestId, gatewayUrl }\n );\n }\n }\n\n const body = JSON.stringify({\n query: options.query,\n variables: options.variables || {},\n operationName: options.operationName,\n });\n\n if (this.config.enableLogging) {\n logger.debug('[GatewayClient] Executing request', {\n requestId: context.requestId,\n gatewayUrl,\n operationName: options.operationName,\n callType: context.callType,\n bypassPermission,\n });\n }\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(gatewayUrl, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n const duration = Date.now() - context.startTime;\n\n if (!response.ok) {\n throw new GatewayError(\n `HTTP ${response.status}: ${response.statusText}`,\n GatewayErrorType.NETWORK_ERROR,\n gatewayUrl,\n { statusCode: response.status }\n );\n }\n\n const result = (await response.json()) as GraphQLResponse<T>;\n this.handleGraphQLErrors(result, context, gatewayUrl, duration);\n\n if (this.config.enableLogging) {\n logger.debug('[GatewayClient] Request completed', {\n requestId: context.requestId,\n duration,\n hasData: !!result.data,\n });\n }\n\n return result;\n } catch (error) {\n const duration = Date.now() - context.startTime;\n this.handleFetchError(error, context, gatewayUrl, timeout, duration);\n }\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n/**\n * Create a gateway client for a specific layer\n */\nexport function createGatewayClient(config: GatewayClientConfig): GatewayClient {\n return new GatewayClient(config);\n}\n\n/**\n * Create a gateway client from environment variables\n *\n * Required environment variables:\n * - SERVICE_LAYER: 'wspace' | 'global'\n * - SERVICE_NAME: Service name\n *\n * Optional:\n * - SERVICE_IDENTITY: Service identity (defaults to SERVICE_NAME)\n * - {LAYER}_INT_GATEWAY_URL: Internal gateway URL\n * - {OPPOSITE_LAYER}_PUBLIC_GATEWAY_URL: Cross-layer gateway URL\n */\nexport function createGatewayClientFromEnv(): GatewayClient {\n const layer = process.env['SERVICE_LAYER'] as ServiceLayer;\n\n if (!layer || (layer !== 'wspace' && layer !== 'global')) {\n throw new Error(`[GatewayClient] Invalid or missing SERVICE_LAYER. Expected 'wspace' or 'global', got '${layer}'`);\n }\n\n const serviceName = process.env['SERVICE_NAME'];\n if (!serviceName) {\n throw new Error('[GatewayClient] SERVICE_NAME environment variable is required');\n }\n\n const serviceIdentity = process.env['SERVICE_IDENTITY'] || serviceName;\n\n return new GatewayClient({\n layer,\n serviceName,\n serviceIdentity,\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/feature-flags/index.ts","../src/feature-flags/provider.ts"],"names":["EVALUATE_QUERY","FeatureFlagProvider","gatewayUrl","cacheTtlMs","serviceToken","defaultActorType","cache","Map","config","cacheTtlSeconds","resolveBoolean","flagKey","defaultValue","context","evaluation","getEvaluation","value","reason","flagType","Boolean","variant","undefined","errorCode","resolveString","String","resolveNumber","Number","resolveObject","isEnabled","result","workspaceId","actorType","actorId","evaluateAll","keys","evaluations","fetchEvaluations","key","set","invalidateCache","cacheKey","buildCacheKey","delete","clear","get","cached","expiresAt","Date","now","response","fetch","method","headers","Authorization","body","JSON","stringify","query","variables","input","ok","json","errors","data","evaluateFeatureFlags","ctx"],"mappings":"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","file":"chunk-VWCN5PMD.js","sourcesContent":["/**\n * Feature Flags Module\n *\n * In-house feature flag evaluation for Burdenoff backend services.\n * Compatible with OpenFeature specification concepts.\n *\n * @module feature-flags\n * @category FeatureFlags\n *\n * @example\n * ```typescript\n * import { FeatureFlagProvider } from '@burdenoff/be-sdk/feature-flags';\n *\n * // Create provider (typically done once at service startup)\n * const provider = new FeatureFlagProvider({\n * gatewayUrl: process.env.GLOBAL_INT_GATEWAY_URL || 'http://global-int-gateway:4000/global/graphql',\n * cacheTtlSeconds: 60,\n * });\n *\n * // Check a boolean flag\n * const ctx = { actorId: 'user-123', actorType: 'user' as const, workspaceId: 'ws-456' };\n * const isEnabled = await provider.isEnabled('calendar.recurring-events', ctx);\n *\n * // Resolve with full details\n * const details = await provider.resolveBoolean('calendar.recurring-events', true, ctx);\n * console.log(details.value); // true\n * console.log(details.reason); // 'TARGETING_MATCH'\n * console.log(details.variant); // 'user-opted-in'\n * ```\n */\n\nexport { FeatureFlagProvider } from './provider.js';\nexport type {\n EvaluationContext,\n FeatureFlagProviderConfig,\n FlagEvaluation,\n FlagType,\n ResolutionDetails,\n} from './types.js';\n","/**\n * Burdenoff Feature Flags Server Provider\n *\n * Server-side feature flag provider for backend services.\n * Evaluates flags via the global-tenant-svc GraphQL API through the internal gateway.\n * Supports in-memory caching with configurable TTL.\n *\n * @module feature-flags/provider\n * @category FeatureFlags\n *\n * @example\n * ```typescript\n * import { FeatureFlagProvider } from '@burdenoff/be-sdk/feature-flags';\n *\n * const provider = new FeatureFlagProvider({\n * gatewayUrl: 'http://global-int-gateway:4000/global/graphql',\n * cacheTtlSeconds: 60,\n * });\n *\n * const isEnabled = await provider.resolveBoolean('calendar.recurring-events', false, {\n * actorId: 'user-123',\n * actorType: 'user',\n * workspaceId: 'ws-456',\n * });\n *\n * console.log(isEnabled.value); // true or false\n * console.log(isEnabled.reason); // 'TARGETING_MATCH', 'DEFAULT', etc.\n * ```\n */\n\nimport type { EvaluationContext, FeatureFlagProviderConfig, FlagEvaluation, ResolutionDetails } from './types.js';\n\ninterface CacheEntry {\n evaluations: Map<string, FlagEvaluation>;\n expiresAt: number;\n}\n\nconst EVALUATE_QUERY = `\n query EvaluateFeatureFlags($input: EvaluateFeatureFlagsInput!) {\n evaluateFeatureFlags(input: $input) {\n evaluations {\n key\n value\n variant\n reason\n flagType\n errorCode\n }\n }\n }\n`;\n\n/**\n * Burdenoff Feature Flag Server Provider\n *\n * Evaluates feature flags by querying the global-tenant-svc through\n * the internal gateway. Results are cached in-memory per workspace+actor\n * combination with a configurable TTL.\n */\nexport class FeatureFlagProvider {\n private readonly gatewayUrl: string;\n private readonly cacheTtlMs: number;\n private readonly serviceToken?: string;\n private readonly defaultActorType: string;\n\n /** In-memory cache keyed by `${workspaceId}:${actorId}` */\n private readonly cache = new Map<string, CacheEntry>();\n\n constructor(config: FeatureFlagProviderConfig) {\n this.gatewayUrl = config.gatewayUrl;\n this.cacheTtlMs = (config.cacheTtlSeconds ?? 60) * 1000;\n this.serviceToken = config.serviceToken;\n this.defaultActorType = config.defaultActorType ?? 'service';\n }\n\n // =========================================================================\n // Public Resolution Methods (OpenFeature-compatible interface)\n // =========================================================================\n\n /**\n * Resolve a boolean feature flag\n *\n * @param flagKey - The flag key (e.g. \"calendar.recurring-events\")\n * @param defaultValue - Default value if resolution fails\n * @param context - Evaluation context with actor and workspace info\n * @returns Resolution details with the resolved boolean value\n */\n async resolveBoolean(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext\n ): Promise<ResolutionDetails<boolean>> {\n const evaluation = await this.getEvaluation(flagKey, context);\n if (!evaluation) {\n return {\n value: defaultValue,\n reason: 'DEFAULT',\n flagType: 'BOOLEAN',\n };\n }\n\n return {\n value: Boolean(evaluation.value),\n variant: evaluation.variant ?? undefined,\n reason: evaluation.reason,\n flagType: evaluation.flagType,\n errorCode: evaluation.errorCode ?? undefined,\n };\n }\n\n /**\n * Resolve a string feature flag\n */\n async resolveString(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext\n ): Promise<ResolutionDetails<string>> {\n const evaluation = await this.getEvaluation(flagKey, context);\n if (!evaluation) {\n return {\n value: defaultValue,\n reason: 'DEFAULT',\n flagType: 'STRING',\n };\n }\n\n return {\n value: String(evaluation.value),\n variant: evaluation.variant ?? undefined,\n reason: evaluation.reason,\n flagType: evaluation.flagType,\n errorCode: evaluation.errorCode ?? undefined,\n };\n }\n\n /**\n * Resolve a number feature flag\n */\n async resolveNumber(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext\n ): Promise<ResolutionDetails<number>> {\n const evaluation = await this.getEvaluation(flagKey, context);\n if (!evaluation) {\n return {\n value: defaultValue,\n reason: 'DEFAULT',\n flagType: 'NUMBER',\n };\n }\n\n return {\n value: Number(evaluation.value),\n variant: evaluation.variant ?? undefined,\n reason: evaluation.reason,\n flagType: evaluation.flagType,\n errorCode: evaluation.errorCode ?? undefined,\n };\n }\n\n /**\n * Resolve an object (JSON) feature flag\n */\n async resolveObject<T extends Record<string, unknown>>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext\n ): Promise<ResolutionDetails<T>> {\n const evaluation = await this.getEvaluation(flagKey, context);\n if (!evaluation) {\n return {\n value: defaultValue,\n reason: 'DEFAULT',\n flagType: 'JSON',\n };\n }\n\n return {\n value: evaluation.value as T,\n variant: evaluation.variant ?? undefined,\n reason: evaluation.reason,\n flagType: evaluation.flagType,\n errorCode: evaluation.errorCode ?? undefined,\n };\n }\n\n // =========================================================================\n // Convenience Methods\n // =========================================================================\n\n /**\n * Quick boolean check — returns just the value.\n * Defaults to `true` (default-allow philosophy) if the flag is not found.\n *\n * @example\n * ```typescript\n * if (await provider.isEnabled('calendar.recurring-events', ctx)) {\n * // Feature is enabled\n * }\n * ```\n */\n async isEnabled(flagKey: string, context?: EvaluationContext): Promise<boolean> {\n const result = await this.resolveBoolean(\n flagKey,\n true,\n context ?? { workspaceId: 'system', actorType: 'service', actorId: 'boot' }\n );\n return result.value;\n }\n\n /**\n * Bulk evaluate multiple flags at once.\n * Returns a map of key -> ResolutionDetails.\n */\n async evaluateAll(context: EvaluationContext, keys?: string[]): Promise<Map<string, ResolutionDetails<unknown>>> {\n const evaluations = await this.fetchEvaluations(context, keys);\n const result = new Map<string, ResolutionDetails<unknown>>();\n\n for (const [key, evaluation] of evaluations) {\n result.set(key, {\n value: evaluation.value,\n variant: evaluation.variant ?? undefined,\n reason: evaluation.reason,\n flagType: evaluation.flagType,\n errorCode: evaluation.errorCode ?? undefined,\n });\n }\n\n return result;\n }\n\n /**\n * Invalidate the cache for a specific workspace+actor combination,\n * or all cache entries if no context is provided.\n */\n invalidateCache(context?: EvaluationContext): void {\n if (context) {\n const cacheKey = this.buildCacheKey(context);\n this.cache.delete(cacheKey);\n } else {\n this.cache.clear();\n }\n }\n\n // =========================================================================\n // Private Methods\n // =========================================================================\n\n /**\n * Get a single flag evaluation, fetching from cache or API\n */\n private async getEvaluation(flagKey: string, context: EvaluationContext | undefined): Promise<FlagEvaluation | null> {\n try {\n const evaluations = await this.fetchEvaluations(context);\n return evaluations.get(flagKey) ?? null;\n } catch {\n return null;\n }\n }\n\n /**\n * Fetch flag evaluations — uses cache if available, otherwise calls the API\n */\n private async fetchEvaluations(\n context: EvaluationContext | undefined,\n keys?: string[]\n ): Promise<Map<string, FlagEvaluation>> {\n const cacheKey = this.buildCacheKey(context);\n const cached = this.cache.get(cacheKey);\n\n if (cached && cached.expiresAt > Date.now()) {\n return cached.evaluations;\n }\n\n // Without a workspace context there's nothing the backend can evaluate\n // against — fall through to caller defaults instead of hitting the API.\n if (!context?.workspaceId) {\n return new Map();\n }\n\n // Fetch from API\n try {\n const response = await fetch(this.gatewayUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(context.actorId && { 'x-actor-id': context.actorId }),\n 'x-actor-type': context.actorType ?? this.defaultActorType,\n 'x-workspace-id': context.workspaceId,\n ...(this.serviceToken && { Authorization: `Bearer ${this.serviceToken}` }),\n },\n body: JSON.stringify({\n query: EVALUATE_QUERY,\n variables: {\n input: {\n workspaceId: context.workspaceId,\n keys: keys ?? null,\n },\n },\n }),\n });\n\n if (!response.ok) {\n // Return empty map on error — default-allow handled by callers\n return new Map();\n }\n\n const json = (await response.json()) as {\n data?: {\n evaluateFeatureFlags?: {\n evaluations?: FlagEvaluation[];\n };\n };\n errors?: Array<{ message: string }>;\n };\n\n if (json.errors || !json.data?.evaluateFeatureFlags?.evaluations) {\n return new Map();\n }\n\n const evaluations = new Map<string, FlagEvaluation>();\n for (const evaluation of json.data.evaluateFeatureFlags.evaluations) {\n evaluations.set(evaluation.key, evaluation);\n }\n\n // Cache the results\n this.cache.set(cacheKey, {\n evaluations,\n expiresAt: Date.now() + this.cacheTtlMs,\n });\n\n return evaluations;\n } catch {\n // On network error, return empty map (default-allow handled by callers)\n return new Map();\n }\n }\n\n /**\n * Build a cache key from the evaluation context.\n *\n * Safe against undefined/null context — callers like isEnabled() may\n * pass no context during service boot (e.g. checking a default-allow\n * feature flag at startup before the first request builds a real\n * actor context). Without the guard, isEnabled(flag) used to throw\n * \"undefined is not an object (evaluating 'context.workspaceId')\"\n * and crash the svc at startServer().\n */\n private buildCacheKey(context: EvaluationContext | undefined): string {\n const ctx = context ?? ({} as EvaluationContext);\n return `${ctx.workspaceId ?? 'system'}:${ctx.actorId ?? 'anonymous'}:${ctx.actorType ?? 'user'}`;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server/errors.ts","../src/server/workspace-guard.ts"],"names":["DEFAULT_ERROR_CODE","DEFAULT_HTTP_STATUS","DEFAULT_USER_MESSAGES","BAD_REQUEST","BAD_USER_INPUT","CAPTCHA_FAILED","CAPTCHA_REQUIRED","COMPLEXITY_TOO_HIGH","CONFLICT","FORBIDDEN","INTERNAL_SERVER_ERROR","INVALID_PASSWORD","NOT_FOUND","PERMISSION_DENIED","QUOTA_EXCEEDED","QUOTA_EXHAUSTED","RATE_LIMITED","RESOURCE_CAP_EXCEEDED","STORAGE_QUOTA_EXCEEDED","TIMEOUT","UNAUTHENTICATED","VALIDATION_ERROR","WORKSPACE_REQUIRED","DEFAULT_STATUS_BY_CODE","SENSITIVE_EXTENSION_KEYS","Set","TECHNICAL_MESSAGE_PATTERNS","GRAPHQL_VALIDATION_MESSAGE_PATTERNS","isRecord","value","Array","isArray","readString","record","key","trim","length","readExtensions","error","extensions","readOriginalError","GraphQLError","originalError","Error","undefined","sanitizeExtensions","sanitized","Object","entries","has","normalizeCode","code","replace","toUpperCase","inferCodeFromMessage","message","lower","toLowerCase","some","pattern","test","includes","inferCode","extensionCode","originalCode","directCode","readErrorMessage","isLikelyTechnicalMessage","readExplicitUserMessage","resolveUserMessage","explicit","fallback","resolveTechnicalMessage","options","environment","serviceName","readHttpStatus","http","normalizeError","originalExtensions","directExtensions","mergedExtensions","userMessage","technicalMessage","status","UserFacingGraphQLError","details","httpStatus","cause","name","toUserFacingGraphQLError","normalized","nodes","source","positions","path","normalizeExecutionResultErrors","result","forEach","entry","errors","map","normalizeGraphQLResponsePayload","payload","normalizeGraphQLResponse","response","contentType","headers","get","text","Response","statusText","JSON","parse","stringify","createHumanReadableErrorPlugin","onExecute","onExecuteDone","formatHttpError","body","createHttpErrorResponse","formatted","WorkspaceRequiredError","isFieldPublic","field","directives","astNode","dir","args","arguments","arg","kind","resolveOperationType","document","operationName","defs","definitions","def","operation","allRootFieldsPublic","schema","opType","rootType","getMutationType","getSubscriptionType","getQueryType","fields","getFields","opDef","find","d","selections","selectionSet","sel","fieldName","startsWith","fieldDef","createWorkspaceGuardPlugin","config","enabled","whitelistedOperations","allowPublicDirective","errorMessage","logger","info","context","contextValue","workspaceId","workspace","id","headerWorkspaceId","request","warn"],"mappings":"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","file":"chunk-VWNL2O3G.js","sourcesContent":["import { GraphQLError } from 'graphql';\n\nimport type { YogaPlugin } from './types.js';\n\nexport interface UserFacingErrorOptions {\n code: string;\n userMessage: string;\n technicalMessage?: string;\n details?: Record<string, unknown>;\n httpStatus?: number;\n cause?: Error;\n}\n\nexport interface ErrorNormalizationOptions {\n serviceName?: string;\n environment?: string;\n}\n\nexport interface NormalizedErrorState {\n code: string;\n userMessage: string;\n technicalMessage: string;\n extensions: Record<string, unknown>;\n status: number;\n}\n\nexport interface HttpErrorPayload {\n error: string;\n message: string;\n userMessage: string;\n technicalMessage: string;\n code: string;\n extensions: Record<string, unknown>;\n}\n\nexport interface HttpErrorResult {\n status: number;\n body: HttpErrorPayload;\n}\n\nconst DEFAULT_ERROR_CODE = 'INTERNAL_SERVER_ERROR';\nconst DEFAULT_HTTP_STATUS = 500;\n\nconst DEFAULT_USER_MESSAGES: Record<string, string> = {\n BAD_REQUEST: 'Please check the request and try again.',\n BAD_USER_INPUT: 'Please check the information and try again.',\n CAPTCHA_FAILED: 'The verification failed. Please try again.',\n CAPTCHA_REQUIRED: 'Please complete the verification to continue.',\n COMPLEXITY_TOO_HIGH: 'This request is too large to process. Please simplify it and try again.',\n CONFLICT: 'This change conflicts with existing data. Please refresh and try again.',\n FORBIDDEN: 'You do not have permission to do that.',\n INTERNAL_SERVER_ERROR: 'Something went wrong. Please try again.',\n INVALID_PASSWORD: 'The password you entered is incorrect.',\n NOT_FOUND: 'We could not find the requested item.',\n PERMISSION_DENIED: 'You do not have permission to do that.',\n QUOTA_EXCEEDED: \"You've reached your usage limit.\",\n QUOTA_EXHAUSTED: \"You've reached your usage limit.\",\n RATE_LIMITED: 'Too many requests. Please wait a moment and try again.',\n RESOURCE_CAP_EXCEEDED: \"You've reached your plan limit. Upgrade your plan to continue.\",\n STORAGE_QUOTA_EXCEEDED: \"You've reached your storage limit. Upgrade your plan to continue.\",\n TIMEOUT: 'The request took too long. Please try again.',\n UNAUTHENTICATED: 'Please sign in to continue.',\n VALIDATION_ERROR: 'Please check the information and try again.',\n WORKSPACE_REQUIRED: 'Please choose a workspace and try again.',\n};\n\nconst DEFAULT_STATUS_BY_CODE: Record<string, number> = {\n BAD_REQUEST: 400,\n BAD_USER_INPUT: 400,\n CAPTCHA_FAILED: 400,\n CAPTCHA_REQUIRED: 400,\n COMPLEXITY_TOO_HIGH: 400,\n CONFLICT: 409,\n FORBIDDEN: 403,\n INVALID_PASSWORD: 400,\n NOT_FOUND: 404,\n PERMISSION_DENIED: 403,\n QUOTA_EXCEEDED: 429,\n QUOTA_EXHAUSTED: 429,\n RATE_LIMITED: 429,\n RESOURCE_CAP_EXCEEDED: 429,\n STORAGE_QUOTA_EXCEEDED: 429,\n TIMEOUT: 504,\n UNAUTHENTICATED: 401,\n VALIDATION_ERROR: 400,\n WORKSPACE_REQUIRED: 403,\n};\n\nconst SENSITIVE_EXTENSION_KEYS = new Set(['exception', 'originalError', 'stack', 'stacktrace']);\n\nconst TECHNICAL_MESSAGE_PATTERNS = [\n /\\bprisma\\b/i,\n /\\bsql\\b/i,\n /\\bconstraint\\b/i,\n /\\bstack\\b/i,\n /\\bundefined\\b/i,\n /\\bnull\\b/i,\n /\\bECONN[A-Z_]*\\b/,\n /\\bETIMEDOUT\\b/,\n /\\bENOTFOUND\\b/,\n /\\bP\\d{4}\\b/,\n /Cannot (read|set|find|access)/i,\n /Build failed \\(exit \\d+\\)/i,\n /JSON\\.stringify/i,\n];\n\nconst GRAPHQL_VALIDATION_MESSAGE_PATTERNS = [\n /^Syntax Error:/i,\n /^Cannot query field\\b/i,\n /^Cannot return null for non-nullable field\\b/i,\n /^Unknown (argument|directive|type)\\b/i,\n /^Variable \"\\$[^\\\"]+\" got invalid value/i,\n /^Field \"[^\"]+\" of required type/i,\n /^Field \"[^\"]+\" must not have a selection/i,\n /^Field \"[^\"]+\" must have a selection/i,\n /^Fragment \"[^\"]+\" cannot be spread here/i,\n /^There can be only one/i,\n /Did you mean /i,\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readString(record: Record<string, unknown>, key: string): string | null {\n const value = record[key];\n return typeof value === 'string' && value.trim().length > 0 ? value : null;\n}\n\nfunction readExtensions(error: unknown): Record<string, unknown> {\n if (!isRecord(error)) return {};\n const extensions = error['extensions'];\n return isRecord(extensions) ? extensions : {};\n}\n\nfunction readOriginalError(error: unknown): Error | undefined {\n if (error instanceof GraphQLError && error.originalError instanceof Error) {\n return error.originalError;\n }\n return undefined;\n}\n\nfunction sanitizeExtensions(extensions: Record<string, unknown>): Record<string, unknown> {\n const sanitized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(extensions)) {\n if (!SENSITIVE_EXTENSION_KEYS.has(key)) {\n sanitized[key] = value;\n }\n }\n return sanitized;\n}\n\nfunction normalizeCode(code: string | null): string {\n if (!code) return DEFAULT_ERROR_CODE;\n return code\n .trim()\n .replace(/[\\s-]+/g, '_')\n .toUpperCase();\n}\n\nfunction inferCodeFromMessage(message: string): string {\n const lower = message.toLowerCase();\n\n if (GRAPHQL_VALIDATION_MESSAGE_PATTERNS.some((pattern) => pattern.test(message))) {\n return 'BAD_USER_INPUT';\n }\n\n if (\n lower.includes('unauthenticated') ||\n lower.includes('not authenticated') ||\n lower.includes('authentication required') ||\n lower.includes('unauthorized') ||\n lower.includes('please sign in') ||\n lower.includes('sign in to')\n ) {\n return 'UNAUTHENTICATED';\n }\n\n if (lower.includes('workspace context') || lower.includes('switch to a workspace')) {\n return 'WORKSPACE_REQUIRED';\n }\n\n if (\n lower.includes('forbidden') ||\n lower.includes('access denied') ||\n lower.includes('permission denied') ||\n lower.includes('not authorized')\n ) {\n return 'FORBIDDEN';\n }\n\n if (lower.includes('not found') || lower.includes('disappeared')) {\n return 'NOT_FOUND';\n }\n\n if (lower.includes('already exists') || lower.includes('already taken') || lower.includes('conflict')) {\n return 'CONFLICT';\n }\n\n if (lower.includes('quota') || lower.includes('cap exceeded') || lower.includes('limit reached')) {\n return 'QUOTA_EXCEEDED';\n }\n\n if (lower.includes('timeout') || lower.includes('timed out')) {\n return 'TIMEOUT';\n }\n\n if (\n lower.includes('required') ||\n lower.includes('invalid') ||\n lower.includes('missing') ||\n lower.includes('unsupported')\n ) {\n return 'BAD_USER_INPUT';\n }\n\n return DEFAULT_ERROR_CODE;\n}\n\nfunction inferCode(error: unknown, extensions: Record<string, unknown>, originalError: Error | undefined): string {\n const extensionCode = typeof extensions['code'] === 'string' ? extensions['code'] : null;\n if (extensionCode) return normalizeCode(extensionCode);\n\n if (isRecord(originalError)) {\n const originalCode = readString(originalError, 'code');\n if (originalCode) return normalizeCode(originalCode);\n }\n\n if (isRecord(error)) {\n const directCode = readString(error, 'code');\n if (directCode) return normalizeCode(directCode);\n }\n\n const message = readErrorMessage(error);\n return inferCodeFromMessage(message);\n}\n\nfunction readErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim().length > 0) {\n return error.message;\n }\n if (isRecord(error)) {\n const message = readString(error, 'message');\n if (message) return message;\n }\n return DEFAULT_USER_MESSAGES[DEFAULT_ERROR_CODE] ?? 'Something went wrong. Please try again.';\n}\n\nfunction isLikelyTechnicalMessage(message: string): boolean {\n if (message.length > 220) return true;\n if (message.includes('\\n')) return true;\n if (message.includes('{') && message.includes('}')) return true;\n if (GRAPHQL_VALIDATION_MESSAGE_PATTERNS.some((pattern) => pattern.test(message))) return true;\n return TECHNICAL_MESSAGE_PATTERNS.some((pattern) => pattern.test(message));\n}\n\nfunction readExplicitUserMessage(extensions: Record<string, unknown>): string | null {\n return (\n readString(extensions, 'userMessage') ??\n readString(extensions, 'humanMessage') ??\n readString(extensions, 'displayMessage')\n );\n}\n\nfunction resolveUserMessage(code: string, message: string, extensions: Record<string, unknown>): string {\n const explicit = readExplicitUserMessage(extensions);\n if (explicit) return explicit;\n\n const fallback =\n DEFAULT_USER_MESSAGES[code] ??\n DEFAULT_USER_MESSAGES[DEFAULT_ERROR_CODE] ??\n 'Something went wrong. Please try again.';\n if (code === DEFAULT_ERROR_CODE) {\n return fallback;\n }\n\n if (!isLikelyTechnicalMessage(message)) {\n return message;\n }\n\n return fallback;\n}\n\nfunction resolveTechnicalMessage(\n code: string,\n message: string,\n extensions: Record<string, unknown>,\n options: ErrorNormalizationOptions\n): string {\n const explicit = readString(extensions, 'technicalMessage');\n if (explicit) return explicit;\n\n if (options.environment === 'production' && code === DEFAULT_ERROR_CODE) {\n return options.serviceName ? `${options.serviceName} returned ${DEFAULT_ERROR_CODE}` : DEFAULT_ERROR_CODE;\n }\n\n return message;\n}\n\nfunction readHttpStatus(extensions: Record<string, unknown>, code: string): number {\n const http = extensions['http'];\n if (isRecord(http) && typeof http['status'] === 'number') {\n return http['status'];\n }\n return DEFAULT_STATUS_BY_CODE[code] ?? DEFAULT_HTTP_STATUS;\n}\n\nexport function normalizeError(error: unknown, options: ErrorNormalizationOptions = {}): NormalizedErrorState {\n const originalError = readOriginalError(error);\n const originalExtensions = readExtensions(originalError);\n const directExtensions = readExtensions(error);\n const mergedExtensions = sanitizeExtensions({ ...originalExtensions, ...directExtensions });\n const message = readErrorMessage(error);\n const code = inferCode(error, mergedExtensions, originalError);\n const userMessage = resolveUserMessage(code, message, mergedExtensions);\n const technicalMessage = resolveTechnicalMessage(code, message, mergedExtensions, options);\n const status = readHttpStatus(mergedExtensions, code);\n\n const extensions: Record<string, unknown> = {\n ...mergedExtensions,\n code,\n userMessage,\n technicalMessage,\n };\n\n if (options.serviceName) {\n extensions['serviceName'] = options.serviceName;\n }\n\n if (!isRecord(extensions['http'])) {\n extensions['http'] = { status };\n }\n\n return {\n code,\n userMessage,\n technicalMessage,\n extensions,\n status,\n };\n}\n\nexport class UserFacingGraphQLError extends GraphQLError {\n constructor(options: UserFacingErrorOptions) {\n const extensions: Record<string, unknown> = {\n code: normalizeCode(options.code),\n userMessage: options.userMessage,\n technicalMessage: options.technicalMessage ?? options.userMessage,\n };\n\n if (options.details) {\n extensions['details'] = options.details;\n }\n\n if (options.httpStatus) {\n extensions['http'] = { status: options.httpStatus };\n }\n\n super(options.userMessage, {\n originalError: options.cause,\n extensions,\n });\n this.name = 'UserFacingGraphQLError';\n }\n}\n\nexport function toUserFacingGraphQLError(error: unknown, options: ErrorNormalizationOptions = {}): GraphQLError {\n const normalized = normalizeError(error, options);\n\n if (error instanceof GraphQLError) {\n return new GraphQLError(normalized.userMessage, {\n nodes: error.nodes,\n source: error.source,\n positions: error.positions,\n path: error.path,\n originalError: error.originalError,\n extensions: normalized.extensions,\n });\n }\n\n return new GraphQLError(normalized.userMessage, {\n originalError: error instanceof Error ? error : undefined,\n extensions: normalized.extensions,\n });\n}\n\nexport function normalizeExecutionResultErrors(result: unknown, options: ErrorNormalizationOptions = {}): void {\n if (Array.isArray(result)) {\n result.forEach((entry) => normalizeExecutionResultErrors(entry, options));\n return;\n }\n\n if (!isRecord(result)) return;\n const errors = result['errors'];\n if (!Array.isArray(errors) || errors.length === 0) return;\n\n result['errors'] = errors.map((error) => toUserFacingGraphQLError(error, options));\n}\n\nexport function normalizeGraphQLResponsePayload(\n payload: unknown,\n options: ErrorNormalizationOptions = {}\n): unknown {\n normalizeExecutionResultErrors(payload, options);\n return payload;\n}\n\nexport async function normalizeGraphQLResponse(\n response: Response,\n options: ErrorNormalizationOptions = {}\n): Promise<Response> {\n const contentType = response.headers.get('content-type') ?? '';\n if (!contentType.toLowerCase().includes('json')) {\n return response;\n }\n\n const text = await response.text();\n if (!text) {\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n }\n\n let payload: unknown;\n try {\n payload = JSON.parse(text) as unknown;\n } catch {\n return new Response(text, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n }\n\n normalizeGraphQLResponsePayload(payload, options);\n\n return new Response(JSON.stringify(payload), {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n}\n\nexport function createHumanReadableErrorPlugin(options: ErrorNormalizationOptions = {}): YogaPlugin {\n return {\n onExecute() {\n return {\n onExecuteDone({ result }: { result: unknown }) {\n normalizeExecutionResultErrors(result, options);\n },\n };\n },\n };\n}\n\nexport function formatHttpError(error: unknown, options: ErrorNormalizationOptions = {}): HttpErrorResult {\n const normalized = normalizeError(error, options);\n return {\n status: normalized.status,\n body: {\n error: normalized.userMessage,\n message: normalized.userMessage,\n userMessage: normalized.userMessage,\n technicalMessage: normalized.technicalMessage,\n code: normalized.code,\n extensions: normalized.extensions,\n },\n };\n}\n\nexport function createHttpErrorResponse(error: unknown, options: ErrorNormalizationOptions = {}): Response {\n const formatted = formatHttpError(error, options);\n return new Response(JSON.stringify(formatted.body), {\n status: formatted.status,\n headers: { 'Content-Type': 'application/json' },\n });\n}\n","/**\n * Workspace Guard Plugin for GraphQL Yoga\n *\n * Blocks GraphQL operations that lack a valid workspace context (x-workspace-id header).\n * This provides defense-in-depth at the GraphQL layer — even if the gateway allows a request\n * through, the service itself will reject it if workspace context is missing.\n *\n * **Whitelisted operations** (e.g., workspace creation) can bypass the guard.\n *\n * **Public schema fields** marked with `@public` or `@rbac(public: true)` are auto-bypassed\n * when `allowPublicDirective` is enabled (default true). This lets anonymous public-link\n * resolvers (e.g. `accessShare`) be reached through the federation gateway without an\n * `x-workspace-id` header.\n *\n * @module server/workspace-guard\n * @category Security\n */\n\nimport { logger } from '../logger/index.js';\nimport { UserFacingGraphQLError } from './errors.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for the workspace guard plugin\n */\nexport interface WorkspaceGuardConfig {\n /**\n * Enable the workspace guard.\n * @default true\n */\n enabled?: boolean;\n\n /**\n * GraphQL operation names that can run without workspace context.\n * These are typically operations like `createWorkspace` that execute\n * before a workspace exists.\n *\n * Matching is case-sensitive against the operation name in the GraphQL document.\n *\n * @default []\n *\n * @example\n * ```typescript\n * whitelistedOperations: ['createWorkspace', 'validateTokens']\n * ```\n */\n whitelistedOperations?: string[];\n\n /**\n * Custom error message when workspace context is missing.\n * @default 'Workspace context required. Provide a valid X-Workspace-Authorization header.'\n */\n errorMessage?: string;\n\n /**\n * If true, fields whose schema definition carries the `@public` directive or\n * `@rbac(public: true)` are bypassed by the guard automatically — no need to\n * list them in `whitelistedOperations`. The check uses the GraphQL schema\n * passed to the executor at request time.\n *\n * Set to false to fall back to the legacy operation-name allowlist only.\n *\n * @default true\n */\n allowPublicDirective?: boolean;\n}\n\n// ============================================================================\n// GraphQL Error\n// ============================================================================\n\n/**\n * Workspace required error with proper GraphQL error extensions\n */\nclass WorkspaceRequiredError extends UserFacingGraphQLError {\n constructor(message: string) {\n super({\n code: 'WORKSPACE_REQUIRED',\n userMessage: 'Please choose a workspace and try again.',\n technicalMessage: message,\n httpStatus: 403,\n });\n this.name = 'WorkspaceRequiredError';\n }\n}\n\n// ============================================================================\n// Schema directive helpers\n// ============================================================================\n\n/**\n * Minimal structural typings for the bits of the GraphQL schema we look at.\n * We avoid importing the GraphQL types directly so the SDK keeps `graphql`\n * as a peer dep without a runtime hard dependency.\n */\ninterface FieldLikeDef {\n astNode?: {\n directives?: ReadonlyArray<{\n name: { value: string };\n arguments?: ReadonlyArray<{\n name: { value: string };\n value: { kind: string; value?: unknown };\n }>;\n }>;\n };\n}\n\ninterface SchemaLike {\n getQueryType?: () => { getFields: () => Record<string, FieldLikeDef> } | null | undefined;\n getMutationType?: () => { getFields: () => Record<string, FieldLikeDef> } | null | undefined;\n getSubscriptionType?: () => { getFields: () => Record<string, FieldLikeDef> } | null | undefined;\n}\n\n/**\n * Returns true iff the field carries either:\n * - `@public` directive, OR\n * - `@rbac(public: true)` directive (any arg-order)\n */\nfunction isFieldPublic(field: FieldLikeDef | undefined): boolean {\n const directives = field?.astNode?.directives;\n if (!directives || directives.length === 0) return false;\n\n for (const dir of directives) {\n const name = dir.name?.value;\n if (name === 'public') return true;\n if (name === 'rbac') {\n const args = dir.arguments ?? [];\n for (const arg of args) {\n if (arg.name?.value === 'public' && arg.value?.kind === 'BooleanValue' && arg.value.value === true) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\ninterface DocumentLike {\n definitions?: ReadonlyArray<{\n kind?: string;\n operation?: string;\n name?: { value?: string };\n selectionSet?: {\n selections?: ReadonlyArray<{\n kind?: string;\n name?: { value?: string };\n }>;\n };\n }>;\n}\n\n/**\n * Resolve the operation type ('query' | 'mutation' | 'subscription') for the\n * primary operation in the document. Falls back to 'query'.\n */\nfunction resolveOperationType(\n document: DocumentLike | undefined,\n operationName: string | null | undefined\n): 'query' | 'mutation' | 'subscription' {\n const defs = document?.definitions ?? [];\n for (const def of defs) {\n if (def.kind !== 'OperationDefinition') {\n // Older parsers may not set kind; fall through to the operation property check below.\n }\n if (def.operation && (!operationName || def.name?.value === operationName)) {\n return def.operation as 'query' | 'mutation' | 'subscription';\n }\n }\n return 'query';\n}\n\n/**\n * Returns true iff every root field in the document selection set is marked\n * public on the schema. Empty selection sets return false (fail-closed).\n */\nfunction allRootFieldsPublic(\n schema: SchemaLike | undefined,\n document: DocumentLike | undefined,\n operationName: string | null | undefined\n): boolean {\n if (!schema || !document) return false;\n\n const opType = resolveOperationType(document, operationName);\n let rootType: ReturnType<NonNullable<SchemaLike['getQueryType']>> | undefined;\n if (opType === 'mutation') {\n rootType = schema.getMutationType?.();\n } else if (opType === 'subscription') {\n rootType = schema.getSubscriptionType?.();\n } else {\n rootType = schema.getQueryType?.();\n }\n\n if (!rootType) return false;\n\n const fields = rootType.getFields();\n const defs = document.definitions ?? [];\n\n // Find the operation definition matching operationName (or first one).\n const opDef = defs.find((d) => d.operation && (!operationName || d.name?.value === operationName));\n const selections = opDef?.selectionSet?.selections ?? [];\n if (selections.length === 0) return false;\n\n for (const sel of selections) {\n // Only consider plain Field selections (skip fragments — fragments at the root\n // shouldn't drive a public bypass; fail-closed there).\n if (sel.kind && sel.kind !== 'Field') return false;\n const fieldName = sel.name?.value;\n if (!fieldName) return false;\n // __schema / __type introspection is always allowed without workspace context;\n // treat them as public.\n if (fieldName.startsWith('__')) continue;\n const fieldDef = fields[fieldName];\n if (!isFieldPublic(fieldDef)) return false;\n }\n return true;\n}\n\n// ============================================================================\n// Plugin\n// ============================================================================\n\n/**\n * Create a GraphQL Yoga plugin that guards operations requiring workspace context.\n *\n * The plugin inspects the GraphQL context for workspace information (set by the SDK's\n * buildContext from the x-workspace-id header). If missing and the operation is not\n * whitelisted (and not all-public per directive), it throws a WORKSPACE_REQUIRED error.\n *\n * @param config - Guard configuration\n * @returns A Yoga-compatible plugin\n *\n * @example\n * ```typescript\n * import { createWorkspaceGuardPlugin } from '@burdenoff/be-sdk/server';\n *\n * const guardPlugin = createWorkspaceGuardPlugin({\n * whitelistedOperations: ['createWorkspace'],\n * allowPublicDirective: true, // default\n * });\n * ```\n */\nexport function createWorkspaceGuardPlugin(config?: WorkspaceGuardConfig) {\n const enabled = config?.enabled ?? true;\n const whitelistedOperations = new Set(config?.whitelistedOperations ?? []);\n const allowPublicDirective = config?.allowPublicDirective ?? true;\n const errorMessage =\n config?.errorMessage ??\n 'Workspace context required. Ensure the request includes a valid workspace context (x-workspace-id header).';\n\n if (!enabled) {\n logger.info('[WorkspaceGuard] Workspace guard disabled');\n return {};\n }\n\n logger.info('[WorkspaceGuard] Workspace guard enabled', {\n whitelistedOperations: [...whitelistedOperations],\n allowPublicDirective,\n });\n\n return {\n onExecute({\n args,\n }: {\n args: {\n schema?: SchemaLike;\n document?: DocumentLike;\n operationName?: string | null;\n contextValue?: { workspace?: { id?: string }; request?: Request };\n };\n }) {\n // Extract operation name from args or document\n let operationName = args.operationName;\n\n if (!operationName && args.document?.definitions) {\n for (const def of args.document.definitions) {\n if (def.operation && def.name?.value) {\n operationName = def.name.value;\n break;\n }\n }\n }\n\n // Check if operation is whitelisted by name\n if (operationName && whitelistedOperations.has(operationName)) {\n return undefined;\n }\n\n // Check schema-directive-based public bypass (Option C)\n if (allowPublicDirective && allRootFieldsPublic(args.schema, args.document, operationName)) {\n return undefined;\n }\n\n // Check for workspace context\n const context = args.contextValue;\n const workspaceId = context?.workspace?.id;\n\n // Also check the raw header as a fallback\n const headerWorkspaceId = context?.request?.headers?.get?.('x-workspace-id');\n\n if (!workspaceId && !headerWorkspaceId) {\n logger.warn('[WorkspaceGuard] Blocked operation without workspace context', {\n operationName: operationName ?? '<anonymous>',\n });\n throw new WorkspaceRequiredError(errorMessage);\n }\n\n return undefined;\n },\n };\n}\n"]}
@@ -1,5 +0,0 @@
1
- export { createWorkspaceGuardPlugin } from './chunk-VWNL2O3G.js';
2
- import './chunk-CBZNP6RF.js';
3
- import './chunk-XE4OXN2W.js';
4
- //# sourceMappingURL=workspace-guard-3JLBFAMH.js.map
5
- //# sourceMappingURL=workspace-guard-3JLBFAMH.js.map