[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71BHKCDCZFDDMQNFBE48CPW":3,"skill-same:01M71BHKCDCZFDDMQNFBE48CPW":76},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":55,"install":56,"resources":69},"01M71BHKCDCZFDDMQNFBE48CPW","azure-storage-queue-ts",null,"Azure Queue Storage JavaScript\u002FTypeScript SDK (@azure\u002Fstorage-queue) for message queue operations. Use for sending, receiving, peeking, and deleting messages in queues. Supports visibility timeout, message encoding, and batch operations. Triggers: \"queue storage\", \"@azure\u002Fstorage-queue\", \"QueueServiceClient\", \"QueueClient\", \"send message\", \"receive message\", \"dequeue\", \"visibility timeout\".","strmt7\u002Fai_skills_collection_benchmarked","strmt7","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F28989754?v=4","01M71929P914SWKQ7QJV24NBBY","Stratos","01M71929Q9VGKQ7PWYR95VSQQQ",1,"MIT","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Fcloud-azure-microsoft-sdks\u002Fofficial-vendor-reference\u002Fazure-storage-queue-ts\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"storage","azure storage","azure","queue","azure storage queue ts","microsoft","sdk","operations","javascript","use","triggers","for","queues","azure queue storage","typescript","message","batch","send","messages","send message","2026-11-10 10:12:30",false,"---\nname: azure-storage-queue-ts\ndescription: |\n  Azure Queue Storage JavaScript\u002FTypeScript SDK (@azure\u002Fstorage-queue) for message queue operations. Use for sending, receiving, peeking, and deleting messages in queues. Supports visibility timeout, message encoding, and batch operations. Triggers: \"queue storage\", \"@azure\u002Fstorage-queue\", \"QueueServiceClient\", \"QueueClient\", \"send message\", \"receive message\", \"dequeue\", \"visibility timeout\".\nlicense: MIT\nmetadata:\n  author: Microsoft\n  version: \"1.0.0\"\n  package: '@azure\u002Fstorage-queue'\n---\n\n# @azure\u002Fstorage-queue (TypeScript\u002FJavaScript)\n\nSDK for Azure Queue Storage operations — send, receive, peek, and manage messages in queues.\n\n## Installation\n\n```bash\nnpm install @azure\u002Fstorage-queue @azure\u002Fidentity\n```\n\n**Current Version**: 12.x\n**Node.js**: >= 18.0.0\n\n## Environment Variables\n\n```bash\nAZURE_STORAGE_ACCOUNT_NAME=\u003Caccount-name>\nAZURE_STORAGE_ACCOUNT_KEY=\u003Caccount-key>\n# OR connection string\nAZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...\n```\n\n## Authentication\n\n### DefaultAzureCredential (Recommended)\n\n```typescript\nimport { QueueServiceClient } from \"@azure\u002Fstorage-queue\";\nimport { DefaultAzureCredential } from \"@azure\u002Fidentity\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst client = new QueueServiceClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net`,\n  new DefaultAzureCredential()\n);\n```\n\n### Connection String\n\n```typescript\nimport { QueueServiceClient } from \"@azure\u002Fstorage-queue\";\n\nconst client = QueueServiceClient.fromConnectionString(\n  process.env.AZURE_STORAGE_CONNECTION_STRING!\n);\n```\n\n### StorageSharedKeyCredential (Node.js only)\n\n```typescript\nimport { QueueServiceClient, StorageSharedKeyCredential } from \"@azure\u002Fstorage-queue\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY!;\n\nconst sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\nconst client = new QueueServiceClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net`,\n  sharedKeyCredential\n);\n```\n\n### SAS Token\n\n```typescript\nimport { QueueServiceClient } from \"@azure\u002Fstorage-queue\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst sasToken = process.env.AZURE_STORAGE_SAS_TOKEN!;\n\nconst client = new QueueServiceClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net${sasToken}`\n);\n```\n\n## Client Hierarchy\n\n```\nQueueServiceClient (account level)\n└── QueueClient (queue level)\n    └── Messages (send, receive, peek, delete)\n```\n\n## Queue Operations\n\n### Create Queue\n\n```typescript\nconst queueClient = client.getQueueClient(\"my-queue\");\nawait queueClient.create();\n\n\u002F\u002F Or create if not exists\nawait queueClient.createIfNotExists();\n```\n\n### List Queues\n\n```typescript\nfor await (const queue of client.listQueues()) {\n  console.log(queue.name);\n}\n\n\u002F\u002F With prefix filter\nfor await (const queue of client.listQueues({ prefix: \"task-\" })) {\n  console.log(queue.name);\n}\n```\n\n### Delete Queue\n\n```typescript\nawait queueClient.delete();\n\n\u002F\u002F Or delete if exists\nawait queueClient.deleteIfExists();\n```\n\n### Get Queue Properties\n\n```typescript\nconst properties = await queueClient.getProperties();\nconsole.log(\"Approximate message count:\", properties.approximateMessagesCount);\nconsole.log(\"Metadata:\", properties.metadata);\n```\n\n### Set Queue Metadata\n\n```typescript\nawait queueClient.setMetadata({\n  department: \"engineering\",\n  priority: \"high\",\n});\n```\n\n## Message Operations\n\n### Send Message\n\n```typescript\nconst queueClient = client.getQueueClient(\"my-queue\");\n\n\u002F\u002F Simple message\nawait queueClient.sendMessage(\"Hello, World!\");\n\n\u002F\u002F With options\nawait queueClient.sendMessage(\"Delayed message\", {\n  visibilityTimeout: 60, \u002F\u002F Hidden for 60 seconds\n  messageTimeToLive: 3600, \u002F\u002F Expires in 1 hour\n});\n\n\u002F\u002F JSON message (must be string)\nconst task = { type: \"process\", data: { id: 123 } };\nawait queueClient.sendMessage(JSON.stringify(task));\n```\n\n### Receive Messages\n\n```typescript\n\u002F\u002F Receive up to 32 messages (default: 1)\nconst response = await queueClient.receiveMessages({\n  numberOfMessages: 10,\n  visibilityTimeout: 30, \u002F\u002F 30 seconds to process\n});\n\nfor (const message of response.receivedMessageItems) {\n  console.log(\"Message ID:\", message.messageId);\n  console.log(\"Content:\", message.messageText);\n  console.log(\"Dequeue Count:\", message.dequeueCount);\n  console.log(\"Pop Receipt:\", message.popReceipt);\n\n  \u002F\u002F Process the message...\n\n  \u002F\u002F Delete after processing\n  await queueClient.deleteMessage(message.messageId, message.popReceipt);\n}\n```\n\n### Peek Messages\n\nPeek without removing from queue (no visibility timeout).\n\n```typescript\nconst response = await queueClient.peekMessages({\n  numberOfMessages: 5,\n});\n\nfor (const message of response.peekedMessageItems) {\n  console.log(\"Message ID:\", message.messageId);\n  console.log(\"Content:\", message.messageText);\n  \u002F\u002F Note: No popReceipt - cannot delete peeked messages\n}\n```\n\n### Update Message\n\nExtend visibility timeout or update content.\n\n```typescript\n\u002F\u002F Receive a message\nconst response = await queueClient.receiveMessages();\nconst message = response.receivedMessageItems[0];\n\nif (message) {\n  \u002F\u002F Update content and extend visibility\n  const updateResponse = await queueClient.updateMessage(\n    message.messageId,\n    message.popReceipt,\n    \"Updated content\",\n    60 \u002F\u002F New visibility timeout in seconds\n  );\n\n  \u002F\u002F Use new popReceipt for subsequent operations\n  console.log(\"New pop receipt:\", updateResponse.popReceipt);\n}\n```\n\n### Delete Message\n\n```typescript\n\u002F\u002F After receiving\nconst response = await queueClient.receiveMessages();\nconst message = response.receivedMessageItems[0];\n\nif (message) {\n  await queueClient.deleteMessage(message.messageId, message.popReceipt);\n}\n```\n\n### Clear All Messages\n\n```typescript\nawait queueClient.clearMessages();\n```\n\n## Message Processing Patterns\n\n### Basic Worker Pattern\n\n```typescript\nasync function processQueue(queueClient: QueueClient): Promise\u003Cvoid> {\n  while (true) {\n    const response = await queueClient.receiveMessages({\n      numberOfMessages: 10,\n      visibilityTimeout: 30,\n    });\n\n    if (response.receivedMessageItems.length === 0) {\n      \u002F\u002F No messages, wait before polling again\n      await sleep(5000);\n      continue;\n    }\n\n    for (const message of response.receivedMessageItems) {\n      try {\n        await processMessage(message.messageText);\n        await queueClient.deleteMessage(message.messageId, message.popReceipt);\n      } catch (error) {\n        console.error(`Failed to process message ${message.messageId}:`, error);\n        \u002F\u002F Message will become visible again after timeout\n      }\n    }\n  }\n}\n\nasync function processMessage(content: string): Promise\u003Cvoid> {\n  const task = JSON.parse(content);\n  \u002F\u002F Process task...\n}\n\nfunction sleep(ms: number): Promise\u003Cvoid> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n```\n\n### Poison Message Handling\n\n```typescript\nconst MAX_DEQUEUE_COUNT = 5;\n\nasync function processWithPoisonHandling(\n  queueClient: QueueClient,\n  poisonQueueClient: QueueClient\n): Promise\u003Cvoid> {\n  const response = await queueClient.receiveMessages({\n    numberOfMessages: 10,\n    visibilityTimeout: 30,\n  });\n\n  for (const message of response.receivedMessageItems) {\n    if (message.dequeueCount > MAX_DEQUEUE_COUNT) {\n      \u002F\u002F Move to poison queue\n      await poisonQueueClient.sendMessage(message.messageText);\n      await queueClient.deleteMessage(message.messageId, message.popReceipt);\n      console.log(`Moved message ${message.messageId} to poison queue`);\n      continue;\n    }\n\n    try {\n      await processMessage(message.messageText);\n      await queueClient.deleteMessage(message.messageId, message.popReceipt);\n    } catch (error) {\n      console.error(`Processing failed (attempt ${message.dequeueCount}):`, error);\n    }\n  }\n}\n```\n\n### Batch Processing with Visibility Extension\n\n```typescript\nasync function processBatchWithExtension(queueClient: QueueClient): Promise\u003Cvoid> {\n  const response = await queueClient.receiveMessages({\n    numberOfMessages: 1,\n    visibilityTimeout: 60,\n  });\n\n  const message = response.receivedMessageItems[0];\n  if (!message) return;\n\n  let popReceipt = message.popReceipt;\n\n  \u002F\u002F Start visibility extension timer\n  const extensionInterval = setInterval(async () => {\n    try {\n      const updateResponse = await queueClient.updateMessage(\n        message.messageId,\n        popReceipt,\n        message.messageText,\n        60 \u002F\u002F Extend by another 60 seconds\n      );\n      popReceipt = updateResponse.popReceipt;\n    } catch (error) {\n      console.error(\"Failed to extend visibility:\", error);\n    }\n  }, 45000); \u002F\u002F Extend every 45 seconds\n\n  try {\n    await longRunningProcess(message.messageText);\n    await queueClient.deleteMessage(message.messageId, popReceipt);\n  } finally {\n    clearInterval(extensionInterval);\n  }\n}\n```\n\n## Message Encoding\n\nBy default, messages are Base64 encoded. You can customize this:\n\n```typescript\nimport { QueueClient } from \"@azure\u002Fstorage-queue\";\n\n\u002F\u002F Custom encoder\u002Fdecoder for plain text\nconst queueClient = new QueueClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net\u002Fmy-queue`,\n  credential,\n  {\n    messageEncoding: \"text\", \u002F\u002F \"base64\" (default) or \"text\"\n  }\n);\n\n\u002F\u002F Or with custom encoder\nconst customQueueClient = new QueueClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net\u002Fmy-queue`,\n  credential,\n  {\n    messageEncoding: {\n      encode: (message: string) => Buffer.from(message).toString(\"base64\"),\n      decode: (message: string) => Buffer.from(message, \"base64\").toString(),\n    },\n  }\n);\n```\n\n## SAS Token Generation (Node.js only)\n\n### Generate Queue SAS\n\n```typescript\nimport {\n  QueueSASPermissions,\n  generateQueueSASQueryParameters,\n  StorageSharedKeyCredential,\n} from \"@azure\u002Fstorage-queue\";\n\nconst sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\n\nconst sasToken = generateQueueSASQueryParameters(\n  {\n    queueName: \"my-queue\",\n    permissions: QueueSASPermissions.parse(\"raup\"), \u002F\u002F read, add, update, process\n    startsOn: new Date(),\n    expiresOn: new Date(Date.now() + 3600 * 1000), \u002F\u002F 1 hour\n  },\n  sharedKeyCredential\n).toString();\n\nconst sasUrl = `https:\u002F\u002F${accountName}.queue.core.windows.net\u002Fmy-queue?${sasToken}`;\n```\n\n### Generate Account SAS\n\n```typescript\nimport {\n  AccountSASPermissions,\n  AccountSASResourceTypes,\n  AccountSASServices,\n  generateAccountSASQueryParameters,\n} from \"@azure\u002Fstorage-queue\";\n\nconst sasToken = generateAccountSASQueryParameters(\n  {\n    services: AccountSASServices.parse(\"q\").toString(), \u002F\u002F queue\n    resourceTypes: AccountSASResourceTypes.parse(\"sco\").toString(),\n    permissions: AccountSASPermissions.parse(\"rwdlacupi\"),\n    expiresOn: new Date(Date.now() + 24 * 3600 * 1000),\n  },\n  sharedKeyCredential\n).toString();\n```\n\n## Error Handling\n\n```typescript\nimport { RestError } from \"@azure\u002Fstorage-queue\";\n\ntry {\n  await queueClient.sendMessage(\"test\");\n} catch (error) {\n  if (error instanceof RestError) {\n    switch (error.statusCode) {\n      case 404:\n        console.log(\"Queue not found\");\n        break;\n      case 400:\n        console.log(\"Bad request - message too large or invalid\");\n        break;\n      case 403:\n        console.log(\"Access denied\");\n        break;\n      case 409:\n        console.log(\"Queue already exists or being deleted\");\n        break;\n      default:\n        console.error(`Storage error ${error.statusCode}: ${error.message}`);\n    }\n  }\n  throw error;\n}\n```\n\n## TypeScript Types Reference\n\n```typescript\nimport {\n  \u002F\u002F Clients\n  QueueServiceClient,\n  QueueClient,\n\n  \u002F\u002F Authentication\n  StorageSharedKeyCredential,\n  AnonymousCredential,\n\n  \u002F\u002F SAS\n  QueueSASPermissions,\n  AccountSASPermissions,\n  AccountSASServices,\n  AccountSASResourceTypes,\n  generateQueueSASQueryParameters,\n  generateAccountSASQueryParameters,\n\n  \u002F\u002F Messages\n  DequeuedMessageItem,\n  PeekedMessageItem,\n  QueueSendMessageResponse,\n  QueueReceiveMessageResponse,\n  QueueUpdateMessageResponse,\n\n  \u002F\u002F Queue\n  QueueItem,\n  QueueGetPropertiesResponse,\n\n  \u002F\u002F Errors\n  RestError,\n} from \"@azure\u002Fstorage-queue\";\n```\n\n## Message Limits\n\n| Limit | Value |\n|-------|-------|\n| Max message size | 64 KB |\n| Max visibility timeout | 7 days |\n| Max time-to-live | 7 days (or -1 for infinite) |\n| Max messages per receive | 32 |\n| Default visibility timeout | 30 seconds |\n\n## Best Practices\n\n1. **Use DefaultAzureCredential** — Prefer AAD over connection strings\u002Fkeys\n2. **Always delete after processing** — Prevent duplicate processing\n3. **Handle poison messages** — Move failed messages to a dead-letter queue\n4. **Use appropriate visibility timeout** — Set based on expected processing time\n5. **Extend visibility for long tasks** — Update message to prevent timeout\n6. **Use JSON for structured data** — Serialize objects to JSON strings\n7. **Check dequeueCount** — Detect repeatedly failing messages\n8. **Use batch receive** — Receive multiple messages for efficiency\n\n## Platform Differences\n\n| Feature | Node.js | Browser |\n|---------|---------|---------|\n| `StorageSharedKeyCredential` | ✅ | ❌ |\n| SAS generation | ✅ | ❌ |\n| DefaultAzureCredential | ✅ | ❌ |\n| Anonymous\u002FSAS access | ✅ | ✅ |\n| All message operations | ✅ | ✅ |\n","# @azure\u002Fstorage-queue (TypeScript\u002FJavaScript)\n\nSDK for Azure Queue Storage operations — send, receive, peek, and manage messages in queues.\n\n## Installation\n\n```bash\nnpm install @azure\u002Fstorage-queue @azure\u002Fidentity\n```\n\n**Current Version**: 12.x\n**Node.js**: >= 18.0.0\n\n## Environment Variables\n\n```bash\nAZURE_STORAGE_ACCOUNT_NAME=\u003Caccount-name>\nAZURE_STORAGE_ACCOUNT_KEY=\u003Caccount-key>\n# OR connection string\nAZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...\n```\n\n## Authentication\n\n### DefaultAzureCredential (Recommended)\n\n```typescript\nimport { QueueServiceClient } from \"@azure\u002Fstorage-queue\";\nimport { DefaultAzureCredential } from \"@azure\u002Fidentity\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst client = new QueueServiceClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net`,\n  new DefaultAzureCredential()\n);\n```\n\n### Connection String\n\n```typescript\nimport { QueueServiceClient } from \"@azure\u002Fstorage-queue\";\n\nconst client = QueueServiceClient.fromConnectionString(\n  process.env.AZURE_STORAGE_CONNECTION_STRING!\n);\n```\n\n### StorageSharedKeyCredential (Node.js only)\n\n```typescript\nimport { QueueServiceClient, StorageSharedKeyCredential } from \"@azure\u002Fstorage-queue\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY!;\n\nconst sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\nconst client = new QueueServiceClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net`,\n  sharedKeyCredential\n);\n```\n\n### SAS Token\n\n```typescript\nimport { QueueServiceClient } from \"@azure\u002Fstorage-queue\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst sasToken = process.env.AZURE_STORAGE_SAS_TOKEN!;\n\nconst client = new QueueServiceClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net${sasToken}`\n);\n```\n\n## Client Hierarchy\n\n```\nQueueServiceClient (account level)\n└── QueueClient (queue level)\n    └── Messages (send, receive, peek, delete)\n```\n\n## Queue Operations\n\n### Create Queue\n\n```typescript\nconst queueClient = client.getQueueClient(\"my-queue\");\nawait queueClient.create();\n\n\u002F\u002F Or create if not exists\nawait queueClient.createIfNotExists();\n```\n\n### List Queues\n\n```typescript\nfor await (const queue of client.listQueues()) {\n  console.log(queue.name);\n}\n\n\u002F\u002F With prefix filter\nfor await (const queue of client.listQueues({ prefix: \"task-\" })) {\n  console.log(queue.name);\n}\n```\n\n### Delete Queue\n\n```typescript\nawait queueClient.delete();\n\n\u002F\u002F Or delete if exists\nawait queueClient.deleteIfExists();\n```\n\n### Get Queue Properties\n\n```typescript\nconst properties = await queueClient.getProperties();\nconsole.log(\"Approximate message count:\", properties.approximateMessagesCount);\nconsole.log(\"Metadata:\", properties.metadata);\n```\n\n### Set Queue Metadata\n\n```typescript\nawait queueClient.setMetadata({\n  department: \"engineering\",\n  priority: \"high\",\n});\n```\n\n## Message Operations\n\n### Send Message\n\n```typescript\nconst queueClient = client.getQueueClient(\"my-queue\");\n\n\u002F\u002F Simple message\nawait queueClient.sendMessage(\"Hello, World!\");\n\n\u002F\u002F With options\nawait queueClient.sendMessage(\"Delayed message\", {\n  visibilityTimeout: 60, \u002F\u002F Hidden for 60 seconds\n  messageTimeToLive: 3600, \u002F\u002F Expires in 1 hour\n});\n\n\u002F\u002F JSON message (must be string)\nconst task = { type: \"process\", data: { id: 123 } };\nawait queueClient.sendMessage(JSON.stringify(task));\n```\n\n### Receive Messages\n\n```typescript\n\u002F\u002F Receive up to 32 messages (default: 1)\nconst response = await queueClient.receiveMessages({\n  numberOfMessages: 10,\n  visibilityTimeout: 30, \u002F\u002F 30 seconds to process\n});\n\nfor (const message of response.receivedMessageItems) {\n  console.log(\"Message ID:\", message.messageId);\n  console.log(\"Content:\", message.messageText);\n  console.log(\"Dequeue Count:\", message.dequeueCount);\n  console.log(\"Pop Receipt:\", message.popReceipt);\n\n  \u002F\u002F Process the message...\n\n  \u002F\u002F Delete after processing\n  await queueClient.deleteMessage(message.messageId, message.popReceipt);\n}\n```\n\n### Peek Messages\n\nPeek without removing from queue (no visibility timeout).\n\n```typescript\nconst response = await queueClient.peekMessages({\n  numberOfMessages: 5,\n});\n\nfor (const message of response.peekedMessageItems) {\n  console.log(\"Message ID:\", message.messageId);\n  console.log(\"Content:\", message.messageText);\n  \u002F\u002F Note: No popReceipt - cannot delete peeked messages\n}\n```\n\n### Update Message\n\nExtend visibility timeout or update content.\n\n```typescript\n\u002F\u002F Receive a message\nconst response = await queueClient.receiveMessages();\nconst message = response.receivedMessageItems[0];\n\nif (message) {\n  \u002F\u002F Update content and extend visibility\n  const updateResponse = await queueClient.updateMessage(\n    message.messageId,\n    message.popReceipt,\n    \"Updated content\",\n    60 \u002F\u002F New visibility timeout in seconds\n  );\n\n  \u002F\u002F Use new popReceipt for subsequent operations\n  console.log(\"New pop receipt:\", updateResponse.popReceipt);\n}\n```\n\n### Delete Message\n\n```typescript\n\u002F\u002F After receiving\nconst response = await queueClient.receiveMessages();\nconst message = response.receivedMessageItems[0];\n\nif (message) {\n  await queueClient.deleteMessage(message.messageId, message.popReceipt);\n}\n```\n\n### Clear All Messages\n\n```typescript\nawait queueClient.clearMessages();\n```\n\n## Message Processing Patterns\n\n### Basic Worker Pattern\n\n```typescript\nasync function processQueue(queueClient: QueueClient): Promise\u003Cvoid> {\n  while (true) {\n    const response = await queueClient.receiveMessages({\n      numberOfMessages: 10,\n      visibilityTimeout: 30,\n    });\n\n    if (response.receivedMessageItems.length === 0) {\n      \u002F\u002F No messages, wait before polling again\n      await sleep(5000);\n      continue;\n    }\n\n    for (const message of response.receivedMessageItems) {\n      try {\n        await processMessage(message.messageText);\n        await queueClient.deleteMessage(message.messageId, message.popReceipt);\n      } catch (error) {\n        console.error(`Failed to process message ${message.messageId}:`, error);\n        \u002F\u002F Message will become visible again after timeout\n      }\n    }\n  }\n}\n\nasync function processMessage(content: string): Promise\u003Cvoid> {\n  const task = JSON.parse(content);\n  \u002F\u002F Process task...\n}\n\nfunction sleep(ms: number): Promise\u003Cvoid> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n```\n\n### Poison Message Handling\n\n```typescript\nconst MAX_DEQUEUE_COUNT = 5;\n\nasync function processWithPoisonHandling(\n  queueClient: QueueClient,\n  poisonQueueClient: QueueClient\n): Promise\u003Cvoid> {\n  const response = await queueClient.receiveMessages({\n    numberOfMessages: 10,\n    visibilityTimeout: 30,\n  });\n\n  for (const message of response.receivedMessageItems) {\n    if (message.dequeueCount > MAX_DEQUEUE_COUNT) {\n      \u002F\u002F Move to poison queue\n      await poisonQueueClient.sendMessage(message.messageText);\n      await queueClient.deleteMessage(message.messageId, message.popReceipt);\n      console.log(`Moved message ${message.messageId} to poison queue`);\n      continue;\n    }\n\n    try {\n      await processMessage(message.messageText);\n      await queueClient.deleteMessage(message.messageId, message.popReceipt);\n    } catch (error) {\n      console.error(`Processing failed (attempt ${message.dequeueCount}):`, error);\n    }\n  }\n}\n```\n\n### Batch Processing with Visibility Extension\n\n```typescript\nasync function processBatchWithExtension(queueClient: QueueClient): Promise\u003Cvoid> {\n  const response = await queueClient.receiveMessages({\n    numberOfMessages: 1,\n    visibilityTimeout: 60,\n  });\n\n  const message = response.receivedMessageItems[0];\n  if (!message) return;\n\n  let popReceipt = message.popReceipt;\n\n  \u002F\u002F Start visibility extension timer\n  const extensionInterval = setInterval(async () => {\n    try {\n      const updateResponse = await queueClient.updateMessage(\n        message.messageId,\n        popReceipt,\n        message.messageText,\n        60 \u002F\u002F Extend by another 60 seconds\n      );\n      popReceipt = updateResponse.popReceipt;\n    } catch (error) {\n      console.error(\"Failed to extend visibility:\", error);\n    }\n  }, 45000); \u002F\u002F Extend every 45 seconds\n\n  try {\n    await longRunningProcess(message.messageText);\n    await queueClient.deleteMessage(message.messageId, popReceipt);\n  } finally {\n    clearInterval(extensionInterval);\n  }\n}\n```\n\n## Message Encoding\n\nBy default, messages are Base64 encoded. You can customize this:\n\n```typescript\nimport { QueueClient } from \"@azure\u002Fstorage-queue\";\n\n\u002F\u002F Custom encoder\u002Fdecoder for plain text\nconst queueClient = new QueueClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net\u002Fmy-queue`,\n  credential,\n  {\n    messageEncoding: \"text\", \u002F\u002F \"base64\" (default) or \"text\"\n  }\n);\n\n\u002F\u002F Or with custom encoder\nconst customQueueClient = new QueueClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net\u002Fmy-queue`,\n  credential,\n  {\n    messageEncoding: {\n      encode: (message: string) => Buffer.from(message).toString(\"base64\"),\n      decode: (message: string) => Buffer.from(message, \"base64\").toString(),\n    },\n  }\n);\n```\n\n## SAS Token Generation (Node.js only)\n\n### Generate Queue SAS\n\n```typescript\nimport {\n  QueueSASPermissions,\n  generateQueueSASQueryParameters,\n  StorageSharedKeyCredential,\n} from \"@azure\u002Fstorage-queue\";\n\nconst sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\n\nconst sasToken = generateQueueSASQueryParameters(\n  {\n    queueName: \"my-queue\",\n    permissions: QueueSASPermissions.parse(\"raup\"), \u002F\u002F read, add, update, process\n    startsOn: new Date(),\n    expiresOn: new Date(Date.now() + 3600 * 1000), \u002F\u002F 1 hour\n  },\n  sharedKeyCredential\n).toString();\n\nconst sasUrl = `https:\u002F\u002F${accountName}.queue.core.windows.net\u002Fmy-queue?${sasToken}`;\n```\n\n### Generate Account SAS\n\n```typescript\nimport {\n  AccountSASPermissions,\n  AccountSASResourceTypes,\n  AccountSASServices,\n  generateAccountSASQueryParameters,\n} from \"@azure\u002Fstorage-queue\";\n\nconst sasToken = generateAccountSASQueryParameters(\n  {\n    services: AccountSASServices.parse(\"q\").toString(), \u002F\u002F queue\n    resourceTypes: AccountSASResourceTypes.parse(\"sco\").toString(),\n    permissions: AccountSASPermissions.parse(\"rwdlacupi\"),\n    expiresOn: new Date(Date.now() + 24 * 3600 * 1000),\n  },\n  sharedKeyCredential\n).toString();\n```\n\n## Error Handling\n\n```typescript\nimport { RestError } from \"@azure\u002Fstorage-queue\";\n\ntry {\n  await queueClient.sendMessage(\"test\");\n} catch (error) {\n  if (error instanceof RestError) {\n    switch (error.statusCode) {\n      case 404:\n        console.log(\"Queue not found\");\n        break;\n      case 400:\n        console.log(\"Bad request - message too large or invalid\");\n        break;\n      case 403:\n        console.log(\"Access denied\");\n        break;\n      case 409:\n        console.log(\"Queue already exists or being deleted\");\n        break;\n      default:\n        console.error(`Storage error ${error.statusCode}: ${error.message}`);\n    }\n  }\n  throw error;\n}\n```\n\n## TypeScript Types Reference\n\n```typescript\nimport {\n  \u002F\u002F Clients\n  QueueServiceClient,\n  QueueClient,\n\n  \u002F\u002F Authentication\n  StorageSharedKeyCredential,\n  AnonymousCredential,\n\n  \u002F\u002F SAS\n  QueueSASPermissions,\n  AccountSASPermissions,\n  AccountSASServices,\n  AccountSASResourceTypes,\n  generateQueueSASQueryParameters,\n  generateAccountSASQueryParameters,\n\n  \u002F\u002F Messages\n  DequeuedMessageItem,\n  PeekedMessageItem,\n  QueueSendMessageResponse,\n  QueueReceiveMessageResponse,\n  QueueUpdateMessageResponse,\n\n  \u002F\u002F Queue\n  QueueItem,\n  QueueGetPropertiesResponse,\n\n  \u002F\u002F Errors\n  RestError,\n} from \"@azure\u002Fstorage-queue\";\n```\n\n## Message Limits\n\n| Limit | Value |\n|-------|-------|\n| Max message size | 64 KB |\n| Max visibility timeout | 7 days |\n| Max time-to-live | 7 days (or -1 for infinite) |\n| Max messages per receive | 32 |\n| Default visibility timeout | 30 seconds |\n\n## Best Practices\n\n1. **Use DefaultAzureCredential** — Prefer AAD over connection strings\u002Fkeys\n2. **Always delete after processing** — Prevent duplicate processing\n3. **Handle poison messages** — Move failed messages to a dead-letter queue\n4. **Use appropriate visibility timeout** — Set based on expected processing time\n5. **Extend visibility for long tasks** — Update message to prevent timeout\n6. **Use JSON for structured data** — Serialize objects to JSON strings\n7. **Check dequeueCount** — Detect repeatedly failing messages\n8. **Use batch receive** — Receive multiple messages for efficiency\n\n## Platform Differences\n\n| Feature | Node.js | Browser |\n|---------|---------|---------|\n| `StorageSharedKeyCredential` | ✅ | ❌ |\n| SAS generation | ✅ | ❌ |\n| DefaultAzureCredential | ✅ | ❌ |\n| Anonymous\u002FSAS access | ✅ | ✅ |\n| All message operations | ✅ | ✅ |\n",{"name":5,"license":15,"metadata":44,"description":48},{"author":45,"package":46,"version":47},"Microsoft","@azure\u002Fstorage-queue","1.0.0","Azure Queue Storage JavaScript\u002FTypeScript SDK (@azure\u002Fstorage-queue) for message queue operations. Use for sending, receiving, peeking, and deleting messages in queues. Supports visibility timeout, message encoding, and batch operations. Triggers: \"queue storage\", \"@azure\u002Fstorage-queue\", \"QueueServiceClient\", \"QueueClient\", \"send message\", \"receive message\", \"dequeue\", \"visibility timeout\".\n","main","5c95bcac4646c5aed06bd9aed5235cfc7985aafc","included\u002Fskills\u002Fby-category\u002Fcloud-azure-microsoft-sdks\u002Fofficial-vendor-reference\u002Fazure-storage-queue-ts",0,"https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked","https:\u002F\u002Fgithub.com\u002Fstrmt7","2026-11-11 04:18:12",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add strmt7\u002Fai_skills_collection_benchmarked --skill azure-storage-queue-ts",{"tool":62,"command":63},"bunx","bunx skills add strmt7\u002Fai_skills_collection_benchmarked --skill azure-storage-queue-ts",{"tool":65,"command":66},"pnpm","pnpm dlx skills add strmt7\u002Fai_skills_collection_benchmarked --skill azure-storage-queue-ts","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Fcloud-azure-microsoft-sdks\u002Fofficial-vendor-reference\u002Fazure-storage-queue-ts\u002FSKILL.md",true,[70],{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"references\u002Facceptance-criteria.md","REFERENCE","参考文档",9546,"https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Fcloud-azure-microsoft-sdks\u002Fofficial-vendor-reference\u002Fazure-storage-queue-ts\u002Freferences\u002Facceptance-criteria.md",[77,110,140,165,190,218],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":82,"sourceHtmlUrl":83,"categories":84,"keywords":93,"publishedAt":39},"01M71D4H3T6M57DFKN8HENAWRV","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Ftesting-qa-benchmarking\u002Fofficial-reference\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Ftesting-qa-benchmarking\u002Fofficial-reference\u002Fwebapp-testing\u002FSKILL.md",[85,90],{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":91,"categoryName":92,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000009","前端开发",[94,95,96,30,97,98,99,100,101,102,103,104,105,106,107,108,109],"webapp","testing","webapp testing","applications","local","frontend","debugging","toolkit","logs","browser","with","playwright","web","behavior","ui","screenshots",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":114,"sourceHtmlUrl":115,"categories":116,"keywords":120,"publishedAt":39},"01M71D4CQR2A2TB7GASCR5ZBG3","skill-creator","Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Ftesting-qa-benchmarking\u002Fofficial-reference\u002Fskill-creator-anthropics\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Ftesting-qa-benchmarking\u002Fofficial-reference\u002Fskill-creator-anthropics\u002FSKILL.md",[117],{"categoryNo":118,"categoryName":119,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000023","Skill与智能体开发",[121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,30,139],"skill creator","creator","performance","improve","run evals","new","when","analysis","create","optimize","variance analysis","run","edit","benchmark","a skill","existing skill","evals","modify","accuracy",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":148,"publishedAt":39},"01M71D488XHEZVXXSXFYP8ENMH","playwright-skill","Complete browser automation with Playwright. Auto-detects dev servers, writes reusable test scripts, and supports screenshots, responsive checks, UX validation, login flows, link checks, and arbitrary browser automation. Use when the user wants to test a website, automate browser interactions, validate web functionality, or perform browser-based testing.","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Ftesting-qa-benchmarking\u002Flatest-release-browser-automation\u002Fplaywright-skill\u002FSKILL.md",[146,147],{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},{"categoryNo":118,"categoryName":119,"taxonomyType":88,"taxonomyTypeDesc":89},[105,149,150,151,95,152,153,127,154,103,155,156,157,158,159,160,161,162,163,164],"playwright skill","browser automation","flows","auto","access","Bash","website","ux","login","scripts","read","write","node","install","network","responsive",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":169,"sourceHtmlUrl":170,"categories":171,"keywords":173,"publishedAt":39},"01M71CY25GM939M6RES91QSG3T","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Fsearch-retrieval-web-automation\u002Fofficial-reference\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Fsearch-retrieval-web-automation\u002Fofficial-reference\u002Fweb-artifacts-builder\u002FSKILL.md",[172],{"categoryNo":91,"categoryName":92,"taxonomyType":88,"taxonomyTypeDesc":89},[174,175,176,106,177,178,179,30,180,181,99,182,28,183,184,185,186,187,188,189],"builder","artifacts builder","artifacts","web artifacts builder","single-file","css","Tailwind","ui components","single","file","components","react","multi","state","routing","state management",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":81,"licenseFileUrl":194,"sourceHtmlUrl":195,"categories":196,"keywords":206,"publishedAt":39},"01M71CXZB60QJJ1H4S3NN94WMZ","frontend-design","Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML\u002FCSS layouts, or when styling\u002Fbeautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Fsearch-retrieval-web-automation\u002Fofficial-reference\u002Ffrontend-design\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Fsearch-retrieval-web-automation\u002Fofficial-reference\u002Ffrontend-design\u002FSKILL.md",[197,198,201],{"categoryNo":91,"categoryName":92,"taxonomyType":88,"taxonomyTypeDesc":89},{"categoryNo":199,"categoryName":200,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":202,"categoryName":203,"taxonomyType":204,"taxonomyTypeDesc":205},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[99,207,208,179,209,210,211,97,212,213,28,127,176,214,184,215,185,216,217,104],"design","frontend design","ui design","generic","aesthetics","landing","pages","code","web ui","react components","examples",{"skillNo":219,"name":220,"nameZh":6,"description":221,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":222,"categories":223,"keywords":224,"publishedAt":39},"01M71CVZ54WFBTVA7R16PFY1ZE","zarr-python","Chunked N-D arrays for cloud storage. Compressed arrays, parallel I\u002FO, S3\u002FGCS integration, NumPy\u002FDask\u002FXarray compatible, for large-scale scientific computing pipelines.","https:\u002F\u002Fgithub.com\u002Fstrmt7\u002Fai_skills_collection_benchmarked\u002Fblob\u002Fmain\u002Fincluded\u002Fskills\u002Fby-category\u002Fscience-research-data-analysis\u002Flatest-release-community\u002Fzarr-python\u002FSKILL.md",[],[225,226,227,228,229,230,19,231,232,30,233,234,235,236,237,238,239,240],"zarr python","python","zarr","arrays","Cloud Storage","scientific","parallel","dask","numpy","gcs","s3","integration","scientific computing","cloud","scale","pipelines"]