@noego/telemetry 0.0.5 → 0.1.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/README.md +6 -0
- package/dist/browser/index.d.cts +6 -5
- package/dist/browser/index.d.ts +6 -5
- package/dist/{browser_telemetry_client-BSAMZ8Qb.d.cts → browser_telemetry_client-ClZl3awO.d.cts} +2 -2
- package/dist/{browser_telemetry_client-DPBU6NGw.d.ts → browser_telemetry_client-t4dPp8Ku.d.ts} +2 -2
- package/dist/cli/telemetry_bin.cjs +393 -35
- package/dist/cli/telemetry_bin.cjs.map +1 -1
- package/dist/cli/telemetry_bin.js +378 -20
- package/dist/cli/telemetry_bin.js.map +1 -1
- package/dist/cli/telemetry_cli.cjs +393 -35
- package/dist/cli/telemetry_cli.cjs.map +1 -1
- package/dist/cli/telemetry_cli.d.cts +35 -5
- package/dist/cli/telemetry_cli.d.ts +35 -5
- package/dist/cli/telemetry_cli.js +378 -20
- package/dist/cli/telemetry_cli.js.map +1 -1
- package/dist/{client_defaults-ShVYQYmn.d.ts → client_defaults-CZ8PysZX.d.ts} +2 -2
- package/dist/{client_defaults-Dk0MMzvx.d.cts → client_defaults-lDbWYWWK.d.cts} +2 -2
- package/dist/core/index.cjs +5 -1
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +15 -12
- package/dist/core/index.d.ts +15 -12
- package/dist/core/index.js +5 -1
- package/dist/core/index.js.map +1 -1
- package/dist/electron/index.d.cts +5 -4
- package/dist/electron/index.d.ts +5 -4
- package/dist/{envelope.types-rOLpWXRC.d.cts → envelope.types-DIvZD3xH.d.ts} +2 -6
- package/dist/{envelope.types-rOLpWXRC.d.ts → envelope.types-DyrlRG49.d.cts} +2 -6
- package/dist/{in_memory_batch_transport-DKW9EZnU.d.cts → in_memory_batch_transport-3T6gElXP.d.cts} +1 -1
- package/dist/{in_memory_batch_transport-oOwNxXnA.d.ts → in_memory_batch_transport-DpQU6JqM.d.ts} +1 -1
- package/dist/index.cjs +5 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -12
- package/dist/index.d.ts +14 -12
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/json.types-BqS77fcN.d.cts +7 -0
- package/dist/json.types-BqS77fcN.d.ts +7 -0
- package/dist/{maintenance_coordinator.types-C4ULi4A4.d.cts → maintenance_coordinator.types-Crhx9i9k.d.cts} +3 -3
- package/dist/{maintenance_coordinator.types-ikUrRXmO.d.ts → maintenance_coordinator.types-DprmgpVn.d.ts} +3 -3
- package/dist/metric.types-D8aOAnUm.d.ts +67 -0
- package/dist/metric.types-Dg4eZq6u.d.cts +67 -0
- package/dist/{metric_definition_contract-BYtnODhu.d.ts → metric_definition_contract-C6MERhJs.d.ts} +1 -1
- package/dist/{metric_definition_contract-DfhhmTZ1.d.cts → metric_definition_contract-DoAk7NOw.d.cts} +1 -1
- package/dist/node/index.cjs +5 -1
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +11 -9
- package/dist/node/index.d.ts +11 -9
- package/dist/node/index.js +5 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/producer/index.d.cts +5 -4
- package/dist/node/producer/index.d.ts +5 -4
- package/dist/projector/index.cjs +1370 -0
- package/dist/projector/index.cjs.map +1 -0
- package/dist/projector/index.d.cts +246 -0
- package/dist/projector/index.d.ts +246 -0
- package/dist/projector/index.js +1328 -0
- package/dist/projector/index.js.map +1 -0
- package/dist/{query.types-DU5v7vM0.d.ts → query.types-CRqAsGTX.d.cts} +4 -66
- package/dist/{query.types-DuYWbFFe.d.cts → query.types-DnOMYXpC.d.ts} +4 -66
- package/dist/sqlite/index.cjs +5 -1
- package/dist/sqlite/index.cjs.map +1 -1
- package/dist/sqlite/index.d.cts +7 -5
- package/dist/sqlite/index.d.ts +7 -5
- package/dist/sqlite/index.js +5 -1
- package/dist/sqlite/index.js.map +1 -1
- package/dist/{storage.types-k7oElEB3.d.ts → storage.types-BKWoIOHp.d.ts} +3 -2
- package/dist/{storage.types-Bji_pWqr.d.cts → storage.types-DHbAm3j_.d.cts} +3 -2
- package/dist/{telemetry_client-BO5Pjp41.d.cts → telemetry_client-Bg5tbj5E.d.cts} +3 -2
- package/dist/{telemetry_client-D8uZ-mTL.d.ts → telemetry_client-DWKgufmc.d.ts} +3 -2
- package/dist/{telemetry_configuration_parser-BZ8Nvnle.d.ts → telemetry_configuration_parser-6BR3_dD_.d.ts} +2 -2
- package/dist/{telemetry_configuration_parser-CgSN7R6A.d.cts → telemetry_configuration_parser-ybeweUPE.d.cts} +2 -2
- package/dist/testing/index.d.cts +7 -5
- package/dist/testing/index.d.ts +7 -5
- package/dist/trace-adapter/index.d.cts +4 -3
- package/dist/trace-adapter/index.d.ts +4 -3
- package/dist/{transport.types-BAl_TRtU.d.cts → transport.types-C2dP-eed.d.cts} +1 -1
- package/dist/{transport.types-DDnZoKWi.d.ts → transport.types-SA8KpLiK.d.ts} +1 -1
- package/native/noego_telemetry_native.node +0 -0
- package/package.json +11 -4
package/dist/core/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/index.ts","../../src/core/helper/canonical_json.ts","../../src/core/bounded_metadata_snapshotter.ts","../../src/core/metric_definition_contract.ts","../../src/core/metric_extractor.ts","../../src/core/telemetry_acknowledgement_contract.ts","../../src/core/helper/client_defaults.ts","../../src/core/telemetry_batch_contract.ts","../../src/core/helper/telemetry_deadline_guard.ts","../../src/core/telemetry_batch_router.ts","../../src/core/telemetry_client.ts","../../src/core/telemetry_storage_router.ts"],"sourcesContent":["export { BoundedMetadataSnapshotter } from './bounded_metadata_snapshotter.js';\nexport { MetricDefinitionContract } from './metric_definition_contract.js';\nexport { MetricExtractor } from './metric_extractor.js';\nexport { TelemetryAcknowledgementContract } from './telemetry_acknowledgement_contract.js';\nexport { TelemetryBatchContract } from './telemetry_batch_contract.js';\nexport { TelemetryBatchRouter } from './telemetry_batch_router.js';\nexport { TelemetryClient } from './telemetry_client.js';\nexport { TelemetryStorageRouter } from './telemetry_storage_router.js';\nexport {\n DEFAULT_METADATA_SNAPSHOT_LIMITS,\n DEFAULT_TELEMETRY_ADMISSION_POLICY,\n DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS,\n} from './helper/client_defaults.js';\nexport type {\n TelemetryAdmissionPolicy,\n TelemetryAdmissionPriority,\n TelemetryAdmissionResult,\n TelemetryClientOptions,\n TelemetryClientStatus,\n TelemetryMinimumLevel,\n} from './types/client.types.js';\nexport type {\n ResolvedTelemetryConfiguration,\n SqliteMaintenanceConfiguration,\n SqliteRetentionConfiguration,\n SqliteSchemaConfiguration,\n SqliteTableOverrides,\n SqliteTargetConfiguration,\n TelemetryRole,\n} from './types/configuration.types.js';\nexport type {\n TelemetryAdmitInput,\n TelemetryEmitInput,\n TelemetryEnvelope,\n TelemetryLevel,\n} from './types/envelope.types.js';\nexport type {\n TelemetryJsonObject,\n TelemetryJsonPrimitive,\n TelemetryJsonValue,\n} from './types/json.types.js';\nexport type {\n ExtractedMetricSample,\n MetricAggregate,\n MetricCardinalityRule,\n MetricDefinition,\n MetricExtraction,\n MetricExtractionFailure,\n MetricMeasurement,\n MetricOverflowPolicy,\n MetricRollupValues,\n} from './types/metric.types.js';\nexport type {\n MetadataRedactionRule,\n MetadataSnapshot,\n MetadataSnapshotLimits,\n MetadataSnapshotStats,\n} from './types/metadata.types.js';\nexport type {\n MetricBucket,\n MetricQuery,\n MetricQueryGap,\n MetricQueryResponse,\n MetricQuerySegment,\n TelemetryQueryError,\n TimelineGap,\n TimelineQuery,\n TimelineQueryResponse,\n} from './types/query.types.js';\nexport type { TelemetryResult } from './types/result.types.js';\nexport type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageRouterOptions,\n TelemetryStorageTarget,\n TelemetryStorageTransport,\n} from './types/storage.types.js';\nexport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryBatchRoute,\n TelemetryBatchRouterOptions,\n TelemetryBatchTransport,\n TelemetryBatchTransportCapabilities,\n TelemetryBatchValidationLimits,\n TelemetryDeliveryMode,\n TelemetryDropCounter,\n TelemetryTargetDeliveryState,\n} from './types/transport.types.js';\n","const UTF8_ENCODER = new TextEncoder();\n\n/**\n * Canonical key order is UTF-8 byte order. This must stay byte-identical to\n * the native Rust collector, whose serde_json BTreeMap serialization sorts\n * object keys the same way; locale-aware comparisons (localeCompare) depend\n * on the ICU build and diverge from the Rust side, which invalidates every\n * cross-language checksum.\n */\nexport function compareCanonicalKeys(left: string, right: string): number {\n if (left === right) return 0;\n // Code-unit comparison equals UTF-8 byte order for ASCII-only keys.\n // eslint-disable-next-line no-control-regex\n if (/^[\\x00-\\x7f]*$/.test(left) && /^[\\x00-\\x7f]*$/.test(right)) {\n return left < right ? -1 : 1;\n }\n const leftBytes = UTF8_ENCODER.encode(left);\n const rightBytes = UTF8_ENCODER.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const difference = (leftBytes[index] ?? 0) - (rightBytes[index] ?? 0);\n if (difference !== 0) return difference;\n }\n return leftBytes.length - rightBytes.length;\n}\n\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error('Canonical telemetry JSON cannot encode a non-finite number');\n }\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((item) => canonicalJson(item));\n return `[${items.join(',')}]`;\n }\n\n if (typeof value !== 'object') {\n throw new Error(`Canonical telemetry JSON cannot encode ${typeof value}`);\n }\n\n const entries = Object.entries(value).sort(([left], [right]) => compareCanonicalKeys(left, right));\n const properties = entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`);\n return `{${properties.join(',')}}`;\n}\n\nexport function telemetryUtf8Length(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nexport function telemetryChecksum(value: unknown): string {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = BigInt.asUintN(64, hash * prime);\n }\n\n return hash.toString(16).padStart(16, '0');\n}\n","import { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from './types/json.types.js';\nimport type { MetadataSnapshot, MetadataSnapshotLimits, MetadataSnapshotStats } from './types/metadata.types.js';\n\nconst SENTINEL_CIRCULAR = '[telemetry:circular]';\nconst SENTINEL_TRUNCATED = '[telemetry:truncated]';\n\nexport class BoundedMetadataSnapshotter {\n constructor(private readonly limits: MetadataSnapshotLimits) {\n this.validateLimits();\n }\n\n snapshot(input: unknown): MetadataSnapshot {\n const state = {\n bytes: 0,\n properties: 0,\n truncatedValues: 0,\n redactedValues: 0,\n serializationFailures: 0,\n seen: new WeakSet<object>(),\n };\n\n let normalized: TelemetryJsonValue;\n try {\n normalized = this.normalize(input, '$', 0, state);\n } catch {\n state.serializationFailures += 1;\n normalized = { __telemetry: '[telemetry:snapshot-failed]' };\n }\n\n const root = this.ensureObject(normalized);\n const canonical = canonicalJson(root);\n const metadata = telemetryUtf8Length(canonical) <= this.limits.maxBytes\n ? root\n : Object.freeze({ __telemetry: SENTINEL_TRUNCATED });\n if (metadata !== root) {\n state.truncatedValues += 1;\n }\n\n const stats: MetadataSnapshotStats = Object.freeze({\n estimatedBytes: Math.min(telemetryUtf8Length(canonical), this.limits.maxBytes),\n truncatedValues: state.truncatedValues,\n redactedValues: state.redactedValues,\n serializationFailures: state.serializationFailures,\n });\n\n return Object.freeze({ metadata, stats });\n }\n\n private normalize(\n input: unknown,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonValue {\n const replacement = this.redactionFor(path);\n if (replacement !== null) {\n state.redactedValues += 1;\n return replacement;\n }\n\n if (depth > this.limits.maxDepth || state.bytes >= this.limits.maxBytes) {\n state.truncatedValues += 1;\n return SENTINEL_TRUNCATED;\n }\n\n if (input === null || typeof input === 'boolean') {\n return input;\n }\n if (typeof input === 'string') {\n return this.normalizeString(input, state);\n }\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : `[telemetry:number:${String(input)}]`;\n }\n if (typeof input === 'bigint') {\n return `[telemetry:bigint:${input.toString()}]`;\n }\n if (typeof input === 'undefined') {\n return '[telemetry:undefined]';\n }\n if (typeof input === 'symbol') {\n return `[telemetry:symbol:${input.description ?? ''}]`;\n }\n if (typeof input === 'function') {\n return '[telemetry:function]';\n }\n if (input instanceof Error) {\n return this.normalizeError(input, path, depth, state);\n }\n if (typeof input !== 'object') {\n return `[telemetry:unsupported:${typeof input}]`;\n }\n if (state.seen.has(input)) {\n return SENTINEL_CIRCULAR;\n }\n\n state.seen.add(input);\n try {\n return Array.isArray(input)\n ? this.normalizeArray(input, path, depth, state)\n : this.normalizeObject(input, path, depth, state);\n } finally {\n state.seen.delete(input);\n }\n }\n\n private normalizeString(\n input: string,\n state: { bytes: number; truncatedValues: number },\n ): string {\n const stringLimit = Math.min(this.limits.maxStringLength, Math.max(0, this.limits.maxBytes - state.bytes));\n const truncated = input.length > stringLimit;\n const normalized = truncated ? input.slice(0, stringLimit) : input;\n state.bytes += telemetryUtf8Length(normalized);\n if (truncated) {\n state.truncatedValues += 1;\n }\n return normalized;\n }\n\n private normalizeArray(\n input: readonly unknown[],\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): readonly TelemetryJsonValue[] {\n const length = Math.min(input.length, this.limits.maxArrayLength);\n const values: TelemetryJsonValue[] = [];\n for (let index = 0; index < length; index += 1) {\n let item: unknown;\n try {\n item = input[index];\n } catch {\n state.serializationFailures += 1;\n item = '[telemetry:property-read-failed]';\n }\n values.push(this.normalize(item, `${path}[${index}]`, depth + 1, state));\n }\n if (input.length > length) {\n values.push(SENTINEL_TRUNCATED);\n state.truncatedValues += 1;\n }\n return Object.freeze(values);\n }\n\n private normalizeObject(\n input: object,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n let keys: string[];\n try {\n keys = Object.keys(input).sort((left, right) => left.localeCompare(right));\n } catch {\n state.serializationFailures += 1;\n return Object.freeze({ __telemetry: '[telemetry:keys-failed]' });\n }\n\n const output: Record<string, TelemetryJsonValue> = {};\n for (const key of keys) {\n if (state.properties >= this.limits.maxProperties) {\n output.__telemetry = SENTINEL_TRUNCATED;\n state.truncatedValues += 1;\n break;\n }\n state.properties += 1;\n state.bytes += telemetryUtf8Length(key);\n const childPath = path === '$' ? key : `${path}.${key}`;\n const redaction = this.redactionFor(childPath);\n if (redaction !== null) {\n output[key] = redaction;\n state.redactedValues += 1;\n continue;\n }\n\n let property: unknown;\n try {\n property = Reflect.get(input, key);\n } catch {\n state.serializationFailures += 1;\n property = '[telemetry:property-read-failed]';\n }\n output[key] = this.normalize(property, childPath, depth + 1, state);\n }\n return Object.freeze(output);\n }\n\n private normalizeError(\n error: Error,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n const name = this.readErrorField(error, 'name', state);\n const message = this.readErrorField(error, 'message', state);\n const stack = this.readErrorField(error, 'stack', state).slice(0, this.limits.maxErrorStackLength);\n return Object.freeze({\n name: this.normalize(name, `${path}.name`, depth + 1, state),\n message: this.normalize(message, `${path}.message`, depth + 1, state),\n stack: this.normalize(stack, `${path}.stack`, depth + 1, state),\n });\n }\n\n private readErrorField(\n error: Error,\n field: 'name' | 'message' | 'stack',\n state: { serializationFailures: number },\n ): string {\n try {\n return typeof error[field] === 'string' ? error[field] : '';\n } catch {\n state.serializationFailures += 1;\n return '[telemetry:error-field-read-failed]';\n }\n }\n\n private ensureObject(value: TelemetryJsonValue): TelemetryJsonObject {\n return this.isJsonObject(value) ? value : Object.freeze({ value });\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private redactionFor(path: string): string | null {\n const matchingRule = this.limits.redactions.find((rule) => rule.path === path);\n return matchingRule?.replacement ?? null;\n }\n\n private validateLimits(): void {\n const limits = [\n this.limits.maxBytes,\n this.limits.maxDepth,\n this.limits.maxProperties,\n this.limits.maxArrayLength,\n this.limits.maxStringLength,\n this.limits.maxErrorStackLength,\n ];\n const hasInvalidLimit = limits.some((limit) => !Number.isInteger(limit) || limit <= 0);\n if (hasInvalidLimit) {\n throw new Error('Metadata snapshot limits must be positive integers');\n }\n }\n}\n","import type { MetricDefinition } from './types/metric.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\n\nexport class MetricDefinitionContract {\n normalize(definition: MetricDefinition): TelemetryResult<MetricDefinition, string> {\n const parsedSelector = this.parseSelector(definition.selector);\n if (!parsedSelector.ok) {\n return parsedSelector;\n }\n\n const bracketGroupBy = parsedSelector.value.groupBy;\n const configuredGroupBy = definition.groupBy;\n const bothSpecifyDifferentGrouping = bracketGroupBy.length > 0\n && configuredGroupBy.length > 0\n && bracketGroupBy.join('.') !== configuredGroupBy.join('.');\n if (bothSpecifyDifferentGrouping) {\n return { ok: false, error: `Metric ${definition.name} has conflicting selector and groupBy declarations` };\n }\n const groupBy = configuredGroupBy.length > 0 ? configuredGroupBy : bracketGroupBy;\n\n const basicError = this.validateBasic(definition, parsedSelector.value.selector, groupBy);\n if (basicError !== null) {\n return { ok: false, error: basicError };\n }\n if (parsedSelector.value.wildcardUngrouped\n && definition.measurements.some((measurement) => measurement.kind !== 'count')) {\n return {\n ok: false,\n error: `Metric ${definition.name} uses [*] and may only declare count`,\n };\n }\n\n return {\n ok: true,\n value: Object.freeze({\n ...definition,\n selector: parsedSelector.value.selector,\n groupBy: Object.freeze([...groupBy]),\n resolutionsMs: Object.freeze([...definition.resolutionsMs].sort((left, right) => left - right)),\n measurements: Object.freeze([...definition.measurements]),\n targetIds: Object.freeze([...definition.targetIds]),\n cardinality: Object.freeze({ ...definition.cardinality }),\n }),\n };\n }\n\n matches(selector: string, label: string): boolean {\n const selectorSegments = selector.split('.');\n const labelSegments = label.split('.');\n return this.matchSegments(selectorSegments, labelSegments, 0, 0);\n }\n\n private parseSelector(selector: string): TelemetryResult<Readonly<{\n selector: string;\n groupBy: readonly string[];\n wildcardUngrouped: boolean;\n }>, string> {\n if (selector.startsWith('[')) {\n return { ok: false, error: 'A metric selector cannot omit its event label or glob' };\n }\n\n const bracketStart = selector.lastIndexOf('[');\n if (bracketStart < 0) {\n return { ok: true, value: { selector, groupBy: [], wildcardUngrouped: false } };\n }\n if (!selector.endsWith(']')) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n\n const eventSelector = selector.slice(0, bracketStart);\n const bracket = selector.slice(bracketStart + 1, -1).trim();\n if (!eventSelector || !bracket) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n return {\n ok: true,\n value: {\n selector: eventSelector,\n groupBy: bracket === '*' ? [] : [bracket],\n wildcardUngrouped: bracket === '*',\n },\n };\n }\n\n private validateBasic(\n definition: MetricDefinition,\n selector: string,\n groupBy: readonly string[],\n ): string | null {\n if (!/^[A-Za-z0-9_*][A-Za-z0-9_.:*\\-]*$/.test(selector)) {\n return `Metric ${definition.name} has an invalid selector`;\n }\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(definition.name)) {\n return `Metric name ${definition.name} is invalid`;\n }\n if (!Number.isInteger(definition.version) || definition.version <= 0) {\n return `Metric ${definition.name} must have a positive integer version`;\n }\n if (definition.measurements.length === 0) {\n return `Metric ${definition.name} must declare at least one measurement`;\n }\n const invalidResolution = definition.resolutionsMs.some(\n (resolution) => !Number.isInteger(resolution) || resolution <= 0,\n );\n const duplicateResolution = new Set(definition.resolutionsMs).size !== definition.resolutionsMs.length;\n if (invalidResolution || duplicateResolution || definition.resolutionsMs.length === 0) {\n return `Metric ${definition.name} has invalid or duplicate resolutions`;\n }\n const missingCardinality = groupBy.find((field) => definition.cardinality[field] === undefined);\n if (missingCardinality) {\n return `Metric ${definition.name} is missing cardinality policy for ${missingCardinality}`;\n }\n const invalidCardinality = Object.values(definition.cardinality).some(\n (rule) => !Number.isInteger(rule.maxValuesPerBucket) || rule.maxValuesPerBucket <= 0,\n );\n if (invalidCardinality) {\n return `Metric ${definition.name} has an invalid cardinality limit`;\n }\n return null;\n }\n\n private matchSegments(\n selector: readonly string[],\n label: readonly string[],\n selectorIndex: number,\n labelIndex: number,\n ): boolean {\n if (selectorIndex === selector.length) {\n return labelIndex === label.length;\n }\n const segment = selector[selectorIndex];\n if (segment === '**') {\n if (selectorIndex === selector.length - 1) {\n return true;\n }\n for (let next = labelIndex; next <= label.length; next += 1) {\n if (this.matchSegments(selector, label, selectorIndex + 1, next)) {\n return true;\n }\n }\n return false;\n }\n if (labelIndex >= label.length) {\n return false;\n }\n const segmentMatches = segment === '*' || segment === label[labelIndex];\n return segmentMatches\n && this.matchSegments(selector, label, selectorIndex + 1, labelIndex + 1);\n }\n}\n","import { canonicalJson } from './helper/canonical_json.js';\nimport { MetricDefinitionContract } from './metric_definition_contract.js';\nimport type { TelemetryEnvelope } from './types/envelope.types.js';\nimport type {\n ExtractedMetricSample,\n MetricDefinition,\n MetricExtraction,\n MetricExtractionFailure,\n} from './types/metric.types.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from './types/json.types.js';\n\nexport class MetricExtractor {\n private readonly contract = new MetricDefinitionContract();\n\n constructor(private readonly definitions: readonly MetricDefinition[]) {}\n\n extract(envelopes: readonly TelemetryEnvelope[]): MetricExtraction {\n const samples: ExtractedMetricSample[] = [];\n const failures: MetricExtractionFailure[] = [];\n for (const envelope of envelopes) {\n for (const definition of this.definitions) {\n if (!this.contract.matches(definition.selector, envelope.label)) {\n continue;\n }\n const extracted = this.extractDefinition(definition, envelope);\n if (extracted.ok) {\n samples.push(extracted.sample);\n } else if (definition.missingField === 'record-failure') {\n failures.push({\n metricName: definition.name,\n definitionVersion: definition.version,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n reason: extracted.reason,\n });\n }\n }\n }\n return Object.freeze({\n samples: Object.freeze(samples),\n failures: Object.freeze(failures),\n });\n }\n\n private extractDefinition(\n definition: MetricDefinition,\n envelope: TelemetryEnvelope,\n ):\n | Readonly<{ ok: true; sample: ExtractedMetricSample }>\n | Readonly<{ ok: false; reason: string }> {\n const dimensions: Record<string, TelemetryJsonValue> = {};\n for (const field of definition.groupBy) {\n const dimension = this.readField(envelope, field);\n if (!this.isDimensionValue(dimension)) {\n return { ok: false, reason: `Missing or invalid dimension ${field}` };\n }\n dimensions[field] = dimension;\n }\n\n const values: Record<string, number> = { __count: 1 };\n for (const measurement of definition.measurements) {\n if (measurement.kind === 'count') {\n continue;\n }\n const measured = this.readField(envelope, measurement.field);\n if (typeof measured !== 'number' || !Number.isFinite(measured)) {\n return { ok: false, reason: `Missing or non-numeric measurement ${measurement.field}` };\n }\n values[measurement.field] = measured;\n }\n\n const frozenDimensions = Object.freeze(dimensions);\n return {\n ok: true,\n sample: Object.freeze({\n metricName: definition.name,\n definitionVersion: definition.version,\n occurredAtMs: envelope.occurredAtMs,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n dimensions: frozenDimensions,\n dimensionKey: canonicalJson(frozenDimensions),\n values: Object.freeze(values),\n targetIds: definition.targetIds,\n }),\n };\n }\n\n private readField(envelope: TelemetryEnvelope, path: string): TelemetryJsonValue | undefined {\n const topLevel = this.readTopLevel(envelope, path);\n if (topLevel !== undefined) {\n return topLevel;\n }\n const segments = path.split('.');\n let current: TelemetryJsonValue = envelope.metadata;\n for (const segment of segments) {\n if (!this.isJsonObject(current)) {\n return undefined;\n }\n const nextValue: TelemetryJsonValue | undefined = current[segment];\n if (nextValue === undefined) {\n return undefined;\n }\n current = nextValue;\n }\n return current;\n }\n\n private readTopLevel(envelope: TelemetryEnvelope, path: string): TelemetryJsonValue | undefined {\n switch (path) {\n case 'conversationId':\n return envelope.conversationId;\n case 'correlationId':\n return envelope.correlationId;\n case 'source':\n return envelope.source;\n case 'processKind':\n return envelope.processKind;\n case 'level':\n return envelope.level;\n case 'label':\n return envelope.label;\n case 'producerId':\n return envelope.producerId;\n default:\n return undefined;\n }\n }\n\n private isDimensionValue(value: TelemetryJsonValue | undefined): value is string | number | boolean | null {\n return value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n}\n","import { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryTargetDeliveryState,\n} from './types/transport.types.js';\n\nconst MAX_TARGET_STATES = 1_024;\nconst MAX_TARGET_ID_BYTES = 256;\nconst MAX_REASON_BYTES = 512;\n\nexport class TelemetryAcknowledgementContract {\n exceptionReason(cause: unknown): string {\n try {\n const value = cause instanceof Error ? cause.message : cause;\n return this.truncateReason(String(value));\n } catch {\n return 'Unknown telemetry transport failure';\n }\n }\n\n validateAndDetach(\n batch: TelemetryBatch,\n value: unknown,\n ): TelemetryResult<TelemetryAcknowledgement, string> {\n try {\n const initialError = this.acknowledgementError(batch, value);\n if (initialError !== null) {\n return { ok: false, error: initialError };\n }\n const detached: unknown = JSON.parse(canonicalJson(value));\n const detachedError = this.acknowledgementError(batch, detached);\n if (detachedError !== null) {\n return { ok: false, error: detachedError };\n }\n return { ok: true, value: this.freezeAcknowledgement(detached as TelemetryAcknowledgement) };\n } catch {\n return { ok: false, error: 'acknowledgement could not be inspected' };\n }\n }\n\n private acknowledgementError(batch: TelemetryBatch, value: unknown): string | null {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return 'acknowledgement identity is missing or mismatched';\n }\n const targetsError = this.targetStatesError(value.targetStates);\n if (targetsError !== null) {\n return targetsError;\n }\n switch (value.kind) {\n case 'committed':\n return this.committedAcknowledgementError(batch, value);\n case 'retryable':\n return this.retryableAcknowledgementError(value);\n case 'rejected':\n return this.rejectedAcknowledgementError(value);\n case 'conflict':\n return this.conflictAcknowledgementError(value);\n default:\n return 'acknowledgement kind is invalid';\n }\n }\n\n private committedAcknowledgementError(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])\n && Number.isSafeInteger(value.committedAtMs)\n && Number(value.committedAtMs) >= 0\n && value.acceptedEvents === batch.envelopes.length\n && typeof value.duplicate === 'boolean';\n return valid ? null : 'committed acknowledgement fields are invalid';\n }\n\n private retryableAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])\n && this.isBoundedReason(value.reason)\n && Number.isFinite(value.retryAfterMs)\n && Number(value.retryAfterMs) >= 0\n && Number(value.retryAfterMs) <= Number.MAX_SAFE_INTEGER;\n return valid ? null : 'retryable acknowledgement fields are invalid';\n }\n\n private rejectedAcknowledgementError(value: Record<string, unknown>): string | null {\n const codes = ['invalid-batch', 'unsupported-version', 'no-required-terminal', 'closed'];\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])\n && codes.includes(String(value.code))\n && this.isBoundedReason(value.reason);\n return valid ? null : 'rejected acknowledgement fields are invalid';\n }\n\n private conflictAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])\n && this.isBoundedReason(value.reason);\n return valid ? null : 'conflict acknowledgement fields are invalid';\n }\n\n private targetStatesError(value: unknown): string | null {\n if (!Array.isArray(value)\n || value.length > MAX_TARGET_STATES\n || !this.hasExactArrayIndexes(value)) {\n return 'acknowledgement target states are invalid';\n }\n const targetIds = new Set<string>();\n for (const target of value) {\n if (!this.isValidTargetState(target) || targetIds.has(target.targetId)) {\n return 'acknowledgement target states are invalid';\n }\n targetIds.add(target.targetId);\n }\n return null;\n }\n\n private isValidTargetState(value: unknown): value is Record<string, unknown> & TelemetryTargetDeliveryState {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return false;\n }\n const deliveries = ['required', 'best-effort'];\n const states = ['pending', 'committed', 'failed', 'abandoned'];\n return typeof value.targetId === 'string'\n && value.targetId.length > 0\n && telemetryUtf8Length(value.targetId) <= MAX_TARGET_ID_BYTES\n && deliveries.includes(String(value.delivery))\n && states.includes(String(value.state))\n && Number.isSafeInteger(value.attempts)\n && Number(value.attempts) >= 0\n && (value.reason === null || this.isBoundedReason(value.reason));\n }\n\n private freezeAcknowledgement(value: TelemetryAcknowledgement): TelemetryAcknowledgement {\n const targetStates = value.targetStates.map((target) => Object.freeze({ ...target }));\n return Object.freeze({ ...value, targetStates: Object.freeze(targetStates) });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Reflect.ownKeys(value);\n return keys.length === expected.length\n && keys.every((key) => typeof key === 'string' && expected.includes(key));\n }\n\n private hasExactArrayIndexes(value: readonly unknown[]): boolean {\n const keys = Reflect.ownKeys(value);\n if (keys.length !== value.length + 1 || !keys.includes('length')) {\n return false;\n }\n return value.every((_item, index) => keys.includes(String(index)));\n }\n\n private isBoundedReason(value: unknown): value is string {\n return typeof value === 'string' && telemetryUtf8Length(value) <= MAX_REASON_BYTES;\n }\n\n private truncateReason(value: string): string {\n const encoded = new TextEncoder().encode(value);\n if (encoded.length <= MAX_REASON_BYTES) {\n return value;\n }\n const decoder = new TextDecoder('utf-8', { fatal: true });\n for (let length = MAX_REASON_BYTES; length > 0; length -= 1) {\n try {\n return decoder.decode(encoded.subarray(0, length));\n } catch {\n // At most three trailing continuation bytes need to be removed.\n }\n }\n return '';\n }\n}\n","import type { TelemetryAdmissionPolicy } from '../types/client.types.js';\nimport type { MetadataSnapshotLimits } from '../types/metadata.types.js';\nimport type { TelemetryBatchValidationLimits } from '../types/transport.types.js';\n\nexport const DEFAULT_TELEMETRY_ADMISSION_POLICY: TelemetryAdmissionPolicy = Object.freeze({\n maxQueuedEvents: 2_000,\n maxQueuedBytes: 2_000_000,\n maxBatchEvents: 128,\n maxBatchBytes: 256_000,\n maxInFlightBatches: 1,\n retryLimit: 3,\n retryBaseDelayMs: 25,\n sampleRates: Object.freeze({\n low: 1,\n normal: 1,\n high: 1,\n }),\n});\n\nexport const DEFAULT_METADATA_SNAPSHOT_LIMITS: MetadataSnapshotLimits = Object.freeze({\n maxBytes: 32_768,\n maxDepth: 8,\n maxProperties: 256,\n maxArrayLength: 128,\n maxStringLength: 4_096,\n maxErrorStackLength: 8_192,\n redactions: Object.freeze([]),\n});\n\nexport const DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS: TelemetryBatchValidationLimits = Object.freeze({\n maxBatchEvents: 1_024,\n maxBatchBytes: 1_000_000,\n maxEventBytes: 256_000,\n maxMetadataBytes: 131_072,\n maxMetadataDepth: 16,\n maxMetadataProperties: 1_024,\n maxMetadataArrayLength: 1_024,\n maxMetadataStringBytes: 65_536,\n maxDropCounters: 15,\n maxIdentityBytes: 1_024,\n});\n","import {\n canonicalJson,\n telemetryChecksum,\n telemetryUtf8Length,\n} from './helper/canonical_json.js';\nimport { DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS } from './helper/client_defaults.js';\nimport type { TelemetryEnvelope } from './types/envelope.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n TelemetryBatch,\n TelemetryBatchValidationLimits,\n TelemetryDropCounter,\n} from './types/transport.types.js';\n\nconst BATCH_KEYS = Object.freeze([\n 'schemaVersion',\n 'producerId',\n 'sequenceStart',\n 'sequenceEnd',\n 'idempotencyKey',\n 'checksum',\n 'envelopes',\n 'dropCounters',\n]);\n\nconst ENVELOPE_KEYS = Object.freeze([\n 'schemaVersion',\n 'eventId',\n 'producerId',\n 'sequence',\n 'occurredAtMs',\n 'monotonicNs',\n 'source',\n 'processKind',\n 'level',\n 'label',\n 'conversationId',\n 'correlationId',\n 'metadata',\n]);\n\nconst DROP_COUNTER_KEYS = Object.freeze(['reason', 'priority', 'count']);\nconst DROP_REASONS = new Set(['capacity', 'sampled', 'stopped', 'invalid', 'transport']);\nconst DROP_PRIORITIES = new Set(['low', 'normal', 'high']);\n\ntype JsonValidationState = {\n properties: number;\n bytes: number;\n active: WeakSet<object>;\n};\n\nexport class TelemetryBatchContract {\n static readonly schemaVersion = 1;\n static readonly checksumAlgorithm = 'fnv1a64-canonical-json-v1';\n readonly limits: TelemetryBatchValidationLimits;\n\n constructor(limits: Partial<TelemetryBatchValidationLimits> = {}) {\n this.limits = Object.freeze({\n ...DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS,\n ...limits,\n });\n this.validateLimits();\n }\n\n create(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.createChecked(envelopes, dropCounters);\n } catch {\n return { ok: false, error: 'Telemetry batch creation failed safe validation' };\n }\n }\n\n validate(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.validateChecked(batch);\n } catch {\n return { ok: false, error: 'Telemetry batch validation failed safely' };\n }\n }\n\n private createChecked(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n const payloadError = this.validatePayload(envelopes, dropCounters);\n if (payloadError !== null) {\n return { ok: false, error: payloadError };\n }\n const payloadBytesError = this.payloadBytesError(envelopes, dropCounters);\n if (payloadBytesError !== null) {\n return { ok: false, error: payloadBytesError };\n }\n\n const first = envelopes[0];\n const last = envelopes[envelopes.length - 1];\n if (!first || !last) {\n return { ok: false, error: 'A telemetry batch must contain a first and last envelope' };\n }\n\n const producerId = first.producerId;\n const sequenceStart = first.sequence;\n const sequenceEnd = last.sequence;\n const checksumPayload = this.checksumPayload(\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n );\n const checksum = telemetryChecksum(checksumPayload);\n const idempotencyKey = `tb1:${producerId}:${sequenceStart}-${sequenceEnd}:${checksum}`;\n const batch = Object.freeze({\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n idempotencyKey,\n checksum,\n envelopes: Object.freeze([...envelopes]),\n dropCounters: Object.freeze([...dropCounters]),\n });\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const byteError = this.serializedByteError(batch, this.limits.maxBatchBytes, 'batch');\n return byteError === null\n ? { ok: true, value: this.detachBatch(batch) }\n : { ok: false, error: byteError };\n }\n\n private validateChecked(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n if (!this.isRecord(batch)) {\n return { ok: false, error: 'Telemetry batch must be a plain object' };\n }\n const schemaVersion = batch.schemaVersion;\n if (!Number.isSafeInteger(schemaVersion)) {\n return { ok: false, error: 'Telemetry batch schema version must be a safe integer' };\n }\n if (schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return { ok: false, error: `Unsupported telemetry schema version ${String(schemaVersion)}` };\n }\n if (!this.hasExactKeys(batch, BATCH_KEYS)) {\n return { ok: false, error: 'Telemetry batch fields do not match the schema' };\n }\n\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const recreated = this.create(\n batch.envelopes as readonly TelemetryEnvelope[],\n batch.dropCounters as readonly TelemetryDropCounter[],\n );\n if (!recreated.ok) {\n return recreated;\n }\n const identityError = this.compareFraming(batch, recreated.value);\n return identityError === null\n ? { ok: true, value: recreated.value }\n : { ok: false, error: identityError };\n }\n\n private validatePayload(envelopes: unknown, dropCounters: unknown): string | null {\n if (!Array.isArray(envelopes) || envelopes.length === 0) {\n return 'A telemetry batch must contain at least one envelope';\n }\n if (envelopes.length > this.limits.maxBatchEvents) {\n return `Telemetry batch exceeds ${this.limits.maxBatchEvents} envelopes`;\n }\n const envelopeError = this.validateEnvelopes(envelopes);\n return envelopeError ?? this.validateDropCounters(dropCounters);\n }\n\n private validateEnvelopes(envelopes: readonly unknown[]): string | null {\n let previousSequence = -1;\n let producerId: string | null = null;\n for (const envelope of envelopes) {\n const envelopeError = this.validateEnvelope(envelope, producerId, previousSequence);\n if (envelopeError !== null) {\n return envelopeError;\n }\n const typedEnvelope = envelope as TelemetryEnvelope;\n producerId = typedEnvelope.producerId;\n previousSequence = typedEnvelope.sequence;\n }\n return null;\n }\n\n private validateEnvelope(\n envelope: unknown,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (!this.isRecord(envelope) || !this.hasExactKeys(envelope, ENVELOPE_KEYS)) {\n return 'Telemetry envelope fields do not match the schema';\n }\n const identityError = this.validateEnvelopeIdentity(envelope, expectedProducerId, previousSequence);\n if (identityError !== null) {\n return identityError;\n }\n const valueError = this.validateEnvelopeValues(envelope);\n if (valueError !== null) {\n return valueError;\n }\n const metadataError = this.validateMetadata(envelope.metadata);\n return metadataError ?? this.serializedByteError(envelope, this.limits.maxEventBytes, 'event');\n }\n\n private validateEnvelopeIdentity(\n envelope: Record<string, unknown>,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (envelope.schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return 'Telemetry envelope schema version does not match its batch';\n }\n if (!this.isIdentity(envelope.producerId)) {\n return 'Telemetry envelope producer identity is invalid';\n }\n if (!this.isSequence(envelope.sequence) || envelope.sequence <= previousSequence) {\n return 'Telemetry envelope sequences must be nonnegative safe integers in increasing order';\n }\n if (expectedProducerId !== null && envelope.producerId !== expectedProducerId) {\n return 'A telemetry batch cannot mix producer identities';\n }\n const eventId = `${envelope.producerId}:${envelope.sequence}`;\n if (envelope.eventId !== eventId || telemetryUtf8Length(eventId) > this.limits.maxIdentityBytes) {\n return 'Telemetry envelope event identity is invalid';\n }\n return null;\n }\n\n private validateEnvelopeValues(envelope: Record<string, unknown>): string | null {\n if (!Number.isSafeInteger(envelope.occurredAtMs) || Number(envelope.occurredAtMs) < 0) {\n return 'Telemetry envelope occurredAtMs must be a nonnegative safe integer';\n }\n if (!this.isMonotonicTimestamp(envelope.monotonicNs)) {\n return 'Telemetry envelope monotonicNs is invalid';\n }\n if (!this.isIdentity(envelope.source) || !this.isIdentity(envelope.processKind)) {\n return 'Telemetry envelope source and process kind are invalid';\n }\n if (!this.isIdentity(envelope.level)) {\n return 'Telemetry envelope level is invalid';\n }\n if (!this.isLabel(envelope.label)) {\n return 'Telemetry envelope label is invalid';\n }\n if (!this.isConversationId(envelope.conversationId)) {\n return 'Telemetry envelope conversation identity is invalid';\n }\n if (!this.isOptionalBoundedString(envelope.correlationId)) {\n return 'Telemetry envelope correlation identity is invalid';\n }\n return null;\n }\n\n private validateMetadata(metadata: unknown): string | null {\n if (!this.isRecord(metadata)) {\n return 'Telemetry envelope metadata must be a plain JSON object';\n }\n const state: JsonValidationState = { properties: 0, bytes: 0, active: new WeakSet<object>() };\n const jsonError = this.validateJsonValue(metadata, 0, state);\n return jsonError ?? this.serializedByteError(metadata, this.limits.maxMetadataBytes, 'metadata');\n }\n\n private validateJsonValue(value: unknown, depth: number, state: JsonValidationState): string | null {\n if (value === null || typeof value === 'boolean') {\n state.bytes += value === null ? 4 : 5;\n return null;\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n return 'Telemetry metadata contains a non-finite number';\n }\n state.bytes += String(value).length;\n return this.metadataBudgetError(state);\n }\n if (typeof value === 'string') {\n if (!this.isWithinUtf8Limit(value, this.limits.maxMetadataStringBytes)) {\n return 'Telemetry metadata string exceeds the receiver limit';\n }\n state.bytes += telemetryUtf8Length(value);\n return this.metadataBudgetError(state);\n }\n if (typeof value !== 'object') {\n return 'Telemetry metadata contains a non-JSON value';\n }\n if (depth > this.limits.maxMetadataDepth) {\n return 'Telemetry metadata exceeds the receiver depth limit';\n }\n return Array.isArray(value)\n ? this.validateJsonArray(value, depth, state)\n : this.validateJsonObject(value, depth, state);\n }\n\n private validateJsonArray(value: readonly unknown[], depth: number, state: JsonValidationState): string | null {\n if (value.length > this.limits.maxMetadataArrayLength) {\n return 'Telemetry metadata array exceeds the receiver length limit';\n }\n const keys = Object.keys(value);\n if (keys.length !== value.length || Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata arrays must be dense JSON arrays';\n }\n return this.validateJsonChildren(value, value, depth, state);\n }\n\n private validateJsonObject(value: object, depth: number, state: JsonValidationState): string | null {\n if (!this.isRecord(value)) {\n return 'Telemetry metadata contains a non-plain object';\n }\n const keys = Object.keys(value);\n if (Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata objects cannot contain symbol keys';\n }\n state.properties += keys.length;\n if (state.properties > this.limits.maxMetadataProperties) {\n return 'Telemetry metadata exceeds the receiver property limit';\n }\n if (keys.some((key) => !this.isWithinUtf8Limit(key, this.limits.maxMetadataStringBytes))) {\n return 'Telemetry metadata property name exceeds the receiver string limit';\n }\n for (const key of keys) {\n state.bytes += telemetryUtf8Length(key);\n }\n const budgetError = this.metadataBudgetError(state);\n if (budgetError !== null) {\n return budgetError;\n }\n return this.validateJsonChildren(value, keys.map((key) => Reflect.get(value, key)), depth, state);\n }\n\n private validateJsonChildren(\n owner: object,\n values: readonly unknown[],\n depth: number,\n state: JsonValidationState,\n ): string | null {\n if (state.active.has(owner)) {\n return 'Telemetry metadata cannot contain a cycle';\n }\n state.active.add(owner);\n try {\n for (const value of values) {\n const error = this.validateJsonValue(value, depth + 1, state);\n if (error !== null) {\n return error;\n }\n }\n return null;\n } finally {\n state.active.delete(owner);\n }\n }\n\n private validateDropCounters(dropCounters: unknown): string | null {\n if (!Array.isArray(dropCounters) || dropCounters.length > this.limits.maxDropCounters) {\n return 'Telemetry drop counters exceed the fixed receiver limit';\n }\n const identities = new Set<string>();\n let total = 0;\n for (const counter of dropCounters) {\n const error = this.validateDropCounter(counter, identities, total);\n if (error !== null) {\n return error;\n }\n total += (counter as TelemetryDropCounter).count;\n }\n return null;\n }\n\n private validateDropCounter(\n counter: unknown,\n identities: Set<string>,\n currentTotal: number,\n ): string | null {\n if (!this.isRecord(counter) || !this.hasExactKeys(counter, DROP_COUNTER_KEYS)) {\n return 'Telemetry drop counter fields do not match the schema';\n }\n if (!DROP_REASONS.has(String(counter.reason)) || !DROP_PRIORITIES.has(String(counter.priority))) {\n return 'Telemetry drop counter identity is invalid';\n }\n if (!Number.isSafeInteger(counter.count) || Number(counter.count) <= 0) {\n return 'Telemetry drop counter count must be a positive safe integer';\n }\n if (currentTotal > Number.MAX_SAFE_INTEGER - Number(counter.count)) {\n return 'Telemetry drop counter total exceeds the safe integer range';\n }\n const identity = `${counter.reason}:${counter.priority}`;\n if (identities.has(identity)) {\n return 'Telemetry drop counter identities must be unique within a batch';\n }\n identities.add(identity);\n return null;\n }\n\n private validateFraming(batch: Record<string, unknown>): string | null {\n if (!this.isIdentity(batch.producerId)) {\n return 'Telemetry batch producer identity is invalid';\n }\n if (!this.isSequence(batch.sequenceStart) || !this.isSequence(batch.sequenceEnd)) {\n return 'Telemetry batch sequence range must use nonnegative safe integers';\n }\n if (Number(batch.sequenceEnd) < Number(batch.sequenceStart)) {\n return 'Telemetry batch sequence range is reversed';\n }\n if (typeof batch.checksum !== 'string' || !/^[a-f0-9]{16}$/.test(batch.checksum)) {\n return 'Telemetry batch checksum is invalid';\n }\n if (typeof batch.idempotencyKey !== 'string'\n || !this.isWithinUtf8Limit(batch.idempotencyKey, this.limits.maxIdentityBytes)) {\n return 'Telemetry batch idempotency identity is invalid';\n }\n return null;\n }\n\n private compareFraming(batch: Record<string, unknown>, recreated: TelemetryBatch): string | null {\n const matches = recreated.checksum === batch.checksum\n && recreated.idempotencyKey === batch.idempotencyKey\n && recreated.sequenceStart === batch.sequenceStart\n && recreated.sequenceEnd === batch.sequenceEnd\n && recreated.producerId === batch.producerId;\n return matches ? null : 'Telemetry batch framing or checksum is invalid';\n }\n\n private checksumPayload(\n producerId: string,\n sequenceStart: number,\n sequenceEnd: number,\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): object {\n return {\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n };\n }\n\n private serializedByteError(value: unknown, maximum: number, kind: string): string | null {\n const bytes = telemetryUtf8Length(canonicalJson(value));\n return bytes <= maximum ? null : `Telemetry ${kind} exceeds ${maximum} bytes`;\n }\n\n private payloadBytesError(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): string | null {\n let bytes = 0;\n for (const envelope of envelopes) {\n bytes += telemetryUtf8Length(canonicalJson(envelope));\n if (bytes > this.limits.maxBatchBytes) {\n return `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`;\n }\n }\n bytes += telemetryUtf8Length(canonicalJson(dropCounters));\n return bytes > this.limits.maxBatchBytes\n ? `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`\n : null;\n }\n\n private metadataBudgetError(state: JsonValidationState): string | null {\n return state.bytes > this.limits.maxMetadataBytes\n ? `Telemetry metadata exceeds ${this.limits.maxMetadataBytes} bytes`\n : null;\n }\n\n private detachBatch(batch: TelemetryBatch): TelemetryBatch {\n const detached = JSON.parse(canonicalJson(batch)) as TelemetryBatch;\n return this.deepFreeze(detached);\n }\n\n private deepFreeze<T>(value: T): T {\n if (typeof value !== 'object' || value === null || Object.isFrozen(value)) {\n return value;\n }\n for (const child of Object.values(value)) {\n this.deepFreeze(child);\n }\n return Object.freeze(value);\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value) as { constructor?: { name?: unknown } } | null;\n return prototype === null || prototype.constructor?.name === 'Object';\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isSequence(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) >= 0;\n }\n\n private isIdentity(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && value.trim().length > 0\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value);\n }\n\n private isLabel(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= Math.min(256, this.limits.maxIdentityBytes)\n && /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(value)\n && this.isWithinUtf8Limit(value, Math.min(256, this.limits.maxIdentityBytes));\n }\n\n private isMonotonicTimestamp(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && /^\\d+$/.test(value)\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes));\n }\n\n private isConversationId(value: unknown): boolean {\n return value === null\n || (typeof value === 'number' && Number.isSafeInteger(value))\n || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isOptionalBoundedString(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isWithinUtf8Limit(value: string, maximum: number): boolean {\n return value.length <= maximum && telemetryUtf8Length(value) <= maximum;\n }\n\n private validateLimits(): void {\n const values = Object.values(this.limits);\n if (values.some((value) => !Number.isSafeInteger(value) || value <= 0)) {\n throw new Error('Telemetry batch validation limits must be positive safe integers');\n }\n if (this.limits.maxMetadataBytes > this.limits.maxEventBytes\n || this.limits.maxEventBytes > this.limits.maxBatchBytes) {\n throw new Error('Telemetry receiver byte limits must satisfy metadata <= event <= batch');\n }\n }\n}\n","export type TelemetryDeadlineOutcome<T> =\n | Readonly<{ kind: 'completed'; value: T }>\n | Readonly<{ kind: 'failed'; error: unknown }>\n | Readonly<{ kind: 'deadline-exhausted' }>;\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\n\nexport class TelemetryDeadlineGuard {\n async settle<T>(\n operation: Promise<T>,\n deadlineMs: number,\n now: () => number,\n ): Promise<TelemetryDeadlineOutcome<T>> {\n const observed: Promise<TelemetryDeadlineOutcome<T>> = operation.then(\n (value) => ({ kind: 'completed', value }),\n (error: unknown) => ({ kind: 'failed', error }),\n );\n const remainingMs = deadlineMs - now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n return { kind: 'deadline-exhausted' };\n }\n let timer: ReturnType<typeof setTimeout> | null = null;\n const outcome = await Promise.race([\n observed,\n new Promise<TelemetryDeadlineOutcome<T>>((resolve) => {\n timer = setTimeout(\n () => resolve({ kind: 'deadline-exhausted' }),\n Math.min(remainingMs, MAX_TIMER_DELAY_MS),\n );\n }),\n ]);\n if (timer !== null) {\n clearTimeout(timer);\n }\n return outcome;\n }\n}\n","import { TelemetryDeadlineGuard } from './helper/telemetry_deadline_guard.js';\nimport { TelemetryAcknowledgementContract } from './telemetry_acknowledgement_contract.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchRoute,\n TelemetryBatchRouterOptions,\n TelemetryBatchTransport,\n TelemetryBatchTransportCapabilities,\n TelemetryTargetDeliveryState,\n} from './types/transport.types.js';\n\ntype BatchRouteResult = Readonly<{\n route: TelemetryBatchRoute;\n acknowledgement: TelemetryAcknowledgement;\n attempts: number;\n}>;\n\nexport class TelemetryBatchRouter implements TelemetryBatchTransport {\n readonly transportId: string;\n readonly capabilities: TelemetryBatchTransportCapabilities;\n private readonly acknowledgementContract = new TelemetryAcknowledgementContract();\n private readonly deadlineGuard = new TelemetryDeadlineGuard();\n private readonly committed = new Map<string, Set<string>>();\n\n constructor(private readonly options: TelemetryBatchRouterOptions) {\n this.transportId = options.routerId;\n this.validateRoutes();\n this.capabilities = Object.freeze({\n maxBatchBytes: Math.min(...options.routes.map((route) => route.transport.capabilities.maxBatchBytes)),\n acknowledgement: options.volatile ? 'receipt' : 'durable',\n ordering: options.routes.every((route) => route.transport.capabilities.ordering === 'producer')\n ? 'producer'\n : 'none',\n boundedCapacity: Math.min(...options.routes.map((route) => route.transport.capabilities.boundedCapacity)),\n });\n }\n\n async send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n const matchingRoutes = this.options.routes.filter((route) => route.matches(batch));\n const hasRequiredRoute = matchingRoutes.some((route) => route.delivery === 'required');\n if (!hasRequiredRoute && !this.options.volatile) {\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'no-required-terminal',\n reason: 'No required durable route matched this batch',\n targetStates: this.unmatchedStates(batch, matchingRoutes),\n };\n }\n\n const committedRoutes = this.committed.get(batch.idempotencyKey) ?? new Set<string>();\n const routeResults = await this.sendMatchingRoutes(batch, matchingRoutes, committedRoutes);\n this.remember(batch.idempotencyKey, committedRoutes);\n return this.aggregateAcknowledgement(batch, matchingRoutes, routeResults);\n }\n\n async flush(deadlineMs: number): Promise<void> {\n await this.runLifecycleUntilDeadline(\n deadlineMs,\n (transport) => transport.flush(deadlineMs),\n );\n }\n\n async close(deadlineMs: number): Promise<void> {\n await this.runLifecycleUntilDeadline(\n deadlineMs,\n (transport) => transport.close(deadlineMs),\n );\n }\n\n private async runLifecycleUntilDeadline(\n deadlineMs: number,\n run: (transport: TelemetryBatchTransport) => Promise<void>,\n ): Promise<void> {\n const operations = this.options.routes.map((route) => {\n return Promise.resolve().then(() => run(route.transport));\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.all(operations),\n deadlineMs,\n this.options.now,\n );\n if (outcome.kind === 'failed') {\n throw outcome.error;\n }\n }\n\n private async sendMatchingRoutes(\n batch: TelemetryBatch,\n routes: readonly TelemetryBatchRoute[],\n committedRoutes: Set<string>,\n ): Promise<readonly BatchRouteResult[]> {\n return Promise.all(routes.map(async (route): Promise<BatchRouteResult> => {\n if (committedRoutes.has(route.routeId)) {\n return { route, acknowledgement: this.alreadyCommitted(batch), attempts: 0 };\n }\n const acknowledgement = await this.sendSafely(route.transport, batch);\n if (acknowledgement.kind === 'committed') {\n committedRoutes.add(route.routeId);\n }\n return { route, acknowledgement, attempts: 1 };\n }));\n }\n\n private aggregateAcknowledgement(\n batch: TelemetryBatch,\n matchingRoutes: readonly TelemetryBatchRoute[],\n routeResults: readonly BatchRouteResult[],\n ): TelemetryAcknowledgement {\n const targetStates = this.deliveryStates(batch, routeResults, matchingRoutes);\n const requiredResults = routeResults.filter(({ route }) => route.delivery === 'required');\n const conflict = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'conflict');\n const conflictAcknowledgement = conflict?.acknowledgement;\n if (conflictAcknowledgement?.kind === 'conflict') {\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: conflictAcknowledgement.reason,\n targetStates,\n };\n }\n const rejected = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'rejected');\n const rejectedAcknowledgement = rejected?.acknowledgement;\n if (rejectedAcknowledgement?.kind === 'rejected') {\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: rejectedAcknowledgement.code,\n reason: rejectedAcknowledgement.reason,\n targetStates,\n };\n }\n const retryable = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'retryable');\n const retryableAcknowledgement = retryable?.acknowledgement;\n if (retryableAcknowledgement?.kind === 'retryable') {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: retryableAcknowledgement.reason,\n retryAfterMs: retryableAcknowledgement.retryAfterMs,\n targetStates,\n };\n }\n\n return {\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: batch.envelopes.length,\n duplicate: routeResults.length > 0 && routeResults.every(({ attempts }) => attempts === 0),\n targetStates,\n };\n }\n\n private deliveryStates(\n batch: TelemetryBatch,\n routeResults: readonly BatchRouteResult[],\n matchingRoutes: readonly TelemetryBatchRoute[],\n ): readonly TelemetryTargetDeliveryState[] {\n return [\n ...routeResults.map(({ route, acknowledgement, attempts }) => this.deliveryState(\n route.routeId,\n route.delivery,\n acknowledgement,\n attempts,\n )),\n ...this.unmatchedStates(batch, matchingRoutes),\n ];\n }\n\n private async sendSafely(\n transport: TelemetryBatchTransport,\n batch: TelemetryBatch,\n ): Promise<TelemetryAcknowledgement> {\n try {\n const received: unknown = await transport.send(batch);\n const validated = this.acknowledgementContract.validateAndDetach(batch, received);\n return validated.ok\n ? validated.value\n : this.invalidAcknowledgement(batch, validated.error);\n } catch (cause) {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.acknowledgementContract.exceptionReason(cause),\n retryAfterMs: 25,\n targetStates: [],\n };\n }\n }\n\n private invalidAcknowledgement(batch: TelemetryBatch, error: string): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: 25,\n targetStates: [],\n };\n }\n\n private alreadyCommitted(batch: TelemetryBatch): TelemetryAcknowledgement {\n return {\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: batch.envelopes.length,\n duplicate: true,\n targetStates: [],\n };\n }\n\n private deliveryState(\n routeId: string,\n delivery: 'required' | 'best-effort',\n acknowledgement: TelemetryAcknowledgement,\n attempts: number,\n ): TelemetryTargetDeliveryState {\n if (acknowledgement.kind === 'committed') {\n return { targetId: routeId, delivery, state: 'committed', attempts, reason: null };\n }\n return {\n targetId: routeId,\n delivery,\n state: 'failed',\n attempts,\n reason: acknowledgement.reason,\n };\n }\n\n private unmatchedStates(\n _batch: TelemetryBatch,\n matchingRoutes: readonly TelemetryBatchRouterOptions['routes'][number][],\n ): TelemetryTargetDeliveryState[] {\n const matchingIds = new Set(matchingRoutes.map((route) => route.routeId));\n return this.options.routes\n .filter((route) => !matchingIds.has(route.routeId))\n .map((route) => ({\n targetId: route.routeId,\n delivery: route.delivery,\n state: 'abandoned' as const,\n attempts: 0,\n reason: 'route-not-matched',\n }));\n }\n\n private validateRoutes(): void {\n if (!this.options.routerId.trim() || this.options.routes.length === 0) {\n throw new Error('A telemetry batch router requires an id and at least one route');\n }\n if (this.options.maxRememberedBatches !== undefined\n && (!Number.isSafeInteger(this.options.maxRememberedBatches)\n || this.options.maxRememberedBatches <= 0)) {\n throw new Error('Telemetry batch router memory must be a positive safe integer');\n }\n const routeIds = this.options.routes.map((route) => route.routeId);\n if (new Set(routeIds).size !== routeIds.length) {\n throw new Error('Telemetry batch route ids must be unique');\n }\n const requiredRoutes = this.options.routes.filter((route) => route.delivery === 'required');\n const hasNonDurableRequiredRoute = requiredRoutes.some(\n (route) => route.transport.capabilities.acknowledgement !== 'durable',\n );\n if (!this.options.volatile && (requiredRoutes.length === 0 || hasNonDurableRequiredRoute)) {\n throw new Error('A non-volatile router requires at least one durable required route');\n }\n }\n\n private remember(idempotencyKey: string, routes: Set<string>): void {\n this.committed.set(idempotencyKey, routes);\n const maximum = this.options.maxRememberedBatches ?? 1_024;\n while (this.committed.size > maximum) {\n const oldest = this.committed.keys().next().value;\n if (typeof oldest !== 'string') {\n return;\n }\n this.committed.delete(oldest);\n }\n }\n}\n","import { BoundedMetadataSnapshotter } from './bounded_metadata_snapshotter.js';\nimport { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport { TelemetryBatchContract } from './telemetry_batch_contract.js';\nimport type { QueuedTelemetryEnvelope } from './types/client_internal.types.js';\nimport type {\n TelemetryAdmissionPriority,\n TelemetryAdmissionResult,\n TelemetryClientOptions,\n TelemetryClientStatus,\n TelemetryMinimumLevel,\n} from './types/client.types.js';\nimport type { TelemetryAdmitInput, TelemetryEnvelope, TelemetryLevel } from './types/envelope.types.js';\nimport type { TelemetryJsonObject } from './types/json.types.js';\nimport type { TelemetryAcknowledgement, TelemetryBatch, TelemetryDropCounter } from './types/transport.types.js';\n\nconst TELEMETRY_LEVEL_RANKS: Readonly<Record<TelemetryMinimumLevel, number>> = Object.freeze({\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n});\n\nexport class TelemetryClient {\n private readonly snapshotter: BoundedMetadataSnapshotter;\n private readonly batchContract = new TelemetryBatchContract();\n private readonly queue: QueuedTelemetryEnvelope[] = [];\n private readonly dropCounts = new Map<string, number>();\n private state: 'accepting' | 'draining' | 'stopped' = 'accepting';\n private nextSequence = 0;\n private queuedBytes = 0;\n private inFlightBatches = 0;\n private drainScheduled = false;\n private activeDrain: Promise<void> | null = null;\n private lastAcknowledgement: TelemetryAcknowledgement | null = null;\n\n constructor(private readonly options: TelemetryClientOptions) {\n this.validateOptions();\n this.snapshotter = new BoundedMetadataSnapshotter(options.metadata);\n }\n\n trace(level: TelemetryLevel, label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit(level, label, metadata);\n }\n\n debug(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('debug', label, metadata);\n }\n\n info(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('info', label, metadata);\n }\n\n warn(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('warn', label, metadata);\n }\n\n error(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('error', label, metadata);\n }\n\n fatal(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('fatal', label, metadata);\n }\n\n emit(level: TelemetryLevel, label: string, metadata: unknown): TelemetryAdmissionResult {\n return this.admit({\n source: this.options.source,\n processKind: this.options.processKind,\n level,\n label,\n occurredAtMs: this.options.now(),\n monotonicNs: this.options.monotonicNowNs(),\n conversationId: null,\n correlationId: null,\n metadata,\n });\n }\n\n admit(input: TelemetryAdmitInput): TelemetryAdmissionResult {\n const sequence = this.nextSequence;\n this.nextSequence += 1;\n\n if (this.state !== 'accepting') {\n this.incrementDrop('stopped', this.priorityFor(input.level));\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'client-stopped' };\n }\n\n const hasInvalidIdentity = !this.isValidLabel(input.label)\n || !input.source.trim()\n || !input.processKind.trim()\n || !Number.isFinite(input.occurredAtMs);\n if (hasInvalidIdentity) {\n this.incrementDrop('invalid', this.priorityFor(input.level));\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'invalid-label' };\n }\n\n const priority = this.priorityFor(input.level);\n if (!this.meetsMinimumLevel(input.level)) {\n this.incrementDrop('sampled', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'below-minimum-level' };\n }\n if (!this.isSampled(priority)) {\n this.incrementDrop('sampled', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'sampled' };\n }\n\n const snapshot = this.snapshotter.snapshot(input.metadata);\n const extractedCorrelation = this.resolveCorrelation(snapshot.metadata);\n const correlation = {\n conversationId: input.conversationId ?? extractedCorrelation.conversationId,\n correlationId: input.correlationId ?? extractedCorrelation.correlationId,\n };\n const envelope = this.createEnvelope(sequence, input, snapshot.metadata, correlation);\n const bytes = telemetryUtf8Length(canonicalJson(envelope));\n const single = this.batchContract.create([envelope], []);\n if (!single.ok) {\n this.incrementDrop('invalid', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'invalid-envelope' };\n }\n const framedBytes = telemetryUtf8Length(canonicalJson(single.value));\n const queueWouldOverflow = this.queue.length >= this.options.admission.maxQueuedEvents\n || this.queuedBytes + bytes > this.options.admission.maxQueuedBytes\n || framedBytes > this.options.admission.maxBatchBytes;\n if (queueWouldOverflow) {\n this.incrementDrop('capacity', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'capacity' };\n }\n\n this.queue.push(Object.freeze({ envelope, bytes }));\n this.queuedBytes += bytes;\n this.scheduleDrain();\n return {\n kind: 'admitted',\n producerId: this.options.producerId,\n sequence,\n eventId: envelope.eventId,\n };\n }\n\n status(): TelemetryClientStatus {\n return Object.freeze({\n state: this.state,\n producerId: this.options.producerId,\n nextSequence: this.nextSequence,\n queuedEvents: this.queue.length,\n queuedBytes: this.queuedBytes,\n inFlightBatches: this.inFlightBatches,\n dropCounters: this.dropCounterSnapshot(),\n lastAcknowledgement: this.lastAcknowledgement,\n });\n }\n\n async flush(deadlineMs: number): Promise<void> {\n this.scheduleDrain();\n while ((this.queue.length > 0 || this.activeDrain !== null) && this.options.now() < deadlineMs) {\n const currentDrain = this.activeDrain;\n if (currentDrain) {\n await Promise.race([currentDrain, this.options.delay(1)]);\n } else {\n await this.options.delay(1);\n }\n }\n await this.settleExternalShutdown(\n () => this.options.transport.flush(deadlineMs),\n deadlineMs,\n );\n }\n\n async stop(deadlineMs: number): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n this.state = 'draining';\n await this.flush(deadlineMs);\n const abandoned = this.queue.splice(0, this.queue.length);\n if (abandoned.length > 0) {\n this.incrementDropBy('transport', 'normal', abandoned.length);\n this.queuedBytes = 0;\n }\n await this.settleExternalShutdown(\n () => this.options.transport.close(deadlineMs),\n deadlineMs,\n );\n this.state = 'stopped';\n }\n\n private createEnvelope(\n sequence: number,\n input: TelemetryAdmitInput,\n metadata: TelemetryJsonObject,\n correlation: Readonly<{\n conversationId: string | number | null;\n correlationId: string | null;\n }>,\n ): TelemetryEnvelope {\n return Object.freeze({\n schemaVersion: TelemetryBatchContract.schemaVersion,\n eventId: `${this.options.producerId}:${sequence}`,\n producerId: this.options.producerId,\n sequence,\n occurredAtMs: input.occurredAtMs,\n monotonicNs: input.monotonicNs,\n source: input.source,\n processKind: input.processKind,\n level: input.level.trim().toLowerCase() || 'info',\n label: input.label,\n conversationId: correlation.conversationId,\n correlationId: correlation.correlationId,\n metadata,\n });\n }\n\n private resolveCorrelation(metadata: TelemetryJsonObject): Readonly<{\n conversationId: string | number | null;\n correlationId: string | null;\n }> {\n const conversationValue = metadata.conversationId ?? metadata.threadId ?? null;\n const conversationId = typeof conversationValue === 'string' || typeof conversationValue === 'number'\n ? conversationValue\n : null;\n const correlationValue = metadata.correlationId;\n const correlationId = typeof correlationValue === 'string' ? correlationValue : null;\n return { conversationId, correlationId };\n }\n\n private scheduleDrain(): void {\n if (this.drainScheduled || this.activeDrain !== null || this.queue.length === 0) {\n return;\n }\n this.drainScheduled = true;\n try {\n this.options.schedule(() => {\n this.drainScheduled = false;\n const drain = this.drainLoop();\n this.activeDrain = drain;\n const settle = () => {\n this.activeDrain = null;\n if (this.queue.length > 0) {\n this.scheduleDrain();\n }\n };\n void drain.then(settle, settle);\n });\n } catch {\n this.drainScheduled = false;\n }\n }\n\n private async drainLoop(): Promise<void> {\n while (this.queue.length > 0) {\n const dropSnapshot = this.dropCounterSnapshot();\n const prepared = this.prepareBatch(dropSnapshot);\n if (prepared === null) {\n continue;\n }\n\n this.inFlightBatches += 1;\n try {\n const acknowledgement = await this.deliverWithRetry(prepared.batch);\n this.lastAcknowledgement = acknowledgement;\n if (acknowledgement.kind === 'committed') {\n this.subtractDropSnapshot(prepared.dropCounters);\n } else {\n this.incrementDropBy('transport', 'normal', prepared.eventCount);\n }\n } finally {\n this.inFlightBatches -= 1;\n }\n }\n }\n\n private prepareBatch(dropCounters: readonly TelemetryDropCounter[]): Readonly<{\n batch: TelemetryBatch;\n dropCounters: readonly TelemetryDropCounter[];\n eventCount: number;\n }> | null {\n const entries = this.peekBatchEntries();\n const withCounters = this.findFittingBatch(entries, dropCounters);\n const prepared = withCounters ?? this.findFittingBatch(entries, []);\n if (prepared === null) {\n const invalid = this.queue.shift();\n if (invalid !== undefined) {\n this.queuedBytes -= invalid.bytes;\n this.incrementDrop('invalid', this.priorityFor(invalid.envelope.level));\n }\n return null;\n }\n for (let index = 0; index < prepared.eventCount; index += 1) {\n const removed = this.queue.shift();\n if (removed !== undefined) {\n this.queuedBytes -= removed.bytes;\n }\n }\n return prepared;\n }\n\n private peekBatchEntries(): QueuedTelemetryEnvelope[] {\n const entries: QueuedTelemetryEnvelope[] = [];\n let batchBytes = 0;\n while (entries.length < this.options.admission.maxBatchEvents) {\n const next = this.queue[entries.length];\n if (!next) {\n break;\n }\n const exceedsBatchBytes = entries.length > 0\n && batchBytes + next.bytes > this.options.admission.maxBatchBytes;\n if (exceedsBatchBytes) {\n break;\n }\n batchBytes += next.bytes;\n entries.push(next);\n }\n return entries;\n }\n\n private findFittingBatch(\n entries: readonly QueuedTelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): Readonly<{\n batch: TelemetryBatch;\n dropCounters: readonly TelemetryDropCounter[];\n eventCount: number;\n }> | null {\n for (let eventCount = entries.length; eventCount > 0; eventCount -= 1) {\n const created = this.batchContract.create(\n entries.slice(0, eventCount).map((entry) => entry.envelope),\n dropCounters,\n );\n if (created.ok\n && telemetryUtf8Length(canonicalJson(created.value)) <= this.options.admission.maxBatchBytes) {\n return Object.freeze({ batch: created.value, dropCounters, eventCount });\n }\n }\n return null;\n }\n\n private async deliverWithRetry(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n let attempt = 0;\n while (attempt <= this.options.admission.retryLimit) {\n let acknowledgement: TelemetryAcknowledgement;\n try {\n const received: unknown = await this.options.transport.send(batch);\n acknowledgement = this.normalizeAcknowledgement(batch, received, attempt);\n } catch (cause) {\n acknowledgement = {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.errorMessage(cause),\n retryAfterMs: this.retryDelay(attempt),\n targetStates: [],\n };\n }\n\n if (acknowledgement.kind !== 'retryable' || attempt === this.options.admission.retryLimit) {\n return acknowledgement;\n }\n const requestedDelay = Math.max(acknowledgement.retryAfterMs, this.retryDelay(attempt));\n await this.options.delay(requestedDelay);\n attempt += 1;\n }\n\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: 'retry-limit-exhausted',\n retryAfterMs: 0,\n targetStates: [],\n };\n }\n\n private retryDelay(attempt: number): number {\n return Math.min(\n Number.MAX_SAFE_INTEGER,\n this.options.admission.retryBaseDelayMs * (2 ** attempt),\n );\n }\n\n private normalizeAcknowledgement(\n batch: TelemetryBatch,\n value: unknown,\n attempt: number,\n ): TelemetryAcknowledgement {\n try {\n const error = this.acknowledgementError(batch, value);\n return error === null\n ? this.detachAcknowledgement(value as TelemetryAcknowledgement)\n : this.invalidAcknowledgement(batch, error, attempt);\n } catch {\n return this.invalidAcknowledgement(batch, 'acknowledgement could not be inspected', attempt);\n }\n }\n\n private acknowledgementError(batch: TelemetryBatch, value: unknown): string | null {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return 'acknowledgement identity is missing or mismatched';\n }\n const targetsError = this.targetStatesError(value.targetStates);\n if (targetsError !== null) {\n return targetsError;\n }\n switch (value.kind) {\n case 'committed':\n return this.committedAcknowledgementError(batch, value);\n case 'retryable':\n return this.retryableAcknowledgementError(value);\n case 'rejected':\n return this.rejectedAcknowledgementError(value);\n case 'conflict':\n return this.conflictAcknowledgementError(value);\n default:\n return 'acknowledgement kind is invalid';\n }\n }\n\n private committedAcknowledgementError(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])\n && Number.isSafeInteger(value.committedAtMs)\n && Number(value.committedAtMs) >= 0\n && value.acceptedEvents === batch.envelopes.length\n && typeof value.duplicate === 'boolean';\n return valid ? null : 'committed acknowledgement fields are invalid';\n }\n\n private retryableAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])\n && this.isBoundedReason(value.reason)\n && Number.isFinite(value.retryAfterMs)\n && Number(value.retryAfterMs) >= 0\n && Number(value.retryAfterMs) <= Number.MAX_SAFE_INTEGER;\n return valid ? null : 'retryable acknowledgement fields are invalid';\n }\n\n private rejectedAcknowledgementError(value: Record<string, unknown>): string | null {\n const codes = ['invalid-batch', 'unsupported-version', 'no-required-terminal', 'closed'];\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])\n && codes.includes(String(value.code))\n && this.isBoundedReason(value.reason);\n return valid ? null : 'rejected acknowledgement fields are invalid';\n }\n\n private conflictAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])\n && this.isBoundedReason(value.reason);\n return valid ? null : 'conflict acknowledgement fields are invalid';\n }\n\n private targetStatesError(value: unknown): string | null {\n if (!Array.isArray(value) || value.length > 1_024) {\n return 'acknowledgement target states are invalid';\n }\n const targetIds = new Set<string>();\n for (const target of value) {\n if (!this.isValidTargetState(target) || targetIds.has(target.targetId as string)) {\n return 'acknowledgement target states are invalid';\n }\n targetIds.add(target.targetId as string);\n }\n return null;\n }\n\n private isValidTargetState(value: unknown): value is Record<string, unknown> {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return false;\n }\n const deliveries = ['required', 'best-effort'];\n const states = ['pending', 'committed', 'failed', 'abandoned'];\n return typeof value.targetId === 'string'\n && value.targetId.length > 0\n && telemetryUtf8Length(value.targetId) <= 256\n && deliveries.includes(String(value.delivery))\n && states.includes(String(value.state))\n && Number.isSafeInteger(value.attempts)\n && Number(value.attempts) >= 0\n && (value.reason === null || this.isBoundedReason(value.reason));\n }\n\n private invalidAcknowledgement(\n batch: TelemetryBatch,\n error: string,\n attempt: number,\n ): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: this.retryDelay(attempt),\n targetStates: [],\n };\n }\n\n private detachAcknowledgement(value: TelemetryAcknowledgement): TelemetryAcknowledgement {\n const detached = JSON.parse(canonicalJson(value)) as TelemetryAcknowledgement;\n const targetStates = Object.freeze(detached.targetStates.map((target) => Object.freeze({ ...target })));\n return Object.freeze({ ...detached, targetStates });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isBoundedReason(value: unknown): value is string {\n return typeof value === 'string' && telemetryUtf8Length(value) <= 512;\n }\n\n private dropCounterSnapshot(): readonly TelemetryDropCounter[] {\n const counters = [...this.dropCounts.entries()]\n .filter(([, count]) => count > 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, count]) => {\n const [reason, priority] = key.split(':');\n return Object.freeze({\n reason: reason as TelemetryDropCounter['reason'],\n priority: priority as TelemetryDropCounter['priority'],\n count,\n });\n });\n return Object.freeze(counters);\n }\n\n private subtractDropSnapshot(snapshot: readonly TelemetryDropCounter[]): void {\n for (const counter of snapshot) {\n const key = `${counter.reason}:${counter.priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.max(0, current - counter.count));\n }\n }\n\n private incrementDrop(reason: TelemetryDropCounter['reason'], priority: TelemetryAdmissionPriority): void {\n this.incrementDropBy(reason, priority, 1);\n }\n\n private incrementDropBy(\n reason: TelemetryDropCounter['reason'],\n priority: TelemetryAdmissionPriority,\n count: number,\n ): void {\n const key = `${reason}:${priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.min(Number.MAX_SAFE_INTEGER, current + count));\n }\n\n private priorityFor(level: string): TelemetryAdmissionPriority {\n const normalized = level.trim().toLowerCase();\n if (normalized === 'error' || normalized === 'fatal') {\n return 'high';\n }\n if (normalized === 'trace' || normalized === 'debug') {\n return 'low';\n }\n return 'normal';\n }\n\n private isSampled(priority: TelemetryAdmissionPriority): boolean {\n const sampleRate = this.options.admission.sampleRates[priority];\n return sampleRate >= 1 || this.options.random() < sampleRate;\n }\n\n private meetsMinimumLevel(level: string): boolean {\n const minimum = this.options.admission.minimumLevel;\n if (minimum === undefined) {\n return true;\n }\n const normalized = level.trim().toLowerCase() as TelemetryMinimumLevel;\n const rank = TELEMETRY_LEVEL_RANKS[normalized] ?? TELEMETRY_LEVEL_RANKS.info;\n return rank >= TELEMETRY_LEVEL_RANKS[minimum];\n }\n\n private isValidLabel(label: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(label) && label.length <= 256;\n }\n\n private errorMessage(cause: unknown): string {\n if (cause instanceof Error) {\n return cause.message.slice(0, 512);\n }\n return String(cause).slice(0, 512);\n }\n\n private async settleExternalShutdown(\n work: () => Promise<void>,\n deadlineMs: number,\n ): Promise<void> {\n const operation = Promise.resolve().then(work);\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n void operation.catch(() => undefined);\n return;\n }\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (failed: boolean, error?: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n if (failed) {\n reject(error);\n } else {\n resolve();\n }\n };\n const timer = setTimeout(\n () => finish(false),\n Math.min(remainingMs, 2_147_483_647),\n );\n void operation.then(\n () => finish(false),\n (error: unknown) => finish(true, error),\n );\n });\n }\n\n private validateOptions(): void {\n this.validateIdentityOptions();\n this.validateOrderedDeliveryOptions();\n this.validateCapacityOptions();\n this.validateBatchEventOptions();\n this.validateBatchByteOptions();\n this.validateMetadataOptions();\n this.validateRetryOptions();\n this.validateSampleRateOptions();\n }\n\n private validateIdentityOptions(): void {\n if (!this.options.source.trim() || !this.options.processKind.trim() || !this.options.producerId.trim()) {\n throw new Error('Telemetry client source, process kind, and producer id are required');\n }\n }\n\n private validateOrderedDeliveryOptions(): void {\n if (this.options.admission.maxInFlightBatches !== 1) {\n throw new Error('Ordered telemetry clients currently require maxInFlightBatches to equal 1');\n }\n }\n\n private validateCapacityOptions(): void {\n const capacities = [\n this.options.admission.maxQueuedEvents,\n this.options.admission.maxQueuedBytes,\n this.options.admission.maxBatchEvents,\n this.options.admission.maxBatchBytes,\n this.options.admission.maxInFlightBatches,\n this.options.transport.capabilities.maxBatchBytes,\n this.options.transport.capabilities.boundedCapacity,\n ];\n if (capacities.some((capacity) => !Number.isSafeInteger(capacity) || capacity <= 0)) {\n throw new Error('Telemetry client and transport capacities must be positive safe integers');\n }\n }\n\n private validateBatchEventOptions(): void {\n if (this.options.admission.maxBatchEvents > this.options.admission.maxQueuedEvents\n || this.options.admission.maxBatchEvents > this.batchContract.limits.maxBatchEvents) {\n throw new Error('Telemetry maxBatchEvents must not exceed queue or receiver capacity');\n }\n }\n\n private validateBatchByteOptions(): void {\n if (this.options.admission.maxBatchBytes > this.options.admission.maxQueuedBytes\n || this.options.admission.maxBatchBytes > this.options.transport.capabilities.maxBatchBytes\n || this.options.admission.maxBatchBytes > this.batchContract.limits.maxBatchBytes) {\n throw new Error('Telemetry maxBatchBytes must not exceed queue, transport, or receiver capacity');\n }\n }\n\n private validateMetadataOptions(): void {\n if (this.options.metadata.maxBytes > this.options.admission.maxBatchBytes) {\n throw new Error('Telemetry metadata bytes must not exceed maxBatchBytes');\n }\n }\n\n private validateRetryOptions(): void {\n if (!Number.isSafeInteger(this.options.admission.retryLimit)\n || this.options.admission.retryLimit < 0\n || !Number.isFinite(this.options.admission.retryBaseDelayMs)\n || this.options.admission.retryBaseDelayMs < 0) {\n throw new Error('Telemetry retry limit and delay must be nonnegative finite values');\n }\n }\n\n private validateSampleRateOptions(): void {\n const rates = Object.values(this.options.admission.sampleRates);\n if (rates.some((rate) => !Number.isFinite(rate) || rate < 0 || rate > 1)) {\n throw new Error('Telemetry sample rates must be between zero and one');\n }\n }\n}\n","import { TelemetryDeadlineGuard } from './helper/telemetry_deadline_guard.js';\nimport { TelemetryAcknowledgementContract } from './telemetry_acknowledgement_contract.js';\nimport type { MetricDefinition } from './types/metric.types.js';\nimport type { MetricQuery, MetricQueryResponse, TelemetryQueryError, TimelineQuery, TimelineQueryResponse } from './types/query.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageRouterOptions,\n TelemetryStorageTransport,\n TelemetryStorageTarget,\n} from './types/storage.types.js';\nimport type { TelemetryAcknowledgement, TelemetryTargetDeliveryState } from './types/transport.types.js';\n\ntype StorageTargetResult = Readonly<{\n target: TelemetryStorageTarget;\n acknowledgement: TelemetryAcknowledgement;\n attempts: number;\n}>;\n\ntype RollbackTargetResult = Readonly<{\n targetId: string;\n error: string | null;\n}>;\n\nconst START_ROLLBACK_TIMEOUT_MS = 5_000;\n\nexport class TelemetryStorageRouter implements TelemetryStorageTransport {\n readonly targetId: string;\n readonly capabilities: TelemetryStorageCapabilities;\n private readonly acknowledgementContract = new TelemetryAcknowledgementContract();\n private readonly deadlineGuard = new TelemetryDeadlineGuard();\n private readonly committed = new Map<string, Set<string>>();\n private readonly definitionTargets = new Map<string, readonly string[]>();\n private state: StorageTargetStatus['state'] = 'created';\n private detail: string | null = null;\n\n constructor(private readonly options: TelemetryStorageRouterOptions) {\n this.targetId = options.routerId;\n this.validateOptions();\n this.capabilities = Object.freeze({\n rawPersistence: options.targets.every((target) => target.transport.capabilities.rawPersistence),\n metricSamples: options.targets.every((target) => target.transport.capabilities.metricSamples),\n rollups: options.targets.some((target) => target.transport.capabilities.rollups),\n queries: options.targets.some((target) => target.transport.capabilities.queries),\n retention: options.targets.some((target) => target.transport.capabilities.retention),\n maintenance: options.targets.some((target) => target.transport.capabilities.maintenance),\n });\n }\n\n async start(definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n return { ok: false, error: `Cannot start telemetry storage router from state ${this.state}` };\n }\n this.state = 'starting';\n this.detail = null;\n this.definitionTargets.clear();\n for (const definition of definitions) {\n this.definitionTargets.set(\n `${definition.name}:${definition.version}`,\n Object.freeze([...definition.targetIds]),\n );\n }\n const attemptedTargets: TelemetryStorageTarget[] = [];\n const bestEffortFailures: string[] = [];\n for (const target of this.options.targets) {\n attemptedTargets.push(target);\n const targetDefinitions = definitions.filter((definition) => {\n return definition.targetIds.length === 0 || definition.targetIds.includes(target.targetId);\n });\n const started = await this.startTarget(target, targetDefinitions);\n if (started.ok) {\n continue;\n }\n const failure = `${target.targetId}: ${started.error}`;\n if (target.delivery === 'required') {\n await this.rollbackAttemptedTargets(attemptedTargets, failure);\n return { ok: false, error: failure };\n }\n bestEffortFailures.push(failure);\n }\n this.state = 'ready';\n this.detail = bestEffortFailures.length > 0\n ? `Best-effort target startup failures: ${bestEffortFailures.join('; ')}`\n : null;\n return { ok: true, value: undefined };\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n const matchingTargets = this.options.targets.filter((target) => target.matches(request.batch));\n const hasRequiredTarget = matchingTargets.some((target) => target.delivery === 'required');\n if (!hasRequiredTarget && !this.options.volatile) {\n return {\n kind: 'rejected',\n idempotencyKey: request.batch.idempotencyKey,\n code: 'no-required-terminal',\n reason: 'No required storage target matched this batch',\n targetStates: this.unmatchedStates(matchingTargets),\n };\n }\n\n const committedTargets = this.committed.get(request.batch.idempotencyKey) ?? new Set<string>();\n const targetResults = await this.persistMatchingTargets(request, matchingTargets, committedTargets);\n this.remember(request.batch.idempotencyKey, committedTargets);\n return this.aggregateAcknowledgement(request, matchingTargets, targetResults);\n }\n\n async timeline(query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n const target = this.resolveQueryTarget(query.targetId);\n if (!target.ok) {\n return target;\n }\n return target.value.transport.timeline(Object.freeze({ ...query, targetId: target.value.targetId }));\n }\n\n async metrics(query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n const target = this.resolveQueryTarget(query.targetId);\n if (!target.ok) {\n return target;\n }\n return target.value.transport.metrics(Object.freeze({ ...query, targetId: target.value.targetId }));\n }\n\n async materializeRollups(nowMs: number, maxWorkMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('rollup', (target) => target.materializeRollups(nowMs, maxWorkMs));\n }\n\n async enforceRetention(nowMs: number, shouldContinue?: () => boolean): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('retention', (target) => target.enforceRetention(nowMs, shouldContinue));\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('checkpoint', (target) => target.checkpoint());\n }\n\n async reclaim(maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('reclaim', (target) => target.reclaim(maxPages));\n }\n\n async compact(deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('compaction', (target) => target.compact(deadlineMs));\n }\n\n status(): StorageTargetStatus {\n const states = this.options.targets.map((target) => target.transport.status());\n const requiredIds = new Set(this.options.targets\n .filter((target) => target.delivery === 'required')\n .map((target) => target.targetId));\n const failedRequired = states.find((state) => {\n return requiredIds.has(state.targetId) && state.state === 'failed';\n });\n return {\n targetId: this.targetId,\n state: failedRequired ? 'failed' : this.state,\n detail: this.state === 'failed' ? this.detail : failedRequired?.detail ?? this.detail,\n writerLeaseHeld: states.some((state) => state.writerLeaseHeld),\n };\n }\n\n async stop(deadlineMs: number): Promise<void> {\n const operations = this.options.targets.map((target) => {\n return Promise.resolve().then(() => target.transport.stop(deadlineMs));\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.allSettled(operations),\n deadlineMs,\n this.options.now,\n );\n if (outcome.kind === 'deadline-exhausted') {\n this.state = 'failed';\n this.detail = 'Telemetry storage router stop deadline exceeded';\n return;\n }\n if (outcome.kind === 'failed') {\n this.state = 'failed';\n this.detail = `Telemetry storage router stop failed: ${this.errorMessage(outcome.error)}`;\n throw outcome.error;\n }\n const failed = outcome.value.find((result): result is PromiseRejectedResult => result.status === 'rejected');\n if (failed) {\n this.state = 'failed';\n this.detail = `Telemetry storage router stop failed: ${this.errorMessage(failed.reason)}`;\n throw failed.reason;\n }\n this.state = 'stopped';\n this.detail = null;\n }\n\n targetStatuses(): readonly StorageTargetStatus[] {\n return this.options.targets.map((target) => target.transport.status());\n }\n\n private async startTarget(\n target: TelemetryStorageTarget,\n definitions: readonly MetricDefinition[],\n ): Promise<TelemetryResult<void, string>> {\n try {\n return await target.transport.start(definitions);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private async rollbackAttemptedTargets(\n attemptedTargets: readonly TelemetryStorageTarget[],\n primaryFailure: string,\n ): Promise<void> {\n const deadlineMs = this.options.now() + START_ROLLBACK_TIMEOUT_MS;\n const rollbackTargets = [...attemptedTargets].reverse();\n const settled = new Map<string, RollbackTargetResult>();\n const operations = rollbackTargets.map(async (target) => {\n const result = await this.stopRollbackTarget(target, deadlineMs);\n settled.set(target.targetId, result);\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.all(operations),\n deadlineMs,\n this.options.now,\n );\n const timedOut = outcome.kind === 'deadline-exhausted';\n const cleanupFailures = rollbackTargets.flatMap((target) => {\n const result = settled.get(target.targetId);\n if (result === undefined) {\n return timedOut ? [`${target.targetId}: rollback deadline exceeded`] : [];\n }\n return result.error === null ? [] : [`${target.targetId}: ${result.error}`];\n });\n this.state = 'failed';\n this.detail = cleanupFailures.length > 0\n ? `${primaryFailure}; rollback cleanup failures: ${cleanupFailures.join('; ')}`\n : primaryFailure;\n }\n\n private async stopRollbackTarget(\n target: TelemetryStorageTarget,\n deadlineMs: number,\n ): Promise<RollbackTargetResult> {\n try {\n await target.transport.stop(deadlineMs);\n return { targetId: target.targetId, error: null };\n } catch (cause) {\n return { targetId: target.targetId, error: this.errorMessage(cause) };\n }\n }\n\n private async persistMatchingTargets(\n request: StoragePersistRequest,\n targets: readonly TelemetryStorageTarget[],\n committedTargets: Set<string>,\n ): Promise<readonly StorageTargetResult[]> {\n return Promise.all(targets.map(async (target): Promise<StorageTargetResult> => {\n if (committedTargets.has(target.targetId)) {\n return { target, acknowledgement: this.alreadyCommitted(request), attempts: 0 };\n }\n const targetRequest = this.requestForTarget(request, target.targetId);\n const acknowledgement = await this.persistSafely(target, targetRequest);\n if (acknowledgement.kind === 'committed') {\n committedTargets.add(target.targetId);\n }\n return { target, acknowledgement, attempts: 1 };\n }));\n }\n\n private aggregateAcknowledgement(\n request: StoragePersistRequest,\n matchingTargets: readonly TelemetryStorageTarget[],\n targetResults: readonly StorageTargetResult[],\n ): TelemetryAcknowledgement {\n const targetStates = this.deliveryStates(targetResults, matchingTargets);\n const requiredResults = targetResults.filter(({ target }) => target.delivery === 'required');\n const conflict = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'conflict');\n const conflictAcknowledgement = conflict?.acknowledgement;\n if (conflictAcknowledgement?.kind === 'conflict') {\n return {\n kind: 'conflict',\n idempotencyKey: request.batch.idempotencyKey,\n reason: conflictAcknowledgement.reason,\n targetStates,\n };\n }\n const rejected = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'rejected');\n const rejectedAcknowledgement = rejected?.acknowledgement;\n if (rejectedAcknowledgement?.kind === 'rejected') {\n return {\n kind: 'rejected',\n idempotencyKey: request.batch.idempotencyKey,\n code: rejectedAcknowledgement.code,\n reason: rejectedAcknowledgement.reason,\n targetStates,\n };\n }\n const retryable = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'retryable');\n const retryableAcknowledgement = retryable?.acknowledgement;\n if (retryableAcknowledgement?.kind === 'retryable') {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: retryableAcknowledgement.reason,\n retryAfterMs: retryableAcknowledgement.retryAfterMs,\n targetStates,\n };\n }\n\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: targetResults.length > 0 && targetResults.every(({ attempts }) => attempts === 0),\n targetStates,\n };\n }\n\n private deliveryStates(\n targetResults: readonly StorageTargetResult[],\n matchingTargets: readonly TelemetryStorageTarget[],\n ): readonly TelemetryTargetDeliveryState[] {\n return [\n ...targetResults.map(({ target, acknowledgement, attempts }) => this.deliveryState(\n target,\n acknowledgement,\n attempts,\n )),\n ...this.unmatchedStates(matchingTargets),\n ];\n }\n\n private requestForTarget(request: StoragePersistRequest, targetId: string): StoragePersistRequest {\n const samples = request.samples.filter((sample) => {\n return sample.targetIds.length === 0 || sample.targetIds.includes(targetId);\n });\n const extractionFailures = request.extractionFailures.filter((failure) => {\n const targetIds = this.definitionTargets.get(`${failure.metricName}:${failure.definitionVersion}`);\n return targetIds === undefined || targetIds.length === 0 || targetIds.includes(targetId);\n });\n return Object.freeze({\n batch: request.batch,\n samples: Object.freeze(samples),\n extractionFailures: Object.freeze(extractionFailures),\n });\n }\n\n private async persistSafely(\n target: TelemetryStorageTarget,\n request: StoragePersistRequest,\n ): Promise<TelemetryAcknowledgement> {\n try {\n const received: unknown = await target.transport.persist(request);\n const validated = this.acknowledgementContract.validateAndDetach(request.batch, received);\n return validated.ok\n ? validated.value\n : this.invalidAcknowledgement(request, validated.error);\n } catch (cause) {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: this.acknowledgementContract.exceptionReason(cause),\n retryAfterMs: 50,\n targetStates: [],\n };\n }\n }\n\n private invalidAcknowledgement(\n request: StoragePersistRequest,\n error: string,\n ): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: 50,\n targetStates: [],\n };\n }\n\n private alreadyCommitted(request: StoragePersistRequest): TelemetryAcknowledgement {\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: true,\n targetStates: [],\n };\n }\n\n private deliveryState(\n target: TelemetryStorageTarget,\n acknowledgement: TelemetryAcknowledgement,\n attempts: number,\n ): TelemetryTargetDeliveryState {\n return acknowledgement.kind === 'committed'\n ? {\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'committed',\n attempts,\n reason: null,\n }\n : {\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'failed',\n attempts,\n reason: acknowledgement.reason,\n };\n }\n\n private unmatchedStates(matchingTargets: readonly TelemetryStorageTarget[]): TelemetryTargetDeliveryState[] {\n const matchingIds = new Set(matchingTargets.map((target) => target.targetId));\n return this.options.targets\n .filter((target) => !matchingIds.has(target.targetId))\n .map((target) => ({\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'abandoned' as const,\n attempts: 0,\n reason: 'route-not-matched',\n }));\n }\n\n private resolveQueryTarget(\n requestedTargetId: string | null,\n ): TelemetryResult<TelemetryStorageTarget, TelemetryQueryError> {\n const queryable = this.options.targets.filter((target) => target.transport.capabilities.queries);\n if (queryable.length === 0) {\n return {\n ok: false,\n error: { kind: 'unsupported', message: 'No configured telemetry target supports queries' },\n };\n }\n const resolvedId = requestedTargetId ?? this.options.defaultTargetId ?? (queryable.length === 1\n ? queryable[0]?.targetId ?? null\n : null);\n if (resolvedId === null) {\n return {\n ok: false,\n error: { kind: 'ambiguous-target', message: 'Multiple queryable targets exist and no default was configured' },\n };\n }\n const target = queryable.find((candidate) => candidate.targetId === resolvedId);\n if (!target) {\n return { ok: false, error: { kind: 'unknown-target', message: `Unknown query target ${resolvedId}` } };\n }\n return { ok: true, value: target };\n }\n\n private async runMaintenance(\n stage: MaintenanceStageResult['stage'],\n run: (target: TelemetryStorageTransport) => Promise<TelemetryResult<MaintenanceStageResult, string>>,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n let affectedRows = 0;\n let affectedPages = 0;\n let elapsedMs = 0;\n for (const target of this.options.targets) {\n if (!target.transport.capabilities.maintenance) {\n continue;\n }\n const completed = await run(target.transport);\n if (!completed.ok && target.delivery === 'required') {\n return { ok: false, error: `${target.targetId}: ${completed.error}` };\n }\n if (completed.ok) {\n affectedRows += completed.value.affectedRows;\n affectedPages += completed.value.affectedPages;\n elapsedMs += completed.value.elapsedMs;\n }\n }\n return {\n ok: true,\n value: { stage, affectedRows, affectedPages, elapsedMs, detail: null },\n };\n }\n\n private validateOptions(): void {\n if (!this.options.routerId.trim() || this.options.targets.length === 0) {\n throw new Error('A telemetry storage router requires an id and at least one target');\n }\n if (this.options.maxRememberedBatches !== undefined\n && (!Number.isSafeInteger(this.options.maxRememberedBatches)\n || this.options.maxRememberedBatches <= 0)) {\n throw new Error('Telemetry storage router memory must be a positive safe integer');\n }\n const targetIds = this.options.targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error('Telemetry storage target ids must be unique');\n }\n const requiredTargets = this.options.targets.filter((target) => target.delivery === 'required');\n if (!this.options.volatile && requiredTargets.length === 0) {\n throw new Error('A non-volatile storage router requires a required target');\n }\n const defaultExists = this.options.defaultTargetId === null\n || targetIds.includes(this.options.defaultTargetId);\n if (!defaultExists) {\n throw new Error(`Unknown default telemetry target ${this.options.defaultTargetId}`);\n }\n const defaultTarget = this.options.targets.find((target) => target.targetId === this.options.defaultTargetId);\n if (defaultTarget && !defaultTarget.transport.capabilities.queries) {\n throw new Error(`Default telemetry target ${defaultTarget.targetId} does not support queries`);\n }\n }\n\n private remember(idempotencyKey: string, targets: Set<string>): void {\n this.committed.set(idempotencyKey, targets);\n const maximum = this.options.maxRememberedBatches ?? 1_024;\n while (this.committed.size > maximum) {\n const oldest = this.committed.keys().next().value;\n if (typeof oldest !== 'string') {\n return;\n }\n this.committed.delete(oldest);\n }\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n"],"mappings":"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","names":["target"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/index.ts","../../src/core/helper/canonical_json.ts","../../src/core/bounded_metadata_snapshotter.ts","../../src/core/metric_definition_contract.ts","../../src/core/metric_extractor.ts","../../src/core/telemetry_acknowledgement_contract.ts","../../src/core/helper/client_defaults.ts","../../src/core/telemetry_batch_contract.ts","../../src/core/helper/telemetry_deadline_guard.ts","../../src/core/telemetry_batch_router.ts","../../src/core/telemetry_client.ts","../../src/core/telemetry_storage_router.ts"],"sourcesContent":["export { BoundedMetadataSnapshotter } from './bounded_metadata_snapshotter.js';\nexport { MetricDefinitionContract } from './metric_definition_contract.js';\nexport { MetricExtractor } from './metric_extractor.js';\nexport { TelemetryAcknowledgementContract } from './telemetry_acknowledgement_contract.js';\nexport { TelemetryBatchContract } from './telemetry_batch_contract.js';\nexport { TelemetryBatchRouter } from './telemetry_batch_router.js';\nexport { TelemetryClient } from './telemetry_client.js';\nexport { TelemetryStorageRouter } from './telemetry_storage_router.js';\nexport {\n DEFAULT_METADATA_SNAPSHOT_LIMITS,\n DEFAULT_TELEMETRY_ADMISSION_POLICY,\n DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS,\n} from './helper/client_defaults.js';\nexport type {\n TelemetryAdmissionPolicy,\n TelemetryAdmissionPriority,\n TelemetryAdmissionResult,\n TelemetryClientOptions,\n TelemetryClientStatus,\n TelemetryMinimumLevel,\n} from './types/client.types.js';\nexport type {\n ResolvedTelemetryConfiguration,\n SqliteMaintenanceConfiguration,\n SqliteRetentionConfiguration,\n SqliteSchemaConfiguration,\n SqliteTableOverrides,\n SqliteTargetConfiguration,\n TelemetryRole,\n} from './types/configuration.types.js';\nexport type {\n TelemetryAdmitInput,\n TelemetryEmitInput,\n TelemetryEnvelope,\n TelemetryLevel,\n} from './types/envelope.types.js';\nexport type {\n TelemetryJsonObject,\n TelemetryJsonPrimitive,\n TelemetryJsonValue,\n} from './types/json.types.js';\nexport type {\n ExtractedMetricSample,\n MetricAggregate,\n MetricCardinalityRule,\n MetricDefinition,\n MetricExtraction,\n MetricExtractionFailure,\n MetricMeasurement,\n MetricOverflowPolicy,\n MetricRollupValues,\n} from './types/metric.types.js';\nexport type {\n MetadataRedactionRule,\n MetadataSnapshot,\n MetadataSnapshotLimits,\n MetadataSnapshotStats,\n} from './types/metadata.types.js';\nexport type {\n MetricBucket,\n MetricQuery,\n MetricQueryGap,\n MetricQueryResponse,\n MetricQuerySegment,\n TelemetryQueryError,\n TimelineGap,\n TimelineQuery,\n TimelineQueryResponse,\n} from './types/query.types.js';\nexport type { TelemetryResult } from './types/result.types.js';\nexport type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageRouterOptions,\n TelemetryStorageTarget,\n TelemetryStorageTransport,\n} from './types/storage.types.js';\nexport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryBatchRoute,\n TelemetryBatchRouterOptions,\n TelemetryBatchTransport,\n TelemetryBatchTransportCapabilities,\n TelemetryBatchValidationLimits,\n TelemetryDeliveryMode,\n TelemetryDropCounter,\n TelemetryTargetDeliveryState,\n} from './types/transport.types.js';\n","const UTF8_ENCODER = new TextEncoder();\n\n/**\n * Canonical key order is UTF-8 byte order. This must stay byte-identical to\n * the native Rust collector, whose serde_json BTreeMap serialization sorts\n * object keys the same way; locale-aware comparisons (localeCompare) depend\n * on the ICU build and diverge from the Rust side, which invalidates every\n * cross-language checksum.\n */\nexport function compareCanonicalKeys(left: string, right: string): number {\n if (left === right) return 0;\n // Code-unit comparison equals UTF-8 byte order for ASCII-only keys.\n // eslint-disable-next-line no-control-regex\n if (/^[\\x00-\\x7f]*$/.test(left) && /^[\\x00-\\x7f]*$/.test(right)) {\n return left < right ? -1 : 1;\n }\n const leftBytes = UTF8_ENCODER.encode(left);\n const rightBytes = UTF8_ENCODER.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const difference = (leftBytes[index] ?? 0) - (rightBytes[index] ?? 0);\n if (difference !== 0) return difference;\n }\n return leftBytes.length - rightBytes.length;\n}\n\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error('Canonical telemetry JSON cannot encode a non-finite number');\n }\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((item) => canonicalJson(item));\n return `[${items.join(',')}]`;\n }\n\n if (typeof value !== 'object') {\n throw new Error(`Canonical telemetry JSON cannot encode ${typeof value}`);\n }\n\n const entries = Object.entries(value).sort(([left], [right]) => compareCanonicalKeys(left, right));\n const properties = entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`);\n return `{${properties.join(',')}}`;\n}\n\nexport function telemetryUtf8Length(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nexport function telemetryChecksum(value: unknown): string {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = BigInt.asUintN(64, hash * prime);\n }\n\n return hash.toString(16).padStart(16, '0');\n}\n","import { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from './types/json.types.js';\nimport type { MetadataSnapshot, MetadataSnapshotLimits, MetadataSnapshotStats } from './types/metadata.types.js';\n\nconst SENTINEL_CIRCULAR = '[telemetry:circular]';\nconst SENTINEL_TRUNCATED = '[telemetry:truncated]';\n\nexport class BoundedMetadataSnapshotter {\n constructor(private readonly limits: MetadataSnapshotLimits) {\n this.validateLimits();\n }\n\n snapshot(input: unknown): MetadataSnapshot {\n const state = {\n bytes: 0,\n properties: 0,\n truncatedValues: 0,\n redactedValues: 0,\n serializationFailures: 0,\n seen: new WeakSet<object>(),\n };\n\n let normalized: TelemetryJsonValue;\n try {\n normalized = this.normalize(input, '$', 0, state);\n } catch {\n state.serializationFailures += 1;\n normalized = { __telemetry: '[telemetry:snapshot-failed]' };\n }\n\n const root = this.ensureObject(normalized);\n const canonical = canonicalJson(root);\n const metadata = telemetryUtf8Length(canonical) <= this.limits.maxBytes\n ? root\n : Object.freeze({ __telemetry: SENTINEL_TRUNCATED });\n if (metadata !== root) {\n state.truncatedValues += 1;\n }\n\n const stats: MetadataSnapshotStats = Object.freeze({\n estimatedBytes: Math.min(telemetryUtf8Length(canonical), this.limits.maxBytes),\n truncatedValues: state.truncatedValues,\n redactedValues: state.redactedValues,\n serializationFailures: state.serializationFailures,\n });\n\n return Object.freeze({ metadata, stats });\n }\n\n private normalize(\n input: unknown,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonValue {\n const replacement = this.redactionFor(path);\n if (replacement !== null) {\n state.redactedValues += 1;\n return replacement;\n }\n\n if (depth > this.limits.maxDepth || state.bytes >= this.limits.maxBytes) {\n state.truncatedValues += 1;\n return SENTINEL_TRUNCATED;\n }\n\n if (input === null || typeof input === 'boolean') {\n return input;\n }\n if (typeof input === 'string') {\n return this.normalizeString(input, state);\n }\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : `[telemetry:number:${String(input)}]`;\n }\n if (typeof input === 'bigint') {\n return `[telemetry:bigint:${input.toString()}]`;\n }\n if (typeof input === 'undefined') {\n return '[telemetry:undefined]';\n }\n if (typeof input === 'symbol') {\n return `[telemetry:symbol:${input.description ?? ''}]`;\n }\n if (typeof input === 'function') {\n return '[telemetry:function]';\n }\n if (input instanceof Error) {\n return this.normalizeError(input, path, depth, state);\n }\n if (typeof input !== 'object') {\n return `[telemetry:unsupported:${typeof input}]`;\n }\n if (state.seen.has(input)) {\n return SENTINEL_CIRCULAR;\n }\n\n state.seen.add(input);\n try {\n return Array.isArray(input)\n ? this.normalizeArray(input, path, depth, state)\n : this.normalizeObject(input, path, depth, state);\n } finally {\n state.seen.delete(input);\n }\n }\n\n private normalizeString(\n input: string,\n state: { bytes: number; truncatedValues: number },\n ): string {\n const stringLimit = Math.min(this.limits.maxStringLength, Math.max(0, this.limits.maxBytes - state.bytes));\n const truncated = input.length > stringLimit;\n const normalized = truncated ? input.slice(0, stringLimit) : input;\n state.bytes += telemetryUtf8Length(normalized);\n if (truncated) {\n state.truncatedValues += 1;\n }\n return normalized;\n }\n\n private normalizeArray(\n input: readonly unknown[],\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): readonly TelemetryJsonValue[] {\n const length = Math.min(input.length, this.limits.maxArrayLength);\n const values: TelemetryJsonValue[] = [];\n for (let index = 0; index < length; index += 1) {\n let item: unknown;\n try {\n item = input[index];\n } catch {\n state.serializationFailures += 1;\n item = '[telemetry:property-read-failed]';\n }\n values.push(this.normalize(item, `${path}[${index}]`, depth + 1, state));\n }\n if (input.length > length) {\n values.push(SENTINEL_TRUNCATED);\n state.truncatedValues += 1;\n }\n return Object.freeze(values);\n }\n\n private normalizeObject(\n input: object,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n let keys: string[];\n try {\n keys = Object.keys(input).sort((left, right) => left.localeCompare(right));\n } catch {\n state.serializationFailures += 1;\n return Object.freeze({ __telemetry: '[telemetry:keys-failed]' });\n }\n\n const output: Record<string, TelemetryJsonValue> = {};\n for (const key of keys) {\n if (state.properties >= this.limits.maxProperties) {\n output.__telemetry = SENTINEL_TRUNCATED;\n state.truncatedValues += 1;\n break;\n }\n state.properties += 1;\n state.bytes += telemetryUtf8Length(key);\n const childPath = path === '$' ? key : `${path}.${key}`;\n const redaction = this.redactionFor(childPath);\n if (redaction !== null) {\n output[key] = redaction;\n state.redactedValues += 1;\n continue;\n }\n\n let property: unknown;\n try {\n property = Reflect.get(input, key);\n } catch {\n state.serializationFailures += 1;\n property = '[telemetry:property-read-failed]';\n }\n output[key] = this.normalize(property, childPath, depth + 1, state);\n }\n return Object.freeze(output);\n }\n\n private normalizeError(\n error: Error,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n const name = this.readErrorField(error, 'name', state);\n const message = this.readErrorField(error, 'message', state);\n const stack = this.readErrorField(error, 'stack', state).slice(0, this.limits.maxErrorStackLength);\n return Object.freeze({\n name: this.normalize(name, `${path}.name`, depth + 1, state),\n message: this.normalize(message, `${path}.message`, depth + 1, state),\n stack: this.normalize(stack, `${path}.stack`, depth + 1, state),\n });\n }\n\n private readErrorField(\n error: Error,\n field: 'name' | 'message' | 'stack',\n state: { serializationFailures: number },\n ): string {\n try {\n return typeof error[field] === 'string' ? error[field] : '';\n } catch {\n state.serializationFailures += 1;\n return '[telemetry:error-field-read-failed]';\n }\n }\n\n private ensureObject(value: TelemetryJsonValue): TelemetryJsonObject {\n return this.isJsonObject(value) ? value : Object.freeze({ value });\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private redactionFor(path: string): string | null {\n const matchingRule = this.limits.redactions.find((rule) => rule.path === path);\n return matchingRule?.replacement ?? null;\n }\n\n private validateLimits(): void {\n const limits = [\n this.limits.maxBytes,\n this.limits.maxDepth,\n this.limits.maxProperties,\n this.limits.maxArrayLength,\n this.limits.maxStringLength,\n this.limits.maxErrorStackLength,\n ];\n const hasInvalidLimit = limits.some((limit) => !Number.isInteger(limit) || limit <= 0);\n if (hasInvalidLimit) {\n throw new Error('Metadata snapshot limits must be positive integers');\n }\n }\n}\n","import type { MetricDefinition } from './types/metric.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\n\nexport class MetricDefinitionContract {\n normalize(definition: MetricDefinition): TelemetryResult<MetricDefinition, string> {\n const parsedSelector = this.parseSelector(definition.selector);\n if (!parsedSelector.ok) {\n return parsedSelector;\n }\n\n const bracketGroupBy = parsedSelector.value.groupBy;\n const configuredGroupBy = definition.groupBy;\n const bothSpecifyDifferentGrouping = bracketGroupBy.length > 0\n && configuredGroupBy.length > 0\n && bracketGroupBy.join('.') !== configuredGroupBy.join('.');\n if (bothSpecifyDifferentGrouping) {\n return { ok: false, error: `Metric ${definition.name} has conflicting selector and groupBy declarations` };\n }\n const groupBy = configuredGroupBy.length > 0 ? configuredGroupBy : bracketGroupBy;\n\n const basicError = this.validateBasic(definition, parsedSelector.value.selector, groupBy);\n if (basicError !== null) {\n return { ok: false, error: basicError };\n }\n if (parsedSelector.value.wildcardUngrouped\n && definition.measurements.some((measurement) => measurement.kind !== 'count')) {\n return {\n ok: false,\n error: `Metric ${definition.name} uses [*] and may only declare count`,\n };\n }\n\n return {\n ok: true,\n value: Object.freeze({\n ...definition,\n selector: parsedSelector.value.selector,\n groupBy: Object.freeze([...groupBy]),\n resolutionsMs: Object.freeze([...definition.resolutionsMs].sort((left, right) => left - right)),\n measurements: Object.freeze([...definition.measurements]),\n targetIds: Object.freeze([...definition.targetIds]),\n cardinality: Object.freeze({ ...definition.cardinality }),\n }),\n };\n }\n\n matches(selector: string, label: string): boolean {\n const selectorSegments = selector.split('.');\n const labelSegments = label.split('.');\n return this.matchSegments(selectorSegments, labelSegments, 0, 0);\n }\n\n private parseSelector(selector: string): TelemetryResult<Readonly<{\n selector: string;\n groupBy: readonly string[];\n wildcardUngrouped: boolean;\n }>, string> {\n if (selector.startsWith('[')) {\n return { ok: false, error: 'A metric selector cannot omit its event label or glob' };\n }\n\n const bracketStart = selector.lastIndexOf('[');\n if (bracketStart < 0) {\n return { ok: true, value: { selector, groupBy: [], wildcardUngrouped: false } };\n }\n if (!selector.endsWith(']')) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n\n const eventSelector = selector.slice(0, bracketStart);\n const bracket = selector.slice(bracketStart + 1, -1).trim();\n if (!eventSelector || !bracket) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n // `[a, b]` groups by several bounded fields at once (e.g. routeKey and\n // visibility); each name is validated downstream like a `groupBy` entry.\n const groupBy = bracket === '*' ? [] : bracket.split(',').map((field) => field.trim());\n if (groupBy.some((field) => field.length === 0)) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n return {\n ok: true,\n value: {\n selector: eventSelector,\n groupBy,\n wildcardUngrouped: bracket === '*',\n },\n };\n }\n\n private validateBasic(\n definition: MetricDefinition,\n selector: string,\n groupBy: readonly string[],\n ): string | null {\n if (!/^[A-Za-z0-9_*][A-Za-z0-9_.:*\\-]*$/.test(selector)) {\n return `Metric ${definition.name} has an invalid selector`;\n }\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(definition.name)) {\n return `Metric name ${definition.name} is invalid`;\n }\n if (!Number.isInteger(definition.version) || definition.version <= 0) {\n return `Metric ${definition.name} must have a positive integer version`;\n }\n if (definition.measurements.length === 0) {\n return `Metric ${definition.name} must declare at least one measurement`;\n }\n const invalidResolution = definition.resolutionsMs.some(\n (resolution) => !Number.isInteger(resolution) || resolution <= 0,\n );\n const duplicateResolution = new Set(definition.resolutionsMs).size !== definition.resolutionsMs.length;\n if (invalidResolution || duplicateResolution || definition.resolutionsMs.length === 0) {\n return `Metric ${definition.name} has invalid or duplicate resolutions`;\n }\n const missingCardinality = groupBy.find((field) => definition.cardinality[field] === undefined);\n if (missingCardinality) {\n return `Metric ${definition.name} is missing cardinality policy for ${missingCardinality}`;\n }\n const invalidCardinality = Object.values(definition.cardinality).some(\n (rule) => !Number.isInteger(rule.maxValuesPerBucket) || rule.maxValuesPerBucket <= 0,\n );\n if (invalidCardinality) {\n return `Metric ${definition.name} has an invalid cardinality limit`;\n }\n return null;\n }\n\n private matchSegments(\n selector: readonly string[],\n label: readonly string[],\n selectorIndex: number,\n labelIndex: number,\n ): boolean {\n if (selectorIndex === selector.length) {\n return labelIndex === label.length;\n }\n const segment = selector[selectorIndex];\n if (segment === '**') {\n if (selectorIndex === selector.length - 1) {\n return true;\n }\n for (let next = labelIndex; next <= label.length; next += 1) {\n if (this.matchSegments(selector, label, selectorIndex + 1, next)) {\n return true;\n }\n }\n return false;\n }\n if (labelIndex >= label.length) {\n return false;\n }\n const segmentMatches = segment === '*' || segment === label[labelIndex];\n return segmentMatches\n && this.matchSegments(selector, label, selectorIndex + 1, labelIndex + 1);\n }\n}\n","import { canonicalJson } from './helper/canonical_json.js';\nimport { MetricDefinitionContract } from './metric_definition_contract.js';\nimport type { TelemetryEnvelope } from './types/envelope.types.js';\nimport type {\n ExtractedMetricSample,\n MetricDefinition,\n MetricExtraction,\n MetricExtractionFailure,\n} from './types/metric.types.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from './types/json.types.js';\n\nexport class MetricExtractor {\n private readonly contract = new MetricDefinitionContract();\n\n constructor(private readonly definitions: readonly MetricDefinition[]) {}\n\n extract(envelopes: readonly TelemetryEnvelope[]): MetricExtraction {\n const samples: ExtractedMetricSample[] = [];\n const failures: MetricExtractionFailure[] = [];\n for (const envelope of envelopes) {\n for (const definition of this.definitions) {\n if (!this.contract.matches(definition.selector, envelope.label)) {\n continue;\n }\n const extracted = this.extractDefinition(definition, envelope);\n if (extracted.ok) {\n samples.push(extracted.sample);\n } else if (definition.missingField === 'record-failure') {\n failures.push({\n metricName: definition.name,\n definitionVersion: definition.version,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n reason: extracted.reason,\n });\n }\n }\n }\n return Object.freeze({\n samples: Object.freeze(samples),\n failures: Object.freeze(failures),\n });\n }\n\n private extractDefinition(\n definition: MetricDefinition,\n envelope: TelemetryEnvelope,\n ):\n | Readonly<{ ok: true; sample: ExtractedMetricSample }>\n | Readonly<{ ok: false; reason: string }> {\n const dimensions: Record<string, TelemetryJsonValue> = {};\n for (const field of definition.groupBy) {\n const dimension = this.readField(envelope, field);\n if (!this.isDimensionValue(dimension)) {\n return { ok: false, reason: `Missing or invalid dimension ${field}` };\n }\n dimensions[field] = dimension;\n }\n\n const values: Record<string, number> = { __count: 1 };\n for (const measurement of definition.measurements) {\n if (measurement.kind === 'count') {\n continue;\n }\n const measured = this.readField(envelope, measurement.field);\n if (typeof measured !== 'number' || !Number.isFinite(measured)) {\n return { ok: false, reason: `Missing or non-numeric measurement ${measurement.field}` };\n }\n values[measurement.field] = measured;\n }\n\n const frozenDimensions = Object.freeze(dimensions);\n return {\n ok: true,\n sample: Object.freeze({\n metricName: definition.name,\n definitionVersion: definition.version,\n occurredAtMs: envelope.occurredAtMs,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n dimensions: frozenDimensions,\n dimensionKey: canonicalJson(frozenDimensions),\n values: Object.freeze(values),\n targetIds: definition.targetIds,\n }),\n };\n }\n\n private readField(envelope: TelemetryEnvelope, path: string): TelemetryJsonValue | undefined {\n const topLevel = this.readTopLevel(envelope, path);\n if (topLevel !== undefined) {\n return topLevel;\n }\n const segments = path.split('.');\n let current: TelemetryJsonValue = envelope.metadata;\n for (const segment of segments) {\n if (!this.isJsonObject(current)) {\n return undefined;\n }\n const nextValue: TelemetryJsonValue | undefined = current[segment];\n if (nextValue === undefined) {\n return undefined;\n }\n current = nextValue;\n }\n return current;\n }\n\n private readTopLevel(envelope: TelemetryEnvelope, path: string): TelemetryJsonValue | undefined {\n switch (path) {\n case 'conversationId':\n return envelope.conversationId;\n case 'correlationId':\n return envelope.correlationId;\n case 'source':\n return envelope.source;\n case 'processKind':\n return envelope.processKind;\n case 'level':\n return envelope.level;\n case 'label':\n return envelope.label;\n case 'producerId':\n return envelope.producerId;\n default:\n return undefined;\n }\n }\n\n private isDimensionValue(value: TelemetryJsonValue | undefined): value is string | number | boolean | null {\n return value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n}\n","import { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryTargetDeliveryState,\n} from './types/transport.types.js';\n\nconst MAX_TARGET_STATES = 1_024;\nconst MAX_TARGET_ID_BYTES = 256;\nconst MAX_REASON_BYTES = 512;\n\nexport class TelemetryAcknowledgementContract {\n exceptionReason(cause: unknown): string {\n try {\n const value = cause instanceof Error ? cause.message : cause;\n return this.truncateReason(String(value));\n } catch {\n return 'Unknown telemetry transport failure';\n }\n }\n\n validateAndDetach(\n batch: TelemetryBatch,\n value: unknown,\n ): TelemetryResult<TelemetryAcknowledgement, string> {\n try {\n const initialError = this.acknowledgementError(batch, value);\n if (initialError !== null) {\n return { ok: false, error: initialError };\n }\n const detached: unknown = JSON.parse(canonicalJson(value));\n const detachedError = this.acknowledgementError(batch, detached);\n if (detachedError !== null) {\n return { ok: false, error: detachedError };\n }\n return { ok: true, value: this.freezeAcknowledgement(detached as TelemetryAcknowledgement) };\n } catch {\n return { ok: false, error: 'acknowledgement could not be inspected' };\n }\n }\n\n private acknowledgementError(batch: TelemetryBatch, value: unknown): string | null {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return 'acknowledgement identity is missing or mismatched';\n }\n const targetsError = this.targetStatesError(value.targetStates);\n if (targetsError !== null) {\n return targetsError;\n }\n switch (value.kind) {\n case 'committed':\n return this.committedAcknowledgementError(batch, value);\n case 'retryable':\n return this.retryableAcknowledgementError(value);\n case 'rejected':\n return this.rejectedAcknowledgementError(value);\n case 'conflict':\n return this.conflictAcknowledgementError(value);\n default:\n return 'acknowledgement kind is invalid';\n }\n }\n\n private committedAcknowledgementError(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])\n && Number.isSafeInteger(value.committedAtMs)\n && Number(value.committedAtMs) >= 0\n && value.acceptedEvents === batch.envelopes.length\n && typeof value.duplicate === 'boolean';\n return valid ? null : 'committed acknowledgement fields are invalid';\n }\n\n private retryableAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])\n && this.isBoundedReason(value.reason)\n && Number.isFinite(value.retryAfterMs)\n && Number(value.retryAfterMs) >= 0\n && Number(value.retryAfterMs) <= Number.MAX_SAFE_INTEGER;\n return valid ? null : 'retryable acknowledgement fields are invalid';\n }\n\n private rejectedAcknowledgementError(value: Record<string, unknown>): string | null {\n const codes = ['invalid-batch', 'unsupported-version', 'no-required-terminal', 'closed'];\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])\n && codes.includes(String(value.code))\n && this.isBoundedReason(value.reason);\n return valid ? null : 'rejected acknowledgement fields are invalid';\n }\n\n private conflictAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])\n && this.isBoundedReason(value.reason);\n return valid ? null : 'conflict acknowledgement fields are invalid';\n }\n\n private targetStatesError(value: unknown): string | null {\n if (!Array.isArray(value)\n || value.length > MAX_TARGET_STATES\n || !this.hasExactArrayIndexes(value)) {\n return 'acknowledgement target states are invalid';\n }\n const targetIds = new Set<string>();\n for (const target of value) {\n if (!this.isValidTargetState(target) || targetIds.has(target.targetId)) {\n return 'acknowledgement target states are invalid';\n }\n targetIds.add(target.targetId);\n }\n return null;\n }\n\n private isValidTargetState(value: unknown): value is Record<string, unknown> & TelemetryTargetDeliveryState {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return false;\n }\n const deliveries = ['required', 'best-effort'];\n const states = ['pending', 'committed', 'failed', 'abandoned'];\n return typeof value.targetId === 'string'\n && value.targetId.length > 0\n && telemetryUtf8Length(value.targetId) <= MAX_TARGET_ID_BYTES\n && deliveries.includes(String(value.delivery))\n && states.includes(String(value.state))\n && Number.isSafeInteger(value.attempts)\n && Number(value.attempts) >= 0\n && (value.reason === null || this.isBoundedReason(value.reason));\n }\n\n private freezeAcknowledgement(value: TelemetryAcknowledgement): TelemetryAcknowledgement {\n const targetStates = value.targetStates.map((target) => Object.freeze({ ...target }));\n return Object.freeze({ ...value, targetStates: Object.freeze(targetStates) });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Reflect.ownKeys(value);\n return keys.length === expected.length\n && keys.every((key) => typeof key === 'string' && expected.includes(key));\n }\n\n private hasExactArrayIndexes(value: readonly unknown[]): boolean {\n const keys = Reflect.ownKeys(value);\n if (keys.length !== value.length + 1 || !keys.includes('length')) {\n return false;\n }\n return value.every((_item, index) => keys.includes(String(index)));\n }\n\n private isBoundedReason(value: unknown): value is string {\n return typeof value === 'string' && telemetryUtf8Length(value) <= MAX_REASON_BYTES;\n }\n\n private truncateReason(value: string): string {\n const encoded = new TextEncoder().encode(value);\n if (encoded.length <= MAX_REASON_BYTES) {\n return value;\n }\n const decoder = new TextDecoder('utf-8', { fatal: true });\n for (let length = MAX_REASON_BYTES; length > 0; length -= 1) {\n try {\n return decoder.decode(encoded.subarray(0, length));\n } catch {\n // At most three trailing continuation bytes need to be removed.\n }\n }\n return '';\n }\n}\n","import type { TelemetryAdmissionPolicy } from '../types/client.types.js';\nimport type { MetadataSnapshotLimits } from '../types/metadata.types.js';\nimport type { TelemetryBatchValidationLimits } from '../types/transport.types.js';\n\nexport const DEFAULT_TELEMETRY_ADMISSION_POLICY: TelemetryAdmissionPolicy = Object.freeze({\n maxQueuedEvents: 2_000,\n maxQueuedBytes: 2_000_000,\n maxBatchEvents: 128,\n maxBatchBytes: 256_000,\n maxInFlightBatches: 1,\n retryLimit: 3,\n retryBaseDelayMs: 25,\n sampleRates: Object.freeze({\n low: 1,\n normal: 1,\n high: 1,\n }),\n});\n\nexport const DEFAULT_METADATA_SNAPSHOT_LIMITS: MetadataSnapshotLimits = Object.freeze({\n maxBytes: 32_768,\n maxDepth: 8,\n maxProperties: 256,\n maxArrayLength: 128,\n maxStringLength: 4_096,\n maxErrorStackLength: 8_192,\n redactions: Object.freeze([]),\n});\n\nexport const DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS: TelemetryBatchValidationLimits = Object.freeze({\n maxBatchEvents: 1_024,\n maxBatchBytes: 1_000_000,\n maxEventBytes: 256_000,\n maxMetadataBytes: 131_072,\n maxMetadataDepth: 16,\n maxMetadataProperties: 1_024,\n maxMetadataArrayLength: 1_024,\n maxMetadataStringBytes: 65_536,\n maxDropCounters: 15,\n maxIdentityBytes: 1_024,\n});\n","import {\n canonicalJson,\n telemetryChecksum,\n telemetryUtf8Length,\n} from './helper/canonical_json.js';\nimport { DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS } from './helper/client_defaults.js';\nimport type { TelemetryEnvelope } from './types/envelope.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n TelemetryBatch,\n TelemetryBatchValidationLimits,\n TelemetryDropCounter,\n} from './types/transport.types.js';\n\nconst BATCH_KEYS = Object.freeze([\n 'schemaVersion',\n 'producerId',\n 'sequenceStart',\n 'sequenceEnd',\n 'idempotencyKey',\n 'checksum',\n 'envelopes',\n 'dropCounters',\n]);\n\nconst ENVELOPE_KEYS = Object.freeze([\n 'schemaVersion',\n 'eventId',\n 'producerId',\n 'sequence',\n 'occurredAtMs',\n 'monotonicNs',\n 'source',\n 'processKind',\n 'level',\n 'label',\n 'conversationId',\n 'correlationId',\n 'metadata',\n]);\n\nconst DROP_COUNTER_KEYS = Object.freeze(['reason', 'priority', 'count']);\nconst DROP_REASONS = new Set(['capacity', 'sampled', 'stopped', 'invalid', 'transport']);\nconst DROP_PRIORITIES = new Set(['low', 'normal', 'high']);\n\ntype JsonValidationState = {\n properties: number;\n bytes: number;\n active: WeakSet<object>;\n};\n\nexport class TelemetryBatchContract {\n static readonly schemaVersion = 1;\n static readonly checksumAlgorithm = 'fnv1a64-canonical-json-v1';\n readonly limits: TelemetryBatchValidationLimits;\n\n constructor(limits: Partial<TelemetryBatchValidationLimits> = {}) {\n this.limits = Object.freeze({\n ...DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS,\n ...limits,\n });\n this.validateLimits();\n }\n\n create(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.createChecked(envelopes, dropCounters);\n } catch {\n return { ok: false, error: 'Telemetry batch creation failed safe validation' };\n }\n }\n\n validate(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.validateChecked(batch);\n } catch {\n return { ok: false, error: 'Telemetry batch validation failed safely' };\n }\n }\n\n private createChecked(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n const payloadError = this.validatePayload(envelopes, dropCounters);\n if (payloadError !== null) {\n return { ok: false, error: payloadError };\n }\n const payloadBytesError = this.payloadBytesError(envelopes, dropCounters);\n if (payloadBytesError !== null) {\n return { ok: false, error: payloadBytesError };\n }\n\n const first = envelopes[0];\n const last = envelopes[envelopes.length - 1];\n if (!first || !last) {\n return { ok: false, error: 'A telemetry batch must contain a first and last envelope' };\n }\n\n const producerId = first.producerId;\n const sequenceStart = first.sequence;\n const sequenceEnd = last.sequence;\n const checksumPayload = this.checksumPayload(\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n );\n const checksum = telemetryChecksum(checksumPayload);\n const idempotencyKey = `tb1:${producerId}:${sequenceStart}-${sequenceEnd}:${checksum}`;\n const batch = Object.freeze({\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n idempotencyKey,\n checksum,\n envelopes: Object.freeze([...envelopes]),\n dropCounters: Object.freeze([...dropCounters]),\n });\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const byteError = this.serializedByteError(batch, this.limits.maxBatchBytes, 'batch');\n return byteError === null\n ? { ok: true, value: this.detachBatch(batch) }\n : { ok: false, error: byteError };\n }\n\n private validateChecked(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n if (!this.isRecord(batch)) {\n return { ok: false, error: 'Telemetry batch must be a plain object' };\n }\n const schemaVersion = batch.schemaVersion;\n if (!Number.isSafeInteger(schemaVersion)) {\n return { ok: false, error: 'Telemetry batch schema version must be a safe integer' };\n }\n if (schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return { ok: false, error: `Unsupported telemetry schema version ${String(schemaVersion)}` };\n }\n if (!this.hasExactKeys(batch, BATCH_KEYS)) {\n return { ok: false, error: 'Telemetry batch fields do not match the schema' };\n }\n\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const recreated = this.create(\n batch.envelopes as readonly TelemetryEnvelope[],\n batch.dropCounters as readonly TelemetryDropCounter[],\n );\n if (!recreated.ok) {\n return recreated;\n }\n const identityError = this.compareFraming(batch, recreated.value);\n return identityError === null\n ? { ok: true, value: recreated.value }\n : { ok: false, error: identityError };\n }\n\n private validatePayload(envelopes: unknown, dropCounters: unknown): string | null {\n if (!Array.isArray(envelopes) || envelopes.length === 0) {\n return 'A telemetry batch must contain at least one envelope';\n }\n if (envelopes.length > this.limits.maxBatchEvents) {\n return `Telemetry batch exceeds ${this.limits.maxBatchEvents} envelopes`;\n }\n const envelopeError = this.validateEnvelopes(envelopes);\n return envelopeError ?? this.validateDropCounters(dropCounters);\n }\n\n private validateEnvelopes(envelopes: readonly unknown[]): string | null {\n let previousSequence = -1;\n let producerId: string | null = null;\n for (const envelope of envelopes) {\n const envelopeError = this.validateEnvelope(envelope, producerId, previousSequence);\n if (envelopeError !== null) {\n return envelopeError;\n }\n const typedEnvelope = envelope as TelemetryEnvelope;\n producerId = typedEnvelope.producerId;\n previousSequence = typedEnvelope.sequence;\n }\n return null;\n }\n\n private validateEnvelope(\n envelope: unknown,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (!this.isRecord(envelope) || !this.hasExactKeys(envelope, ENVELOPE_KEYS)) {\n return 'Telemetry envelope fields do not match the schema';\n }\n const identityError = this.validateEnvelopeIdentity(envelope, expectedProducerId, previousSequence);\n if (identityError !== null) {\n return identityError;\n }\n const valueError = this.validateEnvelopeValues(envelope);\n if (valueError !== null) {\n return valueError;\n }\n const metadataError = this.validateMetadata(envelope.metadata);\n return metadataError ?? this.serializedByteError(envelope, this.limits.maxEventBytes, 'event');\n }\n\n private validateEnvelopeIdentity(\n envelope: Record<string, unknown>,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (envelope.schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return 'Telemetry envelope schema version does not match its batch';\n }\n if (!this.isIdentity(envelope.producerId)) {\n return 'Telemetry envelope producer identity is invalid';\n }\n if (!this.isSequence(envelope.sequence) || envelope.sequence <= previousSequence) {\n return 'Telemetry envelope sequences must be nonnegative safe integers in increasing order';\n }\n if (expectedProducerId !== null && envelope.producerId !== expectedProducerId) {\n return 'A telemetry batch cannot mix producer identities';\n }\n const eventId = `${envelope.producerId}:${envelope.sequence}`;\n if (envelope.eventId !== eventId || telemetryUtf8Length(eventId) > this.limits.maxIdentityBytes) {\n return 'Telemetry envelope event identity is invalid';\n }\n return null;\n }\n\n private validateEnvelopeValues(envelope: Record<string, unknown>): string | null {\n if (!Number.isSafeInteger(envelope.occurredAtMs) || Number(envelope.occurredAtMs) < 0) {\n return 'Telemetry envelope occurredAtMs must be a nonnegative safe integer';\n }\n if (!this.isMonotonicTimestamp(envelope.monotonicNs)) {\n return 'Telemetry envelope monotonicNs is invalid';\n }\n if (!this.isIdentity(envelope.source) || !this.isIdentity(envelope.processKind)) {\n return 'Telemetry envelope source and process kind are invalid';\n }\n if (!this.isIdentity(envelope.level)) {\n return 'Telemetry envelope level is invalid';\n }\n if (!this.isLabel(envelope.label)) {\n return 'Telemetry envelope label is invalid';\n }\n if (!this.isConversationId(envelope.conversationId)) {\n return 'Telemetry envelope conversation identity is invalid';\n }\n if (!this.isOptionalBoundedString(envelope.correlationId)) {\n return 'Telemetry envelope correlation identity is invalid';\n }\n return null;\n }\n\n private validateMetadata(metadata: unknown): string | null {\n if (!this.isRecord(metadata)) {\n return 'Telemetry envelope metadata must be a plain JSON object';\n }\n const state: JsonValidationState = { properties: 0, bytes: 0, active: new WeakSet<object>() };\n const jsonError = this.validateJsonValue(metadata, 0, state);\n return jsonError ?? this.serializedByteError(metadata, this.limits.maxMetadataBytes, 'metadata');\n }\n\n private validateJsonValue(value: unknown, depth: number, state: JsonValidationState): string | null {\n if (value === null || typeof value === 'boolean') {\n state.bytes += value === null ? 4 : 5;\n return null;\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n return 'Telemetry metadata contains a non-finite number';\n }\n state.bytes += String(value).length;\n return this.metadataBudgetError(state);\n }\n if (typeof value === 'string') {\n if (!this.isWithinUtf8Limit(value, this.limits.maxMetadataStringBytes)) {\n return 'Telemetry metadata string exceeds the receiver limit';\n }\n state.bytes += telemetryUtf8Length(value);\n return this.metadataBudgetError(state);\n }\n if (typeof value !== 'object') {\n return 'Telemetry metadata contains a non-JSON value';\n }\n if (depth > this.limits.maxMetadataDepth) {\n return 'Telemetry metadata exceeds the receiver depth limit';\n }\n return Array.isArray(value)\n ? this.validateJsonArray(value, depth, state)\n : this.validateJsonObject(value, depth, state);\n }\n\n private validateJsonArray(value: readonly unknown[], depth: number, state: JsonValidationState): string | null {\n if (value.length > this.limits.maxMetadataArrayLength) {\n return 'Telemetry metadata array exceeds the receiver length limit';\n }\n const keys = Object.keys(value);\n if (keys.length !== value.length || Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata arrays must be dense JSON arrays';\n }\n return this.validateJsonChildren(value, value, depth, state);\n }\n\n private validateJsonObject(value: object, depth: number, state: JsonValidationState): string | null {\n if (!this.isRecord(value)) {\n return 'Telemetry metadata contains a non-plain object';\n }\n const keys = Object.keys(value);\n if (Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata objects cannot contain symbol keys';\n }\n state.properties += keys.length;\n if (state.properties > this.limits.maxMetadataProperties) {\n return 'Telemetry metadata exceeds the receiver property limit';\n }\n if (keys.some((key) => !this.isWithinUtf8Limit(key, this.limits.maxMetadataStringBytes))) {\n return 'Telemetry metadata property name exceeds the receiver string limit';\n }\n for (const key of keys) {\n state.bytes += telemetryUtf8Length(key);\n }\n const budgetError = this.metadataBudgetError(state);\n if (budgetError !== null) {\n return budgetError;\n }\n return this.validateJsonChildren(value, keys.map((key) => Reflect.get(value, key)), depth, state);\n }\n\n private validateJsonChildren(\n owner: object,\n values: readonly unknown[],\n depth: number,\n state: JsonValidationState,\n ): string | null {\n if (state.active.has(owner)) {\n return 'Telemetry metadata cannot contain a cycle';\n }\n state.active.add(owner);\n try {\n for (const value of values) {\n const error = this.validateJsonValue(value, depth + 1, state);\n if (error !== null) {\n return error;\n }\n }\n return null;\n } finally {\n state.active.delete(owner);\n }\n }\n\n private validateDropCounters(dropCounters: unknown): string | null {\n if (!Array.isArray(dropCounters) || dropCounters.length > this.limits.maxDropCounters) {\n return 'Telemetry drop counters exceed the fixed receiver limit';\n }\n const identities = new Set<string>();\n let total = 0;\n for (const counter of dropCounters) {\n const error = this.validateDropCounter(counter, identities, total);\n if (error !== null) {\n return error;\n }\n total += (counter as TelemetryDropCounter).count;\n }\n return null;\n }\n\n private validateDropCounter(\n counter: unknown,\n identities: Set<string>,\n currentTotal: number,\n ): string | null {\n if (!this.isRecord(counter) || !this.hasExactKeys(counter, DROP_COUNTER_KEYS)) {\n return 'Telemetry drop counter fields do not match the schema';\n }\n if (!DROP_REASONS.has(String(counter.reason)) || !DROP_PRIORITIES.has(String(counter.priority))) {\n return 'Telemetry drop counter identity is invalid';\n }\n if (!Number.isSafeInteger(counter.count) || Number(counter.count) <= 0) {\n return 'Telemetry drop counter count must be a positive safe integer';\n }\n if (currentTotal > Number.MAX_SAFE_INTEGER - Number(counter.count)) {\n return 'Telemetry drop counter total exceeds the safe integer range';\n }\n const identity = `${counter.reason}:${counter.priority}`;\n if (identities.has(identity)) {\n return 'Telemetry drop counter identities must be unique within a batch';\n }\n identities.add(identity);\n return null;\n }\n\n private validateFraming(batch: Record<string, unknown>): string | null {\n if (!this.isIdentity(batch.producerId)) {\n return 'Telemetry batch producer identity is invalid';\n }\n if (!this.isSequence(batch.sequenceStart) || !this.isSequence(batch.sequenceEnd)) {\n return 'Telemetry batch sequence range must use nonnegative safe integers';\n }\n if (Number(batch.sequenceEnd) < Number(batch.sequenceStart)) {\n return 'Telemetry batch sequence range is reversed';\n }\n if (typeof batch.checksum !== 'string' || !/^[a-f0-9]{16}$/.test(batch.checksum)) {\n return 'Telemetry batch checksum is invalid';\n }\n if (typeof batch.idempotencyKey !== 'string'\n || !this.isWithinUtf8Limit(batch.idempotencyKey, this.limits.maxIdentityBytes)) {\n return 'Telemetry batch idempotency identity is invalid';\n }\n return null;\n }\n\n private compareFraming(batch: Record<string, unknown>, recreated: TelemetryBatch): string | null {\n const matches = recreated.checksum === batch.checksum\n && recreated.idempotencyKey === batch.idempotencyKey\n && recreated.sequenceStart === batch.sequenceStart\n && recreated.sequenceEnd === batch.sequenceEnd\n && recreated.producerId === batch.producerId;\n return matches ? null : 'Telemetry batch framing or checksum is invalid';\n }\n\n private checksumPayload(\n producerId: string,\n sequenceStart: number,\n sequenceEnd: number,\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): object {\n return {\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n };\n }\n\n private serializedByteError(value: unknown, maximum: number, kind: string): string | null {\n const bytes = telemetryUtf8Length(canonicalJson(value));\n return bytes <= maximum ? null : `Telemetry ${kind} exceeds ${maximum} bytes`;\n }\n\n private payloadBytesError(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): string | null {\n let bytes = 0;\n for (const envelope of envelopes) {\n bytes += telemetryUtf8Length(canonicalJson(envelope));\n if (bytes > this.limits.maxBatchBytes) {\n return `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`;\n }\n }\n bytes += telemetryUtf8Length(canonicalJson(dropCounters));\n return bytes > this.limits.maxBatchBytes\n ? `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`\n : null;\n }\n\n private metadataBudgetError(state: JsonValidationState): string | null {\n return state.bytes > this.limits.maxMetadataBytes\n ? `Telemetry metadata exceeds ${this.limits.maxMetadataBytes} bytes`\n : null;\n }\n\n private detachBatch(batch: TelemetryBatch): TelemetryBatch {\n const detached = JSON.parse(canonicalJson(batch)) as TelemetryBatch;\n return this.deepFreeze(detached);\n }\n\n private deepFreeze<T>(value: T): T {\n if (typeof value !== 'object' || value === null || Object.isFrozen(value)) {\n return value;\n }\n for (const child of Object.values(value)) {\n this.deepFreeze(child);\n }\n return Object.freeze(value);\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value) as { constructor?: { name?: unknown } } | null;\n return prototype === null || prototype.constructor?.name === 'Object';\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isSequence(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) >= 0;\n }\n\n private isIdentity(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && value.trim().length > 0\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value);\n }\n\n private isLabel(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= Math.min(256, this.limits.maxIdentityBytes)\n && /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(value)\n && this.isWithinUtf8Limit(value, Math.min(256, this.limits.maxIdentityBytes));\n }\n\n private isMonotonicTimestamp(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && /^\\d+$/.test(value)\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes));\n }\n\n private isConversationId(value: unknown): boolean {\n return value === null\n || (typeof value === 'number' && Number.isSafeInteger(value))\n || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isOptionalBoundedString(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isWithinUtf8Limit(value: string, maximum: number): boolean {\n return value.length <= maximum && telemetryUtf8Length(value) <= maximum;\n }\n\n private validateLimits(): void {\n const values = Object.values(this.limits);\n if (values.some((value) => !Number.isSafeInteger(value) || value <= 0)) {\n throw new Error('Telemetry batch validation limits must be positive safe integers');\n }\n if (this.limits.maxMetadataBytes > this.limits.maxEventBytes\n || this.limits.maxEventBytes > this.limits.maxBatchBytes) {\n throw new Error('Telemetry receiver byte limits must satisfy metadata <= event <= batch');\n }\n }\n}\n","export type TelemetryDeadlineOutcome<T> =\n | Readonly<{ kind: 'completed'; value: T }>\n | Readonly<{ kind: 'failed'; error: unknown }>\n | Readonly<{ kind: 'deadline-exhausted' }>;\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\n\nexport class TelemetryDeadlineGuard {\n async settle<T>(\n operation: Promise<T>,\n deadlineMs: number,\n now: () => number,\n ): Promise<TelemetryDeadlineOutcome<T>> {\n const observed: Promise<TelemetryDeadlineOutcome<T>> = operation.then(\n (value) => ({ kind: 'completed', value }),\n (error: unknown) => ({ kind: 'failed', error }),\n );\n const remainingMs = deadlineMs - now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n return { kind: 'deadline-exhausted' };\n }\n let timer: ReturnType<typeof setTimeout> | null = null;\n const outcome = await Promise.race([\n observed,\n new Promise<TelemetryDeadlineOutcome<T>>((resolve) => {\n timer = setTimeout(\n () => resolve({ kind: 'deadline-exhausted' }),\n Math.min(remainingMs, MAX_TIMER_DELAY_MS),\n );\n }),\n ]);\n if (timer !== null) {\n clearTimeout(timer);\n }\n return outcome;\n }\n}\n","import { TelemetryDeadlineGuard } from './helper/telemetry_deadline_guard.js';\nimport { TelemetryAcknowledgementContract } from './telemetry_acknowledgement_contract.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchRoute,\n TelemetryBatchRouterOptions,\n TelemetryBatchTransport,\n TelemetryBatchTransportCapabilities,\n TelemetryTargetDeliveryState,\n} from './types/transport.types.js';\n\ntype BatchRouteResult = Readonly<{\n route: TelemetryBatchRoute;\n acknowledgement: TelemetryAcknowledgement;\n attempts: number;\n}>;\n\nexport class TelemetryBatchRouter implements TelemetryBatchTransport {\n readonly transportId: string;\n readonly capabilities: TelemetryBatchTransportCapabilities;\n private readonly acknowledgementContract = new TelemetryAcknowledgementContract();\n private readonly deadlineGuard = new TelemetryDeadlineGuard();\n private readonly committed = new Map<string, Set<string>>();\n\n constructor(private readonly options: TelemetryBatchRouterOptions) {\n this.transportId = options.routerId;\n this.validateRoutes();\n this.capabilities = Object.freeze({\n maxBatchBytes: Math.min(...options.routes.map((route) => route.transport.capabilities.maxBatchBytes)),\n acknowledgement: options.volatile ? 'receipt' : 'durable',\n ordering: options.routes.every((route) => route.transport.capabilities.ordering === 'producer')\n ? 'producer'\n : 'none',\n boundedCapacity: Math.min(...options.routes.map((route) => route.transport.capabilities.boundedCapacity)),\n });\n }\n\n async send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n const matchingRoutes = this.options.routes.filter((route) => route.matches(batch));\n const hasRequiredRoute = matchingRoutes.some((route) => route.delivery === 'required');\n if (!hasRequiredRoute && !this.options.volatile) {\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'no-required-terminal',\n reason: 'No required durable route matched this batch',\n targetStates: this.unmatchedStates(batch, matchingRoutes),\n };\n }\n\n const committedRoutes = this.committed.get(batch.idempotencyKey) ?? new Set<string>();\n const routeResults = await this.sendMatchingRoutes(batch, matchingRoutes, committedRoutes);\n this.remember(batch.idempotencyKey, committedRoutes);\n return this.aggregateAcknowledgement(batch, matchingRoutes, routeResults);\n }\n\n async flush(deadlineMs: number): Promise<void> {\n await this.runLifecycleUntilDeadline(\n deadlineMs,\n (transport) => transport.flush(deadlineMs),\n );\n }\n\n async close(deadlineMs: number): Promise<void> {\n await this.runLifecycleUntilDeadline(\n deadlineMs,\n (transport) => transport.close(deadlineMs),\n );\n }\n\n private async runLifecycleUntilDeadline(\n deadlineMs: number,\n run: (transport: TelemetryBatchTransport) => Promise<void>,\n ): Promise<void> {\n const operations = this.options.routes.map((route) => {\n return Promise.resolve().then(() => run(route.transport));\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.all(operations),\n deadlineMs,\n this.options.now,\n );\n if (outcome.kind === 'failed') {\n throw outcome.error;\n }\n }\n\n private async sendMatchingRoutes(\n batch: TelemetryBatch,\n routes: readonly TelemetryBatchRoute[],\n committedRoutes: Set<string>,\n ): Promise<readonly BatchRouteResult[]> {\n return Promise.all(routes.map(async (route): Promise<BatchRouteResult> => {\n if (committedRoutes.has(route.routeId)) {\n return { route, acknowledgement: this.alreadyCommitted(batch), attempts: 0 };\n }\n const acknowledgement = await this.sendSafely(route.transport, batch);\n if (acknowledgement.kind === 'committed') {\n committedRoutes.add(route.routeId);\n }\n return { route, acknowledgement, attempts: 1 };\n }));\n }\n\n private aggregateAcknowledgement(\n batch: TelemetryBatch,\n matchingRoutes: readonly TelemetryBatchRoute[],\n routeResults: readonly BatchRouteResult[],\n ): TelemetryAcknowledgement {\n const targetStates = this.deliveryStates(batch, routeResults, matchingRoutes);\n const requiredResults = routeResults.filter(({ route }) => route.delivery === 'required');\n const conflict = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'conflict');\n const conflictAcknowledgement = conflict?.acknowledgement;\n if (conflictAcknowledgement?.kind === 'conflict') {\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: conflictAcknowledgement.reason,\n targetStates,\n };\n }\n const rejected = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'rejected');\n const rejectedAcknowledgement = rejected?.acknowledgement;\n if (rejectedAcknowledgement?.kind === 'rejected') {\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: rejectedAcknowledgement.code,\n reason: rejectedAcknowledgement.reason,\n targetStates,\n };\n }\n const retryable = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'retryable');\n const retryableAcknowledgement = retryable?.acknowledgement;\n if (retryableAcknowledgement?.kind === 'retryable') {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: retryableAcknowledgement.reason,\n retryAfterMs: retryableAcknowledgement.retryAfterMs,\n targetStates,\n };\n }\n\n return {\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: batch.envelopes.length,\n duplicate: routeResults.length > 0 && routeResults.every(({ attempts }) => attempts === 0),\n targetStates,\n };\n }\n\n private deliveryStates(\n batch: TelemetryBatch,\n routeResults: readonly BatchRouteResult[],\n matchingRoutes: readonly TelemetryBatchRoute[],\n ): readonly TelemetryTargetDeliveryState[] {\n return [\n ...routeResults.map(({ route, acknowledgement, attempts }) => this.deliveryState(\n route.routeId,\n route.delivery,\n acknowledgement,\n attempts,\n )),\n ...this.unmatchedStates(batch, matchingRoutes),\n ];\n }\n\n private async sendSafely(\n transport: TelemetryBatchTransport,\n batch: TelemetryBatch,\n ): Promise<TelemetryAcknowledgement> {\n try {\n const received: unknown = await transport.send(batch);\n const validated = this.acknowledgementContract.validateAndDetach(batch, received);\n return validated.ok\n ? validated.value\n : this.invalidAcknowledgement(batch, validated.error);\n } catch (cause) {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.acknowledgementContract.exceptionReason(cause),\n retryAfterMs: 25,\n targetStates: [],\n };\n }\n }\n\n private invalidAcknowledgement(batch: TelemetryBatch, error: string): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: 25,\n targetStates: [],\n };\n }\n\n private alreadyCommitted(batch: TelemetryBatch): TelemetryAcknowledgement {\n return {\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: batch.envelopes.length,\n duplicate: true,\n targetStates: [],\n };\n }\n\n private deliveryState(\n routeId: string,\n delivery: 'required' | 'best-effort',\n acknowledgement: TelemetryAcknowledgement,\n attempts: number,\n ): TelemetryTargetDeliveryState {\n if (acknowledgement.kind === 'committed') {\n return { targetId: routeId, delivery, state: 'committed', attempts, reason: null };\n }\n return {\n targetId: routeId,\n delivery,\n state: 'failed',\n attempts,\n reason: acknowledgement.reason,\n };\n }\n\n private unmatchedStates(\n _batch: TelemetryBatch,\n matchingRoutes: readonly TelemetryBatchRouterOptions['routes'][number][],\n ): TelemetryTargetDeliveryState[] {\n const matchingIds = new Set(matchingRoutes.map((route) => route.routeId));\n return this.options.routes\n .filter((route) => !matchingIds.has(route.routeId))\n .map((route) => ({\n targetId: route.routeId,\n delivery: route.delivery,\n state: 'abandoned' as const,\n attempts: 0,\n reason: 'route-not-matched',\n }));\n }\n\n private validateRoutes(): void {\n if (!this.options.routerId.trim() || this.options.routes.length === 0) {\n throw new Error('A telemetry batch router requires an id and at least one route');\n }\n if (this.options.maxRememberedBatches !== undefined\n && (!Number.isSafeInteger(this.options.maxRememberedBatches)\n || this.options.maxRememberedBatches <= 0)) {\n throw new Error('Telemetry batch router memory must be a positive safe integer');\n }\n const routeIds = this.options.routes.map((route) => route.routeId);\n if (new Set(routeIds).size !== routeIds.length) {\n throw new Error('Telemetry batch route ids must be unique');\n }\n const requiredRoutes = this.options.routes.filter((route) => route.delivery === 'required');\n const hasNonDurableRequiredRoute = requiredRoutes.some(\n (route) => route.transport.capabilities.acknowledgement !== 'durable',\n );\n if (!this.options.volatile && (requiredRoutes.length === 0 || hasNonDurableRequiredRoute)) {\n throw new Error('A non-volatile router requires at least one durable required route');\n }\n }\n\n private remember(idempotencyKey: string, routes: Set<string>): void {\n this.committed.set(idempotencyKey, routes);\n const maximum = this.options.maxRememberedBatches ?? 1_024;\n while (this.committed.size > maximum) {\n const oldest = this.committed.keys().next().value;\n if (typeof oldest !== 'string') {\n return;\n }\n this.committed.delete(oldest);\n }\n }\n}\n","import { BoundedMetadataSnapshotter } from './bounded_metadata_snapshotter.js';\nimport { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport { TelemetryBatchContract } from './telemetry_batch_contract.js';\nimport type { QueuedTelemetryEnvelope } from './types/client_internal.types.js';\nimport type {\n TelemetryAdmissionPriority,\n TelemetryAdmissionResult,\n TelemetryClientOptions,\n TelemetryClientStatus,\n TelemetryMinimumLevel,\n} from './types/client.types.js';\nimport type { TelemetryAdmitInput, TelemetryEnvelope, TelemetryLevel } from './types/envelope.types.js';\nimport type { TelemetryJsonObject } from './types/json.types.js';\nimport type { TelemetryAcknowledgement, TelemetryBatch, TelemetryDropCounter } from './types/transport.types.js';\n\nconst TELEMETRY_LEVEL_RANKS: Readonly<Record<TelemetryMinimumLevel, number>> = Object.freeze({\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n});\n\nexport class TelemetryClient {\n private readonly snapshotter: BoundedMetadataSnapshotter;\n private readonly batchContract = new TelemetryBatchContract();\n private readonly queue: QueuedTelemetryEnvelope[] = [];\n private readonly dropCounts = new Map<string, number>();\n private state: 'accepting' | 'draining' | 'stopped' = 'accepting';\n private nextSequence = 0;\n private queuedBytes = 0;\n private inFlightBatches = 0;\n private drainScheduled = false;\n private activeDrain: Promise<void> | null = null;\n private lastAcknowledgement: TelemetryAcknowledgement | null = null;\n\n constructor(private readonly options: TelemetryClientOptions) {\n this.validateOptions();\n this.snapshotter = new BoundedMetadataSnapshotter(options.metadata);\n }\n\n trace(level: TelemetryLevel, label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit(level, label, metadata);\n }\n\n debug(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('debug', label, metadata);\n }\n\n info(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('info', label, metadata);\n }\n\n warn(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('warn', label, metadata);\n }\n\n error(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('error', label, metadata);\n }\n\n fatal(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('fatal', label, metadata);\n }\n\n emit(level: TelemetryLevel, label: string, metadata: unknown): TelemetryAdmissionResult {\n return this.admit({\n source: this.options.source,\n processKind: this.options.processKind,\n level,\n label,\n occurredAtMs: this.options.now(),\n monotonicNs: this.options.monotonicNowNs(),\n conversationId: null,\n correlationId: null,\n metadata,\n });\n }\n\n admit(input: TelemetryAdmitInput): TelemetryAdmissionResult {\n const sequence = this.nextSequence;\n this.nextSequence += 1;\n\n if (this.state !== 'accepting') {\n this.incrementDrop('stopped', this.priorityFor(input.level));\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'client-stopped' };\n }\n\n const hasInvalidIdentity = !this.isValidLabel(input.label)\n || !input.source.trim()\n || !input.processKind.trim()\n || !Number.isFinite(input.occurredAtMs);\n if (hasInvalidIdentity) {\n this.incrementDrop('invalid', this.priorityFor(input.level));\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'invalid-label' };\n }\n\n const priority = this.priorityFor(input.level);\n if (!this.meetsMinimumLevel(input.level)) {\n this.incrementDrop('sampled', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'below-minimum-level' };\n }\n if (!this.isSampled(priority)) {\n this.incrementDrop('sampled', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'sampled' };\n }\n\n const snapshot = this.snapshotter.snapshot(input.metadata);\n const extractedCorrelation = this.resolveCorrelation(snapshot.metadata);\n const correlation = {\n conversationId: input.conversationId ?? extractedCorrelation.conversationId,\n correlationId: input.correlationId ?? extractedCorrelation.correlationId,\n };\n const envelope = this.createEnvelope(sequence, input, snapshot.metadata, correlation);\n const bytes = telemetryUtf8Length(canonicalJson(envelope));\n const single = this.batchContract.create([envelope], []);\n if (!single.ok) {\n this.incrementDrop('invalid', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'invalid-envelope' };\n }\n const framedBytes = telemetryUtf8Length(canonicalJson(single.value));\n const queueWouldOverflow = this.queue.length >= this.options.admission.maxQueuedEvents\n || this.queuedBytes + bytes > this.options.admission.maxQueuedBytes\n || framedBytes > this.options.admission.maxBatchBytes;\n if (queueWouldOverflow) {\n this.incrementDrop('capacity', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'capacity' };\n }\n\n this.queue.push(Object.freeze({ envelope, bytes }));\n this.queuedBytes += bytes;\n this.scheduleDrain();\n return {\n kind: 'admitted',\n producerId: this.options.producerId,\n sequence,\n eventId: envelope.eventId,\n };\n }\n\n status(): TelemetryClientStatus {\n return Object.freeze({\n state: this.state,\n producerId: this.options.producerId,\n nextSequence: this.nextSequence,\n queuedEvents: this.queue.length,\n queuedBytes: this.queuedBytes,\n inFlightBatches: this.inFlightBatches,\n dropCounters: this.dropCounterSnapshot(),\n lastAcknowledgement: this.lastAcknowledgement,\n });\n }\n\n async flush(deadlineMs: number): Promise<void> {\n this.scheduleDrain();\n while ((this.queue.length > 0 || this.activeDrain !== null) && this.options.now() < deadlineMs) {\n const currentDrain = this.activeDrain;\n if (currentDrain) {\n await Promise.race([currentDrain, this.options.delay(1)]);\n } else {\n await this.options.delay(1);\n }\n }\n await this.settleExternalShutdown(\n () => this.options.transport.flush(deadlineMs),\n deadlineMs,\n );\n }\n\n async stop(deadlineMs: number): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n this.state = 'draining';\n await this.flush(deadlineMs);\n const abandoned = this.queue.splice(0, this.queue.length);\n if (abandoned.length > 0) {\n this.incrementDropBy('transport', 'normal', abandoned.length);\n this.queuedBytes = 0;\n }\n await this.settleExternalShutdown(\n () => this.options.transport.close(deadlineMs),\n deadlineMs,\n );\n this.state = 'stopped';\n }\n\n private createEnvelope(\n sequence: number,\n input: TelemetryAdmitInput,\n metadata: TelemetryJsonObject,\n correlation: Readonly<{\n conversationId: string | number | null;\n correlationId: string | null;\n }>,\n ): TelemetryEnvelope {\n return Object.freeze({\n schemaVersion: TelemetryBatchContract.schemaVersion,\n eventId: `${this.options.producerId}:${sequence}`,\n producerId: this.options.producerId,\n sequence,\n occurredAtMs: input.occurredAtMs,\n monotonicNs: input.monotonicNs,\n source: input.source,\n processKind: input.processKind,\n level: input.level.trim().toLowerCase() || 'info',\n label: input.label,\n conversationId: correlation.conversationId,\n correlationId: correlation.correlationId,\n metadata,\n });\n }\n\n private resolveCorrelation(metadata: TelemetryJsonObject): Readonly<{\n conversationId: string | number | null;\n correlationId: string | null;\n }> {\n const conversationValue = metadata.conversationId ?? metadata.threadId ?? null;\n const conversationId = typeof conversationValue === 'string' || typeof conversationValue === 'number'\n ? conversationValue\n : null;\n const correlationValue = metadata.correlationId;\n const correlationId = typeof correlationValue === 'string' ? correlationValue : null;\n return { conversationId, correlationId };\n }\n\n private scheduleDrain(): void {\n if (this.drainScheduled || this.activeDrain !== null || this.queue.length === 0) {\n return;\n }\n this.drainScheduled = true;\n try {\n this.options.schedule(() => {\n this.drainScheduled = false;\n const drain = this.drainLoop();\n this.activeDrain = drain;\n const settle = () => {\n this.activeDrain = null;\n if (this.queue.length > 0) {\n this.scheduleDrain();\n }\n };\n void drain.then(settle, settle);\n });\n } catch {\n this.drainScheduled = false;\n }\n }\n\n private async drainLoop(): Promise<void> {\n while (this.queue.length > 0) {\n const dropSnapshot = this.dropCounterSnapshot();\n const prepared = this.prepareBatch(dropSnapshot);\n if (prepared === null) {\n continue;\n }\n\n this.inFlightBatches += 1;\n try {\n const acknowledgement = await this.deliverWithRetry(prepared.batch);\n this.lastAcknowledgement = acknowledgement;\n if (acknowledgement.kind === 'committed') {\n this.subtractDropSnapshot(prepared.dropCounters);\n } else {\n this.incrementDropBy('transport', 'normal', prepared.eventCount);\n }\n } finally {\n this.inFlightBatches -= 1;\n }\n }\n }\n\n private prepareBatch(dropCounters: readonly TelemetryDropCounter[]): Readonly<{\n batch: TelemetryBatch;\n dropCounters: readonly TelemetryDropCounter[];\n eventCount: number;\n }> | null {\n const entries = this.peekBatchEntries();\n const withCounters = this.findFittingBatch(entries, dropCounters);\n const prepared = withCounters ?? this.findFittingBatch(entries, []);\n if (prepared === null) {\n const invalid = this.queue.shift();\n if (invalid !== undefined) {\n this.queuedBytes -= invalid.bytes;\n this.incrementDrop('invalid', this.priorityFor(invalid.envelope.level));\n }\n return null;\n }\n for (let index = 0; index < prepared.eventCount; index += 1) {\n const removed = this.queue.shift();\n if (removed !== undefined) {\n this.queuedBytes -= removed.bytes;\n }\n }\n return prepared;\n }\n\n private peekBatchEntries(): QueuedTelemetryEnvelope[] {\n const entries: QueuedTelemetryEnvelope[] = [];\n let batchBytes = 0;\n while (entries.length < this.options.admission.maxBatchEvents) {\n const next = this.queue[entries.length];\n if (!next) {\n break;\n }\n const exceedsBatchBytes = entries.length > 0\n && batchBytes + next.bytes > this.options.admission.maxBatchBytes;\n if (exceedsBatchBytes) {\n break;\n }\n batchBytes += next.bytes;\n entries.push(next);\n }\n return entries;\n }\n\n private findFittingBatch(\n entries: readonly QueuedTelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): Readonly<{\n batch: TelemetryBatch;\n dropCounters: readonly TelemetryDropCounter[];\n eventCount: number;\n }> | null {\n for (let eventCount = entries.length; eventCount > 0; eventCount -= 1) {\n const created = this.batchContract.create(\n entries.slice(0, eventCount).map((entry) => entry.envelope),\n dropCounters,\n );\n if (created.ok\n && telemetryUtf8Length(canonicalJson(created.value)) <= this.options.admission.maxBatchBytes) {\n return Object.freeze({ batch: created.value, dropCounters, eventCount });\n }\n }\n return null;\n }\n\n private async deliverWithRetry(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n let attempt = 0;\n while (attempt <= this.options.admission.retryLimit) {\n let acknowledgement: TelemetryAcknowledgement;\n try {\n const received: unknown = await this.options.transport.send(batch);\n acknowledgement = this.normalizeAcknowledgement(batch, received, attempt);\n } catch (cause) {\n acknowledgement = {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.errorMessage(cause),\n retryAfterMs: this.retryDelay(attempt),\n targetStates: [],\n };\n }\n\n if (acknowledgement.kind !== 'retryable' || attempt === this.options.admission.retryLimit) {\n return acknowledgement;\n }\n const requestedDelay = Math.max(acknowledgement.retryAfterMs, this.retryDelay(attempt));\n await this.options.delay(requestedDelay);\n attempt += 1;\n }\n\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: 'retry-limit-exhausted',\n retryAfterMs: 0,\n targetStates: [],\n };\n }\n\n private retryDelay(attempt: number): number {\n return Math.min(\n Number.MAX_SAFE_INTEGER,\n this.options.admission.retryBaseDelayMs * (2 ** attempt),\n );\n }\n\n private normalizeAcknowledgement(\n batch: TelemetryBatch,\n value: unknown,\n attempt: number,\n ): TelemetryAcknowledgement {\n try {\n const error = this.acknowledgementError(batch, value);\n return error === null\n ? this.detachAcknowledgement(value as TelemetryAcknowledgement)\n : this.invalidAcknowledgement(batch, error, attempt);\n } catch {\n return this.invalidAcknowledgement(batch, 'acknowledgement could not be inspected', attempt);\n }\n }\n\n private acknowledgementError(batch: TelemetryBatch, value: unknown): string | null {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return 'acknowledgement identity is missing or mismatched';\n }\n const targetsError = this.targetStatesError(value.targetStates);\n if (targetsError !== null) {\n return targetsError;\n }\n switch (value.kind) {\n case 'committed':\n return this.committedAcknowledgementError(batch, value);\n case 'retryable':\n return this.retryableAcknowledgementError(value);\n case 'rejected':\n return this.rejectedAcknowledgementError(value);\n case 'conflict':\n return this.conflictAcknowledgementError(value);\n default:\n return 'acknowledgement kind is invalid';\n }\n }\n\n private committedAcknowledgementError(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])\n && Number.isSafeInteger(value.committedAtMs)\n && Number(value.committedAtMs) >= 0\n && value.acceptedEvents === batch.envelopes.length\n && typeof value.duplicate === 'boolean';\n return valid ? null : 'committed acknowledgement fields are invalid';\n }\n\n private retryableAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])\n && this.isBoundedReason(value.reason)\n && Number.isFinite(value.retryAfterMs)\n && Number(value.retryAfterMs) >= 0\n && Number(value.retryAfterMs) <= Number.MAX_SAFE_INTEGER;\n return valid ? null : 'retryable acknowledgement fields are invalid';\n }\n\n private rejectedAcknowledgementError(value: Record<string, unknown>): string | null {\n const codes = ['invalid-batch', 'unsupported-version', 'no-required-terminal', 'closed'];\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])\n && codes.includes(String(value.code))\n && this.isBoundedReason(value.reason);\n return valid ? null : 'rejected acknowledgement fields are invalid';\n }\n\n private conflictAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])\n && this.isBoundedReason(value.reason);\n return valid ? null : 'conflict acknowledgement fields are invalid';\n }\n\n private targetStatesError(value: unknown): string | null {\n if (!Array.isArray(value) || value.length > 1_024) {\n return 'acknowledgement target states are invalid';\n }\n const targetIds = new Set<string>();\n for (const target of value) {\n if (!this.isValidTargetState(target) || targetIds.has(target.targetId as string)) {\n return 'acknowledgement target states are invalid';\n }\n targetIds.add(target.targetId as string);\n }\n return null;\n }\n\n private isValidTargetState(value: unknown): value is Record<string, unknown> {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return false;\n }\n const deliveries = ['required', 'best-effort'];\n const states = ['pending', 'committed', 'failed', 'abandoned'];\n return typeof value.targetId === 'string'\n && value.targetId.length > 0\n && telemetryUtf8Length(value.targetId) <= 256\n && deliveries.includes(String(value.delivery))\n && states.includes(String(value.state))\n && Number.isSafeInteger(value.attempts)\n && Number(value.attempts) >= 0\n && (value.reason === null || this.isBoundedReason(value.reason));\n }\n\n private invalidAcknowledgement(\n batch: TelemetryBatch,\n error: string,\n attempt: number,\n ): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: this.retryDelay(attempt),\n targetStates: [],\n };\n }\n\n private detachAcknowledgement(value: TelemetryAcknowledgement): TelemetryAcknowledgement {\n const detached = JSON.parse(canonicalJson(value)) as TelemetryAcknowledgement;\n const targetStates = Object.freeze(detached.targetStates.map((target) => Object.freeze({ ...target })));\n return Object.freeze({ ...detached, targetStates });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isBoundedReason(value: unknown): value is string {\n return typeof value === 'string' && telemetryUtf8Length(value) <= 512;\n }\n\n private dropCounterSnapshot(): readonly TelemetryDropCounter[] {\n const counters = [...this.dropCounts.entries()]\n .filter(([, count]) => count > 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, count]) => {\n const [reason, priority] = key.split(':');\n return Object.freeze({\n reason: reason as TelemetryDropCounter['reason'],\n priority: priority as TelemetryDropCounter['priority'],\n count,\n });\n });\n return Object.freeze(counters);\n }\n\n private subtractDropSnapshot(snapshot: readonly TelemetryDropCounter[]): void {\n for (const counter of snapshot) {\n const key = `${counter.reason}:${counter.priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.max(0, current - counter.count));\n }\n }\n\n private incrementDrop(reason: TelemetryDropCounter['reason'], priority: TelemetryAdmissionPriority): void {\n this.incrementDropBy(reason, priority, 1);\n }\n\n private incrementDropBy(\n reason: TelemetryDropCounter['reason'],\n priority: TelemetryAdmissionPriority,\n count: number,\n ): void {\n const key = `${reason}:${priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.min(Number.MAX_SAFE_INTEGER, current + count));\n }\n\n private priorityFor(level: string): TelemetryAdmissionPriority {\n const normalized = level.trim().toLowerCase();\n if (normalized === 'error' || normalized === 'fatal') {\n return 'high';\n }\n if (normalized === 'trace' || normalized === 'debug') {\n return 'low';\n }\n return 'normal';\n }\n\n private isSampled(priority: TelemetryAdmissionPriority): boolean {\n const sampleRate = this.options.admission.sampleRates[priority];\n return sampleRate >= 1 || this.options.random() < sampleRate;\n }\n\n private meetsMinimumLevel(level: string): boolean {\n const minimum = this.options.admission.minimumLevel;\n if (minimum === undefined) {\n return true;\n }\n const normalized = level.trim().toLowerCase() as TelemetryMinimumLevel;\n const rank = TELEMETRY_LEVEL_RANKS[normalized] ?? TELEMETRY_LEVEL_RANKS.info;\n return rank >= TELEMETRY_LEVEL_RANKS[minimum];\n }\n\n private isValidLabel(label: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(label) && label.length <= 256;\n }\n\n private errorMessage(cause: unknown): string {\n if (cause instanceof Error) {\n return cause.message.slice(0, 512);\n }\n return String(cause).slice(0, 512);\n }\n\n private async settleExternalShutdown(\n work: () => Promise<void>,\n deadlineMs: number,\n ): Promise<void> {\n const operation = Promise.resolve().then(work);\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n void operation.catch(() => undefined);\n return;\n }\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (failed: boolean, error?: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n if (failed) {\n reject(error);\n } else {\n resolve();\n }\n };\n const timer = setTimeout(\n () => finish(false),\n Math.min(remainingMs, 2_147_483_647),\n );\n void operation.then(\n () => finish(false),\n (error: unknown) => finish(true, error),\n );\n });\n }\n\n private validateOptions(): void {\n this.validateIdentityOptions();\n this.validateOrderedDeliveryOptions();\n this.validateCapacityOptions();\n this.validateBatchEventOptions();\n this.validateBatchByteOptions();\n this.validateMetadataOptions();\n this.validateRetryOptions();\n this.validateSampleRateOptions();\n }\n\n private validateIdentityOptions(): void {\n if (!this.options.source.trim() || !this.options.processKind.trim() || !this.options.producerId.trim()) {\n throw new Error('Telemetry client source, process kind, and producer id are required');\n }\n }\n\n private validateOrderedDeliveryOptions(): void {\n if (this.options.admission.maxInFlightBatches !== 1) {\n throw new Error('Ordered telemetry clients currently require maxInFlightBatches to equal 1');\n }\n }\n\n private validateCapacityOptions(): void {\n const capacities = [\n this.options.admission.maxQueuedEvents,\n this.options.admission.maxQueuedBytes,\n this.options.admission.maxBatchEvents,\n this.options.admission.maxBatchBytes,\n this.options.admission.maxInFlightBatches,\n this.options.transport.capabilities.maxBatchBytes,\n this.options.transport.capabilities.boundedCapacity,\n ];\n if (capacities.some((capacity) => !Number.isSafeInteger(capacity) || capacity <= 0)) {\n throw new Error('Telemetry client and transport capacities must be positive safe integers');\n }\n }\n\n private validateBatchEventOptions(): void {\n if (this.options.admission.maxBatchEvents > this.options.admission.maxQueuedEvents\n || this.options.admission.maxBatchEvents > this.batchContract.limits.maxBatchEvents) {\n throw new Error('Telemetry maxBatchEvents must not exceed queue or receiver capacity');\n }\n }\n\n private validateBatchByteOptions(): void {\n if (this.options.admission.maxBatchBytes > this.options.admission.maxQueuedBytes\n || this.options.admission.maxBatchBytes > this.options.transport.capabilities.maxBatchBytes\n || this.options.admission.maxBatchBytes > this.batchContract.limits.maxBatchBytes) {\n throw new Error('Telemetry maxBatchBytes must not exceed queue, transport, or receiver capacity');\n }\n }\n\n private validateMetadataOptions(): void {\n if (this.options.metadata.maxBytes > this.options.admission.maxBatchBytes) {\n throw new Error('Telemetry metadata bytes must not exceed maxBatchBytes');\n }\n }\n\n private validateRetryOptions(): void {\n if (!Number.isSafeInteger(this.options.admission.retryLimit)\n || this.options.admission.retryLimit < 0\n || !Number.isFinite(this.options.admission.retryBaseDelayMs)\n || this.options.admission.retryBaseDelayMs < 0) {\n throw new Error('Telemetry retry limit and delay must be nonnegative finite values');\n }\n }\n\n private validateSampleRateOptions(): void {\n const rates = Object.values(this.options.admission.sampleRates);\n if (rates.some((rate) => !Number.isFinite(rate) || rate < 0 || rate > 1)) {\n throw new Error('Telemetry sample rates must be between zero and one');\n }\n }\n}\n","import { TelemetryDeadlineGuard } from './helper/telemetry_deadline_guard.js';\nimport { TelemetryAcknowledgementContract } from './telemetry_acknowledgement_contract.js';\nimport type { MetricDefinition } from './types/metric.types.js';\nimport type { MetricQuery, MetricQueryResponse, TelemetryQueryError, TimelineQuery, TimelineQueryResponse } from './types/query.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageRouterOptions,\n TelemetryStorageTransport,\n TelemetryStorageTarget,\n} from './types/storage.types.js';\nimport type { TelemetryAcknowledgement, TelemetryTargetDeliveryState } from './types/transport.types.js';\n\ntype StorageTargetResult = Readonly<{\n target: TelemetryStorageTarget;\n acknowledgement: TelemetryAcknowledgement;\n attempts: number;\n}>;\n\ntype RollbackTargetResult = Readonly<{\n targetId: string;\n error: string | null;\n}>;\n\nconst START_ROLLBACK_TIMEOUT_MS = 5_000;\n\nexport class TelemetryStorageRouter implements TelemetryStorageTransport {\n readonly targetId: string;\n readonly capabilities: TelemetryStorageCapabilities;\n private readonly acknowledgementContract = new TelemetryAcknowledgementContract();\n private readonly deadlineGuard = new TelemetryDeadlineGuard();\n private readonly committed = new Map<string, Set<string>>();\n private readonly definitionTargets = new Map<string, readonly string[]>();\n private state: StorageTargetStatus['state'] = 'created';\n private detail: string | null = null;\n\n constructor(private readonly options: TelemetryStorageRouterOptions) {\n this.targetId = options.routerId;\n this.validateOptions();\n this.capabilities = Object.freeze({\n rawPersistence: options.targets.every((target) => target.transport.capabilities.rawPersistence),\n metricSamples: options.targets.every((target) => target.transport.capabilities.metricSamples),\n rollups: options.targets.some((target) => target.transport.capabilities.rollups),\n queries: options.targets.some((target) => target.transport.capabilities.queries),\n retention: options.targets.some((target) => target.transport.capabilities.retention),\n maintenance: options.targets.some((target) => target.transport.capabilities.maintenance),\n });\n }\n\n async start(definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n return { ok: false, error: `Cannot start telemetry storage router from state ${this.state}` };\n }\n this.state = 'starting';\n this.detail = null;\n this.definitionTargets.clear();\n for (const definition of definitions) {\n this.definitionTargets.set(\n `${definition.name}:${definition.version}`,\n Object.freeze([...definition.targetIds]),\n );\n }\n const attemptedTargets: TelemetryStorageTarget[] = [];\n const bestEffortFailures: string[] = [];\n for (const target of this.options.targets) {\n attemptedTargets.push(target);\n const targetDefinitions = definitions.filter((definition) => {\n return definition.targetIds.length === 0 || definition.targetIds.includes(target.targetId);\n });\n const started = await this.startTarget(target, targetDefinitions);\n if (started.ok) {\n continue;\n }\n const failure = `${target.targetId}: ${started.error}`;\n if (target.delivery === 'required') {\n await this.rollbackAttemptedTargets(attemptedTargets, failure);\n return { ok: false, error: failure };\n }\n bestEffortFailures.push(failure);\n }\n this.state = 'ready';\n this.detail = bestEffortFailures.length > 0\n ? `Best-effort target startup failures: ${bestEffortFailures.join('; ')}`\n : null;\n return { ok: true, value: undefined };\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n const matchingTargets = this.options.targets.filter((target) => target.matches(request.batch));\n const hasRequiredTarget = matchingTargets.some((target) => target.delivery === 'required');\n if (!hasRequiredTarget && !this.options.volatile) {\n return {\n kind: 'rejected',\n idempotencyKey: request.batch.idempotencyKey,\n code: 'no-required-terminal',\n reason: 'No required storage target matched this batch',\n targetStates: this.unmatchedStates(matchingTargets),\n };\n }\n\n const committedTargets = this.committed.get(request.batch.idempotencyKey) ?? new Set<string>();\n const targetResults = await this.persistMatchingTargets(request, matchingTargets, committedTargets);\n this.remember(request.batch.idempotencyKey, committedTargets);\n return this.aggregateAcknowledgement(request, matchingTargets, targetResults);\n }\n\n async timeline(query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n const target = this.resolveQueryTarget(query.targetId);\n if (!target.ok) {\n return target;\n }\n return target.value.transport.timeline(Object.freeze({ ...query, targetId: target.value.targetId }));\n }\n\n async metrics(query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n const target = this.resolveQueryTarget(query.targetId);\n if (!target.ok) {\n return target;\n }\n return target.value.transport.metrics(Object.freeze({ ...query, targetId: target.value.targetId }));\n }\n\n async materializeRollups(nowMs: number, maxWorkMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('rollup', (target) => target.materializeRollups(nowMs, maxWorkMs));\n }\n\n async enforceRetention(nowMs: number, shouldContinue?: () => boolean): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('retention', (target) => target.enforceRetention(nowMs, shouldContinue));\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('checkpoint', (target) => target.checkpoint());\n }\n\n async reclaim(maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('reclaim', (target) => target.reclaim(maxPages));\n }\n\n async compact(deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('compaction', (target) => target.compact(deadlineMs));\n }\n\n status(): StorageTargetStatus {\n const states = this.options.targets.map((target) => target.transport.status());\n const requiredIds = new Set(this.options.targets\n .filter((target) => target.delivery === 'required')\n .map((target) => target.targetId));\n const failedRequired = states.find((state) => {\n return requiredIds.has(state.targetId) && state.state === 'failed';\n });\n return {\n targetId: this.targetId,\n state: failedRequired ? 'failed' : this.state,\n detail: this.state === 'failed' ? this.detail : failedRequired?.detail ?? this.detail,\n writerLeaseHeld: states.some((state) => state.writerLeaseHeld),\n };\n }\n\n async stop(deadlineMs: number): Promise<void> {\n const operations = this.options.targets.map((target) => {\n return Promise.resolve().then(() => target.transport.stop(deadlineMs));\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.allSettled(operations),\n deadlineMs,\n this.options.now,\n );\n if (outcome.kind === 'deadline-exhausted') {\n this.state = 'failed';\n this.detail = 'Telemetry storage router stop deadline exceeded';\n return;\n }\n if (outcome.kind === 'failed') {\n this.state = 'failed';\n this.detail = `Telemetry storage router stop failed: ${this.errorMessage(outcome.error)}`;\n throw outcome.error;\n }\n const failed = outcome.value.find((result): result is PromiseRejectedResult => result.status === 'rejected');\n if (failed) {\n this.state = 'failed';\n this.detail = `Telemetry storage router stop failed: ${this.errorMessage(failed.reason)}`;\n throw failed.reason;\n }\n this.state = 'stopped';\n this.detail = null;\n }\n\n targetStatuses(): readonly StorageTargetStatus[] {\n return this.options.targets.map((target) => target.transport.status());\n }\n\n private async startTarget(\n target: TelemetryStorageTarget,\n definitions: readonly MetricDefinition[],\n ): Promise<TelemetryResult<void, string>> {\n try {\n return await target.transport.start(definitions);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private async rollbackAttemptedTargets(\n attemptedTargets: readonly TelemetryStorageTarget[],\n primaryFailure: string,\n ): Promise<void> {\n const deadlineMs = this.options.now() + START_ROLLBACK_TIMEOUT_MS;\n const rollbackTargets = [...attemptedTargets].reverse();\n const settled = new Map<string, RollbackTargetResult>();\n const operations = rollbackTargets.map(async (target) => {\n const result = await this.stopRollbackTarget(target, deadlineMs);\n settled.set(target.targetId, result);\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.all(operations),\n deadlineMs,\n this.options.now,\n );\n const timedOut = outcome.kind === 'deadline-exhausted';\n const cleanupFailures = rollbackTargets.flatMap((target) => {\n const result = settled.get(target.targetId);\n if (result === undefined) {\n return timedOut ? [`${target.targetId}: rollback deadline exceeded`] : [];\n }\n return result.error === null ? [] : [`${target.targetId}: ${result.error}`];\n });\n this.state = 'failed';\n this.detail = cleanupFailures.length > 0\n ? `${primaryFailure}; rollback cleanup failures: ${cleanupFailures.join('; ')}`\n : primaryFailure;\n }\n\n private async stopRollbackTarget(\n target: TelemetryStorageTarget,\n deadlineMs: number,\n ): Promise<RollbackTargetResult> {\n try {\n await target.transport.stop(deadlineMs);\n return { targetId: target.targetId, error: null };\n } catch (cause) {\n return { targetId: target.targetId, error: this.errorMessage(cause) };\n }\n }\n\n private async persistMatchingTargets(\n request: StoragePersistRequest,\n targets: readonly TelemetryStorageTarget[],\n committedTargets: Set<string>,\n ): Promise<readonly StorageTargetResult[]> {\n return Promise.all(targets.map(async (target): Promise<StorageTargetResult> => {\n if (committedTargets.has(target.targetId)) {\n return { target, acknowledgement: this.alreadyCommitted(request), attempts: 0 };\n }\n const targetRequest = this.requestForTarget(request, target.targetId);\n const acknowledgement = await this.persistSafely(target, targetRequest);\n if (acknowledgement.kind === 'committed') {\n committedTargets.add(target.targetId);\n }\n return { target, acknowledgement, attempts: 1 };\n }));\n }\n\n private aggregateAcknowledgement(\n request: StoragePersistRequest,\n matchingTargets: readonly TelemetryStorageTarget[],\n targetResults: readonly StorageTargetResult[],\n ): TelemetryAcknowledgement {\n const targetStates = this.deliveryStates(targetResults, matchingTargets);\n const requiredResults = targetResults.filter(({ target }) => target.delivery === 'required');\n const conflict = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'conflict');\n const conflictAcknowledgement = conflict?.acknowledgement;\n if (conflictAcknowledgement?.kind === 'conflict') {\n return {\n kind: 'conflict',\n idempotencyKey: request.batch.idempotencyKey,\n reason: conflictAcknowledgement.reason,\n targetStates,\n };\n }\n const rejected = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'rejected');\n const rejectedAcknowledgement = rejected?.acknowledgement;\n if (rejectedAcknowledgement?.kind === 'rejected') {\n return {\n kind: 'rejected',\n idempotencyKey: request.batch.idempotencyKey,\n code: rejectedAcknowledgement.code,\n reason: rejectedAcknowledgement.reason,\n targetStates,\n };\n }\n const retryable = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'retryable');\n const retryableAcknowledgement = retryable?.acknowledgement;\n if (retryableAcknowledgement?.kind === 'retryable') {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: retryableAcknowledgement.reason,\n retryAfterMs: retryableAcknowledgement.retryAfterMs,\n targetStates,\n };\n }\n\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: targetResults.length > 0 && targetResults.every(({ attempts }) => attempts === 0),\n targetStates,\n };\n }\n\n private deliveryStates(\n targetResults: readonly StorageTargetResult[],\n matchingTargets: readonly TelemetryStorageTarget[],\n ): readonly TelemetryTargetDeliveryState[] {\n return [\n ...targetResults.map(({ target, acknowledgement, attempts }) => this.deliveryState(\n target,\n acknowledgement,\n attempts,\n )),\n ...this.unmatchedStates(matchingTargets),\n ];\n }\n\n private requestForTarget(request: StoragePersistRequest, targetId: string): StoragePersistRequest {\n const samples = request.samples.filter((sample) => {\n return sample.targetIds.length === 0 || sample.targetIds.includes(targetId);\n });\n const extractionFailures = request.extractionFailures.filter((failure) => {\n const targetIds = this.definitionTargets.get(`${failure.metricName}:${failure.definitionVersion}`);\n return targetIds === undefined || targetIds.length === 0 || targetIds.includes(targetId);\n });\n return Object.freeze({\n batch: request.batch,\n samples: Object.freeze(samples),\n extractionFailures: Object.freeze(extractionFailures),\n });\n }\n\n private async persistSafely(\n target: TelemetryStorageTarget,\n request: StoragePersistRequest,\n ): Promise<TelemetryAcknowledgement> {\n try {\n const received: unknown = await target.transport.persist(request);\n const validated = this.acknowledgementContract.validateAndDetach(request.batch, received);\n return validated.ok\n ? validated.value\n : this.invalidAcknowledgement(request, validated.error);\n } catch (cause) {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: this.acknowledgementContract.exceptionReason(cause),\n retryAfterMs: 50,\n targetStates: [],\n };\n }\n }\n\n private invalidAcknowledgement(\n request: StoragePersistRequest,\n error: string,\n ): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: 50,\n targetStates: [],\n };\n }\n\n private alreadyCommitted(request: StoragePersistRequest): TelemetryAcknowledgement {\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: true,\n targetStates: [],\n };\n }\n\n private deliveryState(\n target: TelemetryStorageTarget,\n acknowledgement: TelemetryAcknowledgement,\n attempts: number,\n ): TelemetryTargetDeliveryState {\n return acknowledgement.kind === 'committed'\n ? {\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'committed',\n attempts,\n reason: null,\n }\n : {\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'failed',\n attempts,\n reason: acknowledgement.reason,\n };\n }\n\n private unmatchedStates(matchingTargets: readonly TelemetryStorageTarget[]): TelemetryTargetDeliveryState[] {\n const matchingIds = new Set(matchingTargets.map((target) => target.targetId));\n return this.options.targets\n .filter((target) => !matchingIds.has(target.targetId))\n .map((target) => ({\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'abandoned' as const,\n attempts: 0,\n reason: 'route-not-matched',\n }));\n }\n\n private resolveQueryTarget(\n requestedTargetId: string | null,\n ): TelemetryResult<TelemetryStorageTarget, TelemetryQueryError> {\n const queryable = this.options.targets.filter((target) => target.transport.capabilities.queries);\n if (queryable.length === 0) {\n return {\n ok: false,\n error: { kind: 'unsupported', message: 'No configured telemetry target supports queries' },\n };\n }\n const resolvedId = requestedTargetId ?? this.options.defaultTargetId ?? (queryable.length === 1\n ? queryable[0]?.targetId ?? null\n : null);\n if (resolvedId === null) {\n return {\n ok: false,\n error: { kind: 'ambiguous-target', message: 'Multiple queryable targets exist and no default was configured' },\n };\n }\n const target = queryable.find((candidate) => candidate.targetId === resolvedId);\n if (!target) {\n return { ok: false, error: { kind: 'unknown-target', message: `Unknown query target ${resolvedId}` } };\n }\n return { ok: true, value: target };\n }\n\n private async runMaintenance(\n stage: MaintenanceStageResult['stage'],\n run: (target: TelemetryStorageTransport) => Promise<TelemetryResult<MaintenanceStageResult, string>>,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n let affectedRows = 0;\n let affectedPages = 0;\n let elapsedMs = 0;\n for (const target of this.options.targets) {\n if (!target.transport.capabilities.maintenance) {\n continue;\n }\n const completed = await run(target.transport);\n if (!completed.ok && target.delivery === 'required') {\n return { ok: false, error: `${target.targetId}: ${completed.error}` };\n }\n if (completed.ok) {\n affectedRows += completed.value.affectedRows;\n affectedPages += completed.value.affectedPages;\n elapsedMs += completed.value.elapsedMs;\n }\n }\n return {\n ok: true,\n value: { stage, affectedRows, affectedPages, elapsedMs, detail: null },\n };\n }\n\n private validateOptions(): void {\n if (!this.options.routerId.trim() || this.options.targets.length === 0) {\n throw new Error('A telemetry storage router requires an id and at least one target');\n }\n if (this.options.maxRememberedBatches !== undefined\n && (!Number.isSafeInteger(this.options.maxRememberedBatches)\n || this.options.maxRememberedBatches <= 0)) {\n throw new Error('Telemetry storage router memory must be a positive safe integer');\n }\n const targetIds = this.options.targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error('Telemetry storage target ids must be unique');\n }\n const requiredTargets = this.options.targets.filter((target) => target.delivery === 'required');\n if (!this.options.volatile && requiredTargets.length === 0) {\n throw new Error('A non-volatile storage router requires a required target');\n }\n const defaultExists = this.options.defaultTargetId === null\n || targetIds.includes(this.options.defaultTargetId);\n if (!defaultExists) {\n throw new Error(`Unknown default telemetry target ${this.options.defaultTargetId}`);\n }\n const defaultTarget = this.options.targets.find((target) => target.targetId === this.options.defaultTargetId);\n if (defaultTarget && !defaultTarget.transport.capabilities.queries) {\n throw new Error(`Default telemetry target ${defaultTarget.targetId} does not support queries`);\n }\n }\n\n private remember(idempotencyKey: string, targets: Set<string>): void {\n this.committed.set(idempotencyKey, targets);\n const maximum = this.options.maxRememberedBatches ?? 1_024;\n while (this.committed.size > maximum) {\n const oldest = this.committed.keys().next().value;\n if (typeof oldest !== 'string') {\n return;\n }\n this.committed.delete(oldest);\n }\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n"],"mappings":"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","names":["target"]}
|