validate method

void validate()

Reject invalid dynamic budgets in debug and release builds.

Implementation

void validate() {
  _requirePositiveSafeBudgetInteger(maxJsonDepth, 'maxJsonDepth');
  _requirePositiveSafeBudgetInteger(maxCapabilityDepth, 'maxCapabilityDepth');
  _requirePositiveSafeBudgetInteger(maxCapabilityNodes, 'maxCapabilityNodes');
  _requirePositiveSafeBudgetInteger(maxCapabilityBytes, 'maxCapabilityBytes');
  _requirePositiveSafeBudgetInteger(maxAuthMethods, 'maxAuthMethods');
  _requirePositiveSafeBudgetInteger(maxMetadataDepth, 'maxMetadataDepth');
  _requirePositiveSafeBudgetInteger(maxMetadataNodes, 'maxMetadataNodes');
  _requirePositiveSafeBudgetInteger(maxMetadataEntries, 'maxMetadataEntries');
  _requirePositiveSafeBudgetInteger(maxMetadataBytes, 'maxMetadataBytes');
  _requirePositiveSafeBudgetInteger(maxCollectionItems, 'maxCollectionItems');
  _requirePositiveSafeBudgetInteger(
    maxStructuredUpdateNodes,
    'maxStructuredUpdateNodes',
  );
  _requirePositiveSafeBudgetInteger(
    maxStructuredUpdateBytes,
    'maxStructuredUpdateBytes',
  );
  _requirePositiveSafeBudgetInteger(
    maxStructuredStringBytes,
    'maxStructuredStringBytes',
  );
  _requirePositiveSafeBudgetInteger(
    maxMessageTextBytes,
    'maxMessageTextBytes',
  );
  _requirePositiveSafeBudgetInteger(
    maxMessageTextLines,
    'maxMessageTextLines',
  );
  _requirePositiveSafeBudgetInteger(
    maxMarkdownSyntaxTokens,
    'maxMarkdownSyntaxTokens',
  );
  _requirePositiveSafeBudgetInteger(
    maxMarkdownFallbackBytes,
    'maxMarkdownFallbackBytes',
  );
  _requirePositiveSafeBudgetInteger(
    maxThoughtTextBytes,
    'maxThoughtTextBytes',
  );
  _requirePositiveSafeBudgetInteger(
    maxEmbeddedMediaBytes,
    'maxEmbeddedMediaBytes',
  );
  _requirePositiveSafeBudgetInteger(maxImageDimension, 'maxImageDimension');
  _requirePositiveSafeBudgetInteger(maxImagePixels, 'maxImagePixels');
  _requirePositiveSafeBudgetInteger(
    maxImagePreviewPixels,
    'maxImagePreviewPixels',
  );
  _requirePositiveSafeBudgetInteger(
    maxConcurrentImageDecodes,
    'maxConcurrentImageDecodes',
  );
  _requirePositiveSafeBudgetInteger(
    maxImagePreviewPixelsGlobal,
    'maxImagePreviewPixelsGlobal',
  );
  _requirePositiveSafeBudgetInteger(
    maxImageDecodeBytesGlobal,
    'maxImageDecodeBytesGlobal',
  );
  _requirePositiveSafeBudgetInteger(maxTurnItems, 'maxTurnItems');
  _requirePositiveSafeBudgetInteger(
    maxTurnRetainedBytes,
    'maxTurnRetainedBytes',
  );
  _requirePositiveSafeBudgetInteger(maxTimelineItems, 'maxTimelineItems');
  _requirePositiveSafeBudgetInteger(maxTimelineBytes, 'maxTimelineBytes');
  _requirePositiveSafeBudgetInteger(maxUiStateBytes, 'maxUiStateBytes');
  _requirePositiveSafeBudgetInteger(
    maxMetadataPreviewBytes,
    'maxMetadataPreviewBytes',
  );
  _requirePositiveSafeBudgetInteger(
    maxMetadataPreviewChars,
    'maxMetadataPreviewChars',
  );

  chatMaxBase64EncodedLength(maxEmbeddedMediaBytes);
  if (maxImagePreviewPixels > _maxSafeBudgetInteger ~/ 4) {
    throw ArgumentError.value(
      maxImagePreviewPixels,
      'maxImagePreviewPixels',
      'decoded preview bytes exceed the cross-platform safe integer range',
    );
  }

  _requireAtMost(
    maxImagePreviewPixels,
    maxImagePixels,
    'maxImagePreviewPixels relative to maxImagePixels',
  );
  _requireAtMost(
    maxImagePreviewPixels,
    maxImagePreviewPixelsGlobal,
    'maxImagePreviewPixels relative to maxImagePreviewPixelsGlobal',
  );
  _requireAtMost(
    maxMarkdownFallbackBytes,
    maxMessageTextBytes,
    'maxMarkdownFallbackBytes relative to maxMessageTextBytes',
  );
  _requireAtMost(
    maxTurnRetainedBytes,
    maxTimelineBytes,
    'maxTurnRetainedBytes relative to maxTimelineBytes',
  );
  _requireAtMost(
    maxTimelineBytes,
    maxUiStateBytes,
    'maxTimelineBytes relative to maxUiStateBytes',
  );

  final previewBytes = maxImagePreviewPixels * 4;
  _requireAtMost(
    previewBytes,
    maxImageDecodeBytesGlobal,
    'maxImagePreviewPixels bytes relative to maxImageDecodeBytesGlobal',
  );
  final remainingImageDecodeBytes = maxImageDecodeBytesGlobal - previewBytes;
  if (maxEmbeddedMediaBytes > remainingImageDecodeBytes) {
    throw ChatInputLimitExceeded(
      resource: 'maxEmbeddedMediaBytes after image preview reservation',
      limit: remainingImageDecodeBytes,
      observedAtLeast: maxEmbeddedMediaBytes,
    );
  }
}