{"version":3,"file":"azure-storage-8A8f58PZ.cjs","names":["artifactId: string","team: string","artifact: Readable","BlobServiceClient","containerClient: ContainerClient","PassThrough"],"sources":["../src/utils/azure-storage.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { PassThrough, pipeline, Readable, Writable } from \"node:stream\";\nimport { BlobServiceClient, ContainerClient } from \"@azure/storage-blob\";\nimport { AzureBlobStorageOptions } from \"./types\";\n\nconst STORAGE_CONN_STR = process.env[\"AzureWebJobsStorage\"];\nconst AZURE_CONTAINER = process.env[\"CONTAINER_NAME\"] ?? \"turborepocache\";\n\nexport async function createStorageClient({\n  connectionString = STORAGE_CONN_STR,\n  containerName = AZURE_CONTAINER,\n}: Partial<AzureBlobStorageOptions>) {\n  if (!connectionString) {\n    throw new EvalError(\n      \"Connection String is missing for Azure Storage. Assign the value to env 'AzureWebJobsStorage'.\"\n    );\n  }\n\n  const storage = await createAzureBlobStorage({\n    connectionString,\n    containerName,\n  });\n\n  async function getCachedArtifactOrThrow(\n    artifactId: string,\n    team: string\n  ): Promise<Readable> {\n    return new Promise((resolve, reject) => {\n      const artifactPath = join(team, artifactId);\n      storage.exists(artifactPath, (err, exists) => {\n        if (err) {\n          return reject(err);\n        }\n        if (!exists) {\n          return reject(new Error(`Artifact ${artifactPath} doesn't exist.`));\n        }\n        resolve(storage.createReadStream(artifactPath));\n      });\n    });\n  }\n\n  async function existsCachedArtifactOrThrow(\n    artifactId: string,\n    team: string\n  ): Promise<void> {\n    return new Promise<void>((resolve, reject) => {\n      const artifactPath = join(team, artifactId);\n      storage.exists(artifactPath, (err, exists) => {\n        if (err) {\n          return reject(err);\n        }\n        if (!exists) {\n          return reject(new Error(`Artifact ${artifactPath} doesn't exist.`));\n        }\n        resolve();\n      });\n    });\n  }\n\n  async function createCachedArtifact(\n    artifactId: string,\n    team: string,\n    artifact: Readable\n  ): Promise<NodeJS.WritableStream> {\n    return pipeline(\n      artifact,\n      storage.createWriteStream(join(team, artifactId)),\n      () => {}\n    );\n  }\n\n  return {\n    getCachedArtifactOrThrow,\n    existsCachedArtifactOrThrow,\n    createCachedArtifact,\n  };\n}\n\nexport interface StorageProvider {\n  exists: (\n    artifactPath: string,\n    cb: (err: Error | null, exists?: boolean) => void\n  ) => void;\n  createReadStream: (artifactPath: string) => Readable;\n  createWriteStream: (artifactPath: string) => Writable;\n}\n\nasync function createAzureBlobStorage({\n  containerName,\n  connectionString,\n}: AzureBlobStorageOptions): Promise<StorageProvider> {\n  const blobServiceClient =\n    BlobServiceClient.fromConnectionString(connectionString);\n\n  let containerClient: ContainerClient;\n\n  try {\n    containerClient = blobServiceClient.getContainerClient(containerName);\n    if (!containerClient) {\n      throw new Error(\"Container not found\");\n    }\n  } catch {\n    containerClient = (await blobServiceClient.createContainer(containerName))\n      .containerClient;\n  }\n\n  return {\n    exists(artifactPath, callback) {\n      const blobClient = containerClient.getBlobClient(artifactPath);\n      blobClient.exists().then((exists) => {\n        callback(null, exists);\n      }, callback);\n    },\n    createReadStream(artifactPath) {\n      const blobClient = containerClient.getBlobClient(artifactPath);\n      const stream = new PassThrough();\n      blobClient.download().then((response) => {\n        if (response.readableStreamBody) {\n          response.readableStreamBody.pipe(stream);\n        }\n      });\n      return stream;\n    },\n    createWriteStream(artifactPath) {\n      const blockBlobClient = containerClient.getBlockBlobClient(artifactPath);\n      const stream = new PassThrough();\n      blockBlobClient.uploadStream(stream);\n      return stream;\n    },\n  };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAM,mBAAmB,QAAQ,IAAI;AACrC,MAAM,kBAAkB,QAAQ,IAAI,qBAAqB;AAEzD,eAAsB,oBAAoB,EACxC,mBAAmB,kBACnB,gBAAgB,iBACiB,EAAE;AACnC,KAAI,CAAC,iBACH,OAAM,IAAI,UACR;CAIJ,MAAM,UAAU,MAAM,uBAAuB;EAC3C;EACA;CACD,EAAC;CAEF,eAAe,yBACbA,YACAC,MACmB;AACnB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;GACtC,MAAM,mCAAoB,MAAM,WAAW;GAC3C,QAAQ,OAAO,cAAc,CAAC,KAAK,WAAW;AAC5C,QAAI,IACF,QAAO,OAAO,IAAI;AAEpB,QAAI,CAAC,OACH,QAAO,uBAAO,IAAI,MAAM,CAAC,SAAS,EAAE,aAAa,eAAe,CAAC,EAAE;IAErE,QAAQ,QAAQ,iBAAiB,aAAa,CAAC;GAChD,EAAC;EACH;CACF;CAED,eAAe,4BACbD,YACAC,MACe;AACf,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;GAC5C,MAAM,mCAAoB,MAAM,WAAW;GAC3C,QAAQ,OAAO,cAAc,CAAC,KAAK,WAAW;AAC5C,QAAI,IACF,QAAO,OAAO,IAAI;AAEpB,QAAI,CAAC,OACH,QAAO,uBAAO,IAAI,MAAM,CAAC,SAAS,EAAE,aAAa,eAAe,CAAC,EAAE;IAErE,SAAS;GACV,EAAC;EACH;CACF;CAED,eAAe,qBACbD,YACAC,MACAC,UACgC;AAChC,mCACE,UACA,QAAQ,sCAAuB,MAAM,WAAW,CAAC,EACjD,MAAM,CAAE,EACT;CACF;AAED,QAAO;EACL;EACA;EACA;CACD;AACF;AAWD,eAAe,uBAAuB,EACpC,eACA,kBACwB,EAA4B;CACpD,MAAM,oBACJC,uCAAkB,qBAAqB,iBAAiB;CAE1D,IAAIC;AAEJ,KAAI;EACF,kBAAkB,kBAAkB,mBAAmB,cAAc;AACrE,MAAI,CAAC,gBACH,OAAM,IAAI,MAAM;CAEnB,QAAO;EACN,mBAAmB,MAAM,kBAAkB,gBAAgB,cAAc,EACtE;CACJ;AAED,QAAO;EACL,OAAO,cAAc,UAAU;GAC7B,MAAM,aAAa,gBAAgB,cAAc,aAAa;GAC9D,WAAW,QAAQ,CAAC,KAAK,CAAC,WAAW;IACnC,SAAS,MAAM,OAAO;GACvB,GAAE,SAAS;EACb;EACD,iBAAiB,cAAc;GAC7B,MAAM,aAAa,gBAAgB,cAAc,aAAa;GAC9D,MAAM,SAAS,IAAIC;GACnB,WAAW,UAAU,CAAC,KAAK,CAAC,aAAa;AACvC,QAAI,SAAS,oBACX,SAAS,mBAAmB,KAAK,OAAO;GAE3C,EAAC;AACF,UAAO;EACR;EACD,kBAAkB,cAAc;GAC9B,MAAM,kBAAkB,gBAAgB,mBAAmB,aAAa;GACxE,MAAM,SAAS,IAAIA;GACnB,gBAAgB,aAAa,OAAO;AACpC,UAAO;EACR;CACF;AACF"}