fg-tracker-sdk 0.9.0 → 0.11.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.
- package/CHANGELOG.md +36 -0
- package/README.md +83 -10
- package/dist/context.d.ts +16 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -0
- package/dist/context.js.map +1 -1
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +34 -5
- package/dist/database.js.map +1 -1
- package/dist/exit-hooks.d.ts +23 -0
- package/dist/exit-hooks.d.ts.map +1 -0
- package/dist/exit-hooks.js +88 -0
- package/dist/exit-hooks.js.map +1 -0
- package/dist/express.js +2 -2
- package/dist/express.js.map +1 -1
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js +16 -8
- package/dist/fetch.js.map +1 -1
- package/dist/global-errors.d.ts +8 -5
- package/dist/global-errors.d.ts.map +1 -1
- package/dist/global-errors.js +59 -10
- package/dist/global-errors.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -7
- package/dist/index.js.map +1 -1
- package/dist/infra/aggregator.d.ts +5 -0
- package/dist/infra/aggregator.d.ts.map +1 -1
- package/dist/infra/aggregator.js.map +1 -1
- package/dist/infra/aws.d.ts +45 -3
- package/dist/infra/aws.d.ts.map +1 -1
- package/dist/infra/aws.js +419 -29
- package/dist/infra/aws.js.map +1 -1
- package/dist/infra/lambda.d.ts +19 -0
- package/dist/infra/lambda.d.ts.map +1 -1
- package/dist/infra/lambda.js +63 -10
- package/dist/infra/lambda.js.map +1 -1
- package/dist/infra/messaging.d.ts +133 -0
- package/dist/infra/messaging.d.ts.map +1 -0
- package/dist/infra/messaging.js +366 -0
- package/dist/infra/messaging.js.map +1 -0
- package/dist/logs/shipper.d.ts +5 -4
- package/dist/logs/shipper.d.ts.map +1 -1
- package/dist/logs/shipper.js +170 -52
- package/dist/logs/shipper.js.map +1 -1
- package/dist/logs/types.d.ts +18 -2
- package/dist/logs/types.d.ts.map +1 -1
- package/dist/next.js +2 -2
- package/dist/next.js.map +1 -1
- package/dist/node-http.d.ts.map +1 -1
- package/dist/node-http.js +7 -3
- package/dist/node-http.js.map +1 -1
- package/dist/normalize.d.ts +32 -0
- package/dist/normalize.d.ts.map +1 -1
- package/dist/normalize.js +165 -10
- package/dist/normalize.js.map +1 -1
- package/dist/pg.d.ts +8 -3
- package/dist/pg.d.ts.map +1 -1
- package/dist/pg.js +512 -41
- package/dist/pg.js.map +1 -1
- package/dist/scrub.d.ts +5 -0
- package/dist/scrub.d.ts.map +1 -1
- package/dist/scrub.js +17 -1
- package/dist/scrub.js.map +1 -1
- package/dist/tracker.d.ts +109 -7
- package/dist/tracker.d.ts.map +1 -1
- package/dist/tracker.js +502 -95
- package/dist/tracker.js.map +1 -1
- package/dist/transport.d.ts +115 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +323 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +61 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -1
package/dist/infra/lambda.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SpanContext } from '../context.js';
|
|
1
2
|
import type { TrackerCore } from '../tracker.js';
|
|
2
3
|
/** Contexto mínimo da Lambda (tipo estrutural; sem `@types/aws-lambda`). */
|
|
3
4
|
export interface LambdaContextLike {
|
|
@@ -13,7 +14,24 @@ export interface WrapLambdaOptions {
|
|
|
13
14
|
flushTimeoutMs?: number;
|
|
14
15
|
/** Cria um span raiz `custom` por invocação (spans de AWS/db/fetch passam a formar um trace). Default `true`. */
|
|
15
16
|
span?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Continua o trace de um evento de origem única: uma mensagem SQS (`Records` com um record),
|
|
19
|
+
* um evento do EventBridge (`detail.traceparent`) ou uma requisição HTTP (API Gateway, ALB,
|
|
20
|
+
* Function URL: header `traceparent`). Lote com várias mensagens fica num trace próprio, com
|
|
21
|
+
* links para cada produtor. Default `true`.
|
|
22
|
+
*/
|
|
23
|
+
continueTrace?: boolean;
|
|
16
24
|
}
|
|
25
|
+
interface InvocationOrigin {
|
|
26
|
+
/** Contexto de um evento de origem única. */
|
|
27
|
+
remote?: SpanContext;
|
|
28
|
+
/** Contextos das mensagens de um lote (viram links). */
|
|
29
|
+
batch?: (SpanContext | undefined)[];
|
|
30
|
+
/** `aws:sqs`, `aws.events`, `http`. */
|
|
31
|
+
source?: string;
|
|
32
|
+
}
|
|
33
|
+
/** De onde veio a invocação e qual contexto ela traz; nunca lança. */
|
|
34
|
+
export declare function invocationOrigin(event: unknown): InvocationOrigin;
|
|
17
35
|
/** Caminho do executável da camada `fg-tracker-lambda-extension`. */
|
|
18
36
|
export declare const LAMBDA_EXTENSION_PATH = "/opt/extensions/fg-tracker-extension";
|
|
19
37
|
export declare function hasLambdaExtension(): boolean;
|
|
@@ -24,4 +42,5 @@ export declare function flushWithTimeout(core: TrackerCore, timeoutMs: number):
|
|
|
24
42
|
* a fila sobrevive ao congelamento e é enviada no SIGTERM do encerramento.
|
|
25
43
|
*/
|
|
26
44
|
export declare function wrapLambdaHandler<E, R, C extends LambdaContextLike>(core: TrackerCore, handler: LambdaHandler<E, R, C>, options?: WrapLambdaOptions): LambdaHandler<E, R, C>;
|
|
45
|
+
export {};
|
|
27
46
|
//# sourceMappingURL=lambda.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambda.d.ts","sourceRoot":"","sources":["../../src/infra/lambda.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"lambda.d.ts","sourceRoot":"","sources":["../../src/infra/lambda.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wBAAwB,CAAC,EAAE,MAAM,MAAM,CAAC;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhJ,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iHAAiH;IACjH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,UAAU,gBAAgB;IACxB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,wDAAwD;IACxD,KAAK,CAAC,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IACpC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAqBjE;AAED,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,yCAAyC,CAAC;AAI5E,wBAAgB,kBAAkB,IAAI,OAAO,CAS5C;AAgBD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,iBAAiB,EACjE,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/B,OAAO,GAAE,iBAAsB,GAC9B,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAyCxB"}
|
package/dist/infra/lambda.js
CHANGED
|
@@ -1,4 +1,41 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
+
import { parseTraceContext } from '../context.js';
|
|
3
|
+
import { metaContext, readEventBridgeDetail, readSqsMessage, uniqueLinks } from './messaging.js';
|
|
4
|
+
function headerValue(headers, name) {
|
|
5
|
+
if (!headers || typeof headers !== 'object')
|
|
6
|
+
return undefined;
|
|
7
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
8
|
+
if (key.toLowerCase() === name && typeof value === 'string')
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
/** De onde veio a invocação e qual contexto ela traz; nunca lança. */
|
|
14
|
+
export function invocationOrigin(event) {
|
|
15
|
+
try {
|
|
16
|
+
if (!event || typeof event !== 'object')
|
|
17
|
+
return {};
|
|
18
|
+
const record = event;
|
|
19
|
+
if (Array.isArray(record.Records)) {
|
|
20
|
+
const sqs = record.Records.filter((item) => item?.eventSource === 'aws:sqs');
|
|
21
|
+
if (sqs.length === 0 || sqs.length !== record.Records.length)
|
|
22
|
+
return {};
|
|
23
|
+
const contexts = sqs.map((item) => metaContext(readSqsMessage(item)));
|
|
24
|
+
return sqs.length === 1 ? { remote: contexts[0], source: 'aws:sqs' } : { batch: contexts, source: 'aws:sqs' };
|
|
25
|
+
}
|
|
26
|
+
if (typeof record['detail-type'] === 'string' && typeof record.source === 'string') {
|
|
27
|
+
return { remote: readEventBridgeDetail(record.detail), source: 'aws.events' };
|
|
28
|
+
}
|
|
29
|
+
if (record.headers && typeof record.headers === 'object') {
|
|
30
|
+
const remote = parseTraceContext(headerValue(record.headers, 'traceparent'), headerValue(record.headers, 'tracestate'));
|
|
31
|
+
return remote ? { remote, source: 'http' } : {};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
/* evento em formato inesperado: segue sem contexto */
|
|
36
|
+
}
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
2
39
|
/** Caminho do executável da camada `fg-tracker-lambda-extension`. */
|
|
3
40
|
export const LAMBDA_EXTENSION_PATH = '/opt/extensions/fg-tracker-extension';
|
|
4
41
|
let extensionDetected;
|
|
@@ -33,7 +70,8 @@ export async function flushWithTimeout(core, timeoutMs) {
|
|
|
33
70
|
timer.unref?.();
|
|
34
71
|
});
|
|
35
72
|
try {
|
|
36
|
-
|
|
73
|
+
// O prazo vai para o envio: a requisição é abortada nele e nada fica pendurado no congelamento.
|
|
74
|
+
await Promise.race([core.flushUntil(Date.now() + timeoutMs).catch(() => undefined), timeout]);
|
|
37
75
|
}
|
|
38
76
|
finally {
|
|
39
77
|
if (timer)
|
|
@@ -49,6 +87,7 @@ let coldStart = true;
|
|
|
49
87
|
export function wrapLambdaHandler(core, handler, options = {}) {
|
|
50
88
|
const flushTimeoutMs = Math.max(50, options.flushTimeoutMs ?? 1000);
|
|
51
89
|
const withSpan = options.span ?? true;
|
|
90
|
+
const continueTrace = options.continueTrace ?? true;
|
|
52
91
|
return async function fgTrackerLambda(event, context) {
|
|
53
92
|
if (!core.enabled)
|
|
54
93
|
return handler(event, context);
|
|
@@ -56,15 +95,29 @@ export function wrapLambdaHandler(core, handler, options = {}) {
|
|
|
56
95
|
if (extension)
|
|
57
96
|
installSigtermFlush(core, flushTimeoutMs);
|
|
58
97
|
const functionName = context?.functionName ?? process.env.AWS_LAMBDA_FUNCTION_NAME ?? 'lambda';
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
98
|
+
const origin = withSpan && continueTrace ? invocationOrigin(event) : {};
|
|
99
|
+
const attributes = {
|
|
100
|
+
'faas.name': functionName,
|
|
101
|
+
'faas.coldStart': coldStart,
|
|
102
|
+
...(context?.awsRequestId ? { 'faas.requestId': context.awsRequestId } : {}),
|
|
103
|
+
...(context?.invokedFunctionArn ? { 'aws.resourceArn': context.invokedFunctionArn } : {}),
|
|
104
|
+
...(process.env.AWS_REGION ? { 'aws.region': process.env.AWS_REGION } : {}),
|
|
105
|
+
...(origin.source ? { 'faas.trigger.source': origin.source } : {}),
|
|
106
|
+
};
|
|
107
|
+
if (origin.batch) {
|
|
108
|
+
attributes['messaging.batch.message_count'] = origin.batch.length;
|
|
109
|
+
const { links, dropped } = uniqueLinks(origin.batch);
|
|
110
|
+
if (links.length > 0)
|
|
111
|
+
attributes.links = links;
|
|
112
|
+
if (dropped > 0)
|
|
113
|
+
attributes['links.dropped'] = dropped;
|
|
114
|
+
}
|
|
115
|
+
const name = `lambda ${functionName}`;
|
|
116
|
+
const span = !withSpan
|
|
117
|
+
? null
|
|
118
|
+
: origin.remote
|
|
119
|
+
? core.startRemoteRoot('custom', name, attributes, origin.remote)
|
|
120
|
+
: core.startSpan('custom', name, attributes, null);
|
|
68
121
|
coldStart = false;
|
|
69
122
|
try {
|
|
70
123
|
return await (span ? core.runInSpan(span, () => handler(event, context)) : handler(event, context));
|
package/dist/infra/lambda.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambda.js","sourceRoot":"","sources":["../../src/infra/lambda.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"lambda.js","sourceRoot":"","sources":["../../src/infra/lambda.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { type SpanContext } from '../context.js';
|
|
2
|
+
/**
|
|
3
|
+
* Propagação do contexto W3C por mensagens (CONTRATO.md §16.1): `traceparent`/`tracestate` em
|
|
4
|
+
* `MessageAttributes` do SQS e no `Detail` do EventBridge, dentro das cotas de cada serviço.
|
|
5
|
+
* A regra é sempre a mesma: se o contexto não cabe, a mensagem segue exatamente como o usuário a
|
|
6
|
+
* montou. A publicação nunca falha por causa da instrumentação.
|
|
7
|
+
*/
|
|
8
|
+
/** SQS: no máximo 10 atributos por mensagem. */
|
|
9
|
+
export declare const SQS_MAX_MESSAGE_ATTRIBUTES = 10;
|
|
10
|
+
/** SQS: 1 MiB por mensagem (corpo + nome, tipo e valor dos atributos) e por lote (soma das entradas). */
|
|
11
|
+
export declare const SQS_MAX_MESSAGE_BYTES = 1048576;
|
|
12
|
+
export declare const SQS_MAX_BATCH_BYTES = 1048576;
|
|
13
|
+
/** Menor `MaximumMessageSize` que uma fila aceita: abaixo disto nenhuma fila recusa por tamanho. */
|
|
14
|
+
export declare const SQS_MIN_MESSAGE_BYTES = 1024;
|
|
15
|
+
/** EventBridge `PutEvents`: a soma das entradas tem de ficar abaixo de 1 MiB. */
|
|
16
|
+
export declare const EVENTBRIDGE_MAX_REQUEST_BYTES = 1048576;
|
|
17
|
+
/** Atributos de mensagem que a instrumentação lê (o SQS só os devolve quando pedidos). */
|
|
18
|
+
export declare const SQS_CONTEXT_ATTRIBUTES: readonly ["traceparent", "tracestate"];
|
|
19
|
+
/** Atributos de sistema que dão o atraso de fila e as tentativas. */
|
|
20
|
+
export declare const SQS_SYSTEM_ATTRIBUTES: readonly ["SentTimestamp", "ApproximateReceiveCount"];
|
|
21
|
+
/** No máximo tantos links por span; o resto é contado em `links.dropped`. */
|
|
22
|
+
export declare const MAX_LINKS = 32;
|
|
23
|
+
export type PropagationSkip = 'present' | 'attribute_limit' | 'size_limit' | 'batch_size_limit' | 'not_json_object';
|
|
24
|
+
export interface SqsAttributeValueLike {
|
|
25
|
+
DataType?: string;
|
|
26
|
+
StringValue?: string;
|
|
27
|
+
BinaryValue?: Uint8Array;
|
|
28
|
+
[key: string]: unknown;
|
|
29
|
+
}
|
|
30
|
+
/** Bytes de um atributo de mensagem como o SQS conta: nome + tipo + valor. */
|
|
31
|
+
export declare function sqsAttributeBytes(name: string, value: unknown): number;
|
|
32
|
+
/** Tamanho de uma mensagem SQS como a cota conta: corpo + atributos de mensagem. */
|
|
33
|
+
export declare function sqsMessageBytes(body: unknown, attributes: unknown): number;
|
|
34
|
+
export interface SqsInjection<E> {
|
|
35
|
+
entry: E;
|
|
36
|
+
injected: boolean;
|
|
37
|
+
addedBytes: number;
|
|
38
|
+
skipped?: PropagationSkip;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Acrescenta o contexto aos `MessageAttributes` de uma mensagem (`SendMessage` ou entrada de
|
|
42
|
+
* `SendMessageBatch`) quando cabe: atributo livre (máx. 10), bytes livres na mensagem e no
|
|
43
|
+
* orçamento do lote (`budgetBytes`). Sem espaço para os dois, vai só o `traceparent`. Contexto já
|
|
44
|
+
* presente fica como está. A entrada original nunca é alterada: a injetada é uma cópia.
|
|
45
|
+
*/
|
|
46
|
+
export declare function injectSqsContext<E extends Record<string, unknown>>(entry: E, ctx: SpanContext, limits: {
|
|
47
|
+
messageBytes: number;
|
|
48
|
+
budgetBytes: number;
|
|
49
|
+
}): SqsInjection<E>;
|
|
50
|
+
/**
|
|
51
|
+
* `MD5OfMessageAttributes` pelo algoritmo do SQS: atributos em ordem de nome; para cada um,
|
|
52
|
+
* tamanho (4 bytes, big-endian) + nome, tamanho + tipo, 1 byte de transporte (1 = String/Number,
|
|
53
|
+
* 2 = Binary) e tamanho + valor. `undefined` quando não há atributo.
|
|
54
|
+
*/
|
|
55
|
+
export declare function sqsAttributesMd5(attributes: unknown): string | undefined;
|
|
56
|
+
export interface ReceivePlan {
|
|
57
|
+
input: Record<string, unknown>;
|
|
58
|
+
/** Atributos de mensagem que só a instrumentação pediu (removidos da resposta). */
|
|
59
|
+
extraMessageAttributes: string[];
|
|
60
|
+
/** Atributos de sistema que só a instrumentação pediu (removidos da resposta). */
|
|
61
|
+
extraSystemAttributes: string[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* `ReceiveMessage`: acrescenta `traceparent`/`tracestate` a `MessageAttributeNames` e
|
|
65
|
+
* `SentTimestamp`/`ApproximateReceiveCount` aos atributos de sistema, preservando o que o chamador
|
|
66
|
+
* pediu (`All` fica como está). Quem usa o campo legado `AttributeNames` recebe os de sistema nele.
|
|
67
|
+
*/
|
|
68
|
+
export declare function planReceive(input: Record<string, unknown>): ReceivePlan;
|
|
69
|
+
/** O que a instrumentação leu de uma mensagem recebida. */
|
|
70
|
+
export interface MessageMeta {
|
|
71
|
+
traceparent?: string;
|
|
72
|
+
tracestate?: string;
|
|
73
|
+
sentTimestamp?: number;
|
|
74
|
+
receiveCount?: number;
|
|
75
|
+
messageId?: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Lê o contexto e os atributos de sistema de uma mensagem SQS, no formato do AWS SDK v3
|
|
79
|
+
* (`MessageAttributes`/`Attributes`/`MessageId`) ou do evento da Lambda
|
|
80
|
+
* (`messageAttributes`/`attributes`/`messageId`).
|
|
81
|
+
*/
|
|
82
|
+
export declare function readSqsMessage(record: unknown): MessageMeta;
|
|
83
|
+
export declare function metaContext(meta: MessageMeta | undefined): SpanContext | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Remove de uma mensagem recebida o que só a instrumentação pediu e recalcula o
|
|
86
|
+
* `MD5OfMessageAttributes` sobre o que sobra (ou remove o campo quando não sobra atributo).
|
|
87
|
+
* Sem nada removido, a mensagem volta a mesma.
|
|
88
|
+
*/
|
|
89
|
+
export declare function stripReceivedMessage(message: Record<string, unknown>, plan: ReceivePlan): Record<string, unknown>;
|
|
90
|
+
/**
|
|
91
|
+
* Mensagens recebidas por `ReceiveMessage` instrumentado: o contexto fica aqui (por `MessageId` e
|
|
92
|
+
* `ReceiptHandle`) para o `trackMessage` encontrar depois que os atributos foram retirados da
|
|
93
|
+
* resposta. Limitado em tamanho e tempo; o mais antigo sai primeiro.
|
|
94
|
+
*/
|
|
95
|
+
export declare class ReceivedMessages {
|
|
96
|
+
private readonly maxEntries;
|
|
97
|
+
private readonly ttlMs;
|
|
98
|
+
private readonly entries;
|
|
99
|
+
constructor(maxEntries?: number, ttlMs?: number);
|
|
100
|
+
remember(message: Record<string, unknown>, meta: MessageMeta): void;
|
|
101
|
+
lookup(record: unknown): MessageMeta | undefined;
|
|
102
|
+
get size(): number;
|
|
103
|
+
}
|
|
104
|
+
/** Tamanho de uma entrada de `PutEvents` como o EventBridge conta. */
|
|
105
|
+
export declare function eventBridgeEntryBytes(entry: unknown): number;
|
|
106
|
+
export interface DetailInjection<E> {
|
|
107
|
+
entry: E;
|
|
108
|
+
injected: boolean;
|
|
109
|
+
addedBytes: number;
|
|
110
|
+
skipped?: PropagationSkip;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Acrescenta o contexto ao `Detail` de uma entrada de `PutEvents` quando ele é um objeto JSON,
|
|
114
|
+
* ainda não tem `traceparent` e o acréscimo cabe no orçamento que sobra do pedido. O texto do
|
|
115
|
+
* usuário é preservado byte a byte: o contexto entra logo depois do `{` inicial.
|
|
116
|
+
*/
|
|
117
|
+
export declare function injectEventBridgeContext<E extends Record<string, unknown>>(entry: E, ctx: SpanContext, budgetBytes: number): DetailInjection<E>;
|
|
118
|
+
/** Contexto de um evento do EventBridge entregue à Lambda (`detail.traceparent`). */
|
|
119
|
+
export declare function readEventBridgeDetail(detail: unknown): SpanContext | undefined;
|
|
120
|
+
export interface SpanLink {
|
|
121
|
+
traceId: string;
|
|
122
|
+
spanId: string;
|
|
123
|
+
}
|
|
124
|
+
/** Links únicos (por trace/span), no máximo `MAX_LINKS`; devolve também quantos ficaram de fora. */
|
|
125
|
+
export declare function uniqueLinks(contexts: (SpanContext | undefined)[]): {
|
|
126
|
+
links: SpanLink[];
|
|
127
|
+
dropped: number;
|
|
128
|
+
};
|
|
129
|
+
/** Erro de validação do serviço (nada foi publicado): a chamada pode ser repetida sem o contexto. */
|
|
130
|
+
export declare function isValidationError(error: unknown): boolean;
|
|
131
|
+
/** Código de falha por entrada (lote) que indica limite ou atributo inválido. */
|
|
132
|
+
export declare function isValidationCode(code: unknown): boolean;
|
|
133
|
+
//# sourceMappingURL=messaging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../src/infra/messaging.ts"],"names":[],"mappings":"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"}
|