@burdenoff/be-sdk 2026.510.79

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 (220) hide show
  1. package/README.md +173 -0
  2. package/configs/eslint/index.js +492 -0
  3. package/configs/tsconfig/tsconfig.json +53 -0
  4. package/dist/EventQueueFactory-6NMSGECR.js +8 -0
  5. package/dist/EventQueueFactory-6NMSGECR.js.map +1 -0
  6. package/dist/auth/index.d.ts +66 -0
  7. package/dist/auth/index.js +8 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/cache/index.d.ts +2 -0
  10. package/dist/cache/index.js +6 -0
  11. package/dist/cache/index.js.map +1 -0
  12. package/dist/captcha/index.d.ts +1 -0
  13. package/dist/captcha/index.js +4 -0
  14. package/dist/captcha/index.js.map +1 -0
  15. package/dist/chunk-2HANKZZM.js +245 -0
  16. package/dist/chunk-2HANKZZM.js.map +1 -0
  17. package/dist/chunk-2SD5L2F2.js +816 -0
  18. package/dist/chunk-2SD5L2F2.js.map +1 -0
  19. package/dist/chunk-3O2RQOPV.js +1068 -0
  20. package/dist/chunk-3O2RQOPV.js.map +1 -0
  21. package/dist/chunk-4B43DZIS.js +560 -0
  22. package/dist/chunk-4B43DZIS.js.map +1 -0
  23. package/dist/chunk-4XAEES25.js +2444 -0
  24. package/dist/chunk-4XAEES25.js.map +1 -0
  25. package/dist/chunk-4XGGWW36.js +1405 -0
  26. package/dist/chunk-4XGGWW36.js.map +1 -0
  27. package/dist/chunk-5LXDPGDH.js +245 -0
  28. package/dist/chunk-5LXDPGDH.js.map +1 -0
  29. package/dist/chunk-AI7L22ZJ.js +472 -0
  30. package/dist/chunk-AI7L22ZJ.js.map +1 -0
  31. package/dist/chunk-CBZNP6RF.js +286 -0
  32. package/dist/chunk-CBZNP6RF.js.map +1 -0
  33. package/dist/chunk-ELLX3K54.js +613 -0
  34. package/dist/chunk-ELLX3K54.js.map +1 -0
  35. package/dist/chunk-F5XEAGHQ.js +1875 -0
  36. package/dist/chunk-F5XEAGHQ.js.map +1 -0
  37. package/dist/chunk-FNZEQOJY.js +628 -0
  38. package/dist/chunk-FNZEQOJY.js.map +1 -0
  39. package/dist/chunk-GTEMQXCA.js +516 -0
  40. package/dist/chunk-GTEMQXCA.js.map +1 -0
  41. package/dist/chunk-HIWTWIGQ.js +226 -0
  42. package/dist/chunk-HIWTWIGQ.js.map +1 -0
  43. package/dist/chunk-IYE2NTRX.js +764 -0
  44. package/dist/chunk-IYE2NTRX.js.map +1 -0
  45. package/dist/chunk-J26YGR2U.js +1484 -0
  46. package/dist/chunk-J26YGR2U.js.map +1 -0
  47. package/dist/chunk-JG2FTZPI.js +509 -0
  48. package/dist/chunk-JG2FTZPI.js.map +1 -0
  49. package/dist/chunk-JVBTNSPG.js +1551 -0
  50. package/dist/chunk-JVBTNSPG.js.map +1 -0
  51. package/dist/chunk-L7ZMN2FJ.js +12 -0
  52. package/dist/chunk-L7ZMN2FJ.js.map +1 -0
  53. package/dist/chunk-M5IMU3US.js +473 -0
  54. package/dist/chunk-M5IMU3US.js.map +1 -0
  55. package/dist/chunk-MLW2HPS5.js +1267 -0
  56. package/dist/chunk-MLW2HPS5.js.map +1 -0
  57. package/dist/chunk-MNCGUYLJ.js +269 -0
  58. package/dist/chunk-MNCGUYLJ.js.map +1 -0
  59. package/dist/chunk-MOCUBSTW.js +373 -0
  60. package/dist/chunk-MOCUBSTW.js.map +1 -0
  61. package/dist/chunk-NGMEI42S.js +103 -0
  62. package/dist/chunk-NGMEI42S.js.map +1 -0
  63. package/dist/chunk-NUB5GQTU.js +270 -0
  64. package/dist/chunk-NUB5GQTU.js.map +1 -0
  65. package/dist/chunk-OVSYMNCI.js +145 -0
  66. package/dist/chunk-OVSYMNCI.js.map +1 -0
  67. package/dist/chunk-QLVKMWFA.js +94 -0
  68. package/dist/chunk-QLVKMWFA.js.map +1 -0
  69. package/dist/chunk-SAG6ZYWQ.js +89 -0
  70. package/dist/chunk-SAG6ZYWQ.js.map +1 -0
  71. package/dist/chunk-SAK2JCA7.js +198 -0
  72. package/dist/chunk-SAK2JCA7.js.map +1 -0
  73. package/dist/chunk-SBS4S2PJ.js +100 -0
  74. package/dist/chunk-SBS4S2PJ.js.map +1 -0
  75. package/dist/chunk-SNEOLWXT.js +148 -0
  76. package/dist/chunk-SNEOLWXT.js.map +1 -0
  77. package/dist/chunk-TKBD2ONF.js +564 -0
  78. package/dist/chunk-TKBD2ONF.js.map +1 -0
  79. package/dist/chunk-UBXFIIAW.js +127 -0
  80. package/dist/chunk-UBXFIIAW.js.map +1 -0
  81. package/dist/chunk-VI4VSNTI.js +57 -0
  82. package/dist/chunk-VI4VSNTI.js.map +1 -0
  83. package/dist/chunk-VWCN5PMD.js +268 -0
  84. package/dist/chunk-VWCN5PMD.js.map +1 -0
  85. package/dist/chunk-XC2YD6CF.js +913 -0
  86. package/dist/chunk-XC2YD6CF.js.map +1 -0
  87. package/dist/chunk-XE4OXN2W.js +10 -0
  88. package/dist/chunk-XE4OXN2W.js.map +1 -0
  89. package/dist/chunk-YMZEUTD2.js +110 -0
  90. package/dist/chunk-YMZEUTD2.js.map +1 -0
  91. package/dist/chunk-Z4IRLBWO.js +758 -0
  92. package/dist/chunk-Z4IRLBWO.js.map +1 -0
  93. package/dist/client/internal-client.d.ts +7 -0
  94. package/dist/client/internal-client.js +5 -0
  95. package/dist/client/internal-client.js.map +1 -0
  96. package/dist/client-CSjIrYKS.d.ts +77 -0
  97. package/dist/config-UKE2E3BW.js +4 -0
  98. package/dist/config-UKE2E3BW.js.map +1 -0
  99. package/dist/crypto/index.d.ts +1 -0
  100. package/dist/crypto/index.js +4 -0
  101. package/dist/crypto/index.js.map +1 -0
  102. package/dist/database/index.d.ts +117 -0
  103. package/dist/database/index.js +7 -0
  104. package/dist/database/index.js.map +1 -0
  105. package/dist/dataloader/index.d.ts +1 -0
  106. package/dist/dataloader/index.js +4 -0
  107. package/dist/dataloader/index.js.map +1 -0
  108. package/dist/esm-K6H7EIWK.js +1450 -0
  109. package/dist/esm-K6H7EIWK.js.map +1 -0
  110. package/dist/event-queue/index.d.ts +6 -0
  111. package/dist/event-queue/index.js +10 -0
  112. package/dist/event-queue/index.js.map +1 -0
  113. package/dist/export/index.d.ts +2 -0
  114. package/dist/export/index.js +9 -0
  115. package/dist/export/index.js.map +1 -0
  116. package/dist/feature-flags/index.d.ts +1 -0
  117. package/dist/feature-flags/index.js +4 -0
  118. package/dist/feature-flags/index.js.map +1 -0
  119. package/dist/gateway/index.d.ts +4 -0
  120. package/dist/gateway/index.js +8 -0
  121. package/dist/gateway/index.js.map +1 -0
  122. package/dist/gateway/security/index.d.ts +2 -0
  123. package/dist/gateway/security/index.js +5 -0
  124. package/dist/gateway/security/index.js.map +1 -0
  125. package/dist/graph/index.d.ts +9 -0
  126. package/dist/graph/index.js +13 -0
  127. package/dist/graph/index.js.map +1 -0
  128. package/dist/graph-emitter-Bk0FqD53.d.ts +47 -0
  129. package/dist/graphql/index.d.ts +2 -0
  130. package/dist/graphql/index.js +7 -0
  131. package/dist/graphql/index.js.map +1 -0
  132. package/dist/graphql/services/index.d.ts +24 -0
  133. package/dist/graphql/services/index.js +5 -0
  134. package/dist/graphql/services/index.js.map +1 -0
  135. package/dist/graphql-BAVrUgBF.d.ts +22 -0
  136. package/dist/i18n/index.d.ts +2 -0
  137. package/dist/i18n/index.js +5 -0
  138. package/dist/i18n/index.js.map +1 -0
  139. package/dist/i18n-DA6IPnYy.d.ts +101 -0
  140. package/dist/index-4gKQKZ2B.d.ts +71 -0
  141. package/dist/index-B18rrFru.d.ts +42 -0
  142. package/dist/index-B70b5mYS.d.ts +33 -0
  143. package/dist/index-BMq3lFjj.d.ts +247 -0
  144. package/dist/index-BODgvRtL.d.ts +316 -0
  145. package/dist/index-BS2idbnr.d.ts +874 -0
  146. package/dist/index-BV3G48cH.d.ts +124 -0
  147. package/dist/index-CHbVw5M7.d.ts +73 -0
  148. package/dist/index-Cq_xNjcv.d.ts +602 -0
  149. package/dist/index-CrQgidpx.d.ts +77 -0
  150. package/dist/index-CyVEg86m.d.ts +309 -0
  151. package/dist/index-DOcBnmMe.d.ts +166 -0
  152. package/dist/index-DSOpj8DI.d.ts +17 -0
  153. package/dist/index-DW9q22GH.d.ts +75 -0
  154. package/dist/index-DlFDFyWD.d.ts +55 -0
  155. package/dist/index-DoK0bjhH.d.ts +607 -0
  156. package/dist/index-Dtf6FBaD.d.ts +199 -0
  157. package/dist/index-KVWGHMbS.d.ts +415 -0
  158. package/dist/index-PaojfSdd.d.ts +71 -0
  159. package/dist/index-RU_M5c74.d.ts +163 -0
  160. package/dist/index-UhkH2eaB.d.ts +192 -0
  161. package/dist/index-e_18DzAg.d.ts +18 -0
  162. package/dist/index-jOuh_TKn.d.ts +59 -0
  163. package/dist/index.d.ts +584 -0
  164. package/dist/index.js +2626 -0
  165. package/dist/index.js.map +1 -0
  166. package/dist/init/index.d.ts +2 -0
  167. package/dist/init/index.js +12 -0
  168. package/dist/init/index.js.map +1 -0
  169. package/dist/instrumentation/index.d.ts +3 -0
  170. package/dist/instrumentation/index.js +5 -0
  171. package/dist/instrumentation/index.js.map +1 -0
  172. package/dist/layer/index.d.ts +2 -0
  173. package/dist/layer/index.js +6 -0
  174. package/dist/layer/index.js.map +1 -0
  175. package/dist/layer-DDip18KY.d.ts +67 -0
  176. package/dist/logger/index.d.ts +2 -0
  177. package/dist/logger/index.js +4 -0
  178. package/dist/logger/index.js.map +1 -0
  179. package/dist/middleware/index.d.ts +3 -0
  180. package/dist/middleware/index.js +5 -0
  181. package/dist/middleware/index.js.map +1 -0
  182. package/dist/notifications/index.d.ts +4 -0
  183. package/dist/notifications/index.js +7 -0
  184. package/dist/notifications/index.js.map +1 -0
  185. package/dist/observability/index.d.ts +3 -0
  186. package/dist/observability/index.js +5 -0
  187. package/dist/observability/index.js.map +1 -0
  188. package/dist/pino-logger-RYLGXPHZ.js +5 -0
  189. package/dist/pino-logger-RYLGXPHZ.js.map +1 -0
  190. package/dist/prisma/generator/index.d.ts +1 -0
  191. package/dist/prisma/generator/index.js +228 -0
  192. package/dist/prisma/generator/index.js.map +1 -0
  193. package/dist/prisma/index.d.ts +5 -0
  194. package/dist/prisma/index.js +12 -0
  195. package/dist/prisma/index.js.map +1 -0
  196. package/dist/prisma-extension-krXnYnrN.d.ts +30 -0
  197. package/dist/rbac/index.d.ts +116 -0
  198. package/dist/rbac/index.js +7 -0
  199. package/dist/rbac/index.js.map +1 -0
  200. package/dist/sdk-THO3IWEE.js +136 -0
  201. package/dist/sdk-THO3IWEE.js.map +1 -0
  202. package/dist/server/index.d.ts +359 -0
  203. package/dist/server/index.js +884 -0
  204. package/dist/server/index.js.map +1 -0
  205. package/dist/telemetry/index.d.ts +83 -0
  206. package/dist/telemetry/index.js +209 -0
  207. package/dist/telemetry/index.js.map +1 -0
  208. package/dist/temporal/index.d.ts +148 -0
  209. package/dist/temporal/index.js +6 -0
  210. package/dist/temporal/index.js.map +1 -0
  211. package/dist/tracker/index.d.ts +5 -0
  212. package/dist/tracker/index.js +9 -0
  213. package/dist/tracker/index.js.map +1 -0
  214. package/dist/types-Bo2wkjSP.d.ts +35 -0
  215. package/dist/utils/index.d.ts +1 -0
  216. package/dist/utils/index.js +4 -0
  217. package/dist/utils/index.js.map +1 -0
  218. package/dist/workspace-guard-LHBNK4TG.js +5 -0
  219. package/dist/workspace-guard-LHBNK4TG.js.map +1 -0
  220. package/package.json +241 -0
@@ -0,0 +1,89 @@
1
+ import { __name } from './chunk-XE4OXN2W.js';
2
+
3
+ // src/types/index.ts
4
+ var SDKError = class _SDKError extends Error {
5
+ static {
6
+ __name(this, "SDKError");
7
+ }
8
+ code;
9
+ details;
10
+ constructor(message, code, details) {
11
+ super(message), this.code = code, this.details = details;
12
+ this.name = "SDKError";
13
+ Object.setPrototypeOf(this, _SDKError.prototype);
14
+ }
15
+ };
16
+ var PermissionDeniedError = class _PermissionDeniedError extends SDKError {
17
+ static {
18
+ __name(this, "PermissionDeniedError");
19
+ }
20
+ constructor(message, details) {
21
+ super(message, "PERMISSION_DENIED", details);
22
+ this.name = "PermissionDeniedError";
23
+ Object.setPrototypeOf(this, _PermissionDeniedError.prototype);
24
+ }
25
+ };
26
+ var AuthenticationError = class _AuthenticationError extends SDKError {
27
+ static {
28
+ __name(this, "AuthenticationError");
29
+ }
30
+ constructor(message, details) {
31
+ super(message, "AUTHENTICATION_ERROR", details);
32
+ this.name = "AuthenticationError";
33
+ Object.setPrototypeOf(this, _AuthenticationError.prototype);
34
+ }
35
+ };
36
+ var APIError = class _APIError extends SDKError {
37
+ static {
38
+ __name(this, "APIError");
39
+ }
40
+ constructor(message, details) {
41
+ super(message, "API_ERROR", details);
42
+ this.name = "APIError";
43
+ Object.setPrototypeOf(this, _APIError.prototype);
44
+ }
45
+ };
46
+ var ValidationError = class _ValidationError extends SDKError {
47
+ static {
48
+ __name(this, "ValidationError");
49
+ }
50
+ constructor(message, details) {
51
+ super(message, "VALIDATION_ERROR", details);
52
+ this.name = "ValidationError";
53
+ Object.setPrototypeOf(this, _ValidationError.prototype);
54
+ }
55
+ };
56
+ var QuotaExceededError = class _QuotaExceededError extends SDKError {
57
+ static {
58
+ __name(this, "QuotaExceededError");
59
+ }
60
+ constructor(message, details) {
61
+ super(message, "QUOTA_EXCEEDED", details);
62
+ this.name = "QuotaExceededError";
63
+ Object.setPrototypeOf(this, _QuotaExceededError.prototype);
64
+ }
65
+ };
66
+ var NetworkError = class _NetworkError extends SDKError {
67
+ static {
68
+ __name(this, "NetworkError");
69
+ }
70
+ constructor(message, details) {
71
+ super(message, "NETWORK_ERROR", details);
72
+ this.name = "NetworkError";
73
+ Object.setPrototypeOf(this, _NetworkError.prototype);
74
+ }
75
+ };
76
+ var TimeoutError = class _TimeoutError extends SDKError {
77
+ static {
78
+ __name(this, "TimeoutError");
79
+ }
80
+ constructor(message, details) {
81
+ super(message, "TIMEOUT_ERROR", details);
82
+ this.name = "TimeoutError";
83
+ Object.setPrototypeOf(this, _TimeoutError.prototype);
84
+ }
85
+ };
86
+
87
+ export { APIError, AuthenticationError, NetworkError, PermissionDeniedError, QuotaExceededError, TimeoutError, ValidationError };
88
+ //# sourceMappingURL=chunk-SAG6ZYWQ.js.map
89
+ //# sourceMappingURL=chunk-SAG6ZYWQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/index.ts"],"names":["SDKError","Error","message","code","details","name","Object","setPrototypeOf","prototype","PermissionDeniedError","AuthenticationError","APIError","ValidationError","QuotaExceededError","NetworkError","TimeoutError"],"mappings":"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","file":"chunk-SAG6ZYWQ.js","sourcesContent":["/**\n * Core type definitions for Burdenoff Backend SDK\n */\n\n/**\n * SDK Configuration\n */\nexport interface SDKConfig {\n /** Workspaces API GraphQL endpoint (should point to wspace-int-gateway for M2M calls) */\n workspacesApiUrl: string;\n /** Tenant API GraphQL endpoint (should point to global-int-gateway for M2M calls) */\n tenantApiUrl?: string;\n /** Default timeout for API requests in milliseconds */\n timeout?: number;\n /** Retry configuration */\n retry?: RetryConfig;\n /** Logger configuration */\n logger?: LoggerConfig;\n /** NATS configuration */\n nats?: NATSSDKConfig;\n /** Temporal module type (workspace or tenant) */\n temporalModuleType?: 'workspace' | 'tenant';\n /** Temporal server address */\n temporalAddress?: string;\n /** Temporal namespace */\n temporalNamespace?: string;\n /** Temporal task queue */\n temporalTaskQueue?: string;\n /** Auto-connect to Temporal (default: true) */\n temporalAutoConnect?: boolean;\n}\n\n/**\n * Retry configuration for API requests\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts */\n maxAttempts: number;\n /** Initial retry delay in milliseconds */\n initialDelay: number;\n /** Maximum retry delay in milliseconds */\n maxDelay: number;\n /** Backoff multiplier */\n backoffMultiplier: number;\n}\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Log level */\n level: 'debug' | 'info' | 'warn' | 'error';\n /** Enable console output */\n console: boolean;\n /** Custom logger transport */\n transport?: LoggerTransport;\n}\n\n/**\n * Custom logger transport interface\n */\nexport interface LoggerTransport {\n log(level: string, message: string, meta?: Record<string, unknown>): void;\n}\n\n/**\n * Actor type for RBAC authorization\n * - user: Direct user request (via frontend)\n * - app: OAuth app acting on behalf of user\n * - service: M2M service-to-service communication\n * - super_admin: Platform administration (bypasses all checks)\n */\nexport type ActorType = 'user' | 'app' | 'service' | 'super_admin';\n\n/**\n * Request context passed with every SDK operation\n */\nexport interface SDKContext {\n /** Actor ID - identifies the entity making the request */\n actorId?: string;\n /** Actor type - determines authorization behavior */\n actorType?: ActorType;\n /** Workspace ID */\n workspaceId?: string;\n /** Tenant ID */\n tenantId?: string;\n /** Project ID */\n projectId?: string;\n /** App ID */\n appId?: string;\n /** JWT token for authentication */\n token?: string;\n /** Product ID */\n productId?: string;\n /** Additional custom context */\n [key: string]: unknown;\n}\n\n/**\n * SDK Error base class\n */\nexport class SDKError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'SDKError';\n Object.setPrototypeOf(this, SDKError.prototype);\n }\n}\n\n/**\n * Permission denied error\n */\nexport class PermissionDeniedError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'PERMISSION_DENIED', details);\n this.name = 'PermissionDeniedError';\n Object.setPrototypeOf(this, PermissionDeniedError.prototype);\n }\n}\n\n/**\n * Authentication error\n */\nexport class AuthenticationError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'AUTHENTICATION_ERROR', details);\n this.name = 'AuthenticationError';\n Object.setPrototypeOf(this, AuthenticationError.prototype);\n }\n}\n\n/**\n * API error from backend\n */\nexport class APIError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'API_ERROR', details);\n this.name = 'APIError';\n Object.setPrototypeOf(this, APIError.prototype);\n }\n}\n\n/**\n * Validation error\n */\nexport class ValidationError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'VALIDATION_ERROR', details);\n this.name = 'ValidationError';\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\n/**\n * Quota exceeded error\n */\nexport class QuotaExceededError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'QUOTA_EXCEEDED', details);\n this.name = 'QuotaExceededError';\n Object.setPrototypeOf(this, QuotaExceededError.prototype);\n }\n}\n\n/**\n * Network error\n */\nexport class NetworkError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'NETWORK_ERROR', details);\n this.name = 'NetworkError';\n Object.setPrototypeOf(this, NetworkError.prototype);\n }\n}\n\n/**\n * Timeout error\n */\nexport class TimeoutError extends SDKError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(message, 'TIMEOUT_ERROR', details);\n this.name = 'TimeoutError';\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\n/**\n * NATS SDK Configuration\n */\nexport interface NATSSDKConfig {\n /** NATS server URL (single URL, preferred) */\n url?: string;\n /** NATS server URLs (array, alternative to url) */\n servers?: string[];\n /** Username for authentication */\n user?: string;\n /** Password for authentication */\n password?: string;\n /** Token for authentication */\n token?: string;\n /** Maximum reconnect attempts (default: -1 = infinite) */\n maxReconnectAttempts?: number;\n /** Reconnect time wait in milliseconds (default: 2000) */\n reconnectTimeWait?: number;\n /** Client name for logging (default: service name) */\n name?: string;\n /** Auto-connect on SDK initialization (default: true) */\n autoConnect?: boolean;\n}\n\n/**\n * NATS health status\n */\nexport interface NatsHealthStatus {\n status: 'healthy' | 'unhealthy' | 'not_configured';\n connected: boolean;\n url?: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Temporal health status\n */\nexport interface TemporalHealthStatus {\n status: 'healthy' | 'unhealthy' | 'not_configured';\n connected: boolean;\n address?: string;\n namespace?: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Overall SDK health status\n */\nexport interface SDKHealthStatus {\n nats: NatsHealthStatus;\n temporal: TemporalHealthStatus;\n}\n\n/**\n * SDK shutdown options\n */\nexport interface SDKShutdownOptions {\n /** Shutdown timeout in milliseconds (default: 5000) */\n timeout?: number;\n /** Force shutdown even if timeout is exceeded (default: true) */\n force?: boolean;\n}\n\n// ============================================================================\n// Layer Types Export\n// ============================================================================\n\n/**\n * Re-export all layer-related types for convenience\n */\nexport type {\n ServiceLayer,\n LayerConfig,\n LayerGatewayConfig,\n LayerResourceUrls,\n LayerFullConfig,\n GatewayRoutingConfig,\n CircuitBreakerConfig,\n GatewayRetryConfig,\n GatewayRequestHeaders,\n} from './layer.js';\n\nexport {\n DEFAULT_GATEWAY_ROUTING,\n DEFAULT_LAYER_RESOURCES,\n DEFAULT_LAYER_STREAMS,\n DEFAULT_CIRCUIT_BREAKER_CONFIG,\n DEFAULT_GATEWAY_RETRY_CONFIG,\n} from './layer.js';\n"]}
@@ -0,0 +1,198 @@
1
+ import { isTokenExpired, parseJWT } from './chunk-MOCUBSTW.js';
2
+ import { AuthenticationError } from './chunk-SAG6ZYWQ.js';
3
+ import { logger } from './chunk-CBZNP6RF.js';
4
+ import { __name } from './chunk-XE4OXN2W.js';
5
+
6
+ // src/auth/index.ts
7
+ var ACCESS_TOKEN_COOKIE = "bf_access_token";
8
+ var REFRESH_TOKEN_COOKIE = "bf_refresh_token";
9
+ var ACCESS_TOKEN_MAX_AGE = 15 * 60;
10
+ var REFRESH_TOKEN_MAX_AGE = 30 * 24 * 60 * 60;
11
+ var REFRESH_TOKEN_REMEMBER_MAX_AGE = 30 * 24 * 60 * 60;
12
+ function buildCookieString(name, value, maxAge) {
13
+ return `${name}=${value}; Max-Age=${maxAge}; Path=/; HttpOnly; SameSite=Strict`;
14
+ }
15
+ __name(buildCookieString, "buildCookieString");
16
+ function buildClearCookieString(name) {
17
+ return `${name}=; Max-Age=0; Path=/; HttpOnly; SameSite=Strict`;
18
+ }
19
+ __name(buildClearCookieString, "buildClearCookieString");
20
+ var AuthCookieHelper = {
21
+ setAuthCookies(context, tokens, options) {
22
+ const headers = context.responseHeaders;
23
+ if (!headers) return;
24
+ const rememberMe = options?.rememberMe ?? false;
25
+ const refreshMaxAge = rememberMe ? REFRESH_TOKEN_REMEMBER_MAX_AGE : REFRESH_TOKEN_MAX_AGE;
26
+ headers.append("Set-Cookie", buildCookieString(ACCESS_TOKEN_COOKIE, tokens.accessToken, ACCESS_TOKEN_MAX_AGE));
27
+ headers.append("Set-Cookie", buildCookieString(REFRESH_TOKEN_COOKIE, tokens.refreshToken, refreshMaxAge));
28
+ },
29
+ clearAuthCookies(context) {
30
+ const headers = context.responseHeaders;
31
+ if (!headers) return;
32
+ headers.append("Set-Cookie", buildClearCookieString(ACCESS_TOKEN_COOKIE));
33
+ headers.append("Set-Cookie", buildClearCookieString(REFRESH_TOKEN_COOKIE));
34
+ }
35
+ };
36
+ var AuthModule = class {
37
+ static {
38
+ __name(this, "AuthModule");
39
+ }
40
+ client;
41
+ context;
42
+ constructor(client, context) {
43
+ this.client = client;
44
+ this.context = context;
45
+ }
46
+ /**
47
+ * Verify JWT token
48
+ */
49
+ async verifyToken(token) {
50
+ logger.debug("[Auth] Verifying token");
51
+ if (isTokenExpired(token)) {
52
+ return {
53
+ valid: false,
54
+ error: "Token expired"
55
+ };
56
+ }
57
+ const query = `
58
+ query VerifyToken($token: String!) {
59
+ verifyToken(token: $token) {
60
+ valid
61
+ payload
62
+ error
63
+ }
64
+ }
65
+ `;
66
+ try {
67
+ const response = await this.client.query(query, {
68
+ token
69
+ }, this.context);
70
+ logger.debug("[Auth] Token verification result", {
71
+ valid: response.verifyToken.valid
72
+ });
73
+ return response.verifyToken;
74
+ } catch (error) {
75
+ logger.error("[Auth] Token verification failed", {
76
+ error
77
+ });
78
+ return {
79
+ valid: false,
80
+ error: error instanceof Error ? error.message : "Unknown error"
81
+ };
82
+ }
83
+ }
84
+ /**
85
+ * Decode token without verification
86
+ */
87
+ decodeToken(token) {
88
+ const payload = parseJWT(token);
89
+ if (!payload) {
90
+ return null;
91
+ }
92
+ return payload;
93
+ }
94
+ /**
95
+ * Refresh access token using refresh token
96
+ */
97
+ async refreshToken(refreshToken) {
98
+ logger.debug("[Auth] Refreshing token");
99
+ const mutation = `
100
+ mutation RefreshToken($refreshToken: String!) {
101
+ refreshToken(refreshToken: $refreshToken) {
102
+ accessToken
103
+ refreshToken
104
+ expiresIn
105
+ }
106
+ }
107
+ `;
108
+ try {
109
+ const response = await this.client.query(mutation, {
110
+ refreshToken
111
+ }, this.context);
112
+ logger.info("[Auth] Token refreshed successfully");
113
+ return response.refreshToken;
114
+ } catch (error) {
115
+ logger.error("[Auth] Token refresh failed", {
116
+ error
117
+ });
118
+ throw new AuthenticationError("Failed to refresh token", {
119
+ error: error instanceof Error ? error.message : "Unknown error"
120
+ });
121
+ }
122
+ }
123
+ /**
124
+ * Validate user has specific permission
125
+ */
126
+ async validatePermission(userId, permission, resourceId) {
127
+ logger.debug("[Auth] Validating permission", {
128
+ userId,
129
+ permission,
130
+ resourceId
131
+ });
132
+ const query = `
133
+ query ValidatePermission($userId: ID!, $permission: String!, $resourceId: ID) {
134
+ validatePermission(userId: $userId, permission: $permission, resourceId: $resourceId) {
135
+ allowed
136
+ }
137
+ }
138
+ `;
139
+ try {
140
+ const response = await this.client.query(query, {
141
+ userId,
142
+ permission,
143
+ resourceId
144
+ }, this.context);
145
+ logger.debug("[Auth] Permission validation result", {
146
+ allowed: response.validatePermission.allowed
147
+ });
148
+ return response.validatePermission.allowed;
149
+ } catch (error) {
150
+ logger.error("[Auth] Permission validation failed", {
151
+ error
152
+ });
153
+ return false;
154
+ }
155
+ }
156
+ /**
157
+ * Check if token is valid and not expired
158
+ */
159
+ isTokenValid(token) {
160
+ return !isTokenExpired(token);
161
+ }
162
+ /**
163
+ * Get user ID from token
164
+ */
165
+ getUserIdFromToken(token) {
166
+ const payload = this.decodeToken(token);
167
+ return payload?.user_id || null;
168
+ }
169
+ /**
170
+ * Get workspace ID from token
171
+ */
172
+ getWorkspaceIdFromToken(token) {
173
+ const payload = this.decodeToken(token);
174
+ return payload?.workspace_id || null;
175
+ }
176
+ /**
177
+ * Extract all claims from token
178
+ */
179
+ getTokenClaims(token) {
180
+ const payload = parseJWT(token);
181
+ return payload;
182
+ }
183
+ /**
184
+ * Check if token will expire soon (within given seconds)
185
+ */
186
+ willExpireSoon(token, withinSeconds = 300) {
187
+ const payload = this.decodeToken(token);
188
+ if (!payload || typeof payload.exp !== "number") {
189
+ return true;
190
+ }
191
+ const now = Math.floor(Date.now() / 1e3);
192
+ return payload.exp - now < withinSeconds;
193
+ }
194
+ };
195
+
196
+ export { AuthCookieHelper, AuthModule };
197
+ //# sourceMappingURL=chunk-SAK2JCA7.js.map
198
+ //# sourceMappingURL=chunk-SAK2JCA7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/index.ts"],"names":["ACCESS_TOKEN_COOKIE","REFRESH_TOKEN_COOKIE","ACCESS_TOKEN_MAX_AGE","REFRESH_TOKEN_MAX_AGE","REFRESH_TOKEN_REMEMBER_MAX_AGE","buildCookieString","name","value","maxAge","buildClearCookieString","AuthCookieHelper","setAuthCookies","context","tokens","options","headers","responseHeaders","rememberMe","refreshMaxAge","append","accessToken","refreshToken","clearAuthCookies","AuthModule","client","verifyToken","token","logger","debug","isTokenExpired","valid","error","query","response","Error","message","decodeToken","payload","parseJWT","mutation","info","AuthenticationError","validatePermission","userId","permission","resourceId","allowed","isTokenValid","getUserIdFromToken","user_id","getWorkspaceIdFromToken","workspace_id","getTokenClaims","willExpireSoon","withinSeconds","exp","now","Math","floor","Date"],"mappings":"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","file":"chunk-SAK2JCA7.js","sourcesContent":["/**\n * Authentication Module\n * JWT verification, token management, and user authentication\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { AuthenticationError } from '../types/index.js';\nimport { logger } from '../logger/index.js';\nimport { parseJWT, isTokenExpired } from '../utils/index.js';\n\ninterface CookieContext {\n responseHeaders?: Headers;\n [key: string]: unknown;\n}\n\nconst ACCESS_TOKEN_COOKIE = 'bf_access_token';\nconst REFRESH_TOKEN_COOKIE = 'bf_refresh_token';\nconst ACCESS_TOKEN_MAX_AGE = 15 * 60; // 15 minutes\nconst REFRESH_TOKEN_MAX_AGE = 30 * 24 * 60 * 60; // 30 days\nconst REFRESH_TOKEN_REMEMBER_MAX_AGE = 30 * 24 * 60 * 60; // 30 days (same, controlled by backend)\n\nfunction buildCookieString(name: string, value: string, maxAge: number): string {\n return `${name}=${value}; Max-Age=${maxAge}; Path=/; HttpOnly; SameSite=Strict`;\n}\n\nfunction buildClearCookieString(name: string): string {\n return `${name}=; Max-Age=0; Path=/; HttpOnly; SameSite=Strict`;\n}\n\nexport const AuthCookieHelper = {\n setAuthCookies(\n context: CookieContext,\n tokens: { accessToken: string; refreshToken: string },\n options?: { rememberMe?: boolean }\n ): void {\n const headers = context.responseHeaders;\n if (!headers) return;\n\n const rememberMe = options?.rememberMe ?? false;\n const refreshMaxAge = rememberMe ? REFRESH_TOKEN_REMEMBER_MAX_AGE : REFRESH_TOKEN_MAX_AGE;\n\n headers.append('Set-Cookie', buildCookieString(ACCESS_TOKEN_COOKIE, tokens.accessToken, ACCESS_TOKEN_MAX_AGE));\n headers.append('Set-Cookie', buildCookieString(REFRESH_TOKEN_COOKIE, tokens.refreshToken, refreshMaxAge));\n },\n\n clearAuthCookies(context: CookieContext): void {\n const headers = context.responseHeaders;\n if (!headers) return;\n\n headers.append('Set-Cookie', buildClearCookieString(ACCESS_TOKEN_COOKIE));\n headers.append('Set-Cookie', buildClearCookieString(REFRESH_TOKEN_COOKIE));\n },\n};\n\nexport interface TokenPayload {\n jti: string;\n sub: string;\n user_id: string;\n workspace_id?: string;\n org_id?: string;\n tenant_endpoint?: string;\n iat: number;\n exp: number;\n scope?: string;\n}\n\nexport interface VerifyTokenResult {\n valid: boolean;\n payload?: TokenPayload;\n error?: string;\n}\n\nexport interface RefreshTokenResult {\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n}\n\nexport * from './cookie-helper.js';\n\n/**\n * Authentication Module\n */\nexport class AuthModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Verify JWT token\n */\n public async verifyToken(token: string): Promise<VerifyTokenResult> {\n logger.debug('[Auth] Verifying token');\n\n // First check if token is expired locally\n if (isTokenExpired(token)) {\n return {\n valid: false,\n error: 'Token expired',\n };\n }\n\n const query = `\n query VerifyToken($token: String!) {\n verifyToken(token: $token) {\n valid\n payload\n error\n }\n }\n `;\n\n try {\n const response = await this.client.query<{ verifyToken: VerifyTokenResult }>(query, { token }, this.context);\n\n logger.debug('[Auth] Token verification result', { valid: response.verifyToken.valid });\n\n return response.verifyToken;\n } catch (error) {\n logger.error('[Auth] Token verification failed', { error });\n return {\n valid: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Decode token without verification\n */\n public decodeToken(token: string): TokenPayload | null {\n const payload = parseJWT(token);\n if (!payload) {\n return null;\n }\n return payload as unknown as TokenPayload;\n }\n\n /**\n * Refresh access token using refresh token\n */\n public async refreshToken(refreshToken: string): Promise<RefreshTokenResult> {\n logger.debug('[Auth] Refreshing token');\n\n const mutation = `\n mutation RefreshToken($refreshToken: String!) {\n refreshToken(refreshToken: $refreshToken) {\n accessToken\n refreshToken\n expiresIn\n }\n }\n `;\n\n try {\n const response = await this.client.query<{ refreshToken: RefreshTokenResult }>(\n mutation,\n { refreshToken },\n this.context\n );\n\n logger.info('[Auth] Token refreshed successfully');\n\n return response.refreshToken;\n } catch (error) {\n logger.error('[Auth] Token refresh failed', { error });\n throw new AuthenticationError('Failed to refresh token', {\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n /**\n * Validate user has specific permission\n */\n public async validatePermission(userId: string, permission: string, resourceId?: string): Promise<boolean> {\n logger.debug('[Auth] Validating permission', { userId, permission, resourceId });\n\n const query = `\n query ValidatePermission($userId: ID!, $permission: String!, $resourceId: ID) {\n validatePermission(userId: $userId, permission: $permission, resourceId: $resourceId) {\n allowed\n }\n }\n `;\n\n try {\n const response = await this.client.query<{\n validatePermission: { allowed: boolean };\n }>(query, { userId, permission, resourceId }, this.context);\n\n logger.debug('[Auth] Permission validation result', {\n allowed: response.validatePermission.allowed,\n });\n\n return response.validatePermission.allowed;\n } catch (error) {\n logger.error('[Auth] Permission validation failed', { error });\n return false;\n }\n }\n\n /**\n * Check if token is valid and not expired\n */\n public isTokenValid(token: string): boolean {\n return !isTokenExpired(token);\n }\n\n /**\n * Get user ID from token\n */\n public getUserIdFromToken(token: string): string | null {\n const payload = this.decodeToken(token);\n return payload?.user_id || null;\n }\n\n /**\n * Get workspace ID from token\n */\n public getWorkspaceIdFromToken(token: string): string | null {\n const payload = this.decodeToken(token);\n return payload?.workspace_id || null;\n }\n\n /**\n * Extract all claims from token\n */\n public getTokenClaims(token: string): Record<string, unknown> | null {\n const payload = parseJWT(token);\n return payload;\n }\n\n /**\n * Check if token will expire soon (within given seconds)\n */\n public willExpireSoon(token: string, withinSeconds: number = 300): boolean {\n const payload = this.decodeToken(token);\n if (!payload || typeof payload.exp !== 'number') {\n return true;\n }\n\n const now = Math.floor(Date.now() / 1000);\n return payload.exp - now < withinSeconds;\n }\n}\n"]}
@@ -0,0 +1,100 @@
1
+ import { __export, __name } from './chunk-XE4OXN2W.js';
2
+ import crypto from 'crypto';
3
+
4
+ // src/crypto/index.ts
5
+ var crypto_exports = {};
6
+ __export(crypto_exports, {
7
+ decrypt: () => decrypt,
8
+ decryptIfNeeded: () => decryptIfNeeded,
9
+ encrypt: () => encrypt,
10
+ encryptIfNeeded: () => encryptIfNeeded,
11
+ generateEncryptionKey: () => generateEncryptionKey,
12
+ isEncrypted: () => isEncrypted
13
+ });
14
+ var ALGORITHM = "aes-256-gcm";
15
+ var IV_LENGTH = 16;
16
+ var AUTH_TAG_LENGTH = 16;
17
+ function encrypt(text, key) {
18
+ if (!text) {
19
+ throw new Error("Text to encrypt cannot be empty");
20
+ }
21
+ if (!key || key.length !== 64) {
22
+ throw new Error("Encryption key must be a 64-character hex string (32 bytes)");
23
+ }
24
+ const iv = crypto.randomBytes(IV_LENGTH);
25
+ const cipher = crypto.createCipheriv(ALGORITHM, Buffer.from(key, "hex"), iv);
26
+ let encrypted = cipher.update(text, "utf8", "hex");
27
+ encrypted += cipher.final("hex");
28
+ const authTag = cipher.getAuthTag();
29
+ return `${iv.toString("hex")}:${authTag.toString("hex")}:${encrypted}`;
30
+ }
31
+ __name(encrypt, "encrypt");
32
+ function decrypt(encryptedText, key) {
33
+ if (!encryptedText) {
34
+ throw new Error("Encrypted text cannot be empty");
35
+ }
36
+ if (!key || key.length !== 64) {
37
+ throw new Error("Encryption key must be a 64-character hex string (32 bytes)");
38
+ }
39
+ const parts = encryptedText.split(":");
40
+ if (parts.length !== 3) {
41
+ throw new Error("Invalid encrypted text format. Expected: iv:authTag:ciphertext");
42
+ }
43
+ const [ivHex, authTagHex, encrypted] = parts;
44
+ if (!ivHex || !authTagHex || !encrypted) {
45
+ throw new Error("Invalid encrypted text format. Missing components.");
46
+ }
47
+ const iv = Buffer.from(ivHex, "hex");
48
+ const authTag = Buffer.from(authTagHex, "hex");
49
+ if (iv.length !== IV_LENGTH) {
50
+ throw new Error(`Invalid IV length. Expected ${IV_LENGTH} bytes.`);
51
+ }
52
+ if (authTag.length !== AUTH_TAG_LENGTH) {
53
+ throw new Error(`Invalid auth tag length. Expected ${AUTH_TAG_LENGTH} bytes.`);
54
+ }
55
+ const decipher = crypto.createDecipheriv(ALGORITHM, Buffer.from(key, "hex"), iv);
56
+ decipher.setAuthTag(authTag);
57
+ let decrypted = decipher.update(encrypted, "hex", "utf8");
58
+ decrypted += decipher.final("utf8");
59
+ return decrypted;
60
+ }
61
+ __name(decrypt, "decrypt");
62
+ function generateEncryptionKey() {
63
+ return crypto.randomBytes(32).toString("hex");
64
+ }
65
+ __name(generateEncryptionKey, "generateEncryptionKey");
66
+ function isEncrypted(text) {
67
+ if (!text) return false;
68
+ const parts = text.split(":");
69
+ if (parts.length !== 3) return false;
70
+ const [ivHex, authTagHex, ciphertext] = parts;
71
+ if (!ivHex || ivHex.length !== 32 || !/^[0-9a-f]+$/i.test(ivHex)) {
72
+ return false;
73
+ }
74
+ if (!authTagHex || authTagHex.length !== 32 || !/^[0-9a-f]+$/i.test(authTagHex)) {
75
+ return false;
76
+ }
77
+ if (!ciphertext || !/^[0-9a-f]+$/i.test(ciphertext)) {
78
+ return false;
79
+ }
80
+ return true;
81
+ }
82
+ __name(isEncrypted, "isEncrypted");
83
+ function encryptIfNeeded(text, key) {
84
+ if (isEncrypted(text)) {
85
+ return text;
86
+ }
87
+ return encrypt(text, key);
88
+ }
89
+ __name(encryptIfNeeded, "encryptIfNeeded");
90
+ function decryptIfNeeded(text, key) {
91
+ if (!isEncrypted(text)) {
92
+ return text;
93
+ }
94
+ return decrypt(text, key);
95
+ }
96
+ __name(decryptIfNeeded, "decryptIfNeeded");
97
+
98
+ export { crypto_exports, decrypt, decryptIfNeeded, encrypt, encryptIfNeeded, generateEncryptionKey, isEncrypted };
99
+ //# sourceMappingURL=chunk-SBS4S2PJ.js.map
100
+ //# sourceMappingURL=chunk-SBS4S2PJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/crypto/index.ts","../src/crypto/encryption.ts"],"names":["ALGORITHM","IV_LENGTH","AUTH_TAG_LENGTH","encrypt","text","key","Error","length","iv","crypto","randomBytes","cipher","createCipheriv","Buffer","from","encrypted","update","final","authTag","getAuthTag","toString","decrypt","encryptedText","parts","split","ivHex","authTagHex","decipher","createDecipheriv","setAuthTag","decrypted","generateEncryptionKey","isEncrypted","ciphertext","test","encryptIfNeeded","decryptIfNeeded"],"mappings":"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","file":"chunk-SBS4S2PJ.js","sourcesContent":["/**\n * Crypto module - Encryption utilities for sensitive data\n *\n * @module crypto\n *\n * @example\n * ```typescript\n * import { Crypto } from '@burdenoff/be-sdk';\n *\n * // Generate a key (do this once and store securely)\n * const key = Crypto.generateEncryptionKey();\n *\n * // Encrypt sensitive data\n * const encrypted = Crypto.encrypt('my-secret', key);\n *\n * // Decrypt when needed\n * const decrypted = Crypto.decrypt(encrypted, key);\n * ```\n */\n\nexport {\n encrypt,\n decrypt,\n generateEncryptionKey,\n isEncrypted,\n encryptIfNeeded,\n decryptIfNeeded,\n} from './encryption.js';\n","/**\n * AES-256-GCM Encryption utilities for sensitive data\n *\n * @module crypto/encryption\n */\n\nimport crypto from 'crypto';\n\nconst ALGORITHM = 'aes-256-gcm';\nconst IV_LENGTH = 16;\nconst AUTH_TAG_LENGTH = 16;\n\n/**\n * Encrypt a string using AES-256-GCM\n *\n * @param text - The plaintext to encrypt\n * @param key - 32-byte hex-encoded encryption key (64 hex characters)\n * @returns Encrypted string in format: iv:authTag:ciphertext (all hex-encoded)\n *\n * @example\n * ```typescript\n * import { encrypt, generateEncryptionKey } from '@burdenoff/be-sdk/crypto';\n *\n * const key = generateEncryptionKey();\n * const encrypted = encrypt('my-secret-data', key);\n * ```\n */\nexport function encrypt(text: string, key: string): string {\n if (!text) {\n throw new Error('Text to encrypt cannot be empty');\n }\n if (!key || key.length !== 64) {\n throw new Error('Encryption key must be a 64-character hex string (32 bytes)');\n }\n\n const iv = crypto.randomBytes(IV_LENGTH);\n const cipher = crypto.createCipheriv(ALGORITHM, Buffer.from(key, 'hex'), iv);\n\n let encrypted = cipher.update(text, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n const authTag = cipher.getAuthTag();\n\n return `${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted}`;\n}\n\n/**\n * Decrypt a string encrypted with AES-256-GCM\n *\n * @param encryptedText - Encrypted string in format: iv:authTag:ciphertext\n * @param key - 32-byte hex-encoded encryption key (64 hex characters)\n * @returns Decrypted plaintext\n *\n * @example\n * ```typescript\n * import { decrypt } from '@burdenoff/be-sdk/crypto';\n *\n * const decrypted = decrypt(encryptedData, key);\n * ```\n */\nexport function decrypt(encryptedText: string, key: string): string {\n if (!encryptedText) {\n throw new Error('Encrypted text cannot be empty');\n }\n if (!key || key.length !== 64) {\n throw new Error('Encryption key must be a 64-character hex string (32 bytes)');\n }\n\n const parts = encryptedText.split(':');\n if (parts.length !== 3) {\n throw new Error('Invalid encrypted text format. Expected: iv:authTag:ciphertext');\n }\n\n const [ivHex, authTagHex, encrypted] = parts;\n\n if (!ivHex || !authTagHex || !encrypted) {\n throw new Error('Invalid encrypted text format. Missing components.');\n }\n\n const iv = Buffer.from(ivHex, 'hex');\n const authTag = Buffer.from(authTagHex, 'hex');\n\n if (iv.length !== IV_LENGTH) {\n throw new Error(`Invalid IV length. Expected ${IV_LENGTH} bytes.`);\n }\n if (authTag.length !== AUTH_TAG_LENGTH) {\n throw new Error(`Invalid auth tag length. Expected ${AUTH_TAG_LENGTH} bytes.`);\n }\n\n const decipher = crypto.createDecipheriv(ALGORITHM, Buffer.from(key, 'hex'), iv);\n decipher.setAuthTag(authTag);\n\n let decrypted = decipher.update(encrypted, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n\n return decrypted;\n}\n\n/**\n * Generate a cryptographically secure encryption key\n *\n * @returns 64-character hex string (32 bytes) suitable for AES-256\n *\n * @example\n * ```typescript\n * import { generateEncryptionKey } from '@burdenoff/be-sdk/crypto';\n *\n * const key = generateEncryptionKey();\n * // Store this key securely (e.g., in environment variables)\n * console.log(key); // \"a1b2c3d4e5f6...\"\n * ```\n */\nexport function generateEncryptionKey(): string {\n return crypto.randomBytes(32).toString('hex');\n}\n\n/**\n * Check if a string appears to be encrypted (has the expected format)\n *\n * @param text - The string to check\n * @returns true if the string matches the encrypted format\n *\n * @example\n * ```typescript\n * import { isEncrypted } from '@burdenoff/be-sdk/crypto';\n *\n * if (!isEncrypted(data)) {\n * data = encrypt(data, key);\n * }\n * ```\n */\nexport function isEncrypted(text: string): boolean {\n if (!text) return false;\n\n const parts = text.split(':');\n if (parts.length !== 3) return false;\n\n const [ivHex, authTagHex, ciphertext] = parts;\n\n // Check IV is 32 hex chars (16 bytes)\n if (!ivHex || ivHex.length !== 32 || !/^[0-9a-f]+$/i.test(ivHex)) {\n return false;\n }\n\n // Check auth tag is 32 hex chars (16 bytes)\n if (!authTagHex || authTagHex.length !== 32 || !/^[0-9a-f]+$/i.test(authTagHex)) {\n return false;\n }\n\n // Check ciphertext exists and is hex\n if (!ciphertext || !/^[0-9a-f]+$/i.test(ciphertext)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Encrypt a value only if it's not already encrypted\n *\n * @param text - The text to potentially encrypt\n * @param key - The encryption key\n * @returns Encrypted text (either newly encrypted or unchanged if already encrypted)\n */\nexport function encryptIfNeeded(text: string, key: string): string {\n if (isEncrypted(text)) {\n return text;\n }\n return encrypt(text, key);\n}\n\n/**\n * Decrypt a value only if it appears to be encrypted\n *\n * @param text - The text to potentially decrypt\n * @param key - The encryption key\n * @returns Decrypted text (either newly decrypted or unchanged if not encrypted)\n */\nexport function decryptIfNeeded(text: string, key: string): string {\n if (!isEncrypted(text)) {\n return text;\n }\n return decrypt(text, key);\n}\n"]}
@@ -0,0 +1,148 @@
1
+ import { Logger } from './chunk-CBZNP6RF.js';
2
+ import { __name } from './chunk-XE4OXN2W.js';
3
+
4
+ // src/telemetry/pino-redaction.ts
5
+ var DEFAULT_REDACT_PATHS = Object.freeze([
6
+ "password",
7
+ "*.password",
8
+ "*.*.password",
9
+ "token",
10
+ "authToken",
11
+ "workspaceToken",
12
+ "accessToken",
13
+ "refreshToken",
14
+ "clientSecret",
15
+ "apiKey",
16
+ "*.apiKey",
17
+ "authorization",
18
+ "req.headers.authorization",
19
+ 'req.headers["x-workspace-authorization"]',
20
+ "req.headers.cookie",
21
+ 'res.headers["set-cookie"]',
22
+ "params.*.password",
23
+ "params.*.token",
24
+ "params.*.secret"
25
+ ]);
26
+
27
+ // src/telemetry/pino-logger.ts
28
+ async function tryLoadPino() {
29
+ try {
30
+ const mod = await import('pino');
31
+ const candidate = mod.default ?? mod;
32
+ if (typeof candidate === "function") {
33
+ return candidate;
34
+ }
35
+ return null;
36
+ } catch {
37
+ return null;
38
+ }
39
+ }
40
+ __name(tryLoadPino, "tryLoadPino");
41
+ var PinoAdapter = class PinoAdapter2 extends Logger {
42
+ static {
43
+ __name(this, "PinoAdapter");
44
+ }
45
+ pino;
46
+ constructor(pino) {
47
+ super({
48
+ level: pino.level ?? "info",
49
+ console: false
50
+ }), this.pino = pino;
51
+ }
52
+ debug(message, ...args) {
53
+ this.pino.debug(this.mergeArgs(args), message);
54
+ }
55
+ info(message, ...args) {
56
+ this.pino.info(this.mergeArgs(args), message);
57
+ }
58
+ warn(message, ...args) {
59
+ this.pino.warn(this.mergeArgs(args), message);
60
+ }
61
+ error(message, ...args) {
62
+ this.pino.error(this.mergeArgs(args), message);
63
+ }
64
+ log(message, ...args) {
65
+ this.pino.info(this.mergeArgs(args), message);
66
+ }
67
+ trace(message, ...args) {
68
+ this.pino.trace(this.mergeArgs(args), message);
69
+ }
70
+ mergeArgs(args) {
71
+ const out = {};
72
+ for (const arg of args) {
73
+ if (arg instanceof Error) {
74
+ out["err"] = {
75
+ message: arg.message,
76
+ stack: arg.stack,
77
+ name: arg.name
78
+ };
79
+ } else if (arg && typeof arg === "object") {
80
+ Object.assign(out, arg);
81
+ } else if (arg !== void 0 && arg !== null) {
82
+ out["data"] = arg;
83
+ }
84
+ }
85
+ return out;
86
+ }
87
+ };
88
+ async function createPinoLogger(cfg) {
89
+ const pinoFactory = await tryLoadPino();
90
+ if (!pinoFactory) {
91
+ const fallback = new Logger({
92
+ level: cfg.env === "prod" ? "warn" : "info",
93
+ console: true
94
+ });
95
+ fallback.setContext({
96
+ service: cfg.serviceName,
97
+ env: cfg.env,
98
+ version: cfg.version
99
+ });
100
+ return fallback;
101
+ }
102
+ const redactPaths = [
103
+ ...DEFAULT_REDACT_PATHS,
104
+ ...cfg.redactPaths ?? []
105
+ ];
106
+ const pino = pinoFactory({
107
+ name: cfg.serviceName,
108
+ level: cfg.level ?? (cfg.env === "prod" ? "warn" : "info"),
109
+ base: {
110
+ service: {
111
+ name: cfg.serviceName,
112
+ version: cfg.version
113
+ },
114
+ env: cfg.env
115
+ },
116
+ redact: {
117
+ paths: redactPaths,
118
+ censor: "[REDACTED]",
119
+ remove: false
120
+ },
121
+ timestamp: /* @__PURE__ */ __name(() => `,"time":"${(/* @__PURE__ */ new Date()).toISOString()}"`, "timestamp"),
122
+ mixin: /* @__PURE__ */ __name(() => pickTraceFields(), "mixin")
123
+ });
124
+ return new PinoAdapter(pino);
125
+ }
126
+ __name(createPinoLogger, "createPinoLogger");
127
+ function pickTraceFields() {
128
+ try {
129
+ const api = globalThis.__otelApi;
130
+ if (!api) return {};
131
+ const anyApi = api;
132
+ const span = anyApi.trace.getActiveSpan();
133
+ if (!span) return {};
134
+ const ctx = span.spanContext();
135
+ return {
136
+ trace_id: ctx.traceId,
137
+ span_id: ctx.spanId,
138
+ trace_flags: ctx.traceFlags.toString(16).padStart(2, "0")
139
+ };
140
+ } catch {
141
+ return {};
142
+ }
143
+ }
144
+ __name(pickTraceFields, "pickTraceFields");
145
+
146
+ export { DEFAULT_REDACT_PATHS, createPinoLogger };
147
+ //# sourceMappingURL=chunk-SNEOLWXT.js.map
148
+ //# sourceMappingURL=chunk-SNEOLWXT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/telemetry/pino-redaction.ts","../src/telemetry/pino-logger.ts"],"names":["DEFAULT_REDACT_PATHS","Object","freeze","tryLoadPino","mod","candidate","default","PinoAdapter","BaseLogger","pino","level","console","debug","message","args","mergeArgs","info","warn","error","log","trace","out","arg","Error","stack","name","assign","undefined","createPinoLogger","cfg","pinoFactory","fallback","env","setContext","service","serviceName","version","redactPaths","base","redact","paths","censor","remove","timestamp","Date","toISOString","mixin","pickTraceFields","api","globalThis","__otelApi","anyApi","span","getActiveSpan","ctx","spanContext","trace_id","traceId","span_id","spanId","trace_flags","traceFlags","toString","padStart"],"mappings":"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","file":"chunk-SNEOLWXT.js","sourcesContent":["/**\n * Default Pino redact paths — covers the Burdenoff authorization +\n * gateway header + NATS/GraphQL payload surface area.\n *\n * Services can extend this list via their own Pino options.\n */\nexport const DEFAULT_REDACT_PATHS: readonly string[] = Object.freeze([\n 'password',\n '*.password',\n '*.*.password',\n 'token',\n 'authToken',\n 'workspaceToken',\n 'accessToken',\n 'refreshToken',\n 'clientSecret',\n 'apiKey',\n '*.apiKey',\n 'authorization',\n 'req.headers.authorization',\n 'req.headers[\"x-workspace-authorization\"]',\n 'req.headers.cookie',\n 'res.headers[\"set-cookie\"]',\n 'params.*.password',\n 'params.*.token',\n 'params.*.secret',\n]);\n","/**\n * Pino logger wrapper that emits structured JSON with trace/span correlation\n * fields. Falls back to the SDK's built-in Logger when `pino` isn't installed\n * so services without the peer dep still compile and run.\n */\nimport { Logger as BaseLogger } from '../logger/index.js';\nimport { DEFAULT_REDACT_PATHS } from './pino-redaction.js';\n\nexport interface PinoLoggerConfig {\n serviceName: string;\n env: 'alpha' | 'prod' | 'dev';\n version: string;\n /** Override Pino log level. Default: warn (prod), info (alpha/dev). */\n level?: 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';\n /** Extra redact paths appended to DEFAULT_REDACT_PATHS. */\n redactPaths?: string[];\n}\n\ninterface PinoLike {\n level: string;\n fatal: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n trace: (...args: unknown[]) => void;\n child: (bindings: Record<string, unknown>) => PinoLike;\n}\n\nasync function tryLoadPino(): Promise<((opts: unknown) => PinoLike) | null> {\n try {\n const mod = (await import('pino')) as unknown as { default?: unknown };\n const candidate = (mod.default ?? mod) as unknown;\n if (typeof candidate === 'function') {\n return candidate as (opts: unknown) => PinoLike;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nclass PinoAdapter extends BaseLogger {\n constructor(private readonly pino: PinoLike) {\n super({\n level: (pino.level as BaseLogger['getLevel'] extends () => infer L ? L : never) ?? 'info',\n console: false,\n });\n }\n\n public override debug(message: string, ...args: unknown[]): void {\n this.pino.debug(this.mergeArgs(args), message);\n }\n public override info(message: string, ...args: unknown[]): void {\n this.pino.info(this.mergeArgs(args), message);\n }\n public override warn(message: string, ...args: unknown[]): void {\n this.pino.warn(this.mergeArgs(args), message);\n }\n public override error(message: string, ...args: unknown[]): void {\n this.pino.error(this.mergeArgs(args), message);\n }\n public override log(message: string, ...args: unknown[]): void {\n this.pino.info(this.mergeArgs(args), message);\n }\n public override trace(message: string, ...args: unknown[]): void {\n this.pino.trace(this.mergeArgs(args), message);\n }\n\n private mergeArgs(args: unknown[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const arg of args) {\n if (arg instanceof Error) {\n out['err'] = { message: arg.message, stack: arg.stack, name: arg.name };\n } else if (arg && typeof arg === 'object') {\n Object.assign(out, arg as Record<string, unknown>);\n } else if (arg !== undefined && arg !== null) {\n out['data'] = arg;\n }\n }\n return out;\n }\n}\n\n/**\n * Build a logger instance. Returns a Pino-backed adapter when `pino` is\n * installed; otherwise falls back to the SDK's built-in JSON Logger.\n *\n * Services call this through `bootstrapTelemetry`, not directly.\n */\nexport async function createPinoLogger(cfg: PinoLoggerConfig): Promise<BaseLogger> {\n const pinoFactory = await tryLoadPino();\n if (!pinoFactory) {\n // No pino — fall back to the built-in Logger with console output.\n const fallback = new BaseLogger({ level: cfg.env === 'prod' ? 'warn' : 'info', console: true });\n fallback.setContext({\n service: cfg.serviceName,\n env: cfg.env,\n version: cfg.version,\n } as unknown as import('../types/index.js').SDKContext);\n return fallback;\n }\n\n const redactPaths = [...DEFAULT_REDACT_PATHS, ...(cfg.redactPaths ?? [])];\n const pino = pinoFactory({\n name: cfg.serviceName,\n level: cfg.level ?? (cfg.env === 'prod' ? 'warn' : 'info'),\n base: {\n service: { name: cfg.serviceName, version: cfg.version },\n env: cfg.env,\n },\n redact: {\n paths: redactPaths,\n censor: '[REDACTED]',\n remove: false,\n },\n timestamp: () => `,\"time\":\"${new Date().toISOString()}\"`,\n mixin: () => pickTraceFields(),\n });\n return new PinoAdapter(pino);\n}\n\nfunction pickTraceFields(): Record<string, string> {\n try {\n // Pull active span context via @opentelemetry/api if installed.\n // Use require-style dynamic access to keep this file dep-free.\n const api = (globalThis as unknown as { __otelApi?: unknown }).__otelApi;\n if (!api) return {};\n const anyApi = api as {\n trace: {\n getActiveSpan: () => { spanContext: () => { traceId: string; spanId: string; traceFlags: number } } | undefined;\n };\n };\n const span = anyApi.trace.getActiveSpan();\n if (!span) return {};\n const ctx = span.spanContext();\n return {\n trace_id: ctx.traceId,\n span_id: ctx.spanId,\n trace_flags: ctx.traceFlags.toString(16).padStart(2, '0'),\n };\n } catch {\n return {};\n }\n}\n"]}