{"version":3,"file":"protobuf-writer.js","sourceRoot":"","sources":["../../../../src/common/protobuf/protobuf-writer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport { diag } from '@opentelemetry/api';\nimport type { IProtobufWriter } from './i-protobuf-writer';\nimport { estimateVarintSize } from './utils';\n\nexport const GROWING_BUFFER_DEBUG_MESSAGE =\n  'ProtobufWriter: estimated size was too small, growing buffer.';\n\n/**\n * bytes reserved for length in length-delimited fields\n * using 1 to assume most length-delimited fields are small\n */\nconst RESERVED_LENGTH_BYTES = 1;\n\n/**\n * Primitive protobuf writer, optimized to avoid small object allocations.\n * Grows buffer dynamically if initial size is exceeded.\n */\nexport class ProtobufWriter implements IProtobufWriter {\n  private _buffer: Uint8Array;\n  // Avoid using TextEncoder type. While the global is there on all supported runtimes, types may differ.\n  private readonly _textEncoder: { encode: (str: string) => Uint8Array };\n  private _dataView: DataView;\n\n  public pos: number = 0;\n\n  constructor(estimatedSize = 65536) {\n    this._buffer = new Uint8Array(estimatedSize);\n    this._textEncoder = new TextEncoder();\n    this._dataView = new DataView(this._buffer.buffer, this._buffer.byteOffset);\n  }\n\n  /**\n   * Ensure buffer has capacity for at least size more bytes\n   */\n  private _ensureCapacity(size: number): void {\n    const needed = this.pos + size;\n    if (needed <= this._buffer.length) {\n      return;\n    }\n\n    // It is safe to grow the buffer, but we assume that estimation is correct.\n    // Getting to this point indicates incorrect estimation or over-reservation\n    // of space in this writer and can lead to poor memory performance.\n    diag.debug(GROWING_BUFFER_DEBUG_MESSAGE);\n\n    // Double buffer size until we have enough space\n    let newSize = this._buffer.length * 2;\n    while (newSize < needed) {\n      newSize *= 2;\n    }\n\n    const newBuffer = new Uint8Array(newSize);\n    newBuffer.set(this._buffer);\n    this._buffer = newBuffer;\n    // Recreate DataView for the new buffer\n    this._dataView = new DataView(this._buffer.buffer, this._buffer.byteOffset);\n  }\n\n  /**\n   * Get the written bytes as a Uint8Array\n   */\n  finish(): Uint8Array {\n    return this._buffer.subarray(0, this.pos);\n  }\n\n  /**\n   * Insert placeholder for length. Update later with {@link finishLengthDelimited}\n   * Returns the position where to write the length.\n   */\n  startLengthDelimited(): number {\n    const lengthPos = this.pos;\n    // Reserve bytes for the length varint (RESERVED_LENGTH_BYTES should be fit to the common case)\n    this._ensureCapacity(RESERVED_LENGTH_BYTES);\n    this.pos += RESERVED_LENGTH_BYTES;\n    return lengthPos;\n  }\n\n  /**\n   * Write length varint at placeholder position and shift content forward if needed.\n   * Most messages are small (< 128 bytes), so we reserve 1 byte and only shift\n   * when the length needs more bytes.\n   */\n  finishLengthDelimited(pos: number, length: number): void {\n    // Calculate varint size needed for this length\n    const v = length >>> 0;\n\n    // Shift content forward if we need more bytes than reserved\n    const varintSize = estimateVarintSize(v);\n    if (varintSize > RESERVED_LENGTH_BYTES) {\n      const additionalBytes = varintSize - RESERVED_LENGTH_BYTES;\n      this._ensureCapacity(additionalBytes);\n      this._buffer.copyWithin(\n        pos + varintSize,\n        pos + RESERVED_LENGTH_BYTES,\n        this.pos\n      );\n      this.pos += additionalBytes;\n    }\n\n    // Write the varint at the placeholder position, inlined to avoid unnecessary checks.\n    let writePos = pos;\n    if (v < 0x80) {\n      this._buffer[writePos] = v;\n    } else if (v < 0x4000) {\n      this._buffer[writePos++] = (v & 0x7f) | 0x80;\n      this._buffer[writePos] = v >>> 7;\n    } else if (v < 0x200000) {\n      this._buffer[writePos++] = (v & 0x7f) | 0x80;\n      this._buffer[writePos++] = ((v >>> 7) & 0x7f) | 0x80;\n      this._buffer[writePos] = v >>> 14;\n    } else if (v < 0x10000000) {\n      this._buffer[writePos++] = (v & 0x7f) | 0x80;\n      this._buffer[writePos++] = ((v >>> 7) & 0x7f) | 0x80;\n      this._buffer[writePos++] = ((v >>> 14) & 0x7f) | 0x80;\n      this._buffer[writePos] = v >>> 21;\n    } else {\n      this._buffer[writePos++] = (v & 0x7f) | 0x80;\n      this._buffer[writePos++] = ((v >>> 7) & 0x7f) | 0x80;\n      this._buffer[writePos++] = ((v >>> 14) & 0x7f) | 0x80;\n      this._buffer[writePos++] = ((v >>> 21) & 0x7f) | 0x80;\n      this._buffer[writePos] = v >>> 28;\n    }\n  }\n\n  /**\n   * Write a varint (variable-length integer)\n   */\n  writeVarint(value: number): void {\n    this._ensureCapacity(estimateVarintSize(value));\n    // Check if value fits in 32-bit range\n    if (value >= 0 && value <= 0xffffffff) {\n      // 32-bit or small integer\n      let v = value >>> 0; // Convert to unsigned 32-bit\n      while (v > 0x7f) {\n        this._buffer[this.pos++] = (v & 0x7f) | 0x80;\n        v >>>= 7;\n      }\n      this._buffer[this.pos++] = v;\n    } else {\n      // Needs 64-bit handling - convert to [low, high]\n      let low: number;\n      let high: number;\n\n      if (value >= 0) {\n        // Positive number\n        low = value >>> 0;\n        high = (value / 0x100000000) >>> 0;\n      } else {\n        // Negative number - use two's complement\n        const abs = Math.abs(value);\n        low = abs >>> 0;\n        high = (abs / 0x100000000) >>> 0;\n\n        // Two's complement: invert bits and add 1\n        low = ~low >>> 0;\n        high = ~high >>> 0;\n        low = (low + 1) >>> 0;\n        if (low === 0) {\n          high = (high + 1) >>> 0;\n        }\n      }\n\n      // Write as 64-bit varint\n      while (high > 0 || low > 0x7f) {\n        this._buffer[this.pos++] = (low & 0x7f) | 0x80;\n        low = ((low >>> 7) | (high << 25)) >>> 0;\n        high >>>= 7;\n      }\n      this._buffer[this.pos++] = low & 0x7f;\n    }\n  }\n\n  /**\n   * Write a 32-bit fixed integer (little-endian)\n   */\n  writeFixed32(value: number): void {\n    this._ensureCapacity(4);\n    const v = value >>> 0;\n    this._buffer[this.pos++] = v & 0xff;\n    this._buffer[this.pos++] = (v >>> 8) & 0xff;\n    this._buffer[this.pos++] = (v >>> 16) & 0xff;\n    this._buffer[this.pos++] = (v >>> 24) & 0xff;\n  }\n\n  /**\n   * Write a 64-bit fixed integer (little-endian)\n   * @param low - Low 32 bits\n   * @param high - High 32 bits\n   */\n  writeFixed64(low: number, high: number): void {\n    this._ensureCapacity(8);\n    const l = low >>> 0;\n    const h = high >>> 0;\n\n    // Write low 32 bits\n    this._buffer[this.pos++] = l & 0xff;\n    this._buffer[this.pos++] = (l >>> 8) & 0xff;\n    this._buffer[this.pos++] = (l >>> 16) & 0xff;\n    this._buffer[this.pos++] = (l >>> 24) & 0xff;\n\n    // Write high 32 bits\n    this._buffer[this.pos++] = h & 0xff;\n    this._buffer[this.pos++] = (h >>> 8) & 0xff;\n    this._buffer[this.pos++] = (h >>> 16) & 0xff;\n    this._buffer[this.pos++] = (h >>> 24) & 0xff;\n  }\n\n  /**\n   * Write length-delimited data (varint length + bytes)\n   */\n  writeBytes(bytes: Uint8Array): void {\n    this.writeVarint(bytes.length);\n    this._ensureCapacity(bytes.length);\n    this._buffer.set(bytes, this.pos);\n    this.pos += bytes.length;\n  }\n\n  /**\n   * Write a field key (field number + wire type)\n   */\n  writeTag(fieldNumber: number, wireType: number): void {\n    this.writeVarint((fieldNumber << 3) | wireType);\n  }\n\n  /**\n   * Write a double (64-bit IEEE 754)\n   */\n  writeDouble(value: number): void {\n    this._ensureCapacity(8);\n    this._dataView.setFloat64(this.pos, value, true); // true = little-endian\n    this.pos += 8;\n  }\n\n  /**\n   * Write a string as UTF-8 bytes (length-delimited)\n   */\n  writeString(str: string): void {\n    // Fast path for ASCII strings (most common case)\n    let isAscii = true;\n    const len = str.length;\n    for (let i = 0; i < len; i++) {\n      if (str.charCodeAt(i) > 127) {\n        isAscii = false;\n        break;\n      }\n    }\n\n    if (isAscii) {\n      // Write length varint\n      this.writeVarint(len);\n      this._ensureCapacity(len);\n      // Write ASCII bytes directly\n      for (let i = 0; i < len; i++) {\n        this._buffer[this.pos++] = str.charCodeAt(i);\n      }\n    } else {\n      // Use TextEncoder for non-ASCII strings\n      const bytes = this._textEncoder.encode(str);\n      this.writeBytes(bytes);\n    }\n  }\n}\n"]}