@burdenoff/be-sdk 2026.624.1 → 2026.701.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.
@@ -30,7 +30,15 @@ async function tryLoadPino() {
30
30
  const mod = await import('pino');
31
31
  const candidate = mod.default ?? mod;
32
32
  if (typeof candidate === "function") {
33
- return candidate;
33
+ const factory = candidate;
34
+ const destination = factory?.["destination"];
35
+ const makeDest = typeof destination === "function" ? () => destination({
36
+ sync: true
37
+ }) : () => void 0;
38
+ return {
39
+ factory,
40
+ makeDest
41
+ };
34
42
  }
35
43
  return null;
36
44
  } catch {
@@ -86,8 +94,8 @@ var PinoAdapter = class PinoAdapter2 extends Logger {
86
94
  }
87
95
  };
88
96
  async function createPinoLogger(cfg) {
89
- const pinoFactory = await tryLoadPino();
90
- if (!pinoFactory) {
97
+ const loader = await tryLoadPino();
98
+ if (!loader) {
91
99
  const fallback = new Logger({
92
100
  level: cfg.env === "prod" ? "warn" : "info",
93
101
  console: true
@@ -103,24 +111,31 @@ async function createPinoLogger(cfg) {
103
111
  ...DEFAULT_REDACT_PATHS,
104
112
  ...cfg.redactPaths ?? []
105
113
  ];
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
114
+ const dest = loader.makeDest();
115
+ const pino = loader.factory(
116
+ {
117
+ name: cfg.serviceName,
118
+ level: cfg.level ?? (cfg.env === "prod" ? "warn" : "info"),
119
+ base: {
120
+ service: {
121
+ name: cfg.serviceName,
122
+ version: cfg.version
123
+ },
124
+ env: cfg.env
113
125
  },
114
- env: cfg.env
115
- },
116
- redact: {
117
- paths: redactPaths,
118
- censor: "[REDACTED]",
119
- remove: false
126
+ redact: {
127
+ paths: redactPaths,
128
+ censor: "[REDACTED]",
129
+ remove: false
130
+ },
131
+ timestamp: /* @__PURE__ */ __name(() => `,"time":"${(/* @__PURE__ */ new Date()).toISOString()}"`, "timestamp"),
132
+ mixin: /* @__PURE__ */ __name(() => pickTraceFields(), "mixin")
120
133
  },
121
- timestamp: /* @__PURE__ */ __name(() => `,"time":"${(/* @__PURE__ */ new Date()).toISOString()}"`, "timestamp"),
122
- mixin: /* @__PURE__ */ __name(() => pickTraceFields(), "mixin")
123
- });
134
+ // Explicit sync destination so output is visible in ACA Log Analytics.
135
+ // Without this, Pino uses its default async sonic-boom which writes to fd 1
136
+ // but the ContainerAppConsoleLogs agent doesn't capture it on Bun.
137
+ dest
138
+ );
124
139
  return new PinoAdapter(pino);
125
140
  }
126
141
  __name(createPinoLogger, "createPinoLogger");
@@ -144,5 +159,5 @@ function pickTraceFields() {
144
159
  __name(pickTraceFields, "pickTraceFields");
145
160
 
146
161
  export { DEFAULT_REDACT_PATHS, createPinoLogger };
147
- //# sourceMappingURL=chunk-E5USZ2MR.js.map
148
- //# sourceMappingURL=chunk-E5USZ2MR.js.map
162
+ //# sourceMappingURL=chunk-NRSIT4VI.js.map
163
+ //# sourceMappingURL=chunk-NRSIT4VI.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","factory","destination","makeDest","sync","undefined","PinoAdapter","BaseLogger","pino","level","console","debug","message","args","mergeArgs","info","warn","error","log","trace","out","arg","Error","stack","name","assign","createPinoLogger","cfg","loader","fallback","env","setContext","service","serviceName","version","redactPaths","dest","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-NRSIT4VI.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 *\n * # ACA stdout compatibility\n *\n * In Azure Container Apps the ContainerAppConsoleLogs agent captures\n * `console.log` / `process.stdout.write` output but does *not* reliably\n * capture Pino's default async sonic-boom destination (which writes to fd 1\n * through Node.js `fs.writeSync` / `fs.write`). This means every log line\n * produced through Pino's default destination is invisible in Log Analytics.\n *\n * The fix mirrors what the gateway's own `logger.ts` does in production:\n * pass `pino.destination({ sync: true })` as the second argument to the\n * Pino factory so writes are synchronous and go through a path that ACA\n * captures correctly.\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\n/**\n * Loaded Pino module: factory function + a synchronous destination factory.\n * In ACA, Pino's default async sonic-boom destination is invisible in Log\n * Analytics, so we always use a sync destination.\n */\ninterface PinoLoader {\n factory: (opts: unknown, dest?: unknown) => PinoLike;\n makeDest: () => unknown;\n}\n\nasync function tryLoadPino(): Promise<PinoLoader | 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 const factory = candidate as (opts: unknown, dest?: unknown) => PinoLike;\n const destination = (factory as unknown as Record<string, unknown>)?.['destination'] as\n | ((opts?: { sync?: boolean }) => unknown)\n | undefined;\n const makeDest =\n typeof destination === 'function' ? () => destination({ sync: true }) : () => undefined;\n return { factory, makeDest };\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 loader = await tryLoadPino();\n if (!loader) {\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 });\n return fallback;\n }\n\n const redactPaths = [...DEFAULT_REDACT_PATHS, ...(cfg.redactPaths ?? [])];\n const dest = loader.makeDest();\n const pino = loader.factory(\n {\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 // Explicit sync destination so output is visible in ACA Log Analytics.\n // Without this, Pino uses its default async sonic-boom which writes to fd 1\n // but the ContainerAppConsoleLogs agent doesn't capture it on Bun.\n dest\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"]}
@@ -1,6 +1,6 @@
1
1
  import { shouldSyncRelationship, shouldSyncEntity, parseRelationship, getCollectionForEntity, extractMinimalFields, extractEntityTitle, createRelationshipEvent, createEntityEvent, addGraphExtension, GraphRegistry } from './chunk-5CESUKWC.js';
2
- import { ValidationError } from './chunk-EZ4PKRUK.js';
3
2
  import { getGraphEventEmitter, GraphEventEmitterImpl } from './chunk-OHEPNJ2X.js';
3
+ import { ValidationError } from './chunk-EZ4PKRUK.js';
4
4
  import { logger } from './chunk-CBZNP6RF.js';
5
5
  import { __export, __name } from './chunk-XE4OXN2W.js';
6
6
 
@@ -1873,5 +1873,5 @@ var GraphModule = class {
1873
1873
  };
1874
1874
 
1875
1875
  export { AUDIT_FIELDS, GraphEventsPublisher, GraphExportService, GraphModule, SOFT_DELETE_FIELDS, STANDARD_FIELDS, TENANT_FIELDS, createGraphEventsHelper, createGraphExportService, createPrismaGraphIntegration, createRelationshipFromEntity, defineEntity, defineGraphConfig, defineModuleGraph, defineRelationship, getGraphEventsPublisher, getGraphStats, graph_exports, initializeGraph, isGraphInitialized };
1876
- //# sourceMappingURL=chunk-DZK5UGDA.js.map
1877
- //# sourceMappingURL=chunk-DZK5UGDA.js.map
1876
+ //# sourceMappingURL=chunk-Z2423JIB.js.map
1877
+ //# sourceMappingURL=chunk-Z2423JIB.js.map