in packages/aws-cdk-lib/aws-sns/lib/topic.ts [294:378]
constructor(scope: Construct, id: string, props: TopicProps = {}) {
super(scope, id, {
physicalName: props.topicName,
});
// Enhanced CDK Analytics Telemetry
addConstructMetadata(this, props);
this.enforceSSL = props.enforceSSL;
if (props.contentBasedDeduplication && !props.fifo) {
throw new ValidationError('Content based deduplication can only be enabled for FIFO SNS topics.', this);
}
if (props.messageRetentionPeriodInDays && !props.fifo) {
throw new ValidationError('`messageRetentionPeriodInDays` is only valid for FIFO SNS topics.', this);
}
if (props.fifoThroughputScope && !props.fifo) {
throw new ValidationError('`fifoThroughputScope` can only be set for FIFO SNS topics.', this);
}
if (
props.messageRetentionPeriodInDays !== undefined
&& !Token.isUnresolved(props.messageRetentionPeriodInDays)
&& (!Number.isInteger(props.messageRetentionPeriodInDays) || props.messageRetentionPeriodInDays > 365 || props.messageRetentionPeriodInDays < 1)
) {
throw new ValidationError('`messageRetentionPeriodInDays` must be an integer between 1 and 365', this);
}
if (props.loggingConfigs) {
props.loggingConfigs.forEach(c => this.addLoggingConfig(c));
}
let cfnTopicName: string;
if (props.fifo && props.topicName && !props.topicName.endsWith('.fifo')) {
cfnTopicName = this.physicalName + '.fifo';
} else if (props.fifo && !props.topicName) {
// Max length allowed by CloudFormation is 256, we subtract 5 to allow for ".fifo" suffix
const prefixName = Names.uniqueResourceName(this, {
maxLength: 256 - 5,
separator: '-',
});
cfnTopicName = `${prefixName}.fifo`;
} else {
cfnTopicName = this.physicalName;
}
if (
props.signatureVersion &&
!Token.isUnresolved(props.signatureVersion) &&
props.signatureVersion !== '1' &&
props.signatureVersion !== '2'
) {
throw new ValidationError(`signatureVersion must be "1" or "2", received: "${props.signatureVersion}"`, this);
}
if (props.displayName && !Token.isUnresolved(props.displayName) && props.displayName.length > 100) {
throw new ValidationError(`displayName must be less than or equal to 100 characters, got ${props.displayName.length}`, this);
}
const resource = new CfnTopic(this, 'Resource', {
archivePolicy: props.messageRetentionPeriodInDays ? {
MessageRetentionPeriod: props.messageRetentionPeriodInDays,
} : undefined,
displayName: props.displayName,
topicName: cfnTopicName,
kmsMasterKeyId: props.masterKey && props.masterKey.keyArn,
contentBasedDeduplication: props.contentBasedDeduplication,
fifoTopic: props.fifo,
signatureVersion: props.signatureVersion,
deliveryStatusLogging: Lazy.any({ produce: () => this.renderLoggingConfigs() }, { omitEmptyArray: true }),
tracingConfig: props.tracingConfig,
fifoThroughputScope: props.fifoThroughputScope,
});
this.topicArn = this.getResourceArnAttribute(resource.ref, {
service: 'sns',
resource: this.physicalName,
});
this.topicName = this.getResourceNameAttribute(resource.attrTopicName);
this.masterKey = props.masterKey;
this.fifo = props.fifo || false;
this.contentBasedDeduplication = props.contentBasedDeduplication || false;
if (this.enforceSSL) {
this.addSSLPolicy();
}
}