From 9cdb39a53bba17a9ab394cbcb644818e41d99d2d Mon Sep 17 00:00:00 2001 From: Piwccle Date: Tue, 3 Jun 2025 11:09:07 +0200 Subject: [PATCH] advanced-features: recording-basic-azure - updated name of the service --- .../src/azure.blobstorage.service.js | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 advanced-features/openvidu-recording-basic-node-azure/src/azure.blobstorage.service.js diff --git a/advanced-features/openvidu-recording-basic-node-azure/src/azure.blobstorage.service.js b/advanced-features/openvidu-recording-basic-node-azure/src/azure.blobstorage.service.js new file mode 100644 index 00000000..1d093133 --- /dev/null +++ b/advanced-features/openvidu-recording-basic-node-azure/src/azure.blobstorage.service.js @@ -0,0 +1,91 @@ +import { + BlobServiceClient, + StorageSharedKeyCredential, +} from "@azure/storage-blob"; + +// Azure configuration +const AZURE_ACCOUNT_NAME = process.env.AZURE_ACCOUNT_NAME || "devstoreaccount"; +const AZURE_ACCOUNT_KEY = + process.env.AZURE_ACCOUNT_KEY || "nokey"; +const AZURE_CONTAINER_NAME = + process.env.AZURE_CONTAINER_NAME || "openvidu-appdata"; + +const AZURE_ENDPOINT = + process.env.AZURE_ENDPOINT || + `https://${AZURE_ACCOUNT_NAME}.blob.core.windows.net`; + +export class AzureBlobService { + static instance; + + constructor() { + if (AzureBlobService.instance) { + return AzureBlobService.instance; + } + + const sharedKeyCredential = new StorageSharedKeyCredential( + AZURE_ACCOUNT_NAME, + AZURE_ACCOUNT_KEY + ); + + this.blobServiceClient = new BlobServiceClient( + AZURE_ENDPOINT, + sharedKeyCredential + ); + + this.containerClient = this.blobServiceClient.getContainerClient( + AZURE_CONTAINER_NAME + ); + + AzureBlobService.instance = this; + return this; + } + + async exists(key) { + const blobClient = this.containerClient.getBlobClient(key); + return await blobClient.exists(); + } + + async getObjectSize(key) { + const props = await this.headObject(key); + return props.contentLength; + } + + async headObject(key) { + const blobClient = this.containerClient.getBlobClient(key); + const props = await blobClient.getProperties(); + return props; + } + + async getObject(key, range) { + const blobClient = this.containerClient.getBlobClient(key); + const downloadOptions = range + ? { + rangeGetContentMD5: false, + range: { + offset: range.start, + count: range.end - range.start + 1, + }, + } + : {}; + + const response = await blobClient.download( + downloadOptions.range?.offset ?? 0, + downloadOptions.range?.count + ); + + return response.readableStreamBody; + } + + async listObjects() { + const result = []; + for await (const blob of this.containerClient.listBlobsFlat()) { + result.push(blob); + } + return result; + } + + async deleteObject(key) { + const blobClient = this.containerClient.getBlobClient(key); + return await blobClient.deleteIfExists(); + } +}