/** * ServiceBusPipeline composite — ServiceBus Namespace with Queue or Topic. * * Creates a ServiceBus Namespace and either a Queue (default) or a * Topic + Subscription. Enforces TLS 1.2 and Standard SKU. */ import { Composite, mergeDefaults } from "@intentius/chant"; import { ServiceBusNamespace, namespaces_queues, Sbnamespaces_topics, namespaces_topics_subscriptions, } from "../generated"; export interface ServiceBusPipelineProps { /** Namespace name. */ name: string; /** Azure region (default: resource group location). */ location?: string; /** Queue or topic name (default: "{name}-queue"). */ entityName?: string; /** Use topic+subscription instead of a queue (default: false). */ useTopic?: boolean; /** Subscription name when useTopic is true (default: "{entityName}-sub"). */ subscriptionName?: string; /** Resource tags. */ tags?: Record; /** Per-member defaults. */ defaults?: { namespace?: Partial[0]>; queue?: Partial[0]>; topic?: Partial[0]>; subscription?: Partial[0]>; }; } export interface ServiceBusPipelineResult { namespace: InstanceType; queue?: InstanceType; topic?: InstanceType; subscription?: InstanceType; } export const ServiceBusPipeline = Composite((props: ServiceBusPipelineProps) => { const { name, location = "[resourceGroup().location]", useTopic = false, tags = {}, defaults, } = props; const entityName = props.entityName ?? (useTopic ? `${name}-topic` : `${name}-queue`); const subscriptionName = props.subscriptionName ?? `${entityName}-sub`; const mergedTags = { "managed-by": "chant", ...tags }; const namespace = new ServiceBusNamespace(mergeDefaults({ name, location, tags: mergedTags, sku: { name: "Standard", tier: "Standard" }, minimumTlsVersion: "1.2", }, defaults?.namespace), { apiVersion: "2022-10-01-preview" }); if (useTopic) { const topic = new Sbnamespaces_topics(mergeDefaults({ name: `${name}/${entityName}`, maxSizeInMegabytes: 1024, }, defaults?.topic), { apiVersion: "2022-10-01-preview", DependsOn: [ `[resourceId('Microsoft.ServiceBus/namespaces', '${name}')]`, ], }); const subscription = new namespaces_topics_subscriptions(mergeDefaults({ name: `${name}/${entityName}/${subscriptionName}`, maxDeliveryCount: 10, }, defaults?.subscription), { apiVersion: "2022-10-01-preview", DependsOn: [ `[resourceId('Microsoft.ServiceBus/namespaces/topics', '${name}', '${entityName}')]`, ], }); return { namespace, topic, subscription } as any; } const queue = new namespaces_queues(mergeDefaults({ name: `${name}/${entityName}`, maxSizeInMegabytes: 1024, lockDuration: "PT1M", maxDeliveryCount: 10, }, defaults?.queue), { apiVersion: "2022-10-01-preview", DependsOn: [ `[resourceId('Microsoft.ServiceBus/namespaces', '${name}')]`, ], }); return { namespace, queue } as any; }, "ServiceBusPipeline");