@burdenoff/be-sdk 2026.611.1 → 2026.622.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.
- package/dist/auth/index.d.ts +3 -2
- package/dist/auth/index.js +3 -3
- package/dist/cache/index.d.ts +2 -2
- package/dist/cache/index.js +2 -2
- package/dist/{chunk-BJVXHIUV.js → chunk-3H4TRD6E.js} +12 -49
- package/dist/chunk-3H4TRD6E.js.map +1 -0
- package/dist/{chunk-UFQQSQG6.js → chunk-4OQRBSHM.js} +3 -3
- package/dist/{chunk-UFQQSQG6.js.map → chunk-4OQRBSHM.js.map} +1 -1
- package/dist/{chunk-BNJFEOGH.js → chunk-6NB7P6SR.js} +4 -4
- package/dist/{chunk-BNJFEOGH.js.map → chunk-6NB7P6SR.js.map} +1 -1
- package/dist/chunk-DXX6C6X6.js +210 -0
- package/dist/chunk-DXX6C6X6.js.map +1 -0
- package/dist/{chunk-O6RHB2YP.js → chunk-EZ4PKRUK.js} +2 -2
- package/dist/chunk-EZ4PKRUK.js.map +1 -0
- package/dist/{chunk-5SD7DU3L.js → chunk-IC7YDBGE.js} +3 -3
- package/dist/{chunk-5SD7DU3L.js.map → chunk-IC7YDBGE.js.map} +1 -1
- package/dist/{chunk-RMDKB5O7.js → chunk-IUL5TEKE.js} +3 -3
- package/dist/{chunk-RMDKB5O7.js.map → chunk-IUL5TEKE.js.map} +1 -1
- package/dist/{chunk-4NFZOFRS.js → chunk-L2P4CJUR.js} +2 -2
- package/dist/{chunk-4NFZOFRS.js.map → chunk-L2P4CJUR.js.map} +1 -1
- package/dist/{chunk-KKCC3Z4I.js → chunk-SS4XWRYR.js} +3 -3
- package/dist/{chunk-KKCC3Z4I.js.map → chunk-SS4XWRYR.js.map} +1 -1
- package/dist/{chunk-PPIDJP2W.js → chunk-TYXGWVRL.js} +5 -5
- package/dist/{chunk-PPIDJP2W.js.map → chunk-TYXGWVRL.js.map} +1 -1
- package/dist/{chunk-GSEPF2B6.js → chunk-UIMPJNWC.js} +3 -3
- package/dist/{chunk-GSEPF2B6.js.map → chunk-UIMPJNWC.js.map} +1 -1
- package/dist/{chunk-7NYCLQFJ.js → chunk-UYE4IEPT.js} +3 -3
- package/dist/{chunk-7NYCLQFJ.js.map → chunk-UYE4IEPT.js.map} +1 -1
- package/dist/chunk-VFCMR5GX.js +49 -0
- package/dist/chunk-VFCMR5GX.js.map +1 -0
- package/dist/{chunk-GMFHIFS5.js → chunk-WD2TUTAS.js} +3 -3
- package/dist/{chunk-GMFHIFS5.js.map → chunk-WD2TUTAS.js.map} +1 -1
- package/dist/{chunk-ZRRLY7SM.js → chunk-Y7GCABRS.js} +4 -4
- package/dist/{chunk-ZRRLY7SM.js.map → chunk-Y7GCABRS.js.map} +1 -1
- package/dist/{chunk-VWCN5PMD.js → chunk-YEA4BZOL.js} +14 -5
- package/dist/chunk-YEA4BZOL.js.map +1 -0
- package/dist/{chunk-HP6JTFNR.js → chunk-YFOHAHZE.js} +2 -2
- package/dist/{chunk-HP6JTFNR.js.map → chunk-YFOHAHZE.js.map} +1 -1
- package/dist/{chunk-TIINMQSD.js → chunk-Z2423JIB.js} +3 -3
- package/dist/{chunk-TIINMQSD.js.map → chunk-Z2423JIB.js.map} +1 -1
- package/dist/database/index.js +3 -3
- package/dist/event-queue/index.d.ts +4 -4
- package/dist/export/index.d.ts +2 -2
- package/dist/export/index.js +7 -5
- package/dist/feature-flags/index.d.ts +1 -1
- package/dist/feature-flags/index.js +3 -1
- package/dist/gateway/index.d.ts +2 -2
- package/dist/gateway/index.js +6 -4
- package/dist/gateway/security/index.js +1 -1
- package/dist/graph/index.d.ts +4 -3
- package/dist/graph/index.js +3 -3
- package/dist/{graphql-DH3L5Hj7.d.ts → graphql-BRj5KPOL.d.ts} +3 -2
- package/dist/{index-DohaJRZP.d.ts → index-1qCbBvKE.d.ts} +2 -2
- package/dist/{index-BqSh1K8I.d.ts → index-B0ebYV9W.d.ts} +1 -1
- package/dist/{index-C7T0Xx19.d.ts → index-B3ECnOLp.d.ts} +3 -3
- package/dist/{index-Dg4kH1VJ.d.ts → index-B4ciT3OZ.d.ts} +1 -1
- package/dist/{index-BVjR9llq.d.ts → index-BCUkR8sC.d.ts} +1 -1
- package/dist/{index-fhOvuvlv.d.ts → index-BIhZJ1w7.d.ts} +1 -1
- package/dist/{index-Cz9_vPi7.d.ts → index-BN_-AWdb.d.ts} +2 -2
- package/dist/{index-jOuh_TKn.d.ts → index-BdPnlJ8_.d.ts} +2 -0
- package/dist/{index-KA3gg4es.d.ts → index-Bm6MYdqS.d.ts} +6 -3
- package/dist/{index-DLyc5o_K.d.ts → index-CNy4MwKc.d.ts} +1 -1
- package/dist/{index-Caqvetqq.d.ts → index-DDCOGyYh.d.ts} +6 -0
- package/dist/{index-DBF8VqIf.d.ts → index-DkObbJD_.d.ts} +1 -1
- package/dist/{index-BZPEyVOl.d.ts → index-DsBZRR82.d.ts} +3 -3
- package/dist/index.d.ts +24 -20
- package/dist/index.js +125 -170
- package/dist/index.js.map +1 -1
- package/dist/init/index.d.ts +2 -2
- package/dist/init/index.js +7 -5
- package/dist/instrumentation/index.d.ts +4 -3
- package/dist/layer/index.d.ts +2 -2
- package/dist/layer/index.js +2 -2
- package/dist/{layer-CUu_cZ7d.d.ts → layer-GNAVXBMf.d.ts} +2 -0
- package/dist/logger/index.d.ts +3 -2
- package/dist/notifications/index.d.ts +4 -3
- package/dist/notifications/index.js +3 -3
- package/dist/rbac/index.d.ts +3 -3
- package/dist/rbac/index.js +3 -3
- package/dist/resource-caps/index.d.ts +3 -2
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/telemetry/index.d.ts +5 -4
- package/dist/temporal/index.d.ts +1 -1
- package/dist/temporal/index.js +2 -2
- package/dist/tracker/index.d.ts +5 -4
- package/dist/tracker/index.js +5 -5
- package/package.json +1 -1
- package/dist/chunk-BJVXHIUV.js.map +0 -1
- package/dist/chunk-O6RHB2YP.js.map +0 -1
- package/dist/chunk-VWCN5PMD.js.map +0 -1
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { B as BurdenoffGraphQLClient } from '../graphql-
|
|
2
|
-
import { S as SDKContext } from '../index-
|
|
1
|
+
import { B as BurdenoffGraphQLClient } from '../graphql-BRj5KPOL.js';
|
|
2
|
+
import { S as SDKContext } from '../index-DDCOGyYh.js';
|
|
3
3
|
import { G as GraphQLContext } from '../types-sKXodL2N.js';
|
|
4
4
|
import 'graphql-request';
|
|
5
|
+
import '../layer-GNAVXBMf.js';
|
|
5
6
|
import 'graphql';
|
|
6
7
|
import 'graphql-yoga';
|
|
7
8
|
import '../client-CSjIrYKS.js';
|
package/dist/auth/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { AuthCookieHelper, AuthModule } from '../chunk-
|
|
1
|
+
export { AuthCookieHelper, AuthModule } from '../chunk-SS4XWRYR.js';
|
|
2
2
|
import '../chunk-B7I4TABG.js';
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
3
|
+
import '../chunk-EZ4PKRUK.js';
|
|
4
|
+
import '../chunk-YFOHAHZE.js';
|
|
5
5
|
import '../chunk-CBZNP6RF.js';
|
|
6
6
|
import '../chunk-XE4OXN2W.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/dist/cache/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { B as BaseCacheConfig, a as BatchCacheOptions, C as CacheConfig, b as CacheEntry, c as CacheFactory, d as CacheHealthCheckResult, e as CacheOptions, f as CacheProviderType, g as CacheProviderTypeLiteral, h as CacheStatistics, I as ICache, j as ICacheProvider, M as MemcachedCacheConfig, k as MemoryCacheConfig, l as MemoryCacheProvider, P as PatternOptions, m as PatternResult, V as ValkeyCacheConfig, n as ValkeyGlideClient, o as ValkeyGlideConfig, p as ValkeyGlideProvider, q as closeAllCaches, r as createCache, s as getCache, t as getValkeyClient } from '../index-
|
|
2
|
-
import '../layer-
|
|
1
|
+
export { B as BaseCacheConfig, a as BatchCacheOptions, C as CacheConfig, b as CacheEntry, c as CacheFactory, d as CacheHealthCheckResult, e as CacheOptions, f as CacheProviderType, g as CacheProviderTypeLiteral, h as CacheStatistics, I as ICache, j as ICacheProvider, M as MemcachedCacheConfig, k as MemoryCacheConfig, l as MemoryCacheProvider, P as PatternOptions, m as PatternResult, V as ValkeyCacheConfig, n as ValkeyGlideClient, o as ValkeyGlideConfig, p as ValkeyGlideProvider, q as closeAllCaches, r as createCache, s as getCache, t as getValkeyClient } from '../index-DkObbJD_.js';
|
|
2
|
+
import '../layer-GNAVXBMf.js';
|
package/dist/cache/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { CacheFactory, CacheProviderType, MemoryCacheProvider, ValkeyGlideProvider, closeAllCaches, createCache, getCache, getValkeyClient } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { CacheFactory, CacheProviderType, MemoryCacheProvider, ValkeyGlideProvider, closeAllCaches, createCache, getCache, getValkeyClient } from '../chunk-UYE4IEPT.js';
|
|
2
|
+
import '../chunk-YFOHAHZE.js';
|
|
3
3
|
import '../chunk-CBZNP6RF.js';
|
|
4
4
|
import '../chunk-XE4OXN2W.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { security_exports } from './chunk-
|
|
2
|
-
import { LayerManager } from './chunk-
|
|
3
|
-
import {
|
|
1
|
+
import { security_exports } from './chunk-L2P4CJUR.js';
|
|
2
|
+
import { LayerManager } from './chunk-UIMPJNWC.js';
|
|
3
|
+
import { signServiceJwt } from './chunk-VFCMR5GX.js';
|
|
4
|
+
import { ContextManager } from './chunk-DXX6C6X6.js';
|
|
5
|
+
import { DEFAULT_CIRCUIT_BREAKER_CONFIG, DEFAULT_GATEWAY_RETRY_CONFIG } from './chunk-YFOHAHZE.js';
|
|
4
6
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
5
7
|
import { __export, __name } from './chunk-XE4OXN2W.js';
|
|
6
|
-
import jwt from 'jsonwebtoken';
|
|
7
8
|
|
|
8
9
|
// src/gateway/index.ts
|
|
9
10
|
var gateway_exports = {};
|
|
@@ -14,50 +15,9 @@ __export(gateway_exports, {
|
|
|
14
15
|
GatewayErrorType: () => GatewayErrorType,
|
|
15
16
|
Security: () => security_exports,
|
|
16
17
|
createGatewayClient: () => createGatewayClient,
|
|
17
|
-
createGatewayClientFromEnv: () => createGatewayClientFromEnv
|
|
18
|
+
createGatewayClientFromEnv: () => createGatewayClientFromEnv,
|
|
19
|
+
signServiceJwt: () => signServiceJwt
|
|
18
20
|
});
|
|
19
|
-
var SIGNING_ENV_VAR = "SERVICE_JWT_SECRET";
|
|
20
|
-
var KEY_ID = "service-v1";
|
|
21
|
-
var DEFAULT_TTL_SECONDS = 60;
|
|
22
|
-
var REFRESH_BEFORE_EXP_MS = 1e4;
|
|
23
|
-
var cache = /* @__PURE__ */ new Map();
|
|
24
|
-
function cacheKey(actorId, ttlSeconds) {
|
|
25
|
-
return `${actorId}:${ttlSeconds}`;
|
|
26
|
-
}
|
|
27
|
-
__name(cacheKey, "cacheKey");
|
|
28
|
-
async function signServiceJwt(actorId, ttlSeconds = DEFAULT_TTL_SECONDS) {
|
|
29
|
-
const secret = process.env[SIGNING_ENV_VAR];
|
|
30
|
-
if (!secret) {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
const key = cacheKey(actorId, ttlSeconds);
|
|
34
|
-
const cached = cache.get(key);
|
|
35
|
-
if (cached && cached.expiresAtMs - REFRESH_BEFORE_EXP_MS > Date.now()) {
|
|
36
|
-
return cached.token;
|
|
37
|
-
}
|
|
38
|
-
const nowSec = Math.floor(Date.now() / 1e3);
|
|
39
|
-
const expSec = nowSec + ttlSeconds;
|
|
40
|
-
const token = jwt.sign({
|
|
41
|
-
actor_type: "service",
|
|
42
|
-
iat: nowSec,
|
|
43
|
-
exp: expSec
|
|
44
|
-
}, secret, {
|
|
45
|
-
algorithm: "HS256",
|
|
46
|
-
keyid: KEY_ID,
|
|
47
|
-
subject: actorId,
|
|
48
|
-
// `iss` = the service identity that minted the token. Matches `sub`
|
|
49
|
-
// because these are self-minted tokens (caller is asserting itself).
|
|
50
|
-
// Gives the gateway room to enforce a minter allowlist later without
|
|
51
|
-
// a token-format change.
|
|
52
|
-
issuer: actorId
|
|
53
|
-
});
|
|
54
|
-
cache.set(key, {
|
|
55
|
-
token,
|
|
56
|
-
expiresAtMs: expSec * 1e3
|
|
57
|
-
});
|
|
58
|
-
return token;
|
|
59
|
-
}
|
|
60
|
-
__name(signServiceJwt, "signServiceJwt");
|
|
61
21
|
|
|
62
22
|
// src/gateway/types.ts
|
|
63
23
|
var CircuitState = /* @__PURE__ */ (function(CircuitState2) {
|
|
@@ -400,6 +360,9 @@ var GatewayClient = class {
|
|
|
400
360
|
"x-request-id": context.requestId,
|
|
401
361
|
"x-call-type": context.callType
|
|
402
362
|
};
|
|
363
|
+
if (context.callType === "cross-layer") {
|
|
364
|
+
Object.assign(headers, ContextManager.getCfAccessHeaders());
|
|
365
|
+
}
|
|
403
366
|
for (const [key, value] of Object.entries(this.defaultHeaders)) {
|
|
404
367
|
if (value !== void 0) {
|
|
405
368
|
headers[key] = String(value);
|
|
@@ -551,5 +514,5 @@ function createGatewayClientFromEnv() {
|
|
|
551
514
|
__name(createGatewayClientFromEnv, "createGatewayClientFromEnv");
|
|
552
515
|
|
|
553
516
|
export { CircuitState, GatewayClient, GatewayError, GatewayErrorType, createGatewayClient, createGatewayClientFromEnv, gateway_exports };
|
|
554
|
-
//# sourceMappingURL=chunk-
|
|
555
|
-
//# sourceMappingURL=chunk-
|
|
517
|
+
//# sourceMappingURL=chunk-3H4TRD6E.js.map
|
|
518
|
+
//# sourceMappingURL=chunk-3H4TRD6E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gateway/index.ts","../src/gateway/types.ts","../src/gateway/client.ts"],"names":["CircuitState","GatewayErrorType","GatewayError","Error","type","gatewayUrl","statusCode","graphqlErrors","cause","message","options","name","Object","setPrototypeOf","prototype","uuidv4","crypto","randomUUID","hasAuthorizationHeader","headers","key","keys","toLowerCase","resolveBypassPermissionValue","token","process","env","normalizedToken","trim","CircuitBreaker","state","CLOSED","failures","successes","consecutiveFailures","lastFailureTime","lastSuccessTime","openedAt","failureTimestamps","config","getState","checkStateTransition","recordSuccess","Date","now","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","actorId","workspaceId","startTime","shouldRetryError","error","GRAPHQL_ERROR","CIRCUIT_OPEN","calculateRetryDelay","attempt","Math","min","initialDelay","pow","backoffMultiplier","maxDelay","logRetryAttempt","maxAttempts","delay","settings","skipCircuitBreaker","skipRetry","lastError","result","executeRequest","String","sleep","UNKNOWN_ERROR","buildRequestHeaders","assign","ContextManager","getCfAccessHeaders","value","entries","undefined","toString","handleGraphQLErrors","duration","errors","errorMessages","map","e","join","handleFetchError","TIMEOUT_ERROR","NETWORK_ERROR","serviceActorId","serviceJwt","signServiceJwt","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-3H4TRD6E.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// Service-JWT minting for cross-layer M2M auth. Exposed so non-GatewayClient\n// callers (e.g. bespoke graphql-request clients) can authenticate identically.\nexport { signServiceJwt } from './service-jwt.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 * 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 { ContextManager } from '../context/index.js';\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 // Cross-layer calls transit the peer layer's PUBLIC gateway, which on alpha\n // sits behind Cloudflare Access. Re-present the inbound request's CF service\n // token so the call passes the CF edge. Added before default/request headers\n // so a caller may still override it explicitly. No-op when the inbound\n // request carried no CF creds (local dev, production) — returns {}.\n if (context.callType === 'cross-layer') {\n Object.assign(headers, ContextManager.getCfAccessHeaders());\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,4 +1,4 @@
|
|
|
1
|
-
import { ValidationError } from './chunk-
|
|
1
|
+
import { ValidationError } from './chunk-EZ4PKRUK.js';
|
|
2
2
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
3
3
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
4
4
|
|
|
@@ -505,5 +505,5 @@ var DatabaseModule = class {
|
|
|
505
505
|
};
|
|
506
506
|
|
|
507
507
|
export { DatabaseModule, closeClickHouseConnection, createTable, executeQuery, getClickHouseClient, getClickHouseStats, insertData, testClickHouseConnection };
|
|
508
|
-
//# sourceMappingURL=chunk-
|
|
509
|
-
//# sourceMappingURL=chunk-
|
|
508
|
+
//# sourceMappingURL=chunk-4OQRBSHM.js.map
|
|
509
|
+
//# sourceMappingURL=chunk-4OQRBSHM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/database/connections/clickhouse.ts","../src/database/index.ts"],"names":["clickhouseModule","loadClickHouseModule","Error","client","getClickHouseClient","config","chModule","url","process","env","username","password","database","requestTimeout","asyncInsert","undefined","createClient","clickhouse_settings","async_insert","wait_for_async_insert","request_timeout","logger","info","testClickHouseConnection","clickhouse","result","query","format","data","json","version","error","message","closeClickHouseConnection","close","executeQuery","params","query_params","insertData","table","insert","values","debug","rows","length","createTable","command","getClickHouseStats","isConnected","db","DatabaseModule","createPrismaConfig","prismaConfig","datasources","log","errorFormat","connectionTimeout","queryTimeout","buildPagination","options","page","pageSize","offset","limit","Math","floor","skip","take","createPaginatedResult","total","totalPages","ceil","hasNext","hasPrevious","buildWhereClause","filters","where","filter","field","operator","value","not","gt","gte","lt","lte","in","notIn","contains","mode","buildOrderByClause","sorts","map","sort","direction","parseDatabaseUrl","urlObj","URL","searchParams","forEach","key","protocol","replace","host","hostname","port","parseInt","pathname","substring","Object","keys","ValidationError","buildDatabaseUrl","URLSearchParams","toString","sanitizeDatabaseUrl","validateDatabaseUrl","parsed","createPoolConfig","min","max","poolSize","acquireTimeoutMillis","idleTimeoutMillis","generateMigrationName","description","timestamp","Date","toISOString","split","slug","toLowerCase","startsWith","slice","endsWith","buildSelectClause","fields","select","buildIncludeClause","relations","include","relation","retry","operation","maxAttempts","initialDelay","delay","backoff","lastError","attempt","warn","Promise","resolve","setTimeout","transaction","prisma","operations","promises","op","results","$transaction","healthCheck","$queryRaw","formatPrismaError","err","code","meta","target","join"],"mappings":"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","file":"chunk-UFQQSQG6.js","sourcesContent":["/**\n * ClickHouse Connection Module\n *\n * Provides connection pooling and management for ClickHouse analytics database.\n * This is a generalizable module for all Burdenoff products.\n *\n * Features:\n * - Singleton connection management\n * - Environment-based configuration\n * - Health check support\n * - Query helpers for common operations\n * - Async insert optimization\n * - Lazy loading: @clickhouse/client is only imported when ClickHouse features are used\n *\n * @example\n * ```typescript\n * import { getClickHouseClient, executeQuery, insertData } from '@burdenoff/be-sdk';\n *\n * const client = await getClickHouseClient();\n * const results = await executeQuery('SELECT * FROM events LIMIT 10');\n * await insertData('events', [{ id: 1, name: 'test' }]);\n * ```\n */\n\n// Type-only import is erased at runtime, so it won't cause a missing-module error\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { logger } from '../../logger/index.js';\n\n/**\n * Lazily-loaded ClickHouse module reference\n */\nlet clickhouseModule: typeof import('@clickhouse/client') | null = null;\n\n/**\n * Lazily load the @clickhouse/client module\n * @throws Error if @clickhouse/client is not installed\n */\nasync function loadClickHouseModule(): Promise<typeof import('@clickhouse/client')> {\n if (!clickhouseModule) {\n try {\n clickhouseModule = await import('@clickhouse/client');\n } catch {\n throw new Error(\n '@clickhouse/client is required for ClickHouse features. Install it with: bun add @clickhouse/client'\n );\n }\n }\n return clickhouseModule;\n}\n\nlet client: ClickHouseClient | null = null;\n\n/**\n * ClickHouse configuration options\n */\nexport interface ClickHouseConfig {\n /** ClickHouse server URL */\n url?: string;\n /** Username for authentication */\n username?: string;\n /** Password for authentication */\n password?: string;\n /** Database name */\n database?: string;\n /** Request timeout in milliseconds */\n requestTimeout?: number;\n /** Enable async inserts */\n asyncInsert?: boolean;\n}\n\n/**\n * Get ClickHouse client instance (singleton)\n *\n * Creates a new connection if one doesn't exist, otherwise returns the existing connection.\n * Connection parameters are read from environment variables or can be provided via config.\n *\n * Environment variables:\n * - CLICKHOUSE_URL: ClickHouse server URL (default: http://localhost:8123)\n * - CLICKHOUSE_USER: Username (default: default)\n * - CLICKHOUSE_PASSWORD: Password (default: empty)\n * - CLICKHOUSE_DB: Database name (default: default)\n *\n * @param config - Optional configuration to override environment variables\n * @returns Promise resolving to ClickHouseClient instance\n */\nexport async function getClickHouseClient(config?: ClickHouseConfig): Promise<ClickHouseClient> {\n if (!client) {\n const chModule = await loadClickHouseModule();\n\n const url = config?.url || process.env['CLICKHOUSE_URL'] || 'http://localhost:8123';\n const username = config?.username || process.env['CLICKHOUSE_USER'] || 'default';\n const password = config?.password || process.env['CLICKHOUSE_PASSWORD'] || '';\n const database = config?.database || process.env['CLICKHOUSE_DB'] || 'default';\n const requestTimeout = config?.requestTimeout || 30000;\n const asyncInsert = config?.asyncInsert !== undefined ? config.asyncInsert : true;\n\n client = chModule.createClient({\n url,\n username,\n password,\n database,\n clickhouse_settings: {\n // Enable async_insert for better performance with frequent small inserts\n async_insert: asyncInsert ? 1 : 0,\n wait_for_async_insert: 0,\n },\n // Request timeout in ms\n request_timeout: requestTimeout,\n });\n\n logger.info('[ClickHouse] Connected to ClickHouse', {\n url,\n database,\n });\n }\n\n return client;\n}\n\n/**\n * Test ClickHouse connection\n *\n * Attempts to query the database version to verify connectivity.\n *\n * @returns Promise resolving to true if connected, false otherwise\n */\nexport async function testClickHouseConnection(): Promise<boolean> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT version() as version',\n format: 'JSONEachRow',\n });\n\n const data = await result.json<{ version: string }>();\n logger.info('[ClickHouse] Connected successfully', {\n version: data[0]?.version,\n });\n return true;\n } catch (error: unknown) {\n logger.error('[ClickHouse] Failed to connect', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return false;\n }\n}\n\n/**\n * Close ClickHouse connection\n *\n * Closes the client connection and cleans up resources.\n * Should be called on application shutdown.\n */\nexport async function closeClickHouseConnection(): Promise<void> {\n if (client) {\n await client.close();\n client = null;\n logger.info('[ClickHouse] Connection closed');\n }\n}\n\n/**\n * Execute a ClickHouse query\n *\n * @param query - SQL query to execute\n * @param params - Optional query parameters\n * @returns Promise resolving to query results\n */\nexport async function executeQuery<T = unknown>(query: string, params?: Record<string, unknown>): Promise<T[]> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n });\n\n return await result.json<T>();\n } catch (error: unknown) {\n logger.error('[ClickHouse] Query error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n query,\n });\n throw error;\n }\n}\n\n/**\n * Insert data into a ClickHouse table\n *\n * @param table - Table name\n * @param data - Array of data objects to insert\n */\nexport async function insertData<T extends Record<string, unknown>>(table: string, data: T[]): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.insert({\n table,\n values: data,\n format: 'JSONEachRow',\n });\n\n logger.debug('[ClickHouse] Data inserted', {\n table,\n rows: data.length,\n });\n } catch (error: unknown) {\n logger.error('[ClickHouse] Insert error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n table,\n });\n throw error;\n }\n}\n\n/**\n * Create a table in ClickHouse\n *\n * @param query - CREATE TABLE query\n */\nexport async function createTable(query: string): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.command({\n query,\n });\n\n logger.debug('[ClickHouse] Table created successfully');\n } catch (error: unknown) {\n logger.error('[ClickHouse] Table creation error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n}\n\n/**\n * Get ClickHouse client statistics\n *\n * @returns Promise resolving to client statistics\n */\nexport async function getClickHouseStats(): Promise<{\n isConnected: boolean;\n database: string | null;\n}> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT currentDatabase() as db',\n format: 'JSONEachRow',\n });\n const data = await result.json<{ db: string }>();\n return {\n isConnected: true,\n database: data[0]?.db || null,\n };\n } catch {\n return {\n isConnected: false,\n database: null,\n };\n }\n}\n","/**\n * Database Module\n * Helpers for database client, Prisma configuration, and common database operations.\n * Includes connection management for ClickHouse. The legacy ArangoDB connection\n * was removed as part of the migration to Apache AGE — consuming services now\n * talk to wspace-graph-svc via the federated GraphQL gateway and never open a\n * direct graph DB connection.\n */\n\nimport { logger } from '../logger/index.js';\nimport { ValidationError } from '../types/index.js';\n\n// Export connection modules\nexport * from './connections/clickhouse.js';\n\nexport interface DatabaseConfig {\n /** Database URL */\n url: string;\n /** Connection pool size */\n poolSize?: number;\n /** Connection timeout in milliseconds */\n connectionTimeout?: number;\n /** Query timeout in milliseconds */\n queryTimeout?: number;\n /** Enable query logging */\n logQueries?: boolean;\n /** SSL configuration */\n ssl?: {\n rejectUnauthorized?: boolean;\n ca?: string;\n cert?: string;\n key?: string;\n };\n}\n\nexport interface PrismaConfig extends DatabaseConfig {\n /** Prisma log levels */\n log?: Array<'query' | 'info' | 'warn' | 'error'>;\n /** Error format */\n errorFormat?: 'pretty' | 'colorless' | 'minimal';\n}\n\nexport interface QueryOptions {\n /** Query timeout in milliseconds */\n timeout?: number;\n /** Transaction isolation level */\n isolationLevel?: 'ReadUncommitted' | 'ReadCommitted' | 'RepeatableRead' | 'Serializable';\n}\n\nexport interface PaginationOptions {\n /** Page number (1-based) */\n page?: number;\n /** Number of items per page */\n pageSize?: number;\n /** Offset (alternative to page) */\n offset?: number;\n /** Limit (alternative to pageSize) */\n limit?: number;\n}\n\nexport interface PaginatedResult<T> {\n /** Data items */\n data: T[];\n /** Total count of items */\n total: number;\n /** Current page */\n page: number;\n /** Page size */\n pageSize: number;\n /** Total pages */\n totalPages: number;\n /** Has next page */\n hasNext: boolean;\n /** Has previous page */\n hasPrevious: boolean;\n}\n\nexport interface SortOptions {\n /** Field to sort by */\n field: string;\n /** Sort direction */\n direction: 'asc' | 'desc';\n}\n\nexport interface FilterOptions {\n /** Field to filter */\n field: string;\n /** Operator */\n operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'like' | 'ilike';\n /** Value to compare */\n value: unknown;\n}\n\n/**\n * Database Module\n */\nexport class DatabaseModule {\n /**\n * Create Prisma client configuration\n */\n public static createPrismaConfig(config: PrismaConfig): Record<string, unknown> {\n logger.debug('[Database] Creating Prisma config');\n\n const prismaConfig: Record<string, unknown> = {\n datasources: {\n db: {\n url: config.url,\n },\n },\n log: config.log || ['error', 'warn'],\n errorFormat: config.errorFormat || 'colorless',\n };\n\n if (config.connectionTimeout) {\n prismaConfig['connectionTimeout'] = config.connectionTimeout;\n }\n\n if (config.queryTimeout) {\n prismaConfig['queryTimeout'] = config.queryTimeout;\n }\n\n logger.info('[Database] Prisma config created');\n\n return prismaConfig;\n }\n\n /**\n * Build pagination parameters\n */\n public static buildPagination(options: PaginationOptions): {\n skip: number;\n take: number;\n page: number;\n pageSize: number;\n } {\n let page = options.page || 1;\n let pageSize = options.pageSize || 20;\n\n // Handle offset/limit if provided instead of page/pageSize\n if (options.offset !== undefined || options.limit !== undefined) {\n const offset = options.offset || 0;\n const limit = options.limit || 20;\n pageSize = limit;\n page = Math.floor(offset / limit) + 1;\n }\n\n // Validate\n if (page < 1) {\n page = 1;\n }\n\n if (pageSize < 1) {\n pageSize = 20;\n }\n\n if (pageSize > 100) {\n pageSize = 100; // Max page size\n }\n\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n return { skip, take, page, pageSize };\n }\n\n /**\n * Create paginated result\n */\n public static createPaginatedResult<T>(data: T[], total: number, page: number, pageSize: number): PaginatedResult<T> {\n const totalPages = Math.ceil(total / pageSize);\n\n return {\n data,\n total,\n page,\n pageSize,\n totalPages,\n hasNext: page < totalPages,\n hasPrevious: page > 1,\n };\n }\n\n /**\n * Build Prisma where clause from filters\n */\n public static buildWhereClause(filters: FilterOptions[]): Record<string, unknown> {\n const where: Record<string, unknown> = {};\n\n for (const filter of filters) {\n const { field, operator, value } = filter;\n\n switch (operator) {\n case 'eq':\n where[field] = value;\n break;\n case 'ne':\n where[field] = { not: value };\n break;\n case 'gt':\n where[field] = { gt: value };\n break;\n case 'gte':\n where[field] = { gte: value };\n break;\n case 'lt':\n where[field] = { lt: value };\n break;\n case 'lte':\n where[field] = { lte: value };\n break;\n case 'in':\n where[field] = { in: value };\n break;\n case 'nin':\n where[field] = { notIn: value };\n break;\n case 'like':\n where[field] = { contains: value };\n break;\n case 'ilike':\n where[field] = { contains: value, mode: 'insensitive' };\n break;\n }\n }\n\n return where;\n }\n\n /**\n * Build Prisma orderBy clause from sort options\n */\n public static buildOrderByClause(sorts: SortOptions[]): Record<string, string>[] {\n return sorts.map((sort) => ({\n [sort.field]: sort.direction,\n }));\n }\n\n /**\n * Parse database URL\n */\n public static parseDatabaseUrl(url: string): {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n } {\n try {\n const urlObj = new URL(url);\n\n const params: Record<string, string> = {};\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return {\n protocol: urlObj.protocol.replace(':', ''),\n host: urlObj.hostname,\n port: urlObj.port ? parseInt(urlObj.port, 10) : undefined,\n database: urlObj.pathname.substring(1),\n username: urlObj.username || undefined,\n password: urlObj.password || undefined,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n } catch (error) {\n throw new ValidationError('Invalid database URL', {\n url,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Build database URL\n */\n public static buildDatabaseUrl(options: {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n }): string {\n let url = `${options.protocol}://`;\n\n if (options.username) {\n url += options.username;\n if (options.password) {\n url += `:${options.password}`;\n }\n url += '@';\n }\n\n url += options.host;\n\n if (options.port) {\n url += `:${options.port}`;\n }\n\n url += `/${options.database}`;\n\n if (options.params && Object.keys(options.params).length > 0) {\n const params = new URLSearchParams(options.params);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n\n /**\n * Sanitize database URL for logging (remove password)\n */\n public static sanitizeDatabaseUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n if (urlObj.password) {\n // eslint-disable-next-line sonarjs/no-hardcoded-passwords -- Redacting password for logging, not hardcoding\n urlObj.password = '***';\n }\n return urlObj.toString();\n } catch {\n return url;\n }\n }\n\n /**\n * Validate database connection URL\n */\n public static validateDatabaseUrl(url: string): boolean {\n try {\n const parsed = this.parseDatabaseUrl(url);\n return !!(parsed.protocol && parsed.host && parsed.database);\n } catch {\n return false;\n }\n }\n\n /**\n * Create connection pool config\n */\n public static createPoolConfig(config: DatabaseConfig): {\n min: number;\n max: number;\n acquireTimeoutMillis: number;\n idleTimeoutMillis: number;\n } {\n return {\n min: 2,\n max: config.poolSize || 10,\n acquireTimeoutMillis: config.connectionTimeout || 30000,\n idleTimeoutMillis: 30000,\n };\n }\n\n /**\n * Generate migration name\n */\n public static generateMigrationName(description: string): string {\n const timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];\n\n // Convert to slug format\n let slug = description.toLowerCase().replace(/[^a-z0-9]+/g, '_');\n\n // Manually trim underscores to avoid slow-regex warning\n while (slug.startsWith('_')) {\n slug = slug.slice(1);\n }\n while (slug.endsWith('_')) {\n slug = slug.slice(0, -1);\n }\n\n return `${timestamp}_${slug}`;\n }\n\n /**\n * Build select clause for specific fields\n */\n public static buildSelectClause(fields: string[]): Record<string, boolean> {\n const select: Record<string, boolean> = {};\n for (const field of fields) {\n select[field] = true;\n }\n return select;\n }\n\n /**\n * Build include clause for relations\n */\n public static buildIncludeClause(relations: string[]): Record<string, boolean> {\n const include: Record<string, boolean> = {};\n for (const relation of relations) {\n include[relation] = true;\n }\n return include;\n }\n\n /**\n * Retry database operation\n */\n public static async retry<T>(\n operation: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: number;\n } = {}\n ): Promise<T> {\n const maxAttempts = options.maxAttempts || 3;\n const initialDelay = options.delay || 1000;\n const backoff = options.backoff || 2;\n\n let lastError: Error | undefined;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n logger.warn(`[Database] Operation failed (attempt ${attempt}/${maxAttempts})`, { error });\n\n if (attempt < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay *= backoff;\n }\n }\n }\n\n throw lastError || new Error('Database operation failed after retries');\n }\n\n /**\n * Execute in transaction\n */\n public static async transaction<T>(\n prisma: unknown,\n operations: Array<(tx: unknown) => Promise<unknown>>\n ): Promise<T[]> {\n logger.debug('[Database] Starting transaction');\n\n if (!prisma || typeof prisma !== 'object' || !('$transaction' in prisma)) {\n throw new ValidationError('Invalid Prisma client provided');\n }\n\n const client = prisma as { $transaction: (ops: Array<Promise<unknown>>) => Promise<unknown[]> };\n\n try {\n const promises = operations.map((op) => op(prisma));\n const results = await client.$transaction(promises);\n\n logger.info('[Database] Transaction completed successfully');\n\n return results as T[];\n } catch (error) {\n logger.error('[Database] Transaction failed', { error });\n throw error;\n }\n }\n\n /**\n * Check database health\n */\n public static async healthCheck(prisma: unknown): Promise<boolean> {\n try {\n if (!prisma || typeof prisma !== 'object' || !('$queryRaw' in prisma)) {\n return false;\n }\n\n const client = prisma as { $queryRaw: (query: unknown) => Promise<unknown> };\n\n // Simple query to check connection\n await client.$queryRaw`SELECT 1`;\n\n return true;\n } catch (error) {\n logger.error('[Database] Health check failed', { error });\n return false;\n }\n }\n\n /**\n * Format Prisma error for user-friendly message\n */\n public static formatPrismaError(error: unknown): string {\n if (!error || typeof error !== 'object') {\n return 'Database error occurred';\n }\n\n const err = error as { code?: string; meta?: { target?: string[] } };\n\n switch (err.code) {\n case 'P2002':\n return `A record with this ${err.meta?.target?.join(', ') || 'value'} already exists`;\n case 'P2025':\n return 'Record not found';\n case 'P2003':\n return 'Foreign key constraint failed';\n case 'P2016':\n return 'Query interpretation error';\n case 'P2021':\n return 'Table does not exist in the database';\n case 'P2022':\n return 'Column does not exist in the database';\n default:\n return 'Database operation failed';\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/database/connections/clickhouse.ts","../src/database/index.ts"],"names":["clickhouseModule","loadClickHouseModule","Error","client","getClickHouseClient","config","chModule","url","process","env","username","password","database","requestTimeout","asyncInsert","undefined","createClient","clickhouse_settings","async_insert","wait_for_async_insert","request_timeout","logger","info","testClickHouseConnection","clickhouse","result","query","format","data","json","version","error","message","closeClickHouseConnection","close","executeQuery","params","query_params","insertData","table","insert","values","debug","rows","length","createTable","command","getClickHouseStats","isConnected","db","DatabaseModule","createPrismaConfig","prismaConfig","datasources","log","errorFormat","connectionTimeout","queryTimeout","buildPagination","options","page","pageSize","offset","limit","Math","floor","skip","take","createPaginatedResult","total","totalPages","ceil","hasNext","hasPrevious","buildWhereClause","filters","where","filter","field","operator","value","not","gt","gte","lt","lte","in","notIn","contains","mode","buildOrderByClause","sorts","map","sort","direction","parseDatabaseUrl","urlObj","URL","searchParams","forEach","key","protocol","replace","host","hostname","port","parseInt","pathname","substring","Object","keys","ValidationError","buildDatabaseUrl","URLSearchParams","toString","sanitizeDatabaseUrl","validateDatabaseUrl","parsed","createPoolConfig","min","max","poolSize","acquireTimeoutMillis","idleTimeoutMillis","generateMigrationName","description","timestamp","Date","toISOString","split","slug","toLowerCase","startsWith","slice","endsWith","buildSelectClause","fields","select","buildIncludeClause","relations","include","relation","retry","operation","maxAttempts","initialDelay","delay","backoff","lastError","attempt","warn","Promise","resolve","setTimeout","transaction","prisma","operations","promises","op","results","$transaction","healthCheck","$queryRaw","formatPrismaError","err","code","meta","target","join"],"mappings":"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","file":"chunk-4OQRBSHM.js","sourcesContent":["/**\n * ClickHouse Connection Module\n *\n * Provides connection pooling and management for ClickHouse analytics database.\n * This is a generalizable module for all Burdenoff products.\n *\n * Features:\n * - Singleton connection management\n * - Environment-based configuration\n * - Health check support\n * - Query helpers for common operations\n * - Async insert optimization\n * - Lazy loading: @clickhouse/client is only imported when ClickHouse features are used\n *\n * @example\n * ```typescript\n * import { getClickHouseClient, executeQuery, insertData } from '@burdenoff/be-sdk';\n *\n * const client = await getClickHouseClient();\n * const results = await executeQuery('SELECT * FROM events LIMIT 10');\n * await insertData('events', [{ id: 1, name: 'test' }]);\n * ```\n */\n\n// Type-only import is erased at runtime, so it won't cause a missing-module error\nimport type { ClickHouseClient } from '@clickhouse/client';\nimport { logger } from '../../logger/index.js';\n\n/**\n * Lazily-loaded ClickHouse module reference\n */\nlet clickhouseModule: typeof import('@clickhouse/client') | null = null;\n\n/**\n * Lazily load the @clickhouse/client module\n * @throws Error if @clickhouse/client is not installed\n */\nasync function loadClickHouseModule(): Promise<typeof import('@clickhouse/client')> {\n if (!clickhouseModule) {\n try {\n clickhouseModule = await import('@clickhouse/client');\n } catch {\n throw new Error(\n '@clickhouse/client is required for ClickHouse features. Install it with: bun add @clickhouse/client'\n );\n }\n }\n return clickhouseModule;\n}\n\nlet client: ClickHouseClient | null = null;\n\n/**\n * ClickHouse configuration options\n */\nexport interface ClickHouseConfig {\n /** ClickHouse server URL */\n url?: string;\n /** Username for authentication */\n username?: string;\n /** Password for authentication */\n password?: string;\n /** Database name */\n database?: string;\n /** Request timeout in milliseconds */\n requestTimeout?: number;\n /** Enable async inserts */\n asyncInsert?: boolean;\n}\n\n/**\n * Get ClickHouse client instance (singleton)\n *\n * Creates a new connection if one doesn't exist, otherwise returns the existing connection.\n * Connection parameters are read from environment variables or can be provided via config.\n *\n * Environment variables:\n * - CLICKHOUSE_URL: ClickHouse server URL (default: http://localhost:8123)\n * - CLICKHOUSE_USER: Username (default: default)\n * - CLICKHOUSE_PASSWORD: Password (default: empty)\n * - CLICKHOUSE_DB: Database name (default: default)\n *\n * @param config - Optional configuration to override environment variables\n * @returns Promise resolving to ClickHouseClient instance\n */\nexport async function getClickHouseClient(config?: ClickHouseConfig): Promise<ClickHouseClient> {\n if (!client) {\n const chModule = await loadClickHouseModule();\n\n const url = config?.url || process.env['CLICKHOUSE_URL'] || 'http://localhost:8123';\n const username = config?.username || process.env['CLICKHOUSE_USER'] || 'default';\n const password = config?.password || process.env['CLICKHOUSE_PASSWORD'] || '';\n const database = config?.database || process.env['CLICKHOUSE_DB'] || 'default';\n const requestTimeout = config?.requestTimeout || 30000;\n const asyncInsert = config?.asyncInsert !== undefined ? config.asyncInsert : true;\n\n client = chModule.createClient({\n url,\n username,\n password,\n database,\n clickhouse_settings: {\n // Enable async_insert for better performance with frequent small inserts\n async_insert: asyncInsert ? 1 : 0,\n wait_for_async_insert: 0,\n },\n // Request timeout in ms\n request_timeout: requestTimeout,\n });\n\n logger.info('[ClickHouse] Connected to ClickHouse', {\n url,\n database,\n });\n }\n\n return client;\n}\n\n/**\n * Test ClickHouse connection\n *\n * Attempts to query the database version to verify connectivity.\n *\n * @returns Promise resolving to true if connected, false otherwise\n */\nexport async function testClickHouseConnection(): Promise<boolean> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT version() as version',\n format: 'JSONEachRow',\n });\n\n const data = await result.json<{ version: string }>();\n logger.info('[ClickHouse] Connected successfully', {\n version: data[0]?.version,\n });\n return true;\n } catch (error: unknown) {\n logger.error('[ClickHouse] Failed to connect', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n return false;\n }\n}\n\n/**\n * Close ClickHouse connection\n *\n * Closes the client connection and cleans up resources.\n * Should be called on application shutdown.\n */\nexport async function closeClickHouseConnection(): Promise<void> {\n if (client) {\n await client.close();\n client = null;\n logger.info('[ClickHouse] Connection closed');\n }\n}\n\n/**\n * Execute a ClickHouse query\n *\n * @param query - SQL query to execute\n * @param params - Optional query parameters\n * @returns Promise resolving to query results\n */\nexport async function executeQuery<T = unknown>(query: string, params?: Record<string, unknown>): Promise<T[]> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query,\n query_params: params,\n format: 'JSONEachRow',\n });\n\n return await result.json<T>();\n } catch (error: unknown) {\n logger.error('[ClickHouse] Query error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n query,\n });\n throw error;\n }\n}\n\n/**\n * Insert data into a ClickHouse table\n *\n * @param table - Table name\n * @param data - Array of data objects to insert\n */\nexport async function insertData<T extends Record<string, unknown>>(table: string, data: T[]): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.insert({\n table,\n values: data,\n format: 'JSONEachRow',\n });\n\n logger.debug('[ClickHouse] Data inserted', {\n table,\n rows: data.length,\n });\n } catch (error: unknown) {\n logger.error('[ClickHouse] Insert error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n table,\n });\n throw error;\n }\n}\n\n/**\n * Create a table in ClickHouse\n *\n * @param query - CREATE TABLE query\n */\nexport async function createTable(query: string): Promise<void> {\n try {\n const clickhouse = await getClickHouseClient();\n await clickhouse.command({\n query,\n });\n\n logger.debug('[ClickHouse] Table created successfully');\n } catch (error: unknown) {\n logger.error('[ClickHouse] Table creation error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n throw error;\n }\n}\n\n/**\n * Get ClickHouse client statistics\n *\n * @returns Promise resolving to client statistics\n */\nexport async function getClickHouseStats(): Promise<{\n isConnected: boolean;\n database: string | null;\n}> {\n try {\n const clickhouse = await getClickHouseClient();\n const result = await clickhouse.query({\n query: 'SELECT currentDatabase() as db',\n format: 'JSONEachRow',\n });\n const data = await result.json<{ db: string }>();\n return {\n isConnected: true,\n database: data[0]?.db || null,\n };\n } catch {\n return {\n isConnected: false,\n database: null,\n };\n }\n}\n","/**\n * Database Module\n * Helpers for database client, Prisma configuration, and common database operations.\n * Includes connection management for ClickHouse. The legacy ArangoDB connection\n * was removed as part of the migration to Apache AGE — consuming services now\n * talk to wspace-graph-svc via the federated GraphQL gateway and never open a\n * direct graph DB connection.\n */\n\nimport { logger } from '../logger/index.js';\nimport { ValidationError } from '../types/index.js';\n\n// Export connection modules\nexport * from './connections/clickhouse.js';\n\nexport interface DatabaseConfig {\n /** Database URL */\n url: string;\n /** Connection pool size */\n poolSize?: number;\n /** Connection timeout in milliseconds */\n connectionTimeout?: number;\n /** Query timeout in milliseconds */\n queryTimeout?: number;\n /** Enable query logging */\n logQueries?: boolean;\n /** SSL configuration */\n ssl?: {\n rejectUnauthorized?: boolean;\n ca?: string;\n cert?: string;\n key?: string;\n };\n}\n\nexport interface PrismaConfig extends DatabaseConfig {\n /** Prisma log levels */\n log?: Array<'query' | 'info' | 'warn' | 'error'>;\n /** Error format */\n errorFormat?: 'pretty' | 'colorless' | 'minimal';\n}\n\nexport interface QueryOptions {\n /** Query timeout in milliseconds */\n timeout?: number;\n /** Transaction isolation level */\n isolationLevel?: 'ReadUncommitted' | 'ReadCommitted' | 'RepeatableRead' | 'Serializable';\n}\n\nexport interface PaginationOptions {\n /** Page number (1-based) */\n page?: number;\n /** Number of items per page */\n pageSize?: number;\n /** Offset (alternative to page) */\n offset?: number;\n /** Limit (alternative to pageSize) */\n limit?: number;\n}\n\nexport interface PaginatedResult<T> {\n /** Data items */\n data: T[];\n /** Total count of items */\n total: number;\n /** Current page */\n page: number;\n /** Page size */\n pageSize: number;\n /** Total pages */\n totalPages: number;\n /** Has next page */\n hasNext: boolean;\n /** Has previous page */\n hasPrevious: boolean;\n}\n\nexport interface SortOptions {\n /** Field to sort by */\n field: string;\n /** Sort direction */\n direction: 'asc' | 'desc';\n}\n\nexport interface FilterOptions {\n /** Field to filter */\n field: string;\n /** Operator */\n operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'nin' | 'like' | 'ilike';\n /** Value to compare */\n value: unknown;\n}\n\n/**\n * Database Module\n */\nexport class DatabaseModule {\n /**\n * Create Prisma client configuration\n */\n public static createPrismaConfig(config: PrismaConfig): Record<string, unknown> {\n logger.debug('[Database] Creating Prisma config');\n\n const prismaConfig: Record<string, unknown> = {\n datasources: {\n db: {\n url: config.url,\n },\n },\n log: config.log || ['error', 'warn'],\n errorFormat: config.errorFormat || 'colorless',\n };\n\n if (config.connectionTimeout) {\n prismaConfig['connectionTimeout'] = config.connectionTimeout;\n }\n\n if (config.queryTimeout) {\n prismaConfig['queryTimeout'] = config.queryTimeout;\n }\n\n logger.info('[Database] Prisma config created');\n\n return prismaConfig;\n }\n\n /**\n * Build pagination parameters\n */\n public static buildPagination(options: PaginationOptions): {\n skip: number;\n take: number;\n page: number;\n pageSize: number;\n } {\n let page = options.page || 1;\n let pageSize = options.pageSize || 20;\n\n // Handle offset/limit if provided instead of page/pageSize\n if (options.offset !== undefined || options.limit !== undefined) {\n const offset = options.offset || 0;\n const limit = options.limit || 20;\n pageSize = limit;\n page = Math.floor(offset / limit) + 1;\n }\n\n // Validate\n if (page < 1) {\n page = 1;\n }\n\n if (pageSize < 1) {\n pageSize = 20;\n }\n\n if (pageSize > 100) {\n pageSize = 100; // Max page size\n }\n\n const skip = (page - 1) * pageSize;\n const take = pageSize;\n\n return { skip, take, page, pageSize };\n }\n\n /**\n * Create paginated result\n */\n public static createPaginatedResult<T>(data: T[], total: number, page: number, pageSize: number): PaginatedResult<T> {\n const totalPages = Math.ceil(total / pageSize);\n\n return {\n data,\n total,\n page,\n pageSize,\n totalPages,\n hasNext: page < totalPages,\n hasPrevious: page > 1,\n };\n }\n\n /**\n * Build Prisma where clause from filters\n */\n public static buildWhereClause(filters: FilterOptions[]): Record<string, unknown> {\n const where: Record<string, unknown> = {};\n\n for (const filter of filters) {\n const { field, operator, value } = filter;\n\n switch (operator) {\n case 'eq':\n where[field] = value;\n break;\n case 'ne':\n where[field] = { not: value };\n break;\n case 'gt':\n where[field] = { gt: value };\n break;\n case 'gte':\n where[field] = { gte: value };\n break;\n case 'lt':\n where[field] = { lt: value };\n break;\n case 'lte':\n where[field] = { lte: value };\n break;\n case 'in':\n where[field] = { in: value };\n break;\n case 'nin':\n where[field] = { notIn: value };\n break;\n case 'like':\n where[field] = { contains: value };\n break;\n case 'ilike':\n where[field] = { contains: value, mode: 'insensitive' };\n break;\n }\n }\n\n return where;\n }\n\n /**\n * Build Prisma orderBy clause from sort options\n */\n public static buildOrderByClause(sorts: SortOptions[]): Record<string, string>[] {\n return sorts.map((sort) => ({\n [sort.field]: sort.direction,\n }));\n }\n\n /**\n * Parse database URL\n */\n public static parseDatabaseUrl(url: string): {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n } {\n try {\n const urlObj = new URL(url);\n\n const params: Record<string, string> = {};\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return {\n protocol: urlObj.protocol.replace(':', ''),\n host: urlObj.hostname,\n port: urlObj.port ? parseInt(urlObj.port, 10) : undefined,\n database: urlObj.pathname.substring(1),\n username: urlObj.username || undefined,\n password: urlObj.password || undefined,\n params: Object.keys(params).length > 0 ? params : undefined,\n };\n } catch (error) {\n throw new ValidationError('Invalid database URL', {\n url,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Build database URL\n */\n public static buildDatabaseUrl(options: {\n protocol: string;\n host: string;\n port?: number;\n database: string;\n username?: string;\n password?: string;\n params?: Record<string, string>;\n }): string {\n let url = `${options.protocol}://`;\n\n if (options.username) {\n url += options.username;\n if (options.password) {\n url += `:${options.password}`;\n }\n url += '@';\n }\n\n url += options.host;\n\n if (options.port) {\n url += `:${options.port}`;\n }\n\n url += `/${options.database}`;\n\n if (options.params && Object.keys(options.params).length > 0) {\n const params = new URLSearchParams(options.params);\n url += `?${params.toString()}`;\n }\n\n return url;\n }\n\n /**\n * Sanitize database URL for logging (remove password)\n */\n public static sanitizeDatabaseUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n if (urlObj.password) {\n // eslint-disable-next-line sonarjs/no-hardcoded-passwords -- Redacting password for logging, not hardcoding\n urlObj.password = '***';\n }\n return urlObj.toString();\n } catch {\n return url;\n }\n }\n\n /**\n * Validate database connection URL\n */\n public static validateDatabaseUrl(url: string): boolean {\n try {\n const parsed = this.parseDatabaseUrl(url);\n return !!(parsed.protocol && parsed.host && parsed.database);\n } catch {\n return false;\n }\n }\n\n /**\n * Create connection pool config\n */\n public static createPoolConfig(config: DatabaseConfig): {\n min: number;\n max: number;\n acquireTimeoutMillis: number;\n idleTimeoutMillis: number;\n } {\n return {\n min: 2,\n max: config.poolSize || 10,\n acquireTimeoutMillis: config.connectionTimeout || 30000,\n idleTimeoutMillis: 30000,\n };\n }\n\n /**\n * Generate migration name\n */\n public static generateMigrationName(description: string): string {\n const timestamp = new Date().toISOString().replace(/[-:]/g, '').split('.')[0];\n\n // Convert to slug format\n let slug = description.toLowerCase().replace(/[^a-z0-9]+/g, '_');\n\n // Manually trim underscores to avoid slow-regex warning\n while (slug.startsWith('_')) {\n slug = slug.slice(1);\n }\n while (slug.endsWith('_')) {\n slug = slug.slice(0, -1);\n }\n\n return `${timestamp}_${slug}`;\n }\n\n /**\n * Build select clause for specific fields\n */\n public static buildSelectClause(fields: string[]): Record<string, boolean> {\n const select: Record<string, boolean> = {};\n for (const field of fields) {\n select[field] = true;\n }\n return select;\n }\n\n /**\n * Build include clause for relations\n */\n public static buildIncludeClause(relations: string[]): Record<string, boolean> {\n const include: Record<string, boolean> = {};\n for (const relation of relations) {\n include[relation] = true;\n }\n return include;\n }\n\n /**\n * Retry database operation\n */\n public static async retry<T>(\n operation: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: number;\n } = {}\n ): Promise<T> {\n const maxAttempts = options.maxAttempts || 3;\n const initialDelay = options.delay || 1000;\n const backoff = options.backoff || 2;\n\n let lastError: Error | undefined;\n let delay = initialDelay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n logger.warn(`[Database] Operation failed (attempt ${attempt}/${maxAttempts})`, { error });\n\n if (attempt < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay *= backoff;\n }\n }\n }\n\n throw lastError || new Error('Database operation failed after retries');\n }\n\n /**\n * Execute in transaction\n */\n public static async transaction<T>(\n prisma: unknown,\n operations: Array<(tx: unknown) => Promise<unknown>>\n ): Promise<T[]> {\n logger.debug('[Database] Starting transaction');\n\n if (!prisma || typeof prisma !== 'object' || !('$transaction' in prisma)) {\n throw new ValidationError('Invalid Prisma client provided');\n }\n\n const client = prisma as { $transaction: (ops: Array<Promise<unknown>>) => Promise<unknown[]> };\n\n try {\n const promises = operations.map((op) => op(prisma));\n const results = await client.$transaction(promises);\n\n logger.info('[Database] Transaction completed successfully');\n\n return results as T[];\n } catch (error) {\n logger.error('[Database] Transaction failed', { error });\n throw error;\n }\n }\n\n /**\n * Check database health\n */\n public static async healthCheck(prisma: unknown): Promise<boolean> {\n try {\n if (!prisma || typeof prisma !== 'object' || !('$queryRaw' in prisma)) {\n return false;\n }\n\n const client = prisma as { $queryRaw: (query: unknown) => Promise<unknown> };\n\n // Simple query to check connection\n await client.$queryRaw`SELECT 1`;\n\n return true;\n } catch (error) {\n logger.error('[Database] Health check failed', { error });\n return false;\n }\n }\n\n /**\n * Format Prisma error for user-friendly message\n */\n public static formatPrismaError(error: unknown): string {\n if (!error || typeof error !== 'object') {\n return 'Database error occurred';\n }\n\n const err = error as { code?: string; meta?: { target?: string[] } };\n\n switch (err.code) {\n case 'P2002':\n return `A record with this ${err.meta?.target?.join(', ') || 'value'} already exists`;\n case 'P2025':\n return 'Record not found';\n case 'P2003':\n return 'Foreign key constraint failed';\n case 'P2016':\n return 'Query interpretation error';\n case 'P2021':\n return 'Table does not exist in the database';\n case 'P2022':\n return 'Column does not exist in the database';\n default:\n return 'Database operation failed';\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ValidationError, PermissionDeniedError } from './chunk-
|
|
2
|
-
import { DEFAULT_GATEWAY_ROUTING, DEFAULT_LAYER_RESOURCES } from './chunk-
|
|
1
|
+
import { ValidationError, PermissionDeniedError } from './chunk-EZ4PKRUK.js';
|
|
2
|
+
import { DEFAULT_GATEWAY_ROUTING, DEFAULT_LAYER_RESOURCES } from './chunk-YFOHAHZE.js';
|
|
3
3
|
import { logger } from './chunk-CBZNP6RF.js';
|
|
4
4
|
import { __name } from './chunk-XE4OXN2W.js';
|
|
5
5
|
import { GraphQLError } from 'graphql';
|
|
@@ -1491,5 +1491,5 @@ var RBACModule = class {
|
|
|
1491
1491
|
};
|
|
1492
1492
|
|
|
1493
1493
|
export { RBACClient, RBACModule, createRBACClientFromEnv, createRBACDirective, createRBACDirectiveForLayer, createRBACDirectiveFromEnv };
|
|
1494
|
-
//# sourceMappingURL=chunk-
|
|
1495
|
-
//# sourceMappingURL=chunk-
|
|
1494
|
+
//# sourceMappingURL=chunk-6NB7P6SR.js.map
|
|
1495
|
+
//# sourceMappingURL=chunk-6NB7P6SR.js.map
|