{"version":3,"file":"trace-serializer.js","sourceRoot":"","sources":["../../../../src/trace/protobuf/trace-serializer.ts"],"names":[],"mappings":";;;AAMA,2EAAuE;AACvE,8DAAyD;AAGzD,+EAGiD;AAEjD,2FAAsF;AAEtF,uDAAuD;AACvD,MAAM,qCAAqC,GAAG,KAAK,CAAC;AACpD,MAAM,iCAAiC,GAAG,KAAK,CAAC;AAEhD,SAAS,cAAc,CAAC,UAAkB,EAAE,QAAkB;IAC5D,IAAI,KAAK,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,qCAAqC,CAAC;IACxE,IAAI,QAAQ,EAAE;QACZ,KAAK,IAAI,iCAAiC,CAAC;KAC5C;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,MAAuB,EAAE,MAAkB;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC;IAElC,4CAA4C;IAC5C,IAAI,MAAM,CAAC,OAAO,EAAE;QAClB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KACpC;IAED,kFAAkF;IAClF,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,CAAC,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,cAAc,CAAC,MAAuB,EAAE,KAAiB;IAChE,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IACjD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC;IAEjC,oCAAoC;IACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,IAAA,wCAAoB,EAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAEzC,yBAAyB;IACzB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,0CAA0C;IAC1C,IAAI,KAAK,CAAC,UAAU,EAAE;QACpB,IAAA,mCAAe,EAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;KAC9C;IAED,6CAA6C;IAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,CAAC,CAAC;IAEtD,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,aAAa,CAAC,MAAuB,EAAE,IAAU;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAChD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAE7B,4BAA4B;IAC5B,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,UAAU,CAAC,IAAA,2BAAW,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAEhD,2BAA2B;IAC3B,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,UAAU,CAAC,IAAA,2BAAW,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/C,gDAAgD;IAChD,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;IACvD,IAAI,cAAc,EAAE;QAClB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;KACpC;IAED,0CAA0C;IAC1C,IAAI,IAAI,CAAC,UAAU,EAAE;QACnB,IAAA,mCAAe,EAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;KAC7C;IAED,6CAA6C;IAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,CAAC,CAAC;IAErD,2BAA2B;IAC3B,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvE,IAAI,SAAS,EAAE;QACb,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;KAChC;IAED,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAS,aAAa,CAAC,MAAuB,EAAE,IAAkB;IAChE,MAAM,SAAS,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IAChD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC;IAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAE/B,4BAA4B;IAC5B,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,UAAU,CAAC,IAAA,2BAAW,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5C,2BAA2B;IAC3B,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,UAAU,CAAC,IAAA,2BAAW,EAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3C,gDAAgD;IAChD,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;IAC/C,IAAI,UAAU,EAAE;QACd,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;KAChC;IAED,kDAAkD;IAClD,IAAI,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE;QAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,IAAA,2BAAW,EAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;KAC/D;IAED,yBAAyB;IACzB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9B,8BAA8B;IAC9B,kEAAkE;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACnD,IAAI,IAAI,KAAK,CAAC,EAAE;QACd,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KAC1B;IAED,0CAA0C;IAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,IAAA,wCAAoB,EAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAE7C,wCAAwC;IACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,IAAA,wCAAoB,EAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAE3C,0CAA0C;IAC1C,IAAI,IAAI,CAAC,UAAU,EAAE;QACnB,IAAA,mCAAe,EAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;KAC7C;IAED,8CAA8C;IAC9C,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAEhD,oCAAoC;IACpC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;QAC/B,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvB,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;KAC/B;IAED,0CAA0C;IAC1C,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAE5C,kCAAkC;IAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;QAC7B,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;KAC7B;IAED,yCAAyC;IACzC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE3C,4BAA4B;IAC5B,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAErC,4BAA4B;IAC5B,MAAM,KAAK,GAAG,cAAc,CAC1B,GAAG,CAAC,UAAU,EACd,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CACjC,CAAC;IACF,IAAI,KAAK,EAAE;QACT,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;KAC5B;IAED,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,MAAuB,EACvB,KAA2B,EAC3B,KAAqB;IAErB,MAAM,eAAe,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IACtD,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC;IAEtC,wCAAwC;IACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IACjD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC;IAEjC,6CAA6C;IAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,KAAK,CAAC,OAAO,EAAE;QACjB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;KACnC;IAED,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC;IAErE,iCAAiC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;KAC7B;IAED,+CAA+C;IAC/C,IAAI,KAAK,CAAC,SAAS,EAAE;QACnB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;KACrC;IAED,MAAM,CAAC,qBAAqB,CAC1B,eAAe,EACf,MAAM,CAAC,GAAG,GAAG,kBAAkB,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,MAAuB,EACvB,QAAkB,EAClB,WAAmB;IAEnB,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,aAAa,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC;IAEpC,qCAAqC;IACrC,IAAI,QAAQ,CAAC,UAAU,EAAE;QACvB,IAAA,mCAAe,EAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;KACjD;IAED,+EAA+E;IAC/E,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAEtB,MAAM,CAAC,qBAAqB,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,GAAG,gBAAgB,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAC7B,MAAuB,EACvB,QAAkB,EAClB,QAAmD;IAEnD,MAAM,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IACzD,MAAM,qBAAqB,GAAG,MAAM,CAAC,GAAG,CAAC;IAEzC,+BAA+B;IAC/B,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEvC,6CAA6C;IAC7C,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;QACjD,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;KAChD;IAED,+CAA+C;IAC/C,IAAI,QAAQ,CAAC,SAAS,EAAE;QACtB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;KACxC;IAED,MAAM,CAAC,qBAAqB,CAC1B,kBAAkB,EAClB,MAAM,CAAC,GAAG,GAAG,qBAAqB,CACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,KAAqB;IAErB,MAAM,WAAW,GAGb,IAAI,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAExC,IAAI,QAAQ,GACV,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,EAAE;YACb,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;YACrB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;SACrC;QAED,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SAC9B;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACpB;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAgB,2BAA2B,CAAC,KAAqB;IAC/D,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE7C,4BAA4B;IAC5B,MAAM,SAAS,GAAG,IAAI,+CAAqB,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,WAAW,EAAE;QAC9C,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;KACvD;IAED,yCAAyC;IACzC,MAAM,MAAM,GAAG,IAAI,gCAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjD,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,WAAW,EAAE;QAC9C,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,sBAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;KACpD;IAED,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC;AACzB,CAAC;AAlBD,kEAkBC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport type { Link, SpanStatus } from '@opentelemetry/api';\nimport { ProtobufWriter } from '../../common/protobuf/protobuf-writer';\nimport { hexToBinary } from '../../common/hex-to-binary';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { InstrumentationScope } from '@opentelemetry/core';\nimport {\n  writeAttributes,\n  writeHrTimeAsFixed64,\n} from '../../common/protobuf/common-serializer';\nimport type { IProtobufWriter } from '../../common/protobuf/i-protobuf-writer';\nimport { ProtobufSizeEstimator } from '../../common/protobuf/protobuf-size-estimator';\n\n// Span flags constants matching the OTLP specification\nconst SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK = 0x100;\nconst SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK = 0x200;\n\nfunction buildSpanFlags(traceFlags: number, isRemote?: boolean): number {\n  let flags = (traceFlags & 0xff) | SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK;\n  if (isRemote) {\n    flags |= SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK;\n  }\n  return flags;\n}\n\n/**\n * Serialize a Span.Status message\n *\n * Proto fields (Status):\n *   1  (reserved)\n *   2  message   string         (length-delimited)\n *   3  code      StatusCode     (varint)\n */\nfunction serializeStatus(writer: IProtobufWriter, status: SpanStatus): void {\n  const statusStart = writer.startLengthDelimited();\n  const statusStartPos = writer.pos;\n\n  // message (field 2, string) - skip if empty\n  if (status.message) {\n    writer.writeTag(2, 2);\n    writer.writeString(status.message);\n  }\n\n  // code (field 3, enum/varint) - always write as it defaults to UNSET (0) in proto\n  writer.writeTag(3, 0);\n  writer.writeVarint(status.code);\n\n  writer.finishLengthDelimited(statusStart, writer.pos - statusStartPos);\n}\n\n/**\n * Serialize a Span.Event message\n *\n * Proto fields (Span.Event):\n *   1  time_unix_nano           fixed64            (wire type 1)\n *   2  name                     string             (wire type 2)\n *   3  attributes               repeated KeyValue  (wire type 2)\n *   4  dropped_attributes_count uint32             (wire type 0)\n */\nfunction serializeEvent(writer: IProtobufWriter, event: TimedEvent): void {\n  const eventStart = writer.startLengthDelimited();\n  const eventStartPos = writer.pos;\n\n  // time_unix_nano (field 1, fixed64)\n  writer.writeTag(1, 1);\n  writeHrTimeAsFixed64(writer, event.time);\n\n  // name (field 2, string)\n  writer.writeTag(2, 2);\n  writer.writeString(event.name);\n\n  // attributes (field 3, repeated KeyValue)\n  if (event.attributes) {\n    writeAttributes(writer, event.attributes, 3);\n  }\n\n  // dropped_attributes_count (field 4, uint32)\n  writer.writeTag(4, 0);\n  writer.writeVarint(event.droppedAttributesCount || 0);\n\n  writer.finishLengthDelimited(eventStart, writer.pos - eventStartPos);\n}\n\n/**\n * Serialize a Span.Link message\n *\n * Proto fields (Span.Link):\n *   1  trace_id                 bytes              (wire type 2)\n *   2  span_id                  bytes              (wire type 2)\n *   3  trace_state              string             (wire type 2)\n *   4  attributes               repeated KeyValue  (wire type 2)\n *   5  dropped_attributes_count uint32             (wire type 0)\n *   6  flags                    fixed32            (wire type 5)\n */\nfunction serializeLink(writer: IProtobufWriter, link: Link): void {\n  const linkStart = writer.startLengthDelimited();\n  const linkStartPos = writer.pos;\n\n  const context = link.context;\n\n  // trace_id (field 1, bytes)\n  writer.writeTag(1, 2);\n  writer.writeBytes(hexToBinary(context.traceId));\n\n  // span_id (field 2, bytes)\n  writer.writeTag(2, 2);\n  writer.writeBytes(hexToBinary(context.spanId));\n\n  // trace_state (field 3, string) - skip if empty\n  const linkTraceState = context.traceState?.serialize();\n  if (linkTraceState) {\n    writer.writeTag(3, 2);\n    writer.writeString(linkTraceState);\n  }\n\n  // attributes (field 4, repeated KeyValue)\n  if (link.attributes) {\n    writeAttributes(writer, link.attributes, 4);\n  }\n\n  // dropped_attributes_count (field 5, uint32)\n  writer.writeTag(5, 0);\n  writer.writeVarint(link.droppedAttributesCount || 0);\n\n  // flags (field 6, fixed32)\n  const linkFlags = buildSpanFlags(context.traceFlags, context.isRemote);\n  if (linkFlags) {\n    writer.writeTag(6, 5);\n    writer.writeFixed32(linkFlags);\n  }\n\n  writer.finishLengthDelimited(linkStart, writer.pos - linkStartPos);\n}\n\n/**\n * Serialize a single Span message directly from ReadableSpan\n *\n * Proto fields (Span):\n *   1  trace_id                 bytes              (wire type 2)\n *   2  span_id                  bytes              (wire type 2)\n *   3  trace_state              string             (wire type 2)\n *   4  parent_span_id           bytes              (wire type 2)\n *   5  name                     string             (wire type 2)\n *   6  kind                     SpanKind           (wire type 0)\n *   7  start_time_unix_nano     fixed64            (wire type 1)\n *   8  end_time_unix_nano       fixed64            (wire type 1)\n *   9  attributes               repeated KeyValue  (wire type 2)\n *  10  dropped_attributes_count uint32             (wire type 0)\n *  11  events                   repeated Event     (wire type 2)\n *  12  dropped_events_count     uint32             (wire type 0)\n *  13  links                    repeated Link      (wire type 2)\n *  14  dropped_links_count      uint32             (wire type 0)\n *  15  status                   Status             (wire type 2)\n *  16  flags                    fixed32            (wire type 5)\n */\nfunction serializeSpan(writer: IProtobufWriter, span: ReadableSpan): void {\n  const spanStart = writer.startLengthDelimited();\n  const spanStartPos = writer.pos;\n\n  const ctx = span.spanContext();\n\n  // trace_id (field 1, bytes)\n  writer.writeTag(1, 2);\n  writer.writeBytes(hexToBinary(ctx.traceId));\n\n  // span_id (field 2, bytes)\n  writer.writeTag(2, 2);\n  writer.writeBytes(hexToBinary(ctx.spanId));\n\n  // trace_state (field 3, string) - skip if empty\n  const traceState = ctx.traceState?.serialize();\n  if (traceState) {\n    writer.writeTag(3, 2);\n    writer.writeString(traceState);\n  }\n\n  // parent_span_id (field 4, bytes) - skip if empty\n  if (span.parentSpanContext?.spanId) {\n    writer.writeTag(4, 2);\n    writer.writeBytes(hexToBinary(span.parentSpanContext.spanId));\n  }\n\n  // name (field 5, string)\n  writer.writeTag(5, 2);\n  writer.writeString(span.name);\n\n  // kind (field 6, enum/varint)\n  // Span kind is offset by 1: API does not define a value for unset\n  const kind = span.kind == null ? 0 : span.kind + 1;\n  if (kind !== 0) {\n    writer.writeTag(6, 0);\n    writer.writeVarint(kind);\n  }\n\n  // start_time_unix_nano (field 7, fixed64)\n  writer.writeTag(7, 1);\n  writeHrTimeAsFixed64(writer, span.startTime);\n\n  // end_time_unix_nano (field 8, fixed64)\n  writer.writeTag(8, 1);\n  writeHrTimeAsFixed64(writer, span.endTime);\n\n  // attributes (field 9, repeated KeyValue)\n  if (span.attributes) {\n    writeAttributes(writer, span.attributes, 9);\n  }\n\n  // dropped_attributes_count (field 10, uint32)\n  writer.writeTag(10, 0);\n  writer.writeVarint(span.droppedAttributesCount);\n\n  // events (field 11, repeated Event)\n  for (const event of span.events) {\n    writer.writeTag(11, 2);\n    serializeEvent(writer, event);\n  }\n\n  // dropped_events_count (field 12, uint32)\n  writer.writeTag(12, 0);\n  writer.writeVarint(span.droppedEventsCount);\n\n  // links (field 13, repeated Link)\n  for (const link of span.links) {\n    writer.writeTag(13, 2);\n    serializeLink(writer, link);\n  }\n\n  // dropped_links_count (field 14, uint32)\n  writer.writeTag(14, 0);\n  writer.writeVarint(span.droppedLinksCount);\n\n  // status (field 15, Status)\n  writer.writeTag(15, 2);\n  serializeStatus(writer, span.status);\n\n  // flags (field 16, fixed32)\n  const flags = buildSpanFlags(\n    ctx.traceFlags,\n    span.parentSpanContext?.isRemote\n  );\n  if (flags) {\n    writer.writeTag(16, 5);\n    writer.writeFixed32(flags);\n  }\n\n  writer.finishLengthDelimited(spanStart, writer.pos - spanStartPos);\n}\n\n/**\n * Serialize ScopeSpans directly from SDK types\n */\nfunction serializeScopeSpans(\n  writer: IProtobufWriter,\n  scope: InstrumentationScope,\n  spans: ReadableSpan[]\n): void {\n  const scopeSpansStart = writer.startLengthDelimited();\n  const scopeSpansStartPos = writer.pos;\n\n  // scope (field 1, InstrumentationScope)\n  writer.writeTag(1, 2);\n  const scopeStart = writer.startLengthDelimited();\n  const scopeStartPos = writer.pos;\n\n  // Write InstrumentationScope fields directly\n  writer.writeTag(1, 2);\n  writer.writeString(scope.name);\n\n  if (scope.version) {\n    writer.writeTag(2, 2);\n    writer.writeString(scope.version);\n  }\n\n  writer.finishLengthDelimited(scopeStart, writer.pos - scopeStartPos);\n\n  // spans (field 2, repeated Span)\n  for (const span of spans) {\n    writer.writeTag(2, 2);\n    serializeSpan(writer, span);\n  }\n\n  // schema_url (field 3, string) - skip if empty\n  if (scope.schemaUrl) {\n    writer.writeTag(3, 2);\n    writer.writeString(scope.schemaUrl);\n  }\n\n  writer.finishLengthDelimited(\n    scopeSpansStart,\n    writer.pos - scopeSpansStartPos\n  );\n}\n\nfunction serializeResource(\n  writer: IProtobufWriter,\n  resource: Resource,\n  fieldNumber: number\n) {\n  writer.writeTag(fieldNumber, 2);\n  const resourceStart = writer.startLengthDelimited();\n  const resourceStartPos = writer.pos;\n\n  // Write Resource attributes directly\n  if (resource.attributes) {\n    writeAttributes(writer, resource.attributes, 1);\n  }\n\n  // dropped_attributes_count (field 2, uint32) - set to 0 as we don't track this\n  writer.writeTag(2, 0);\n  writer.writeVarint(0);\n\n  writer.finishLengthDelimited(resourceStart, writer.pos - resourceStartPos);\n}\n\n/**\n * Serialize ResourceSpans directly from SDK Resource type\n */\nfunction serializeResourceSpans(\n  writer: IProtobufWriter,\n  resource: Resource,\n  scopeMap: Map<InstrumentationScope, ReadableSpan[]>\n): void {\n  const resourceSpansStart = writer.startLengthDelimited();\n  const resourceSpansStartPos = writer.pos;\n\n  // resource (field 1, Resource)\n  serializeResource(writer, resource, 1);\n\n  // scope_spans (field 2, repeated ScopeSpans)\n  for (const scopeSpans of scopeMap.values()) {\n    writer.writeTag(2, 2);\n    const scope = scopeSpans[0].instrumentationScope;\n    serializeScopeSpans(writer, scope, scopeSpans);\n  }\n\n  // schema_url (field 3, string) - skip if empty\n  if (resource.schemaUrl) {\n    writer.writeTag(3, 2);\n    writer.writeString(resource.schemaUrl);\n  }\n\n  writer.finishLengthDelimited(\n    resourceSpansStart,\n    writer.pos - resourceSpansStartPos\n  );\n}\n\n/**\n * Group spans by resource and instrumentation scope using identity comparison\n */\nfunction createResourceMap(\n  spans: ReadableSpan[]\n): Map<Resource, Map<InstrumentationScope, ReadableSpan[]>> {\n  const resourceMap: Map<\n    Resource,\n    Map<InstrumentationScope, ReadableSpan[]>\n  > = new Map();\n\n  for (const span of spans) {\n    const resource = span.resource;\n    const scope = span.instrumentationScope;\n\n    let scopeMap: Map<InstrumentationScope, ReadableSpan[]> | undefined =\n      resourceMap.get(resource);\n    if (!scopeMap) {\n      scopeMap = new Map();\n      resourceMap.set(resource, scopeMap);\n    }\n\n    let records = scopeMap.get(scope);\n    if (!records) {\n      records = [];\n      scopeMap.set(scope, records);\n    }\n    records.push(span);\n  }\n  return resourceMap;\n}\n\n/**\n * Serialize ExportTraceServiceRequest directly from ReadableSpan[]\n */\nexport function serializeTraceExportRequest(spans: ReadableSpan[]): Uint8Array {\n  const resourceMap = createResourceMap(spans);\n\n  // First pass: estimate size\n  const estimator = new ProtobufSizeEstimator();\n  for (const [resource, scopeMap] of resourceMap) {\n    estimator.writeTag(1, 2);\n    serializeResourceSpans(estimator, resource, scopeMap);\n  }\n\n  // Second pass: write with estimated size\n  const writer = new ProtobufWriter(estimator.pos);\n  for (const [resource, scopeMap] of resourceMap) {\n    writer.writeTag(1, 2);\n    serializeResourceSpans(writer, resource, scopeMap);\n  }\n\n  return writer.finish();\n}\n"]}