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,
};
}