private renderDeliveryPolicy()

in packages/aws-cdk-lib/aws-sns/lib/subscription.ts [170:242]


  private renderDeliveryPolicy(deliveryPolicy: DeliveryPolicy, protocol: SubscriptionProtocol): any {
    if (![SubscriptionProtocol.HTTP, SubscriptionProtocol.HTTPS].includes(protocol)) {
      throw new ValidationError(`Delivery policy is only supported for HTTP and HTTPS subscriptions, got: ${protocol}`, this);
    }
    const { healthyRetryPolicy, throttlePolicy } = deliveryPolicy;
    if (healthyRetryPolicy) {
      const delayTargetLimitSecs = 3600;
      const minDelayTarget = healthyRetryPolicy.minDelayTarget;
      const maxDelayTarget = healthyRetryPolicy.maxDelayTarget;
      if (minDelayTarget !== undefined) {
        if (minDelayTarget.toMilliseconds() % 1000 !== 0) {
          throw new ValidationError(`minDelayTarget must be a whole number of seconds, got: ${minDelayTarget}`, this);
        }
        const minDelayTargetSecs = minDelayTarget.toSeconds();
        if (minDelayTargetSecs < 1 || minDelayTargetSecs > delayTargetLimitSecs) {
          throw new ValidationError(`minDelayTarget must be between 1 and ${delayTargetLimitSecs} seconds inclusive, got: ${minDelayTargetSecs}s`, this);
        }
      }
      if (maxDelayTarget !== undefined) {
        if (maxDelayTarget.toMilliseconds() % 1000 !== 0) {
          throw new ValidationError(`maxDelayTarget must be a whole number of seconds, got: ${maxDelayTarget}`, this);
        }
        const maxDelayTargetSecs = maxDelayTarget.toSeconds();
        if (maxDelayTargetSecs < 1 || maxDelayTargetSecs > delayTargetLimitSecs) {
          throw new ValidationError(`maxDelayTarget must be between 1 and ${delayTargetLimitSecs} seconds inclusive, got: ${maxDelayTargetSecs}s`, this);
        }
        if ((minDelayTarget !== undefined) && minDelayTarget.toSeconds() > maxDelayTargetSecs) {
          throw new ValidationError('minDelayTarget must not exceed maxDelayTarget', this);
        }
      }

      const numRetriesLimit = 100;
      if (healthyRetryPolicy.numRetries && (healthyRetryPolicy.numRetries < 0 || healthyRetryPolicy.numRetries > numRetriesLimit)) {
        throw new ValidationError(`numRetries must be between 0 and ${numRetriesLimit} inclusive, got: ${healthyRetryPolicy.numRetries}`, this);
      }
      const { numNoDelayRetries, numMinDelayRetries, numMaxDelayRetries } = healthyRetryPolicy;
      if (numNoDelayRetries && (numNoDelayRetries < 0 || !Number.isInteger(numNoDelayRetries))) {
        throw new ValidationError(`numNoDelayRetries must be an integer zero or greater, got: ${numNoDelayRetries}`, this);
      }
      if (numMinDelayRetries && (numMinDelayRetries < 0 || !Number.isInteger(numMinDelayRetries))) {
        throw new ValidationError(`numMinDelayRetries must be an integer zero or greater, got: ${numMinDelayRetries}`, this);
      }
      if (numMaxDelayRetries && (numMaxDelayRetries < 0 || !Number.isInteger(numMaxDelayRetries))) {
        throw new ValidationError(`numMaxDelayRetries must be an integer zero or greater, got: ${numMaxDelayRetries}`, this);
      }
    }
    if (throttlePolicy) {
      const maxReceivesPerSecond = throttlePolicy.maxReceivesPerSecond;
      if (maxReceivesPerSecond !== undefined && (maxReceivesPerSecond < 1 || !Number.isInteger(maxReceivesPerSecond))) {
        throw new ValidationError(`maxReceivesPerSecond must be an integer greater than zero, got: ${maxReceivesPerSecond}`, this);
      }
    }
    return {
      healthyRetryPolicy: healthyRetryPolicy ? {
        // minDelayTarget, maxDelayTarget and numRetries are (empirically) mandatory when healthyRetryPolicy is specified,
        // but for user-friendliness we allow them to be undefined and set them here instead.
        // The defaults we use here are the same used in the event healthyRetryPolicy is not specified, see https://docs.aws.amazon.com/sns/latest/dg/creating-delivery-policy.html.
        minDelayTarget: (healthyRetryPolicy.minDelayTarget === undefined) ? 20 : healthyRetryPolicy.minDelayTarget.toSeconds(),
        maxDelayTarget: (healthyRetryPolicy.maxDelayTarget === undefined) ? 20 : healthyRetryPolicy.maxDelayTarget.toSeconds(),
        numRetries: (healthyRetryPolicy.numRetries === undefined) ? 3: healthyRetryPolicy.numRetries,
        numNoDelayRetries: healthyRetryPolicy.numNoDelayRetries,
        numMinDelayRetries: healthyRetryPolicy.numMinDelayRetries,
        numMaxDelayRetries: healthyRetryPolicy.numMaxDelayRetries,
        backoffFunction: healthyRetryPolicy.backoffFunction,
      }: undefined,
      throttlePolicy: deliveryPolicy.throttlePolicy ? {
        maxReceivesPerSecond: deliveryPolicy.throttlePolicy.maxReceivesPerSecond,
      }: undefined,
      requestPolicy: deliveryPolicy.requestPolicy ? {
        headerContentType: deliveryPolicy.requestPolicy.headerContentType,
      }: undefined,
    };
  }