fg-tracker-sdk 0.14.0 → 0.15.0

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 (49) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +19 -3
  3. package/dist/context.d.ts +16 -0
  4. package/dist/context.d.ts.map +1 -1
  5. package/dist/context.js +30 -0
  6. package/dist/context.js.map +1 -1
  7. package/dist/express.d.ts +6 -1
  8. package/dist/express.d.ts.map +1 -1
  9. package/dist/express.js +19 -5
  10. package/dist/express.js.map +1 -1
  11. package/dist/fetch.d.ts.map +1 -1
  12. package/dist/fetch.js +156 -9
  13. package/dist/fetch.js.map +1 -1
  14. package/dist/index.d.ts +2 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/infra/aws.d.ts.map +1 -1
  19. package/dist/infra/aws.js +26 -0
  20. package/dist/infra/aws.js.map +1 -1
  21. package/dist/infra/lambda.d.ts +2 -0
  22. package/dist/infra/lambda.d.ts.map +1 -1
  23. package/dist/infra/lambda.js +5 -2
  24. package/dist/infra/lambda.js.map +1 -1
  25. package/dist/logs/shipper.d.ts.map +1 -1
  26. package/dist/logs/shipper.js +15 -4
  27. package/dist/logs/shipper.js.map +1 -1
  28. package/dist/logs/types.d.ts +8 -0
  29. package/dist/logs/types.d.ts.map +1 -1
  30. package/dist/monitors.d.ts.map +1 -1
  31. package/dist/monitors.js +3 -1
  32. package/dist/monitors.js.map +1 -1
  33. package/dist/next.d.ts.map +1 -1
  34. package/dist/next.js +7 -2
  35. package/dist/next.js.map +1 -1
  36. package/dist/node-http.d.ts.map +1 -1
  37. package/dist/node-http.js +12 -3
  38. package/dist/node-http.js.map +1 -1
  39. package/dist/scrub.d.ts +62 -4
  40. package/dist/scrub.d.ts.map +1 -1
  41. package/dist/scrub.js +656 -11
  42. package/dist/scrub.js.map +1 -1
  43. package/dist/tracker.d.ts +18 -0
  44. package/dist/tracker.d.ts.map +1 -1
  45. package/dist/tracker.js +52 -11
  46. package/dist/tracker.js.map +1 -1
  47. package/dist/types.d.ts +26 -4
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog — fg-tracker-sdk
2
2
 
3
+ ## 0.15.0
4
+
5
+ Dados sensíveis limpos antes da fila, uma chamada AWS = um span e repasse opt-in do `baggage` (CONTRATO.md §16, §20, §22). Ordem de release combinada: a 0.14.0 (correções pós-#38, PR #64) sai antes, e esta, depois dela.
6
+
7
+ - **Limpeza por valor, como o contrato prometia** (`scrubFields`): JWT, `Bearer`/`Basic`, cartão (Luhn), CPF formatado, chave privada, tokens de formato publicado (`fgsk_`, `fgt_`, AWS, GitHub, Stripe, Slack, `sk-…`, Google) e `chave=valor` sensível viram `[Filtered]`; e-mails viram `<email>`, o marcador da normalização da API (a fingerprint de erros comuns não muda). Vale para atributos, mensagem e stack do erro, nome e rota do span. `cpf`, `jwt`, `secret_access_key` e `secret_key` entram em `DEFAULT_SCRUB_FIELDS` (`secretAccessKey`, `AWS_SECRET_ACCESS_KEY` e `aws.secret_key` casam); chaves com maiúscula em `scrubFields` passam a casar. `release`, `serviceName`, `environment`, `deployment.environment.name`, `service.name` e `service.version` não passam pela limpeza por valor: um carimbo de build que passa no Luhn (`20261017090915`) não vira `[Filtered]` e continua agrupando releases e ambientes na API.
8
+ - **URLs sem os valores da query**: `attributes.url` (Express, `wrapNextRoute`, `fetch`, `node:http`), URLs dentro de texto e de logs saem sem usuário/senha e com `?token=[Filtered]&page=[Filtered]`; as chaves e o caminho ficam. Num frame de stack (`at f (https://cdn/app.js?v=123:1:24567)`, `f@…/App.tsx?t=…:12:5`), a linha e a coluna ficam fora da query: `app.js?v=[Filtered]:1:24567`. `url.full` continua com `REDACTED`.
9
+ - **`sendDefaultPii`** (padrão `false`). **Efeito ao atualizar:** o Express e o `wrapNextRoute` deixam de gravar `ip`, o `identify` padrão grava só `user.id` (sem `user.email`/`user.name` de `req.user`) e as URLs saem sem os valores da query. `sendDefaultPii: true` volta ao comportamento anterior, menos os valores de chaves sensíveis. `setUser` e `identify` próprios continuam gravando o que a aplicação entregar.
10
+ - **Logs, check-ins e avisos**: o shipper de logs limpa `context` (chave e valor) e `message` (valor) antes da fila (`scrubFields`/`sendDefaultPii` também no shipper, no pino, no winston e no `nestLogger`); a mensagem de `fail` do check-in e os avisos do SDK no console saem limpos. Um `context` que lança ao ser lido vira `{ contextDropped }` em vez de quebrar o log.
11
+ - **Uma chamada AWS, um span** (S08): o HTTP de um client de `instrumentAws` (`node:http` ou fetch instrumentado) não gera mais o `POST https://<endpoint>/` filho nem recebe `traceparent`; retries do AWS SDK viram `aws.attempts`. **Efeito ao atualizar:** `/providers` deixa de contar cada chamada AWS duas vezes.
12
+ - **`propagateBaggageTo`** (padrão `false`, nada muda sem ligar): o header `baggage` recebido (Express, `wrapNextRoute`, `wrapLambda` com evento HTTP) é repassado ao `fetch` e ao `node:http` só para destinos que recebem `traceparent` e estão na lista, com até 64 membros e 8192 bytes; nunca vira atributo nem vai em mensagens SQS/EventBridge. Novos exports: `BAGGAGE_HEADER`, `sanitizeBaggage`, `scrubText`, `scrubUrl`.
13
+ - Atributo circular vira `[Circular]` na primeira repetição (a cópia da limpeza não o expande); `Date`/`Buffer` em atributos saem pelo `toJSON` em vez de virar `{}`.
14
+
3
15
  ## 0.14.0
4
16
 
5
17
  Correções da revisão pós-merge da 0.11 (CONTRATO.md §16, §16.1). Nada removido; as opções novas são aditivas. Vem depois da 0.13.0 (chamadas de IA, #57) e não colide com a 0.12.0 proposta no #45; quem for publicado depois sobe a versão.
package/README.md CHANGED
@@ -58,6 +58,7 @@ await tracker.flush(); await tracker.shutdown(); // shutdown espera no máximo
58
58
  | `release` | detectada | versão em execução (`FG_TRACKER_RELEASE`, `GITHUB_SHA`, `VERCEL_GIT_COMMIT_SHA`… → `${serviceName}@${sha}`); `false` desliga |
59
59
  | `environment` | detectado | `FG_TRACKER_ENV`, `APP_ENV` ou `NODE_ENV`; `false` desliga |
60
60
  | `propagateTraceTo` | `true` | destinos que recebem `traceparent` no fetch instrumentado (`true`, lista de hosts/prefixos/RegExp ou `false`) |
61
+ | `propagateBaggageTo` | `false` | repasse do header `baggage` recebido para as chamadas de saída (`fetch`, `node:http`), só para destinos que também recebem `traceparent`; prefira uma lista de hosts. Até 64 membros e 8192 bytes; nunca vira atributo nem vai em mensagens SQS/EventBridge; em redirect do `fetch`, cada salto é conferido de novo (só na chamada simples: URL ou `Request` sem corpo com opções padrão, e `init` só com `method`, `headers`, corpo reenviável, `signal` e `redirect`; fora disso, com redirect automático, o `baggage` não vai) |
61
62
  | `instrumentGlobalFetch` | `false` | substitui `globalThis.fetch` pelo fetch instrumentado (provedores externos viram spans) |
62
63
  | `instrumentNodeHttp` | `true` | spans `http.client` para a saída de `node:http`/`node:https` (AWS SDK, axios, got, node-fetch 2, gaxios, web-push) |
63
64
  | `autoSpanMinDurationMs` | `5` | duração mínima para um trecho medido com `measure`/`instrumentNest` virar span |
@@ -68,10 +69,24 @@ await tracker.flush(); await tracker.shutdown(); // shutdown espera no máximo
68
69
  | `tracesSampler` | — | `(ctx: { kind, name, attributes, parentSampled? }) => taxa` por operação (ex.: `0` para `GET /health`) |
69
70
  | `ignoreTransactions` | `[]` | nomes de raiz (string/RegExp) que nunca são enviados |
70
71
  | `ignoreErrors` | `[]` | erros (`name: message`, string/RegExp) que não viram issue (o span vai sem `error`, com `attributes.ignoredError = <nome do erro>`) |
71
- | `scrubFields` | `DEFAULT_SCRUB_FIELDS` | chaves de atributos que viram `[Filtered]` (password, secret, token, authorization, cookie, api_key, access_token, card_number…; CPF e e-mail não estão na lista padrão); `false` desliga |
72
+ | `scrubFields` | `DEFAULT_SCRUB_FIELDS` | chaves de atributos que viram `[Filtered]` (password, secret, token, authorization, cookie, api_key, access_token, card_number, cpf, jwt…), mais a limpeza por valor (veja **Dados sensíveis**); `false` desliga as duas |
73
+ | `sendDefaultPii` | `false` | dados pessoais automáticos: `ip`, `user.email`/`user.name` de `req.user` e os valores da query das URLs (veja **Dados sensíveis**) |
72
74
  | `beforeSend` | — | `(span) => span \| null`, último filtro antes da fila |
73
75
  | `infra` | `{ enabled: true, idleIntervalMs: 60000 }` | agregados de infraestrutura (veja **Infraestrutura**); nunca amostrados |
74
76
 
77
+ ## Dados sensíveis
78
+
79
+ A limpeza roda antes da fila (CONTRATO.md §22), em todo span, nas linhas do shipper de logs, na mensagem de falha dos check-ins e nos avisos do próprio SDK no console:
80
+
81
+ - **Por chave** (`scrubFields`): o valor de uma chave sensível vira `[Filtered]` em qualquer profundidade, sem diferenciar maiúsculas.
82
+ - **Por valor**: JWT, `Bearer …`/`Basic …`, número de cartão (bandeiras 2–6, 13 a 19 dígitos, Luhn), CPF formatado (dígitos verificadores), bloco de chave privada, tokens de formato publicado (`fgsk_`/`fgt_`, AWS `AKIA…`, GitHub, Stripe `sk_live_`, Slack `xox…`, `sk-…` de OpenAI/OpenRouter/Anthropic, Google `AIza…`) e `chave=valor`/`"chave": valor` com chave sensível dentro de texto viram `[Filtered]`. E-mails viram `<email>`, o mesmo marcador da normalização de mensagens da API: a fingerprint das issues não muda. Vale para atributos, mensagem e stack do erro, nome e rota do span.
83
+ - **URLs** (`url`, `http.url`, `url.full`, URLs dentro de texto): sem usuário e senha; os valores da query (e de parâmetros no fragmento) viram `[Filtered]` e as chaves ficam: `/reset?token=[Filtered]&page=[Filtered]`.
84
+ - **Não muda**: identificadores (`traceId`, `spanId`, `remoteParentSpanId`, `requestId`, `user.id`, qualquer chave terminada em `id`), `user.email`/`user.name` que a aplicação entregou (`setUser`, `identify` próprio), `db.query.text`/`db.query.fingerprint` e o nome de `db.query` (SQL já sem literais), e IPs dentro de mensagens (`connect ECONNREFUSED 10.0.0.5:5432` é contexto técnico).
85
+ - **`sendDefaultPii: true`** volta a gravar o `ip` do cliente, o e-mail e o nome de `req.user` e os valores da query, menos os de chave sensível (`scrubFields`, assinaturas `X-Amz-Signature`/`X-Goog-Signature`, `key`, `code`, `id_token`…).
86
+ - `scrubFields: false` desliga a limpeza por chave e por valor; sem `sendDefaultPii`, os valores da query continuam fora.
87
+
88
+ Agregados de infraestrutura levam só nomes de recursos (fila, tabela, função) e números; corpos de mensagens SQS/SNS/EventBridge e chaves do DynamoDB nunca são lidos.
89
+
75
90
  ## Envio, retry e encerramento
76
91
 
77
92
  O envio segue o CONTRATO.md §4.3 e vale também para o shipper de logs:
@@ -128,7 +143,7 @@ app.get('/users/:id', async (req, res) => { /* ... */ });
128
143
  process.on('SIGTERM', () => tracker.shutdown().finally(() => process.exit(0)));
129
144
  ```
130
145
 
131
- O middleware cria um span raiz `http.server` por request. O nome é `${method} ${route}`; a rota vem de `req.baseUrl + req.route.path` (disponível no `finish` da resposta), com fallback para o path com uuids/números trocados por `:id`. Atributos: `url`, `userAgent`, `ip`. Status ≥ 500 vira `error`.
146
+ O middleware cria um span raiz `http.server` por request. O nome é `${method} ${route}`; a rota vem de `req.baseUrl + req.route.path` (disponível no `finish` da resposta), com fallback para o path com uuids/números trocados por `:id`. Atributos: `url` (query sem valores), `userAgent` e, com `sendDefaultPii: true`, `ip`. O `identify` padrão grava `user.id` (`req.user.id` ou `sub`); e-mail e nome só com `sendDefaultPii: true` ou com um `identify` próprio. Status ≥ 500 vira `error`.
132
147
 
133
148
  ## NestJS (platform-express)
134
149
 
@@ -410,6 +425,7 @@ await logs.flush(); await logs.shutdown();
410
425
  | `compression`, `exitHooks` | `'gzip'` (`'none'` com `fetch` próprio), `true` | como no tracker |
411
426
  | `tracker` | — | correlação com o span corrente (sem ele usa o contexto global do SDK, que funciona quando o tracker está no mesmo processo) |
412
427
  | `minLevel` | `trace` | nível mínimo enviado |
428
+ | `scrubFields`, `sendDefaultPii` | `DEFAULT_SCRUB_FIELDS`, `false` | a mesma limpeza dos spans (veja **Dados sensíveis**): `context` por chave e por valor, `message` por valor, URLs do `context` sem os valores da query; `scrubFields: false` desliga |
413
429
 
414
430
  ### pino (pino-http, Fastify, NestJS com nestjs-pino)
415
431
 
@@ -528,7 +544,7 @@ await sqs.send(new SendMessageCommand({ QueueUrl, MessageBody }));
528
544
  | Step Functions | `StartExecution`, `StartSyncExecution` | `sfn`: `started`, `succeeded`, `failed` |
529
545
 
530
546
  - No DynamoDB o middleware injeta `ReturnConsumedCapacity: 'TOTAL'` quando você não informa (passar `'NONE'` desliga a contagem de unidades).
531
- - Quando há um trace em andamento, **toda** chamada AWS (de qualquer serviço) vira um span `http.client` `AWS <serviço> <operação> <recurso>` com `attributes['aws.service']`, `aws.operation`, `aws.resourceArn`, `aws.region` e `statusCode`/erro. Esses spans seguem a amostragem normal.
547
+ - Quando há um trace em andamento, **toda** chamada AWS (de qualquer serviço) vira um span `http.client` `AWS <serviço> <operação> <recurso>` com `attributes['aws.service']`, `aws.operation`, `aws.resourceArn`, `aws.region` e `statusCode`/erro. Esses spans seguem a amostragem normal. É **um** span por chamada: o HTTP dela (`node:http` ou fetch instrumentado) não gera um segundo `http.client` nem recebe `traceparent`, e os retries do AWS SDK aparecem como `aws.attempts` (quando > 1).
532
548
  - Nomes viram ARN quando a conta é conhecida (aprendida de ARNs/URLs vistos ou `AWS_ACCOUNT_ID`); sem conta, a API casa o nó por nome + região + serviço.
533
549
 
534
550
  ### Contexto pelas filas (SQS e EventBridge)
package/dist/context.d.ts CHANGED
@@ -20,6 +20,16 @@ export interface SpanContext {
20
20
  executionRootId?: string;
21
21
  /** `tracestate` recebido de outro serviço, repassado sem alteração a quem vem depois (W3C). */
22
22
  traceState?: string;
23
+ /**
24
+ * `baggage` recebido (W3C Baggage), já dentro dos limites; só existe com `propagateBaggageTo`
25
+ * ligado e só sai para os destinos dessa lista. Nunca vira atributo de span.
26
+ */
27
+ baggage?: string;
28
+ /**
29
+ * A chamada HTTP feita neste contexto já tem span (o `http.client` do AWS SDK): `node:http` e o
30
+ * `fetch` instrumentado não criam outro nem injetam `traceparent` (S08). Não passa para filhos.
31
+ */
32
+ httpCovered?: boolean;
23
33
  }
24
34
  /** Contexto assíncrono compartilhado: quem é o span pai da operação corrente. */
25
35
  export declare const als: AsyncLocalStorage<SpanContext>;
@@ -47,6 +57,12 @@ export declare function formatTraceparent(ctx: SpanContext): string;
47
57
  * de {@link MAX_RAW_TRACEPARENT_LENGTH} é recusado antes de qualquer cópia.
48
58
  */
49
59
  export declare function parseTraceparent(value: string | string[] | undefined | null): SpanContext | undefined;
60
+ export declare const BAGGAGE_HEADER = "baggage";
61
+ /**
62
+ * `baggage` aceitável para repasse: membros válidos (os inválidos saem), no máximo 64 e 8192 bytes
63
+ * no total, cortando membros inteiros do fim. Texto fora do ASCII imprimível descarta o membro.
64
+ */
65
+ export declare function sanitizeBaggage(value: string | string[] | undefined | null): string | undefined;
50
66
  /**
51
67
  * `tracestate` aceitável para repasse: texto ASCII imprimível de até 512 caracteres; senão
52
68
  * `undefined`. Valor bruto acima de {@link MAX_RAW_TRACESTATE_LENGTH} é recusado antes do `trim`.
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,iHAAiH;IACjH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iFAAiF;AACjF,eAAO,MAAM,GAAG,gCAAuC,CAAC;AAExD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,GAAG,SAAS,CAE5D;AAMD,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAG9C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAQ9C,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,CAYrG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAOlG;AAED,uGAAuG;AACvG,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,EACjD,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAChD,WAAW,GAAG,SAAS,CAKzB;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI5E"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,iHAAiH;IACjH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,iFAAiF;AACjF,eAAO,MAAM,GAAG,gCAAuC,CAAC;AAExD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,GAAG,SAAS,CAE5D;AAMD,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAG9C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAQ9C,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,CAYrG;AAED,eAAO,MAAM,cAAc,YAAY,CAAC;AAOxC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAe/F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAOlG;AAED,uGAAuG;AACvG,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,EACjD,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAChD,WAAW,GAAG,SAAS,CAKzB;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI5E"}
package/dist/context.js CHANGED
@@ -61,6 +61,36 @@ export function parseTraceparent(value) {
61
61
  const sampled = (parseInt(match[4], 16) & 1) === 1;
62
62
  return { traceId, spanId, sampled };
63
63
  }
64
+ export const BAGGAGE_HEADER = 'baggage';
65
+ /** W3C Baggage: o mínimo que todo participante precisa repassar (64 membros, 8192 bytes). */
66
+ const MAX_BAGGAGE_MEMBERS = 64;
67
+ const MAX_BAGGAGE_BYTES = 8192;
68
+ /** `chave=valor` com propriedades opcionais (`;p=v`): chave token, valor sem espaço, aspas, vírgula, `;` ou `\`. */
69
+ const BAGGAGE_MEMBER = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]{1,256}[ \t]*=[ \t]*[!#-+\--:<-[\]-~]*(?:[ \t]*;[\x20-\x2b\x2d-\x7e]*)?$/;
70
+ /**
71
+ * `baggage` aceitável para repasse: membros válidos (os inválidos saem), no máximo 64 e 8192 bytes
72
+ * no total, cortando membros inteiros do fim. Texto fora do ASCII imprimível descarta o membro.
73
+ */
74
+ export function sanitizeBaggage(value) {
75
+ const raw = Array.isArray(value) ? value.join(',') : value;
76
+ if (typeof raw !== 'string' || !raw.trim())
77
+ return undefined;
78
+ const members = [];
79
+ let bytes = 0;
80
+ for (const part of raw.split(',')) {
81
+ if (members.length >= MAX_BAGGAGE_MEMBERS)
82
+ break;
83
+ const member = part.trim();
84
+ if (!member || member.length > MAX_BAGGAGE_BYTES || !BAGGAGE_MEMBER.test(member))
85
+ continue;
86
+ const added = member.length + (members.length > 0 ? 1 : 0);
87
+ if (bytes + added > MAX_BAGGAGE_BYTES)
88
+ break;
89
+ members.push(member);
90
+ bytes += added;
91
+ }
92
+ return members.length > 0 ? members.join(',') : undefined;
93
+ }
64
94
  /**
65
95
  * `tracestate` aceitável para repasse: texto ASCII imprimível de até 512 caracteres; senão
66
96
  * `undefined`. Valor bruto acima de {@link MAX_RAW_TRACESTATE_LENGTH} é recusado antes do `trim`.
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
package/dist/express.d.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  import type { TrackerCore } from './tracker.js';
2
2
  import type { ExpressErrorMiddleware, ExpressLikeRequest, ExpressMiddleware, ExpressOptions, UserRef } from './types.js';
3
- /** Usuário padrão: `req.user.id` (passport, Nest guards) com e-mail/nome quando existirem. */
3
+ /**
4
+ * Usuário de `req.user.id` (passport, Nest guards) com e-mail/nome quando existirem. É o `identify`
5
+ * padrão com `sendDefaultPii: true`; sem ela, o padrão grava só o id (`identifyById`).
6
+ */
4
7
  export declare function defaultIdentify(req: ExpressLikeRequest): UserRef | undefined;
8
+ /** Só o id de `req.user` (`id` ou `sub`): o `identify` padrão sem `sendDefaultPii`. */
9
+ export declare function identifyById(req: ExpressLikeRequest): UserRef | undefined;
5
10
  /**
6
11
  * Middleware Express: um span raiz `http.server` por request. Deve ser o
7
12
  * primeiro middleware para que tudo o que vier depois (handlers, queries,
@@ -1 +1 @@
1
- {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAuB,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAgB9I,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAS5E;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,cAAmB,GAAG,iBAAiB,CAyE1G;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,sBAAsB,CAMnF"}
1
+ {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAuB,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAgB9I;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAS5E;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAGzE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,cAAmB,GAAG,iBAAiB,CA8E1G;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,sBAAsB,CAMnF"}
package/dist/express.js CHANGED
@@ -1,4 +1,4 @@
1
- import { parseTraceContext } from './context.js';
1
+ import { parseTraceContext, sanitizeBaggage } from './context.js';
2
2
  import { normalizePath } from './normalize.js';
3
3
  function headerValue(v) {
4
4
  return Array.isArray(v) ? v[0] : v;
@@ -12,7 +12,10 @@ function resolveRoute(req, fallbackPath) {
12
12
  }
13
13
  return normalizePath(fallbackPath);
14
14
  }
15
- /** Usuário padrão: `req.user.id` (passport, Nest guards) com e-mail/nome quando existirem. */
15
+ /**
16
+ * Usuário de `req.user.id` (passport, Nest guards) com e-mail/nome quando existirem. É o `identify`
17
+ * padrão com `sendDefaultPii: true`; sem ela, o padrão grava só o id (`identifyById`).
18
+ */
16
19
  export function defaultIdentify(req) {
17
20
  const user = req.user;
18
21
  if (!user || typeof user !== 'object')
@@ -27,6 +30,11 @@ export function defaultIdentify(req) {
27
30
  ref.name = user.name;
28
31
  return ref;
29
32
  }
33
+ /** Só o id de `req.user` (`id` ou `sub`): o `identify` padrão sem `sendDefaultPii`. */
34
+ export function identifyById(req) {
35
+ const user = defaultIdentify(req);
36
+ return user ? { id: user.id } : undefined;
37
+ }
30
38
  /**
31
39
  * Middleware Express: um span raiz `http.server` por request. Deve ser o
32
40
  * primeiro middleware para que tudo o que vier depois (handlers, queries,
@@ -34,7 +42,8 @@ export function defaultIdentify(req) {
34
42
  * via `traceparent` (tracing distribuído) e associa o usuário ao fim da resposta.
35
43
  */
36
44
  export function createExpressMiddleware(core, options = {}) {
37
- const identify = options.identify === false ? null : (options.identify ?? defaultIdentify);
45
+ const pii = core.options.sendDefaultPii;
46
+ const identify = options.identify === false ? null : (options.identify ?? (pii ? defaultIdentify : identifyById));
38
47
  const continueTrace = options.continueTrace ?? true;
39
48
  return function fgTrackerMiddleware(req, res, next) {
40
49
  if (!core.enabled) {
@@ -44,12 +53,12 @@ export function createExpressMiddleware(core, options = {}) {
44
53
  const method = (req.method ?? 'GET').toUpperCase();
45
54
  const rawUrl = req.originalUrl ?? req.url ?? '/';
46
55
  const initialRoute = normalizePath(rawUrl);
47
- const ip = req.ip ?? headerValue(req.headers['x-forwarded-for'])?.split(',')[0]?.trim() ?? req.socket?.remoteAddress ?? null;
48
56
  const requestId = headerValue(req.headers['x-request-id']) ?? null;
57
+ // `url` sai com a query limpa na fila (scrub.ts); o IP do cliente só com `sendDefaultPii`.
49
58
  const attributes = {
50
59
  url: rawUrl,
51
60
  userAgent: headerValue(req.headers['user-agent']) ?? null,
52
- ip,
61
+ ...(pii ? { ip: req.ip ?? headerValue(req.headers['x-forwarded-for'])?.split(',')[0]?.trim() ?? req.socket?.remoteAddress ?? null } : {}),
53
62
  ...(requestId ? { requestId } : {}),
54
63
  };
55
64
  // Raiz: ignora qualquer contexto herdado (ex.: keep-alive reutilizando o socket);
@@ -60,6 +69,11 @@ export function createExpressMiddleware(core, options = {}) {
60
69
  : core.startSpan('http.server', `${method} ${initialRoute}`, attributes, null);
61
70
  span.method = method;
62
71
  span.route = initialRoute;
72
+ if (continueTrace && core.options.propagateBaggageTo !== false) {
73
+ const baggage = sanitizeBaggage(req.headers['baggage']);
74
+ if (baggage)
75
+ span.baggage = baggage;
76
+ }
63
77
  if (typeof res.setHeader === 'function' && typeof res.getHeader === 'function' && !res.getHeader('x-trace-id')) {
64
78
  try {
65
79
  res.setHeader('x-trace-id', span.traceId);
@@ -1 +1 @@
1
- {"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAwCjE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,GAAE,OAAO,UAAU,CAAC,KAAwB,GAAG,OAAO,UAAU,CAAC,KAAK,CAoDzI"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAqKjE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,GAAE,OAAO,UAAU,CAAC,KAAwB,GAAG,OAAO,UAAU,CAAC,KAAK,CA+EzI"}
package/dist/fetch.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { performance } from 'node:perf_hooks';
2
- import { TRACEPARENT_HEADER, TRACESTATE_HEADER, traceContextHeaders } from './context.js';
2
+ import { BAGGAGE_HEADER, TRACEPARENT_HEADER, TRACESTATE_HEADER, traceContextHeaders } from './context.js';
3
3
  import { matchGenAiTarget } from './genai/config.js';
4
4
  import { failHttpGenAiCall, observeHttpGenAiResponse, startHttpGenAiCall } from './genai/http.js';
5
5
  import { httpClientSemconv, normalizePath } from './normalize.js';
@@ -27,24 +27,144 @@ function describe(input, init) {
27
27
  /**
28
28
  * Acrescenta `traceparent` (e `tracestate`, quando o trace veio com um) ao request sem perder
29
29
  * headers já definidos (Request, Headers, array ou objeto). Um `traceparent` já presente vence.
30
+ * Devolve também os headers que o SDK acrescentou (só esses são revistos a cada redirect).
30
31
  */
31
32
  function withTraceContext(input, init, values) {
33
+ const injected = {};
32
34
  const apply = (headers) => {
33
35
  headers.set(TRACEPARENT_HEADER, values[TRACEPARENT_HEADER]);
34
- if (values[TRACESTATE_HEADER] && !headers.has(TRACESTATE_HEADER))
35
- headers.set(TRACESTATE_HEADER, values[TRACESTATE_HEADER]);
36
+ injected[TRACEPARENT_HEADER] = values[TRACEPARENT_HEADER];
37
+ for (const name of [TRACESTATE_HEADER, BAGGAGE_HEADER]) {
38
+ if (values[name] && !headers.has(name)) {
39
+ headers.set(name, values[name]);
40
+ injected[name] = values[name];
41
+ }
42
+ }
36
43
  };
37
44
  if (input instanceof Request && !init?.headers) {
38
45
  if (input.headers.has(TRACEPARENT_HEADER))
39
- return { input, init };
46
+ return { input, init, injected };
40
47
  const headers = new Headers(input.headers);
41
48
  apply(headers);
42
- return { input: new Request(input, { headers }), init };
49
+ return { input: new Request(input, { headers }), init, injected };
43
50
  }
44
51
  const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));
45
52
  if (!headers.has(TRACEPARENT_HEADER))
46
53
  apply(headers);
47
- return { input, init: { ...init, headers } };
54
+ return { input, init: { ...init, headers }, injected };
55
+ }
56
+ /**
57
+ * Corpo que pode ser reenviado a cada redirect: texto, `Blob` (imutáveis) e `URLSearchParams`,
58
+ * `ArrayBuffer` e views, que são copiados no início (`frozenBody`). Stream e `FormData` ficam com
59
+ * o fetch nativo.
60
+ */
61
+ function replayableBody(body) {
62
+ return (body === undefined ||
63
+ body === null ||
64
+ typeof body === 'string' ||
65
+ body instanceof URLSearchParams ||
66
+ body instanceof ArrayBuffer ||
67
+ ArrayBuffer.isView(body) ||
68
+ (typeof Blob !== 'undefined' && body instanceof Blob));
69
+ }
70
+ /**
71
+ * Retrato do corpo no momento da chamada, como o fetch nativo faz: a aplicação pode alterar ou
72
+ * reutilizar o objeto enquanto a requisição está em voo, e todos os saltos levam os mesmos bytes.
73
+ */
74
+ function frozenBody(body) {
75
+ if (body instanceof URLSearchParams)
76
+ return new URLSearchParams(body);
77
+ if (body instanceof ArrayBuffer)
78
+ return body.slice(0);
79
+ if (ArrayBuffer.isView(body))
80
+ return new Uint8Array(body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength));
81
+ return body;
82
+ }
83
+ /** Opções do `RequestInit` que o salto manual reproduz em cada redirect; com qualquer outra, o fetch nativo segue. */
84
+ const MANUAL_FOLLOW_INIT = new Set(['method', 'headers', 'body', 'signal', 'redirect']);
85
+ /**
86
+ * O salto manual (`followRedirects`) só vale para a chamada simples, em que refazer cada redirect
87
+ * como um fetch novo dá o mesmo que o fetch nativo: URL, ou `Request` sem corpo e com as opções
88
+ * padrão, e um `init` só com método, headers, corpo reenviável, `signal` e `redirect`. Qualquer outra
89
+ * coisa (`mode`, `referrer`, `cache`, `integrity`, `credentials`, corpo em stream ou herdado do
90
+ * `Request`…) muda o redirect de um jeito que ele não reproduz: aí o `baggage` não vai e o fetch
91
+ * nativo segue o redirect como sempre.
92
+ */
93
+ function manualFollowSafe(input, init) {
94
+ if (input instanceof Request) {
95
+ const plain = input.body === null &&
96
+ input.cache === 'default' &&
97
+ input.credentials === 'same-origin' &&
98
+ input.mode === 'cors' &&
99
+ (input.referrer === 'about:client' || input.referrer === '') &&
100
+ input.referrerPolicy === '' &&
101
+ input.integrity === '' &&
102
+ !input.keepalive;
103
+ if (!plain)
104
+ return false;
105
+ }
106
+ if (!init)
107
+ return true;
108
+ for (const [key, value] of Object.entries(init)) {
109
+ if (value !== undefined && !MANUAL_FOLLOW_INIT.has(key))
110
+ return false;
111
+ }
112
+ return replayableBody(init.body);
113
+ }
114
+ const REDIRECT_STATUS = new Set([301, 302, 303, 307, 308]);
115
+ const MAX_REDIRECTS = 20;
116
+ const BODY_HEADERS = ['content-type', 'content-length', 'content-encoding', 'content-language', 'content-location'];
117
+ const CROSS_ORIGIN_DROPPED = ['authorization', 'proxy-authorization', 'cookie', 'host'];
118
+ /**
119
+ * `redirect: 'follow'` feito aqui, salto a salto, quando o SDK acrescentou `baggage`: o fetch nativo
120
+ * mantém headers próprios num redirect para outra origem, e o `baggage` (ids de usuário e tenant)
121
+ * chegaria a um destino fora de `propagateBaggageTo`. Em cada salto, `traceparent`/`tracestate`
122
+ * seguem `propagateTraceTo` e o `baggage` segue as duas listas; o resto é o que o fetch faria:
123
+ * 301/302 com POST e 303 viram GET sem corpo, outra origem perde `authorization`, `cookie` e afins,
124
+ * no máximo 20 saltos. A resposta final tem a URL do último salto (`redirected` fica `false`).
125
+ */
126
+ async function followRedirects(send, first, start, injected, allow) {
127
+ let res = await send(first.input, { ...first.init, redirect: 'manual' });
128
+ const headers = new Headers(first.init?.headers ?? (first.input instanceof Request ? first.input.headers : undefined));
129
+ const { body: _body, headers: _headers, method: _method, redirect: _redirect, ...rest } = first.init ?? {};
130
+ const signal = first.init?.signal ?? (first.input instanceof Request ? first.input.signal : undefined);
131
+ let { url, method, body } = start;
132
+ for (let hops = 0; REDIRECT_STATUS.has(res.status); hops += 1) {
133
+ const location = res.headers.get('location');
134
+ if (!location)
135
+ return res;
136
+ let next = null;
137
+ try {
138
+ next = new URL(location, url);
139
+ }
140
+ catch {
141
+ next = null;
142
+ }
143
+ await res.body?.cancel().catch(() => undefined);
144
+ if (!next || (next.protocol !== 'http:' && next.protocol !== 'https:'))
145
+ throw new TypeError('fetch failed', { cause: new Error(`redirect para URL inválida: ${location}`) });
146
+ if (hops >= MAX_REDIRECTS)
147
+ throw new TypeError('fetch failed', { cause: new Error('redirect count exceeded') });
148
+ if (((res.status === 301 || res.status === 302) && method === 'POST') || (res.status === 303 && method !== 'GET' && method !== 'HEAD')) {
149
+ method = 'GET';
150
+ body = undefined;
151
+ for (const name of BODY_HEADERS)
152
+ headers.delete(name);
153
+ }
154
+ if (next.origin !== url.origin)
155
+ for (const name of CROSS_ORIGIN_DROPPED)
156
+ headers.delete(name);
157
+ const allowed = allow(next);
158
+ for (const [name, value] of Object.entries(injected)) {
159
+ if (name === BAGGAGE_HEADER ? allowed.baggage : allowed.trace)
160
+ headers.set(name, value);
161
+ else
162
+ headers.delete(name);
163
+ }
164
+ url = next;
165
+ res = await send(next.href, { ...rest, method, headers, body, signal, redirect: 'manual' });
166
+ }
167
+ return res;
48
168
  }
49
169
  /**
50
170
  * Retorna um `fetch` que cria spans `http.client` nomeados
@@ -56,9 +176,16 @@ export function createInstrumentedFetch(core, fetchImpl = globalThis.fetch) {
56
176
  const base = fetchImpl;
57
177
  const ownEndpoint = core.options.endpoint;
58
178
  return async function fgTrackerFetch(input, init) {
59
- if (!core.enabled || !core.currentContext())
179
+ // Dentro de uma chamada do AWS SDK (handler de fetch), o span dela já cobre este HTTP (S08).
180
+ const parent = core.currentContext();
181
+ if (!core.enabled || !parent)
60
182
  return base(input, init);
61
183
  const { method, url, raw } = describe(input, init);
184
+ if (parent.httpCovered) {
185
+ if (url)
186
+ core.noteCoveredHttp(url);
187
+ return base(input, init);
188
+ }
62
189
  if (!url || raw.startsWith(ownEndpoint))
63
190
  return base(input, init);
64
191
  const name = `${method} ${url.origin}${normalizePath(url.pathname)}`;
@@ -79,14 +206,34 @@ export function createInstrumentedFetch(core, fetchImpl = globalThis.fetch) {
79
206
  }
80
207
  }
81
208
  let request = { input, init };
209
+ let follow = null;
82
210
  if (shouldPropagate(core.options.propagateTraceTo, url)) {
83
- request = withTraceContext(input, init, traceContextHeaders(span.context()));
211
+ const headers = traceContextHeaders(span.context());
212
+ const redirect = init?.redirect ?? (input instanceof Request ? input.redirect : 'follow');
213
+ // `baggage` só para quem também está em `propagateBaggageTo` (padrão: ninguém). Com redirect
214
+ // automático, os saltos são conferidos um a um (`followRedirects`), e só na chamada simples
215
+ // (`manualFollowSafe`); nos outros casos o `baggage` não vai e o fetch nativo segue o redirect.
216
+ const simple = manualFollowSafe(input, init);
217
+ if (span.baggage && shouldPropagate(core.options.propagateBaggageTo, url) && (redirect !== 'follow' || simple)) {
218
+ headers[BAGGAGE_HEADER] = span.baggage;
219
+ }
220
+ const prepared = withTraceContext(input, init, headers);
221
+ request = prepared;
222
+ if (redirect === 'follow' && prepared.injected[BAGGAGE_HEADER] !== undefined) {
223
+ // O corpo é congelado agora (antes de qualquer `await`), e o mesmo retrato vai em todos os saltos.
224
+ const body = frozenBody(init?.body);
225
+ const first = init && 'body' in init ? { input: prepared.input, init: { ...prepared.init, body } } : prepared;
226
+ follow = () => followRedirects(base, first, { url, method, body }, prepared.injected, (next) => {
227
+ const trace = shouldPropagate(core.options.propagateTraceTo, next);
228
+ return { trace, baggage: trace && shouldPropagate(core.options.propagateBaggageTo, next) };
229
+ });
230
+ }
84
231
  span.setAttribute('propagated', true);
85
232
  }
86
233
  let handedOff = false;
87
234
  const signal = init?.signal ?? (input instanceof Request ? input.signal : undefined);
88
235
  try {
89
- const res = await core.runInSpan(span, () => base(request.input, request.init));
236
+ const res = await core.runInSpan(span, () => (follow ? follow() : base(request.input, request.init)));
90
237
  span.statusCode = res.status;
91
238
  if (res.status >= 500)
92
239
  span.error = { name: 'HttpError', message: `HTTP ${res.status}` };
package/dist/fetch.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,8 +6,8 @@ export type { NestContainerLike, NestInstrumentationOptions } from './nest.js';
6
6
  export { MIN_POOL_WAIT_MS } from './pool-wait.js';
7
7
  export { normalizePath, normalizeSql } from './normalize.js';
8
8
  export { detectEnvironment, detectRelease, shouldPropagate } from './tracker.js';
9
- export { formatTraceparent, parseTraceContext, parseTraceparent, TRACEPARENT_HEADER, TRACESTATE_HEADER } from './context.js';
10
- export { DEFAULT_SCRUB_FIELDS, scrubAttributes } from './scrub.js';
9
+ export { BAGGAGE_HEADER, formatTraceparent, parseTraceContext, parseTraceparent, sanitizeBaggage, TRACEPARENT_HEADER, TRACESTATE_HEADER } from './context.js';
10
+ export { DEFAULT_SCRUB_FIELDS, scrubAttributes, scrubText, scrubUrl } from './scrub.js';
11
11
  export { API_KEY_HEADER, DEFAULT_ENDPOINT, readEnv } from './constants.js';
12
12
  export { InfraAggregator, detectArchitecture, infraKey } from './infra/aggregator.js';
13
13
  export type { InfraAggregate, InfraAggregatorOptions, InfraKind, InfraResourceRef } from './infra/aggregator.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAiBxG,OAAO,KAAK,EAAsE,OAAO,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAEvI,YAAY,EACV,UAAU,EACV,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,OAAO,EACP,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC7H,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtF,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACzJ,OAAO,EACL,6BAA6B,EAC7B,SAAS,EACT,mBAAmB,EACnB,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACpH,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE7F;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CA6H9D;AAyBD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC5I,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtH,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,8 +17,8 @@ import { wrapLambdaHandler } from './infra/lambda.js';
17
17
  export { MIN_POOL_WAIT_MS } from './pool-wait.js';
18
18
  export { normalizePath, normalizeSql } from './normalize.js';
19
19
  export { detectEnvironment, detectRelease, shouldPropagate } from './tracker.js';
20
- export { formatTraceparent, parseTraceContext, parseTraceparent, TRACEPARENT_HEADER, TRACESTATE_HEADER } from './context.js';
21
- export { DEFAULT_SCRUB_FIELDS, scrubAttributes } from './scrub.js';
20
+ export { BAGGAGE_HEADER, formatTraceparent, parseTraceContext, parseTraceparent, sanitizeBaggage, TRACEPARENT_HEADER, TRACESTATE_HEADER } from './context.js';
21
+ export { DEFAULT_SCRUB_FIELDS, scrubAttributes, scrubText, scrubUrl } from './scrub.js';
22
22
  export { API_KEY_HEADER, DEFAULT_ENDPOINT, readEnv } from './constants.js';
23
23
  export { InfraAggregator, detectArchitecture, infraKey } from './infra/aggregator.js';
24
24
  export { parseArn, sqsQueueRef } from './infra/aws.js';