feat: add @actions/cache

This commit is contained in:
xHyroM 2022-07-12 09:00:22 +02:00
parent b15fb7d098
commit 16e8c96a41
1932 changed files with 261172 additions and 10 deletions

View file

@ -0,0 +1,4 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=BatchResponse.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"BatchResponse.js","sourceRoot":"","sources":["../../../src/BatchResponse.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { BatchSubRequest } from \"./BlobBatch\";\nimport { HttpHeaders } from \"@azure/core-http\";\n\n/**\n * The response data associated with a single request within a batch operation.\n */\nexport interface BatchSubResponse {\n /**\n * The status code of the sub operation.\n */\n status: number;\n\n /**\n * The status message of the sub operation.\n */\n statusMessage: string;\n\n /**\n * The error code of the sub operation, if the sub operation failed.\n */\n errorCode?: string;\n\n /**\n * The HTTP response headers.\n */\n headers: HttpHeaders;\n\n /**\n * The body as text.\n */\n bodyAsText?: string;\n\n /**\n * The batch sub request corresponding to the sub response.\n */\n _request: BatchSubRequest;\n}\n\n/**\n * The multipart/mixed response which contains the response for each subrequest.\n */\nexport interface ParsedBatchResponse {\n /**\n * The parsed sub responses.\n */\n subResponses: BatchSubResponse[];\n\n /**\n * The succeeded executed sub responses' count;\n */\n subResponsesSucceededCount: number;\n\n /**\n * The failed executed sub responses' count;\n */\n subResponsesFailedCount: number;\n}\n"]}

View file

@ -0,0 +1,136 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { HttpHeaders } from "@azure/core-http";
import { HTTP_VERSION_1_1, HTTP_LINE_ENDING, HeaderConstants, HTTPURLConnection, } from "./utils/constants";
import { getBodyAsText } from "./BatchUtils";
import { logger } from "./log";
const HTTP_HEADER_DELIMITER = ": ";
const SPACE_DELIMITER = " ";
const NOT_FOUND = -1;
/**
* Util class for parsing batch response.
*/
export class BatchResponseParser {
constructor(batchResponse, subRequests) {
if (!batchResponse || !batchResponse.contentType) {
// In special case(reported), server may return invalid content-type which could not be parsed.
throw new RangeError("batchResponse is malformed or doesn't contain valid content-type.");
}
if (!subRequests || subRequests.size === 0) {
// This should be prevent during coding.
throw new RangeError("Invalid state: subRequests is not provided or size is 0.");
}
this.batchResponse = batchResponse;
this.subRequests = subRequests;
this.responseBatchBoundary = this.batchResponse.contentType.split("=")[1];
this.perResponsePrefix = `--${this.responseBatchBoundary}${HTTP_LINE_ENDING}`;
this.batchResponseEnding = `--${this.responseBatchBoundary}--`;
}
// For example of response, please refer to https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch#response
async parseBatchResponse() {
// When logic reach here, suppose batch request has already succeeded with 202, so we can further parse
// sub request's response.
if (this.batchResponse._response.status !== HTTPURLConnection.HTTP_ACCEPTED) {
throw new Error(`Invalid state: batch request failed with status: '${this.batchResponse._response.status}'.`);
}
const responseBodyAsText = await getBodyAsText(this.batchResponse);
const subResponses = responseBodyAsText
.split(this.batchResponseEnding)[0] // string after ending is useless
.split(this.perResponsePrefix)
.slice(1); // string before first response boundary is useless
const subResponseCount = subResponses.length;
// Defensive coding in case of potential error parsing.
// Note: subResponseCount == 1 is special case where sub request is invalid.
// We try to prevent such cases through early validation, e.g. validate sub request count >= 1.
// While in unexpected sub request invalid case, we allow sub response to be parsed and return to user.
if (subResponseCount !== this.subRequests.size && subResponseCount !== 1) {
throw new Error("Invalid state: sub responses' count is not equal to sub requests' count.");
}
const deserializedSubResponses = new Array(subResponseCount);
let subResponsesSucceededCount = 0;
let subResponsesFailedCount = 0;
// Parse sub subResponses.
for (let index = 0; index < subResponseCount; index++) {
const subResponse = subResponses[index];
const deserializedSubResponse = {};
deserializedSubResponse.headers = new HttpHeaders();
const responseLines = subResponse.split(`${HTTP_LINE_ENDING}`);
let subRespHeaderStartFound = false;
let subRespHeaderEndFound = false;
let subRespFailed = false;
let contentId = NOT_FOUND;
for (const responseLine of responseLines) {
if (!subRespHeaderStartFound) {
// Convention line to indicate content ID
if (responseLine.startsWith(HeaderConstants.CONTENT_ID)) {
contentId = parseInt(responseLine.split(HTTP_HEADER_DELIMITER)[1]);
}
// Http version line with status code indicates the start of sub request's response.
// Example: HTTP/1.1 202 Accepted
if (responseLine.startsWith(HTTP_VERSION_1_1)) {
subRespHeaderStartFound = true;
const tokens = responseLine.split(SPACE_DELIMITER);
deserializedSubResponse.status = parseInt(tokens[1]);
deserializedSubResponse.statusMessage = tokens.slice(2).join(SPACE_DELIMITER);
}
continue; // Skip convention headers not specifically for sub request i.e. Content-Type: application/http and Content-ID: *
}
if (responseLine.trim() === "") {
// Sub response's header start line already found, and the first empty line indicates header end line found.
if (!subRespHeaderEndFound) {
subRespHeaderEndFound = true;
}
continue; // Skip empty line
}
// Note: when code reach here, it indicates subRespHeaderStartFound == true
if (!subRespHeaderEndFound) {
if (responseLine.indexOf(HTTP_HEADER_DELIMITER) === -1) {
// Defensive coding to prevent from missing valuable lines.
throw new Error(`Invalid state: find non-empty line '${responseLine}' without HTTP header delimiter '${HTTP_HEADER_DELIMITER}'.`);
}
// Parse headers of sub response.
const tokens = responseLine.split(HTTP_HEADER_DELIMITER);
deserializedSubResponse.headers.set(tokens[0], tokens[1]);
if (tokens[0] === HeaderConstants.X_MS_ERROR_CODE) {
deserializedSubResponse.errorCode = tokens[1];
subRespFailed = true;
}
}
else {
// Assemble body of sub response.
if (!deserializedSubResponse.bodyAsText) {
deserializedSubResponse.bodyAsText = "";
}
deserializedSubResponse.bodyAsText += responseLine;
}
} // Inner for end
// The response will contain the Content-ID header for each corresponding subrequest response to use for tracking.
// The Content-IDs are set to a valid index in the subrequests we sent. In the status code 202 path, we could expect it
// to be 1-1 mapping from the [0, subRequests.size) to the Content-IDs returned. If not, we simply don't return that
// unexpected subResponse in the parsed reponse and we can always look it up in the raw response for debugging purpose.
if (contentId !== NOT_FOUND &&
Number.isInteger(contentId) &&
contentId >= 0 &&
contentId < this.subRequests.size &&
deserializedSubResponses[contentId] === undefined) {
deserializedSubResponse._request = this.subRequests.get(contentId);
deserializedSubResponses[contentId] = deserializedSubResponse;
}
else {
logger.error(`subResponses[${index}] is dropped as the Content-ID is not found or invalid, Content-ID: ${contentId}`);
}
if (subRespFailed) {
subResponsesFailedCount++;
}
else {
subResponsesSucceededCount++;
}
}
return {
subResponses: deserializedSubResponses,
subResponsesSucceededCount: subResponsesSucceededCount,
subResponsesFailedCount: subResponsesFailedCount,
};
}
}
//# sourceMappingURL=BatchResponseParser.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,11 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { blobToString } from "./utils/utils.browser";
export async function getBodyAsText(batchResponse) {
const blob = (await batchResponse.blobBody);
return blobToString(blob);
}
export function utf8ByteLength(str) {
return new Blob([str]).size;
}
//# sourceMappingURL=BatchUtils.browser.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"BatchUtils.browser.js","sourceRoot":"","sources":["../../../src/BatchUtils.browser.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAGlC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAA8C;IAE9C,MAAM,IAAI,GAAG,CAAC,MAAM,aAAa,CAAC,QAAQ,CAAS,CAAC;IACpD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9B,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ServiceSubmitBatchResponseModel } from \"./generatedModels\";\nimport { blobToString } from \"./utils/utils.browser\";\n\nexport async function getBodyAsText(\n batchResponse: ServiceSubmitBatchResponseModel\n): Promise<string> {\n const blob = (await batchResponse.blobBody) as Blob;\n return blobToString(blob);\n}\n\nexport function utf8ByteLength(str: string): number {\n return new Blob([str]).size;\n}\n"]}

View file

@ -0,0 +1,15 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { streamToBuffer2 } from "./utils/utils.node";
import { BATCH_MAX_PAYLOAD_IN_BYTES } from "./utils/constants";
export async function getBodyAsText(batchResponse) {
let buffer = Buffer.alloc(BATCH_MAX_PAYLOAD_IN_BYTES);
const responseLength = await streamToBuffer2(batchResponse.readableStreamBody, buffer);
// Slice the buffer to trim the empty ending.
buffer = buffer.slice(0, responseLength);
return buffer.toString();
}
export function utf8ByteLength(str) {
return Buffer.byteLength(str);
}
//# sourceMappingURL=BatchUtils.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"BatchUtils.js","sourceRoot":"","sources":["../../../src/BatchUtils.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAGlC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAA8C;IAE9C,IAAI,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAEtD,MAAM,cAAc,GAAG,MAAM,eAAe,CAC1C,aAAa,CAAC,kBAA2C,EACzD,MAAM,CACP,CAAC;IAEF,6CAA6C;IAC7C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { ServiceSubmitBatchResponseModel } from \"./generatedModels\";\nimport { streamToBuffer2 } from \"./utils/utils.node\";\nimport { BATCH_MAX_PAYLOAD_IN_BYTES } from \"./utils/constants\";\n\nexport async function getBodyAsText(\n batchResponse: ServiceSubmitBatchResponseModel\n): Promise<string> {\n let buffer = Buffer.alloc(BATCH_MAX_PAYLOAD_IN_BYTES);\n\n const responseLength = await streamToBuffer2(\n batchResponse.readableStreamBody as NodeJS.ReadableStream,\n buffer\n );\n\n // Slice the buffer to trim the empty ending.\n buffer = buffer.slice(0, responseLength);\n\n return buffer.toString();\n}\n\nexport function utf8ByteLength(str: string): number {\n return Buffer.byteLength(str);\n}\n"]}

View file

@ -0,0 +1,282 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, deserializationPolicy, generateUuid, HttpHeaders, WebResource, isTokenCredential, bearerTokenAuthenticationPolicy, isNode, } from "@azure/core-http";
import { SpanStatusCode } from "@azure/core-tracing";
import { AnonymousCredential } from "./credentials/AnonymousCredential";
import { BlobClient } from "./Clients";
import { Mutex } from "./utils/Mutex";
import { Pipeline } from "./Pipeline";
import { attachCredential, getURLPath, getURLPathAndQuery, iEqual } from "./utils/utils.common";
import { HeaderConstants, BATCH_MAX_REQUEST, HTTP_VERSION_1_1, HTTP_LINE_ENDING, StorageOAuthScopes, } from "./utils/constants";
import { StorageSharedKeyCredential } from "./credentials/StorageSharedKeyCredential";
import { createSpan } from "./utils/tracing";
/**
* A BlobBatch represents an aggregated set of operations on blobs.
* Currently, only `delete` and `setAccessTier` are supported.
*/
export class BlobBatch {
constructor() {
this.batch = "batch";
this.batchRequest = new InnerBatchRequest();
}
/**
* Get the value of Content-Type for a batch request.
* The value must be multipart/mixed with a batch boundary.
* Example: multipart/mixed; boundary=batch_a81786c8-e301-4e42-a729-a32ca24ae252
*/
getMultiPartContentType() {
return this.batchRequest.getMultipartContentType();
}
/**
* Get assembled HTTP request body for sub requests.
*/
getHttpRequestBody() {
return this.batchRequest.getHttpRequestBody();
}
/**
* Get sub requests that are added into the batch request.
*/
getSubRequests() {
return this.batchRequest.getSubRequests();
}
async addSubRequestInternal(subRequest, assembleSubRequestFunc) {
await Mutex.lock(this.batch);
try {
this.batchRequest.preAddSubRequest(subRequest);
await assembleSubRequestFunc();
this.batchRequest.postAddSubRequest(subRequest);
}
finally {
await Mutex.unlock(this.batch);
}
}
setBatchType(batchType) {
if (!this.batchType) {
this.batchType = batchType;
}
if (this.batchType !== batchType) {
throw new RangeError(`BlobBatch only supports one operation type per batch and it already is being used for ${this.batchType} operations.`);
}
}
async deleteBlob(urlOrBlobClient, credentialOrOptions, options) {
let url;
let credential;
if (typeof urlOrBlobClient === "string" &&
((isNode && credentialOrOptions instanceof StorageSharedKeyCredential) ||
credentialOrOptions instanceof AnonymousCredential ||
isTokenCredential(credentialOrOptions))) {
// First overload
url = urlOrBlobClient;
credential = credentialOrOptions;
}
else if (urlOrBlobClient instanceof BlobClient) {
// Second overload
url = urlOrBlobClient.url;
credential = urlOrBlobClient.credential;
options = credentialOrOptions;
}
else {
throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");
}
if (!options) {
options = {};
}
const { span, updatedOptions } = createSpan("BatchDeleteRequest-addSubRequest", options);
try {
this.setBatchType("delete");
await this.addSubRequestInternal({
url: url,
credential: credential,
}, async () => {
await new BlobClient(url, this.batchRequest.createPipeline(credential)).delete(updatedOptions);
});
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
async setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options) {
let url;
let credential;
let tier;
if (typeof urlOrBlobClient === "string" &&
((isNode && credentialOrTier instanceof StorageSharedKeyCredential) ||
credentialOrTier instanceof AnonymousCredential ||
isTokenCredential(credentialOrTier))) {
// First overload
url = urlOrBlobClient;
credential = credentialOrTier;
tier = tierOrOptions;
}
else if (urlOrBlobClient instanceof BlobClient) {
// Second overload
url = urlOrBlobClient.url;
credential = urlOrBlobClient.credential;
tier = credentialOrTier;
options = tierOrOptions;
}
else {
throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided.");
}
if (!options) {
options = {};
}
const { span, updatedOptions } = createSpan("BatchSetTierRequest-addSubRequest", options);
try {
this.setBatchType("setAccessTier");
await this.addSubRequestInternal({
url: url,
credential: credential,
}, async () => {
await new BlobClient(url, this.batchRequest.createPipeline(credential)).setAccessTier(tier, updatedOptions);
});
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
}
/**
* Inner batch request class which is responsible for assembling and serializing sub requests.
* See https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch#request-body for how requests are assembled.
*/
class InnerBatchRequest {
constructor() {
this.operationCount = 0;
this.body = "";
const tempGuid = generateUuid();
// batch_{batchid}
this.boundary = `batch_${tempGuid}`;
// --batch_{batchid}
// Content-Type: application/http
// Content-Transfer-Encoding: binary
this.subRequestPrefix = `--${this.boundary}${HTTP_LINE_ENDING}${HeaderConstants.CONTENT_TYPE}: application/http${HTTP_LINE_ENDING}${HeaderConstants.CONTENT_TRANSFER_ENCODING}: binary`;
// multipart/mixed; boundary=batch_{batchid}
this.multipartContentType = `multipart/mixed; boundary=${this.boundary}`;
// --batch_{batchid}--
this.batchRequestEnding = `--${this.boundary}--`;
this.subRequests = new Map();
}
/**
* Create pipeline to assemble sub requests. The idea here is to use existing
* credential and serialization/deserialization components, with additional policies to
* filter unnecessary headers, assemble sub requests into request's body
* and intercept request from going to wire.
* @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.
*/
createPipeline(credential) {
const isAnonymousCreds = credential instanceof AnonymousCredential;
const policyFactoryLength = 3 + (isAnonymousCreds ? 0 : 1); // [deserializationPolicy, BatchHeaderFilterPolicyFactory, (Optional)Credential, BatchRequestAssemblePolicyFactory]
const factories = new Array(policyFactoryLength);
factories[0] = deserializationPolicy(); // Default deserializationPolicy is provided by protocol layer
factories[1] = new BatchHeaderFilterPolicyFactory(); // Use batch header filter policy to exclude unnecessary headers
if (!isAnonymousCreds) {
factories[2] = isTokenCredential(credential)
? attachCredential(bearerTokenAuthenticationPolicy(credential, StorageOAuthScopes), credential)
: credential;
}
factories[policyFactoryLength - 1] = new BatchRequestAssemblePolicyFactory(this); // Use batch assemble policy to assemble request and intercept request from going to wire
return new Pipeline(factories, {});
}
appendSubRequestToBody(request) {
// Start to assemble sub request
this.body += [
this.subRequestPrefix,
`${HeaderConstants.CONTENT_ID}: ${this.operationCount}`,
"",
`${request.method.toString()} ${getURLPathAndQuery(request.url)} ${HTTP_VERSION_1_1}${HTTP_LINE_ENDING}`, // sub request start line with method
].join(HTTP_LINE_ENDING);
for (const header of request.headers.headersArray()) {
this.body += `${header.name}: ${header.value}${HTTP_LINE_ENDING}`;
}
this.body += HTTP_LINE_ENDING; // sub request's headers need be ending with an empty line
// No body to assemble for current batch request support
// End to assemble sub request
}
preAddSubRequest(subRequest) {
if (this.operationCount >= BATCH_MAX_REQUEST) {
throw new RangeError(`Cannot exceed ${BATCH_MAX_REQUEST} sub requests in a single batch`);
}
// Fast fail if url for sub request is invalid
const path = getURLPath(subRequest.url);
if (!path || path === "") {
throw new RangeError(`Invalid url for sub request: '${subRequest.url}'`);
}
}
postAddSubRequest(subRequest) {
this.subRequests.set(this.operationCount, subRequest);
this.operationCount++;
}
// Return the http request body with assembling the ending line to the sub request body.
getHttpRequestBody() {
return `${this.body}${this.batchRequestEnding}${HTTP_LINE_ENDING}`;
}
getMultipartContentType() {
return this.multipartContentType;
}
getSubRequests() {
return this.subRequests;
}
}
class BatchRequestAssemblePolicy extends BaseRequestPolicy {
constructor(batchRequest, nextPolicy, options) {
super(nextPolicy, options);
this.dummyResponse = {
request: new WebResource(),
status: 200,
headers: new HttpHeaders(),
};
this.batchRequest = batchRequest;
}
async sendRequest(request) {
await this.batchRequest.appendSubRequestToBody(request);
return this.dummyResponse; // Intercept request from going to wire
}
}
class BatchRequestAssemblePolicyFactory {
constructor(batchRequest) {
this.batchRequest = batchRequest;
}
create(nextPolicy, options) {
return new BatchRequestAssemblePolicy(this.batchRequest, nextPolicy, options);
}
}
class BatchHeaderFilterPolicy extends BaseRequestPolicy {
// The base class has a protected constructor. Adding a public one to enable constructing of this class.
/* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
constructor(nextPolicy, options) {
super(nextPolicy, options);
}
async sendRequest(request) {
let xMsHeaderName = "";
for (const header of request.headers.headersArray()) {
if (iEqual(header.name, HeaderConstants.X_MS_VERSION)) {
xMsHeaderName = header.name;
}
}
if (xMsHeaderName !== "") {
request.headers.remove(xMsHeaderName); // The subrequests should not have the x-ms-version header.
}
return this._nextPolicy.sendRequest(request);
}
}
class BatchHeaderFilterPolicyFactory {
create(nextPolicy, options) {
return new BatchHeaderFilterPolicy(nextPolicy, options);
}
}
//# sourceMappingURL=BlobBatch.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,153 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BatchResponseParser } from "./BatchResponseParser";
import { utf8ByteLength } from "./BatchUtils";
import { BlobBatch } from "./BlobBatch";
import { SpanStatusCode } from "@azure/core-tracing";
import { convertTracingToRequestOptionsBase, createSpan } from "./utils/tracing";
import { Service, Container } from "./generated/src/operations";
import { AnonymousCredential } from "./credentials/AnonymousCredential";
import { StorageClientContext } from "./generated/src/storageClientContext";
import { newPipeline, isPipelineLike } from "./Pipeline";
import { getURLPath } from "./utils/utils.common";
/**
* A BlobBatchClient allows you to make batched requests to the Azure Storage Blob service.
*
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch
*/
export class BlobBatchClient {
constructor(url, credentialOrPipeline,
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
options) {
let pipeline;
if (isPipelineLike(credentialOrPipeline)) {
pipeline = credentialOrPipeline;
}
else if (!credentialOrPipeline) {
// no credential provided
pipeline = newPipeline(new AnonymousCredential(), options);
}
else {
pipeline = newPipeline(credentialOrPipeline, options);
}
const storageClientContext = new StorageClientContext(url, pipeline.toServiceClientOptions());
const path = getURLPath(url);
if (path && path !== "/") {
// Container scoped.
this.serviceOrContainerContext = new Container(storageClientContext);
}
else {
this.serviceOrContainerContext = new Service(storageClientContext);
}
}
/**
* Creates a {@link BlobBatch}.
* A BlobBatch represents an aggregated set of operations on blobs.
*/
createBatch() {
return new BlobBatch();
}
async deleteBlobs(urlsOrBlobClients, credentialOrOptions,
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
options) {
const batch = new BlobBatch();
for (const urlOrBlobClient of urlsOrBlobClients) {
if (typeof urlOrBlobClient === "string") {
await batch.deleteBlob(urlOrBlobClient, credentialOrOptions, options);
}
else {
await batch.deleteBlob(urlOrBlobClient, credentialOrOptions);
}
}
return this.submitBatch(batch);
}
async setBlobsAccessTier(urlsOrBlobClients, credentialOrTier, tierOrOptions,
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
options) {
const batch = new BlobBatch();
for (const urlOrBlobClient of urlsOrBlobClients) {
if (typeof urlOrBlobClient === "string") {
await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options);
}
else {
await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions);
}
}
return this.submitBatch(batch);
}
/**
* Submit batch request which consists of multiple subrequests.
*
* Get `blobBatchClient` and other details before running the snippets.
* `blobServiceClient.getBlobBatchClient()` gives the `blobBatchClient`
*
* Example usage:
*
* ```js
* let batchRequest = new BlobBatch();
* await batchRequest.deleteBlob(urlInString0, credential0);
* await batchRequest.deleteBlob(urlInString1, credential1, {
* deleteSnapshots: "include"
* });
* const batchResp = await blobBatchClient.submitBatch(batchRequest);
* console.log(batchResp.subResponsesSucceededCount);
* ```
*
* Example using a lease:
*
* ```js
* let batchRequest = new BlobBatch();
* await batchRequest.setBlobAccessTier(blockBlobClient0, "Cool");
* await batchRequest.setBlobAccessTier(blockBlobClient1, "Cool", {
* conditions: { leaseId: leaseId }
* });
* const batchResp = await blobBatchClient.submitBatch(batchRequest);
* console.log(batchResp.subResponsesSucceededCount);
* ```
*
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch
*
* @param batchRequest - A set of Delete or SetTier operations.
* @param options -
*/
async submitBatch(batchRequest, options = {}) {
if (!batchRequest || batchRequest.getSubRequests().size === 0) {
throw new RangeError("Batch request should contain one or more sub requests.");
}
const { span, updatedOptions } = createSpan("BlobBatchClient-submitBatch", options);
try {
const batchRequestBody = batchRequest.getHttpRequestBody();
// ServiceSubmitBatchResponseModel and ContainerSubmitBatchResponse are compatible for now.
const rawBatchResponse = await this.serviceOrContainerContext.submitBatch(utf8ByteLength(batchRequestBody), batchRequest.getMultiPartContentType(), batchRequestBody, Object.assign(Object.assign({}, options), convertTracingToRequestOptionsBase(updatedOptions)));
// Parse the sub responses result, if logic reaches here(i.e. the batch request succeeded with status code 202).
const batchResponseParser = new BatchResponseParser(rawBatchResponse, batchRequest.getSubRequests());
const responseSummary = await batchResponseParser.parseBatchResponse();
const res = {
_response: rawBatchResponse._response,
contentType: rawBatchResponse.contentType,
errorCode: rawBatchResponse.errorCode,
requestId: rawBatchResponse.requestId,
clientRequestId: rawBatchResponse.clientRequestId,
version: rawBatchResponse.version,
subResponses: responseSummary.subResponses,
subResponsesSucceededCount: responseSummary.subResponsesSucceededCount,
subResponsesFailedCount: responseSummary.subResponsesFailedCount,
};
return res;
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
}
//# sourceMappingURL=BlobBatchClient.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,7 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
// This file is used as a shim of "BlobDownloadResponse" for some browser bundlers
// when trying to bundle "BlobDownloadResponse"
// "BlobDownloadResponse" class is only available in Node.js runtime
export const BlobDownloadResponse = 1;
//# sourceMappingURL=BlobDownloadResponse.browser.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"BlobDownloadResponse.browser.js","sourceRoot":"","sources":["../../../src/BlobDownloadResponse.browser.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,kFAAkF;AAClF,+CAA+C;AAC/C,oEAAoE;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n// This file is used as a shim of \"BlobDownloadResponse\" for some browser bundlers\n// when trying to bundle \"BlobDownloadResponse\"\n// \"BlobDownloadResponse\" class is only available in Node.js runtime\nexport const BlobDownloadResponse = 1;\n"]}

View file

@ -0,0 +1,455 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isNode } from "@azure/core-http";
import { RetriableReadableStream, } from "./utils/RetriableReadableStream";
/**
* ONLY AVAILABLE IN NODE.JS RUNTIME.
*
* BlobDownloadResponse implements BlobDownloadResponseParsed interface, and in Node.js runtime it will
* automatically retry when internal read stream unexpected ends. (This kind of unexpected ends cannot
* trigger retries defined in pipeline retry policy.)
*
* The {@link readableStreamBody} stream will retry underlayer, you can just use it as a normal Node.js
* Readable stream.
*/
export class BlobDownloadResponse {
/**
* Creates an instance of BlobDownloadResponse.
*
* @param originalResponse -
* @param getter -
* @param offset -
* @param count -
* @param options -
*/
constructor(originalResponse, getter, offset, count, options = {}) {
this.originalResponse = originalResponse;
this.blobDownloadStream = new RetriableReadableStream(this.originalResponse.readableStreamBody, getter, offset, count, options);
}
/**
* Indicates that the service supports
* requests for partial file content.
*
* @readonly
*/
get acceptRanges() {
return this.originalResponse.acceptRanges;
}
/**
* Returns if it was previously specified
* for the file.
*
* @readonly
*/
get cacheControl() {
return this.originalResponse.cacheControl;
}
/**
* Returns the value that was specified
* for the 'x-ms-content-disposition' header and specifies how to process the
* response.
*
* @readonly
*/
get contentDisposition() {
return this.originalResponse.contentDisposition;
}
/**
* Returns the value that was specified
* for the Content-Encoding request header.
*
* @readonly
*/
get contentEncoding() {
return this.originalResponse.contentEncoding;
}
/**
* Returns the value that was specified
* for the Content-Language request header.
*
* @readonly
*/
get contentLanguage() {
return this.originalResponse.contentLanguage;
}
/**
* The current sequence number for a
* page blob. This header is not returned for block blobs or append blobs.
*
* @readonly
*/
get blobSequenceNumber() {
return this.originalResponse.blobSequenceNumber;
}
/**
* The blob's type. Possible values include:
* 'BlockBlob', 'PageBlob', 'AppendBlob'.
*
* @readonly
*/
get blobType() {
return this.originalResponse.blobType;
}
/**
* The number of bytes present in the
* response body.
*
* @readonly
*/
get contentLength() {
return this.originalResponse.contentLength;
}
/**
* If the file has an MD5 hash and the
* request is to read the full file, this response header is returned so that
* the client can check for message content integrity. If the request is to
* read a specified range and the 'x-ms-range-get-content-md5' is set to
* true, then the request returns an MD5 hash for the range, as long as the
* range size is less than or equal to 4 MB. If neither of these sets of
* conditions is true, then no value is returned for the 'Content-MD5'
* header.
*
* @readonly
*/
get contentMD5() {
return this.originalResponse.contentMD5;
}
/**
* Indicates the range of bytes returned if
* the client requested a subset of the file by setting the Range request
* header.
*
* @readonly
*/
get contentRange() {
return this.originalResponse.contentRange;
}
/**
* The content type specified for the file.
* The default content type is 'application/octet-stream'
*
* @readonly
*/
get contentType() {
return this.originalResponse.contentType;
}
/**
* Conclusion time of the last attempted
* Copy File operation where this file was the destination file. This value
* can specify the time of a completed, aborted, or failed copy attempt.
*
* @readonly
*/
get copyCompletedOn() {
return this.originalResponse.copyCompletedOn;
}
/**
* String identifier for the last attempted Copy
* File operation where this file was the destination file.
*
* @readonly
*/
get copyId() {
return this.originalResponse.copyId;
}
/**
* Contains the number of bytes copied and
* the total bytes in the source in the last attempted Copy File operation
* where this file was the destination file. Can show between 0 and
* Content-Length bytes copied.
*
* @readonly
*/
get copyProgress() {
return this.originalResponse.copyProgress;
}
/**
* URL up to 2KB in length that specifies the
* source file used in the last attempted Copy File operation where this file
* was the destination file.
*
* @readonly
*/
get copySource() {
return this.originalResponse.copySource;
}
/**
* State of the copy operation
* identified by 'x-ms-copy-id'. Possible values include: 'pending',
* 'success', 'aborted', 'failed'
*
* @readonly
*/
get copyStatus() {
return this.originalResponse.copyStatus;
}
/**
* Only appears when
* x-ms-copy-status is failed or pending. Describes cause of fatal or
* non-fatal copy operation failure.
*
* @readonly
*/
get copyStatusDescription() {
return this.originalResponse.copyStatusDescription;
}
/**
* When a blob is leased,
* specifies whether the lease is of infinite or fixed duration. Possible
* values include: 'infinite', 'fixed'.
*
* @readonly
*/
get leaseDuration() {
return this.originalResponse.leaseDuration;
}
/**
* Lease state of the blob. Possible
* values include: 'available', 'leased', 'expired', 'breaking', 'broken'.
*
* @readonly
*/
get leaseState() {
return this.originalResponse.leaseState;
}
/**
* The current lease status of the
* blob. Possible values include: 'locked', 'unlocked'.
*
* @readonly
*/
get leaseStatus() {
return this.originalResponse.leaseStatus;
}
/**
* A UTC date/time value generated by the service that
* indicates the time at which the response was initiated.
*
* @readonly
*/
get date() {
return this.originalResponse.date;
}
/**
* The number of committed blocks
* present in the blob. This header is returned only for append blobs.
*
* @readonly
*/
get blobCommittedBlockCount() {
return this.originalResponse.blobCommittedBlockCount;
}
/**
* The ETag contains a value that you can use to
* perform operations conditionally, in quotes.
*
* @readonly
*/
get etag() {
return this.originalResponse.etag;
}
/**
* The number of tags associated with the blob
*
* @readonly
*/
get tagCount() {
return this.originalResponse.tagCount;
}
/**
* The error code.
*
* @readonly
*/
get errorCode() {
return this.originalResponse.errorCode;
}
/**
* The value of this header is set to
* true if the file data and application metadata are completely encrypted
* using the specified algorithm. Otherwise, the value is set to false (when
* the file is unencrypted, or if only parts of the file/application metadata
* are encrypted).
*
* @readonly
*/
get isServerEncrypted() {
return this.originalResponse.isServerEncrypted;
}
/**
* If the blob has a MD5 hash, and if
* request contains range header (Range or x-ms-range), this response header
* is returned with the value of the whole blob's MD5 value. This value may
* or may not be equal to the value returned in Content-MD5 header, with the
* latter calculated from the requested range.
*
* @readonly
*/
get blobContentMD5() {
return this.originalResponse.blobContentMD5;
}
/**
* Returns the date and time the file was last
* modified. Any operation that modifies the file or its properties updates
* the last modified time.
*
* @readonly
*/
get lastModified() {
return this.originalResponse.lastModified;
}
/**
* Returns the UTC date and time generated by the service that indicates the time at which the blob was
* last read or written to.
*
* @readonly
*/
get lastAccessed() {
return this.originalResponse.lastAccessed;
}
/**
* A name-value pair
* to associate with a file storage object.
*
* @readonly
*/
get metadata() {
return this.originalResponse.metadata;
}
/**
* This header uniquely identifies the request
* that was made and can be used for troubleshooting the request.
*
* @readonly
*/
get requestId() {
return this.originalResponse.requestId;
}
/**
* If a client request id header is sent in the request, this header will be present in the
* response with the same value.
*
* @readonly
*/
get clientRequestId() {
return this.originalResponse.clientRequestId;
}
/**
* Indicates the version of the Blob service used
* to execute the request.
*
* @readonly
*/
get version() {
return this.originalResponse.version;
}
/**
* Indicates the versionId of the downloaded blob version.
*
* @readonly
*/
get versionId() {
return this.originalResponse.versionId;
}
/**
* Indicates whether version of this blob is a current version.
*
* @readonly
*/
get isCurrentVersion() {
return this.originalResponse.isCurrentVersion;
}
/**
* The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned
* when the blob was encrypted with a customer-provided key.
*
* @readonly
*/
get encryptionKeySha256() {
return this.originalResponse.encryptionKeySha256;
}
/**
* If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to
* true, then the request returns a crc64 for the range, as long as the range size is less than
* or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is
* specified in the same request, it will fail with 400(Bad Request)
*/
get contentCrc64() {
return this.originalResponse.contentCrc64;
}
/**
* Object Replication Policy Id of the destination blob.
*
* @readonly
*/
get objectReplicationDestinationPolicyId() {
return this.originalResponse.objectReplicationDestinationPolicyId;
}
/**
* Parsed Object Replication Policy Id, Rule Id(s) and status of the source blob.
*
* @readonly
*/
get objectReplicationSourceProperties() {
return this.originalResponse.objectReplicationSourceProperties;
}
/**
* If this blob has been sealed.
*
* @readonly
*/
get isSealed() {
return this.originalResponse.isSealed;
}
/**
* UTC date/time value generated by the service that indicates the time at which the blob immutability policy will expire.
*
* @readonly
*/
get immutabilityPolicyExpiresOn() {
return this.originalResponse.immutabilityPolicyExpiresOn;
}
/**
* Indicates immutability policy mode.
*
* @readonly
*/
get immutabilityPolicyMode() {
return this.originalResponse.immutabilityPolicyMode;
}
/**
* Indicates if a legal hold is present on the blob.
*
* @readonly
*/
get legalHold() {
return this.originalResponse.legalHold;
}
/**
* The response body as a browser Blob.
* Always undefined in node.js.
*
* @readonly
*/
get contentAsBlob() {
return this.originalResponse.blobBody;
}
/**
* The response body as a node.js Readable stream.
* Always undefined in the browser.
*
* It will automatically retry when internal read stream unexpected ends.
*
* @readonly
*/
get readableStreamBody() {
return isNode ? this.blobDownloadStream : undefined;
}
/**
* The HTTP response.
*/
get _response() {
return this.originalResponse._response;
}
}
//# sourceMappingURL=BlobDownloadResponse.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,221 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { generateUuid } from "@azure/core-http";
import { StorageClientContext } from "./generated/src/index";
import { SpanStatusCode } from "@azure/core-tracing";
import { Blob as StorageBlob, Container } from "./generated/src/operations";
import { ETagNone } from "./utils/constants";
import { convertTracingToRequestOptionsBase, createSpan } from "./utils/tracing";
/**
* A client that manages leases for a {@link ContainerClient} or a {@link BlobClient}.
*/
export class BlobLeaseClient {
/**
* Creates an instance of BlobLeaseClient.
* @param client - The client to make the lease operation requests.
* @param leaseId - Initial proposed lease id.
*/
constructor(client, leaseId) {
const clientContext = new StorageClientContext(client.url, client.pipeline.toServiceClientOptions());
this._url = client.url;
if (client.name === undefined) {
this._isContainer = true;
this._containerOrBlobOperation = new Container(clientContext);
}
else {
this._isContainer = false;
this._containerOrBlobOperation = new StorageBlob(clientContext);
}
if (!leaseId) {
leaseId = generateUuid();
}
this._leaseId = leaseId;
}
/**
* Gets the lease Id.
*
* @readonly
*/
get leaseId() {
return this._leaseId;
}
/**
* Gets the url.
*
* @readonly
*/
get url() {
return this._url;
}
/**
* Establishes and manages a lock on a container for delete operations, or on a blob
* for write and delete operations.
* The lock duration can be 15 to 60 seconds, or can be infinite.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container
* and
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob
*
* @param duration - Must be between 15 to 60 seconds, or infinite (-1)
* @param options - option to configure lease management operations.
* @returns Response data for acquire lease operation.
*/
async acquireLease(duration, options = {}) {
var _a, _b, _c, _d, _e, _f;
const { span, updatedOptions } = createSpan("BlobLeaseClient-acquireLease", options);
if (this._isContainer &&
((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||
(((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||
((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
}
try {
return await this._containerOrBlobOperation.acquireLease(Object.assign({ abortSignal: options.abortSignal, duration, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }), proposedLeaseId: this._leaseId }, convertTracingToRequestOptionsBase(updatedOptions)));
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* To change the ID of the lease.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container
* and
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob
*
* @param proposedLeaseId - the proposed new lease Id.
* @param options - option to configure lease management operations.
* @returns Response data for change lease operation.
*/
async changeLease(proposedLeaseId, options = {}) {
var _a, _b, _c, _d, _e, _f;
const { span, updatedOptions } = createSpan("BlobLeaseClient-changeLease", options);
if (this._isContainer &&
((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||
(((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||
((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
}
try {
const response = await this._containerOrBlobOperation.changeLease(this._leaseId, proposedLeaseId, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));
this._leaseId = proposedLeaseId;
return response;
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* To free the lease if it is no longer needed so that another client may
* immediately acquire a lease against the container or the blob.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container
* and
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob
*
* @param options - option to configure lease management operations.
* @returns Response data for release lease operation.
*/
async releaseLease(options = {}) {
var _a, _b, _c, _d, _e, _f;
const { span, updatedOptions } = createSpan("BlobLeaseClient-releaseLease", options);
if (this._isContainer &&
((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||
(((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||
((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
}
try {
return await this._containerOrBlobOperation.releaseLease(this._leaseId, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* To renew the lease.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container
* and
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob
*
* @param options - Optional option to configure lease management operations.
* @returns Response data for renew lease operation.
*/
async renewLease(options = {}) {
var _a, _b, _c, _d, _e, _f;
const { span, updatedOptions } = createSpan("BlobLeaseClient-renewLease", options);
if (this._isContainer &&
((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||
(((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||
((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
}
try {
return await this._containerOrBlobOperation.renewLease(this._leaseId, Object.assign({ abortSignal: options.abortSignal, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions)));
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* To end the lease but ensure that another client cannot acquire a new lease
* until the current lease period has expired.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-container
* and
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/lease-blob
*
* @param breakPeriod - Break period
* @param options - Optional options to configure lease management operations.
* @returns Response data for break lease operation.
*/
async breakLease(breakPeriod, options = {}) {
var _a, _b, _c, _d, _e, _f;
const { span, updatedOptions } = createSpan("BlobLeaseClient-breakLease", options);
if (this._isContainer &&
((((_a = options.conditions) === null || _a === void 0 ? void 0 : _a.ifMatch) && ((_b = options.conditions) === null || _b === void 0 ? void 0 : _b.ifMatch) !== ETagNone) ||
(((_c = options.conditions) === null || _c === void 0 ? void 0 : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === void 0 ? void 0 : _d.ifNoneMatch) !== ETagNone) ||
((_e = options.conditions) === null || _e === void 0 ? void 0 : _e.tagConditions))) {
throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable.");
}
try {
const operationOptions = Object.assign({ abortSignal: options.abortSignal, breakPeriod, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_f = options.conditions) === null || _f === void 0 ? void 0 : _f.tagConditions }) }, convertTracingToRequestOptionsBase(updatedOptions));
return await this._containerOrBlobOperation.breakLease(operationOptions);
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
}
//# sourceMappingURL=BlobLeaseClient.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,362 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
* ONLY AVAILABLE IN BROWSER RUNTIME.
*
* BlobQueryResponse implements BlobDownloadResponseModel interface, and in browser runtime it will
* parse avor data returned by blob query.
*/
export class BlobQueryResponse {
/**
* Creates an instance of BlobQueryResponse.
*
* @param originalResponse -
* @param options -
*/
constructor(originalResponse, _options = {}) {
this.originalResponse = originalResponse;
}
/**
* Indicates that the service supports
* requests for partial file content.
*
* @readonly
*/
get acceptRanges() {
return this.originalResponse.acceptRanges;
}
/**
* Returns if it was previously specified
* for the file.
*
* @readonly
*/
get cacheControl() {
return this.originalResponse.cacheControl;
}
/**
* Returns the value that was specified
* for the 'x-ms-content-disposition' header and specifies how to process the
* response.
*
* @readonly
*/
get contentDisposition() {
return this.originalResponse.contentDisposition;
}
/**
* Returns the value that was specified
* for the Content-Encoding request header.
*
* @readonly
*/
get contentEncoding() {
return this.originalResponse.contentEncoding;
}
/**
* Returns the value that was specified
* for the Content-Language request header.
*
* @readonly
*/
get contentLanguage() {
return this.originalResponse.contentLanguage;
}
/**
* The current sequence number for a
* page blob. This header is not returned for block blobs or append blobs.
*
* @readonly
*/
get blobSequenceNumber() {
return this.originalResponse.blobSequenceNumber;
}
/**
* The blob's type. Possible values include:
* 'BlockBlob', 'PageBlob', 'AppendBlob'.
*
* @readonly
*/
get blobType() {
return this.originalResponse.blobType;
}
/**
* The number of bytes present in the
* response body.
*
* @readonly
*/
get contentLength() {
return this.originalResponse.contentLength;
}
/**
* If the file has an MD5 hash and the
* request is to read the full file, this response header is returned so that
* the client can check for message content integrity. If the request is to
* read a specified range and the 'x-ms-range-get-content-md5' is set to
* true, then the request returns an MD5 hash for the range, as long as the
* range size is less than or equal to 4 MB. If neither of these sets of
* conditions is true, then no value is returned for the 'Content-MD5'
* header.
*
* @readonly
*/
get contentMD5() {
return this.originalResponse.contentMD5;
}
/**
* Indicates the range of bytes returned if
* the client requested a subset of the file by setting the Range request
* header.
*
* @readonly
*/
get contentRange() {
return this.originalResponse.contentRange;
}
/**
* The content type specified for the file.
* The default content type is 'application/octet-stream'
*
* @readonly
*/
get contentType() {
return this.originalResponse.contentType;
}
/**
* Conclusion time of the last attempted
* Copy File operation where this file was the destination file. This value
* can specify the time of a completed, aborted, or failed copy attempt.
*
* @readonly
*/
get copyCompletedOn() {
return undefined;
}
/**
* String identifier for the last attempted Copy
* File operation where this file was the destination file.
*
* @readonly
*/
get copyId() {
return this.originalResponse.copyId;
}
/**
* Contains the number of bytes copied and
* the total bytes in the source in the last attempted Copy File operation
* where this file was the destination file. Can show between 0 and
* Content-Length bytes copied.
*
* @readonly
*/
get copyProgress() {
return this.originalResponse.copyProgress;
}
/**
* URL up to 2KB in length that specifies the
* source file used in the last attempted Copy File operation where this file
* was the destination file.
*
* @readonly
*/
get copySource() {
return this.originalResponse.copySource;
}
/**
* State of the copy operation
* identified by 'x-ms-copy-id'. Possible values include: 'pending',
* 'success', 'aborted', 'failed'
*
* @readonly
*/
get copyStatus() {
return this.originalResponse.copyStatus;
}
/**
* Only appears when
* x-ms-copy-status is failed or pending. Describes cause of fatal or
* non-fatal copy operation failure.
*
* @readonly
*/
get copyStatusDescription() {
return this.originalResponse.copyStatusDescription;
}
/**
* When a blob is leased,
* specifies whether the lease is of infinite or fixed duration. Possible
* values include: 'infinite', 'fixed'.
*
* @readonly
*/
get leaseDuration() {
return this.originalResponse.leaseDuration;
}
/**
* Lease state of the blob. Possible
* values include: 'available', 'leased', 'expired', 'breaking', 'broken'.
*
* @readonly
*/
get leaseState() {
return this.originalResponse.leaseState;
}
/**
* The current lease status of the
* blob. Possible values include: 'locked', 'unlocked'.
*
* @readonly
*/
get leaseStatus() {
return this.originalResponse.leaseStatus;
}
/**
* A UTC date/time value generated by the service that
* indicates the time at which the response was initiated.
*
* @readonly
*/
get date() {
return this.originalResponse.date;
}
/**
* The number of committed blocks
* present in the blob. This header is returned only for append blobs.
*
* @readonly
*/
get blobCommittedBlockCount() {
return this.originalResponse.blobCommittedBlockCount;
}
/**
* The ETag contains a value that you can use to
* perform operations conditionally, in quotes.
*
* @readonly
*/
get etag() {
return this.originalResponse.etag;
}
/**
* The error code.
*
* @readonly
*/
get errorCode() {
return this.originalResponse.errorCode;
}
/**
* The value of this header is set to
* true if the file data and application metadata are completely encrypted
* using the specified algorithm. Otherwise, the value is set to false (when
* the file is unencrypted, or if only parts of the file/application metadata
* are encrypted).
*
* @readonly
*/
get isServerEncrypted() {
return this.originalResponse.isServerEncrypted;
}
/**
* If the blob has a MD5 hash, and if
* request contains range header (Range or x-ms-range), this response header
* is returned with the value of the whole blob's MD5 value. This value may
* or may not be equal to the value returned in Content-MD5 header, with the
* latter calculated from the requested range.
*
* @readonly
*/
get blobContentMD5() {
return this.originalResponse.blobContentMD5;
}
/**
* Returns the date and time the file was last
* modified. Any operation that modifies the file or its properties updates
* the last modified time.
*
* @readonly
*/
get lastModified() {
return this.originalResponse.lastModified;
}
/**
* A name-value pair
* to associate with a file storage object.
*
* @readonly
*/
get metadata() {
return this.originalResponse.metadata;
}
/**
* This header uniquely identifies the request
* that was made and can be used for troubleshooting the request.
*
* @readonly
*/
get requestId() {
return this.originalResponse.requestId;
}
/**
* If a client request id header is sent in the request, this header will be present in the
* response with the same value.
*
* @readonly
*/
get clientRequestId() {
return this.originalResponse.clientRequestId;
}
/**
* Indicates the version of the File service used
* to execute the request.
*
* @readonly
*/
get version() {
return this.originalResponse.version;
}
/**
* The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned
* when the blob was encrypted with a customer-provided key.
*
* @readonly
*/
get encryptionKeySha256() {
return this.originalResponse.encryptionKeySha256;
}
/**
* If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to
* true, then the request returns a crc64 for the range, as long as the range size is less than
* or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is
* specified in the same request, it will fail with 400(Bad Request)
*/
get contentCrc64() {
return this.originalResponse.contentCrc64;
}
/**
* The response body as a browser Blob.
* Always undefined in node.js.
*
* @readonly
*/
get blobBody() {
throw Error(`Quick query in browser is not supported yet.`);
}
/**
* The response body as a node.js Readable stream.
* Always undefined in the browser.
*
* @readonly
*/
get readableStreamBody() {
return undefined;
}
/**
* The HTTP response.
*/
get _response() {
return this.originalResponse._response;
}
}
//# sourceMappingURL=BlobQueryResponse.browser.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,367 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isNode } from "@azure/core-http";
import { BlobQuickQueryStream } from "./utils/BlobQuickQueryStream";
/**
* ONLY AVAILABLE IN NODE.JS RUNTIME.
*
* BlobQueryResponse implements BlobDownloadResponseModel interface, and in Node.js runtime it will
* parse avor data returned by blob query.
*/
export class BlobQueryResponse {
/**
* Creates an instance of BlobQueryResponse.
*
* @param originalResponse -
* @param options -
*/
constructor(originalResponse, options = {}) {
this.originalResponse = originalResponse;
this.blobDownloadStream = new BlobQuickQueryStream(this.originalResponse.readableStreamBody, options);
}
/**
* Indicates that the service supports
* requests for partial file content.
*
* @readonly
*/
get acceptRanges() {
return this.originalResponse.acceptRanges;
}
/**
* Returns if it was previously specified
* for the file.
*
* @readonly
*/
get cacheControl() {
return this.originalResponse.cacheControl;
}
/**
* Returns the value that was specified
* for the 'x-ms-content-disposition' header and specifies how to process the
* response.
*
* @readonly
*/
get contentDisposition() {
return this.originalResponse.contentDisposition;
}
/**
* Returns the value that was specified
* for the Content-Encoding request header.
*
* @readonly
*/
get contentEncoding() {
return this.originalResponse.contentEncoding;
}
/**
* Returns the value that was specified
* for the Content-Language request header.
*
* @readonly
*/
get contentLanguage() {
return this.originalResponse.contentLanguage;
}
/**
* The current sequence number for a
* page blob. This header is not returned for block blobs or append blobs.
*
* @readonly
*/
get blobSequenceNumber() {
return this.originalResponse.blobSequenceNumber;
}
/**
* The blob's type. Possible values include:
* 'BlockBlob', 'PageBlob', 'AppendBlob'.
*
* @readonly
*/
get blobType() {
return this.originalResponse.blobType;
}
/**
* The number of bytes present in the
* response body.
*
* @readonly
*/
get contentLength() {
return this.originalResponse.contentLength;
}
/**
* If the file has an MD5 hash and the
* request is to read the full file, this response header is returned so that
* the client can check for message content integrity. If the request is to
* read a specified range and the 'x-ms-range-get-content-md5' is set to
* true, then the request returns an MD5 hash for the range, as long as the
* range size is less than or equal to 4 MB. If neither of these sets of
* conditions is true, then no value is returned for the 'Content-MD5'
* header.
*
* @readonly
*/
get contentMD5() {
return this.originalResponse.contentMD5;
}
/**
* Indicates the range of bytes returned if
* the client requested a subset of the file by setting the Range request
* header.
*
* @readonly
*/
get contentRange() {
return this.originalResponse.contentRange;
}
/**
* The content type specified for the file.
* The default content type is 'application/octet-stream'
*
* @readonly
*/
get contentType() {
return this.originalResponse.contentType;
}
/**
* Conclusion time of the last attempted
* Copy File operation where this file was the destination file. This value
* can specify the time of a completed, aborted, or failed copy attempt.
*
* @readonly
*/
get copyCompletedOn() {
return undefined;
}
/**
* String identifier for the last attempted Copy
* File operation where this file was the destination file.
*
* @readonly
*/
get copyId() {
return this.originalResponse.copyId;
}
/**
* Contains the number of bytes copied and
* the total bytes in the source in the last attempted Copy File operation
* where this file was the destination file. Can show between 0 and
* Content-Length bytes copied.
*
* @readonly
*/
get copyProgress() {
return this.originalResponse.copyProgress;
}
/**
* URL up to 2KB in length that specifies the
* source file used in the last attempted Copy File operation where this file
* was the destination file.
*
* @readonly
*/
get copySource() {
return this.originalResponse.copySource;
}
/**
* State of the copy operation
* identified by 'x-ms-copy-id'. Possible values include: 'pending',
* 'success', 'aborted', 'failed'
*
* @readonly
*/
get copyStatus() {
return this.originalResponse.copyStatus;
}
/**
* Only appears when
* x-ms-copy-status is failed or pending. Describes cause of fatal or
* non-fatal copy operation failure.
*
* @readonly
*/
get copyStatusDescription() {
return this.originalResponse.copyStatusDescription;
}
/**
* When a blob is leased,
* specifies whether the lease is of infinite or fixed duration. Possible
* values include: 'infinite', 'fixed'.
*
* @readonly
*/
get leaseDuration() {
return this.originalResponse.leaseDuration;
}
/**
* Lease state of the blob. Possible
* values include: 'available', 'leased', 'expired', 'breaking', 'broken'.
*
* @readonly
*/
get leaseState() {
return this.originalResponse.leaseState;
}
/**
* The current lease status of the
* blob. Possible values include: 'locked', 'unlocked'.
*
* @readonly
*/
get leaseStatus() {
return this.originalResponse.leaseStatus;
}
/**
* A UTC date/time value generated by the service that
* indicates the time at which the response was initiated.
*
* @readonly
*/
get date() {
return this.originalResponse.date;
}
/**
* The number of committed blocks
* present in the blob. This header is returned only for append blobs.
*
* @readonly
*/
get blobCommittedBlockCount() {
return this.originalResponse.blobCommittedBlockCount;
}
/**
* The ETag contains a value that you can use to
* perform operations conditionally, in quotes.
*
* @readonly
*/
get etag() {
return this.originalResponse.etag;
}
/**
* The error code.
*
* @readonly
*/
get errorCode() {
return this.originalResponse.errorCode;
}
/**
* The value of this header is set to
* true if the file data and application metadata are completely encrypted
* using the specified algorithm. Otherwise, the value is set to false (when
* the file is unencrypted, or if only parts of the file/application metadata
* are encrypted).
*
* @readonly
*/
get isServerEncrypted() {
return this.originalResponse.isServerEncrypted;
}
/**
* If the blob has a MD5 hash, and if
* request contains range header (Range or x-ms-range), this response header
* is returned with the value of the whole blob's MD5 value. This value may
* or may not be equal to the value returned in Content-MD5 header, with the
* latter calculated from the requested range.
*
* @readonly
*/
get blobContentMD5() {
return this.originalResponse.blobContentMD5;
}
/**
* Returns the date and time the file was last
* modified. Any operation that modifies the file or its properties updates
* the last modified time.
*
* @readonly
*/
get lastModified() {
return this.originalResponse.lastModified;
}
/**
* A name-value pair
* to associate with a file storage object.
*
* @readonly
*/
get metadata() {
return this.originalResponse.metadata;
}
/**
* This header uniquely identifies the request
* that was made and can be used for troubleshooting the request.
*
* @readonly
*/
get requestId() {
return this.originalResponse.requestId;
}
/**
* If a client request id header is sent in the request, this header will be present in the
* response with the same value.
*
* @readonly
*/
get clientRequestId() {
return this.originalResponse.clientRequestId;
}
/**
* Indicates the version of the File service used
* to execute the request.
*
* @readonly
*/
get version() {
return this.originalResponse.version;
}
/**
* The SHA-256 hash of the encryption key used to encrypt the blob. This value is only returned
* when the blob was encrypted with a customer-provided key.
*
* @readonly
*/
get encryptionKeySha256() {
return this.originalResponse.encryptionKeySha256;
}
/**
* If the request is to read a specified range and the x-ms-range-get-content-crc64 is set to
* true, then the request returns a crc64 for the range, as long as the range size is less than
* or equal to 4 MB. If both x-ms-range-get-content-crc64 & x-ms-range-get-content-md5 is
* specified in the same request, it will fail with 400(Bad Request)
*/
get contentCrc64() {
return this.originalResponse.contentCrc64;
}
/**
* The response body as a browser Blob.
* Always undefined in node.js.
*
* @readonly
*/
get blobBody() {
return undefined;
}
/**
* The response body as a node.js Readable stream.
* Always undefined in the browser.
*
* It will parse avor data returned by blob query.
*
* @readonly
*/
get readableStreamBody() {
return isNode ? this.blobDownloadStream : undefined;
}
/**
* The HTTP response.
*/
get _response() {
return this.originalResponse._response;
}
}
//# sourceMappingURL=BlobQueryResponse.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,786 @@
import { __asyncDelegator, __asyncGenerator, __asyncValues, __await } from "tslib";
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isTokenCredential, isNode, getDefaultProxySettings, } from "@azure/core-http";
import { SpanStatusCode } from "@azure/core-tracing";
import { Container, Service } from "./generated/src/operations";
import { newPipeline, isPipelineLike } from "./Pipeline";
import { ContainerClient, } from "./ContainerClient";
import { appendToURLPath, appendToURLQuery, extractConnectionStringParts, toTags, } from "./utils/utils.common";
import { StorageSharedKeyCredential } from "./credentials/StorageSharedKeyCredential";
import { AnonymousCredential } from "./credentials/AnonymousCredential";
import "@azure/core-paging";
import { truncatedISO8061Date } from "./utils/utils.common";
import { convertTracingToRequestOptionsBase, createSpan } from "./utils/tracing";
import { BlobBatchClient } from "./BlobBatchClient";
import { StorageClient } from "./StorageClient";
import { AccountSASPermissions } from "./sas/AccountSASPermissions";
import { generateAccountSASQueryParameters } from "./sas/AccountSASSignatureValues";
import { AccountSASServices } from "./sas/AccountSASServices";
/**
* A BlobServiceClient represents a Client to the Azure Storage Blob service allowing you
* to manipulate blob containers.
*/
export class BlobServiceClient extends StorageClient {
constructor(url, credentialOrPipeline,
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
options) {
let pipeline;
if (isPipelineLike(credentialOrPipeline)) {
pipeline = credentialOrPipeline;
}
else if ((isNode && credentialOrPipeline instanceof StorageSharedKeyCredential) ||
credentialOrPipeline instanceof AnonymousCredential ||
isTokenCredential(credentialOrPipeline)) {
pipeline = newPipeline(credentialOrPipeline, options);
}
else {
// The second parameter is undefined. Use anonymous credential
pipeline = newPipeline(new AnonymousCredential(), options);
}
super(url, pipeline);
this.serviceContext = new Service(this.storageClientContext);
}
/**
*
* Creates an instance of BlobServiceClient from connection string.
*
* @param connectionString - Account connection string or a SAS connection string of an Azure storage account.
* [ Note - Account connection string can only be used in NODE.JS runtime. ]
* Account connection string example -
* `DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=accountKey;EndpointSuffix=core.windows.net`
* SAS connection string example -
* `BlobEndpoint=https://myaccount.blob.core.windows.net/;QueueEndpoint=https://myaccount.queue.core.windows.net/;FileEndpoint=https://myaccount.file.core.windows.net/;TableEndpoint=https://myaccount.table.core.windows.net/;SharedAccessSignature=sasString`
* @param options - Optional. Options to configure the HTTP pipeline.
*/
static fromConnectionString(connectionString,
// Legacy, no fix for eslint error without breaking. Disable it for this interface.
/* eslint-disable-next-line @azure/azure-sdk/ts-naming-options*/
options) {
options = options || {};
const extractedCreds = extractConnectionStringParts(connectionString);
if (extractedCreds.kind === "AccountConnString") {
if (isNode) {
const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey);
if (!options.proxyOptions) {
options.proxyOptions = getDefaultProxySettings(extractedCreds.proxyUri);
}
const pipeline = newPipeline(sharedKeyCredential, options);
return new BlobServiceClient(extractedCreds.url, pipeline);
}
else {
throw new Error("Account connection string is only supported in Node.js environment");
}
}
else if (extractedCreds.kind === "SASConnString") {
const pipeline = newPipeline(new AnonymousCredential(), options);
return new BlobServiceClient(extractedCreds.url + "?" + extractedCreds.accountSas, pipeline);
}
else {
throw new Error("Connection string must be either an Account connection string or a SAS connection string");
}
}
/**
* Creates a {@link ContainerClient} object
*
* @param containerName - A container name
* @returns A new ContainerClient object for the given container name.
*
* Example usage:
*
* ```js
* const containerClient = blobServiceClient.getContainerClient("<container name>");
* ```
*/
getContainerClient(containerName) {
return new ContainerClient(appendToURLPath(this.url, encodeURIComponent(containerName)), this.pipeline);
}
/**
* Create a Blob container.
*
* @param containerName - Name of the container to create.
* @param options - Options to configure Container Create operation.
* @returns Container creation response and the corresponding container client.
*/
async createContainer(containerName, options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-createContainer", options);
try {
const containerClient = this.getContainerClient(containerName);
const containerCreateResponse = await containerClient.create(updatedOptions);
return {
containerClient,
containerCreateResponse,
};
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* Deletes a Blob container.
*
* @param containerName - Name of the container to delete.
* @param options - Options to configure Container Delete operation.
* @returns Container deletion response.
*/
async deleteContainer(containerName, options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-deleteContainer", options);
try {
const containerClient = this.getContainerClient(containerName);
return await containerClient.delete(updatedOptions);
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* Restore a previously deleted Blob container.
* This API is only functional if Container Soft Delete is enabled for the storage account associated with the container.
*
* @param deletedContainerName - Name of the previously deleted container.
* @param deletedContainerVersion - Version of the previously deleted container, used to uniquely identify the deleted container.
* @param options - Options to configure Container Restore operation.
* @returns Container deletion response.
*/
async undeleteContainer(deletedContainerName, deletedContainerVersion, options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-undeleteContainer", options);
try {
const containerClient = this.getContainerClient(options.destinationContainerName || deletedContainerName);
// Hack to access a protected member.
const containerContext = new Container(containerClient["storageClientContext"]);
const containerUndeleteResponse = await containerContext.restore(Object.assign({ deletedContainerName,
deletedContainerVersion }, updatedOptions));
return { containerClient, containerUndeleteResponse };
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* Rename an existing Blob Container.
*
* @param sourceContainerName - The name of the source container.
* @param destinationContainerName - The new name of the container.
* @param options - Options to configure Container Rename operation.
*/
/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */
// @ts-ignore Need to hide this interface for now. Make it public and turn on the live tests for it when the service is ready.
async renameContainer(sourceContainerName, destinationContainerName, options = {}) {
var _a;
const { span, updatedOptions } = createSpan("BlobServiceClient-renameContainer", options);
try {
const containerClient = this.getContainerClient(destinationContainerName);
// Hack to access a protected member.
const containerContext = new Container(containerClient["storageClientContext"]);
const containerRenameResponse = await containerContext.rename(sourceContainerName, Object.assign(Object.assign({}, updatedOptions), { sourceLeaseId: (_a = options.sourceCondition) === null || _a === void 0 ? void 0 : _a.leaseId }));
return { containerClient, containerRenameResponse };
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* Gets the properties of a storage accounts Blob service, including properties
* for Storage Analytics and CORS (Cross-Origin Resource Sharing) rules.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-service-properties
*
* @param options - Options to the Service Get Properties operation.
* @returns Response data for the Service Get Properties operation.
*/
async getProperties(options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-getProperties", options);
try {
return await this.serviceContext.getProperties(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* Sets properties for a storage accounts Blob service endpoint, including properties
* for Storage Analytics, CORS (Cross-Origin Resource Sharing) rules and soft delete settings.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/set-blob-service-properties
*
* @param properties -
* @param options - Options to the Service Set Properties operation.
* @returns Response data for the Service Set Properties operation.
*/
async setProperties(properties, options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-setProperties", options);
try {
return await this.serviceContext.setProperties(properties, Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* Retrieves statistics related to replication for the Blob service. It is only
* available on the secondary location endpoint when read-access geo-redundant
* replication is enabled for the storage account.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-service-stats
*
* @param options - Options to the Service Get Statistics operation.
* @returns Response data for the Service Get Statistics operation.
*/
async getStatistics(options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-getStatistics", options);
try {
return await this.serviceContext.getStatistics(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* The Get Account Information operation returns the sku name and account kind
* for the specified account.
* The Get Account Information operation is available on service versions beginning
* with version 2018-03-28.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-account-information
*
* @param options - Options to the Service Get Account Info operation.
* @returns Response data for the Service Get Account Info operation.
*/
async getAccountInfo(options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-getAccountInfo", options);
try {
return await this.serviceContext.getAccountInfo(Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* Returns a list of the containers under the specified account.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/list-containers2
*
* @param marker - A string value that identifies the portion of
* the list of containers to be returned with the next listing operation. The
* operation returns the continuationToken value within the response body if the
* listing operation did not return all containers remaining to be listed
* with the current page. The continuationToken value can be used as the value for
* the marker parameter in a subsequent call to request the next page of list
* items. The marker value is opaque to the client.
* @param options - Options to the Service List Container Segment operation.
* @returns Response data for the Service List Container Segment operation.
*/
async listContainersSegment(marker, options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-listContainersSegment", options);
try {
return await this.serviceContext.listContainersSegment(Object.assign(Object.assign(Object.assign({ abortSignal: options.abortSignal, marker }, options), { include: typeof options.include === "string" ? [options.include] : options.include }), convertTracingToRequestOptionsBase(updatedOptions)));
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* The Filter Blobs operation enables callers to list blobs across all containers whose tags
* match a given search expression. Filter blobs searches across all containers within a
* storage account but can be scoped within the expression to a single container.
*
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
* The given expression must evaluate to true for a blob to be returned in the results.
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
* however, only a subset of the OData filter syntax is supported in the Blob service.
* @param marker - A string value that identifies the portion of
* the list of blobs to be returned with the next listing operation. The
* operation returns the continuationToken value within the response body if the
* listing operation did not return all blobs remaining to be listed
* with the current page. The continuationToken value can be used as the value for
* the marker parameter in a subsequent call to request the next page of list
* items. The marker value is opaque to the client.
* @param options - Options to find blobs by tags.
*/
async findBlobsByTagsSegment(tagFilterSqlExpression, marker, options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-findBlobsByTagsSegment", options);
try {
const response = await this.serviceContext.filterBlobs(Object.assign({ abortSignal: options.abortSignal, where: tagFilterSqlExpression, marker, maxPageSize: options.maxPageSize }, convertTracingToRequestOptionsBase(updatedOptions)));
const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, blobs: response.blobs.map((blob) => {
var _a;
let tagValue = "";
if (((_a = blob.tags) === null || _a === void 0 ? void 0 : _a.blobTagSet.length) === 1) {
tagValue = blob.tags.blobTagSet[0].value;
}
return Object.assign(Object.assign({}, blob), { tags: toTags(blob.tags), tagValue });
}) });
return wrappedResponse;
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* Returns an AsyncIterableIterator for ServiceFindBlobsByTagsSegmentResponse.
*
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
* The given expression must evaluate to true for a blob to be returned in the results.
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
* however, only a subset of the OData filter syntax is supported in the Blob service.
* @param marker - A string value that identifies the portion of
* the list of blobs to be returned with the next listing operation. The
* operation returns the continuationToken value within the response body if the
* listing operation did not return all blobs remaining to be listed
* with the current page. The continuationToken value can be used as the value for
* the marker parameter in a subsequent call to request the next page of list
* items. The marker value is opaque to the client.
* @param options - Options to find blobs by tags.
*/
findBlobsByTagsSegments(tagFilterSqlExpression, marker, options = {}) {
return __asyncGenerator(this, arguments, function* findBlobsByTagsSegments_1() {
let response;
if (!!marker || marker === undefined) {
do {
response = yield __await(this.findBlobsByTagsSegment(tagFilterSqlExpression, marker, options));
response.blobs = response.blobs || [];
marker = response.continuationToken;
yield yield __await(response);
} while (marker);
}
});
}
/**
* Returns an AsyncIterableIterator for blobs.
*
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
* The given expression must evaluate to true for a blob to be returned in the results.
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
* however, only a subset of the OData filter syntax is supported in the Blob service.
* @param options - Options to findBlobsByTagsItems.
*/
findBlobsByTagsItems(tagFilterSqlExpression, options = {}) {
return __asyncGenerator(this, arguments, function* findBlobsByTagsItems_1() {
var e_1, _a;
let marker;
try {
for (var _b = __asyncValues(this.findBlobsByTagsSegments(tagFilterSqlExpression, marker, options)), _c; _c = yield __await(_b.next()), !_c.done;) {
const segment = _c.value;
yield __await(yield* __asyncDelegator(__asyncValues(segment.blobs)));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));
}
finally { if (e_1) throw e_1.error; }
}
});
}
/**
* Returns an async iterable iterator to find all blobs with specified tag
* under the specified account.
*
* .byPage() returns an async iterable iterator to list the blobs in pages.
*
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-service-properties
*
* Example using `for await` syntax:
*
* ```js
* let i = 1;
* for await (const blob of blobServiceClient.findBlobsByTags("tagkey='tagvalue'")) {
* console.log(`Blob ${i++}: ${container.name}`);
* }
* ```
*
* Example using `iter.next()`:
*
* ```js
* let i = 1;
* const iter = blobServiceClient.findBlobsByTags("tagkey='tagvalue'");
* let blobItem = await iter.next();
* while (!blobItem.done) {
* console.log(`Blob ${i++}: ${blobItem.value.name}`);
* blobItem = await iter.next();
* }
* ```
*
* Example using `byPage()`:
*
* ```js
* // passing optional maxPageSize in the page settings
* let i = 1;
* for await (const response of blobServiceClient.findBlobsByTags("tagkey='tagvalue'").byPage({ maxPageSize: 20 })) {
* if (response.blobs) {
* for (const blob of response.blobs) {
* console.log(`Blob ${i++}: ${blob.name}`);
* }
* }
* }
* ```
*
* Example using paging with a marker:
*
* ```js
* let i = 1;
* let iterator = blobServiceClient.findBlobsByTags("tagkey='tagvalue'").byPage({ maxPageSize: 2 });
* let response = (await iterator.next()).value;
*
* // Prints 2 blob names
* if (response.blobs) {
* for (const blob of response.blobs) {
* console.log(`Blob ${i++}: ${blob.name}`);
* }
* }
*
* // Gets next marker
* let marker = response.continuationToken;
* // Passing next marker as continuationToken
* iterator = blobServiceClient
* .findBlobsByTags("tagkey='tagvalue'")
* .byPage({ continuationToken: marker, maxPageSize: 10 });
* response = (await iterator.next()).value;
*
* // Prints blob names
* if (response.blobs) {
* for (const blob of response.blobs) {
* console.log(`Blob ${i++}: ${blob.name}`);
* }
* }
* ```
*
* @param tagFilterSqlExpression - The where parameter enables the caller to query blobs whose tags match a given expression.
* The given expression must evaluate to true for a blob to be returned in the results.
* The[OData - ABNF] filter syntax rule defines the formal grammar for the value of the where query parameter;
* however, only a subset of the OData filter syntax is supported in the Blob service.
* @param options - Options to find blobs by tags.
*/
findBlobsByTags(tagFilterSqlExpression, options = {}) {
// AsyncIterableIterator to iterate over blobs
const listSegmentOptions = Object.assign({}, options);
const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions);
return {
/**
* The next method, part of the iteration protocol
*/
next() {
return iter.next();
},
/**
* The connection to the async iterator, part of the iteration protocol
*/
[Symbol.asyncIterator]() {
return this;
},
/**
* Return an AsyncIterableIterator that works a page at a time
*/
byPage: (settings = {}) => {
return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions));
},
};
}
/**
* Returns an AsyncIterableIterator for ServiceListContainersSegmentResponses
*
* @param marker - A string value that identifies the portion of
* the list of containers to be returned with the next listing operation. The
* operation returns the continuationToken value within the response body if the
* listing operation did not return all containers remaining to be listed
* with the current page. The continuationToken value can be used as the value for
* the marker parameter in a subsequent call to request the next page of list
* items. The marker value is opaque to the client.
* @param options - Options to list containers operation.
*/
listSegments(marker, options = {}) {
return __asyncGenerator(this, arguments, function* listSegments_1() {
let listContainersSegmentResponse;
if (!!marker || marker === undefined) {
do {
listContainersSegmentResponse = yield __await(this.listContainersSegment(marker, options));
listContainersSegmentResponse.containerItems =
listContainersSegmentResponse.containerItems || [];
marker = listContainersSegmentResponse.continuationToken;
yield yield __await(yield __await(listContainersSegmentResponse));
} while (marker);
}
});
}
/**
* Returns an AsyncIterableIterator for Container Items
*
* @param options - Options to list containers operation.
*/
listItems(options = {}) {
return __asyncGenerator(this, arguments, function* listItems_1() {
var e_2, _a;
let marker;
try {
for (var _b = __asyncValues(this.listSegments(marker, options)), _c; _c = yield __await(_b.next()), !_c.done;) {
const segment = _c.value;
yield __await(yield* __asyncDelegator(__asyncValues(segment.containerItems)));
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) yield __await(_a.call(_b));
}
finally { if (e_2) throw e_2.error; }
}
});
}
/**
* Returns an async iterable iterator to list all the containers
* under the specified account.
*
* .byPage() returns an async iterable iterator to list the containers in pages.
*
* Example using `for await` syntax:
*
* ```js
* let i = 1;
* for await (const container of blobServiceClient.listContainers()) {
* console.log(`Container ${i++}: ${container.name}`);
* }
* ```
*
* Example using `iter.next()`:
*
* ```js
* let i = 1;
* const iter = blobServiceClient.listContainers();
* let containerItem = await iter.next();
* while (!containerItem.done) {
* console.log(`Container ${i++}: ${containerItem.value.name}`);
* containerItem = await iter.next();
* }
* ```
*
* Example using `byPage()`:
*
* ```js
* // passing optional maxPageSize in the page settings
* let i = 1;
* for await (const response of blobServiceClient.listContainers().byPage({ maxPageSize: 20 })) {
* if (response.containerItems) {
* for (const container of response.containerItems) {
* console.log(`Container ${i++}: ${container.name}`);
* }
* }
* }
* ```
*
* Example using paging with a marker:
*
* ```js
* let i = 1;
* let iterator = blobServiceClient.listContainers().byPage({ maxPageSize: 2 });
* let response = (await iterator.next()).value;
*
* // Prints 2 container names
* if (response.containerItems) {
* for (const container of response.containerItems) {
* console.log(`Container ${i++}: ${container.name}`);
* }
* }
*
* // Gets next marker
* let marker = response.continuationToken;
* // Passing next marker as continuationToken
* iterator = blobServiceClient
* .listContainers()
* .byPage({ continuationToken: marker, maxPageSize: 10 });
* response = (await iterator.next()).value;
*
* // Prints 10 container names
* if (response.containerItems) {
* for (const container of response.containerItems) {
* console.log(`Container ${i++}: ${container.name}`);
* }
* }
* ```
*
* @param options - Options to list containers.
* @returns An asyncIterableIterator that supports paging.
*/
listContainers(options = {}) {
if (options.prefix === "") {
options.prefix = undefined;
}
const include = [];
if (options.includeDeleted) {
include.push("deleted");
}
if (options.includeMetadata) {
include.push("metadata");
}
if (options.includeSystem) {
include.push("system");
}
// AsyncIterableIterator to iterate over containers
const listSegmentOptions = Object.assign(Object.assign({}, options), (include.length > 0 ? { include } : {}));
const iter = this.listItems(listSegmentOptions);
return {
/**
* The next method, part of the iteration protocol
*/
next() {
return iter.next();
},
/**
* The connection to the async iterator, part of the iteration protocol
*/
[Symbol.asyncIterator]() {
return this;
},
/**
* Return an AsyncIterableIterator that works a page at a time
*/
byPage: (settings = {}) => {
return this.listSegments(settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions));
},
};
}
/**
* ONLY AVAILABLE WHEN USING BEARER TOKEN AUTHENTICATION (TokenCredential).
*
* Retrieves a user delegation key for the Blob service. This is only a valid operation when using
* bearer token authentication.
*
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/get-user-delegation-key
*
* @param startsOn - The start time for the user delegation SAS. Must be within 7 days of the current time
* @param expiresOn - The end time for the user delegation SAS. Must be within 7 days of the current time
*/
async getUserDelegationKey(startsOn, expiresOn, options = {}) {
const { span, updatedOptions } = createSpan("BlobServiceClient-getUserDelegationKey", options);
try {
const response = await this.serviceContext.getUserDelegationKey({
startsOn: truncatedISO8061Date(startsOn, false),
expiresOn: truncatedISO8061Date(expiresOn, false),
}, Object.assign({ abortSignal: options.abortSignal }, convertTracingToRequestOptionsBase(updatedOptions)));
const userDelegationKey = {
signedObjectId: response.signedObjectId,
signedTenantId: response.signedTenantId,
signedStartsOn: new Date(response.signedStartsOn),
signedExpiresOn: new Date(response.signedExpiresOn),
signedService: response.signedService,
signedVersion: response.signedVersion,
value: response.value,
};
const res = Object.assign({ _response: response._response, requestId: response.requestId, clientRequestId: response.clientRequestId, version: response.version, date: response.date, errorCode: response.errorCode }, userDelegationKey);
return res;
}
catch (e) {
span.setStatus({
code: SpanStatusCode.ERROR,
message: e.message,
});
throw e;
}
finally {
span.end();
}
}
/**
* Creates a BlobBatchClient object to conduct batch operations.
*
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/blob-batch
*
* @returns A new BlobBatchClient object for this service.
*/
getBlobBatchClient() {
return new BlobBatchClient(this.url, this.pipeline);
}
/**
* Only available for BlobServiceClient constructed with a shared key credential.
*
* Generates a Blob account Shared Access Signature (SAS) URI based on the client properties
* and parameters passed in. The SAS is signed by the shared key credential of the client.
*
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-account-sas
*
* @param expiresOn - Optional. The time at which the shared access signature becomes invalid. Default to an hour later if not provided.
* @param permissions - Specifies the list of permissions to be associated with the SAS.
* @param resourceTypes - Specifies the resource types associated with the shared access signature.
* @param options - Optional parameters.
* @returns An account SAS URI consisting of the URI to the resource represented by this client, followed by the generated SAS token.
*/
generateAccountSasUrl(expiresOn, permissions = AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) {
if (!(this.credential instanceof StorageSharedKeyCredential)) {
throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential");
}
if (expiresOn === undefined) {
const now = new Date();
expiresOn = new Date(now.getTime() + 3600 * 1000);
}
const sas = generateAccountSASQueryParameters(Object.assign({ permissions,
expiresOn,
resourceTypes, services: AccountSASServices.parse("b").toString() }, options), this.credential).toString();
return appendToURLQuery(this.url, sas);
}
}
//# sourceMappingURL=BlobServiceClient.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,24 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
* Function that converts PageRange and ClearRange to a common Range object.
* PageRange and ClearRange have start and end while Range offset and count
* this function normalizes to Range.
* @param response - Model PageBlob Range response
*/
export function rangeResponseFromModel(response) {
const pageRange = (response._response.parsedBody.pageRange || []).map((x) => ({
offset: x.start,
count: x.end - x.start,
}));
const clearRange = (response._response.parsedBody.clearRange || []).map((x) => ({
offset: x.start,
count: x.end - x.start,
}));
return Object.assign(Object.assign({}, response), { pageRange,
clearRange, _response: Object.assign(Object.assign({}, response._response), { parsedBody: {
pageRange,
clearRange,
} }) });
}
//# sourceMappingURL=PageBlobRangeResponse.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"PageBlobRangeResponse.js","sourceRoot":"","sources":["../../../src/PageBlobRangeResponse.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AA8ElC;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAqF;IAErF,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,EAAE,CAAC,CAAC,KAAK;QACf,KAAK,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK;KACvB,CAAC,CAAC,CAAC;IAEJ,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,EAAE,CAAC,CAAC,KAAK;QACf,KAAK,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK;KACvB,CAAC,CAAC,CAAC;IAEJ,uCACK,QAAQ,KACX,SAAS;QACT,UAAU,EACV,SAAS,kCACJ,QAAQ,CAAC,SAAS,KACrB,UAAU,EAAE;gBACV,SAAS;gBACT,UAAU;aACX,OAEH;AACJ,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { HttpResponse } from \"@azure/core-http\";\nimport {\n PageBlobGetPageRangesHeaders,\n PageBlobGetPageRangesDiffHeaders,\n PageBlobGetPageRangesResponseModel,\n PageBlobGetPageRangesDiffResponseModel,\n} from \"./generatedModels\";\nimport { Range } from \"./Range\";\n\n/**\n * List of page ranges for a blob.\n */\nexport interface PageList {\n /**\n * Valid non-overlapping page ranges.\n */\n pageRange?: Range[];\n /**\n * Present if the prevSnapshot parameter was specified and there were cleared\n * pages between the previous snapshot and the target snapshot.\n */\n clearRange?: Range[];\n}\n\n/**\n * Contains response data for the {@link BlobClient.getPageRanges} operation.\n */\nexport interface PageBlobGetPageRangesResponse extends PageList, PageBlobGetPageRangesHeaders {\n /**\n * The underlying HTTP response.\n */\n _response: HttpResponse & {\n /**\n * The parsed HTTP response headers.\n */\n parsedHeaders: PageBlobGetPageRangesHeaders;\n\n /**\n * The response body as text (string format)\n */\n bodyAsText: string;\n\n /**\n * The response body as parsed JSON or XML\n */\n parsedBody: PageList;\n };\n}\n\n/**\n * Contains response data for the {@link BlobClient.getPageRangesDiff} operation.\n */\nexport interface PageBlobGetPageRangesDiffResponse\n extends PageList,\n PageBlobGetPageRangesDiffHeaders {\n /**\n * The underlying HTTP response.\n */\n _response: HttpResponse & {\n /**\n * The parsed HTTP response headers.\n */\n parsedHeaders: PageBlobGetPageRangesDiffHeaders;\n\n /**\n * The response body as text (string format)\n */\n bodyAsText: string;\n\n /**\n * The response body as parsed JSON or XML\n */\n parsedBody: PageList;\n };\n}\n\n/**\n * Function that converts PageRange and ClearRange to a common Range object.\n * PageRange and ClearRange have start and end while Range offset and count\n * this function normalizes to Range.\n * @param response - Model PageBlob Range response\n */\nexport function rangeResponseFromModel(\n response: PageBlobGetPageRangesResponseModel | PageBlobGetPageRangesDiffResponseModel\n): PageBlobGetPageRangesResponse | PageBlobGetPageRangesDiffResponse {\n const pageRange = (response._response.parsedBody.pageRange || []).map((x) => ({\n offset: x.start,\n count: x.end - x.start,\n }));\n\n const clearRange = (response._response.parsedBody.clearRange || []).map((x) => ({\n offset: x.start,\n count: x.end - x.start,\n }));\n\n return {\n ...response,\n pageRange,\n clearRange,\n _response: {\n ...response._response,\n parsedBody: {\n pageRange,\n clearRange,\n },\n },\n };\n}\n"]}

View file

@ -0,0 +1,107 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, deserializationPolicy, disableResponseDecompressionPolicy, HttpHeaders, RequestPolicyOptions, WebResource, proxyPolicy, isNode, isTokenCredential, tracingPolicy, logPolicy, keepAlivePolicy, generateClientRequestIdPolicy, } from "@azure/core-http";
import { logger } from "./log";
import { StorageBrowserPolicyFactory } from "./StorageBrowserPolicyFactory";
import { StorageRetryPolicyFactory } from "./StorageRetryPolicyFactory";
import { AnonymousCredential } from "./credentials/AnonymousCredential";
import { StorageOAuthScopes, StorageBlobLoggingAllowedHeaderNames, StorageBlobLoggingAllowedQueryParameters, } from "./utils/constants";
import { TelemetryPolicyFactory } from "./TelemetryPolicyFactory";
import { getCachedDefaultHttpClient } from "./utils/cache";
import { attachCredential } from "./utils/utils.common";
import { storageBearerTokenChallengeAuthenticationPolicy } from "./policies/StorageBearerTokenChallengeAuthenticationPolicy";
// Export following interfaces and types for customers who want to implement their
// own RequestPolicy or HTTPClient
export { BaseRequestPolicy, StorageOAuthScopes, deserializationPolicy, HttpHeaders, WebResource, RequestPolicyOptions, };
/**
* A helper to decide if a given argument satisfies the Pipeline contract
* @param pipeline - An argument that may be a Pipeline
* @returns true when the argument satisfies the Pipeline contract
*/
export function isPipelineLike(pipeline) {
if (!pipeline || typeof pipeline !== "object") {
return false;
}
const castPipeline = pipeline;
return (Array.isArray(castPipeline.factories) &&
typeof castPipeline.options === "object" &&
typeof castPipeline.toServiceClientOptions === "function");
}
/**
* A Pipeline class containing HTTP request policies.
* You can create a default Pipeline by calling {@link newPipeline}.
* Or you can create a Pipeline with your own policies by the constructor of Pipeline.
*
* Refer to {@link newPipeline} and provided policies before implementing your
* customized Pipeline.
*/
export class Pipeline {
/**
* Creates an instance of Pipeline. Customize HTTPClient by implementing IHttpClient interface.
*
* @param factories -
* @param options -
*/
constructor(factories, options = {}) {
this.factories = factories;
// when options.httpClient is not specified, passing in a DefaultHttpClient instance to
// avoid each client creating its own http client.
this.options = Object.assign(Object.assign({}, options), { httpClient: options.httpClient || getCachedDefaultHttpClient() });
}
/**
* Transfer Pipeline object to ServiceClientOptions object which is required by
* ServiceClient constructor.
*
* @returns The ServiceClientOptions object from this Pipeline.
*/
toServiceClientOptions() {
return {
httpClient: this.options.httpClient,
requestPolicyFactories: this.factories,
};
}
}
/**
* Creates a new Pipeline object with Credential provided.
*
* @param credential - Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.
* @param pipelineOptions - Optional. Options.
* @returns A new Pipeline object.
*/
export function newPipeline(credential, pipelineOptions = {}) {
var _a;
if (credential === undefined) {
credential = new AnonymousCredential();
}
// Order is important. Closer to the API at the top & closer to the network at the bottom.
// The credential's policy factory must appear close to the wire so it can sign any
// changes made by other factories (like UniqueRequestIDPolicyFactory)
const telemetryPolicy = new TelemetryPolicyFactory(pipelineOptions.userAgentOptions);
const factories = [
tracingPolicy({ userAgent: telemetryPolicy.telemetryString }),
keepAlivePolicy(pipelineOptions.keepAliveOptions),
telemetryPolicy,
generateClientRequestIdPolicy(),
new StorageBrowserPolicyFactory(),
new StorageRetryPolicyFactory(pipelineOptions.retryOptions),
// Default deserializationPolicy is provided by protocol layer
// Use customized XML char key of "#" so we could deserialize metadata
// with "_" key
deserializationPolicy(undefined, { xmlCharKey: "#" }),
logPolicy({
logger: logger.info,
allowedHeaderNames: StorageBlobLoggingAllowedHeaderNames,
allowedQueryParameters: StorageBlobLoggingAllowedQueryParameters,
}),
];
if (isNode) {
// policies only available in Node.js runtime, not in browsers
factories.push(proxyPolicy(pipelineOptions.proxyOptions));
factories.push(disableResponseDecompressionPolicy());
}
factories.push(isTokenCredential(credential)
? attachCredential(storageBearerTokenChallengeAuthenticationPolicy(credential, (_a = pipelineOptions.audience) !== null && _a !== void 0 ? _a : StorageOAuthScopes), credential)
: credential);
return new Pipeline(factories, pipelineOptions);
}
//# sourceMappingURL=Pipeline.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,21 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
* Generate a range string. For example:
*
* "bytes=255-" or "bytes=0-511"
*
* @param iRange -
*/
export function rangeToString(iRange) {
if (iRange.offset < 0) {
throw new RangeError(`Range.offset cannot be smaller than 0.`);
}
if (iRange.count && iRange.count <= 0) {
throw new RangeError(`Range.count must be larger than 0. Leave it undefined if you want a range from offset to the end.`);
}
return iRange.count
? `bytes=${iRange.offset}-${iRange.offset + iRange.count - 1}`
: `bytes=${iRange.offset}-`;
}
//# sourceMappingURL=Range.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"Range.js","sourceRoot":"","sources":["../../../src/Range.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAkBlC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,MAAa;IACzC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACrB,MAAM,IAAI,UAAU,CAAC,wCAAwC,CAAC,CAAC;KAChE;IACD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE;QACrC,MAAM,IAAI,UAAU,CAClB,mGAAmG,CACpG,CAAC;KACH;IACD,OAAO,MAAM,CAAC,KAAK;QACjB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE;QAC9D,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,GAAG,CAAC;AAChC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * Range for Blob Service Operations.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/specifying-the-range-header-for-blob-service-operations\n */\nexport interface Range {\n /**\n * StartByte, larger than or equal 0.\n */\n offset: number;\n /**\n * Optional. Count of bytes, larger than 0.\n * If not provided, will return bytes from offset to the end.\n */\n count?: number;\n}\n\n/**\n * Generate a range string. For example:\n *\n * \"bytes=255-\" or \"bytes=0-511\"\n *\n * @param iRange -\n */\nexport function rangeToString(iRange: Range): string {\n if (iRange.offset < 0) {\n throw new RangeError(`Range.offset cannot be smaller than 0.`);\n }\n if (iRange.count && iRange.count <= 0) {\n throw new RangeError(\n `Range.count must be larger than 0. Leave it undefined if you want a range from offset to the end.`\n );\n }\n return iRange.count\n ? `bytes=${iRange.offset}-${iRange.offset + iRange.count - 1}`\n : `bytes=${iRange.offset}-`;\n}\n"]}

View file

@ -0,0 +1,19 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { StorageBrowserPolicy } from "./policies/StorageBrowserPolicy";
export { StorageBrowserPolicy };
/**
* StorageBrowserPolicyFactory is a factory class helping generating StorageBrowserPolicy objects.
*/
export class StorageBrowserPolicyFactory {
/**
* Creates a StorageBrowserPolicyFactory object.
*
* @param nextPolicy -
* @param options -
*/
create(nextPolicy, options) {
return new StorageBrowserPolicy(nextPolicy, options);
}
}
//# sourceMappingURL=StorageBrowserPolicyFactory.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"StorageBrowserPolicyFactory.js","sourceRoot":"","sources":["../../../src/StorageBrowserPolicyFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAGlC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAEhC;;GAEG;AACH,MAAM,OAAO,2BAA2B;IACtC;;;;;OAKG;IACI,MAAM,CAAC,UAAyB,EAAE,OAA6B;QACpE,OAAO,IAAI,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from \"@azure/core-http\";\nimport { StorageBrowserPolicy } from \"./policies/StorageBrowserPolicy\";\nexport { StorageBrowserPolicy };\n\n/**\n * StorageBrowserPolicyFactory is a factory class helping generating StorageBrowserPolicy objects.\n */\nexport class StorageBrowserPolicyFactory implements RequestPolicyFactory {\n /**\n * Creates a StorageBrowserPolicyFactory object.\n *\n * @param nextPolicy -\n * @param options -\n */\n public create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): StorageBrowserPolicy {\n return new StorageBrowserPolicy(nextPolicy, options);\n }\n}\n"]}

View file

@ -0,0 +1,42 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { StorageClientContext } from "./generated/src/storageClientContext";
import { escapeURLPath, getURLScheme, iEqual, getAccountNameFromUrl } from "./utils/utils.common";
import { AnonymousCredential } from "./credentials/AnonymousCredential";
import { StorageSharedKeyCredential } from "./credentials/StorageSharedKeyCredential";
import { isTokenCredential, isNode } from "@azure/core-http";
/**
* A StorageClient represents a based URL class for {@link BlobServiceClient}, {@link ContainerClient}
* and etc.
*/
export class StorageClient {
/**
* Creates an instance of StorageClient.
* @param url - url to resource
* @param pipeline - request policy pipeline.
*/
constructor(url, pipeline) {
// URL should be encoded and only once, protocol layer shouldn't encode URL again
this.url = escapeURLPath(url);
this.accountName = getAccountNameFromUrl(url);
this.pipeline = pipeline;
this.storageClientContext = new StorageClientContext(this.url, pipeline.toServiceClientOptions());
this.isHttps = iEqual(getURLScheme(this.url) || "", "https");
this.credential = new AnonymousCredential();
for (const factory of this.pipeline.factories) {
if ((isNode && factory instanceof StorageSharedKeyCredential) ||
factory instanceof AnonymousCredential) {
this.credential = factory;
}
else if (isTokenCredential(factory.credential)) {
// Only works if the factory has been attached a "credential" property.
// We do that in newPipeline() when using TokenCredential.
this.credential = factory.credential;
}
}
// Override protocol layer's default content-type
const storageClientContext = this.storageClientContext;
storageClientContext.requestContentType = undefined;
}
}
//# sourceMappingURL=StorageClient.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"StorageClient.js","sourceRoot":"","sources":["../../../src/StorageClient.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAmB,iBAAiB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAa9E;;;GAGG;AACH,MAAM,OAAgB,aAAa;IAyBjC;;;;OAIG;IACH,YAAsB,GAAW,EAAE,QAAsB;QACvD,iFAAiF;QACjF,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,oBAAoB,GAAG,IAAI,oBAAoB,CAClD,IAAI,CAAC,GAAG,EACR,QAAQ,CAAC,sBAAsB,EAAE,CAClC,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QAE7D,IAAI,CAAC,UAAU,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC5C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YAC7C,IACE,CAAC,MAAM,IAAI,OAAO,YAAY,0BAA0B,CAAC;gBACzD,OAAO,YAAY,mBAAmB,EACtC;gBACA,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;aAC3B;iBAAM,IAAI,iBAAiB,CAAE,OAAe,CAAC,UAAU,CAAC,EAAE;gBACzD,uEAAuE;gBACvE,0DAA0D;gBAC1D,IAAI,CAAC,UAAU,GAAI,OAAe,CAAC,UAAU,CAAC;aAC/C;SACF;QAED,iDAAiD;QACjD,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAA2B,CAAC;QAC9D,oBAAoB,CAAC,kBAAkB,GAAG,SAAS,CAAC;IACtD,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { StorageClientContext } from \"./generated/src/storageClientContext\";\nimport { PipelineLike } from \"./Pipeline\";\nimport { escapeURLPath, getURLScheme, iEqual, getAccountNameFromUrl } from \"./utils/utils.common\";\nimport { AnonymousCredential } from \"./credentials/AnonymousCredential\";\nimport { StorageSharedKeyCredential } from \"./credentials/StorageSharedKeyCredential\";\nimport { TokenCredential, isTokenCredential, isNode } from \"@azure/core-http\";\nimport { OperationTracingOptions } from \"@azure/core-tracing\";\n\n/**\n * An interface for options common to every remote operation.\n */\nexport interface CommonOptions {\n /**\n * Options to configure spans created when tracing is enabled.\n */\n tracingOptions?: OperationTracingOptions;\n}\n\n/**\n * A StorageClient represents a based URL class for {@link BlobServiceClient}, {@link ContainerClient}\n * and etc.\n */\nexport abstract class StorageClient {\n /**\n * Encoded URL string value.\n */\n public readonly url: string;\n public readonly accountName: string;\n /**\n * Request policy pipeline.\n *\n * @internal\n */\n protected readonly pipeline: PipelineLike;\n /**\n * Such as AnonymousCredential, StorageSharedKeyCredential or any credential from the `@azure/identity` package to authenticate requests to the service. You can also provide an object that implements the TokenCredential interface. If not specified, AnonymousCredential is used.\n */\n public readonly credential: StorageSharedKeyCredential | AnonymousCredential | TokenCredential;\n /**\n * StorageClient is a reference to protocol layer operations entry, which is\n * generated by AutoRest generator.\n */\n protected readonly storageClientContext: StorageClientContext;\n /**\n */\n protected readonly isHttps: boolean;\n\n /**\n * Creates an instance of StorageClient.\n * @param url - url to resource\n * @param pipeline - request policy pipeline.\n */\n protected constructor(url: string, pipeline: PipelineLike) {\n // URL should be encoded and only once, protocol layer shouldn't encode URL again\n this.url = escapeURLPath(url);\n this.accountName = getAccountNameFromUrl(url);\n this.pipeline = pipeline;\n this.storageClientContext = new StorageClientContext(\n this.url,\n pipeline.toServiceClientOptions()\n );\n\n this.isHttps = iEqual(getURLScheme(this.url) || \"\", \"https\");\n\n this.credential = new AnonymousCredential();\n for (const factory of this.pipeline.factories) {\n if (\n (isNode && factory instanceof StorageSharedKeyCredential) ||\n factory instanceof AnonymousCredential\n ) {\n this.credential = factory;\n } else if (isTokenCredential((factory as any).credential)) {\n // Only works if the factory has been attached a \"credential\" property.\n // We do that in newPipeline() when using TokenCredential.\n this.credential = (factory as any).credential;\n }\n }\n\n // Override protocol layer's default content-type\n const storageClientContext = this.storageClientContext as any;\n storageClientContext.requestContentType = undefined;\n }\n}\n"]}

View file

@ -0,0 +1,26 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { StorageRetryPolicy, StorageRetryPolicyType } from "./policies/StorageRetryPolicy";
export { StorageRetryPolicyType, StorageRetryPolicy };
/**
* StorageRetryPolicyFactory is a factory class helping generating {@link StorageRetryPolicy} objects.
*/
export class StorageRetryPolicyFactory {
/**
* Creates an instance of StorageRetryPolicyFactory.
* @param retryOptions -
*/
constructor(retryOptions) {
this.retryOptions = retryOptions;
}
/**
* Creates a StorageRetryPolicy object.
*
* @param nextPolicy -
* @param options -
*/
create(nextPolicy, options) {
return new StorageRetryPolicy(nextPolicy, options, this.retryOptions);
}
}
//# sourceMappingURL=StorageRetryPolicyFactory.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"StorageRetryPolicyFactory.js","sourceRoot":"","sources":["../../../src/StorageRetryPolicyFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAGlC,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,CAAC;AAmDtD;;GAEG;AACH,MAAM,OAAO,yBAAyB;IAGpC;;;OAGG;IACH,YAAY,YAAkC;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,UAAyB,EAAE,OAA6B;QACpE,OAAO,IAAI,kBAAkB,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACxE,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from \"@azure/core-http\";\nimport { StorageRetryPolicy, StorageRetryPolicyType } from \"./policies/StorageRetryPolicy\";\n\nexport { StorageRetryPolicyType, StorageRetryPolicy };\n\n/**\n * Storage Blob retry options interface.\n */\nexport interface StorageRetryOptions {\n /**\n * Optional. StorageRetryPolicyType, default is exponential retry policy.\n */\n readonly retryPolicyType?: StorageRetryPolicyType;\n\n /**\n * Optional. Max try number of attempts, default is 4.\n * A value of 1 means 1 try and no retries.\n * A value smaller than 1 means default retry number of attempts.\n */\n readonly maxTries?: number;\n\n /**\n * Optional. Indicates the maximum time in ms allowed for any single try of an HTTP request.\n * A value of zero or undefined means no default timeout on SDK client, Azure\n * Storage server's default timeout policy will be used.\n *\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/setting-timeouts-for-blob-service-operations\n */\n readonly tryTimeoutInMs?: number;\n\n /**\n * Optional. Specifies the amount of delay to use before retrying an operation (default is 4s or 4 * 1000ms).\n * The delay increases (exponentially or linearly) with each retry up to a maximum specified by\n * maxRetryDelayInMs. If you specify 0, then you must also specify 0 for maxRetryDelayInMs.\n */\n readonly retryDelayInMs?: number;\n\n /**\n * Optional. Specifies the maximum delay allowed before retrying an operation (default is 120s or 120 * 1000ms).\n * If you specify 0, then you must also specify 0 for retryDelayInMs.\n */\n readonly maxRetryDelayInMs?: number;\n\n /**\n * If a secondaryHost is specified, retries will be tried against this host. If secondaryHost is undefined\n * (the default) then operations are not retried against another host.\n *\n * NOTE: Before setting this field, make sure you understand the issues around\n * reading stale and potentially-inconsistent data at\n * {@link https://docs.microsoft.com/en-us/azure/storage/common/storage-designing-ha-apps-with-ragrs}\n */\n readonly secondaryHost?: string;\n}\n\n/**\n * StorageRetryPolicyFactory is a factory class helping generating {@link StorageRetryPolicy} objects.\n */\nexport class StorageRetryPolicyFactory implements RequestPolicyFactory {\n private retryOptions?: StorageRetryOptions;\n\n /**\n * Creates an instance of StorageRetryPolicyFactory.\n * @param retryOptions -\n */\n constructor(retryOptions?: StorageRetryOptions) {\n this.retryOptions = retryOptions;\n }\n\n /**\n * Creates a StorageRetryPolicy object.\n *\n * @param nextPolicy -\n * @param options -\n */\n public create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): StorageRetryPolicy {\n return new StorageRetryPolicy(nextPolicy, options, this.retryOptions);\n }\n}\n"]}

View file

@ -0,0 +1,50 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { isNode, } from "@azure/core-http";
import * as os from "os";
import { TelemetryPolicy } from "./policies/TelemetryPolicy";
import { SDK_VERSION } from "./utils/constants";
/**
* TelemetryPolicyFactory is a factory class helping generating {@link TelemetryPolicy} objects.
*/
export class TelemetryPolicyFactory {
/**
* Creates an instance of TelemetryPolicyFactory.
* @param telemetry -
*/
constructor(telemetry) {
const userAgentInfo = [];
if (isNode) {
if (telemetry) {
const telemetryString = telemetry.userAgentPrefix || "";
if (telemetryString.length > 0 && userAgentInfo.indexOf(telemetryString) === -1) {
userAgentInfo.push(telemetryString);
}
}
// e.g. azsdk-js-storageblob/10.0.0
const libInfo = `azsdk-js-storageblob/${SDK_VERSION}`;
if (userAgentInfo.indexOf(libInfo) === -1) {
userAgentInfo.push(libInfo);
}
// e.g. (NODE-VERSION 4.9.1; Windows_NT 10.0.16299)
let runtimeInfo = `(NODE-VERSION ${process.version})`;
if (os) {
runtimeInfo = `(NODE-VERSION ${process.version}; ${os.type()} ${os.release()})`;
}
if (userAgentInfo.indexOf(runtimeInfo) === -1) {
userAgentInfo.push(runtimeInfo);
}
}
this.telemetryString = userAgentInfo.join(" ");
}
/**
* Creates a TelemetryPolicy object.
*
* @param nextPolicy -
* @param options -
*/
create(nextPolicy, options) {
return new TelemetryPolicy(nextPolicy, options, this.telemetryString);
}
}
//# sourceMappingURL=TelemetryPolicyFactory.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"TelemetryPolicyFactory.js","sourceRoot":"","sources":["../../../src/TelemetryPolicyFactory.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EACL,MAAM,GAKP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAMjC;;;OAGG;IACH,YAAY,SAA4B;QACtC,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,IAAI,MAAM,EAAE;YACV,IAAI,SAAS,EAAE;gBACb,MAAM,eAAe,GAAG,SAAS,CAAC,eAAe,IAAI,EAAE,CAAC;gBACxD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE;oBAC/E,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;iBACrC;aACF;YAED,mCAAmC;YACnC,MAAM,OAAO,GAAG,wBAAwB,WAAW,EAAE,CAAC;YACtD,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE;gBACzC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC7B;YAED,mDAAmD;YACnD,IAAI,WAAW,GAAG,iBAAiB,OAAO,CAAC,OAAO,GAAG,CAAC;YACtD,IAAI,EAAE,EAAE;gBACN,WAAW,GAAG,iBAAiB,OAAO,CAAC,OAAO,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC;aACjF;YACD,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE;gBAC7C,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aACjC;SACF;QAED,IAAI,CAAC,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,UAAyB,EAAE,OAA6B;QACpE,OAAO,IAAI,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACxE,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n isNode,\n RequestPolicy,\n RequestPolicyFactory,\n RequestPolicyOptions,\n UserAgentOptions,\n} from \"@azure/core-http\";\nimport * as os from \"os\";\n\nimport { TelemetryPolicy } from \"./policies/TelemetryPolicy\";\nimport { SDK_VERSION } from \"./utils/constants\";\n\n/**\n * TelemetryPolicyFactory is a factory class helping generating {@link TelemetryPolicy} objects.\n */\nexport class TelemetryPolicyFactory implements RequestPolicyFactory {\n /**\n * @internal\n */\n public readonly telemetryString: string;\n\n /**\n * Creates an instance of TelemetryPolicyFactory.\n * @param telemetry -\n */\n constructor(telemetry?: UserAgentOptions) {\n const userAgentInfo: string[] = [];\n\n if (isNode) {\n if (telemetry) {\n const telemetryString = telemetry.userAgentPrefix || \"\";\n if (telemetryString.length > 0 && userAgentInfo.indexOf(telemetryString) === -1) {\n userAgentInfo.push(telemetryString);\n }\n }\n\n // e.g. azsdk-js-storageblob/10.0.0\n const libInfo = `azsdk-js-storageblob/${SDK_VERSION}`;\n if (userAgentInfo.indexOf(libInfo) === -1) {\n userAgentInfo.push(libInfo);\n }\n\n // e.g. (NODE-VERSION 4.9.1; Windows_NT 10.0.16299)\n let runtimeInfo = `(NODE-VERSION ${process.version})`;\n if (os) {\n runtimeInfo = `(NODE-VERSION ${process.version}; ${os.type()} ${os.release()})`;\n }\n if (userAgentInfo.indexOf(runtimeInfo) === -1) {\n userAgentInfo.push(runtimeInfo);\n }\n }\n\n this.telemetryString = userAgentInfo.join(\" \");\n }\n\n /**\n * Creates a TelemetryPolicy object.\n *\n * @param nextPolicy -\n * @param options -\n */\n public create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): TelemetryPolicy {\n return new TelemetryPolicy(nextPolicy, options, this.telemetryString);\n }\n}\n"]}

View file

@ -0,0 +1,22 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { AnonymousCredentialPolicy } from "../policies/AnonymousCredentialPolicy";
import { Credential } from "./Credential";
/**
* AnonymousCredential provides a credentialPolicyCreator member used to create
* AnonymousCredentialPolicy objects. AnonymousCredentialPolicy is used with
* HTTP(S) requests that read public resources or for use with Shared Access
* Signatures (SAS).
*/
export class AnonymousCredential extends Credential {
/**
* Creates an {@link AnonymousCredentialPolicy} object.
*
* @param nextPolicy -
* @param options -
*/
create(nextPolicy, options) {
return new AnonymousCredentialPolicy(nextPolicy, options);
}
}
//# sourceMappingURL=AnonymousCredential.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"AnonymousCredential.js","sourceRoot":"","sources":["../../../../src/credentials/AnonymousCredential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,OAAO,mBAAoB,SAAQ,UAAU;IACjD;;;;;OAKG;IACI,MAAM,CACX,UAAyB,EACzB,OAA6B;QAE7B,OAAO,IAAI,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { RequestPolicy, RequestPolicyOptions } from \"@azure/core-http\";\n\nimport { AnonymousCredentialPolicy } from \"../policies/AnonymousCredentialPolicy\";\nimport { Credential } from \"./Credential\";\n\n/**\n * AnonymousCredential provides a credentialPolicyCreator member used to create\n * AnonymousCredentialPolicy objects. AnonymousCredentialPolicy is used with\n * HTTP(S) requests that read public resources or for use with Shared Access\n * Signatures (SAS).\n */\nexport class AnonymousCredential extends Credential {\n /**\n * Creates an {@link AnonymousCredentialPolicy} object.\n *\n * @param nextPolicy -\n * @param options -\n */\n public create(\n nextPolicy: RequestPolicy,\n options: RequestPolicyOptions\n ): AnonymousCredentialPolicy {\n return new AnonymousCredentialPolicy(nextPolicy, options);\n }\n}\n"]}

View file

@ -0,0 +1,18 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
/**
* Credential is an abstract class for Azure Storage HTTP requests signing. This
* class will host an credentialPolicyCreator factory which generates CredentialPolicy.
*/
export class Credential {
/**
* Creates a RequestPolicy object.
*
* @param _nextPolicy -
* @param _options -
*/
create(_nextPolicy, _options) {
throw new Error("Method should be implemented in children classes.");
}
}
//# sourceMappingURL=Credential.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"Credential.js","sourceRoot":"","sources":["../../../../src/credentials/Credential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAKlC;;;GAGG;AACH,MAAM,OAAgB,UAAU;IAC9B;;;;;OAKG;IACI,MAAM,CAAC,WAA0B,EAAE,QAA8B;QACtE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from \"@azure/core-http\";\nimport { CredentialPolicy } from \"../policies/CredentialPolicy\";\n\n/**\n * Credential is an abstract class for Azure Storage HTTP requests signing. This\n * class will host an credentialPolicyCreator factory which generates CredentialPolicy.\n */\nexport abstract class Credential implements RequestPolicyFactory {\n /**\n * Creates a RequestPolicy object.\n *\n * @param _nextPolicy -\n * @param _options -\n */\n public create(_nextPolicy: RequestPolicy, _options: RequestPolicyOptions): RequestPolicy {\n throw new Error(\"Method should be implemented in children classes.\");\n }\n}\n\n/**\n * A factory function that creates a new CredentialPolicy that uses the provided nextPolicy.\n */\nexport type CredentialPolicyCreator = (\n nextPolicy: RequestPolicy,\n options: RequestPolicyOptions\n) => CredentialPolicy;\n"]}

View file

@ -0,0 +1,5 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export class StorageSharedKeyCredential {
}
//# sourceMappingURL=StorageSharedKeyCredential.browser.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"StorageSharedKeyCredential.browser.js","sourceRoot":"","sources":["../../../../src/credentials/StorageSharedKeyCredential.browser.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,0BAA0B;CAAG","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nexport class StorageSharedKeyCredential {}\n"]}

View file

@ -0,0 +1,40 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHmac } from "crypto";
import { StorageSharedKeyCredentialPolicy } from "../policies/StorageSharedKeyCredentialPolicy";
import { Credential } from "./Credential";
/**
* ONLY AVAILABLE IN NODE.JS RUNTIME.
*
* StorageSharedKeyCredential for account key authorization of Azure Storage service.
*/
export class StorageSharedKeyCredential extends Credential {
/**
* Creates an instance of StorageSharedKeyCredential.
* @param accountName -
* @param accountKey -
*/
constructor(accountName, accountKey) {
super();
this.accountName = accountName;
this.accountKey = Buffer.from(accountKey, "base64");
}
/**
* Creates a StorageSharedKeyCredentialPolicy object.
*
* @param nextPolicy -
* @param options -
*/
create(nextPolicy, options) {
return new StorageSharedKeyCredentialPolicy(nextPolicy, options, this);
}
/**
* Generates a hash signature for an HTTP request or for a SAS.
*
* @param stringToSign -
*/
computeHMACSHA256(stringToSign) {
return createHmac("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64");
}
}
//# sourceMappingURL=StorageSharedKeyCredential.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"StorageSharedKeyCredential.js","sourceRoot":"","sources":["../../../../src/credentials/StorageSharedKeyCredential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,EAAE,gCAAgC,EAAE,MAAM,8CAA8C,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;;GAIG;AACH,MAAM,OAAO,0BAA2B,SAAQ,UAAU;IAWxD;;;;OAIG;IACH,YAAY,WAAmB,EAAE,UAAkB;QACjD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CACX,UAAyB,EACzB,OAA6B;QAE7B,OAAO,IAAI,gCAAgC,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,YAAoB;QAC3C,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7F,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { createHmac } from \"crypto\";\nimport { RequestPolicy, RequestPolicyOptions } from \"@azure/core-http\";\n\nimport { StorageSharedKeyCredentialPolicy } from \"../policies/StorageSharedKeyCredentialPolicy\";\nimport { Credential } from \"./Credential\";\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * StorageSharedKeyCredential for account key authorization of Azure Storage service.\n */\nexport class StorageSharedKeyCredential extends Credential {\n /**\n * Azure Storage account name; readonly.\n */\n public readonly accountName: string;\n\n /**\n * Azure Storage account key; readonly.\n */\n private readonly accountKey: Buffer;\n\n /**\n * Creates an instance of StorageSharedKeyCredential.\n * @param accountName -\n * @param accountKey -\n */\n constructor(accountName: string, accountKey: string) {\n super();\n this.accountName = accountName;\n this.accountKey = Buffer.from(accountKey, \"base64\");\n }\n\n /**\n * Creates a StorageSharedKeyCredentialPolicy object.\n *\n * @param nextPolicy -\n * @param options -\n */\n public create(\n nextPolicy: RequestPolicy,\n options: RequestPolicyOptions\n ): StorageSharedKeyCredentialPolicy {\n return new StorageSharedKeyCredentialPolicy(nextPolicy, options, this);\n }\n\n /**\n * Generates a hash signature for an HTTP request or for a SAS.\n *\n * @param stringToSign -\n */\n public computeHMACSHA256(stringToSign: string): string {\n return createHmac(\"sha256\", this.accountKey).update(stringToSign, \"utf8\").digest(\"base64\");\n }\n}\n"]}

View file

@ -0,0 +1,5 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export class UserDelegationKeyCredential {
}
//# sourceMappingURL=UserDelegationKeyCredential.browser.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"UserDelegationKeyCredential.browser.js","sourceRoot":"","sources":["../../../../src/credentials/UserDelegationKeyCredential.browser.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,OAAO,2BAA2B;CAAG","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nexport class UserDelegationKeyCredential {}\n"]}

View file

@ -0,0 +1,31 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createHmac } from "crypto";
/**
* ONLY AVAILABLE IN NODE.JS RUNTIME.
*
* UserDelegationKeyCredential is only used for generation of user delegation SAS.
* @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas
*/
export class UserDelegationKeyCredential {
/**
* Creates an instance of UserDelegationKeyCredential.
* @param accountName -
* @param userDelegationKey -
*/
constructor(accountName, userDelegationKey) {
this.accountName = accountName;
this.userDelegationKey = userDelegationKey;
this.key = Buffer.from(userDelegationKey.value, "base64");
}
/**
* Generates a hash signature for an HTTP request or for a SAS.
*
* @param stringToSign -
*/
computeHMACSHA256(stringToSign) {
// console.log(`stringToSign: ${JSON.stringify(stringToSign)}`);
return createHmac("sha256", this.key).update(stringToSign, "utf8").digest("base64");
}
}
//# sourceMappingURL=UserDelegationKeyCredential.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"UserDelegationKeyCredential.js","sourceRoot":"","sources":["../../../../src/credentials/UserDelegationKeyCredential.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC;;;;;GAKG;AACH,MAAM,OAAO,2BAA2B;IAgBtC;;;;OAIG;IACH,YAAY,WAAmB,EAAE,iBAAoC;QACnE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,YAAoB;QAC3C,gEAAgE;QAEhE,OAAO,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtF,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { createHmac } from \"crypto\";\nimport { UserDelegationKey } from \"../BlobServiceClient\";\n\n/**\n * ONLY AVAILABLE IN NODE.JS RUNTIME.\n *\n * UserDelegationKeyCredential is only used for generation of user delegation SAS.\n * @see https://docs.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas\n */\nexport class UserDelegationKeyCredential {\n /**\n * Azure Storage account name; readonly.\n */\n public readonly accountName: string;\n\n /**\n * Azure Storage user delegation key; readonly.\n */\n public readonly userDelegationKey: UserDelegationKey;\n\n /**\n * Key value in Buffer type.\n */\n private readonly key: Buffer;\n\n /**\n * Creates an instance of UserDelegationKeyCredential.\n * @param accountName -\n * @param userDelegationKey -\n */\n constructor(accountName: string, userDelegationKey: UserDelegationKey) {\n this.accountName = accountName;\n this.userDelegationKey = userDelegationKey;\n this.key = Buffer.from(userDelegationKey.value, \"base64\");\n }\n\n /**\n * Generates a hash signature for an HTTP request or for a SAS.\n *\n * @param stringToSign -\n */\n public computeHMACSHA256(stringToSign: string): string {\n // console.log(`stringToSign: ${JSON.stringify(stringToSign)}`);\n\n return createHmac(\"sha256\", this.key).update(stringToSign, \"utf8\").digest(\"base64\");\n }\n}\n"]}

View file

@ -0,0 +1,11 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
export * from "./models";
export { StorageClient } from "./storageClient";
export { StorageClientContext } from "./storageClientContext";
//# sourceMappingURL=index.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/generated/src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,UAAU,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\nexport * from \"./models\";\nexport { StorageClient } from \"./storageClient\";\nexport { StorageClientContext } from \"./storageClientContext\";\n"]}

View file

@ -0,0 +1,9 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
export {};
//# sourceMappingURL=index.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,237 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
import * as coreHttp from "@azure/core-http";
import * as Mappers from "../models/mappers";
import * as Parameters from "../models/parameters";
/** Class representing a AppendBlob. */
export class AppendBlob {
/**
* Initialize a new instance of the class AppendBlob class.
* @param client Reference to the service client
*/
constructor(client) {
this.client = client;
}
/**
* The Create Append Blob operation creates a new append blob.
* @param contentLength The length of the request.
* @param options The options parameters.
*/
create(contentLength, options) {
const operationArguments = {
contentLength,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, createOperationSpec);
}
/**
* The Append Block operation commits a new block of data to the end of an existing append blob. The
* Append Block operation is permitted only if the blob was created with x-ms-blob-type set to
* AppendBlob. Append Block is supported only on version 2015-02-21 version or later.
* @param contentLength The length of the request.
* @param body Initial data
* @param options The options parameters.
*/
appendBlock(contentLength, body, options) {
const operationArguments = {
contentLength,
body,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, appendBlockOperationSpec);
}
/**
* The Append Block operation commits a new block of data to the end of an existing append blob where
* the contents are read from a source url. The Append Block operation is permitted only if the blob
* was created with x-ms-blob-type set to AppendBlob. Append Block is supported only on version
* 2015-02-21 version or later.
* @param sourceUrl Specify a URL to the copy source.
* @param contentLength The length of the request.
* @param options The options parameters.
*/
appendBlockFromUrl(sourceUrl, contentLength, options) {
const operationArguments = {
sourceUrl,
contentLength,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, appendBlockFromUrlOperationSpec);
}
/**
* The Seal operation seals the Append Blob to make it read-only. Seal is supported only on version
* 2019-12-12 version or later.
* @param options The options parameters.
*/
seal(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, sealOperationSpec);
}
}
// Operation Specifications
const xmlSerializer = new coreHttp.Serializer(Mappers, /* isXml */ true);
const serializer = new coreHttp.Serializer(Mappers, /* isXml */ false);
const createOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.AppendBlobCreateHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.AppendBlobCreateExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.contentLength,
Parameters.metadata,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.blobCacheControl,
Parameters.blobContentType,
Parameters.blobContentMD5,
Parameters.blobContentEncoding,
Parameters.blobContentLanguage,
Parameters.blobContentDisposition,
Parameters.immutabilityPolicyExpiry,
Parameters.immutabilityPolicyMode,
Parameters.encryptionScope,
Parameters.blobTagsString,
Parameters.legalHold1,
Parameters.blobType1
],
isXML: true,
serializer: xmlSerializer
};
const appendBlockOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.AppendBlobAppendBlockHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.AppendBlobAppendBlockExceptionHeaders
}
},
requestBody: Parameters.body1,
queryParameters: [Parameters.timeoutInSeconds, Parameters.comp22],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.contentLength,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.encryptionScope,
Parameters.transactionalContentMD5,
Parameters.transactionalContentCrc64,
Parameters.contentType1,
Parameters.accept2,
Parameters.maxSize,
Parameters.appendPosition
],
mediaType: "binary",
serializer
};
const appendBlockFromUrlOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.AppendBlobAppendBlockFromUrlHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.AppendBlobAppendBlockFromUrlExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds, Parameters.comp22],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.contentLength,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.encryptionScope,
Parameters.sourceIfModifiedSince,
Parameters.sourceIfUnmodifiedSince,
Parameters.sourceIfMatch,
Parameters.sourceIfNoneMatch,
Parameters.sourceContentMD5,
Parameters.copySourceAuthorization,
Parameters.transactionalContentMD5,
Parameters.sourceUrl,
Parameters.sourceContentCrc64,
Parameters.maxSize,
Parameters.appendPosition,
Parameters.sourceRange1
],
isXML: true,
serializer: xmlSerializer
};
const sealOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
200: {
headersMapper: Mappers.AppendBlobSealHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.AppendBlobSealExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds, Parameters.comp23],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.appendPosition
],
isXML: true,
serializer: xmlSerializer
};
//# sourceMappingURL=appendBlob.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,391 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
import * as coreHttp from "@azure/core-http";
import * as Mappers from "../models/mappers";
import * as Parameters from "../models/parameters";
/** Class representing a BlockBlob. */
export class BlockBlob {
/**
* Initialize a new instance of the class BlockBlob class.
* @param client Reference to the service client
*/
constructor(client) {
this.client = client;
}
/**
* The Upload Block Blob operation updates the content of an existing block blob. Updating an existing
* block blob overwrites any existing metadata on the blob. Partial updates are not supported with Put
* Blob; the content of the existing blob is overwritten with the content of the new blob. To perform a
* partial update of the content of a block blob, use the Put Block List operation.
* @param contentLength The length of the request.
* @param body Initial data
* @param options The options parameters.
*/
upload(contentLength, body, options) {
const operationArguments = {
contentLength,
body,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, uploadOperationSpec);
}
/**
* The Put Blob from URL operation creates a new Block Blob where the contents of the blob are read
* from a given URL. This API is supported beginning with the 2020-04-08 version. Partial updates are
* not supported with Put Blob from URL; the content of an existing blob is overwritten with the
* content of the new blob. To perform partial updates to a block blobs contents using a source URL,
* use the Put Block from URL API in conjunction with Put Block List.
* @param contentLength The length of the request.
* @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
* 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
* appear in a request URI. The source blob must either be public or must be authenticated via a shared
* access signature.
* @param options The options parameters.
*/
putBlobFromUrl(contentLength, copySource, options) {
const operationArguments = {
contentLength,
copySource,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, putBlobFromUrlOperationSpec);
}
/**
* The Stage Block operation creates a new block to be committed as part of a blob
* @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string
* must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified
* for the blockid parameter must be the same size for each block.
* @param contentLength The length of the request.
* @param body Initial data
* @param options The options parameters.
*/
stageBlock(blockId, contentLength, body, options) {
const operationArguments = {
blockId,
contentLength,
body,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, stageBlockOperationSpec);
}
/**
* The Stage Block operation creates a new block to be committed as part of a blob where the contents
* are read from a URL.
* @param blockId A valid Base64 string value that identifies the block. Prior to encoding, the string
* must be less than or equal to 64 bytes in size. For a given blob, the length of the value specified
* for the blockid parameter must be the same size for each block.
* @param contentLength The length of the request.
* @param sourceUrl Specify a URL to the copy source.
* @param options The options parameters.
*/
stageBlockFromURL(blockId, contentLength, sourceUrl, options) {
const operationArguments = {
blockId,
contentLength,
sourceUrl,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, stageBlockFromURLOperationSpec);
}
/**
* The Commit Block List operation writes a blob by specifying the list of block IDs that make up the
* blob. In order to be written as part of a blob, a block must have been successfully written to the
* server in a prior Put Block operation. You can call Put Block List to update a blob by uploading
* only those blocks that have changed, then committing the new and existing blocks together. You can
* do this by specifying whether to commit a block from the committed block list or from the
* uncommitted block list, or to commit the most recently uploaded version of the block, whichever list
* it may belong to.
* @param blocks Blob Blocks.
* @param options The options parameters.
*/
commitBlockList(blocks, options) {
const operationArguments = {
blocks,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, commitBlockListOperationSpec);
}
/**
* The Get Block List operation retrieves the list of blocks that have been uploaded as part of a block
* blob
* @param listType Specifies whether to return the list of committed blocks, the list of uncommitted
* blocks, or both lists together.
* @param options The options parameters.
*/
getBlockList(listType, options) {
const operationArguments = {
listType,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getBlockListOperationSpec);
}
}
// Operation Specifications
const xmlSerializer = new coreHttp.Serializer(Mappers, /* isXml */ true);
const serializer = new coreHttp.Serializer(Mappers, /* isXml */ false);
const uploadOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.BlockBlobUploadHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.BlockBlobUploadExceptionHeaders
}
},
requestBody: Parameters.body1,
queryParameters: [Parameters.timeoutInSeconds],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.contentLength,
Parameters.metadata,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.blobCacheControl,
Parameters.blobContentType,
Parameters.blobContentMD5,
Parameters.blobContentEncoding,
Parameters.blobContentLanguage,
Parameters.blobContentDisposition,
Parameters.immutabilityPolicyExpiry,
Parameters.immutabilityPolicyMode,
Parameters.encryptionScope,
Parameters.tier,
Parameters.blobTagsString,
Parameters.legalHold1,
Parameters.transactionalContentMD5,
Parameters.contentType1,
Parameters.accept2,
Parameters.blobType2
],
mediaType: "binary",
serializer
};
const putBlobFromUrlOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.BlockBlobPutBlobFromUrlHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.BlockBlobPutBlobFromUrlExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.contentLength,
Parameters.metadata,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.blobCacheControl,
Parameters.blobContentType,
Parameters.blobContentMD5,
Parameters.blobContentEncoding,
Parameters.blobContentLanguage,
Parameters.blobContentDisposition,
Parameters.encryptionScope,
Parameters.tier,
Parameters.sourceIfModifiedSince,
Parameters.sourceIfUnmodifiedSince,
Parameters.sourceIfMatch,
Parameters.sourceIfNoneMatch,
Parameters.sourceIfTags,
Parameters.copySource,
Parameters.blobTagsString,
Parameters.sourceContentMD5,
Parameters.copySourceAuthorization,
Parameters.copySourceTags,
Parameters.transactionalContentMD5,
Parameters.blobType2,
Parameters.copySourceBlobProperties
],
isXML: true,
serializer: xmlSerializer
};
const stageBlockOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.BlockBlobStageBlockHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.BlockBlobStageBlockExceptionHeaders
}
},
requestBody: Parameters.body1,
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.comp24,
Parameters.blockId
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.contentLength,
Parameters.leaseId,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.encryptionScope,
Parameters.transactionalContentMD5,
Parameters.transactionalContentCrc64,
Parameters.contentType1,
Parameters.accept2
],
mediaType: "binary",
serializer
};
const stageBlockFromURLOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.BlockBlobStageBlockFromURLHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.BlockBlobStageBlockFromURLExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.comp24,
Parameters.blockId
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.contentLength,
Parameters.leaseId,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.encryptionScope,
Parameters.sourceIfModifiedSince,
Parameters.sourceIfUnmodifiedSince,
Parameters.sourceIfMatch,
Parameters.sourceIfNoneMatch,
Parameters.sourceContentMD5,
Parameters.copySourceAuthorization,
Parameters.sourceUrl,
Parameters.sourceContentCrc64,
Parameters.sourceRange1
],
isXML: true,
serializer: xmlSerializer
};
const commitBlockListOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.BlockBlobCommitBlockListHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.BlockBlobCommitBlockListExceptionHeaders
}
},
requestBody: Parameters.blocks,
queryParameters: [Parameters.timeoutInSeconds, Parameters.comp25],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.contentType,
Parameters.accept,
Parameters.version,
Parameters.requestId,
Parameters.metadata,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.blobCacheControl,
Parameters.blobContentType,
Parameters.blobContentMD5,
Parameters.blobContentEncoding,
Parameters.blobContentLanguage,
Parameters.blobContentDisposition,
Parameters.immutabilityPolicyExpiry,
Parameters.immutabilityPolicyMode,
Parameters.encryptionScope,
Parameters.tier,
Parameters.blobTagsString,
Parameters.legalHold1,
Parameters.transactionalContentMD5,
Parameters.transactionalContentCrc64
],
isXML: true,
contentType: "application/xml; charset=utf-8",
mediaType: "xml",
serializer: xmlSerializer
};
const getBlockListOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.BlockList,
headersMapper: Mappers.BlockBlobGetBlockListHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.BlockBlobGetBlockListExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.snapshot,
Parameters.comp25,
Parameters.listType
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.leaseId,
Parameters.ifTags
],
isXML: true,
serializer: xmlSerializer
};
//# sourceMappingURL=blockBlob.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,769 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
import * as coreHttp from "@azure/core-http";
import * as Mappers from "../models/mappers";
import * as Parameters from "../models/parameters";
/** Class representing a Container. */
export class Container {
/**
* Initialize a new instance of the class Container class.
* @param client Reference to the service client
*/
constructor(client) {
this.client = client;
}
/**
* creates a new container under the specified account. If the container with the same name already
* exists, the operation fails
* @param options The options parameters.
*/
create(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, createOperationSpec);
}
/**
* returns all user-defined metadata and system properties for the specified container. The data
* returned does not include the container's list of blobs
* @param options The options parameters.
*/
getProperties(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getPropertiesOperationSpec);
}
/**
* operation marks the specified container for deletion. The container and any blobs contained within
* it are later deleted during garbage collection
* @param options The options parameters.
*/
delete(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, deleteOperationSpec);
}
/**
* operation sets one or more user-defined name-value pairs for the specified container.
* @param options The options parameters.
*/
setMetadata(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, setMetadataOperationSpec);
}
/**
* gets the permissions for the specified container. The permissions indicate whether container data
* may be accessed publicly.
* @param options The options parameters.
*/
getAccessPolicy(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getAccessPolicyOperationSpec);
}
/**
* sets the permissions for the specified container. The permissions indicate whether blobs in a
* container may be accessed publicly.
* @param options The options parameters.
*/
setAccessPolicy(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, setAccessPolicyOperationSpec);
}
/**
* Restores a previously-deleted container.
* @param options The options parameters.
*/
restore(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, restoreOperationSpec);
}
/**
* Renames an existing container.
* @param sourceContainerName Required. Specifies the name of the container to rename.
* @param options The options parameters.
*/
rename(sourceContainerName, options) {
const operationArguments = {
sourceContainerName,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, renameOperationSpec);
}
/**
* The Batch operation allows multiple API calls to be embedded into a single HTTP request.
* @param contentLength The length of the request.
* @param multipartContentType Required. The value of this header must be multipart/mixed with a batch
* boundary. Example header value: multipart/mixed; boundary=batch_<GUID>
* @param body Initial data
* @param options The options parameters.
*/
submitBatch(contentLength, multipartContentType, body, options) {
const operationArguments = {
contentLength,
multipartContentType,
body,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, submitBatchOperationSpec);
}
/**
* The Filter Blobs operation enables callers to list blobs in a container whose tags match a given
* search expression. Filter blobs searches within the given container.
* @param options The options parameters.
*/
filterBlobs(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, filterBlobsOperationSpec);
}
/**
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
* be 15 to 60 seconds, or can be infinite
* @param options The options parameters.
*/
acquireLease(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, acquireLeaseOperationSpec);
}
/**
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
* be 15 to 60 seconds, or can be infinite
* @param leaseId Specifies the current lease ID on the resource.
* @param options The options parameters.
*/
releaseLease(leaseId, options) {
const operationArguments = {
leaseId,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, releaseLeaseOperationSpec);
}
/**
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
* be 15 to 60 seconds, or can be infinite
* @param leaseId Specifies the current lease ID on the resource.
* @param options The options parameters.
*/
renewLease(leaseId, options) {
const operationArguments = {
leaseId,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, renewLeaseOperationSpec);
}
/**
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
* be 15 to 60 seconds, or can be infinite
* @param options The options parameters.
*/
breakLease(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, breakLeaseOperationSpec);
}
/**
* [Update] establishes and manages a lock on a container for delete operations. The lock duration can
* be 15 to 60 seconds, or can be infinite
* @param leaseId Specifies the current lease ID on the resource.
* @param proposedLeaseId Proposed lease ID, in a GUID string format. The Blob service returns 400
* (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor
* (String) for a list of valid GUID string formats.
* @param options The options parameters.
*/
changeLease(leaseId, proposedLeaseId, options) {
const operationArguments = {
leaseId,
proposedLeaseId,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, changeLeaseOperationSpec);
}
/**
* [Update] The List Blobs operation returns a list of the blobs under the specified container
* @param options The options parameters.
*/
listBlobFlatSegment(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, listBlobFlatSegmentOperationSpec);
}
/**
* [Update] The List Blobs operation returns a list of the blobs under the specified container
* @param delimiter When the request includes this parameter, the operation returns a BlobPrefix
* element in the response body that acts as a placeholder for all blobs whose names begin with the
* same substring up to the appearance of the delimiter character. The delimiter may be a single
* character or a string.
* @param options The options parameters.
*/
listBlobHierarchySegment(delimiter, options) {
const operationArguments = {
delimiter,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, listBlobHierarchySegmentOperationSpec);
}
/**
* Returns the sku name and account kind
* @param options The options parameters.
*/
getAccountInfo(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getAccountInfoOperationSpec);
}
}
// Operation Specifications
const xmlSerializer = new coreHttp.Serializer(Mappers, /* isXml */ true);
const createOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.ContainerCreateHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerCreateExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds, Parameters.restype2],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.metadata,
Parameters.access,
Parameters.defaultEncryptionScope,
Parameters.preventEncryptionScopeOverride
],
isXML: true,
serializer: xmlSerializer
};
const getPropertiesOperationSpec = {
path: "/{containerName}",
httpMethod: "GET",
responses: {
200: {
headersMapper: Mappers.ContainerGetPropertiesHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerGetPropertiesExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds, Parameters.restype2],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.leaseId
],
isXML: true,
serializer: xmlSerializer
};
const deleteOperationSpec = {
path: "/{containerName}",
httpMethod: "DELETE",
responses: {
202: {
headersMapper: Mappers.ContainerDeleteHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerDeleteExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds, Parameters.restype2],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince
],
isXML: true,
serializer: xmlSerializer
};
const setMetadataOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
200: {
headersMapper: Mappers.ContainerSetMetadataHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerSetMetadataExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp6
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.metadata,
Parameters.leaseId,
Parameters.ifModifiedSince
],
isXML: true,
serializer: xmlSerializer
};
const getAccessPolicyOperationSpec = {
path: "/{containerName}",
httpMethod: "GET",
responses: {
200: {
bodyMapper: {
type: {
name: "Sequence",
element: {
type: { name: "Composite", className: "SignedIdentifier" }
}
},
serializedName: "SignedIdentifiers",
xmlName: "SignedIdentifiers",
xmlIsWrapped: true,
xmlElementName: "SignedIdentifier"
},
headersMapper: Mappers.ContainerGetAccessPolicyHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerGetAccessPolicyExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp7
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.leaseId
],
isXML: true,
serializer: xmlSerializer
};
const setAccessPolicyOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
200: {
headersMapper: Mappers.ContainerSetAccessPolicyHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerSetAccessPolicyExceptionHeaders
}
},
requestBody: Parameters.containerAcl,
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp7
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.contentType,
Parameters.accept,
Parameters.version,
Parameters.requestId,
Parameters.access,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince
],
isXML: true,
contentType: "application/xml; charset=utf-8",
mediaType: "xml",
serializer: xmlSerializer
};
const restoreOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.ContainerRestoreHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerRestoreExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp8
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.deletedContainerName,
Parameters.deletedContainerVersion
],
isXML: true,
serializer: xmlSerializer
};
const renameOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
200: {
headersMapper: Mappers.ContainerRenameHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerRenameExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp9
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.sourceContainerName,
Parameters.sourceLeaseId
],
isXML: true,
serializer: xmlSerializer
};
const submitBatchOperationSpec = {
path: "/{containerName}",
httpMethod: "POST",
responses: {
202: {
bodyMapper: {
type: { name: "Stream" },
serializedName: "parsedResponse"
},
headersMapper: Mappers.ContainerSubmitBatchHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerSubmitBatchExceptionHeaders
}
},
requestBody: Parameters.body,
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.comp4,
Parameters.restype2
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.contentType,
Parameters.accept,
Parameters.version,
Parameters.requestId,
Parameters.contentLength,
Parameters.multipartContentType
],
isXML: true,
contentType: "application/xml; charset=utf-8",
mediaType: "xml",
serializer: xmlSerializer
};
const filterBlobsOperationSpec = {
path: "/{containerName}",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.FilterBlobSegment,
headersMapper: Mappers.ContainerFilterBlobsHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerFilterBlobsExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.marker,
Parameters.maxPageSize,
Parameters.comp5,
Parameters.where,
Parameters.restype2
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1
],
isXML: true,
serializer: xmlSerializer
};
const acquireLeaseOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.ContainerAcquireLeaseHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerAcquireLeaseExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp10
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.action,
Parameters.duration,
Parameters.proposedLeaseId
],
isXML: true,
serializer: xmlSerializer
};
const releaseLeaseOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
200: {
headersMapper: Mappers.ContainerReleaseLeaseHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerReleaseLeaseExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp10
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.action1,
Parameters.leaseId1
],
isXML: true,
serializer: xmlSerializer
};
const renewLeaseOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
200: {
headersMapper: Mappers.ContainerRenewLeaseHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerRenewLeaseExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp10
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.leaseId1,
Parameters.action2
],
isXML: true,
serializer: xmlSerializer
};
const breakLeaseOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
202: {
headersMapper: Mappers.ContainerBreakLeaseHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerBreakLeaseExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp10
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.action3,
Parameters.breakPeriod
],
isXML: true,
serializer: xmlSerializer
};
const changeLeaseOperationSpec = {
path: "/{containerName}",
httpMethod: "PUT",
responses: {
200: {
headersMapper: Mappers.ContainerChangeLeaseHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerChangeLeaseExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.restype2,
Parameters.comp10
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.leaseId1,
Parameters.action4,
Parameters.proposedLeaseId1
],
isXML: true,
serializer: xmlSerializer
};
const listBlobFlatSegmentOperationSpec = {
path: "/{containerName}",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.ListBlobsFlatSegmentResponse,
headersMapper: Mappers.ContainerListBlobFlatSegmentHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerListBlobFlatSegmentExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.comp2,
Parameters.prefix,
Parameters.marker,
Parameters.maxPageSize,
Parameters.restype2,
Parameters.include1
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1
],
isXML: true,
serializer: xmlSerializer
};
const listBlobHierarchySegmentOperationSpec = {
path: "/{containerName}",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.ListBlobsHierarchySegmentResponse,
headersMapper: Mappers.ContainerListBlobHierarchySegmentHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerListBlobHierarchySegmentExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.comp2,
Parameters.prefix,
Parameters.marker,
Parameters.maxPageSize,
Parameters.restype2,
Parameters.include1,
Parameters.delimiter
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1
],
isXML: true,
serializer: xmlSerializer
};
const getAccountInfoOperationSpec = {
path: "/{containerName}",
httpMethod: "GET",
responses: {
200: {
headersMapper: Mappers.ContainerGetAccountInfoHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ContainerGetAccountInfoExceptionHeaders
}
},
queryParameters: [Parameters.comp, Parameters.restype1],
urlParameters: [Parameters.url],
headerParameters: [Parameters.version, Parameters.accept1],
isXML: true,
serializer: xmlSerializer
};
//# sourceMappingURL=container.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,14 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
export * from "./service";
export * from "./container";
export * from "./blob";
export * from "./pageBlob";
export * from "./appendBlob";
export * from "./blockBlob";
//# sourceMappingURL=index.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/generated/src/operations/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC","sourcesContent":["/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\nexport * from \"./service\";\nexport * from \"./container\";\nexport * from \"./blob\";\nexport * from \"./pageBlob\";\nexport * from \"./appendBlob\";\nexport * from \"./blockBlob\";\n"]}

View file

@ -0,0 +1,494 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
import * as coreHttp from "@azure/core-http";
import * as Mappers from "../models/mappers";
import * as Parameters from "../models/parameters";
/** Class representing a PageBlob. */
export class PageBlob {
/**
* Initialize a new instance of the class PageBlob class.
* @param client Reference to the service client
*/
constructor(client) {
this.client = client;
}
/**
* The Create operation creates a new page blob.
* @param contentLength The length of the request.
* @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The
* page blob size must be aligned to a 512-byte boundary.
* @param options The options parameters.
*/
create(contentLength, blobContentLength, options) {
const operationArguments = {
contentLength,
blobContentLength,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, createOperationSpec);
}
/**
* The Upload Pages operation writes a range of pages to a page blob
* @param contentLength The length of the request.
* @param body Initial data
* @param options The options parameters.
*/
uploadPages(contentLength, body, options) {
const operationArguments = {
contentLength,
body,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, uploadPagesOperationSpec);
}
/**
* The Clear Pages operation clears a set of pages from a page blob
* @param contentLength The length of the request.
* @param options The options parameters.
*/
clearPages(contentLength, options) {
const operationArguments = {
contentLength,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, clearPagesOperationSpec);
}
/**
* The Upload Pages operation writes a range of pages to a page blob where the contents are read from a
* URL
* @param sourceUrl Specify a URL to the copy source.
* @param sourceRange Bytes of source data in the specified range. The length of this range should
* match the ContentLength header and x-ms-range/Range destination range header.
* @param contentLength The length of the request.
* @param range The range of bytes to which the source range would be written. The range should be 512
* aligned and range-end is required.
* @param options The options parameters.
*/
uploadPagesFromURL(sourceUrl, sourceRange, contentLength, range, options) {
const operationArguments = {
sourceUrl,
sourceRange,
contentLength,
range,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, uploadPagesFromURLOperationSpec);
}
/**
* The Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a
* page blob
* @param options The options parameters.
*/
getPageRanges(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getPageRangesOperationSpec);
}
/**
* The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob that were
* changed between target blob and previous snapshot.
* @param options The options parameters.
*/
getPageRangesDiff(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getPageRangesDiffOperationSpec);
}
/**
* Resize the Blob
* @param blobContentLength This header specifies the maximum size for the page blob, up to 1 TB. The
* page blob size must be aligned to a 512-byte boundary.
* @param options The options parameters.
*/
resize(blobContentLength, options) {
const operationArguments = {
blobContentLength,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, resizeOperationSpec);
}
/**
* Update the sequence number of the blob
* @param sequenceNumberAction Required if the x-ms-blob-sequence-number header is set for the request.
* This property applies to page blobs only. This property indicates how the service should modify the
* blob's sequence number
* @param options The options parameters.
*/
updateSequenceNumber(sequenceNumberAction, options) {
const operationArguments = {
sequenceNumberAction,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, updateSequenceNumberOperationSpec);
}
/**
* The Copy Incremental operation copies a snapshot of the source page blob to a destination page blob.
* The snapshot is copied such that only the differential changes between the previously copied
* snapshot are transferred to the destination. The copied snapshots are complete copies of the
* original snapshot and can be read or copied from as usual. This API is supported since REST version
* 2016-05-31.
* @param copySource Specifies the name of the source page blob snapshot. This value is a URL of up to
* 2 KB in length that specifies a page blob snapshot. The value should be URL-encoded as it would
* appear in a request URI. The source blob must either be public or must be authenticated via a shared
* access signature.
* @param options The options parameters.
*/
copyIncremental(copySource, options) {
const operationArguments = {
copySource,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, copyIncrementalOperationSpec);
}
}
// Operation Specifications
const xmlSerializer = new coreHttp.Serializer(Mappers, /* isXml */ true);
const serializer = new coreHttp.Serializer(Mappers, /* isXml */ false);
const createOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.PageBlobCreateHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.PageBlobCreateExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.contentLength,
Parameters.metadata,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.blobCacheControl,
Parameters.blobContentType,
Parameters.blobContentMD5,
Parameters.blobContentEncoding,
Parameters.blobContentLanguage,
Parameters.blobContentDisposition,
Parameters.immutabilityPolicyExpiry,
Parameters.immutabilityPolicyMode,
Parameters.encryptionScope,
Parameters.tier,
Parameters.blobTagsString,
Parameters.legalHold1,
Parameters.blobType,
Parameters.blobContentLength,
Parameters.blobSequenceNumber
],
isXML: true,
serializer: xmlSerializer
};
const uploadPagesOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.PageBlobUploadPagesHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.PageBlobUploadPagesExceptionHeaders
}
},
requestBody: Parameters.body1,
queryParameters: [Parameters.timeoutInSeconds, Parameters.comp19],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.contentLength,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.range,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.encryptionScope,
Parameters.transactionalContentMD5,
Parameters.transactionalContentCrc64,
Parameters.contentType1,
Parameters.accept2,
Parameters.pageWrite,
Parameters.ifSequenceNumberLessThanOrEqualTo,
Parameters.ifSequenceNumberLessThan,
Parameters.ifSequenceNumberEqualTo
],
mediaType: "binary",
serializer
};
const clearPagesOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.PageBlobClearPagesHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.PageBlobClearPagesExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds, Parameters.comp19],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.contentLength,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.range,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.encryptionScope,
Parameters.ifSequenceNumberLessThanOrEqualTo,
Parameters.ifSequenceNumberLessThan,
Parameters.ifSequenceNumberEqualTo,
Parameters.pageWrite1
],
isXML: true,
serializer: xmlSerializer
};
const uploadPagesFromURLOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
201: {
headersMapper: Mappers.PageBlobUploadPagesFromURLHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.PageBlobUploadPagesFromURLExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds, Parameters.comp19],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.contentLength,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.encryptionScope,
Parameters.sourceIfModifiedSince,
Parameters.sourceIfUnmodifiedSince,
Parameters.sourceIfMatch,
Parameters.sourceIfNoneMatch,
Parameters.sourceContentMD5,
Parameters.copySourceAuthorization,
Parameters.pageWrite,
Parameters.ifSequenceNumberLessThanOrEqualTo,
Parameters.ifSequenceNumberLessThan,
Parameters.ifSequenceNumberEqualTo,
Parameters.sourceUrl,
Parameters.sourceRange,
Parameters.sourceContentCrc64,
Parameters.range1
],
isXML: true,
serializer: xmlSerializer
};
const getPageRangesOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.PageList,
headersMapper: Mappers.PageBlobGetPageRangesHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.PageBlobGetPageRangesExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.marker,
Parameters.maxPageSize,
Parameters.snapshot,
Parameters.comp20
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.range,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags
],
isXML: true,
serializer: xmlSerializer
};
const getPageRangesDiffOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.PageList,
headersMapper: Mappers.PageBlobGetPageRangesDiffHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.PageBlobGetPageRangesDiffExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.marker,
Parameters.maxPageSize,
Parameters.snapshot,
Parameters.comp20,
Parameters.prevsnapshot
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.range,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.prevSnapshotUrl
],
isXML: true,
serializer: xmlSerializer
};
const resizeOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
200: {
headersMapper: Mappers.PageBlobResizeHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.PageBlobResizeExceptionHeaders
}
},
queryParameters: [Parameters.comp, Parameters.timeoutInSeconds],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.encryptionKey,
Parameters.encryptionKeySha256,
Parameters.encryptionAlgorithm,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.encryptionScope,
Parameters.blobContentLength
],
isXML: true,
serializer: xmlSerializer
};
const updateSequenceNumberOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
200: {
headersMapper: Mappers.PageBlobUpdateSequenceNumberHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.PageBlobUpdateSequenceNumberExceptionHeaders
}
},
queryParameters: [Parameters.comp, Parameters.timeoutInSeconds],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.leaseId,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.blobSequenceNumber,
Parameters.sequenceNumberAction
],
isXML: true,
serializer: xmlSerializer
};
const copyIncrementalOperationSpec = {
path: "/{containerName}/{blob}",
httpMethod: "PUT",
responses: {
202: {
headersMapper: Mappers.PageBlobCopyIncrementalHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.PageBlobCopyIncrementalExceptionHeaders
}
},
queryParameters: [Parameters.timeoutInSeconds, Parameters.comp21],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1,
Parameters.ifModifiedSince,
Parameters.ifUnmodifiedSince,
Parameters.ifMatch,
Parameters.ifNoneMatch,
Parameters.ifTags,
Parameters.copySource
],
isXML: true,
serializer: xmlSerializer
};
//# sourceMappingURL=pageBlob.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,345 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
import * as coreHttp from "@azure/core-http";
import * as Mappers from "../models/mappers";
import * as Parameters from "../models/parameters";
/** Class representing a Service. */
export class Service {
/**
* Initialize a new instance of the class Service class.
* @param client Reference to the service client
*/
constructor(client) {
this.client = client;
}
/**
* Sets properties for a storage account's Blob service endpoint, including properties for Storage
* Analytics and CORS (Cross-Origin Resource Sharing) rules
* @param blobServiceProperties The StorageService properties.
* @param options The options parameters.
*/
setProperties(blobServiceProperties, options) {
const operationArguments = {
blobServiceProperties,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, setPropertiesOperationSpec);
}
/**
* gets the properties of a storage account's Blob service, including properties for Storage Analytics
* and CORS (Cross-Origin Resource Sharing) rules.
* @param options The options parameters.
*/
getProperties(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getPropertiesOperationSpec);
}
/**
* Retrieves statistics related to replication for the Blob service. It is only available on the
* secondary location endpoint when read-access geo-redundant replication is enabled for the storage
* account.
* @param options The options parameters.
*/
getStatistics(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getStatisticsOperationSpec);
}
/**
* The List Containers Segment operation returns a list of the containers under the specified account
* @param options The options parameters.
*/
listContainersSegment(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, listContainersSegmentOperationSpec);
}
/**
* Retrieves a user delegation key for the Blob service. This is only a valid operation when using
* bearer token authentication.
* @param keyInfo Key information
* @param options The options parameters.
*/
getUserDelegationKey(keyInfo, options) {
const operationArguments = {
keyInfo,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getUserDelegationKeyOperationSpec);
}
/**
* Returns the sku name and account kind
* @param options The options parameters.
*/
getAccountInfo(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, getAccountInfoOperationSpec);
}
/**
* The Batch operation allows multiple API calls to be embedded into a single HTTP request.
* @param contentLength The length of the request.
* @param multipartContentType Required. The value of this header must be multipart/mixed with a batch
* boundary. Example header value: multipart/mixed; boundary=batch_<GUID>
* @param body Initial data
* @param options The options parameters.
*/
submitBatch(contentLength, multipartContentType, body, options) {
const operationArguments = {
contentLength,
multipartContentType,
body,
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, submitBatchOperationSpec);
}
/**
* The Filter Blobs operation enables callers to list blobs across all containers whose tags match a
* given search expression. Filter blobs searches across all containers within a storage account but
* can be scoped within the expression to a single container.
* @param options The options parameters.
*/
filterBlobs(options) {
const operationArguments = {
options: coreHttp.operationOptionsToRequestOptionsBase(options || {})
};
return this.client.sendOperationRequest(operationArguments, filterBlobsOperationSpec);
}
}
// Operation Specifications
const xmlSerializer = new coreHttp.Serializer(Mappers, /* isXml */ true);
const setPropertiesOperationSpec = {
path: "/",
httpMethod: "PUT",
responses: {
202: {
headersMapper: Mappers.ServiceSetPropertiesHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ServiceSetPropertiesExceptionHeaders
}
},
requestBody: Parameters.blobServiceProperties,
queryParameters: [
Parameters.restype,
Parameters.comp,
Parameters.timeoutInSeconds
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.contentType,
Parameters.accept,
Parameters.version,
Parameters.requestId
],
isXML: true,
contentType: "application/xml; charset=utf-8",
mediaType: "xml",
serializer: xmlSerializer
};
const getPropertiesOperationSpec = {
path: "/",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.BlobServiceProperties,
headersMapper: Mappers.ServiceGetPropertiesHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ServiceGetPropertiesExceptionHeaders
}
},
queryParameters: [
Parameters.restype,
Parameters.comp,
Parameters.timeoutInSeconds
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1
],
isXML: true,
serializer: xmlSerializer
};
const getStatisticsOperationSpec = {
path: "/",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.BlobServiceStatistics,
headersMapper: Mappers.ServiceGetStatisticsHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ServiceGetStatisticsExceptionHeaders
}
},
queryParameters: [
Parameters.restype,
Parameters.timeoutInSeconds,
Parameters.comp1
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1
],
isXML: true,
serializer: xmlSerializer
};
const listContainersSegmentOperationSpec = {
path: "/",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.ListContainersSegmentResponse,
headersMapper: Mappers.ServiceListContainersSegmentHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ServiceListContainersSegmentExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.comp2,
Parameters.prefix,
Parameters.marker,
Parameters.maxPageSize,
Parameters.include
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1
],
isXML: true,
serializer: xmlSerializer
};
const getUserDelegationKeyOperationSpec = {
path: "/",
httpMethod: "POST",
responses: {
200: {
bodyMapper: Mappers.UserDelegationKey,
headersMapper: Mappers.ServiceGetUserDelegationKeyHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ServiceGetUserDelegationKeyExceptionHeaders
}
},
requestBody: Parameters.keyInfo,
queryParameters: [
Parameters.restype,
Parameters.timeoutInSeconds,
Parameters.comp3
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.contentType,
Parameters.accept,
Parameters.version,
Parameters.requestId
],
isXML: true,
contentType: "application/xml; charset=utf-8",
mediaType: "xml",
serializer: xmlSerializer
};
const getAccountInfoOperationSpec = {
path: "/",
httpMethod: "GET",
responses: {
200: {
headersMapper: Mappers.ServiceGetAccountInfoHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ServiceGetAccountInfoExceptionHeaders
}
},
queryParameters: [Parameters.comp, Parameters.restype1],
urlParameters: [Parameters.url],
headerParameters: [Parameters.version, Parameters.accept1],
isXML: true,
serializer: xmlSerializer
};
const submitBatchOperationSpec = {
path: "/",
httpMethod: "POST",
responses: {
202: {
bodyMapper: {
type: { name: "Stream" },
serializedName: "parsedResponse"
},
headersMapper: Mappers.ServiceSubmitBatchHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ServiceSubmitBatchExceptionHeaders
}
},
requestBody: Parameters.body,
queryParameters: [Parameters.timeoutInSeconds, Parameters.comp4],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.contentType,
Parameters.accept,
Parameters.version,
Parameters.requestId,
Parameters.contentLength,
Parameters.multipartContentType
],
isXML: true,
contentType: "application/xml; charset=utf-8",
mediaType: "xml",
serializer: xmlSerializer
};
const filterBlobsOperationSpec = {
path: "/",
httpMethod: "GET",
responses: {
200: {
bodyMapper: Mappers.FilterBlobSegment,
headersMapper: Mappers.ServiceFilterBlobsHeaders
},
default: {
bodyMapper: Mappers.StorageError,
headersMapper: Mappers.ServiceFilterBlobsExceptionHeaders
}
},
queryParameters: [
Parameters.timeoutInSeconds,
Parameters.marker,
Parameters.maxPageSize,
Parameters.comp5,
Parameters.where
],
urlParameters: [Parameters.url],
headerParameters: [
Parameters.version,
Parameters.requestId,
Parameters.accept1
],
isXML: true,
serializer: xmlSerializer
};
//# sourceMappingURL=service.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,27 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
import { Service, Container, Blob, PageBlob, AppendBlob, BlockBlob } from "./operations";
import { StorageClientContext } from "./storageClientContext";
export class StorageClient extends StorageClientContext {
/**
* Initializes a new instance of the StorageClient class.
* @param url The URL of the service account, container, or blob that is the target of the desired
* operation.
* @param options The parameter options
*/
constructor(url, options) {
super(url, options);
this.service = new Service(this);
this.container = new Container(this);
this.blob = new Blob(this);
this.pageBlob = new PageBlob(this);
this.appendBlob = new AppendBlob(this);
this.blockBlob = new BlockBlob(this);
}
}
//# sourceMappingURL=storageClient.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"storageClient.js","sourceRoot":"","sources":["../../../../../src/generated/src/storageClient.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,OAAO,aAAc,SAAQ,oBAAoB;IACrD;;;;;OAKG;IACH,YAAY,GAAW,EAAE,OAAqC;QAC5D,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;CAQF","sourcesContent":["/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\nimport {\n Service,\n Container,\n Blob,\n PageBlob,\n AppendBlob,\n BlockBlob\n} from \"./operations\";\nimport { StorageClientContext } from \"./storageClientContext\";\nimport { StorageClientOptionalParams } from \"./models\";\n\nexport class StorageClient extends StorageClientContext {\n /**\n * Initializes a new instance of the StorageClient class.\n * @param url The URL of the service account, container, or blob that is the target of the desired\n * operation.\n * @param options The parameter options\n */\n constructor(url: string, options?: StorageClientOptionalParams) {\n super(url, options);\n this.service = new Service(this);\n this.container = new Container(this);\n this.blob = new Blob(this);\n this.pageBlob = new PageBlob(this);\n this.appendBlob = new AppendBlob(this);\n this.blockBlob = new BlockBlob(this);\n }\n\n service: Service;\n container: Container;\n blob: Blob;\n pageBlob: PageBlob;\n appendBlob: AppendBlob;\n blockBlob: BlockBlob;\n}\n"]}

View file

@ -0,0 +1,39 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License.
*
* Code generated by Microsoft (R) AutoRest Code Generator.
* Changes may cause incorrect behavior and will be lost if the code is regenerated.
*/
import * as coreHttp from "@azure/core-http";
const packageName = "azure-storage-blob";
const packageVersion = "12.11.0";
export class StorageClientContext extends coreHttp.ServiceClient {
/**
* Initializes a new instance of the StorageClientContext class.
* @param url The URL of the service account, container, or blob that is the target of the desired
* operation.
* @param options The parameter options
*/
constructor(url, options) {
if (url === undefined) {
throw new Error("'url' cannot be null");
}
// Initializing default values for options
if (!options) {
options = {};
}
if (!options.userAgent) {
const defaultUserAgent = coreHttp.getDefaultUserAgentValue();
options.userAgent = `${packageName}/${packageVersion} ${defaultUserAgent}`;
}
super(undefined, options);
this.requestContentType = "application/json; charset=utf-8";
this.baseUri = options.endpoint || "{url}";
// Parameter assignments
this.url = url;
// Assigning values to Constant parameters
this.version = options.version || "2021-08-06";
}
}
//# sourceMappingURL=storageClientContext.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"storageClientContext.js","sourceRoot":"","sources":["../../../../../src/generated/src/storageClientContext.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,MAAM,WAAW,GAAG,oBAAoB,CAAC;AACzC,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,MAAM,OAAO,oBAAqB,SAAQ,QAAQ,CAAC,aAAa;IAI9D;;;;;OAKG;IACH,YAAY,GAAW,EAAE,OAAqC;QAC5D,IAAI,GAAG,KAAK,SAAS,EAAE;YACrB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;SACzC;QAED,0CAA0C;QAC1C,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,EAAE,CAAC;SACd;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YACtB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,wBAAwB,EAAE,CAAC;YAC7D,OAAO,CAAC,SAAS,GAAG,GAAG,WAAW,IAAI,cAAc,IAAI,gBAAgB,EAAE,CAAC;SAC5E;QAED,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE1B,IAAI,CAAC,kBAAkB,GAAG,iCAAiC,CAAC;QAE5D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC;QAE3C,wBAAwB;QACxB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,0CAA0C;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,YAAY,CAAC;IACjD,CAAC;CACF","sourcesContent":["/*\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * Code generated by Microsoft (R) AutoRest Code Generator.\n * Changes may cause incorrect behavior and will be lost if the code is regenerated.\n */\n\nimport * as coreHttp from \"@azure/core-http\";\nimport { StorageClientOptionalParams } from \"./models\";\n\nconst packageName = \"azure-storage-blob\";\nconst packageVersion = \"12.11.0\";\n\nexport class StorageClientContext extends coreHttp.ServiceClient {\n url: string;\n version: string;\n\n /**\n * Initializes a new instance of the StorageClientContext class.\n * @param url The URL of the service account, container, or blob that is the target of the desired\n * operation.\n * @param options The parameter options\n */\n constructor(url: string, options?: StorageClientOptionalParams) {\n if (url === undefined) {\n throw new Error(\"'url' cannot be null\");\n }\n\n // Initializing default values for options\n if (!options) {\n options = {};\n }\n\n if (!options.userAgent) {\n const defaultUserAgent = coreHttp.getDefaultUserAgentValue();\n options.userAgent = `${packageName}/${packageVersion} ${defaultUserAgent}`;\n }\n\n super(undefined, options);\n\n this.requestContentType = \"application/json; charset=utf-8\";\n\n this.baseUri = options.endpoint || \"{url}\";\n\n // Parameter assignments\n this.url = url;\n\n // Assigning values to Constant parameters\n this.version = options.version || \"2021-08-06\";\n }\n}\n"]}

View file

@ -0,0 +1,4 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
export {};
//# sourceMappingURL=generatedModels.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,22 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { RestError } from "@azure/core-http";
export * from "./BlobServiceClient";
export * from "./Clients";
export * from "./ContainerClient";
export * from "./BlobLeaseClient";
export * from "./BlobBatch";
export * from "./BlobBatchClient";
export * from "./BatchResponse";
export * from "./StorageBrowserPolicyFactory";
export * from "./credentials/AnonymousCredential";
export * from "./credentials/Credential";
export { BlockBlobTier, PremiumPageBlobTier, } from "./models";
export * from "./Pipeline";
export * from "./policies/AnonymousCredentialPolicy";
export * from "./policies/CredentialPolicy";
export * from "./StorageRetryPolicyFactory";
export * from "./generatedModels";
export { RestError };
export { logger } from "./log";
//# sourceMappingURL=index.browser.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../../../src/index.browser.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EACL,aAAa,EAEb,mBAAmB,GAOpB,MAAM,UAAU,CAAC;AAClB,cAAc,YAAY,CAAC;AAC3B,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,CAAC;AAMrB,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { RestError } from \"@azure/core-http\";\n\nexport * from \"./BlobServiceClient\";\nexport * from \"./Clients\";\nexport * from \"./ContainerClient\";\nexport * from \"./BlobLeaseClient\";\nexport * from \"./BlobBatch\";\nexport * from \"./BlobBatchClient\";\nexport * from \"./BatchResponse\";\nexport * from \"./StorageBrowserPolicyFactory\";\nexport * from \"./credentials/AnonymousCredential\";\nexport * from \"./credentials/Credential\";\nexport { SasIPRange } from \"./sas/SasIPRange\";\nexport { Range } from \"./Range\";\nexport {\n BlockBlobTier,\n BlobImmutabilityPolicy,\n PremiumPageBlobTier,\n Tags,\n TagConditions,\n ContainerRequestConditions,\n HttpAuthorization,\n ModificationConditions,\n MatchConditions,\n} from \"./models\";\nexport * from \"./Pipeline\";\nexport * from \"./policies/AnonymousCredentialPolicy\";\nexport * from \"./policies/CredentialPolicy\";\nexport * from \"./StorageRetryPolicyFactory\";\nexport { CommonOptions } from \"./StorageClient\";\nexport * from \"./generatedModels\";\nexport { RestError };\nexport {\n PageBlobGetPageRangesDiffResponse,\n PageBlobGetPageRangesResponse,\n PageList,\n} from \"./PageBlobRangeResponse\";\nexport { logger } from \"./log\";\n"]}

View file

@ -0,0 +1,32 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { RestError } from "@azure/core-http";
export * from "./BlobServiceClient";
export * from "./Clients";
export * from "./ContainerClient";
export * from "./BlobLeaseClient";
export * from "./sas/AccountSASPermissions";
export * from "./sas/AccountSASResourceTypes";
export * from "./sas/AccountSASServices";
export * from "./sas/AccountSASSignatureValues";
export * from "./BlobBatch";
export * from "./BlobBatchClient";
export * from "./BatchResponse";
export * from "./sas/BlobSASPermissions";
export * from "./sas/BlobSASSignatureValues";
export * from "./StorageBrowserPolicyFactory";
export * from "./sas/ContainerSASPermissions";
export * from "./credentials/AnonymousCredential";
export * from "./credentials/Credential";
export * from "./credentials/StorageSharedKeyCredential";
export { BlockBlobTier, PremiumPageBlobTier, StorageBlobAudience, } from "./models";
export * from "./Pipeline";
export * from "./policies/AnonymousCredentialPolicy";
export * from "./policies/CredentialPolicy";
export * from "./StorageRetryPolicyFactory";
export * from "./policies/StorageSharedKeyCredentialPolicy";
export * from "./sas/SASQueryParameters";
export * from "./generatedModels";
export { RestError };
export { logger } from "./log";
//# sourceMappingURL=index.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAChD,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,0CAA0C,CAAC;AAGzD,OAAO,EACL,aAAa,EACb,mBAAmB,EAUnB,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAClB,cAAc,YAAY,CAAC;AAC3B,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0BAA0B,CAAC;AAEzC,cAAc,mBAAmB,CAAC;AAYlC,OAAO,EAAE,SAAS,EAAE,CAAC;AAMrB,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { RestError } from \"@azure/core-http\";\n\nexport { PollerLike, PollOperationState } from \"@azure/core-lro\";\nexport * from \"./BlobServiceClient\";\nexport * from \"./Clients\";\nexport * from \"./ContainerClient\";\nexport * from \"./BlobLeaseClient\";\nexport * from \"./sas/AccountSASPermissions\";\nexport * from \"./sas/AccountSASResourceTypes\";\nexport * from \"./sas/AccountSASServices\";\nexport * from \"./sas/AccountSASSignatureValues\";\nexport * from \"./BlobBatch\";\nexport * from \"./BlobBatchClient\";\nexport * from \"./BatchResponse\";\nexport * from \"./sas/BlobSASPermissions\";\nexport * from \"./sas/BlobSASSignatureValues\";\nexport * from \"./StorageBrowserPolicyFactory\";\nexport * from \"./sas/ContainerSASPermissions\";\nexport * from \"./credentials/AnonymousCredential\";\nexport * from \"./credentials/Credential\";\nexport * from \"./credentials/StorageSharedKeyCredential\";\nexport { SasIPRange } from \"./sas/SasIPRange\";\nexport { Range } from \"./Range\";\nexport {\n BlockBlobTier,\n PremiumPageBlobTier,\n Tags,\n BlobDownloadResponseParsed,\n BlobImmutabilityPolicy,\n ObjectReplicationPolicy,\n ObjectReplicationRule,\n ObjectReplicationStatus,\n BlobQueryArrowField,\n BlobQueryArrowFieldType,\n HttpAuthorization,\n StorageBlobAudience,\n} from \"./models\";\nexport * from \"./Pipeline\";\nexport * from \"./policies/AnonymousCredentialPolicy\";\nexport * from \"./policies/CredentialPolicy\";\nexport * from \"./StorageRetryPolicyFactory\";\nexport * from \"./policies/StorageSharedKeyCredentialPolicy\";\nexport * from \"./sas/SASQueryParameters\";\nexport { CommonOptions } from \"./StorageClient\";\nexport * from \"./generatedModels\";\nexport {\n AppendBlobRequestConditions,\n BlobRequestConditions,\n Metadata,\n PageBlobRequestConditions,\n TagConditions,\n ContainerRequestConditions,\n ModificationConditions,\n MatchConditions,\n ModifiedAccessConditions,\n} from \"./models\";\nexport { RestError };\nexport {\n PageBlobGetPageRangesDiffResponse,\n PageBlobGetPageRangesResponse,\n PageList,\n} from \"./PageBlobRangeResponse\";\nexport { logger } from \"./log\";\nexport {\n BlobBeginCopyFromUrlPollState,\n CopyPollerBlobClient,\n} from \"./pollers/BlobStartCopyFromUrlPoller\";\n"]}

View file

@ -0,0 +1,8 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { createClientLogger } from "@azure/logger";
/**
* The `@azure/logger` configuration for this package.
*/
export const logger = createClientLogger("storage-blob");
//# sourceMappingURL=log.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/log.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { createClientLogger } from \"@azure/logger\";\n\n/**\n * The `@azure/logger` configuration for this package.\n */\nexport const logger = createClientLogger(\"storage-blob\");\n"]}

View file

@ -0,0 +1,104 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { EncryptionAlgorithmAES25 } from "./utils/constants";
/**
* Represents the access tier on a blob.
* For detailed information about block blob level tiering see {@link https://docs.microsoft.com/azure/storage/blobs/storage-blob-storage-tiers|Hot, cool and archive storage tiers.}
*/
export var BlockBlobTier;
(function (BlockBlobTier) {
/**
* Optimized for storing data that is accessed frequently.
*/
BlockBlobTier["Hot"] = "Hot";
/**
* Optimized for storing data that is infrequently accessed and stored for at least 30 days.
*/
BlockBlobTier["Cool"] = "Cool";
/**
* Optimized for storing data that is rarely accessed and stored for at least 180 days
* with flexible latency requirements (on the order of hours).
*/
BlockBlobTier["Archive"] = "Archive";
})(BlockBlobTier || (BlockBlobTier = {}));
/**
* Specifies the page blob tier to set the blob to. This is only applicable to page blobs on premium storage accounts.
* Please see {@link https://docs.microsoft.com/azure/storage/storage-premium-storage#scalability-and-performance-targets|here}
* for detailed information on the corresponding IOPS and throughput per PageBlobTier.
*/
export var PremiumPageBlobTier;
(function (PremiumPageBlobTier) {
/**
* P4 Tier.
*/
PremiumPageBlobTier["P4"] = "P4";
/**
* P6 Tier.
*/
PremiumPageBlobTier["P6"] = "P6";
/**
* P10 Tier.
*/
PremiumPageBlobTier["P10"] = "P10";
/**
* P15 Tier.
*/
PremiumPageBlobTier["P15"] = "P15";
/**
* P20 Tier.
*/
PremiumPageBlobTier["P20"] = "P20";
/**
* P30 Tier.
*/
PremiumPageBlobTier["P30"] = "P30";
/**
* P40 Tier.
*/
PremiumPageBlobTier["P40"] = "P40";
/**
* P50 Tier.
*/
PremiumPageBlobTier["P50"] = "P50";
/**
* P60 Tier.
*/
PremiumPageBlobTier["P60"] = "P60";
/**
* P70 Tier.
*/
PremiumPageBlobTier["P70"] = "P70";
/**
* P80 Tier.
*/
PremiumPageBlobTier["P80"] = "P80";
})(PremiumPageBlobTier || (PremiumPageBlobTier = {}));
export function toAccessTier(tier) {
if (tier === undefined) {
return undefined;
}
return tier; // No more check if string is a valid AccessTier, and left this to underlay logic to decide(service).
}
export function ensureCpkIfSpecified(cpk, isHttps) {
if (cpk && !isHttps) {
throw new RangeError("Customer-provided encryption key must be used over HTTPS.");
}
if (cpk && !cpk.encryptionAlgorithm) {
cpk.encryptionAlgorithm = EncryptionAlgorithmAES25;
}
}
/**
* Defines the known cloud audiences for Storage.
*/
export var StorageBlobAudience;
(function (StorageBlobAudience) {
/**
* The OAuth scope to use to retrieve an AAD token for Azure Storage.
*/
StorageBlobAudience["StorageOAuthScopes"] = "https://storage.azure.com/.default";
/**
* The OAuth scope to use to retrieve an AAD token for Azure Disk.
*/
StorageBlobAudience["DiskComputeOAuthScopes"] = "https://disk.compute.azure.com/.default";
})(StorageBlobAudience || (StorageBlobAudience = {}));
//# sourceMappingURL=models.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,20 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { CredentialPolicy } from "./CredentialPolicy";
/**
* AnonymousCredentialPolicy is used with HTTP(S) requests that read public resources
* or for use with Shared Access Signatures (SAS).
*/
export class AnonymousCredentialPolicy extends CredentialPolicy {
/**
* Creates an instance of AnonymousCredentialPolicy.
* @param nextPolicy -
* @param options -
*/
// The base class has a protected constructor. Adding a public one to enable constructing of this class.
/* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
constructor(nextPolicy, options) {
super(nextPolicy, options);
}
}
//# sourceMappingURL=AnonymousCredentialPolicy.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"AnonymousCredentialPolicy.js","sourceRoot":"","sources":["../../../../src/policies/AnonymousCredentialPolicy.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAIlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,gBAAgB;IAC7D;;;;OAIG;IACH,wGAAwG;IACxG,uEAAuE;IACvE,YAAY,UAAyB,EAAE,OAA6B;QAClE,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { RequestPolicy, RequestPolicyOptions } from \"@azure/core-http\";\n\nimport { CredentialPolicy } from \"./CredentialPolicy\";\n\n/**\n * AnonymousCredentialPolicy is used with HTTP(S) requests that read public resources\n * or for use with Shared Access Signatures (SAS).\n */\nexport class AnonymousCredentialPolicy extends CredentialPolicy {\n /**\n * Creates an instance of AnonymousCredentialPolicy.\n * @param nextPolicy -\n * @param options -\n */\n // The base class has a protected constructor. Adding a public one to enable constructing of this class.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/\n constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptions) {\n super(nextPolicy, options);\n }\n}\n"]}

View file

@ -0,0 +1,29 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy } from "@azure/core-http";
/**
* Credential policy used to sign HTTP(S) requests before sending. This is an
* abstract class.
*/
export class CredentialPolicy extends BaseRequestPolicy {
/**
* Sends out request.
*
* @param request -
*/
sendRequest(request) {
return this._nextPolicy.sendRequest(this.signRequest(request));
}
/**
* Child classes must implement this method with request signing. This method
* will be executed in {@link sendRequest}.
*
* @param request -
*/
signRequest(request) {
// Child classes must override this method with request signing. This method
// will be executed in sendRequest().
return request;
}
}
//# sourceMappingURL=CredentialPolicy.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"CredentialPolicy.js","sourceRoot":"","sources":["../../../../src/policies/CredentialPolicy.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,iBAAiB,EAAsC,MAAM,kBAAkB,CAAC;AAEzF;;;GAGG;AACH,MAAM,OAAgB,gBAAiB,SAAQ,iBAAiB;IAC9D;;;;OAIG;IACI,WAAW,CAAC,OAAoB;QACrC,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED;;;;;OAKG;IACO,WAAW,CAAC,OAAoB;QACxC,4EAA4E;QAC5E,qCAAqC;QACrC,OAAO,OAAO,CAAC;IACjB,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { BaseRequestPolicy, HttpOperationResponse, WebResource } from \"@azure/core-http\";\n\n/**\n * Credential policy used to sign HTTP(S) requests before sending. This is an\n * abstract class.\n */\nexport abstract class CredentialPolicy extends BaseRequestPolicy {\n /**\n * Sends out request.\n *\n * @param request -\n */\n public sendRequest(request: WebResource): Promise<HttpOperationResponse> {\n return this._nextPolicy.sendRequest(this.signRequest(request));\n }\n\n /**\n * Child classes must implement this method with request signing. This method\n * will be executed in {@link sendRequest}.\n *\n * @param request -\n */\n protected signRequest(request: WebResource): WebResource {\n // Child classes must override this method with request signing. This method\n // will be executed in sendRequest().\n return request;\n }\n}\n"]}

View file

@ -0,0 +1,245 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { URLBuilder } from "@azure/core-http";
import { BaseRequestPolicy, } from "@azure/core-http";
import { delay } from "@azure/core-http";
/**
* A set of constants used internally when processing requests.
*/
const Constants = {
DefaultScope: "/.default",
/**
* Defines constants for use with HTTP headers.
*/
HeaderConstants: {
/**
* The Authorization header.
*/
AUTHORIZATION: "authorization",
},
};
// Default options for the cycler if none are provided
const DEFAULT_CYCLER_OPTIONS = {
forcedRefreshWindowInMs: 1000,
retryIntervalInMs: 3000,
refreshWindowInMs: 1000 * 60 * 2, // Start refreshing 2m before expiry
};
/**
* Converts an an unreliable access token getter (which may resolve with null)
* into an AccessTokenGetter by retrying the unreliable getter in a regular
* interval.
*
* @param getAccessToken - a function that produces a promise of an access
* token that may fail by returning null
* @param retryIntervalInMs - the time (in milliseconds) to wait between retry
* attempts
* @param timeoutInMs - the timestamp after which the refresh attempt will fail,
* throwing an exception
* @returns - a promise that, if it resolves, will resolve with an access token
*/
async function beginRefresh(getAccessToken, retryIntervalInMs, timeoutInMs) {
// This wrapper handles exceptions gracefully as long as we haven't exceeded
// the timeout.
async function tryGetAccessToken() {
if (Date.now() < timeoutInMs) {
try {
return await getAccessToken();
}
catch (_a) {
return null;
}
}
else {
const finalToken = await getAccessToken();
// Timeout is up, so throw if it's still null
if (finalToken === null) {
throw new Error("Failed to refresh access token.");
}
return finalToken;
}
}
let token = await tryGetAccessToken();
while (token === null) {
await delay(retryIntervalInMs);
token = await tryGetAccessToken();
}
return token;
}
/**
* Creates a token cycler from a credential, scopes, and optional settings.
*
* A token cycler represents a way to reliably retrieve a valid access token
* from a TokenCredential. It will handle initializing the token, refreshing it
* when it nears expiration, and synchronizes refresh attempts to avoid
* concurrency hazards.
*
* @param credential - the underlying TokenCredential that provides the access
* token
* @param scopes - the scopes to request authorization for
* @param tokenCyclerOptions - optionally override default settings for the cycler
*
* @returns - a function that reliably produces a valid access token
*/
function createTokenCycler(credential, scopes, tokenCyclerOptions) {
let refreshWorker = null;
let token = null;
const options = Object.assign(Object.assign({}, DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions);
/**
* This little holder defines several predicates that we use to construct
* the rules of refreshing the token.
*/
const cycler = {
/**
* Produces true if a refresh job is currently in progress.
*/
get isRefreshing() {
return refreshWorker !== null;
},
/**
* Produces true if the cycler SHOULD refresh (we are within the refresh
* window and not already refreshing)
*/
get shouldRefresh() {
var _a;
return (!cycler.isRefreshing &&
((_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : 0) - options.refreshWindowInMs < Date.now());
},
/**
* Produces true if the cycler MUST refresh (null or nearly-expired
* token).
*/
get mustRefresh() {
return (token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now());
},
};
/**
* Starts a refresh job or returns the existing job if one is already
* running.
*/
function refresh(getTokenOptions) {
var _a;
if (!cycler.isRefreshing) {
// We bind `scopes` here to avoid passing it around a lot
const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions);
// Take advantage of promise chaining to insert an assignment to `token`
// before the refresh can be considered done.
refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs,
// If we don't have a token, then we should timeout immediately
(_a = token === null || token === void 0 ? void 0 : token.expiresOnTimestamp) !== null && _a !== void 0 ? _a : Date.now())
.then((_token) => {
refreshWorker = null;
token = _token;
return token;
})
.catch((reason) => {
// We also should reset the refresher if we enter a failed state. All
// existing awaiters will throw, but subsequent requests will start a
// new retry chain.
refreshWorker = null;
token = null;
throw reason;
});
}
return refreshWorker;
}
return async (tokenOptions) => {
//
// Simple rules:
// - If we MUST refresh, then return the refresh task, blocking
// the pipeline until a token is available.
// - If we SHOULD refresh, then run refresh but don't return it
// (we can still use the cached token).
// - Return the token, since it's fine if we didn't return in
// step 1.
//
if (cycler.mustRefresh)
return refresh(tokenOptions);
if (cycler.shouldRefresh) {
refresh(tokenOptions);
}
return token;
};
}
/**
* We will retrieve the challenge only if the response status code was 401,
* and if the response contained the header "WWW-Authenticate" with a non-empty value.
*/
function getChallenge(response) {
const challenge = response.headers.get("WWW-Authenticate");
if (response.status === 401 && challenge) {
return challenge;
}
return;
}
/**
* Converts: `Bearer a="b" c="d"`.
* Into: `[ { a: 'b', c: 'd' }]`.
*
* @internal
*/
function parseChallenge(challenge) {
const bearerChallenge = challenge.slice("Bearer ".length);
const challengeParts = `${bearerChallenge.trim()} `.split(" ").filter((x) => x);
const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split("=")));
// Key-value pairs to plain object:
return keyValuePairs.reduce((a, b) => (Object.assign(Object.assign({}, a), b)), {});
}
// #endregion
/**
* Creates a new factory for a RequestPolicy that applies a bearer token to
* the requests' `Authorization` headers.
*
* @param credential - The TokenCredential implementation that can supply the bearer token.
* @param scopes - The scopes for which the bearer token applies.
*/
export function storageBearerTokenChallengeAuthenticationPolicy(credential, scopes) {
// This simple function encapsulates the entire process of reliably retrieving the token
let getToken = createTokenCycler(credential, scopes);
class StorageBearerTokenChallengeAuthenticationPolicy extends BaseRequestPolicy {
constructor(nextPolicy, options) {
super(nextPolicy, options);
}
async sendRequest(webResource) {
if (!webResource.url.toLowerCase().startsWith("https://")) {
throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs.");
}
const getTokenInternal = getToken;
const token = (await getTokenInternal({
abortSignal: webResource.abortSignal,
tracingOptions: {
tracingContext: webResource.tracingContext,
},
})).token;
webResource.headers.set(Constants.HeaderConstants.AUTHORIZATION, `Bearer ${token}`);
const response = await this._nextPolicy.sendRequest(webResource);
if ((response === null || response === void 0 ? void 0 : response.status) === 401) {
const challenge = getChallenge(response);
if (challenge) {
const challengeInfo = parseChallenge(challenge);
const challengeScopes = challengeInfo.resource_id + Constants.DefaultScope;
const parsedAuthUri = URLBuilder.parse(challengeInfo.authorization_uri);
const pathSegments = parsedAuthUri.getPath().split("/");
const tenantId = pathSegments[1];
const getTokenForChallenge = createTokenCycler(credential, challengeScopes);
const tokenForChallenge = (await getTokenForChallenge({
abortSignal: webResource.abortSignal,
tracingOptions: {
tracingContext: webResource.tracingContext,
},
tenantId: tenantId,
})).token;
getToken = getTokenForChallenge;
webResource.headers.set(Constants.HeaderConstants.AUTHORIZATION, `Bearer ${tokenForChallenge}`);
return this._nextPolicy.sendRequest(webResource);
}
}
return response;
}
}
return {
create: (nextPolicy, options) => {
return new StorageBearerTokenChallengeAuthenticationPolicy(nextPolicy, options);
},
};
}
//# sourceMappingURL=StorageBearerTokenChallengeAuthenticationPolicy.js.map

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,46 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { BaseRequestPolicy, isNode, } from "@azure/core-http";
import { HeaderConstants, URLConstants } from "../utils/constants";
import { setURLParameter } from "../utils/utils.common";
/**
* StorageBrowserPolicy will handle differences between Node.js and browser runtime, including:
*
* 1. Browsers cache GET/HEAD requests by adding conditional headers such as 'IF_MODIFIED_SINCE'.
* StorageBrowserPolicy is a policy used to add a timestamp query to GET/HEAD request URL
* thus avoid the browser cache.
*
* 2. Remove cookie header for security
*
* 3. Remove content-length header to avoid browsers warning
*/
export class StorageBrowserPolicy extends BaseRequestPolicy {
/**
* Creates an instance of StorageBrowserPolicy.
* @param nextPolicy -
* @param options -
*/
// The base class has a protected constructor. Adding a public one to enable constructing of this class.
/* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/
constructor(nextPolicy, options) {
super(nextPolicy, options);
}
/**
* Sends out request.
*
* @param request -
*/
async sendRequest(request) {
if (isNode) {
return this._nextPolicy.sendRequest(request);
}
if (request.method.toUpperCase() === "GET" || request.method.toUpperCase() === "HEAD") {
request.url = setURLParameter(request.url, URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString());
}
request.headers.remove(HeaderConstants.COOKIE);
// According to XHR standards, content-length should be fully controlled by browsers
request.headers.remove(HeaderConstants.CONTENT_LENGTH);
return this._nextPolicy.sendRequest(request);
}
}
//# sourceMappingURL=StorageBrowserPolicy.js.map

View file

@ -0,0 +1 @@
{"version":3,"file":"StorageBrowserPolicy.js","sourceRoot":"","sources":["../../../../src/policies/StorageBrowserPolicy.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EACL,iBAAiB,EAEjB,MAAM,GAIP,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,oBAAqB,SAAQ,iBAAiB;IACzD;;;;OAIG;IACH,wGAAwG;IACxG,uEAAuE;IACvE,YAAY,UAAyB,EAAE,OAA6B;QAClE,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,WAAW,CAAC,OAAoB;QAC3C,IAAI,MAAM,EAAE;YACV,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;SAC9C;QAED,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE;YACrF,OAAO,CAAC,GAAG,GAAG,eAAe,CAC3B,OAAO,CAAC,GAAG,EACX,YAAY,CAAC,UAAU,CAAC,sBAAsB,EAC9C,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAChC,CAAC;SACH;QAED,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAE/C,oFAAoF;QACpF,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QAEvD,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n BaseRequestPolicy,\n HttpOperationResponse,\n isNode,\n RequestPolicy,\n RequestPolicyOptions,\n WebResource,\n} from \"@azure/core-http\";\n\nimport { HeaderConstants, URLConstants } from \"../utils/constants\";\nimport { setURLParameter } from \"../utils/utils.common\";\n\n/**\n * StorageBrowserPolicy will handle differences between Node.js and browser runtime, including:\n *\n * 1. Browsers cache GET/HEAD requests by adding conditional headers such as 'IF_MODIFIED_SINCE'.\n * StorageBrowserPolicy is a policy used to add a timestamp query to GET/HEAD request URL\n * thus avoid the browser cache.\n *\n * 2. Remove cookie header for security\n *\n * 3. Remove content-length header to avoid browsers warning\n */\nexport class StorageBrowserPolicy extends BaseRequestPolicy {\n /**\n * Creates an instance of StorageBrowserPolicy.\n * @param nextPolicy -\n * @param options -\n */\n // The base class has a protected constructor. Adding a public one to enable constructing of this class.\n /* eslint-disable-next-line @typescript-eslint/no-useless-constructor*/\n constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptions) {\n super(nextPolicy, options);\n }\n\n /**\n * Sends out request.\n *\n * @param request -\n */\n public async sendRequest(request: WebResource): Promise<HttpOperationResponse> {\n if (isNode) {\n return this._nextPolicy.sendRequest(request);\n }\n\n if (request.method.toUpperCase() === \"GET\" || request.method.toUpperCase() === \"HEAD\") {\n request.url = setURLParameter(\n request.url,\n URLConstants.Parameters.FORCE_BROWSER_NO_CACHE,\n new Date().getTime().toString()\n );\n }\n\n request.headers.remove(HeaderConstants.COOKIE);\n\n // According to XHR standards, content-length should be fully controlled by browsers\n request.headers.remove(HeaderConstants.CONTENT_LENGTH);\n\n return this._nextPolicy.sendRequest(request);\n }\n}\n"]}

View file

@ -0,0 +1,214 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import { AbortError } from "@azure/abort-controller";
import { BaseRequestPolicy, } from "@azure/core-http";
import { URLConstants } from "../utils/constants";
import { delay, setURLHost, setURLParameter } from "../utils/utils.common";
import { logger } from "../log";
/**
* A factory method used to generated a RetryPolicy factory.
*
* @param retryOptions -
*/
export function NewRetryPolicyFactory(retryOptions) {
return {
create: (nextPolicy, options) => {
return new StorageRetryPolicy(nextPolicy, options, retryOptions);
},
};
}
/**
* RetryPolicy types.
*/
export var StorageRetryPolicyType;
(function (StorageRetryPolicyType) {
/**
* Exponential retry. Retry time delay grows exponentially.
*/
StorageRetryPolicyType[StorageRetryPolicyType["EXPONENTIAL"] = 0] = "EXPONENTIAL";
/**
* Linear retry. Retry time delay grows linearly.
*/
StorageRetryPolicyType[StorageRetryPolicyType["FIXED"] = 1] = "FIXED";
})(StorageRetryPolicyType || (StorageRetryPolicyType = {}));
// Default values of StorageRetryOptions
const DEFAULT_RETRY_OPTIONS = {
maxRetryDelayInMs: 120 * 1000,
maxTries: 4,
retryDelayInMs: 4 * 1000,
retryPolicyType: StorageRetryPolicyType.EXPONENTIAL,
secondaryHost: "",
tryTimeoutInMs: undefined, // Use server side default timeout strategy
};
const RETRY_ABORT_ERROR = new AbortError("The operation was aborted.");
/**
* Retry policy with exponential retry and linear retry implemented.
*/
export class StorageRetryPolicy extends BaseRequestPolicy {
/**
* Creates an instance of RetryPolicy.
*
* @param nextPolicy -
* @param options -
* @param retryOptions -
*/
constructor(nextPolicy, options, retryOptions = DEFAULT_RETRY_OPTIONS) {
super(nextPolicy, options);
// Initialize retry options
this.retryOptions = {
retryPolicyType: retryOptions.retryPolicyType
? retryOptions.retryPolicyType
: DEFAULT_RETRY_OPTIONS.retryPolicyType,
maxTries: retryOptions.maxTries && retryOptions.maxTries >= 1
? Math.floor(retryOptions.maxTries)
: DEFAULT_RETRY_OPTIONS.maxTries,
tryTimeoutInMs: retryOptions.tryTimeoutInMs && retryOptions.tryTimeoutInMs >= 0
? retryOptions.tryTimeoutInMs
: DEFAULT_RETRY_OPTIONS.tryTimeoutInMs,
retryDelayInMs: retryOptions.retryDelayInMs && retryOptions.retryDelayInMs >= 0
? Math.min(retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs
? retryOptions.maxRetryDelayInMs
: DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs)
: DEFAULT_RETRY_OPTIONS.retryDelayInMs,
maxRetryDelayInMs: retryOptions.maxRetryDelayInMs && retryOptions.maxRetryDelayInMs >= 0
? retryOptions.maxRetryDelayInMs
: DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs,
secondaryHost: retryOptions.secondaryHost
? retryOptions.secondaryHost
: DEFAULT_RETRY_OPTIONS.secondaryHost,
};
}
/**
* Sends request.
*
* @param request -
*/
async sendRequest(request) {
return this.attemptSendRequest(request, false, 1);
}
/**
* Decide and perform next retry. Won't mutate request parameter.
*
* @param request -
* @param secondaryHas404 - If attempt was against the secondary & it returned a StatusNotFound (404), then
* the resource was not found. This may be due to replication delay. So, in this
* case, we'll never try the secondary again for this operation.
* @param attempt - How many retries has been attempted to performed, starting from 1, which includes
* the attempt will be performed by this method call.
*/
async attemptSendRequest(request, secondaryHas404, attempt) {
const newRequest = request.clone();
const isPrimaryRetry = secondaryHas404 ||
!this.retryOptions.secondaryHost ||
!(request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") ||
attempt % 2 === 1;
if (!isPrimaryRetry) {
newRequest.url = setURLHost(newRequest.url, this.retryOptions.secondaryHost);
}
// Set the server-side timeout query parameter "timeout=[seconds]"
if (this.retryOptions.tryTimeoutInMs) {
newRequest.url = setURLParameter(newRequest.url, URLConstants.Parameters.TIMEOUT, Math.floor(this.retryOptions.tryTimeoutInMs / 1000).toString());
}
let response;
try {
logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`);
response = await this._nextPolicy.sendRequest(newRequest);
if (!this.shouldRetry(isPrimaryRetry, attempt, response)) {
return response;
}
secondaryHas404 = secondaryHas404 || (!isPrimaryRetry && response.status === 404);
}
catch (err) {
logger.error(`RetryPolicy: Caught error, message: ${err.message}, code: ${err.code}`);
if (!this.shouldRetry(isPrimaryRetry, attempt, response, err)) {
throw err;
}
}
await this.delay(isPrimaryRetry, attempt, request.abortSignal);
return this.attemptSendRequest(request, secondaryHas404, ++attempt);
}
/**
* Decide whether to retry according to last HTTP response and retry counters.
*
* @param isPrimaryRetry -
* @param attempt -
* @param response -
* @param err -
*/
shouldRetry(isPrimaryRetry, attempt, response, err) {
if (attempt >= this.retryOptions.maxTries) {
logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${this.retryOptions
.maxTries}, no further try.`);
return false;
}
// Handle network failures, you may need to customize the list when you implement
// your own http client
const retriableErrors = [
"ETIMEDOUT",
"ESOCKETTIMEDOUT",
"ECONNREFUSED",
"ECONNRESET",
"ENOENT",
"ENOTFOUND",
"TIMEOUT",
"EPIPE",
"REQUEST_SEND_ERROR", // For default xhr based http client provided in ms-rest-js
];
if (err) {
for (const retriableError of retriableErrors) {
if (err.name.toUpperCase().includes(retriableError) ||
err.message.toUpperCase().includes(retriableError) ||
(err.code && err.code.toString().toUpperCase() === retriableError)) {
logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`);
return true;
}
}
}
// If attempt was against the secondary & it returned a StatusNotFound (404), then
// the resource was not found. This may be due to replication delay. So, in this
// case, we'll never try the secondary again for this operation.
if (response || err) {
const statusCode = response ? response.status : err ? err.statusCode : 0;
if (!isPrimaryRetry && statusCode === 404) {
logger.info(`RetryPolicy: Secondary access with 404, will retry.`);
return true;
}
// Server internal error or server timeout
if (statusCode === 503 || statusCode === 500) {
logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`);
return true;
}
}
if ((err === null || err === void 0 ? void 0 : err.code) === "PARSE_ERROR" && (err === null || err === void 0 ? void 0 : err.message.startsWith(`Error "Error: Unclosed root tag`))) {
logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry.");
return true;
}
return false;
}
/**
* Delay a calculated time between retries.
*
* @param isPrimaryRetry -
* @param attempt -
* @param abortSignal -
*/
async delay(isPrimaryRetry, attempt, abortSignal) {
let delayTimeInMs = 0;
if (isPrimaryRetry) {
switch (this.retryOptions.retryPolicyType) {
case StorageRetryPolicyType.EXPONENTIAL:
delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * this.retryOptions.retryDelayInMs, this.retryOptions.maxRetryDelayInMs);
break;
case StorageRetryPolicyType.FIXED:
delayTimeInMs = this.retryOptions.retryDelayInMs;
break;
}
}
else {
delayTimeInMs = Math.random() * 1000;
}
logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`);
return delay(delayTimeInMs, abortSignal, RETRY_ABORT_ERROR);
}
}
//# sourceMappingURL=StorageRetryPolicy.js.map

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show more