Repository navigation
AzureBlob
Typed Azure Blob Storage REST API
client for Deno, Bun, Node.js and Cloudflare Workers, with Shared Key or SAS
authentication. Upload, download, list, inspect and delete blobs, including
streamed block uploads and downloads for large files. A lightweight,
Web-API-only alternative to @azure/storage-blob for the operations it covers.
AzureBlob exposes the repo's canonical object-storage surface —
putObject, getObject, deleteObject, listObjects, headObject — on
top of Azure's classic Blob endpoint
(https://{account}.blob.core.windows.net). Every request is authenticated
with Shared Key HMAC-SHA256 signing (or a pass-through pre-generated SAS
token), computed purely with Web Crypto (crypto.subtle) so the connect
runs unmodified on Deno, Bun, Node, Cloudflare Workers, and in the browser.
It uses RESTler for transport and Guardian for runtime response validation.
Your tests don't need to fake HTTP. Have your code take an AzureBlob instance
and pass in a stand-in that returns the shapes from
@tundraconnect/azure-blob/schemas or throws a real AzureBlobError:
import { AzureBlobError } from '@tundraconnect/azure-blob/errors';
const outage = new AzureBlobError('SERVER_BUSY', { status: 503 });
console.log(outage.code);To exercise the client itself against a fake transport, subclass it and
reassign the protected _fetch.
| Topic | Description |
|---|---|
| API | Client configuration and endpoint methods |
| Errors | Error codes and diagnostic metadata |
| Schemas | Public Guardian schemas and inferred types |
Deno:
deno add jsr:@tundraconnect/azure-blobBun:
bunx jsr add @tundraconnect/azure-blobNode.js:
npx jsr add @tundraconnect/azure-blobimport { AzureBlob } from '@tundraconnect/azure-blob';
const client = new AzureBlob({
auth: {
type: 'CUSTOM',
account: 'myaccount',
accountKey: 'base64-shared-key',
},
});
await client.putObject({
bucket: 'my-container',
key: 'hello.txt',
body: 'hello world',
contentType: 'text/plain',
});
const { body } = await client.getObject({
bucket: 'my-container',
key: 'hello.txt',
});
console.log(await body.text());import { AzureBlob } from '@tundraconnect/azure-blob';
const client = new AzureBlob({
auth: { type: 'CUSTOM', account: 'myaccount', accountKey: '...' },
});
// Upload from a stream — one 4 MiB block in memory at a time.
const file = await Deno.open('backup.tar');
await client.putObjectStream({
bucket: 'backups',
key: 'backup.tar',
body: file.readable,
});
// Download as a stream — nothing buffered.
const { body } = await client.getObjectStream({
bucket: 'backups',
key: 'backup.tar',
});
await body.pipeTo((await Deno.create('restored.tar')).writable);See API → Streaming.
MIT. Part of Tundra Connect, typed vendor API clients for Deno, Bun, Node.js and Cloudflare Workers.
- Algolia
- AzureBlob
- CloudflareDNS
- CloudflareEmail
- CloudflareSaaS
- CloudflareTurnstile
- CoinGecko
- Discord
- DodoPayments
- GCS
- GoogleAnalytics
- GoogleCertificateManager
- GoogleWebRisk
- Kalshi
- ntfy
- OpenExchange
- OpenWeatherMap
- PayPal
- Polymarket
- Razorpay
- Resend
- S3
- SendGrid
- Sentry
- Slack
- Stripe
- Telegram
- Twilio
- UpstashRedis
- URLhaus