{
  "schema": "https://ai-atoms.com/schemas/skill-v1.json",
  "type": "skill",
  "id": "skill/azure-servicebus-ts",
  "version": "1.0.0",
  "name": "Azure Servicebus Ts",
  "description": "Build messaging applications using Azure Service Bus SDK for JavaScript (@azure/service-bus). Use when implementing queues, topics/subscriptions, message sessions, dead-letter handling, or enterpri...",
  "system_prompt_fragment": "# Azure Service Bus SDK for TypeScript\n\nEnterprise messaging with queues, topics, and subscriptions.\n\n## Installation\n\n```bash\nnpm install @azure/service-bus @azure/identity\n```\n\n## Environment Variables\n\n```bash\nSERVICEBUS_NAMESPACE=<namespace>.servicebus.windows.net\nSERVICEBUS_QUEUE_NAME=my-queue\nSERVICEBUS_TOPIC_NAME=my-topic\nSERVICEBUS_SUBSCRIPTION_NAME=my-subscription\n```\n\n## Authentication\n\n```typescript\nimport { ServiceBusClient } from \"@azure/service-bus\";\nimport { DefaultAzureCredential } from \"@azure/identity\";\n\nconst fullyQualifiedNamespace = process.env.SERVICEBUS_NAMESPACE!;\nconst client = new ServiceBusClient(fullyQualifiedNamespace, new DefaultAzureCredential());\n```\n\n## Core Workflow\n\n### Send Messages to Queue\n\n```typescript\nconst sender = client.createSender(\"my-queue\");\n\n// Single message\nawait sender.sendMessages({\n  body: { orderId: \"12345\", amount: 99.99 },\n  contentType: \"application/json\",\n});\n\n// Batch messages\nconst batch = await sender.createMessageBatch();\nbatch.tryAddMessage({ body: \"Message 1\" });\nbatch.tryAddMessage({ body: \"Message 2\" });\nawait sender.sendMessages(batch);\n\nawait sender.close();\n```\n\n### Receive Messages from Queue\n\n```typescript\nconst receiver = client.createReceiver(\"my-queue\");\n\n// Receive batch\nconst messages = await receiver.receiveMessages(10, { maxWaitTimeInMs: 5000 });\nfor (const message of messages) {\n  console.log(`Received: ${message.body}`);\n  await receiver.completeMessage(message);\n}\n\nawait receiver.close();\n```\n\n### Subscribe to Messages (Event-Driven)\n\n```typescript\nconst receiver = client.createReceiver(\"my-queue\");\n\nconst subscription = receiver.subscribe({\n  processMessage: async (message) => {\n    console.log(`Processing: ${message.body}`);\n    // Message auto-completed on success\n  },\n  processError: async (args) => {\n    console.error(`Error: ${args.error}`);\n  },\n});\n\n// Stop after some time\nsetTimeout(async () => {\n  await subscription.close();\n  await receiver.close();\n}, 60000);\n```\n\n### Topics and Subscriptions\n\n```typescript\n// Send to topic\nconst topicSender = client.createSender(\"my-topic\");\nawait topicSender.sendMessages({\n  body: { event: \"order.created\", data: { orderId: \"123\" } },\n  applicationProperties: { eventType: \"order.created\" },\n});\n\n// Receive from subscription\nconst subscriptionReceiver = client.createReceiver(\"my-topic\", \"my-subscription\");\nconst messages = await subscriptionReceiver.receiveMessages(10);\n```\n\n## Message Sessions\n\n```typescript\n// Send session message\nconst sender = client.createSender(\"session-queue\");\nawait sender.sendMessages({\n  body: { step: 1, data: \"First step\" },\n  sessionId: \"workflow-123\",\n});\n\n// Receive session messages\nconst sessionReceiver = await client.acceptSession(\"session-queue\", \"workflow-123\");\nconst messages = await sessionReceiver.receiveMessages(10);\n\n// Get/set session state\nconst state = await sessionReceiver.getSessionState();\nawait sessionReceiver.setSessionState(Buffer.from(JSON.stringify({ progress: 50 })));\n\nawait sessionReceiver.close();\n```\n\n## Dead-Letter Handling\n\n```typescript\n// Move to dead-letter\nawait receiver.deadLetterMessage(message, {\n  deadLetterReason: \"Validation failed\",\n  deadLetterErrorDescription: \"Missing required field: orderId\",\n});\n\n// Process dead-letter queue\nconst dlqReceiver = client.createReceiver(\"my-queue\", { subQueueType: \"deadLetter\" });\nconst dlqMessages = await dlqReceiver.receiveMessages(10);\nfor (const msg of dlqMessages) {\n  console.log(`DLQ Reason: ${msg.deadLetterReason}`);\n  // Reprocess or log\n  await dlqReceiver.completeMessage(msg);\n}\n```\n\n## Scheduled Messages\n\n```typescript\nconst sender = client.createSender(\"my-queue\");\n\n// Schedule for future delivery\nconst scheduledTime = new Date(Date.now() + 60000); // 1 minute from now\nconst sequenceNumber = await sender.scheduleMessages(\n  { body: \"Delayed message\" },\n  scheduledTime\n);\n\n// Cancel scheduled message\nawait sender.cancelScheduledMessages(sequenceNumber);\n```\n\n## Message Deferral\n\n```typescript\n// Defer message for later\nawait receiver.deferMessage(message);\n\n// Receive deferred message by sequence number\nconst deferredMessage = await receiver.receiveDeferredMessages(message.sequenceNumber!);\nawait receiver.completeMessage(deferredMessage[0]);\n```\n\n## Peek Messages (Non-Destructive)\n\n```typescript\nconst receiver = client.createReceiver(\"my-queue\");\n\n// Peek without removing\nconst peekedMessages = await receiver.peekMessages(10);\nfor (const msg of peekedMessages) {\n  console.log(`Peeked: ${msg.body}`);\n}\n```\n\n## Key Types\n\n```typescript\nimport {\n  ServiceBusClient,\n  ServiceBusSender,\n  ServiceBusReceiver,\n  ServiceBusSessionReceiver,\n  ServiceBusMessage,\n  ServiceBusReceivedMessage,\n  ProcessMessageCallback,\n  ProcessErrorCallback,\n} from \"@azure/service-bus\";\n```\n\n## Receive Modes\n\n```typescript\n// Peek-Lock (default) - message locked until completed/abandoned\nconst receiver = client.createReceiver(\"my-queue\", { receiveMode: \"peekLock\" });\nawait receiver.completeMessage(message);   // Remove from queue\nawait receiver.abandonMessage(message);    // Return to queue\nawait receiver.deferMessage(message);      // Defer for later\nawait receiver.deadLetterMessage(message); // Move to DLQ\n\n// Receive-and-Delete - message removed immediately\nconst receiver = client.createReceiver(\"my-queue\", { receiveMode: \"receiveAndDelete\" });\n```\n\n## Best Practices\n\n1. **Use Entra ID auth** - Avoid connection strings in production\n2. **Reuse clients** - Create `ServiceBusClient` once, share across senders/receivers\n3. **Close resources** - Always close senders/receivers when done\n4. **Handle errors** - Implement `processError` callback for subscription receivers\n5. **Use sessions for ordering** - When message order matters within a group\n6. **Configure dead-letter** - Always handle DLQ messages\n7. **Batch sends** - Use `createMessageBatch()` for multiple messages\n\n## Reference Documentation\n\nFor detailed patterns, see:\n\n- Queues vs Topics Patterns - Queue/topic patterns, sessions, receive modes, message settlement\n- Error Handling and Reliability - ServiceBusError codes, DLQ handling, lock renewal, graceful shutdown\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.",
  "applicable_domains": [
    "devops"
  ],
  "category": "devops",
  "invocation": [
    "/azure-servicebus-ts"
  ],
  "authored_by": "claudeskills.in community",
  "source_url": "https://claudeskills.in/skill/azure-servicebus-ts",
  "provenance": {
    "source": "claudeskills.in",
    "source_url": "https://claudeskills.in/skill/azure-servicebus-ts",
    "license": "unknown",
    "imported_at": "2026-09-03",
    "notes": "Aggregated by claudeskills.in from community GitHub lists."
  },
  "tags": [
    "claudeskills",
    "devops"
  ],
  "lifecycle": "draft"
}