From 37d6f1af4b8bfdd09122cd64de0e32bf5e0c3dd0 Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Fri, 2 Jun 2023 20:33:48 +0000 Subject: [PATCH 01/10] migrate + building without errors --- common/config/rush/pnpm-lock.yaml | 53 +- .../storage-file-share/api-extractor.json | 2 +- sdk/storage/storage-file-share/package.json | 35 +- .../src/AccountSASSignatureValues.ts | 2 +- sdk/storage/storage-file-share/src/Clients.ts | 627 +++++++----------- .../src/FileDownloadResponse.ts | 9 +- .../src/FileSASSignatureValues.ts | 2 +- .../storage-file-share/src/Pipeline.ts | 181 ----- .../src/ShareClientInternal.ts | 6 +- .../src/ShareServiceClient.ts | 89 ++- .../src/StorageBrowserPolicyFactory.ts | 21 - .../storage-file-share/src/StorageClient.ts | 41 +- .../src/StorageContextClient.ts | 25 + .../src/StorageRetryPolicyFactory.ts | 72 -- .../src/TelemetryPolicyFactory.ts | 68 -- .../src/credentials/AnonymousCredential.ts | 28 - .../src/credentials/Credential.ts | 29 - .../StorageSharedKeyCredential.browser.ts | 4 - .../credentials/StorageSharedKeyCredential.ts | 58 -- .../src/generated/src/index.ts | 2 +- .../src/generated/src/models/index.ts | 596 +++++------------ .../src/generated/src/models/mappers.ts | 256 +++---- .../src/generated/src/models/parameters.ts | 13 +- .../src/generated/src/operations/directory.ts | 101 +-- .../src/generated/src/operations/file.ts | 199 ++---- .../src/generated/src/operations/service.ts | 43 +- .../src/generated/src/operations/share.ts | 181 ++--- .../src/operationsInterfaces/directory.ts | 110 +++ .../src/operationsInterfaces/file.ts | 233 +++++++ .../src/operationsInterfaces/index.ts | 12 + .../src/operationsInterfaces/service.ts | 47 ++ .../src/operationsInterfaces/share.ts | 180 +++++ .../src/generated/src/storageClient.ts | 53 +- .../src/generated/src/storageClientContext.ts | 54 -- .../storage-file-share/src/index.browser.ts | 16 +- sdk/storage/storage-file-share/src/index.ts | 20 +- .../src/policies/AnonymousCredentialPolicy.ts | 23 - .../src/policies/CredentialPolicy.ts | 31 - .../src/policies/StorageBrowserPolicy.ts | 64 -- .../src/policies/StorageRetryPolicy.ts | 280 -------- .../StorageSharedKeyCredentialPolicy.ts | 177 ----- .../src/policies/TelemetryPolicy.ts | 53 -- .../src/utils/RetriableReadableStream.ts | 2 +- .../storage-file-share/src/utils/cache.ts | 10 +- .../storage-file-share/src/utils/tracing.ts | 18 - .../src/utils/utils.common.ts | 224 +++++-- .../storage-file-share/swagger/README.md | 5 +- .../test/directoryclient.spec.ts | 22 - .../test/fileclient.spec.ts | 50 +- .../storage-file-share/test/node/sas.spec.ts | 6 +- .../test/retrypolicy.spec.ts | 59 +- .../storage-file-share/test/utils.spec.ts | 39 +- .../test/utils/InjectorPolicy.ts | 54 +- .../test/utils/InjectorPolicyFactory.ts | 20 - .../test/utils/MockPolicy.ts | 43 -- .../test/utils/MockPolicyFactory.ts | 20 - .../test/utils/index.browser.ts | 4 +- .../storage-file-share/test/utils/index.ts | 6 +- .../test/utils/testutils.common.ts | 2 +- sdk/storage/storage-file-share/tsconfig.json | 2 +- 60 files changed, 1796 insertions(+), 2886 deletions(-) delete mode 100644 sdk/storage/storage-file-share/src/Pipeline.ts delete mode 100644 sdk/storage/storage-file-share/src/StorageBrowserPolicyFactory.ts create mode 100644 sdk/storage/storage-file-share/src/StorageContextClient.ts delete mode 100644 sdk/storage/storage-file-share/src/StorageRetryPolicyFactory.ts delete mode 100644 sdk/storage/storage-file-share/src/TelemetryPolicyFactory.ts delete mode 100644 sdk/storage/storage-file-share/src/credentials/AnonymousCredential.ts delete mode 100644 sdk/storage/storage-file-share/src/credentials/Credential.ts delete mode 100644 sdk/storage/storage-file-share/src/credentials/StorageSharedKeyCredential.browser.ts delete mode 100644 sdk/storage/storage-file-share/src/credentials/StorageSharedKeyCredential.ts create mode 100644 sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/directory.ts create mode 100644 sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/file.ts create mode 100644 sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/index.ts create mode 100644 sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/service.ts create mode 100644 sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/share.ts delete mode 100644 sdk/storage/storage-file-share/src/generated/src/storageClientContext.ts delete mode 100644 sdk/storage/storage-file-share/src/policies/AnonymousCredentialPolicy.ts delete mode 100644 sdk/storage/storage-file-share/src/policies/CredentialPolicy.ts delete mode 100644 sdk/storage/storage-file-share/src/policies/StorageBrowserPolicy.ts delete mode 100644 sdk/storage/storage-file-share/src/policies/StorageRetryPolicy.ts delete mode 100644 sdk/storage/storage-file-share/src/policies/StorageSharedKeyCredentialPolicy.ts delete mode 100644 sdk/storage/storage-file-share/src/policies/TelemetryPolicy.ts delete mode 100644 sdk/storage/storage-file-share/test/utils/InjectorPolicyFactory.ts delete mode 100644 sdk/storage/storage-file-share/test/utils/MockPolicy.ts delete mode 100644 sdk/storage/storage-file-share/test/utils/MockPolicyFactory.ts diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index d69c45e78bbb..42632c61e174 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -3832,7 +3832,7 @@ packages: dependencies: semver: 7.5.1 shelljs: 0.8.5 - typescript: 5.2.0-dev.20230530 + typescript: 5.2.0-dev.20230601 dev: false /ecdsa-sig-formatter/1.0.11: @@ -8189,6 +8189,37 @@ packages: code-block-writer: 12.0.0 dev: false + /ts-node/10.9.1_b5wb2ksfhxvmazt2irtoc64fxm: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.18.48 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.1.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + /ts-node/10.9.1_haicren4phfcx6dckkdidh3s3e: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -8388,8 +8419,14 @@ packages: hasBin: true dev: false - /typescript/5.2.0-dev.20230530: - resolution: {integrity: sha512-bIoMajCZWzLB+pWwncaba/hZc6dRnw7x8T/fenOnP9gYQB/gc4xdm48AXp5SH5I/PvvSeZ/dXkUMtc8s8BiDZw==} + /typescript/5.1.3: + resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + engines: {node: '>=14.17'} + hasBin: true + dev: false + + /typescript/5.2.0-dev.20230601: + resolution: {integrity: sha512-ZAe/C0wi4nXNds7zaN35oe/ju3WhYdyI+lvRy+xfsG9348PLOZgtYKO3v2RX5fSxhT2uZH5Gb5fk/sjCLaI9uw==} engines: {node: '>=14.17'} hasBin: true dev: false @@ -16652,7 +16689,7 @@ packages: name: '@rush-temp/dev-tool' version: 0.0.0 dependencies: - '@_ts/max': /typescript/5.0.4 + '@_ts/max': /typescript/5.1.3 '@_ts/min': /typescript/4.2.4 '@microsoft/api-extractor': 7.35.1_@types+node@14.18.48 '@rollup/plugin-commonjs': 24.1.0_rollup@2.79.1 @@ -16695,7 +16732,7 @@ packages: rollup-plugin-visualizer: 5.9.0_rollup@2.79.1 semver: 7.5.1 ts-morph: 18.0.0 - ts-node: 10.9.1_haicren4phfcx6dckkdidh3s3e + ts-node: 10.9.1_b5wb2ksfhxvmazt2irtoc64fxm tslib: 2.5.2 typescript: 5.0.4 yaml: 2.3.1 @@ -18198,7 +18235,7 @@ packages: dev: false file:projects/perf-ai-language-text.tgz: - resolution: {integrity: sha512-Mh6fHNCBSjPrqwprbqsP/ZpI86dsh5zViRYvXL7tNKAkdY0FDnvB74zlXpHUtn0CC5nIsK1BoKyeq0W89rUipQ==, tarball: file:projects/perf-ai-language-text.tgz} + resolution: {integrity: sha512-kUPHN6zS14EH/ErRIq3bqm8a4tnA9dN16oHOZ7n27rlA3+QINV7iGOcQwl1OsNPZOR3NN7dsVWLnTu/NbJ6+tw==, tarball: file:projects/perf-ai-language-text.tgz} name: '@rush-temp/perf-ai-language-text' version: 0.0.0 dependencies: @@ -19279,7 +19316,7 @@ packages: dev: false file:projects/storage-file-share.tgz: - resolution: {integrity: sha512-5ie5/QK9klG91C+f7GkzlFX+KDKuwVgKyn52dzGylmLr4NCjh/b4OWguq/5kae9OC8qHn4+aJHg2J81P5M4QDA==, tarball: file:projects/storage-file-share.tgz} + resolution: {integrity: sha512-NF2poQVFGOC0ZMVVC2qyTjIitV+UYtbq2kYIi3AES+HufQR/4S/4MhhqK1oyLSjHWQYA2ygBIZQf4DDw50AHdA==, tarball: file:projects/storage-file-share.tgz} name: '@rush-temp/storage-file-share' version: 0.0.0 dependencies: @@ -19289,6 +19326,7 @@ packages: '@types/chai': 4.3.5 '@types/mocha': 7.0.2 '@types/node': 14.18.48 + '@types/uuid': 8.3.4 chai: 4.3.7 cross-env: 7.0.3 dotenv: 16.1.0 @@ -19320,6 +19358,7 @@ packages: tslib: 2.5.2 typescript: 5.0.4 util: 0.12.5 + uuid: 8.3.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' diff --git a/sdk/storage/storage-file-share/api-extractor.json b/sdk/storage/storage-file-share/api-extractor.json index 3deae362736d..48017a7ca6dd 100644 --- a/sdk/storage/storage-file-share/api-extractor.json +++ b/sdk/storage/storage-file-share/api-extractor.json @@ -1,6 +1,6 @@ { "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "types/latest/src/index.d.ts", + "mainEntryPointFilePath": "types/latest/storage-file-share/src/index.d.ts", "docModel": { "enabled": true }, diff --git a/sdk/storage/storage-file-share/package.json b/sdk/storage/storage-file-share/package.json index 57c70e94cd1e..fedc8af0cbc3 100644 --- a/sdk/storage/storage-file-share/package.json +++ b/sdk/storage/storage-file-share/package.json @@ -1,22 +1,23 @@ { "name": "@azure/storage-file-share", "sdk-type": "client", - "version": "12.13.0", + "version": "12.20.0", "description": "Microsoft Azure Storage SDK for JavaScript - File", "main": "./dist/index.js", - "module": "./dist-esm/src/index.js", + "module": "./dist-esm/storage-file-share/src/index.js", "browser": { - "./dist-esm/src/index.js": "./dist-esm/src/index.browser.js", - "./dist-esm/src/credentials/StorageSharedKeyCredential.js": "./dist-esm/src/credentials/StorageSharedKeyCredential.browser.js", - "./dist-esm/src/utils/utils.node.js": "./dist-esm/src/utils/utils.browser.js", - "./dist-esm/test/utils/index.js": "./dist-esm/test/utils/index.browser.js", - "./dist-esm/src/FileDownloadResponse.js": "./dist-esm/src/FileDownloadResponse.browser.js", + "./dist-esm/storage-file-share/src/index.js": "./dist-esm/storage-file-share/src/index.browser.js", + "./dist-esm/storage-blob/src/credentials/StorageSharedKeyCredential.js": "./dist-esm/storage-blob/src/credentials/StorageSharedKeyCredential.browser.js", + "./dist-esm/storage-blob/src/policies/StorageSharedKeyCredentialPolicyV2.js": "./dist-esm/storage-blob/src/policies/StorageSharedKeyCredentialPolicyV2.browser.js", + "./dist-esm/storage-file-share/src/utils/utils.node.js": "./dist-esm/storage-file-share/src/utils/utils.browser.js", + "./dist-esm/storage-file-share/test/utils/index.js": "./dist-esm/storage-file-share/test/utils/index.browser.js", + "./dist-esm/storage-file-share/src/FileDownloadResponse.js": "./dist-esm/storage-file-share/src/FileDownloadResponse.browser.js", "fs": false, "os": false, "process": false }, "react-native": { - "./dist/index.js": "./dist-esm/src/index.js" + "./dist/index.js": "./dist-esm/storage-file-share/src/index.js" }, "types": "./types/latest/storage-file-share.d.ts", "typesVersions": { @@ -60,10 +61,9 @@ "unit-test": "npm run unit-test:node && npm run unit-test:browser" }, "files": [ - "BreakingChanges.md", - "ThirdPartyNotices.txt", "dist/", - "dist-esm/src/", + "dist-esm/storage-blob/src/", + "dist-esm/storage-file-share/src", "types/latest/storage-file-share.d.ts", "types/3.1/storage-file-share.d.ts", "README.md", @@ -124,15 +124,21 @@ }, "dependencies": { "@azure/abort-controller": "^1.0.0", - "@azure/core-http": "^3.0.0", + "@azure/core-auth": "^1.4.0", + "@azure/core-client": "^1.6.2", + "@azure/core-http-compat": "^2.0.0", "@azure/core-paging": "^1.1.1", + "@azure/core-rest-pipeline": "^1.10.1", "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/core-xml": "^1.3.2", "@azure/logger": "^1.0.0", "events": "^3.0.0", - "tslib": "^2.2.0" + "tslib": "^2.2.0", + "uuid": "^8.3.0" }, "devDependencies": { - "@azure/storage-blob": "^12.12.0", + "@azure/storage-blob": "^12.20.0", "@azure/dev-tool": "^1.0.0", "@azure/eslint-plugin-azure-sdk": "^3.0.0", "@azure/test-utils": "^1.0.0", @@ -142,6 +148,7 @@ "@types/chai": "^4.1.6", "@types/mocha": "^7.0.2", "@types/node": "^14.0.0", + "@types/uuid": "^8.0.0", "chai": "^4.2.0", "cross-env": "^7.0.2", "dotenv": "^16.0.0", diff --git a/sdk/storage/storage-file-share/src/AccountSASSignatureValues.ts b/sdk/storage/storage-file-share/src/AccountSASSignatureValues.ts index 0f2662417e81..facf97423532 100644 --- a/sdk/storage/storage-file-share/src/AccountSASSignatureValues.ts +++ b/sdk/storage/storage-file-share/src/AccountSASSignatureValues.ts @@ -4,7 +4,7 @@ import { AccountSASPermissions } from "./AccountSASPermissions"; import { AccountSASResourceTypes } from "./AccountSASResourceTypes"; import { AccountSASServices } from "./AccountSASServices"; -import { StorageSharedKeyCredential } from "./credentials/StorageSharedKeyCredential"; +import { StorageSharedKeyCredential } from "../../storage-blob/src/credentials/StorageSharedKeyCredential"; import { SasIPRange, ipRangeToString } from "./SasIPRange"; import { SASProtocol, SASQueryParameters } from "./SASQueryParameters"; import { SERVICE_VERSION } from "./utils/constants"; diff --git a/sdk/storage/storage-file-share/src/Clients.ts b/sdk/storage/storage-file-share/src/Clients.ts index 8ead863ba0f7..2be330ad50eb 100644 --- a/sdk/storage/storage-file-share/src/Clients.ts +++ b/sdk/storage/storage-file-share/src/Clients.ts @@ -1,7 +1,11 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { HttpRequestBody, HttpResponse, isNode, TransferProgressEvent } from "@azure/core-http"; +import { + RequestBodyType as HttpRequestBody, + TransferProgressEvent, +} from "@azure/core-rest-pipeline"; +import { isNode } from "@azure/core-util"; import { SpanStatusCode } from "@azure/core-tracing"; import { AbortSignalLike } from "@azure/abort-controller"; import { @@ -54,9 +58,15 @@ import { FileRenameResponse, DirectoryRenameResponse, FileLastWrittenMode, + ShareFileRangeList, } from "./generatedModels"; -import { Share, Directory, File } from "./generated/src/operations"; -import { newPipeline, StoragePipelineOptions, Pipeline } from "./Pipeline"; +import { Share, Directory, File } from "./generated/src/operationsInterfaces"; +import { + newPipeline, + StoragePipelineOptions, + Pipeline, + PipelineLike, +} from "../../storage-blob/src/Pipeline"; import { DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS, DEFAULT_HIGH_LEVEL_CONCURRENCY, @@ -77,11 +87,13 @@ import { setURLPath, setURLQueries, EscapePath, + WithResponse, + assertResponse, } from "./utils/utils.common"; -import { Credential } from "./credentials/Credential"; -import { StorageSharedKeyCredential } from "./credentials/StorageSharedKeyCredential"; -import { AnonymousCredential } from "./credentials/AnonymousCredential"; -import { convertTracingToRequestOptionsBase, createSpan } from "./utils/tracing"; +import { Credential } from "../../storage-blob/src/credentials/Credential"; +import { StorageSharedKeyCredential } from "../../storage-blob/src/credentials/StorageSharedKeyCredential"; +import { AnonymousCredential } from "../../storage-blob/src/credentials/AnonymousCredential"; +import { createSpan } from "./utils/tracing"; import { StorageClient, CommonOptions } from "./StorageClient"; import "@azure/core-paging"; import { PageSettings, PagedAsyncIterableIterator } from "@azure/core-paging"; @@ -114,9 +126,8 @@ import { readStreamToLocalFile, streamToBuffer, } from "./utils/utils.node"; -import { StorageClientContext } from "./generated/src/storageClientContext"; -import { SERVICE_VERSION } from "./utils/constants"; -import { generateUuid } from "@azure/core-http"; +import { StorageClient as StorageClientContext } from "./generated/src/"; +import { v4 as generateUuid } from "uuid"; import { generateFileSASQueryParameters } from "./FileSASSignatureValues"; import { ShareSASPermissions } from "./ShareSASPermissions"; import { SASProtocol } from "./SASQueryParameters"; @@ -347,27 +358,13 @@ export interface SignedIdentifier { }; } -export declare type ShareGetAccessPolicyResponse = { - signedIdentifiers: SignedIdentifier[]; -} & ShareGetAccessPolicyHeaders & { - /** - * The underlying HTTP response. - */ - _response: HttpResponse & { - /** - * The parsed HTTP response headers. - */ - parsedHeaders: ShareGetAccessPolicyHeaders; - /** - * The response body as text (string format) - */ - bodyAsText: string; - /** - * The response body as parsed JSON or XML - */ - parsedBody: SignedIdentifierModel[]; - }; - }; +export declare type ShareGetAccessPolicyResponse = WithResponse< + { + signedIdentifiers: SignedIdentifier[]; + } & ShareGetAccessPolicyHeaders, + ShareGetAccessPolicyHeaders, + SignedIdentifierModel[] +>; /** * Options to configure the {@link ShareClient.createSnapshot} operation. @@ -565,7 +562,11 @@ export class ShareClient extends StorageClient { */ // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ - constructor(url: string, credential?: Credential, options?: StoragePipelineOptions); + constructor( + url: string, + credential?: StorageSharedKeyCredential | AnonymousCredential, + options?: StoragePipelineOptions + ); /** * Creates an instance of ShareClient. * @@ -579,7 +580,11 @@ export class ShareClient extends StorageClient { constructor(url: string, pipeline: Pipeline); constructor( urlOrConnectionString: string, - credentialOrPipelineOrShareName?: Credential | Pipeline | string, + credentialOrPipelineOrShareName?: + | StorageSharedKeyCredential + | AnonymousCredential + | PipelineLike + | string, // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ options?: StoragePipelineOptions @@ -633,7 +638,7 @@ export class ShareClient extends StorageClient { } super(url, pipeline); this._name = getShareNameAndPathFromUrl(this.url).shareName; - this.context = new Share(this.storageClientContext); + this.context = this.storageClientContext.share; } /** @@ -666,9 +671,8 @@ export class ShareClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareClient-create", options); try { return await this.context.create({ - ...options, + ...updatedOptions, enabledProtocols: toShareProtocolsString(options.protocols), - ...convertTracingToRequestOptionsBase(updatedOptions), }); } catch (e: any) { span.setStatus({ @@ -935,8 +939,7 @@ export class ShareClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareClient-getProperties", options); try { const res = await this.context.getProperties({ - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), + ...updatedOptions, }); // parse protocols @@ -966,8 +969,7 @@ export class ShareClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareClient-delete", options); try { return await this.context.delete({ - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), + ...updatedOptions, }); } catch (e: any) { span.setStatus({ @@ -1037,9 +1039,8 @@ export class ShareClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareClient-setMetadata", options); try { return await this.context.setMetadata({ - ...options, + ...updatedOptions, metadata, - ...convertTracingToRequestOptionsBase(updatedOptions), }); } catch (e: any) { span.setStatus({ @@ -1069,10 +1070,15 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-getAccessPolicy", options); try { - const response = await this.context.getAccessPolicy({ - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + const response = assertResponse< + ShareGetAccessPolicyHeaders & SignedIdentifierModel[], + ShareGetAccessPolicyHeaders, + SignedIdentifierModel[] + >( + await this.context.getAccessPolicy({ + ...updatedOptions, + }) + ); const res: ShareGetAccessPolicyResponse = { _response: response._response, @@ -1158,9 +1164,8 @@ export class ShareClient extends StorageClient { } return await this.context.setAccessPolicy({ - ...options, + ...updatedOptions, shareAcl: acl, - ...convertTracingToRequestOptionsBase(updatedOptions), }); } catch (e: any) { span.setStatus({ @@ -1184,11 +1189,7 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-createSnapshot", options); try { - return await this.context.createSnapshot({ - abortSignal: options.abortSignal, - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.context.createSnapshot(updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -1216,9 +1217,8 @@ export class ShareClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareClient-setQuota", options); try { return await this.context.setProperties({ - ...options, + ...updatedOptions, quota: quotaInGB, - ...convertTracingToRequestOptionsBase(updatedOptions), }); } catch (e: any) { span.setStatus({ @@ -1269,10 +1269,7 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-getStatistics", options); try { - const response = await this.context.getStatistics({ - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + const response = await this.context.getStatistics(updatedOptions); const GBBytes = 1024 * 1024 * 1024; return { ...response, shareUsage: Math.ceil(response.shareUsageBytes / GBBytes) }; @@ -1305,10 +1302,7 @@ export class ShareClient extends StorageClient { { permission: filePermission, }, - { - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - } + updatedOptions ); } catch (e: any) { span.setStatus({ @@ -1335,10 +1329,7 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-getPermission", options); try { - return await this.context.getPermission(filePermissionKey, { - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.context.getPermission(filePermissionKey, updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -1612,18 +1603,10 @@ export interface DirectoryCloseHandlesHeaders { /** * Response type for {@link ShareDirectoryClient.forceCloseHandle}. */ -export type DirectoryForceCloseHandlesResponse = CloseHandlesInfo & - DirectoryCloseHandlesHeaders & { - /** - * The underlying HTTP response. - */ - _response: HttpResponse & { - /** - * The parsed HTTP response headers. - */ - parsedHeaders: DirectoryForceCloseHandlesHeaders; - }; - }; +export type DirectoryForceCloseHandlesResponse = WithResponse< + CloseHandlesInfo & DirectoryCloseHandlesHeaders, + DirectoryForceCloseHandlesHeaders +>; /** * Options to configure {@link ShareDirectoryClient.forceCloseHandle}. @@ -1707,7 +1690,11 @@ export class ShareDirectoryClient extends StorageClient { */ // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ - constructor(url: string, credential?: Credential, options?: StoragePipelineOptions); + constructor( + url: string, + credential?: AnonymousCredential | StorageSharedKeyCredential, + options?: StoragePipelineOptions + ); /** * Creates an instance of DirectoryClient. * @@ -1725,7 +1712,7 @@ export class ShareDirectoryClient extends StorageClient { constructor(url: string, pipeline: Pipeline); constructor( url: string, - credentialOrPipeline?: Credential | Pipeline, + credentialOrPipeline?: AnonymousCredential | StorageSharedKeyCredential | Pipeline, options: StoragePipelineOptions = {} ) { let pipeline: Pipeline; @@ -1744,7 +1731,7 @@ export class ShareDirectoryClient extends StorageClient { shareName: this._shareName, path: this._path, } = getShareNameAndPathFromUrl(this.url)); - this.context = new Directory(this.storageClientContext); + this.context = this.storageClientContext.directory; } /** @@ -1755,29 +1742,24 @@ export class ShareDirectoryClient extends StorageClient { * @returns Response data for the Directory operation. */ public async create(options: DirectoryCreateOptions = {}): Promise { + if (!options.fileAttributes) { + options = validateAndSetDefaultsForFileAndDirectoryCreateCommonOptions(options); + // By default set it as a directory. + const attributes: FileSystemAttributes = new FileSystemAttributes(); + attributes.directory = true; + options.fileAttributes = attributes; + } const { span, updatedOptions } = createSpan("ShareDirectoryClient-create", options); try { - if (!options.fileAttributes) { - options = validateAndSetDefaultsForFileAndDirectoryCreateCommonOptions(options); - // By default set it as a directory. - const attributes: FileSystemAttributes = new FileSystemAttributes(); - attributes.directory = true; - options.fileAttributes = attributes; - } - return await this.context.create( - options.fileAttributes - ? fileAttributesToString(options.fileAttributes!) + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) : FileAttributesNone, { - abortSignal: options.abortSignal, - metadata: options.metadata, - filePermission: options.filePermission, - filePermissionKey: options.filePermissionKey, - fileChangeOn: fileChangeTimeToString(options.changeTime), - fileCreatedOn: fileCreationTimeToString(options.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(options.lastWriteTime), - ...convertTracingToRequestOptionsBase(updatedOptions), + ...updatedOptions, + fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), } ); } catch (e: any) { @@ -1841,22 +1823,18 @@ export class ShareDirectoryClient extends StorageClient { public async setProperties( properties: DirectoryProperties = {} ): Promise { + properties = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(properties); const { span, updatedOptions } = createSpan("ShareDirectoryClient-setProperties", properties); try { - properties = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(properties); - return await this.context.setProperties( - properties.fileAttributes - ? fileAttributesToString(properties.fileAttributes!) + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) : FileAttributesPreserve, { - abortSignal: properties.abortSignal, - filePermission: properties.filePermission, - filePermissionKey: properties.filePermissionKey, + ...updatedOptions, fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), - fileCreatedOn: fileCreationTimeToString(properties.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(properties.lastWriteTime), - ...convertTracingToRequestOptionsBase(updatedOptions), + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), } ); } catch (e: any) { @@ -2061,13 +2039,7 @@ export class ShareDirectoryClient extends StorageClient { public async exists(options: DirectoryExistsOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareDirectoryClient-exists", options); try { - await this.getProperties({ - abortSignal: options.abortSignal, - tracingOptions: { - ...options.tracingOptions, - ...convertTracingToRequestOptionsBase(updatedOptions), - }, - }); + await this.getProperties(updatedOptions); return true; } catch (e: any) { if (e.statusCode === 404) { @@ -2101,10 +2073,7 @@ export class ShareDirectoryClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareDirectoryClient-getProperties", options); try { - return await this.context.getProperties({ - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.context.getProperties(updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -2127,10 +2096,7 @@ export class ShareDirectoryClient extends StorageClient { public async delete(options: DirectoryDeleteOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareDirectoryClient-delete", options); try { - return await this.context.delete({ - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.context.delete(updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -2199,9 +2165,8 @@ export class ShareDirectoryClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareDirectoryClient-setMetadata", options); try { return await this.context.setMetadata({ - abortSignal: options.abortSignal, + ...updatedOptions, metadata, - ...convertTracingToRequestOptionsBase(updatedOptions), }); } catch (e: any) { span.setStatus({ @@ -2439,9 +2404,8 @@ export class ShareDirectoryClient extends StorageClient { try { return await this.context.listFilesAndDirectoriesSegment({ + ...updatedOptions, marker, - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), }); } catch (e: any) { span.setStatus({ @@ -2621,9 +2585,8 @@ export class ShareDirectoryClient extends StorageClient { try { marker = marker === "" ? undefined : marker; const response = await this.context.listHandles({ + ...updatedOptions, marker, - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), }); // TODO: Protocol layer issue that when handle list is in returned XML @@ -2663,16 +2626,23 @@ export class ShareDirectoryClient extends StorageClient { options ); try { - marker = marker === "" ? undefined : marker; - const rawResponse = await this.context.forceCloseHandles("*", { - marker, - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); - const response = rawResponse as DirectoryForceCloseHandlesResponse; - response.closedHandlesCount = rawResponse.numberOfHandlesClosed || 0; - response.closeFailureCount = rawResponse.numberOfHandlesFailedToClose || 0; - return response; + if (marker === "") { + marker = undefined; + } + const rawResponse = assertResponse< + DirectoryForceCloseHandlesHeaders, + DirectoryForceCloseHandlesHeaders + >( + await this.context.forceCloseHandles("*", { + ...updatedOptions, + marker, + }) + ); + return { + ...rawResponse, + closedHandlesCount: rawResponse.numberOfHandlesClosed ?? 0, + closeFailureCount: rawResponse.numberOfHandlesFailedToClose ?? 0, + }; } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -2703,10 +2673,7 @@ export class ShareDirectoryClient extends StorageClient { let marker: string | undefined = ""; do { - const response: DirectoryForceCloseHandlesResponse = await this.forceCloseHandlesSegment( - marker, - updatedOptions - ); + const response = await this.forceCloseHandlesSegment(marker, updatedOptions); marker = response.marker; if (response.closedHandlesCount) { handlesClosed += response.closedHandlesCount; @@ -2750,10 +2717,7 @@ export class ShareDirectoryClient extends StorageClient { ); } - const rawResponse = await this.context.forceCloseHandles(handleId, { - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + const rawResponse = await this.context.forceCloseHandles(handleId, updatedOptions); const response = rawResponse as DirectoryForceCloseHandlesResponse; response.closedHandlesCount = rawResponse.numberOfHandlesClosed || 0; response.closeFailureCount = rawResponse.numberOfHandlesFailedToClose || 0; @@ -3091,30 +3055,16 @@ export interface FileGetPropertiesOptions extends CommonOptions { /** * Contains response data for the {@link ShareFileClient.getRangeList} operation. */ -export type FileGetRangeListResponse = FileGetRangeListHeaders & { - /** - * Range list for an Azure file. - */ - rangeList: RangeModel[]; - - /** - * The underlying HTTP response. - */ - _response: HttpResponse & { +export type FileGetRangeListResponse = WithResponse< + FileGetRangeListHeaders & { /** - * The parsed HTTP response headers. + * Range list for an Azure file. */ - parsedHeaders: FileGetRangeListHeaders; - /** - * The response body as text (string format) - */ - bodyAsText: string; - /** - * The response body as parsed JSON or XML - */ - parsedBody: RangeModel[]; - }; -}; + rangeList: RangeModel[]; + }, + FileGetRangeListHeaders, + RangeModel[] +>; /** * Options to configure the {@link ShareFileClient.startCopyFromURL} operation. @@ -3311,18 +3261,10 @@ export interface FileCloseHandlesHeaders { /** * Response type for {@link ShareFileClient.forceCloseHandle}. */ -export type FileForceCloseHandlesResponse = CloseHandlesInfo & - FileCloseHandlesHeaders & { - /** - * The underlying HTTP response. - */ - _response: HttpResponse & { - /** - * The parsed HTTP response headers. - */ - parsedHeaders: FileForceCloseHandlesHeaders; - }; - }; +export type FileForceCloseHandlesResponse = WithResponse< + CloseHandlesInfo & FileCloseHandlesHeaders, + FileForceCloseHandlesHeaders +>; /** * Option interface for ShareFileClient.uploadStream(). @@ -3647,7 +3589,11 @@ export class ShareFileClient extends StorageClient { */ // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ - constructor(url: string, credential?: Credential, options?: StoragePipelineOptions); + constructor( + url: string, + credential?: AnonymousCredential | StorageSharedKeyCredential, + options?: StoragePipelineOptions + ); /** * Creates an instance of ShareFileClient. * @@ -3665,7 +3611,7 @@ export class ShareFileClient extends StorageClient { constructor(url: string, pipeline: Pipeline); constructor( url: string, - credentialOrPipeline?: Credential | Pipeline, + credentialOrPipeline?: AnonymousCredential | StorageSharedKeyCredential | Pipeline, // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ options?: StoragePipelineOptions @@ -3686,7 +3632,7 @@ export class ShareFileClient extends StorageClient { shareName: this._shareName, path: this._path, } = getShareNameAndPathFromUrl(this.url)); - this.context = new File(this.storageClientContext); + this.context = this.storageClientContext.file; } /** @@ -3730,31 +3676,24 @@ export class ShareFileClient extends StorageClient { * ``` */ public async create(size: number, options: FileCreateOptions = {}): Promise { + if (size < 0 || size > FILE_MAX_SIZE_BYTES) { + throw new RangeError(`File size must >= 0 and < ${FILE_MAX_SIZE_BYTES}.`); + } + options = validateAndSetDefaultsForFileAndDirectoryCreateCommonOptions(options); + + options.fileHttpHeaders = options.fileHttpHeaders || {}; const { span, updatedOptions } = createSpan("ShareFileClient-create", options); try { - if (size < 0 || size > FILE_MAX_SIZE_BYTES) { - throw new RangeError(`File size must >= 0 and < ${FILE_MAX_SIZE_BYTES}.`); - } - options = validateAndSetDefaultsForFileAndDirectoryCreateCommonOptions(options); - - options.fileHttpHeaders = options.fileHttpHeaders || {}; - return await this.context.create( size, - options.fileAttributes - ? fileAttributesToString(options.fileAttributes!) + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) : FileAttributesNone, { - abortSignal: options.abortSignal, - fileHttpHeaders: options.fileHttpHeaders, - metadata: options.metadata, - filePermission: options.filePermission, - filePermissionKey: options.filePermissionKey, - fileChangeOn: fileChangeTimeToString(options.changeTime), - fileCreatedOn: fileCreationTimeToString(options.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(options.lastWriteTime), - leaseAccessConditions: options.leaseAccessConditions, - ...convertTracingToRequestOptionsBase(updatedOptions), + ...updatedOptions, + fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), } ); } catch (e: any) { @@ -3836,20 +3775,17 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-download", options); try { - if (options.rangeGetContentMD5 && offset === 0 && count === undefined) { + if (updatedOptions.rangeGetContentMD5 && offset === 0 && count === undefined) { throw new RangeError(`rangeGetContentMD5 only works with partial data downloading`); } const downloadFullFile = offset === 0 && !count; const res = await this.context.download({ - abortSignal: options.abortSignal, + ...updatedOptions, requestOptions: { - onDownloadProgress: isNode ? undefined : options.onProgress, // for Node.js, progress is reported by RetriableReadableStream + onDownloadProgress: isNode ? undefined : updatedOptions.onProgress, // for Node.js, progress is reported by RetriableReadableStream }, range: downloadFullFile ? undefined : rangeToString({ offset, count }), - rangeGetContentMD5: options.rangeGetContentMD5, - leaseAccessConditions: options.leaseAccessConditions, - ...convertTracingToRequestOptionsBase(updatedOptions), }); // Return browser response immediately @@ -3862,9 +3798,9 @@ export class ShareFileClient extends StorageClient { // bundlers may try to bundle following code and "FileReadResponse.ts". // In this case, "FileDownloadResponse.browser.ts" will be used as a shim of "FileDownloadResponse.ts" // The config is in package.json "browser" field - if (options.maxRetryRequests === undefined || options.maxRetryRequests < 0) { + if (updatedOptions.maxRetryRequests === undefined || updatedOptions.maxRetryRequests < 0) { // TODO: Default value or make it a required parameter? - options.maxRetryRequests = DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS; + updatedOptions.maxRetryRequests = DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS; } if (res.contentLength === undefined) { @@ -3889,10 +3825,8 @@ export class ShareFileClient extends StorageClient { // ); const downloadRes = await this.context.download({ - abortSignal: options.abortSignal, - leaseAccessConditions: options.leaseAccessConditions, + ...updatedOptions, ...updatedDownloadOptions, - ...convertTracingToRequestOptionsBase(updatedDownloadOptions), }); if (!(downloadRes.etag === res.etag)) { @@ -3903,9 +3837,9 @@ export class ShareFileClient extends StorageClient { offset, res.contentLength!, { - abortSignal: options.abortSignal, - maxRetryRequests: options.maxRetryRequests, - onProgress: options.onProgress, + abortSignal: updatedOptions.abortSignal, + maxRetryRequests: updatedOptions.maxRetryRequests, + onProgress: updatedOptions.onProgress, } ); } catch (e: any) { @@ -3931,13 +3865,7 @@ export class ShareFileClient extends StorageClient { public async exists(options: FileExistsOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-exists", options); try { - await this.getProperties({ - abortSignal: options.abortSignal, - tracingOptions: { - ...options.tracingOptions, - ...convertTracingToRequestOptionsBase(updatedOptions), - }, - }); + await this.getProperties(updatedOptions); return true; } catch (e: any) { if (e.statusCode === 404) { @@ -3970,11 +3898,7 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-getProperties", options); try { - return this.context.getProperties({ - abortSignal: options.abortSignal, - leaseAccessConditions: options.leaseAccessConditions, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return this.context.getProperties(updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -3996,26 +3920,19 @@ export class ShareFileClient extends StorageClient { * existing values will be preserved. */ public async setProperties(properties: FileProperties = {}): Promise { + properties = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(properties); + properties.fileHttpHeaders = properties.fileHttpHeaders || {}; const { span, updatedOptions } = createSpan("ShareFileClient-setProperties", properties); try { - properties = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(properties); - - properties.fileHttpHeaders = properties.fileHttpHeaders || {}; - return await this.context.setHttpHeaders( - properties.fileAttributes - ? fileAttributesToString(properties.fileAttributes!) + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) : FileAttributesPreserve, { - abortSignal: properties.abortSignal, - fileHttpHeaders: properties.fileHttpHeaders, - filePermission: properties.filePermission, - filePermissionKey: properties.filePermissionKey, - leaseAccessConditions: properties.leaseAccessConditions, - fileChangeOn: fileChangeTimeToString(properties.changeTime), - fileCreatedOn: fileCreationTimeToString(properties.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(properties.lastWriteTime), - ...convertTracingToRequestOptionsBase(updatedOptions), + ...updatedOptions, + fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), } ); } catch (e: any) { @@ -4049,11 +3966,7 @@ export class ShareFileClient extends StorageClient { public async delete(options: FileDeleteOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-delete", options); try { - return await this.context.delete({ - abortSignal: options.abortSignal, - leaseAccessConditions: options.leaseAccessConditions, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.context.delete(updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -4132,24 +4045,20 @@ export class ShareFileClient extends StorageClient { fileHttpHeaders: FileHttpHeaders = {}, options: FileSetHttpHeadersOptions = {} ): Promise { + // FileAttributes, filePermission, createTime, lastWriteTime will all be preserved + options = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(options); const { span, updatedOptions } = createSpan("ShareFileClient-setHTTPHeaders", options); try { - // FileAttributes, filePermission, createTime, lastWriteTime will all be preserved - options = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(options); return await this.context.setHttpHeaders( - options.fileAttributes - ? fileAttributesToString(options.fileAttributes!) + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) : FileAttributesPreserve, { - abortSignal: options.abortSignal, + ...updatedOptions, fileHttpHeaders, - filePermission: options.filePermission, - filePermissionKey: options.filePermissionKey, - leaseAccessConditions: options.leaseAccessConditions, - fileCreatedOn: fileCreationTimeToString(options.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(options.lastWriteTime), - fileChangeOn: fileChangeTimeToString(options.changeTime), - ...convertTracingToRequestOptionsBase(updatedOptions), + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), + fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), } ); } catch (e: any) { @@ -4178,25 +4087,23 @@ export class ShareFileClient extends StorageClient { length: number, options: FileResizeOptions = {} ): Promise { + if (length < 0) { + throw new RangeError(`Size cannot less than 0 when resizing file.`); + } + // FileAttributes, filePermission, createTime, lastWriteTime will all be preserved. + options = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(options); const { span, updatedOptions } = createSpan("ShareFileClient-resize", options); try { - if (length < 0) { - throw new RangeError(`Size cannot less than 0 when resizing file.`); - } - // FileAttributes, filePermission, createTime, lastWriteTime will all be preserved. - options = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(options); - - return await this.context.setHttpHeaders(fileAttributesToString(options.fileAttributes!), { - abortSignal: options.abortSignal, - fileContentLength: length, - filePermission: options.filePermission, - filePermissionKey: options.filePermissionKey, - leaseAccessConditions: options.leaseAccessConditions, - fileChangeOn: fileChangeTimeToString(options.changeTime), - fileCreatedOn: fileCreationTimeToString(options.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(options.lastWriteTime), - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.context.setHttpHeaders( + fileAttributesToString(updatedOptions.fileAttributes!), + { + ...updatedOptions, + fileContentLength: length, + fileChangeOn: fileChangeTimeToString(options.changeTime), + fileCreatedOn: fileCreationTimeToString(options.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(options.lastWriteTime), + } + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -4226,10 +4133,8 @@ export class ShareFileClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareFileClient-setMetadata", options); try { return await this.context.setMetadata({ - abortSignal: options.abortSignal, + ...updatedOptions, metadata, - leaseAccessConditions: options.leaseAccessConditions, - ...convertTracingToRequestOptionsBase(updatedOptions), }); } catch (e: any) { span.setStatus({ @@ -4294,15 +4199,11 @@ export class ShareFileClient extends StorageClient { "update", contentLength, { - abortSignal: options.abortSignal, - contentMD5: options.contentMD5, + ...updatedOptions, requestOptions: { - onUploadProgress: options.onProgress, + onUploadProgress: updatedOptions.onProgress, }, - body: body, - ...convertTracingToRequestOptionsBase(updatedOptions), - leaseAccessConditions: options.leaseAccessConditions, - fileLastWrittenMode: options.fileLastWrittenMode, + body, } ); } catch (e: any) { @@ -4348,13 +4249,10 @@ export class ShareFileClient extends StorageClient { sourceURL, 0, { - abortSignal: options.abortSignal, + ...updatedOptions, sourceRange: rangeToString({ offset: sourceOffset, count }), - sourceModifiedAccessConditions: options.sourceConditions, - copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), - fileLastWrittenMode: options.fileLastWrittenMode, - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), + sourceModifiedAccessConditions: updatedOptions.sourceConditions, + copySourceAuthorization: httpAuthorizationToString(updatedOptions.sourceAuthorization), } ); } catch (e: any) { @@ -4390,12 +4288,7 @@ export class ShareFileClient extends StorageClient { rangeToString({ count: contentLength, offset }), "clear", 0, - { - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - leaseAccessConditions: options.leaseAccessConditions, - fileLastWrittenMode: options.fileLastWrittenMode, - } + updatedOptions ); } catch (e: any) { span.setStatus({ @@ -4418,12 +4311,16 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-getRangeList", options); try { - const originalResponse = await this.context.getRangeList({ - abortSignal: options.abortSignal, - range: options.range ? rangeToString(options.range) : undefined, - leaseAccessConditions: options.leaseAccessConditions, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + const originalResponse = assertResponse< + FileGetRangeListDiffResponse, + FileGetRangeListHeaders, + ShareFileRangeList + >( + await this.context.getRangeList({ + ...updatedOptions, + range: updatedOptions.range ? rangeToString(updatedOptions.range) : undefined, + }) + ); // Only returns ranges, ignoring clearRanges. const parsedBody = originalResponse._response.parsedBody.ranges @@ -4458,10 +4355,9 @@ export class ShareFileClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareFileClient-getRangeListDiff", options); try { return await this.context.getRangeList({ + ...updatedOptions, prevsharesnapshot: prevShareSnapshot, - ...options, - range: options.range ? rangeToString(options.range) : undefined, - ...convertTracingToRequestOptionsBase(updatedOptions), + range: updatedOptions.range ? rangeToString(updatedOptions.range) : undefined, }); } catch (e: any) { span.setStatus({ @@ -4492,15 +4388,7 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-startCopyFromURL", options); try { - return await this.context.startCopy(copySource, { - abortSignal: options.abortSignal, - metadata: options.metadata, - leaseAccessConditions: options.leaseAccessConditions, - filePermission: options.filePermission, - filePermissionKey: options.filePermissionKey, - copyFileSmbInfo: options.copyFileSmbInfo, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.context.startCopy(copySource, updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -4526,11 +4414,7 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-abortCopyFromURL", options); try { - return await this.context.abortCopy(copyId, { - abortSignal: options.abortSignal, - leaseAccessConditions: options.leaseAccessConditions, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.context.abortCopy(copyId, updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -5087,10 +4971,8 @@ export class ShareFileClient extends StorageClient { try { marker = marker === "" ? undefined : marker; const response = await this.context.listHandles({ - abortSignal: options.abortSignal, + ...updatedOptions, marker, - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), }); // TODO: Protocol layer issue that when handle list is in returned XML @@ -5214,9 +5096,8 @@ export class ShareFileClient extends StorageClient { try { marker = marker === "" ? undefined : marker; const rawResponse = await this.context.forceCloseHandles("*", { - abortSignal: options.abortSignal, + ...updatedOptions, marker, - ...convertTracingToRequestOptionsBase(updatedOptions), }); const response = rawResponse as FileForceCloseHandlesResponse; response.closedHandlesCount = rawResponse.numberOfHandlesClosed || 0; @@ -5297,10 +5178,7 @@ export class ShareFileClient extends StorageClient { ); } - const rawResponse = await this.context.forceCloseHandles(handleId, { - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + const rawResponse = await this.context.forceCloseHandles(handleId, updatedOptions); const response = rawResponse as FileForceCloseHandlesResponse; response.closedHandlesCount = rawResponse.numberOfHandlesClosed || 0; response.closeFailureCount = rawResponse.numberOfHandlesFailedToClose || 0; @@ -5480,17 +5358,10 @@ export interface LeaseOperationResponseHeaders { * * See {@link ShareLeaseClient}. */ -export type LeaseOperationResponse = LeaseOperationResponseHeaders & { - /** - * The underlying HTTP response. - */ - _response: HttpResponse & { - /** - * The parsed HTTP response headers. - */ - parsedHeaders: LeaseOperationResponseHeaders; - }; -}; +export type LeaseOperationResponse = WithResponse< + LeaseOperationResponseHeaders, + LeaseOperationResponseHeaders +>; /** * lease operations options. @@ -5513,7 +5384,6 @@ export class ShareLeaseClient { private _leaseId: string; private _url: string; private fileOrShare: File | Share; - private isShare: boolean; /** * Gets the lease Id. * @@ -5538,17 +5408,12 @@ export class ShareLeaseClient { * @param leaseId - Initial proposed lease id. */ constructor(client: ShareFileClient, leaseId?: string) { - const clientContext = new StorageClientContext(client.url, { - version: SERVICE_VERSION, - ...(client as any).pipeline.toServiceClientOptions(), - }); + const clientContext: StorageClientContext = client["storageClientContext"]; if (client instanceof ShareClient) { - this.isShare = true; - this.fileOrShare = new Share(clientContext); + this.fileOrShare = clientContext.share; } else { - this.isShare = false; - this.fileOrShare = new File(clientContext); + this.fileOrShare = clientContext.file; } this._url = client.url; @@ -5571,12 +5436,13 @@ export class ShareLeaseClient { ): Promise { const { span, updatedOptions } = createSpan("ShareLeaseClient-acquireLease", options); try { - return await this.fileOrShare.acquireLease({ - abortSignal: options.abortSignal, - duration, - proposedLeaseId: this._leaseId, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return assertResponse( + await this.fileOrShare.acquireLease({ + ...updatedOptions, + duration, + proposedLeaseId: this._leaseId, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -5601,11 +5467,12 @@ export class ShareLeaseClient { ): Promise { const { span, updatedOptions } = createSpan("ShareLeaseClient-changeLease", options); try { - const response = await this.fileOrShare.changeLease(this._leaseId, { - proposedLeaseId, - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + const response = assertResponse( + await this.fileOrShare.changeLease(this._leaseId, { + ...updatedOptions, + proposedLeaseId, + }) + ); this._leaseId = proposedLeaseId; return response; } catch (e: any) { @@ -5629,10 +5496,9 @@ export class ShareLeaseClient { public async releaseLease(options: LeaseOperationOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareLeaseClient-releaseLease", options); try { - return await this.fileOrShare.releaseLease(this._leaseId, { - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return assertResponse( + await this.fileOrShare.releaseLease(this._leaseId, updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -5653,10 +5519,9 @@ export class ShareLeaseClient { public async breakLease(options: LeaseOperationOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareLeaseClient-breakLease", options); try { - return await this.fileOrShare.breakLease({ - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return assertResponse( + await this.fileOrShare.breakLease(updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -5679,15 +5544,14 @@ export class ShareLeaseClient { public async renewLease(options: LeaseOperationOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareLeaseClient-renewLease", options); - if (!this.isShare) { + if (isFile(this.fileOrShare)) { throw new RangeError("The renewLease operation is not available for lease on file."); } try { - return await (this.fileOrShare as Share).renewLease(this._leaseId, { - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return assertResponse( + await this.fileOrShare.renewLease(this._leaseId, updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -5699,3 +5563,10 @@ export class ShareLeaseClient { } } } + +/** + * @internal + */ +function isFile(fileOrShare: File | Share): fileOrShare is File { + return "renewLease" in fileOrShare; +} diff --git a/sdk/storage/storage-file-share/src/FileDownloadResponse.ts b/sdk/storage/storage-file-share/src/FileDownloadResponse.ts index fed48020346b..d392c31ad352 100644 --- a/sdk/storage/storage-file-share/src/FileDownloadResponse.ts +++ b/sdk/storage/storage-file-share/src/FileDownloadResponse.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { HttpResponse, isNode } from "@azure/core-http"; +import { isNode } from "@azure/core-util"; import { CopyStatusType, FileDownloadHeaders, @@ -16,6 +16,7 @@ import { RetriableReadableStream, RetriableReadableStreamOptions, } from "./utils/RetriableReadableStream"; +import { HttpResponse, WithResponse, assertResponse } from "./utils/utils.common"; /** * ONLY AVAILABLE IN NODE.JS RUNTIME. @@ -397,7 +398,7 @@ export class FileDownloadResponse implements FileDownloadResponseModel { return this.originalResponse._response; } - private originalResponse: FileDownloadResponseModel; + private originalResponse: WithResponse; private fileDownloadStream?: RetriableReadableStream; /** @@ -416,7 +417,9 @@ export class FileDownloadResponse implements FileDownloadResponseModel { count: number, options: RetriableReadableStreamOptions = {} ) { - this.originalResponse = originalResponse; + this.originalResponse = assertResponse( + originalResponse + ); this.fileDownloadStream = new RetriableReadableStream( this.originalResponse.readableStreamBody!, getter, diff --git a/sdk/storage/storage-file-share/src/FileSASSignatureValues.ts b/sdk/storage/storage-file-share/src/FileSASSignatureValues.ts index 1ad249033f60..429acdfab6c0 100644 --- a/sdk/storage/storage-file-share/src/FileSASSignatureValues.ts +++ b/sdk/storage/storage-file-share/src/FileSASSignatureValues.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { StorageSharedKeyCredential } from "./credentials/StorageSharedKeyCredential"; +import { StorageSharedKeyCredential } from "../../storage-blob/src/credentials/StorageSharedKeyCredential"; import { FileSASPermissions } from "./FileSASPermissions"; import { SasIPRange, ipRangeToString } from "./SasIPRange"; import { SASProtocol, SASQueryParameters } from "./SASQueryParameters"; diff --git a/sdk/storage/storage-file-share/src/Pipeline.ts b/sdk/storage/storage-file-share/src/Pipeline.ts deleted file mode 100644 index 12536db5c74b..000000000000 --- a/sdk/storage/storage-file-share/src/Pipeline.ts +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { - BaseRequestPolicy, - deserializationPolicy, - disableResponseDecompressionPolicy, - HttpClient as IHttpClient, - HttpHeaders, - HttpOperationResponse, - HttpRequestBody, - RequestPolicy, - RequestPolicyFactory, - RequestPolicyOptions, - ServiceClientOptions, - WebResource, - proxyPolicy, - isNode, - tracingPolicy, - logPolicy, - ProxyOptions, - UserAgentOptions, - KeepAliveOptions, - keepAlivePolicy, - generateClientRequestIdPolicy, -} from "@azure/core-http"; - -import { logger } from "./log"; -import { StorageBrowserPolicyFactory } from "./StorageBrowserPolicyFactory"; -import { Credential } from "./credentials/Credential"; -import { StorageRetryOptions, StorageRetryPolicyFactory } from "./StorageRetryPolicyFactory"; -import { TelemetryPolicyFactory } from "./TelemetryPolicyFactory"; -import { - StorageFileLoggingAllowedHeaderNames, - StorageFileLoggingAllowedQueryParameters, -} from "./utils/constants"; -import { getCachedDefaultHttpClient } from "./utils/cache"; -import { AnonymousCredential } from "./credentials/AnonymousCredential"; - -// Export following interfaces and types for customers who want to implement their -// own RequestPolicy or HTTPClient -export { - deserializationPolicy, - IHttpClient, - HttpHeaders, - HttpOperationResponse, - HttpRequestBody, - WebResource, - BaseRequestPolicy, - RequestPolicyFactory, - RequestPolicy, - RequestPolicyOptions, -}; - -/** - * Option interface for Pipeline constructor. - */ -export interface PipelineOptions { - /** - * Optional. Configures the HTTP client to send requests and receive responses. - */ - httpClient?: IHttpClient; -} - -/** - * 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 as reference before - * implementing your customized Pipeline. - */ -export class Pipeline { - /** - * A list of chained request policy factories. - */ - public readonly factories: RequestPolicyFactory[]; - /** - * Configures pipeline logger and HTTP client. - */ - public readonly options: PipelineOptions; - - /** - * Creates an instance of Pipeline. Customize HTTPClient by implementing IHttpClient interface. - * - * @param factories - - * @param options - - */ - constructor(factories: RequestPolicyFactory[], options: PipelineOptions = {}) { - 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 = { - ...options, - httpClient: options.httpClient || getCachedDefaultHttpClient(), - }; - } - - /** - * Transfer Pipeline object to ServiceClientOptions object which required by - * ServiceClient constructor. - * - * @returns The ServiceClientOptions object from this Pipeline. - */ - public toServiceClientOptions(): ServiceClientOptions { - return { - httpClient: this.options.httpClient, - requestPolicyFactories: this.factories, - }; - } -} - -/** - * Option interface for {@link newPipeline} function. - */ -export interface StoragePipelineOptions { - /** - * Options to configure a proxy for outgoing requests. - */ - proxyOptions?: ProxyOptions; - /** - * Options for adding user agent details to outgoing requests. - */ - userAgentOptions?: UserAgentOptions; - /** - * Configures the built-in retry policy behavior. - */ - retryOptions?: StorageRetryOptions; - /** - * Keep alive configurations. Default keep-alive is enabled. - */ - keepAliveOptions?: KeepAliveOptions; - /** - * Configures the HTTP client to send requests and receive responses. - */ - httpClient?: IHttpClient; -} - -/** - * Creates a new {@link Pipeline} object with {@link Credential} provided. - * - * @param credential - Such as AnonymousCredential, StorageSharedKeyCredential. - * @param pipelineOptions - Optional. Options. - * @returns A new Pipeline object. - */ -export function newPipeline( - credential?: Credential, - pipelineOptions: StoragePipelineOptions = {} -): Pipeline { - 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: RequestPolicyFactory[] = [ - tracingPolicy({ userAgent: telemetryPolicy.telemetryString }), - keepAlivePolicy(pipelineOptions.keepAliveOptions), - telemetryPolicy, - generateClientRequestIdPolicy(), - new StorageBrowserPolicyFactory(), - new StorageRetryPolicyFactory(pipelineOptions.retryOptions), // Retry policy should be above any policy that throws retryable errors - deserializationPolicy(), // Default deserializationPolicy is provided by protocol layer - logPolicy({ - logger: logger.info, - allowedHeaderNames: StorageFileLoggingAllowedHeaderNames, - allowedQueryParameters: StorageFileLoggingAllowedQueryParameters, - }), - ]; - - if (isNode) { - // policies only available in Node.js runtime, not in browsers - factories.push(proxyPolicy(pipelineOptions.proxyOptions)); - factories.push(disableResponseDecompressionPolicy()); - } - factories.push(credential); - - return new Pipeline(factories, pipelineOptions); -} diff --git a/sdk/storage/storage-file-share/src/ShareClientInternal.ts b/sdk/storage/storage-file-share/src/ShareClientInternal.ts index 7287417a41a5..7eae9661df0f 100644 --- a/sdk/storage/storage-file-share/src/ShareClientInternal.ts +++ b/sdk/storage/storage-file-share/src/ShareClientInternal.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { Pipeline } from "./Pipeline"; +import { Pipeline } from "../../storage-blob/src/Pipeline"; import { StorageClient } from "./StorageClient"; import { ShareRestoreOptionalParams, ShareRestoreResponse } from "./generated/src/models"; -import { Share } from "./generated/src/operations"; +import { Share } from "./generated/src/operationsInterfaces"; /** * ShareClientInternal is the thin wrapper for Share which contains internal helper methods. @@ -14,7 +14,7 @@ export class ShareClientInternal extends StorageClient { constructor(url: string, pipeline: Pipeline) { super(url, pipeline); - this.context = new Share(this.storageClientContext); + this.context = this.storageClientContext.share; } public async restore(options: ShareRestoreOptionalParams = {}): Promise { diff --git a/sdk/storage/storage-file-share/src/ShareServiceClient.ts b/sdk/storage/storage-file-share/src/ShareServiceClient.ts index 9a4b1ab29b9a..bd94bc8c7d6c 100644 --- a/sdk/storage/storage-file-share/src/ShareServiceClient.ts +++ b/sdk/storage/storage-file-share/src/ShareServiceClient.ts @@ -13,20 +13,25 @@ import { ListSharesResponseModel, SharePropertiesInternal, } from "./generatedModels"; -import { Service } from "./generated/src/operations"; -import { newPipeline, StoragePipelineOptions, Pipeline } from "./Pipeline"; +import { Service } from "./generated/src/operationsInterfaces"; +import { newPipeline, StoragePipelineOptions, Pipeline } from "../../storage-blob/src/Pipeline"; import { StorageClient, CommonOptions } from "./StorageClient"; import { ShareClientInternal } from "./ShareClientInternal"; import { ShareClient, ShareCreateOptions, ShareDeleteMethodOptions } from "./Clients"; -import { appendToURLPath, extractConnectionStringParts } from "./utils/utils.common"; -import { Credential } from "./credentials/Credential"; -import { StorageSharedKeyCredential } from "./credentials/StorageSharedKeyCredential"; -import { AnonymousCredential } from "./credentials/AnonymousCredential"; +import { + WithResponse, + appendToURLPath, + extractConnectionStringParts, + assertResponse, +} from "./utils/utils.common"; +import { Credential } from "../../storage-blob/src/credentials/Credential"; +import { StorageSharedKeyCredential } from "../../storage-blob/src/credentials/StorageSharedKeyCredential"; +import { AnonymousCredential } from "../../storage-blob/src/credentials/AnonymousCredential"; import "@azure/core-paging"; import { PagedAsyncIterableIterator, PageSettings } from "@azure/core-paging"; -import { isNode, HttpResponse } from "@azure/core-http"; +import { isNode } from "@azure/core-util"; import { SpanStatusCode } from "@azure/core-tracing"; -import { convertTracingToRequestOptionsBase, createSpan } from "./utils/tracing"; +import { createSpan } from "./utils/tracing"; import { ShareProtocols, toShareProtocols } from "./models"; import { AccountSASPermissions } from "./AccountSASPermissions"; import { generateAccountSASQueryParameters } from "./AccountSASSignatureValues"; @@ -169,28 +174,11 @@ export interface ListSharesResponse { /** * Contains response data for the {@link ShareServiceClient.listShares} operation. */ -export type ServiceListSharesSegmentResponse = ListSharesResponse & - ServiceListSharesSegmentHeaders & { - /** - * The underlying HTTP response. - */ - _response: HttpResponse & { - /** - * The parsed HTTP response headers. - */ - parsedHeaders: ServiceListSharesSegmentHeaders; - - /** - * The response body as text (string format) - */ - bodyAsText: string; - - /** - * The response body as parsed JSON or XML - */ - parsedBody: ListSharesResponseModel; - }; - }; +export type ServiceListSharesSegmentResponse = WithResponse< + ListSharesResponse & ServiceListSharesSegmentHeaders, + ServiceListSharesSegmentHeaders, + ListSharesResponseModel +>; /** * Options to configure {@link ShareServiceClient.generateAccountSasUrl} operation. @@ -280,7 +268,11 @@ export class ShareServiceClient extends StorageClient { */ // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ - constructor(url: string, credential?: Credential, options?: StoragePipelineOptions); + constructor( + url: string, + credential?: AnonymousCredential | StorageSharedKeyCredential, + options?: StoragePipelineOptions + ); /** * Creates an instance of ShareServiceClient. * @@ -293,7 +285,7 @@ export class ShareServiceClient extends StorageClient { constructor(url: string, pipeline: Pipeline); constructor( url: string, - credentialOrPipeline?: Credential | Pipeline, + credentialOrPipeline?: AnonymousCredential | StorageSharedKeyCredential | Pipeline, // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ options?: StoragePipelineOptions @@ -309,7 +301,7 @@ export class ShareServiceClient extends StorageClient { } super(url, pipeline); - this.serviceContext = new Service(this.storageClientContext); + this.serviceContext = this.storageClientContext.service; } /** @@ -399,10 +391,7 @@ export class ShareServiceClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareServiceClient-getProperties", options); try { - return await this.serviceContext.getProperties({ - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.serviceContext.getProperties(updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -429,10 +418,7 @@ export class ShareServiceClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareServiceClient-setProperties", options); try { - return await this.serviceContext.setProperties(properties, { - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + return await this.serviceContext.setProperties(properties, updatedOptions); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -633,18 +619,22 @@ export class ShareServiceClient extends StorageClient { marker?: string, options: ServiceListSharesSegmentOptions = {} ): Promise { - const { span, updatedOptions } = createSpan("ShareServiceClient-listSharesSegment", options); - if (options.prefix === "") { options.prefix = undefined; } + const { span, updatedOptions } = createSpan("ShareServiceClient-listSharesSegment", options); try { - const res = await this.serviceContext.listSharesSegment({ - marker, - ...options, - ...convertTracingToRequestOptionsBase(updatedOptions), - }); + const res = assertResponse< + ServiceListSharesSegmentHeaders & ListSharesResponseModel, + ServiceListSharesSegmentHeaders, + ListSharesResponseModel + >( + await this.serviceContext.listSharesSegment({ + ...updatedOptions, + marker, + }) + ); // parse protocols if (res.shareItems) { @@ -685,10 +675,9 @@ export class ShareServiceClient extends StorageClient { try { const shareClient = this.getShareClient(deletedShareName); await new ShareClientInternal(shareClient.url, this.pipeline).restore({ + ...updatedOptions, deletedShareName: deletedShareName, deletedShareVersion: deletedShareVersion, - abortSignal: options.abortSignal, - ...convertTracingToRequestOptionsBase(updatedOptions), }); return shareClient; } catch (e: any) { diff --git a/sdk/storage/storage-file-share/src/StorageBrowserPolicyFactory.ts b/sdk/storage/storage-file-share/src/StorageBrowserPolicyFactory.ts deleted file mode 100644 index c61e4479b0fb..000000000000 --- a/sdk/storage/storage-file-share/src/StorageBrowserPolicyFactory.ts +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from "@azure/core-http"; -import { StorageBrowserPolicy } from "./policies/StorageBrowserPolicy"; -export { StorageBrowserPolicy }; - -/** - * StorageBrowserPolicyFactory is a factory class helping generating BrowserPolicy objects. - */ -export class StorageBrowserPolicyFactory implements RequestPolicyFactory { - /** - * Creates a StorageBrowserPolicyFactory object. - * - * @param nextPolicy - - * @param options - - */ - public create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): StorageBrowserPolicy { - return new StorageBrowserPolicy(nextPolicy, options); - } -} diff --git a/sdk/storage/storage-file-share/src/StorageClient.ts b/sdk/storage/storage-file-share/src/StorageClient.ts index cf2ce873d5cd..d65c559b0713 100644 --- a/sdk/storage/storage-file-share/src/StorageClient.ts +++ b/sdk/storage/storage-file-share/src/StorageClient.ts @@ -1,15 +1,18 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { StorageClientContext } from "./generated/src/storageClientContext"; -import { Pipeline } from "./Pipeline"; +import { StorageClient as StorageClientContext } from "./generated/src/"; +import { StorageContextClient } from "./StorageContextClient"; +import { + Pipeline, + getCoreClientOptions, + getCredentialFromPipeline, +} from "../../storage-blob/src/Pipeline"; import { escapeURLPath, getAccountNameFromUrl } from "./utils/utils.common"; -import { SERVICE_VERSION } from "./utils/constants"; +import { isTokenCredential } from "@azure/core-auth"; import { OperationTracingOptions } from "@azure/core-tracing"; -import { AnonymousCredential } from "./credentials/AnonymousCredential"; -import { Credential } from "./credentials/Credential"; -import { isNode } from "@azure/core-http"; -import { StorageSharedKeyCredential } from "./credentials/StorageSharedKeyCredential"; +import { AnonymousCredential } from "../../storage-blob/src/credentials/AnonymousCredential"; +import { StorageSharedKeyCredential } from "../../storage-blob/src/credentials/StorageSharedKeyCredential"; /** * An interface for options common to every remote operation. @@ -36,12 +39,12 @@ export abstract class StorageClient { protected readonly pipeline: Pipeline; /** - * Credential in the pipleline to authenticate requests to the service, such as AnonymousCredential, StorageSharedKeyCredential. + * Credential in the pipeline to authenticate requests to the service, such as AnonymousCredential, StorageSharedKeyCredential. * Initialized to an AnonymousCredential if not able to retrieve it from the pipeline. * * @internal */ - protected readonly credential: Credential; + protected readonly credential: StorageSharedKeyCredential | AnonymousCredential; /** * StorageClient is a reference to protocol layer operations entry, which is @@ -60,27 +63,17 @@ export abstract class StorageClient { this.accountName = getAccountNameFromUrl(url); this.pipeline = pipeline; - this.storageClientContext = new StorageClientContext(this.url, { - version: SERVICE_VERSION, - ...pipeline.toServiceClientOptions(), - }); - + this.storageClientContext = new StorageContextClient(this.url, getCoreClientOptions(pipeline)); // Remove the default content-type in generated code of StorageClientContext const storageClientContext = this.storageClientContext as any; if (storageClientContext.requestContentType) { storageClientContext.requestContentType = undefined; } - // Retrieve credential from the pipeline. - this.credential = new AnonymousCredential(); - for (const factory of this.pipeline.factories) { - if ( - (isNode && factory instanceof StorageSharedKeyCredential) || - factory instanceof AnonymousCredential - ) { - this.credential = factory; - break; - } + const credential = getCredentialFromPipeline(pipeline); + if (isTokenCredential(credential)) { + throw new Error("Unsupported TokenCredential type found in pipeline."); } + this.credential = credential; } } diff --git a/sdk/storage/storage-file-share/src/StorageContextClient.ts b/sdk/storage/storage-file-share/src/StorageContextClient.ts new file mode 100644 index 000000000000..86d667a46c01 --- /dev/null +++ b/sdk/storage/storage-file-share/src/StorageContextClient.ts @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OperationArguments, OperationSpec } from "@azure/core-client"; +import { StorageClient } from "./generated/src"; + +/** + * @internal + */ +export class StorageContextClient extends StorageClient { + async sendOperationRequest( + operationArguments: OperationArguments, + operationSpec: OperationSpec + ): Promise { + const operationSpecToSend = { ...operationSpec }; + + if ( + operationSpecToSend.path === "/{shareName}/{directory}" || + operationSpecToSend.path === "/{shareName}/{directory}/{fileName}" + ) { + operationSpecToSend.path = ""; + } + return super.sendOperationRequest(operationArguments, operationSpecToSend); + } +} diff --git a/sdk/storage/storage-file-share/src/StorageRetryPolicyFactory.ts b/sdk/storage/storage-file-share/src/StorageRetryPolicyFactory.ts deleted file mode 100644 index bb74610f4bf5..000000000000 --- a/sdk/storage/storage-file-share/src/StorageRetryPolicyFactory.ts +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from "@azure/core-http"; -import { StorageRetryPolicy, StorageRetryPolicyType } from "./policies/StorageRetryPolicy"; - -export { StorageRetryPolicyType, StorageRetryPolicy }; - -/** - * Retry options interface. - */ -export interface StorageRetryOptions { - /** - * Optional. StorageRetryPolicyType, default is exponential retry policy. - */ - readonly retryPolicyType?: StorageRetryPolicyType; - - /** - * Optional. Max try number of attempts, default is 4. - * A value of 1 means 1 try and no retries. - * A value smaller than 1 means default retry number of attempts. - */ - readonly maxTries?: number; - - /** - * Optional. Indicates the maximum time in ms allowed for any single try of an HTTP request. - * A value of zero or undefined means that you accept our default timeout, 60s or 60 * 1000ms. - * - * NOTE: When transferring large amounts of data, the default TryTimeout will probably - * not be sufficient. You should override this value based on the bandwidth available to - * the host machine and proximity to the Storage service. A good starting point may be something - * like (60 seconds per MB of anticipated-payload-size) - */ - readonly tryTimeoutInMs?: number; - - /** - * Optional. Specifies the amount of delay to use before retrying an operation (default is 4s or 4 * 1000ms). - * The delay increases (exponentially or linearly) with each retry up to a maximum specified by - * maxRetryDelayInMs. If you specify 0, then you must also specify 0 for maxRetryDelayInMs. - */ - readonly retryDelayInMs?: number; - - /** - * Optional. Specifies the maximum delay allowed before retrying an operation (default is 120s or 120 * 1000ms). - * If you specify 0, then you must also specify 0 for retryDelayInMs. - */ - readonly maxRetryDelayInMs?: number; -} - -/** - * StorageRetryPolicyFactory is a factory class helping generating StorageRetryPolicy objects. - */ -export class StorageRetryPolicyFactory implements RequestPolicyFactory { - private retryOptions?: StorageRetryOptions; - - /** - * Creates an instance of StorageRetryPolicyFactory. - * @param retryOptions - - */ - constructor(retryOptions?: StorageRetryOptions) { - this.retryOptions = retryOptions; - } - - /** - * Creates a StorageRetryPolicy object. - * @param nextPolicy - - * @param options - - */ - public create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): StorageRetryPolicy { - return new StorageRetryPolicy(nextPolicy, options, this.retryOptions); - } -} diff --git a/sdk/storage/storage-file-share/src/TelemetryPolicyFactory.ts b/sdk/storage/storage-file-share/src/TelemetryPolicyFactory.ts deleted file mode 100644 index b22aaca5986d..000000000000 --- a/sdk/storage/storage-file-share/src/TelemetryPolicyFactory.ts +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { - isNode, - RequestPolicy, - RequestPolicyFactory, - RequestPolicyOptions, - UserAgentOptions, -} 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 implements RequestPolicyFactory { - /** - * @internal - */ - public readonly telemetryString: string; - - /** - * Creates an instance of TelemetryPolicyFactory. - * @param telemetry - - */ - constructor(telemetry?: UserAgentOptions) { - const userAgentInfo: string[] = []; - - if (isNode) { - if (telemetry) { - const telemetryString = telemetry.userAgentPrefix || ""; - if (telemetryString.length > 0 && userAgentInfo.indexOf(telemetryString) === -1) { - userAgentInfo.push(telemetryString); - } - } - - // e.g. azsdk-js-storagefile/11.0.0 - const libInfo = `azsdk-js-storagefile/${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 {@link RequestPolicy} object. - * - * @param nextPolicy - - * @param options - - */ - public create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): TelemetryPolicy { - return new TelemetryPolicy(nextPolicy, options, this.telemetryString); - } -} diff --git a/sdk/storage/storage-file-share/src/credentials/AnonymousCredential.ts b/sdk/storage/storage-file-share/src/credentials/AnonymousCredential.ts deleted file mode 100644 index e5ce6a7c2e98..000000000000 --- a/sdk/storage/storage-file-share/src/credentials/AnonymousCredential.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { RequestPolicy, RequestPolicyOptions } from "@azure/core-http"; - -import { AnonymousCredentialPolicy } from "../policies/AnonymousCredentialPolicy"; -import { Credential } from "./Credential"; - -/** - * AnonymousCredential provides a credentialPolicyCreator member used to create - * {@link 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 - - */ - public create( - nextPolicy: RequestPolicy, - options: RequestPolicyOptions - ): AnonymousCredentialPolicy { - return new AnonymousCredentialPolicy(nextPolicy, options); - } -} diff --git a/sdk/storage/storage-file-share/src/credentials/Credential.ts b/sdk/storage/storage-file-share/src/credentials/Credential.ts deleted file mode 100644 index bd795dcd129d..000000000000 --- a/sdk/storage/storage-file-share/src/credentials/Credential.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from "@azure/core-http"; -import { CredentialPolicy } from "../policies/CredentialPolicy"; - -/** - * Credential is an abstract class for Azure Storage HTTP requests signing. This - * class will host an credentialPolicyCreator factory which generates CredentialPolicy. - */ -export abstract class Credential implements RequestPolicyFactory { - /** - * Creates a RequestPolicy object. - * - * @param _nextPolicy - - * @param _options - - */ - public create(_nextPolicy: RequestPolicy, _options: RequestPolicyOptions): RequestPolicy { - throw new Error("Method should be implemented in children classes."); - } -} - -/** - * A factory function that creates a new CredentialPolicy that uses the provided nextPolicy. - */ -export type CredentialPolicyCreator = ( - nextPolicy: RequestPolicy, - options: RequestPolicyOptions -) => CredentialPolicy; diff --git a/sdk/storage/storage-file-share/src/credentials/StorageSharedKeyCredential.browser.ts b/sdk/storage/storage-file-share/src/credentials/StorageSharedKeyCredential.browser.ts deleted file mode 100644 index 30c625dec7f4..000000000000 --- a/sdk/storage/storage-file-share/src/credentials/StorageSharedKeyCredential.browser.ts +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -export class StorageSharedKeyCredential {} diff --git a/sdk/storage/storage-file-share/src/credentials/StorageSharedKeyCredential.ts b/sdk/storage/storage-file-share/src/credentials/StorageSharedKeyCredential.ts deleted file mode 100644 index c73b3f1ce767..000000000000 --- a/sdk/storage/storage-file-share/src/credentials/StorageSharedKeyCredential.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { createHmac } from "crypto"; -import { RequestPolicy, RequestPolicyOptions } from "@azure/core-http"; - -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 { - /** - * Azure Storage account name; readonly. - */ - public readonly accountName: string; - - /** - * Azure Storage account key; readonly. - */ - private readonly accountKey: Buffer; - - /** - * Creates an instance of StorageSharedKeyCredential. - * @param accountName - - * @param accountKey - - */ - constructor(accountName: string, accountKey: string) { - super(); - this.accountName = accountName; - this.accountKey = Buffer.from(accountKey, "base64"); - } - - /** - * Creates a {@link StorageSharedKeyCredentialPolicy} object. - * - * @param nextPolicy - - * @param options - - */ - public create( - nextPolicy: RequestPolicy, - options: RequestPolicyOptions - ): StorageSharedKeyCredentialPolicy { - return new StorageSharedKeyCredentialPolicy(nextPolicy, options, this); - } - - /** - * Generates a hash signature for an HTTP request or for a SAS. - * - * @param stringToSign - - */ - public computeHMACSHA256(stringToSign: string): string { - return createHmac("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64"); - } -} diff --git a/sdk/storage/storage-file-share/src/generated/src/index.ts b/sdk/storage/storage-file-share/src/generated/src/index.ts index 40fd6f83562e..db8d68b5328c 100644 --- a/sdk/storage/storage-file-share/src/generated/src/index.ts +++ b/sdk/storage/storage-file-share/src/generated/src/index.ts @@ -8,4 +8,4 @@ export * from "./models"; export { StorageClient } from "./storageClient"; -export { StorageClientContext } from "./storageClientContext"; +export * from "./operationsInterfaces"; diff --git a/sdk/storage/storage-file-share/src/generated/src/models/index.ts b/sdk/storage/storage-file-share/src/generated/src/models/index.ts index cea6fa380f71..ac6b794868de 100644 --- a/sdk/storage/storage-file-share/src/generated/src/models/index.ts +++ b/sdk/storage/storage-file-share/src/generated/src/models/index.ts @@ -6,7 +6,9 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import * as coreHttp from "@azure/core-http"; +import * as coreClient from "@azure/core-client"; +import * as coreRestPipeline from "@azure/core-rest-pipeline"; +import * as coreHttpCompat from "@azure/core-http-compat"; /** Storage service properties. */ export interface FileServiceProperties { @@ -1542,72 +1544,138 @@ export interface SourceModifiedAccessConditions { } /** Known values of {@link StorageErrorCode} that the service accepts. */ -export const enum KnownStorageErrorCode { +export enum KnownStorageErrorCode { + /** AccountAlreadyExists */ AccountAlreadyExists = "AccountAlreadyExists", + /** AccountBeingCreated */ AccountBeingCreated = "AccountBeingCreated", + /** AccountIsDisabled */ AccountIsDisabled = "AccountIsDisabled", + /** AuthenticationFailed */ AuthenticationFailed = "AuthenticationFailed", + /** AuthorizationFailure */ AuthorizationFailure = "AuthorizationFailure", + /** ConditionHeadersNotSupported */ ConditionHeadersNotSupported = "ConditionHeadersNotSupported", + /** ConditionNotMet */ ConditionNotMet = "ConditionNotMet", + /** EmptyMetadataKey */ EmptyMetadataKey = "EmptyMetadataKey", + /** InsufficientAccountPermissions */ InsufficientAccountPermissions = "InsufficientAccountPermissions", + /** InternalError */ InternalError = "InternalError", + /** InvalidAuthenticationInfo */ InvalidAuthenticationInfo = "InvalidAuthenticationInfo", + /** InvalidHeaderValue */ InvalidHeaderValue = "InvalidHeaderValue", + /** InvalidHttpVerb */ InvalidHttpVerb = "InvalidHttpVerb", + /** InvalidInput */ InvalidInput = "InvalidInput", + /** InvalidMd5 */ InvalidMd5 = "InvalidMd5", + /** InvalidMetadata */ InvalidMetadata = "InvalidMetadata", + /** InvalidQueryParameterValue */ InvalidQueryParameterValue = "InvalidQueryParameterValue", + /** InvalidRange */ InvalidRange = "InvalidRange", + /** InvalidResourceName */ InvalidResourceName = "InvalidResourceName", + /** InvalidUri */ InvalidUri = "InvalidUri", + /** InvalidXmlDocument */ InvalidXmlDocument = "InvalidXmlDocument", + /** InvalidXmlNodeValue */ InvalidXmlNodeValue = "InvalidXmlNodeValue", + /** Md5Mismatch */ Md5Mismatch = "Md5Mismatch", + /** MetadataTooLarge */ MetadataTooLarge = "MetadataTooLarge", + /** MissingContentLengthHeader */ MissingContentLengthHeader = "MissingContentLengthHeader", + /** MissingRequiredQueryParameter */ MissingRequiredQueryParameter = "MissingRequiredQueryParameter", + /** MissingRequiredHeader */ MissingRequiredHeader = "MissingRequiredHeader", + /** MissingRequiredXmlNode */ MissingRequiredXmlNode = "MissingRequiredXmlNode", + /** MultipleConditionHeadersNotSupported */ MultipleConditionHeadersNotSupported = "MultipleConditionHeadersNotSupported", + /** OperationTimedOut */ OperationTimedOut = "OperationTimedOut", + /** OutOfRangeInput */ OutOfRangeInput = "OutOfRangeInput", + /** OutOfRangeQueryParameterValue */ OutOfRangeQueryParameterValue = "OutOfRangeQueryParameterValue", + /** RequestBodyTooLarge */ RequestBodyTooLarge = "RequestBodyTooLarge", + /** ResourceTypeMismatch */ ResourceTypeMismatch = "ResourceTypeMismatch", + /** RequestUrlFailedToParse */ RequestUrlFailedToParse = "RequestUrlFailedToParse", + /** ResourceAlreadyExists */ ResourceAlreadyExists = "ResourceAlreadyExists", + /** ResourceNotFound */ ResourceNotFound = "ResourceNotFound", + /** ServerBusy */ ServerBusy = "ServerBusy", + /** UnsupportedHeader */ UnsupportedHeader = "UnsupportedHeader", + /** UnsupportedXmlNode */ UnsupportedXmlNode = "UnsupportedXmlNode", + /** UnsupportedQueryParameter */ UnsupportedQueryParameter = "UnsupportedQueryParameter", + /** UnsupportedHttpVerb */ UnsupportedHttpVerb = "UnsupportedHttpVerb", + /** CannotDeleteFileOrDirectory */ CannotDeleteFileOrDirectory = "CannotDeleteFileOrDirectory", + /** ClientCacheFlushDelay */ ClientCacheFlushDelay = "ClientCacheFlushDelay", + /** DeletePending */ DeletePending = "DeletePending", + /** DirectoryNotEmpty */ DirectoryNotEmpty = "DirectoryNotEmpty", + /** FileLockConflict */ FileLockConflict = "FileLockConflict", + /** InvalidFileOrDirectoryPathName */ InvalidFileOrDirectoryPathName = "InvalidFileOrDirectoryPathName", + /** ParentNotFound */ ParentNotFound = "ParentNotFound", + /** ReadOnlyAttribute */ ReadOnlyAttribute = "ReadOnlyAttribute", + /** ShareAlreadyExists */ ShareAlreadyExists = "ShareAlreadyExists", + /** ShareBeingDeleted */ ShareBeingDeleted = "ShareBeingDeleted", + /** ShareDisabled */ ShareDisabled = "ShareDisabled", + /** ShareNotFound */ ShareNotFound = "ShareNotFound", + /** SharingViolation */ SharingViolation = "SharingViolation", + /** ShareSnapshotInProgress */ ShareSnapshotInProgress = "ShareSnapshotInProgress", + /** ShareSnapshotCountExceeded */ ShareSnapshotCountExceeded = "ShareSnapshotCountExceeded", + /** ShareSnapshotOperationNotSupported */ ShareSnapshotOperationNotSupported = "ShareSnapshotOperationNotSupported", + /** ShareHasSnapshots */ ShareHasSnapshots = "ShareHasSnapshots", + /** ContainerQuotaDowngradeNotAllowed */ ContainerQuotaDowngradeNotAllowed = "ContainerQuotaDowngradeNotAllowed", + /** AuthorizationSourceIPMismatch */ AuthorizationSourceIPMismatch = "AuthorizationSourceIPMismatch", + /** AuthorizationProtocolMismatch */ AuthorizationProtocolMismatch = "AuthorizationProtocolMismatch", + /** AuthorizationPermissionMismatch */ AuthorizationPermissionMismatch = "AuthorizationPermissionMismatch", + /** AuthorizationServiceMismatch */ AuthorizationServiceMismatch = "AuthorizationServiceMismatch", + /** AuthorizationResourceTypeMismatch */ AuthorizationResourceTypeMismatch = "AuthorizationResourceTypeMismatch", + /** FeatureVersionMismatch */ FeatureVersionMismatch = "FeatureVersionMismatch" } @@ -1615,7 +1683,7 @@ export const enum KnownStorageErrorCode { * Defines values for StorageErrorCode. \ * {@link KnownStorageErrorCode} can be used interchangeably with StorageErrorCode, * this enum contains the known values that the service supports. - * ### Know values supported by the service + * ### Known values supported by the service * **AccountAlreadyExists** \ * **AccountBeingCreated** \ * **AccountIsDisabled** \ @@ -1720,45 +1788,28 @@ export type PermissionCopyModeType = "source" | "override"; /** Optional parameters. */ export interface ServiceSetPropertiesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; } /** Contains response data for the setProperties operation. */ -export type ServiceSetPropertiesResponse = ServiceSetPropertiesHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ServiceSetPropertiesHeaders; - }; -}; +export type ServiceSetPropertiesResponse = ServiceSetPropertiesHeaders; /** Optional parameters. */ export interface ServiceGetPropertiesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; } /** Contains response data for the getProperties operation. */ export type ServiceGetPropertiesResponse = ServiceGetPropertiesHeaders & - FileServiceProperties & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The response body as text (string format) */ - bodyAsText: string; - - /** The response body as parsed JSON or XML */ - parsedBody: FileServiceProperties; - /** The parsed HTTP response headers. */ - parsedHeaders: ServiceGetPropertiesHeaders; - }; - }; + FileServiceProperties; /** Optional parameters. */ export interface ServiceListSharesSegmentOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** Filters the results to return only entries whose name begins with the specified prefix. */ @@ -1773,21 +1824,10 @@ export interface ServiceListSharesSegmentOptionalParams /** Contains response data for the listSharesSegment operation. */ export type ServiceListSharesSegmentResponse = ServiceListSharesSegmentHeaders & - ListSharesResponse & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The response body as text (string format) */ - bodyAsText: string; - - /** The response body as parsed JSON or XML */ - parsedBody: ListSharesResponse; - /** The parsed HTTP response headers. */ - parsedHeaders: ServiceListSharesSegmentHeaders; - }; - }; + ListSharesResponse; /** Optional parameters. */ -export interface ShareCreateOptionalParams extends coreHttp.OperationOptions { +export interface ShareCreateOptionalParams extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** A name-value pair to associate with a file storage object. */ @@ -1803,17 +1843,11 @@ export interface ShareCreateOptionalParams extends coreHttp.OperationOptions { } /** Contains response data for the create operation. */ -export type ShareCreateResponse = ShareCreateHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareCreateHeaders; - }; -}; +export type ShareCreateResponse = ShareCreateHeaders; /** Optional parameters. */ export interface ShareGetPropertiesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -1823,16 +1857,10 @@ export interface ShareGetPropertiesOptionalParams } /** Contains response data for the getProperties operation. */ -export type ShareGetPropertiesResponse = ShareGetPropertiesHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareGetPropertiesHeaders; - }; -}; +export type ShareGetPropertiesResponse = ShareGetPropertiesHeaders; /** Optional parameters. */ -export interface ShareDeleteOptionalParams extends coreHttp.OperationOptions { +export interface ShareDeleteOptionalParams extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -1844,17 +1872,11 @@ export interface ShareDeleteOptionalParams extends coreHttp.OperationOptions { } /** Contains response data for the delete operation. */ -export type ShareDeleteResponse = ShareDeleteHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareDeleteHeaders; - }; -}; +export type ShareDeleteResponse = ShareDeleteHeaders; /** Optional parameters. */ export interface ShareAcquireLeaseOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** The snapshot parameter is an opaque DateTime value that, when present, specifies the share snapshot to query. */ @@ -1868,17 +1890,11 @@ export interface ShareAcquireLeaseOptionalParams } /** Contains response data for the acquireLease operation. */ -export type ShareAcquireLeaseResponse = ShareAcquireLeaseHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareAcquireLeaseHeaders; - }; -}; +export type ShareAcquireLeaseResponse = ShareAcquireLeaseHeaders; /** Optional parameters. */ export interface ShareReleaseLeaseOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** The snapshot parameter is an opaque DateTime value that, when present, specifies the share snapshot to query. */ @@ -1888,17 +1904,11 @@ export interface ShareReleaseLeaseOptionalParams } /** Contains response data for the releaseLease operation. */ -export type ShareReleaseLeaseResponse = ShareReleaseLeaseHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareReleaseLeaseHeaders; - }; -}; +export type ShareReleaseLeaseResponse = ShareReleaseLeaseHeaders; /** Optional parameters. */ export interface ShareChangeLeaseOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** The snapshot parameter is an opaque DateTime value that, when present, specifies the share snapshot to query. */ @@ -1910,17 +1920,11 @@ export interface ShareChangeLeaseOptionalParams } /** Contains response data for the changeLease operation. */ -export type ShareChangeLeaseResponse = ShareChangeLeaseHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareChangeLeaseHeaders; - }; -}; +export type ShareChangeLeaseResponse = ShareChangeLeaseHeaders; /** Optional parameters. */ export interface ShareRenewLeaseOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** The snapshot parameter is an opaque DateTime value that, when present, specifies the share snapshot to query. */ @@ -1930,17 +1934,11 @@ export interface ShareRenewLeaseOptionalParams } /** Contains response data for the renewLease operation. */ -export type ShareRenewLeaseResponse = ShareRenewLeaseHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareRenewLeaseHeaders; - }; -}; +export type ShareRenewLeaseResponse = ShareRenewLeaseHeaders; /** Optional parameters. */ export interface ShareBreakLeaseOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -1954,17 +1952,11 @@ export interface ShareBreakLeaseOptionalParams } /** Contains response data for the breakLease operation. */ -export type ShareBreakLeaseResponse = ShareBreakLeaseHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareBreakLeaseHeaders; - }; -}; +export type ShareBreakLeaseResponse = ShareBreakLeaseHeaders; /** Optional parameters. */ export interface ShareCreateSnapshotOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** A name-value pair to associate with a file storage object. */ @@ -1972,55 +1964,32 @@ export interface ShareCreateSnapshotOptionalParams } /** Contains response data for the createSnapshot operation. */ -export type ShareCreateSnapshotResponse = ShareCreateSnapshotHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareCreateSnapshotHeaders; - }; -}; +export type ShareCreateSnapshotResponse = ShareCreateSnapshotHeaders; /** Optional parameters. */ export interface ShareCreatePermissionOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; } /** Contains response data for the createPermission operation. */ -export type ShareCreatePermissionResponse = ShareCreatePermissionHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareCreatePermissionHeaders; - }; -}; +export type ShareCreatePermissionResponse = ShareCreatePermissionHeaders; /** Optional parameters. */ export interface ShareGetPermissionOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; } /** Contains response data for the getPermission operation. */ export type ShareGetPermissionResponse = ShareGetPermissionHeaders & - SharePermission & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The response body as text (string format) */ - bodyAsText: string; - - /** The response body as parsed JSON or XML */ - parsedBody: SharePermission; - /** The parsed HTTP response headers. */ - parsedHeaders: ShareGetPermissionHeaders; - }; - }; + SharePermission; /** Optional parameters. */ export interface ShareSetPropertiesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2034,17 +2003,11 @@ export interface ShareSetPropertiesOptionalParams } /** Contains response data for the setProperties operation. */ -export type ShareSetPropertiesResponse = ShareSetPropertiesHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareSetPropertiesHeaders; - }; -}; +export type ShareSetPropertiesResponse = ShareSetPropertiesHeaders; /** Optional parameters. */ export interface ShareSetMetadataOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2054,17 +2017,11 @@ export interface ShareSetMetadataOptionalParams } /** Contains response data for the setMetadata operation. */ -export type ShareSetMetadataResponse = ShareSetMetadataHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareSetMetadataHeaders; - }; -}; +export type ShareSetMetadataResponse = ShareSetMetadataHeaders; /** Optional parameters. */ export interface ShareGetAccessPolicyOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2073,22 +2030,11 @@ export interface ShareGetAccessPolicyOptionalParams /** Contains response data for the getAccessPolicy operation. */ export type ShareGetAccessPolicyResponse = ShareGetAccessPolicyHeaders & - SignedIdentifier[] & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The response body as text (string format) */ - bodyAsText: string; - - /** The response body as parsed JSON or XML */ - parsedBody: SignedIdentifier[]; - /** The parsed HTTP response headers. */ - parsedHeaders: ShareGetAccessPolicyHeaders; - }; - }; + SignedIdentifier[]; /** Optional parameters. */ export interface ShareSetAccessPolicyOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2098,17 +2044,11 @@ export interface ShareSetAccessPolicyOptionalParams } /** Contains response data for the setAccessPolicy operation. */ -export type ShareSetAccessPolicyResponse = ShareSetAccessPolicyHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareSetAccessPolicyHeaders; - }; -}; +export type ShareSetAccessPolicyResponse = ShareSetAccessPolicyHeaders; /** Optional parameters. */ export interface ShareGetStatisticsOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2116,22 +2056,11 @@ export interface ShareGetStatisticsOptionalParams } /** Contains response data for the getStatistics operation. */ -export type ShareGetStatisticsResponse = ShareGetStatisticsHeaders & - ShareStats & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The response body as text (string format) */ - bodyAsText: string; - - /** The response body as parsed JSON or XML */ - parsedBody: ShareStats; - /** The parsed HTTP response headers. */ - parsedHeaders: ShareGetStatisticsHeaders; - }; - }; +export type ShareGetStatisticsResponse = ShareGetStatisticsHeaders & ShareStats; /** Optional parameters. */ -export interface ShareRestoreOptionalParams extends coreHttp.OperationOptions { +export interface ShareRestoreOptionalParams + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. */ @@ -2143,17 +2072,11 @@ export interface ShareRestoreOptionalParams extends coreHttp.OperationOptions { } /** Contains response data for the restore operation. */ -export type ShareRestoreResponse = ShareRestoreHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: ShareRestoreHeaders; - }; -}; +export type ShareRestoreResponse = ShareRestoreHeaders; /** Optional parameters. */ export interface DirectoryCreateOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** A name-value pair to associate with a file storage object. */ @@ -2171,17 +2094,11 @@ export interface DirectoryCreateOptionalParams } /** Contains response data for the create operation. */ -export type DirectoryCreateResponse = DirectoryCreateHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: DirectoryCreateHeaders; - }; -}; +export type DirectoryCreateResponse = DirectoryCreateHeaders; /** Optional parameters. */ export interface DirectoryGetPropertiesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** The snapshot parameter is an opaque DateTime value that, when present, specifies the share snapshot to query. */ @@ -2189,33 +2106,21 @@ export interface DirectoryGetPropertiesOptionalParams } /** Contains response data for the getProperties operation. */ -export type DirectoryGetPropertiesResponse = DirectoryGetPropertiesHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: DirectoryGetPropertiesHeaders; - }; -}; +export type DirectoryGetPropertiesResponse = DirectoryGetPropertiesHeaders; /** Optional parameters. */ export interface DirectoryDeleteOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; } /** Contains response data for the delete operation. */ -export type DirectoryDeleteResponse = DirectoryDeleteHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: DirectoryDeleteHeaders; - }; -}; +export type DirectoryDeleteResponse = DirectoryDeleteHeaders; /** Optional parameters. */ export interface DirectorySetPropertiesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** If specified the permission (security descriptor) shall be set for the directory/file. This header can be used if Permission size is <= 8KB, else x-ms-file-permission-key header shall be used. Default value: Inherit. If SDDL is specified as input, it must have owner, group and dacl. Note: Only one of the x-ms-file-permission or x-ms-file-permission-key should be specified. */ @@ -2231,17 +2136,11 @@ export interface DirectorySetPropertiesOptionalParams } /** Contains response data for the setProperties operation. */ -export type DirectorySetPropertiesResponse = DirectorySetPropertiesHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: DirectorySetPropertiesHeaders; - }; -}; +export type DirectorySetPropertiesResponse = DirectorySetPropertiesHeaders; /** Optional parameters. */ export interface DirectorySetMetadataOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** A name-value pair to associate with a file storage object. */ @@ -2249,17 +2148,11 @@ export interface DirectorySetMetadataOptionalParams } /** Contains response data for the setMetadata operation. */ -export type DirectorySetMetadataResponse = DirectorySetMetadataHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: DirectorySetMetadataHeaders; - }; -}; +export type DirectorySetMetadataResponse = DirectorySetMetadataHeaders; /** Optional parameters. */ export interface DirectoryListFilesAndDirectoriesSegmentOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** Filters the results to return only entries whose name begins with the specified prefix. */ @@ -2278,22 +2171,11 @@ export interface DirectoryListFilesAndDirectoriesSegmentOptionalParams /** Contains response data for the listFilesAndDirectoriesSegment operation. */ export type DirectoryListFilesAndDirectoriesSegmentResponse = DirectoryListFilesAndDirectoriesSegmentHeaders & - ListFilesAndDirectoriesSegmentResponse & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The response body as text (string format) */ - bodyAsText: string; - - /** The response body as parsed JSON or XML */ - parsedBody: ListFilesAndDirectoriesSegmentResponse; - /** The parsed HTTP response headers. */ - parsedHeaders: DirectoryListFilesAndDirectoriesSegmentHeaders; - }; - }; + ListFilesAndDirectoriesSegmentResponse; /** Optional parameters. */ export interface DirectoryListHandlesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** A string value that identifies the portion of the list to be returned with the next list operation. The operation returns a marker value within the response body if the list returned was not complete. The marker value may then be used in a subsequent call to request the next set of list items. The marker value is opaque to the client. */ @@ -2308,22 +2190,11 @@ export interface DirectoryListHandlesOptionalParams /** Contains response data for the listHandles operation. */ export type DirectoryListHandlesResponse = DirectoryListHandlesHeaders & - ListHandlesResponse & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The response body as text (string format) */ - bodyAsText: string; - - /** The response body as parsed JSON or XML */ - parsedBody: ListHandlesResponse; - /** The parsed HTTP response headers. */ - parsedHeaders: DirectoryListHandlesHeaders; - }; - }; + ListHandlesResponse; /** Optional parameters. */ export interface DirectoryForceCloseHandlesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** A string value that identifies the portion of the list to be returned with the next list operation. The operation returns a marker value within the response body if the list returned was not complete. The marker value may then be used in a subsequent call to request the next set of list items. The marker value is opaque to the client. */ @@ -2335,17 +2206,11 @@ export interface DirectoryForceCloseHandlesOptionalParams } /** Contains response data for the forceCloseHandles operation. */ -export type DirectoryForceCloseHandlesResponse = DirectoryForceCloseHandlesHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: DirectoryForceCloseHandlesHeaders; - }; -}; +export type DirectoryForceCloseHandlesResponse = DirectoryForceCloseHandlesHeaders; /** Optional parameters. */ export interface DirectoryRenameOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ sourceLeaseAccessConditions?: SourceLeaseAccessConditions; /** Parameter group */ @@ -2367,16 +2232,10 @@ export interface DirectoryRenameOptionalParams } /** Contains response data for the rename operation. */ -export type DirectoryRenameResponse = DirectoryRenameHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: DirectoryRenameHeaders; - }; -}; +export type DirectoryRenameResponse = DirectoryRenameHeaders; /** Optional parameters. */ -export interface FileCreateOptionalParams extends coreHttp.OperationOptions { +export interface FileCreateOptionalParams extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** Parameter group */ @@ -2398,16 +2257,11 @@ export interface FileCreateOptionalParams extends coreHttp.OperationOptions { } /** Contains response data for the create operation. */ -export type FileCreateResponse = FileCreateHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileCreateHeaders; - }; -}; +export type FileCreateResponse = FileCreateHeaders; /** Optional parameters. */ -export interface FileDownloadOptionalParams extends coreHttp.OperationOptions { +export interface FileDownloadOptionalParams + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2434,17 +2288,11 @@ export type FileDownloadResponse = FileDownloadHeaders & { * Always `undefined` in the browser. */ readableStreamBody?: NodeJS.ReadableStream; - - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileDownloadHeaders; - }; }; /** Optional parameters. */ export interface FileGetPropertiesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2454,16 +2302,10 @@ export interface FileGetPropertiesOptionalParams } /** Contains response data for the getProperties operation. */ -export type FileGetPropertiesResponse = FileGetPropertiesHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileGetPropertiesHeaders; - }; -}; +export type FileGetPropertiesResponse = FileGetPropertiesHeaders; /** Optional parameters. */ -export interface FileDeleteOptionalParams extends coreHttp.OperationOptions { +export interface FileDeleteOptionalParams extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2471,17 +2313,11 @@ export interface FileDeleteOptionalParams extends coreHttp.OperationOptions { } /** Contains response data for the delete operation. */ -export type FileDeleteResponse = FileDeleteHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileDeleteHeaders; - }; -}; +export type FileDeleteResponse = FileDeleteHeaders; /** Optional parameters. */ export interface FileSetHttpHeadersOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** Parameter group */ @@ -2503,17 +2339,11 @@ export interface FileSetHttpHeadersOptionalParams } /** Contains response data for the setHttpHeaders operation. */ -export type FileSetHttpHeadersResponse = FileSetHttpHeadersHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileSetHttpHeadersHeaders; - }; -}; +export type FileSetHttpHeadersResponse = FileSetHttpHeadersHeaders; /** Optional parameters. */ export interface FileSetMetadataOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2523,17 +2353,11 @@ export interface FileSetMetadataOptionalParams } /** Contains response data for the setMetadata operation. */ -export type FileSetMetadataResponse = FileSetMetadataHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileSetMetadataHeaders; - }; -}; +export type FileSetMetadataResponse = FileSetMetadataHeaders; /** Optional parameters. */ export interface FileAcquireLeaseOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** Specifies the duration of the lease, in seconds, or negative one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration cannot be changed using renew or change. */ @@ -2545,17 +2369,11 @@ export interface FileAcquireLeaseOptionalParams } /** Contains response data for the acquireLease operation. */ -export type FileAcquireLeaseResponse = FileAcquireLeaseHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileAcquireLeaseHeaders; - }; -}; +export type FileAcquireLeaseResponse = FileAcquireLeaseHeaders; /** Optional parameters. */ export interface FileReleaseLeaseOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** Provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. */ @@ -2563,17 +2381,11 @@ export interface FileReleaseLeaseOptionalParams } /** Contains response data for the releaseLease operation. */ -export type FileReleaseLeaseResponse = FileReleaseLeaseHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileReleaseLeaseHeaders; - }; -}; +export type FileReleaseLeaseResponse = FileReleaseLeaseHeaders; /** Optional parameters. */ export interface FileChangeLeaseOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** Proposed lease ID, in a GUID string format. The File 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. */ @@ -2583,17 +2395,11 @@ export interface FileChangeLeaseOptionalParams } /** Contains response data for the changeLease operation. */ -export type FileChangeLeaseResponse = FileChangeLeaseHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileChangeLeaseHeaders; - }; -}; +export type FileChangeLeaseResponse = FileChangeLeaseHeaders; /** Optional parameters. */ export interface FileBreakLeaseOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2603,23 +2409,17 @@ export interface FileBreakLeaseOptionalParams } /** Contains response data for the breakLease operation. */ -export type FileBreakLeaseResponse = FileBreakLeaseHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileBreakLeaseHeaders; - }; -}; +export type FileBreakLeaseResponse = FileBreakLeaseHeaders; /** Optional parameters. */ export interface FileUploadRangeOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** Initial data. */ - body?: coreHttp.HttpRequestBody; + body?: coreRestPipeline.RequestBodyType; /** An MD5 hash of the content. This hash is used to verify the integrity of the data during transport. When the Content-MD5 header is specified, the File service compares the hash of the content that has arrived with the header value that was sent. If the two hashes do not match, the operation will fail with error code 400 (Bad Request). */ contentMD5?: Uint8Array; /** If the file last write time should be preserved or overwritten */ @@ -2627,17 +2427,11 @@ export interface FileUploadRangeOptionalParams } /** Contains response data for the uploadRange operation. */ -export type FileUploadRangeResponse = FileUploadRangeHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileUploadRangeHeaders; - }; -}; +export type FileUploadRangeResponse = FileUploadRangeHeaders; /** Optional parameters. */ export interface FileUploadRangeFromURLOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** Parameter group */ @@ -2655,17 +2449,11 @@ export interface FileUploadRangeFromURLOptionalParams } /** Contains response data for the uploadRangeFromURL operation. */ -export type FileUploadRangeFromURLResponse = FileUploadRangeFromURLHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileUploadRangeFromURLHeaders; - }; -}; +export type FileUploadRangeFromURLResponse = FileUploadRangeFromURLHeaders; /** Optional parameters. */ export interface FileGetRangeListOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2680,21 +2468,11 @@ export interface FileGetRangeListOptionalParams /** Contains response data for the getRangeList operation. */ export type FileGetRangeListResponse = FileGetRangeListHeaders & - ShareFileRangeList & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The response body as text (string format) */ - bodyAsText: string; - - /** The response body as parsed JSON or XML */ - parsedBody: ShareFileRangeList; - /** The parsed HTTP response headers. */ - parsedHeaders: FileGetRangeListHeaders; - }; - }; + ShareFileRangeList; /** Optional parameters. */ -export interface FileStartCopyOptionalParams extends coreHttp.OperationOptions { +export interface FileStartCopyOptionalParams + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** Parameter group */ @@ -2710,16 +2488,11 @@ export interface FileStartCopyOptionalParams extends coreHttp.OperationOptions { } /** Contains response data for the startCopy operation. */ -export type FileStartCopyResponse = FileStartCopyHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileStartCopyHeaders; - }; -}; +export type FileStartCopyResponse = FileStartCopyHeaders; /** Optional parameters. */ -export interface FileAbortCopyOptionalParams extends coreHttp.OperationOptions { +export interface FileAbortCopyOptionalParams + extends coreClient.OperationOptions { /** Parameter group */ leaseAccessConditions?: LeaseAccessConditions; /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ @@ -2727,17 +2500,11 @@ export interface FileAbortCopyOptionalParams extends coreHttp.OperationOptions { } /** Contains response data for the abortCopy operation. */ -export type FileAbortCopyResponse = FileAbortCopyHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileAbortCopyHeaders; - }; -}; +export type FileAbortCopyResponse = FileAbortCopyHeaders; /** Optional parameters. */ export interface FileListHandlesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** A string value that identifies the portion of the list to be returned with the next list operation. The operation returns a marker value within the response body if the list returned was not complete. The marker value may then be used in a subsequent call to request the next set of list items. The marker value is opaque to the client. */ @@ -2750,22 +2517,11 @@ export interface FileListHandlesOptionalParams /** Contains response data for the listHandles operation. */ export type FileListHandlesResponse = FileListHandlesHeaders & - ListHandlesResponse & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The response body as text (string format) */ - bodyAsText: string; - - /** The response body as parsed JSON or XML */ - parsedBody: ListHandlesResponse; - /** The parsed HTTP response headers. */ - parsedHeaders: FileListHandlesHeaders; - }; - }; + ListHandlesResponse; /** Optional parameters. */ export interface FileForceCloseHandlesOptionalParams - extends coreHttp.OperationOptions { + extends coreClient.OperationOptions { /** The timeout parameter is expressed in seconds. For more information, see Setting Timeouts for File Service Operations. */ timeoutInSeconds?: number; /** A string value that identifies the portion of the list to be returned with the next list operation. The operation returns a marker value within the response body if the list returned was not complete. The marker value may then be used in a subsequent call to request the next set of list items. The marker value is opaque to the client. */ @@ -2775,16 +2531,10 @@ export interface FileForceCloseHandlesOptionalParams } /** Contains response data for the forceCloseHandles operation. */ -export type FileForceCloseHandlesResponse = FileForceCloseHandlesHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileForceCloseHandlesHeaders; - }; -}; +export type FileForceCloseHandlesResponse = FileForceCloseHandlesHeaders; /** Optional parameters. */ -export interface FileRenameOptionalParams extends coreHttp.OperationOptions { +export interface FileRenameOptionalParams extends coreClient.OperationOptions { /** Parameter group */ sourceLeaseAccessConditions?: SourceLeaseAccessConditions; /** Parameter group */ @@ -2808,17 +2558,11 @@ export interface FileRenameOptionalParams extends coreHttp.OperationOptions { } /** Contains response data for the rename operation. */ -export type FileRenameResponse = FileRenameHeaders & { - /** The underlying HTTP response. */ - _response: coreHttp.HttpResponse & { - /** The parsed HTTP response headers. */ - parsedHeaders: FileRenameHeaders; - }; -}; +export type FileRenameResponse = FileRenameHeaders; /** Optional parameters. */ export interface StorageClientOptionalParams - extends coreHttp.ServiceClientOptions { + extends coreHttpCompat.ExtendedServiceClientOptions { /** Specifies the version of the operation to use for this request. */ version?: string; /** Only update is supported: - Update: Writes the bytes downloaded from the source url into the specified range. */ diff --git a/sdk/storage/storage-file-share/src/generated/src/models/mappers.ts b/sdk/storage/storage-file-share/src/generated/src/models/mappers.ts index e6c990230df1..7ddbb19f4576 100644 --- a/sdk/storage/storage-file-share/src/generated/src/models/mappers.ts +++ b/sdk/storage/storage-file-share/src/generated/src/models/mappers.ts @@ -6,9 +6,9 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import * as coreHttp from "@azure/core-http"; +import * as coreClient from "@azure/core-client"; -export const FileServiceProperties: coreHttp.CompositeMapper = { +export const FileServiceProperties: coreClient.CompositeMapper = { serializedName: "FileServiceProperties", xmlName: "StorageServiceProperties", type: { @@ -58,7 +58,7 @@ export const FileServiceProperties: coreHttp.CompositeMapper = { } }; -export const Metrics: coreHttp.CompositeMapper = { +export const Metrics: coreClient.CompositeMapper = { serializedName: "Metrics", type: { name: "Composite", @@ -99,7 +99,7 @@ export const Metrics: coreHttp.CompositeMapper = { } }; -export const RetentionPolicy: coreHttp.CompositeMapper = { +export const RetentionPolicy: coreClient.CompositeMapper = { serializedName: "RetentionPolicy", type: { name: "Composite", @@ -128,7 +128,7 @@ export const RetentionPolicy: coreHttp.CompositeMapper = { } }; -export const CorsRule: coreHttp.CompositeMapper = { +export const CorsRule: coreClient.CompositeMapper = { serializedName: "CorsRule", type: { name: "Composite", @@ -181,7 +181,7 @@ export const CorsRule: coreHttp.CompositeMapper = { } }; -export const ShareProtocolSettings: coreHttp.CompositeMapper = { +export const ShareProtocolSettings: coreClient.CompositeMapper = { serializedName: "ShareProtocolSettings", xmlName: "ProtocolSettings", type: { @@ -200,7 +200,7 @@ export const ShareProtocolSettings: coreHttp.CompositeMapper = { } }; -export const ShareSmbSettings: coreHttp.CompositeMapper = { +export const ShareSmbSettings: coreClient.CompositeMapper = { serializedName: "ShareSmbSettings", xmlName: "SMB", type: { @@ -219,7 +219,7 @@ export const ShareSmbSettings: coreHttp.CompositeMapper = { } }; -export const SmbMultichannel: coreHttp.CompositeMapper = { +export const SmbMultichannel: coreClient.CompositeMapper = { serializedName: "SmbMultichannel", xmlName: "Multichannel", type: { @@ -237,7 +237,7 @@ export const SmbMultichannel: coreHttp.CompositeMapper = { } }; -export const StorageError: coreHttp.CompositeMapper = { +export const StorageError: coreClient.CompositeMapper = { serializedName: "StorageError", type: { name: "Composite", @@ -261,7 +261,7 @@ export const StorageError: coreHttp.CompositeMapper = { } }; -export const ListSharesResponse: coreHttp.CompositeMapper = { +export const ListSharesResponse: coreClient.CompositeMapper = { serializedName: "ListSharesResponse", xmlName: "EnumerationResults", type: { @@ -325,7 +325,7 @@ export const ListSharesResponse: coreHttp.CompositeMapper = { } }; -export const ShareItemInternal: coreHttp.CompositeMapper = { +export const ShareItemInternal: coreClient.CompositeMapper = { serializedName: "ShareItemInternal", xmlName: "Share", type: { @@ -381,7 +381,7 @@ export const ShareItemInternal: coreHttp.CompositeMapper = { } }; -export const SharePropertiesInternal: coreHttp.CompositeMapper = { +export const SharePropertiesInternal: coreClient.CompositeMapper = { serializedName: "SharePropertiesInternal", type: { name: "Composite", @@ -530,7 +530,7 @@ export const SharePropertiesInternal: coreHttp.CompositeMapper = { } }; -export const SharePermission: coreHttp.CompositeMapper = { +export const SharePermission: coreClient.CompositeMapper = { serializedName: "SharePermission", type: { name: "Composite", @@ -548,7 +548,7 @@ export const SharePermission: coreHttp.CompositeMapper = { } }; -export const SignedIdentifier: coreHttp.CompositeMapper = { +export const SignedIdentifier: coreClient.CompositeMapper = { serializedName: "SignedIdentifier", type: { name: "Composite", @@ -574,7 +574,7 @@ export const SignedIdentifier: coreHttp.CompositeMapper = { } }; -export const AccessPolicy: coreHttp.CompositeMapper = { +export const AccessPolicy: coreClient.CompositeMapper = { serializedName: "AccessPolicy", type: { name: "Composite", @@ -605,7 +605,7 @@ export const AccessPolicy: coreHttp.CompositeMapper = { } }; -export const ShareStats: coreHttp.CompositeMapper = { +export const ShareStats: coreClient.CompositeMapper = { serializedName: "ShareStats", type: { name: "Composite", @@ -623,7 +623,7 @@ export const ShareStats: coreHttp.CompositeMapper = { } }; -export const ListFilesAndDirectoriesSegmentResponse: coreHttp.CompositeMapper = { +export const ListFilesAndDirectoriesSegmentResponse: coreClient.CompositeMapper = { serializedName: "ListFilesAndDirectoriesSegmentResponse", xmlName: "EnumerationResults", type: { @@ -714,7 +714,7 @@ export const ListFilesAndDirectoriesSegmentResponse: coreHttp.CompositeMapper = } }; -export const FilesAndDirectoriesListSegment: coreHttp.CompositeMapper = { +export const FilesAndDirectoriesListSegment: coreClient.CompositeMapper = { serializedName: "FilesAndDirectoriesListSegment", xmlName: "Entries", type: { @@ -755,7 +755,7 @@ export const FilesAndDirectoriesListSegment: coreHttp.CompositeMapper = { } }; -export const DirectoryItem: coreHttp.CompositeMapper = { +export const DirectoryItem: coreClient.CompositeMapper = { serializedName: "DirectoryItem", xmlName: "Directory", type: { @@ -803,7 +803,7 @@ export const DirectoryItem: coreHttp.CompositeMapper = { } }; -export const FileProperty: coreHttp.CompositeMapper = { +export const FileProperty: coreClient.CompositeMapper = { serializedName: "FileProperty", type: { name: "Composite", @@ -863,7 +863,7 @@ export const FileProperty: coreHttp.CompositeMapper = { } }; -export const FileItem: coreHttp.CompositeMapper = { +export const FileItem: coreClient.CompositeMapper = { serializedName: "FileItem", xmlName: "File", type: { @@ -911,7 +911,7 @@ export const FileItem: coreHttp.CompositeMapper = { } }; -export const ListHandlesResponse: coreHttp.CompositeMapper = { +export const ListHandlesResponse: coreClient.CompositeMapper = { serializedName: "ListHandlesResponse", xmlName: "EnumerationResults", type: { @@ -945,7 +945,7 @@ export const ListHandlesResponse: coreHttp.CompositeMapper = { } }; -export const HandleItem: coreHttp.CompositeMapper = { +export const HandleItem: coreClient.CompositeMapper = { serializedName: "HandleItem", xmlName: "Handle", type: { @@ -1018,7 +1018,7 @@ export const HandleItem: coreHttp.CompositeMapper = { } }; -export const ShareFileRangeList: coreHttp.CompositeMapper = { +export const ShareFileRangeList: coreClient.CompositeMapper = { serializedName: "ShareFileRangeList", type: { name: "Composite", @@ -1056,7 +1056,7 @@ export const ShareFileRangeList: coreHttp.CompositeMapper = { } }; -export const FileRange: coreHttp.CompositeMapper = { +export const FileRange: coreClient.CompositeMapper = { serializedName: "FileRange", xmlName: "Range", type: { @@ -1083,7 +1083,7 @@ export const FileRange: coreHttp.CompositeMapper = { } }; -export const ClearRange: coreHttp.CompositeMapper = { +export const ClearRange: coreClient.CompositeMapper = { serializedName: "ClearRange", xmlName: "ClearRange", type: { @@ -1110,7 +1110,7 @@ export const ClearRange: coreHttp.CompositeMapper = { } }; -export const ServiceSetPropertiesHeaders: coreHttp.CompositeMapper = { +export const ServiceSetPropertiesHeaders: coreClient.CompositeMapper = { serializedName: "Service_setPropertiesHeaders", type: { name: "Composite", @@ -1141,7 +1141,7 @@ export const ServiceSetPropertiesHeaders: coreHttp.CompositeMapper = { } }; -export const ServiceSetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { +export const ServiceSetPropertiesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Service_setPropertiesExceptionHeaders", type: { name: "Composite", @@ -1158,7 +1158,7 @@ export const ServiceSetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ServiceGetPropertiesHeaders: coreHttp.CompositeMapper = { +export const ServiceGetPropertiesHeaders: coreClient.CompositeMapper = { serializedName: "Service_getPropertiesHeaders", type: { name: "Composite", @@ -1189,7 +1189,7 @@ export const ServiceGetPropertiesHeaders: coreHttp.CompositeMapper = { } }; -export const ServiceGetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { +export const ServiceGetPropertiesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Service_getPropertiesExceptionHeaders", type: { name: "Composite", @@ -1206,7 +1206,7 @@ export const ServiceGetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ServiceListSharesSegmentHeaders: coreHttp.CompositeMapper = { +export const ServiceListSharesSegmentHeaders: coreClient.CompositeMapper = { serializedName: "Service_listSharesSegmentHeaders", type: { name: "Composite", @@ -1237,7 +1237,7 @@ export const ServiceListSharesSegmentHeaders: coreHttp.CompositeMapper = { } }; -export const ServiceListSharesSegmentExceptionHeaders: coreHttp.CompositeMapper = { +export const ServiceListSharesSegmentExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Service_listSharesSegmentExceptionHeaders", type: { name: "Composite", @@ -1254,7 +1254,7 @@ export const ServiceListSharesSegmentExceptionHeaders: coreHttp.CompositeMapper } }; -export const ShareCreateHeaders: coreHttp.CompositeMapper = { +export const ShareCreateHeaders: coreClient.CompositeMapper = { serializedName: "Share_createHeaders", type: { name: "Composite", @@ -1306,7 +1306,7 @@ export const ShareCreateHeaders: coreHttp.CompositeMapper = { } }; -export const ShareCreateExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareCreateExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_createExceptionHeaders", type: { name: "Composite", @@ -1323,7 +1323,7 @@ export const ShareCreateExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareGetPropertiesHeaders: coreHttp.CompositeMapper = { +export const ShareGetPropertiesHeaders: coreClient.CompositeMapper = { serializedName: "Share_getPropertiesHeaders", type: { name: "Composite", @@ -1331,12 +1331,12 @@ export const ShareGetPropertiesHeaders: coreHttp.CompositeMapper = { modelProperties: { metadata: { serializedName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", xmlName: "x-ms-meta", type: { name: "Dictionary", value: { type: { name: "String" } } - }, - headerCollectionPrefix: "x-ms-meta-" + } }, etag: { serializedName: "etag", @@ -1492,7 +1492,7 @@ export const ShareGetPropertiesHeaders: coreHttp.CompositeMapper = { } }; -export const ShareGetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareGetPropertiesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_getPropertiesExceptionHeaders", type: { name: "Composite", @@ -1509,7 +1509,7 @@ export const ShareGetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareDeleteHeaders: coreHttp.CompositeMapper = { +export const ShareDeleteHeaders: coreClient.CompositeMapper = { serializedName: "Share_deleteHeaders", type: { name: "Composite", @@ -1547,7 +1547,7 @@ export const ShareDeleteHeaders: coreHttp.CompositeMapper = { } }; -export const ShareDeleteExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareDeleteExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_deleteExceptionHeaders", type: { name: "Composite", @@ -1564,7 +1564,7 @@ export const ShareDeleteExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareAcquireLeaseHeaders: coreHttp.CompositeMapper = { +export const ShareAcquireLeaseHeaders: coreClient.CompositeMapper = { serializedName: "Share_acquireLeaseHeaders", type: { name: "Composite", @@ -1623,7 +1623,7 @@ export const ShareAcquireLeaseHeaders: coreHttp.CompositeMapper = { } }; -export const ShareAcquireLeaseExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareAcquireLeaseExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_acquireLeaseExceptionHeaders", type: { name: "Composite", @@ -1640,7 +1640,7 @@ export const ShareAcquireLeaseExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareReleaseLeaseHeaders: coreHttp.CompositeMapper = { +export const ShareReleaseLeaseHeaders: coreClient.CompositeMapper = { serializedName: "Share_releaseLeaseHeaders", type: { name: "Composite", @@ -1692,7 +1692,7 @@ export const ShareReleaseLeaseHeaders: coreHttp.CompositeMapper = { } }; -export const ShareReleaseLeaseExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareReleaseLeaseExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_releaseLeaseExceptionHeaders", type: { name: "Composite", @@ -1709,7 +1709,7 @@ export const ShareReleaseLeaseExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareChangeLeaseHeaders: coreHttp.CompositeMapper = { +export const ShareChangeLeaseHeaders: coreClient.CompositeMapper = { serializedName: "Share_changeLeaseHeaders", type: { name: "Composite", @@ -1768,7 +1768,7 @@ export const ShareChangeLeaseHeaders: coreHttp.CompositeMapper = { } }; -export const ShareChangeLeaseExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareChangeLeaseExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_changeLeaseExceptionHeaders", type: { name: "Composite", @@ -1785,7 +1785,7 @@ export const ShareChangeLeaseExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareRenewLeaseHeaders: coreHttp.CompositeMapper = { +export const ShareRenewLeaseHeaders: coreClient.CompositeMapper = { serializedName: "Share_renewLeaseHeaders", type: { name: "Composite", @@ -1844,7 +1844,7 @@ export const ShareRenewLeaseHeaders: coreHttp.CompositeMapper = { } }; -export const ShareRenewLeaseExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareRenewLeaseExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_renewLeaseExceptionHeaders", type: { name: "Composite", @@ -1861,7 +1861,7 @@ export const ShareRenewLeaseExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareBreakLeaseHeaders: coreHttp.CompositeMapper = { +export const ShareBreakLeaseHeaders: coreClient.CompositeMapper = { serializedName: "Share_breakLeaseHeaders", type: { name: "Composite", @@ -1927,7 +1927,7 @@ export const ShareBreakLeaseHeaders: coreHttp.CompositeMapper = { } }; -export const ShareBreakLeaseExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareBreakLeaseExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_breakLeaseExceptionHeaders", type: { name: "Composite", @@ -1944,7 +1944,7 @@ export const ShareBreakLeaseExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareCreateSnapshotHeaders: coreHttp.CompositeMapper = { +export const ShareCreateSnapshotHeaders: coreClient.CompositeMapper = { serializedName: "Share_createSnapshotHeaders", type: { name: "Composite", @@ -2003,7 +2003,7 @@ export const ShareCreateSnapshotHeaders: coreHttp.CompositeMapper = { } }; -export const ShareCreateSnapshotExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareCreateSnapshotExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_createSnapshotExceptionHeaders", type: { name: "Composite", @@ -2020,7 +2020,7 @@ export const ShareCreateSnapshotExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareCreatePermissionHeaders: coreHttp.CompositeMapper = { +export const ShareCreatePermissionHeaders: coreClient.CompositeMapper = { serializedName: "Share_createPermissionHeaders", type: { name: "Composite", @@ -2065,7 +2065,7 @@ export const ShareCreatePermissionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareCreatePermissionExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareCreatePermissionExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_createPermissionExceptionHeaders", type: { name: "Composite", @@ -2082,7 +2082,7 @@ export const ShareCreatePermissionExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareGetPermissionHeaders: coreHttp.CompositeMapper = { +export const ShareGetPermissionHeaders: coreClient.CompositeMapper = { serializedName: "Share_getPermissionHeaders", type: { name: "Composite", @@ -2120,7 +2120,7 @@ export const ShareGetPermissionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareGetPermissionExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareGetPermissionExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_getPermissionExceptionHeaders", type: { name: "Composite", @@ -2137,7 +2137,7 @@ export const ShareGetPermissionExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareSetPropertiesHeaders: coreHttp.CompositeMapper = { +export const ShareSetPropertiesHeaders: coreClient.CompositeMapper = { serializedName: "Share_setPropertiesHeaders", type: { name: "Composite", @@ -2189,7 +2189,7 @@ export const ShareSetPropertiesHeaders: coreHttp.CompositeMapper = { } }; -export const ShareSetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareSetPropertiesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_setPropertiesExceptionHeaders", type: { name: "Composite", @@ -2206,7 +2206,7 @@ export const ShareSetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareSetMetadataHeaders: coreHttp.CompositeMapper = { +export const ShareSetMetadataHeaders: coreClient.CompositeMapper = { serializedName: "Share_setMetadataHeaders", type: { name: "Composite", @@ -2258,7 +2258,7 @@ export const ShareSetMetadataHeaders: coreHttp.CompositeMapper = { } }; -export const ShareSetMetadataExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareSetMetadataExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_setMetadataExceptionHeaders", type: { name: "Composite", @@ -2275,7 +2275,7 @@ export const ShareSetMetadataExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareGetAccessPolicyHeaders: coreHttp.CompositeMapper = { +export const ShareGetAccessPolicyHeaders: coreClient.CompositeMapper = { serializedName: "Share_getAccessPolicyHeaders", type: { name: "Composite", @@ -2327,7 +2327,7 @@ export const ShareGetAccessPolicyHeaders: coreHttp.CompositeMapper = { } }; -export const ShareGetAccessPolicyExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareGetAccessPolicyExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_getAccessPolicyExceptionHeaders", type: { name: "Composite", @@ -2344,7 +2344,7 @@ export const ShareGetAccessPolicyExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareSetAccessPolicyHeaders: coreHttp.CompositeMapper = { +export const ShareSetAccessPolicyHeaders: coreClient.CompositeMapper = { serializedName: "Share_setAccessPolicyHeaders", type: { name: "Composite", @@ -2396,7 +2396,7 @@ export const ShareSetAccessPolicyHeaders: coreHttp.CompositeMapper = { } }; -export const ShareSetAccessPolicyExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareSetAccessPolicyExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_setAccessPolicyExceptionHeaders", type: { name: "Composite", @@ -2413,7 +2413,7 @@ export const ShareSetAccessPolicyExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareGetStatisticsHeaders: coreHttp.CompositeMapper = { +export const ShareGetStatisticsHeaders: coreClient.CompositeMapper = { serializedName: "Share_getStatisticsHeaders", type: { name: "Composite", @@ -2465,7 +2465,7 @@ export const ShareGetStatisticsHeaders: coreHttp.CompositeMapper = { } }; -export const ShareGetStatisticsExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareGetStatisticsExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_getStatisticsExceptionHeaders", type: { name: "Composite", @@ -2482,7 +2482,7 @@ export const ShareGetStatisticsExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const ShareRestoreHeaders: coreHttp.CompositeMapper = { +export const ShareRestoreHeaders: coreClient.CompositeMapper = { serializedName: "Share_restoreHeaders", type: { name: "Composite", @@ -2534,7 +2534,7 @@ export const ShareRestoreHeaders: coreHttp.CompositeMapper = { } }; -export const ShareRestoreExceptionHeaders: coreHttp.CompositeMapper = { +export const ShareRestoreExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Share_restoreExceptionHeaders", type: { name: "Composite", @@ -2551,7 +2551,7 @@ export const ShareRestoreExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryCreateHeaders: coreHttp.CompositeMapper = { +export const DirectoryCreateHeaders: coreClient.CompositeMapper = { serializedName: "Directory_createHeaders", type: { name: "Composite", @@ -2659,7 +2659,7 @@ export const DirectoryCreateHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryCreateExceptionHeaders: coreHttp.CompositeMapper = { +export const DirectoryCreateExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Directory_createExceptionHeaders", type: { name: "Composite", @@ -2676,7 +2676,7 @@ export const DirectoryCreateExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryGetPropertiesHeaders: coreHttp.CompositeMapper = { +export const DirectoryGetPropertiesHeaders: coreClient.CompositeMapper = { serializedName: "Directory_getPropertiesHeaders", type: { name: "Composite", @@ -2684,12 +2684,12 @@ export const DirectoryGetPropertiesHeaders: coreHttp.CompositeMapper = { modelProperties: { metadata: { serializedName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", xmlName: "x-ms-meta", type: { name: "Dictionary", value: { type: { name: "String" } } - }, - headerCollectionPrefix: "x-ms-meta-" + } }, etag: { serializedName: "etag", @@ -2793,7 +2793,7 @@ export const DirectoryGetPropertiesHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryGetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { +export const DirectoryGetPropertiesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Directory_getPropertiesExceptionHeaders", type: { name: "Composite", @@ -2810,7 +2810,7 @@ export const DirectoryGetPropertiesExceptionHeaders: coreHttp.CompositeMapper = } }; -export const DirectoryDeleteHeaders: coreHttp.CompositeMapper = { +export const DirectoryDeleteHeaders: coreClient.CompositeMapper = { serializedName: "Directory_deleteHeaders", type: { name: "Composite", @@ -2848,7 +2848,7 @@ export const DirectoryDeleteHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryDeleteExceptionHeaders: coreHttp.CompositeMapper = { +export const DirectoryDeleteExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Directory_deleteExceptionHeaders", type: { name: "Composite", @@ -2865,7 +2865,7 @@ export const DirectoryDeleteExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const DirectorySetPropertiesHeaders: coreHttp.CompositeMapper = { +export const DirectorySetPropertiesHeaders: coreClient.CompositeMapper = { serializedName: "Directory_setPropertiesHeaders", type: { name: "Composite", @@ -2973,7 +2973,7 @@ export const DirectorySetPropertiesHeaders: coreHttp.CompositeMapper = { } }; -export const DirectorySetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { +export const DirectorySetPropertiesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Directory_setPropertiesExceptionHeaders", type: { name: "Composite", @@ -2990,7 +2990,7 @@ export const DirectorySetPropertiesExceptionHeaders: coreHttp.CompositeMapper = } }; -export const DirectorySetMetadataHeaders: coreHttp.CompositeMapper = { +export const DirectorySetMetadataHeaders: coreClient.CompositeMapper = { serializedName: "Directory_setMetadataHeaders", type: { name: "Composite", @@ -3042,7 +3042,7 @@ export const DirectorySetMetadataHeaders: coreHttp.CompositeMapper = { } }; -export const DirectorySetMetadataExceptionHeaders: coreHttp.CompositeMapper = { +export const DirectorySetMetadataExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Directory_setMetadataExceptionHeaders", type: { name: "Composite", @@ -3059,7 +3059,7 @@ export const DirectorySetMetadataExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryListFilesAndDirectoriesSegmentHeaders: coreHttp.CompositeMapper = { +export const DirectoryListFilesAndDirectoriesSegmentHeaders: coreClient.CompositeMapper = { serializedName: "Directory_listFilesAndDirectoriesSegmentHeaders", type: { name: "Composite", @@ -3104,7 +3104,7 @@ export const DirectoryListFilesAndDirectoriesSegmentHeaders: coreHttp.CompositeM } }; -export const DirectoryListFilesAndDirectoriesSegmentExceptionHeaders: coreHttp.CompositeMapper = { +export const DirectoryListFilesAndDirectoriesSegmentExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Directory_listFilesAndDirectoriesSegmentExceptionHeaders", type: { name: "Composite", @@ -3121,7 +3121,7 @@ export const DirectoryListFilesAndDirectoriesSegmentExceptionHeaders: coreHttp.C } }; -export const DirectoryListHandlesHeaders: coreHttp.CompositeMapper = { +export const DirectoryListHandlesHeaders: coreClient.CompositeMapper = { serializedName: "Directory_listHandlesHeaders", type: { name: "Composite", @@ -3166,7 +3166,7 @@ export const DirectoryListHandlesHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryListHandlesExceptionHeaders: coreHttp.CompositeMapper = { +export const DirectoryListHandlesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Directory_listHandlesExceptionHeaders", type: { name: "Composite", @@ -3183,7 +3183,7 @@ export const DirectoryListHandlesExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryForceCloseHandlesHeaders: coreHttp.CompositeMapper = { +export const DirectoryForceCloseHandlesHeaders: coreClient.CompositeMapper = { serializedName: "Directory_forceCloseHandlesHeaders", type: { name: "Composite", @@ -3242,7 +3242,7 @@ export const DirectoryForceCloseHandlesHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryForceCloseHandlesExceptionHeaders: coreHttp.CompositeMapper = { +export const DirectoryForceCloseHandlesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Directory_forceCloseHandlesExceptionHeaders", type: { name: "Composite", @@ -3259,7 +3259,7 @@ export const DirectoryForceCloseHandlesExceptionHeaders: coreHttp.CompositeMappe } }; -export const DirectoryRenameHeaders: coreHttp.CompositeMapper = { +export const DirectoryRenameHeaders: coreClient.CompositeMapper = { serializedName: "Directory_renameHeaders", type: { name: "Composite", @@ -3360,7 +3360,7 @@ export const DirectoryRenameHeaders: coreHttp.CompositeMapper = { } }; -export const DirectoryRenameExceptionHeaders: coreHttp.CompositeMapper = { +export const DirectoryRenameExceptionHeaders: coreClient.CompositeMapper = { serializedName: "Directory_renameExceptionHeaders", type: { name: "Composite", @@ -3377,7 +3377,7 @@ export const DirectoryRenameExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileCreateHeaders: coreHttp.CompositeMapper = { +export const FileCreateHeaders: coreClient.CompositeMapper = { serializedName: "File_createHeaders", type: { name: "Composite", @@ -3485,7 +3485,7 @@ export const FileCreateHeaders: coreHttp.CompositeMapper = { } }; -export const FileCreateExceptionHeaders: coreHttp.CompositeMapper = { +export const FileCreateExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_createExceptionHeaders", type: { name: "Composite", @@ -3502,7 +3502,7 @@ export const FileCreateExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileDownloadHeaders: coreHttp.CompositeMapper = { +export const FileDownloadHeaders: coreClient.CompositeMapper = { serializedName: "File_downloadHeaders", type: { name: "Composite", @@ -3517,12 +3517,12 @@ export const FileDownloadHeaders: coreHttp.CompositeMapper = { }, metadata: { serializedName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", xmlName: "x-ms-meta", type: { name: "Dictionary", value: { type: { name: "String" } } - }, - headerCollectionPrefix: "x-ms-meta-" + } }, contentLength: { serializedName: "content-length", @@ -3762,7 +3762,7 @@ export const FileDownloadHeaders: coreHttp.CompositeMapper = { } }; -export const FileDownloadExceptionHeaders: coreHttp.CompositeMapper = { +export const FileDownloadExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_downloadExceptionHeaders", type: { name: "Composite", @@ -3779,7 +3779,7 @@ export const FileDownloadExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileGetPropertiesHeaders: coreHttp.CompositeMapper = { +export const FileGetPropertiesHeaders: coreClient.CompositeMapper = { serializedName: "File_getPropertiesHeaders", type: { name: "Composite", @@ -3794,12 +3794,12 @@ export const FileGetPropertiesHeaders: coreHttp.CompositeMapper = { }, metadata: { serializedName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", xmlName: "x-ms-meta", type: { name: "Dictionary", value: { type: { name: "String" } } - }, - headerCollectionPrefix: "x-ms-meta-" + } }, fileType: { serializedName: "x-ms-type", @@ -4025,7 +4025,7 @@ export const FileGetPropertiesHeaders: coreHttp.CompositeMapper = { } }; -export const FileGetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { +export const FileGetPropertiesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_getPropertiesExceptionHeaders", type: { name: "Composite", @@ -4042,7 +4042,7 @@ export const FileGetPropertiesExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileDeleteHeaders: coreHttp.CompositeMapper = { +export const FileDeleteHeaders: coreClient.CompositeMapper = { serializedName: "File_deleteHeaders", type: { name: "Composite", @@ -4080,7 +4080,7 @@ export const FileDeleteHeaders: coreHttp.CompositeMapper = { } }; -export const FileDeleteExceptionHeaders: coreHttp.CompositeMapper = { +export const FileDeleteExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_deleteExceptionHeaders", type: { name: "Composite", @@ -4097,7 +4097,7 @@ export const FileDeleteExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileSetHttpHeadersHeaders: coreHttp.CompositeMapper = { +export const FileSetHttpHeadersHeaders: coreClient.CompositeMapper = { serializedName: "File_setHttpHeadersHeaders", type: { name: "Composite", @@ -4205,7 +4205,7 @@ export const FileSetHttpHeadersHeaders: coreHttp.CompositeMapper = { } }; -export const FileSetHttpHeadersExceptionHeaders: coreHttp.CompositeMapper = { +export const FileSetHttpHeadersExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_setHttpHeadersExceptionHeaders", type: { name: "Composite", @@ -4222,7 +4222,7 @@ export const FileSetHttpHeadersExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileSetMetadataHeaders: coreHttp.CompositeMapper = { +export const FileSetMetadataHeaders: coreClient.CompositeMapper = { serializedName: "File_setMetadataHeaders", type: { name: "Composite", @@ -4274,7 +4274,7 @@ export const FileSetMetadataHeaders: coreHttp.CompositeMapper = { } }; -export const FileSetMetadataExceptionHeaders: coreHttp.CompositeMapper = { +export const FileSetMetadataExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_setMetadataExceptionHeaders", type: { name: "Composite", @@ -4291,7 +4291,7 @@ export const FileSetMetadataExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileAcquireLeaseHeaders: coreHttp.CompositeMapper = { +export const FileAcquireLeaseHeaders: coreClient.CompositeMapper = { serializedName: "File_acquireLeaseHeaders", type: { name: "Composite", @@ -4350,7 +4350,7 @@ export const FileAcquireLeaseHeaders: coreHttp.CompositeMapper = { } }; -export const FileAcquireLeaseExceptionHeaders: coreHttp.CompositeMapper = { +export const FileAcquireLeaseExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_acquireLeaseExceptionHeaders", type: { name: "Composite", @@ -4367,7 +4367,7 @@ export const FileAcquireLeaseExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileReleaseLeaseHeaders: coreHttp.CompositeMapper = { +export const FileReleaseLeaseHeaders: coreClient.CompositeMapper = { serializedName: "File_releaseLeaseHeaders", type: { name: "Composite", @@ -4419,7 +4419,7 @@ export const FileReleaseLeaseHeaders: coreHttp.CompositeMapper = { } }; -export const FileReleaseLeaseExceptionHeaders: coreHttp.CompositeMapper = { +export const FileReleaseLeaseExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_releaseLeaseExceptionHeaders", type: { name: "Composite", @@ -4436,7 +4436,7 @@ export const FileReleaseLeaseExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileChangeLeaseHeaders: coreHttp.CompositeMapper = { +export const FileChangeLeaseHeaders: coreClient.CompositeMapper = { serializedName: "File_changeLeaseHeaders", type: { name: "Composite", @@ -4495,7 +4495,7 @@ export const FileChangeLeaseHeaders: coreHttp.CompositeMapper = { } }; -export const FileChangeLeaseExceptionHeaders: coreHttp.CompositeMapper = { +export const FileChangeLeaseExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_changeLeaseExceptionHeaders", type: { name: "Composite", @@ -4512,7 +4512,7 @@ export const FileChangeLeaseExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileBreakLeaseHeaders: coreHttp.CompositeMapper = { +export const FileBreakLeaseHeaders: coreClient.CompositeMapper = { serializedName: "File_breakLeaseHeaders", type: { name: "Composite", @@ -4571,7 +4571,7 @@ export const FileBreakLeaseHeaders: coreHttp.CompositeMapper = { } }; -export const FileBreakLeaseExceptionHeaders: coreHttp.CompositeMapper = { +export const FileBreakLeaseExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_breakLeaseExceptionHeaders", type: { name: "Composite", @@ -4588,7 +4588,7 @@ export const FileBreakLeaseExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileUploadRangeHeaders: coreHttp.CompositeMapper = { +export const FileUploadRangeHeaders: coreClient.CompositeMapper = { serializedName: "File_uploadRangeHeaders", type: { name: "Composite", @@ -4661,7 +4661,7 @@ export const FileUploadRangeHeaders: coreHttp.CompositeMapper = { } }; -export const FileUploadRangeExceptionHeaders: coreHttp.CompositeMapper = { +export const FileUploadRangeExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_uploadRangeExceptionHeaders", type: { name: "Composite", @@ -4678,7 +4678,7 @@ export const FileUploadRangeExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileUploadRangeFromURLHeaders: coreHttp.CompositeMapper = { +export const FileUploadRangeFromURLHeaders: coreClient.CompositeMapper = { serializedName: "File_uploadRangeFromURLHeaders", type: { name: "Composite", @@ -4751,7 +4751,7 @@ export const FileUploadRangeFromURLHeaders: coreHttp.CompositeMapper = { } }; -export const FileUploadRangeFromURLExceptionHeaders: coreHttp.CompositeMapper = { +export const FileUploadRangeFromURLExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_uploadRangeFromURLExceptionHeaders", type: { name: "Composite", @@ -4768,7 +4768,7 @@ export const FileUploadRangeFromURLExceptionHeaders: coreHttp.CompositeMapper = } }; -export const FileGetRangeListHeaders: coreHttp.CompositeMapper = { +export const FileGetRangeListHeaders: coreClient.CompositeMapper = { serializedName: "File_getRangeListHeaders", type: { name: "Composite", @@ -4827,7 +4827,7 @@ export const FileGetRangeListHeaders: coreHttp.CompositeMapper = { } }; -export const FileGetRangeListExceptionHeaders: coreHttp.CompositeMapper = { +export const FileGetRangeListExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_getRangeListExceptionHeaders", type: { name: "Composite", @@ -4844,7 +4844,7 @@ export const FileGetRangeListExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileStartCopyHeaders: coreHttp.CompositeMapper = { +export const FileStartCopyHeaders: coreClient.CompositeMapper = { serializedName: "File_startCopyHeaders", type: { name: "Composite", @@ -4911,7 +4911,7 @@ export const FileStartCopyHeaders: coreHttp.CompositeMapper = { } }; -export const FileStartCopyExceptionHeaders: coreHttp.CompositeMapper = { +export const FileStartCopyExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_startCopyExceptionHeaders", type: { name: "Composite", @@ -4928,7 +4928,7 @@ export const FileStartCopyExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileAbortCopyHeaders: coreHttp.CompositeMapper = { +export const FileAbortCopyHeaders: coreClient.CompositeMapper = { serializedName: "File_abortCopyHeaders", type: { name: "Composite", @@ -4966,7 +4966,7 @@ export const FileAbortCopyHeaders: coreHttp.CompositeMapper = { } }; -export const FileAbortCopyExceptionHeaders: coreHttp.CompositeMapper = { +export const FileAbortCopyExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_abortCopyExceptionHeaders", type: { name: "Composite", @@ -4983,7 +4983,7 @@ export const FileAbortCopyExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileListHandlesHeaders: coreHttp.CompositeMapper = { +export const FileListHandlesHeaders: coreClient.CompositeMapper = { serializedName: "File_listHandlesHeaders", type: { name: "Composite", @@ -5028,7 +5028,7 @@ export const FileListHandlesHeaders: coreHttp.CompositeMapper = { } }; -export const FileListHandlesExceptionHeaders: coreHttp.CompositeMapper = { +export const FileListHandlesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_listHandlesExceptionHeaders", type: { name: "Composite", @@ -5045,7 +5045,7 @@ export const FileListHandlesExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileForceCloseHandlesHeaders: coreHttp.CompositeMapper = { +export const FileForceCloseHandlesHeaders: coreClient.CompositeMapper = { serializedName: "File_forceCloseHandlesHeaders", type: { name: "Composite", @@ -5104,7 +5104,7 @@ export const FileForceCloseHandlesHeaders: coreHttp.CompositeMapper = { } }; -export const FileForceCloseHandlesExceptionHeaders: coreHttp.CompositeMapper = { +export const FileForceCloseHandlesExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_forceCloseHandlesExceptionHeaders", type: { name: "Composite", @@ -5121,7 +5121,7 @@ export const FileForceCloseHandlesExceptionHeaders: coreHttp.CompositeMapper = { } }; -export const FileRenameHeaders: coreHttp.CompositeMapper = { +export const FileRenameHeaders: coreClient.CompositeMapper = { serializedName: "File_renameHeaders", type: { name: "Composite", @@ -5222,7 +5222,7 @@ export const FileRenameHeaders: coreHttp.CompositeMapper = { } }; -export const FileRenameExceptionHeaders: coreHttp.CompositeMapper = { +export const FileRenameExceptionHeaders: coreClient.CompositeMapper = { serializedName: "File_renameExceptionHeaders", type: { name: "Composite", diff --git a/sdk/storage/storage-file-share/src/generated/src/models/parameters.ts b/sdk/storage/storage-file-share/src/generated/src/models/parameters.ts index 4e1b76744ce6..f0ba6ceae360 100644 --- a/sdk/storage/storage-file-share/src/generated/src/models/parameters.ts +++ b/sdk/storage/storage-file-share/src/generated/src/models/parameters.ts @@ -9,9 +9,8 @@ import { OperationParameter, OperationURLParameter, - OperationQueryParameter, - QueryCollectionFormat -} from "@azure/core-http"; + OperationQueryParameter +} from "@azure/core-client"; import { FileServiceProperties as FileServicePropertiesMapper, SharePermission as SharePermissionMapper @@ -185,7 +184,7 @@ export const include: OperationQueryParameter = { } } }, - collectionFormat: QueryCollectionFormat.Csv + collectionFormat: "CSV" }; export const restype1: OperationQueryParameter = { @@ -205,11 +204,11 @@ export const metadata: OperationParameter = { mapper: { serializedName: "x-ms-meta", xmlName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", type: { name: "Dictionary", value: { type: { name: "String" } } - }, - headerCollectionPrefix: "x-ms-meta-" + } } }; @@ -661,7 +660,7 @@ export const include1: OperationQueryParameter = { } } }, - collectionFormat: QueryCollectionFormat.Csv + collectionFormat: "CSV" }; export const includeExtendedInfo: OperationParameter = { diff --git a/sdk/storage/storage-file-share/src/generated/src/operations/directory.ts b/sdk/storage/storage-file-share/src/generated/src/operations/directory.ts index 31e729736a48..cafe0baac7ac 100644 --- a/sdk/storage/storage-file-share/src/generated/src/operations/directory.ts +++ b/sdk/storage/storage-file-share/src/generated/src/operations/directory.ts @@ -6,10 +6,11 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import * as coreHttp from "@azure/core-http"; +import { Directory } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; import * as Mappers from "../models/mappers"; import * as Parameters from "../models/parameters"; -import { StorageClientContext } from "../storageClientContext"; +import { StorageClient } from "../storageClient"; import { DirectoryCreateOptionalParams, DirectoryCreateResponse, @@ -31,15 +32,15 @@ import { DirectoryRenameResponse } from "../models"; -/** Class representing a Directory. */ -export class Directory { - private readonly client: StorageClientContext; +/** Class containing Directory operations. */ +export class DirectoryImpl implements Directory { + private readonly client: StorageClient; /** * Initialize a new instance of the class Directory class. * @param client Reference to the service client */ - constructor(client: StorageClientContext) { + constructor(client: StorageClient) { this.client = client; } @@ -53,14 +54,10 @@ export class Directory { fileAttributes: string, options?: DirectoryCreateOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - fileAttributes, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { fileAttributes, options }, createOperationSpec - ) as Promise; + ); } /** @@ -72,13 +69,10 @@ export class Directory { getProperties( options?: DirectoryGetPropertiesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, getPropertiesOperationSpec - ) as Promise; + ); } /** @@ -89,13 +83,7 @@ export class Directory { delete( options?: DirectoryDeleteOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; - return this.client.sendOperationRequest( - operationArguments, - deleteOperationSpec - ) as Promise; + return this.client.sendOperationRequest({ options }, deleteOperationSpec); } /** @@ -108,14 +96,10 @@ export class Directory { fileAttributes: string, options?: DirectorySetPropertiesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - fileAttributes, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { fileAttributes, options }, setPropertiesOperationSpec - ) as Promise; + ); } /** @@ -125,13 +109,10 @@ export class Directory { setMetadata( options?: DirectorySetMetadataOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, setMetadataOperationSpec - ) as Promise; + ); } /** @@ -142,13 +123,10 @@ export class Directory { listFilesAndDirectoriesSegment( options?: DirectoryListFilesAndDirectoriesSegmentOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, listFilesAndDirectoriesSegmentOperationSpec - ) as Promise; + ); } /** @@ -158,13 +136,10 @@ export class Directory { listHandles( options?: DirectoryListHandlesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, listHandlesOperationSpec - ) as Promise; + ); } /** @@ -177,14 +152,10 @@ export class Directory { handleId: string, options?: DirectoryForceCloseHandlesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - handleId, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { handleId, options }, forceCloseHandlesOperationSpec - ) as Promise; + ); } /** @@ -196,20 +167,16 @@ export class Directory { renameSource: string, options?: DirectoryRenameOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - renameSource, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { renameSource, options }, renameOperationSpec - ) as Promise; + ); } } // Operation Specifications -const xmlSerializer = new coreHttp.Serializer(Mappers, /* isXml */ true); +const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true); -const createOperationSpec: coreHttp.OperationSpec = { +const createOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}", httpMethod: "PUT", responses: { @@ -237,7 +204,7 @@ const createOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const getPropertiesOperationSpec: coreHttp.OperationSpec = { +const getPropertiesOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}", httpMethod: "GET", responses: { @@ -259,7 +226,7 @@ const getPropertiesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const deleteOperationSpec: coreHttp.OperationSpec = { +const deleteOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}", httpMethod: "DELETE", responses: { @@ -277,7 +244,7 @@ const deleteOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const setPropertiesOperationSpec: coreHttp.OperationSpec = { +const setPropertiesOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}", httpMethod: "PUT", responses: { @@ -308,7 +275,7 @@ const setPropertiesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const setMetadataOperationSpec: coreHttp.OperationSpec = { +const setMetadataOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}", httpMethod: "PUT", responses: { @@ -334,7 +301,7 @@ const setMetadataOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const listFilesAndDirectoriesSegmentOperationSpec: coreHttp.OperationSpec = { +const listFilesAndDirectoriesSegmentOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}", httpMethod: "GET", responses: { @@ -367,7 +334,7 @@ const listFilesAndDirectoriesSegmentOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const listHandlesOperationSpec: coreHttp.OperationSpec = { +const listHandlesOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}", httpMethod: "GET", responses: { @@ -396,7 +363,7 @@ const listHandlesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const forceCloseHandlesOperationSpec: coreHttp.OperationSpec = { +const forceCloseHandlesOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}", httpMethod: "PUT", responses: { @@ -424,7 +391,7 @@ const forceCloseHandlesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const renameOperationSpec: coreHttp.OperationSpec = { +const renameOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}", httpMethod: "PUT", responses: { diff --git a/sdk/storage/storage-file-share/src/generated/src/operations/file.ts b/sdk/storage/storage-file-share/src/generated/src/operations/file.ts index 2be94e762022..5cc35fade523 100644 --- a/sdk/storage/storage-file-share/src/generated/src/operations/file.ts +++ b/sdk/storage/storage-file-share/src/generated/src/operations/file.ts @@ -6,10 +6,11 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import * as coreHttp from "@azure/core-http"; +import { File } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; import * as Mappers from "../models/mappers"; import * as Parameters from "../models/parameters"; -import { StorageClientContext } from "../storageClientContext"; +import { StorageClient } from "../storageClient"; import { FileCreateOptionalParams, FileCreateResponse, @@ -50,15 +51,15 @@ import { FileRenameResponse } from "../models"; -/** Class representing a File. */ -export class File { - private readonly client: StorageClientContext; +/** Class containing File operations. */ +export class FileImpl implements File { + private readonly client: StorageClient; /** * Initialize a new instance of the class File class. * @param client Reference to the service client */ - constructor(client: StorageClientContext) { + constructor(client: StorageClient) { this.client = client; } @@ -74,15 +75,10 @@ export class File { fileAttributes: string, options?: FileCreateOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - fileContentLength, - fileAttributes, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { fileContentLength, fileAttributes, options }, createOperationSpec - ) as Promise; + ); } /** @@ -92,13 +88,7 @@ export class File { download( options?: FileDownloadOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; - return this.client.sendOperationRequest( - operationArguments, - downloadOperationSpec - ) as Promise; + return this.client.sendOperationRequest({ options }, downloadOperationSpec); } /** @@ -109,13 +99,10 @@ export class File { getProperties( options?: FileGetPropertiesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, getPropertiesOperationSpec - ) as Promise; + ); } /** @@ -123,13 +110,7 @@ export class File { * @param options The options parameters. */ delete(options?: FileDeleteOptionalParams): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; - return this.client.sendOperationRequest( - operationArguments, - deleteOperationSpec - ) as Promise; + return this.client.sendOperationRequest({ options }, deleteOperationSpec); } /** @@ -142,14 +123,10 @@ export class File { fileAttributes: string, options?: FileSetHttpHeadersOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - fileAttributes, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { fileAttributes, options }, setHttpHeadersOperationSpec - ) as Promise; + ); } /** @@ -159,13 +136,10 @@ export class File { setMetadata( options?: FileSetMetadataOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, setMetadataOperationSpec - ) as Promise; + ); } /** @@ -176,13 +150,10 @@ export class File { acquireLease( options?: FileAcquireLeaseOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, acquireLeaseOperationSpec - ) as Promise; + ); } /** @@ -195,14 +166,10 @@ export class File { leaseId: string, options?: FileReleaseLeaseOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - leaseId, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { leaseId, options }, releaseLeaseOperationSpec - ) as Promise; + ); } /** @@ -215,14 +182,10 @@ export class File { leaseId: string, options?: FileChangeLeaseOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - leaseId, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { leaseId, options }, changeLeaseOperationSpec - ) as Promise; + ); } /** @@ -233,13 +196,10 @@ export class File { breakLease( options?: FileBreakLeaseOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, breakLeaseOperationSpec - ) as Promise; + ); } /** @@ -264,16 +224,10 @@ export class File { contentLength: number, options?: FileUploadRangeOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - range, - fileRangeWrite, - contentLength, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { range, fileRangeWrite, contentLength, options }, uploadRangeOperationSpec - ) as Promise; + ); } /** @@ -295,16 +249,10 @@ export class File { contentLength: number, options?: FileUploadRangeFromURLOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - range, - copySource, - contentLength, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { range, copySource, contentLength, options }, uploadRangeFromURLOperationSpec - ) as Promise; + ); } /** @@ -314,13 +262,10 @@ export class File { getRangeList( options?: FileGetRangeListOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, getRangeListOperationSpec - ) as Promise; + ); } /** @@ -337,14 +282,10 @@ export class File { copySource: string, options?: FileStartCopyOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - copySource, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { copySource, options }, startCopyOperationSpec - ) as Promise; + ); } /** @@ -358,14 +299,10 @@ export class File { copyId: string, options?: FileAbortCopyOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - copyId, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { copyId, options }, abortCopyOperationSpec - ) as Promise; + ); } /** @@ -375,13 +312,10 @@ export class File { listHandles( options?: FileListHandlesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, listHandlesOperationSpec - ) as Promise; + ); } /** @@ -394,14 +328,10 @@ export class File { handleId: string, options?: FileForceCloseHandlesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - handleId, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { handleId, options }, forceCloseHandlesOperationSpec - ) as Promise; + ); } /** @@ -413,20 +343,16 @@ export class File { renameSource: string, options?: FileRenameOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - renameSource, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { renameSource, options }, renameOperationSpec - ) as Promise; + ); } } // Operation Specifications -const xmlSerializer = new coreHttp.Serializer(Mappers, /* isXml */ true); +const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true); -const createOperationSpec: coreHttp.OperationSpec = { +const createOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -463,7 +389,7 @@ const createOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const downloadOperationSpec: coreHttp.OperationSpec = { +const downloadOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "GET", responses: { @@ -498,7 +424,7 @@ const downloadOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const getPropertiesOperationSpec: coreHttp.OperationSpec = { +const getPropertiesOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "HEAD", responses: { @@ -520,7 +446,7 @@ const getPropertiesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const deleteOperationSpec: coreHttp.OperationSpec = { +const deleteOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "DELETE", responses: { @@ -542,7 +468,7 @@ const deleteOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const setHttpHeadersOperationSpec: coreHttp.OperationSpec = { +const setHttpHeadersOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -577,7 +503,7 @@ const setHttpHeadersOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const setMetadataOperationSpec: coreHttp.OperationSpec = { +const setMetadataOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -600,7 +526,7 @@ const setMetadataOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const acquireLeaseOperationSpec: coreHttp.OperationSpec = { +const acquireLeaseOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -625,7 +551,7 @@ const acquireLeaseOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const releaseLeaseOperationSpec: coreHttp.OperationSpec = { +const releaseLeaseOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -649,7 +575,7 @@ const releaseLeaseOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const changeLeaseOperationSpec: coreHttp.OperationSpec = { +const changeLeaseOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -674,7 +600,7 @@ const changeLeaseOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const breakLeaseOperationSpec: coreHttp.OperationSpec = { +const breakLeaseOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -698,7 +624,7 @@ const breakLeaseOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const uploadRangeOperationSpec: coreHttp.OperationSpec = { +const uploadRangeOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -723,12 +649,13 @@ const uploadRangeOperationSpec: coreHttp.OperationSpec = { Parameters.contentLength, Parameters.contentMD5, Parameters.fileLastWrittenMode - ], - contentType: "application/octet-stream", + ], isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "binary", serializer: xmlSerializer }; -const uploadRangeFromURLOperationSpec: coreHttp.OperationSpec = { +const uploadRangeFromURLOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -760,7 +687,7 @@ const uploadRangeFromURLOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const getRangeListOperationSpec: coreHttp.OperationSpec = { +const getRangeListOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "GET", responses: { @@ -789,7 +716,7 @@ const getRangeListOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const startCopyOperationSpec: coreHttp.OperationSpec = { +const startCopyOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -822,7 +749,7 @@ const startCopyOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const abortCopyOperationSpec: coreHttp.OperationSpec = { +const abortCopyOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -849,7 +776,7 @@ const abortCopyOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const listHandlesOperationSpec: coreHttp.OperationSpec = { +const listHandlesOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "GET", responses: { @@ -874,7 +801,7 @@ const listHandlesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const forceCloseHandlesOperationSpec: coreHttp.OperationSpec = { +const forceCloseHandlesOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { @@ -901,7 +828,7 @@ const forceCloseHandlesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const renameOperationSpec: coreHttp.OperationSpec = { +const renameOperationSpec: coreClient.OperationSpec = { path: "/{shareName}/{directory}/{fileName}", httpMethod: "PUT", responses: { diff --git a/sdk/storage/storage-file-share/src/generated/src/operations/service.ts b/sdk/storage/storage-file-share/src/generated/src/operations/service.ts index 01d6cecece7e..4ad67b80ede6 100644 --- a/sdk/storage/storage-file-share/src/generated/src/operations/service.ts +++ b/sdk/storage/storage-file-share/src/generated/src/operations/service.ts @@ -6,10 +6,11 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import * as coreHttp from "@azure/core-http"; +import { Service } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; import * as Mappers from "../models/mappers"; import * as Parameters from "../models/parameters"; -import { StorageClientContext } from "../storageClientContext"; +import { StorageClient } from "../storageClient"; import { FileServiceProperties, ServiceSetPropertiesOptionalParams, @@ -20,15 +21,15 @@ import { ServiceListSharesSegmentResponse } from "../models"; -/** Class representing a Service. */ -export class Service { - private readonly client: StorageClientContext; +/** Class containing Service operations. */ +export class ServiceImpl implements Service { + private readonly client: StorageClient; /** * Initialize a new instance of the class Service class. * @param client Reference to the service client */ - constructor(client: StorageClientContext) { + constructor(client: StorageClient) { this.client = client; } @@ -42,14 +43,10 @@ export class Service { properties: FileServiceProperties, options?: ServiceSetPropertiesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - properties, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { properties, options }, setPropertiesOperationSpec - ) as Promise; + ); } /** @@ -60,13 +57,10 @@ export class Service { getProperties( options?: ServiceGetPropertiesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, getPropertiesOperationSpec - ) as Promise; + ); } /** @@ -77,19 +71,16 @@ export class Service { listSharesSegment( options?: ServiceListSharesSegmentOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, listSharesSegmentOperationSpec - ) as Promise; + ); } } // Operation Specifications -const xmlSerializer = new coreHttp.Serializer(Mappers, /* isXml */ true); +const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true); -const setPropertiesOperationSpec: coreHttp.OperationSpec = { +const setPropertiesOperationSpec: coreClient.OperationSpec = { path: "/", httpMethod: "PUT", responses: { @@ -118,7 +109,7 @@ const setPropertiesOperationSpec: coreHttp.OperationSpec = { mediaType: "xml", serializer: xmlSerializer }; -const getPropertiesOperationSpec: coreHttp.OperationSpec = { +const getPropertiesOperationSpec: coreClient.OperationSpec = { path: "/", httpMethod: "GET", responses: { @@ -141,7 +132,7 @@ const getPropertiesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const listSharesSegmentOperationSpec: coreHttp.OperationSpec = { +const listSharesSegmentOperationSpec: coreClient.OperationSpec = { path: "/", httpMethod: "GET", responses: { diff --git a/sdk/storage/storage-file-share/src/generated/src/operations/share.ts b/sdk/storage/storage-file-share/src/generated/src/operations/share.ts index 16c6d57c016a..2e7de36f391d 100644 --- a/sdk/storage/storage-file-share/src/generated/src/operations/share.ts +++ b/sdk/storage/storage-file-share/src/generated/src/operations/share.ts @@ -6,10 +6,11 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import * as coreHttp from "@azure/core-http"; +import { Share } from "../operationsInterfaces"; +import * as coreClient from "@azure/core-client"; import * as Mappers from "../models/mappers"; import * as Parameters from "../models/parameters"; -import { StorageClientContext } from "../storageClientContext"; +import { StorageClient } from "../storageClient"; import { ShareCreateOptionalParams, ShareCreateResponse, @@ -48,15 +49,15 @@ import { ShareRestoreResponse } from "../models"; -/** Class representing a Share. */ -export class Share { - private readonly client: StorageClientContext; +/** Class containing Share operations. */ +export class ShareImpl implements Share { + private readonly client: StorageClient; /** * Initialize a new instance of the class Share class. * @param client Reference to the service client */ - constructor(client: StorageClientContext) { + constructor(client: StorageClient) { this.client = client; } @@ -66,13 +67,7 @@ export class Share { * @param options The options parameters. */ create(options?: ShareCreateOptionalParams): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; - return this.client.sendOperationRequest( - operationArguments, - createOperationSpec - ) as Promise; + return this.client.sendOperationRequest({ options }, createOperationSpec); } /** @@ -83,13 +78,10 @@ export class Share { getProperties( options?: ShareGetPropertiesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, getPropertiesOperationSpec - ) as Promise; + ); } /** @@ -98,13 +90,7 @@ export class Share { * @param options The options parameters. */ delete(options?: ShareDeleteOptionalParams): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; - return this.client.sendOperationRequest( - operationArguments, - deleteOperationSpec - ) as Promise; + return this.client.sendOperationRequest({ options }, deleteOperationSpec); } /** @@ -115,13 +101,10 @@ export class Share { acquireLease( options?: ShareAcquireLeaseOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, acquireLeaseOperationSpec - ) as Promise; + ); } /** @@ -134,14 +117,10 @@ export class Share { leaseId: string, options?: ShareReleaseLeaseOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - leaseId, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { leaseId, options }, releaseLeaseOperationSpec - ) as Promise; + ); } /** @@ -154,14 +133,10 @@ export class Share { leaseId: string, options?: ShareChangeLeaseOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - leaseId, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { leaseId, options }, changeLeaseOperationSpec - ) as Promise; + ); } /** @@ -174,14 +149,10 @@ export class Share { leaseId: string, options?: ShareRenewLeaseOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - leaseId, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { leaseId, options }, renewLeaseOperationSpec - ) as Promise; + ); } /** @@ -192,13 +163,10 @@ export class Share { breakLease( options?: ShareBreakLeaseOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, breakLeaseOperationSpec - ) as Promise; + ); } /** @@ -208,13 +176,10 @@ export class Share { createSnapshot( options?: ShareCreateSnapshotOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, createSnapshotOperationSpec - ) as Promise; + ); } /** @@ -226,14 +191,10 @@ export class Share { sharePermission: SharePermission, options?: ShareCreatePermissionOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - sharePermission, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { sharePermission, options }, createPermissionOperationSpec - ) as Promise; + ); } /** @@ -245,14 +206,10 @@ export class Share { filePermissionKey: string, options?: ShareGetPermissionOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - filePermissionKey, - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { filePermissionKey, options }, getPermissionOperationSpec - ) as Promise; + ); } /** @@ -262,13 +219,10 @@ export class Share { setProperties( options?: ShareSetPropertiesOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, setPropertiesOperationSpec - ) as Promise; + ); } /** @@ -278,13 +232,10 @@ export class Share { setMetadata( options?: ShareSetMetadataOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, setMetadataOperationSpec - ) as Promise; + ); } /** @@ -294,13 +245,10 @@ export class Share { getAccessPolicy( options?: ShareGetAccessPolicyOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, getAccessPolicyOperationSpec - ) as Promise; + ); } /** @@ -310,13 +258,10 @@ export class Share { setAccessPolicy( options?: ShareSetAccessPolicyOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, setAccessPolicyOperationSpec - ) as Promise; + ); } /** @@ -326,13 +271,10 @@ export class Share { getStatistics( options?: ShareGetStatisticsOptionalParams ): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; return this.client.sendOperationRequest( - operationArguments, + { options }, getStatisticsOperationSpec - ) as Promise; + ); } /** @@ -340,21 +282,15 @@ export class Share { * @param options The options parameters. */ restore(options?: ShareRestoreOptionalParams): Promise { - const operationArguments: coreHttp.OperationArguments = { - options: coreHttp.operationOptionsToRequestOptionsBase(options || {}) - }; - return this.client.sendOperationRequest( - operationArguments, - restoreOperationSpec - ) as Promise; + return this.client.sendOperationRequest({ options }, restoreOperationSpec); } } // Operation Specifications -const xmlSerializer = new coreHttp.Serializer(Mappers, /* isXml */ true); +const xmlSerializer = coreClient.createSerializer(Mappers, /* isXml */ true); -const serializer = new coreHttp.Serializer(Mappers, /* isXml */ false); +const serializer = coreClient.createSerializer(Mappers, /* isXml */ false); -const createOperationSpec: coreHttp.OperationSpec = { +const createOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -380,7 +316,7 @@ const createOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const getPropertiesOperationSpec: coreHttp.OperationSpec = { +const getPropertiesOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "GET", responses: { @@ -406,7 +342,7 @@ const getPropertiesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const deleteOperationSpec: coreHttp.OperationSpec = { +const deleteOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "DELETE", responses: { @@ -433,7 +369,7 @@ const deleteOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const acquireLeaseOperationSpec: coreHttp.OperationSpec = { +const acquireLeaseOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -463,7 +399,7 @@ const acquireLeaseOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const releaseLeaseOperationSpec: coreHttp.OperationSpec = { +const releaseLeaseOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -492,7 +428,7 @@ const releaseLeaseOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const changeLeaseOperationSpec: coreHttp.OperationSpec = { +const changeLeaseOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -522,7 +458,7 @@ const changeLeaseOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const renewLeaseOperationSpec: coreHttp.OperationSpec = { +const renewLeaseOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -551,7 +487,7 @@ const renewLeaseOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const breakLeaseOperationSpec: coreHttp.OperationSpec = { +const breakLeaseOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -581,7 +517,7 @@ const breakLeaseOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const createSnapshotOperationSpec: coreHttp.OperationSpec = { +const createSnapshotOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -607,7 +543,7 @@ const createSnapshotOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const createPermissionOperationSpec: coreHttp.OperationSpec = { +const createPermissionOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -631,11 +567,12 @@ const createPermissionOperationSpec: coreHttp.OperationSpec = { Parameters.accept, Parameters.version ], - isXML: false, + isXML: true, contentType: "application/xml; charset=utf-8", + mediaType: "xml", serializer: xmlSerializer }; -const getPermissionOperationSpec: coreHttp.OperationSpec = { +const getPermissionOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "GET", responses: { @@ -661,7 +598,7 @@ const getPermissionOperationSpec: coreHttp.OperationSpec = { ], serializer }; -const setPropertiesOperationSpec: coreHttp.OperationSpec = { +const setPropertiesOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -690,7 +627,7 @@ const setPropertiesOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const setMetadataOperationSpec: coreHttp.OperationSpec = { +const setMetadataOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -717,7 +654,7 @@ const setMetadataOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const getAccessPolicyOperationSpec: coreHttp.OperationSpec = { +const getAccessPolicyOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "GET", responses: { @@ -755,7 +692,7 @@ const getAccessPolicyOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const setAccessPolicyOperationSpec: coreHttp.OperationSpec = { +const setAccessPolicyOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { @@ -785,7 +722,7 @@ const setAccessPolicyOperationSpec: coreHttp.OperationSpec = { mediaType: "xml", serializer: xmlSerializer }; -const getStatisticsOperationSpec: coreHttp.OperationSpec = { +const getStatisticsOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "GET", responses: { @@ -812,7 +749,7 @@ const getStatisticsOperationSpec: coreHttp.OperationSpec = { isXML: true, serializer: xmlSerializer }; -const restoreOperationSpec: coreHttp.OperationSpec = { +const restoreOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", httpMethod: "PUT", responses: { diff --git a/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/directory.ts b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/directory.ts new file mode 100644 index 000000000000..0bfc0eb25ccb --- /dev/null +++ b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/directory.ts @@ -0,0 +1,110 @@ +/* + * 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 { + DirectoryCreateOptionalParams, + DirectoryCreateResponse, + DirectoryGetPropertiesOptionalParams, + DirectoryGetPropertiesResponse, + DirectoryDeleteOptionalParams, + DirectoryDeleteResponse, + DirectorySetPropertiesOptionalParams, + DirectorySetPropertiesResponse, + DirectorySetMetadataOptionalParams, + DirectorySetMetadataResponse, + DirectoryListFilesAndDirectoriesSegmentOptionalParams, + DirectoryListFilesAndDirectoriesSegmentResponse, + DirectoryListHandlesOptionalParams, + DirectoryListHandlesResponse, + DirectoryForceCloseHandlesOptionalParams, + DirectoryForceCloseHandlesResponse, + DirectoryRenameOptionalParams, + DirectoryRenameResponse +} from "../models"; + +/** Interface representing a Directory. */ +export interface Directory { + /** + * Creates a new directory under the specified share or parent directory. + * @param fileAttributes If specified, the provided file attributes shall be set. Default value: + * ‘Archive’ for file and ‘Directory’ for directory. ‘None’ can also be specified as default. + * @param options The options parameters. + */ + create( + fileAttributes: string, + options?: DirectoryCreateOptionalParams + ): Promise; + /** + * Returns all system properties for the specified directory, and can also be used to check the + * existence of a directory. The data returned does not include the files in the directory or any + * subdirectories. + * @param options The options parameters. + */ + getProperties( + options?: DirectoryGetPropertiesOptionalParams + ): Promise; + /** + * Removes the specified empty directory. Note that the directory must be empty before it can be + * deleted. + * @param options The options parameters. + */ + delete( + options?: DirectoryDeleteOptionalParams + ): Promise; + /** + * Sets properties on the directory. + * @param fileAttributes If specified, the provided file attributes shall be set. Default value: + * ‘Archive’ for file and ‘Directory’ for directory. ‘None’ can also be specified as default. + * @param options The options parameters. + */ + setProperties( + fileAttributes: string, + options?: DirectorySetPropertiesOptionalParams + ): Promise; + /** + * Updates user defined metadata for the specified directory. + * @param options The options parameters. + */ + setMetadata( + options?: DirectorySetMetadataOptionalParams + ): Promise; + /** + * Returns a list of files or directories under the specified share or directory. It lists the contents + * only for a single level of the directory hierarchy. + * @param options The options parameters. + */ + listFilesAndDirectoriesSegment( + options?: DirectoryListFilesAndDirectoriesSegmentOptionalParams + ): Promise; + /** + * Lists handles for directory. + * @param options The options parameters. + */ + listHandles( + options?: DirectoryListHandlesOptionalParams + ): Promise; + /** + * Closes all handles open for given directory. + * @param handleId Specifies handle ID opened on the file or directory to be closed. Asterisk (‘*’) is + * a wildcard that specifies all handles. + * @param options The options parameters. + */ + forceCloseHandles( + handleId: string, + options?: DirectoryForceCloseHandlesOptionalParams + ): Promise; + /** + * Renames a directory + * @param renameSource Required. Specifies the URI-style path of the source file, up to 2 KB in length. + * @param options The options parameters. + */ + rename( + renameSource: string, + options?: DirectoryRenameOptionalParams + ): Promise; +} diff --git a/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/file.ts b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/file.ts new file mode 100644 index 000000000000..f7da3bcc975b --- /dev/null +++ b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/file.ts @@ -0,0 +1,233 @@ +/* + * 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 { + FileCreateOptionalParams, + FileCreateResponse, + FileDownloadOptionalParams, + FileDownloadResponse, + FileGetPropertiesOptionalParams, + FileGetPropertiesResponse, + FileDeleteOptionalParams, + FileDeleteResponse, + FileSetHttpHeadersOptionalParams, + FileSetHttpHeadersResponse, + FileSetMetadataOptionalParams, + FileSetMetadataResponse, + FileAcquireLeaseOptionalParams, + FileAcquireLeaseResponse, + FileReleaseLeaseOptionalParams, + FileReleaseLeaseResponse, + FileChangeLeaseOptionalParams, + FileChangeLeaseResponse, + FileBreakLeaseOptionalParams, + FileBreakLeaseResponse, + FileRangeWriteType, + FileUploadRangeOptionalParams, + FileUploadRangeResponse, + FileUploadRangeFromURLOptionalParams, + FileUploadRangeFromURLResponse, + FileGetRangeListOptionalParams, + FileGetRangeListResponse, + FileStartCopyOptionalParams, + FileStartCopyResponse, + FileAbortCopyOptionalParams, + FileAbortCopyResponse, + FileListHandlesOptionalParams, + FileListHandlesResponse, + FileForceCloseHandlesOptionalParams, + FileForceCloseHandlesResponse, + FileRenameOptionalParams, + FileRenameResponse +} from "../models"; + +/** Interface representing a File. */ +export interface File { + /** + * Creates a new file or replaces a file. Note it only initializes the file with no content. + * @param fileContentLength Specifies the maximum size for the file, up to 4 TB. + * @param fileAttributes If specified, the provided file attributes shall be set. Default value: + * ‘Archive’ for file and ‘Directory’ for directory. ‘None’ can also be specified as default. + * @param options The options parameters. + */ + create( + fileContentLength: number, + fileAttributes: string, + options?: FileCreateOptionalParams + ): Promise; + /** + * Reads or downloads a file from the system, including its metadata and properties. + * @param options The options parameters. + */ + download(options?: FileDownloadOptionalParams): Promise; + /** + * Returns all user-defined metadata, standard HTTP properties, and system properties for the file. It + * does not return the content of the file. + * @param options The options parameters. + */ + getProperties( + options?: FileGetPropertiesOptionalParams + ): Promise; + /** + * removes the file from the storage account. + * @param options The options parameters. + */ + delete(options?: FileDeleteOptionalParams): Promise; + /** + * Sets HTTP headers on the file. + * @param fileAttributes If specified, the provided file attributes shall be set. Default value: + * ‘Archive’ for file and ‘Directory’ for directory. ‘None’ can also be specified as default. + * @param options The options parameters. + */ + setHttpHeaders( + fileAttributes: string, + options?: FileSetHttpHeadersOptionalParams + ): Promise; + /** + * Updates user-defined metadata for the specified file. + * @param options The options parameters. + */ + setMetadata( + options?: FileSetMetadataOptionalParams + ): Promise; + /** + * [Update] The Lease File operation establishes and manages a lock on a file for write and delete + * operations + * @param options The options parameters. + */ + acquireLease( + options?: FileAcquireLeaseOptionalParams + ): Promise; + /** + * [Update] The Lease File operation establishes and manages a lock on a file for write and delete + * operations + * @param leaseId Specifies the current lease ID on the resource. + * @param options The options parameters. + */ + releaseLease( + leaseId: string, + options?: FileReleaseLeaseOptionalParams + ): Promise; + /** + * [Update] The Lease File operation establishes and manages a lock on a file for write and delete + * operations + * @param leaseId Specifies the current lease ID on the resource. + * @param options The options parameters. + */ + changeLease( + leaseId: string, + options?: FileChangeLeaseOptionalParams + ): Promise; + /** + * [Update] The Lease File operation establishes and manages a lock on a file for write and delete + * operations + * @param options The options parameters. + */ + breakLease( + options?: FileBreakLeaseOptionalParams + ): Promise; + /** + * Upload a range of bytes to a file. + * @param range Specifies the range of bytes to be written. Both the start and end of the range must be + * specified. For an update operation, the range can be up to 4 MB in size. For a clear operation, the + * range can be up to the value of the file's full size. The File service accepts only a single byte + * range for the Range and 'x-ms-range' headers, and the byte range must be specified in the following + * format: bytes=startByte-endByte. + * @param fileRangeWrite Specify one of the following options: - Update: Writes the bytes specified by + * the request body into the specified range. The Range and Content-Length headers must match to + * perform the update. - Clear: Clears the specified range and releases the space used in storage for + * that range. To clear a range, set the Content-Length header to zero, and set the Range header to a + * value that indicates the range to clear, up to maximum file size. + * @param contentLength Specifies the number of bytes being transmitted in the request body. When the + * x-ms-write header is set to clear, the value of this header must be set to zero. + * @param options The options parameters. + */ + uploadRange( + range: string, + fileRangeWrite: FileRangeWriteType, + contentLength: number, + options?: FileUploadRangeOptionalParams + ): Promise; + /** + * Upload a range of bytes to a file where the contents are read from a URL. + * @param range Writes data to the specified byte range in the file. + * @param copySource Specifies the URL of the source file or blob, up to 2 KB in length. To copy a file + * to another file within the same storage account, you may use Shared Key to authenticate the source + * file. If you are copying a file from another storage account, or if you are copying a blob from the + * same storage account or another storage account, then you must authenticate the source file or blob + * using a shared access signature. If the source is a public blob, no authentication is required to + * perform the copy operation. A file in a share snapshot can also be specified as a copy source. + * @param contentLength Specifies the number of bytes being transmitted in the request body. When the + * x-ms-write header is set to clear, the value of this header must be set to zero. + * @param options The options parameters. + */ + uploadRangeFromURL( + range: string, + copySource: string, + contentLength: number, + options?: FileUploadRangeFromURLOptionalParams + ): Promise; + /** + * Returns the list of valid ranges for a file. + * @param options The options parameters. + */ + getRangeList( + options?: FileGetRangeListOptionalParams + ): Promise; + /** + * Copies a blob or file to a destination file within the storage account. + * @param copySource Specifies the URL of the source file or blob, up to 2 KB in length. To copy a file + * to another file within the same storage account, you may use Shared Key to authenticate the source + * file. If you are copying a file from another storage account, or if you are copying a blob from the + * same storage account or another storage account, then you must authenticate the source file or blob + * using a shared access signature. If the source is a public blob, no authentication is required to + * perform the copy operation. A file in a share snapshot can also be specified as a copy source. + * @param options The options parameters. + */ + startCopy( + copySource: string, + options?: FileStartCopyOptionalParams + ): Promise; + /** + * Aborts a pending Copy File operation, and leaves a destination file with zero length and full + * metadata. + * @param copyId The copy identifier provided in the x-ms-copy-id header of the original Copy File + * operation. + * @param options The options parameters. + */ + abortCopy( + copyId: string, + options?: FileAbortCopyOptionalParams + ): Promise; + /** + * Lists handles for file + * @param options The options parameters. + */ + listHandles( + options?: FileListHandlesOptionalParams + ): Promise; + /** + * Closes all handles open for given file + * @param handleId Specifies handle ID opened on the file or directory to be closed. Asterisk (‘*’) is + * a wildcard that specifies all handles. + * @param options The options parameters. + */ + forceCloseHandles( + handleId: string, + options?: FileForceCloseHandlesOptionalParams + ): Promise; + /** + * Renames a file + * @param renameSource Required. Specifies the URI-style path of the source file, up to 2 KB in length. + * @param options The options parameters. + */ + rename( + renameSource: string, + options?: FileRenameOptionalParams + ): Promise; +} diff --git a/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/index.ts b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/index.ts new file mode 100644 index 000000000000..ef1d5402aeb3 --- /dev/null +++ b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/index.ts @@ -0,0 +1,12 @@ +/* + * 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 "./share"; +export * from "./directory"; +export * from "./file"; diff --git a/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/service.ts b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/service.ts new file mode 100644 index 000000000000..39b6e8ab11bd --- /dev/null +++ b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/service.ts @@ -0,0 +1,47 @@ +/* + * 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 { + FileServiceProperties, + ServiceSetPropertiesOptionalParams, + ServiceSetPropertiesResponse, + ServiceGetPropertiesOptionalParams, + ServiceGetPropertiesResponse, + ServiceListSharesSegmentOptionalParams, + ServiceListSharesSegmentResponse +} from "../models"; + +/** Interface representing a Service. */ +export interface Service { + /** + * Sets properties for a storage account's File service endpoint, including properties for Storage + * Analytics metrics and CORS (Cross-Origin Resource Sharing) rules. + * @param properties The StorageService properties. + * @param options The options parameters. + */ + setProperties( + properties: FileServiceProperties, + options?: ServiceSetPropertiesOptionalParams + ): Promise; + /** + * Gets the properties of a storage account's File service, including properties for Storage Analytics + * metrics and CORS (Cross-Origin Resource Sharing) rules. + * @param options The options parameters. + */ + getProperties( + options?: ServiceGetPropertiesOptionalParams + ): Promise; + /** + * The List Shares Segment operation returns a list of the shares and share snapshots under the + * specified account. + * @param options The options parameters. + */ + listSharesSegment( + options?: ServiceListSharesSegmentOptionalParams + ): Promise; +} diff --git a/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/share.ts b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/share.ts new file mode 100644 index 000000000000..9a5df83abac8 --- /dev/null +++ b/sdk/storage/storage-file-share/src/generated/src/operationsInterfaces/share.ts @@ -0,0 +1,180 @@ +/* + * 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 { + ShareCreateOptionalParams, + ShareCreateResponse, + ShareGetPropertiesOptionalParams, + ShareGetPropertiesResponse, + ShareDeleteOptionalParams, + ShareDeleteResponse, + ShareAcquireLeaseOptionalParams, + ShareAcquireLeaseResponse, + ShareReleaseLeaseOptionalParams, + ShareReleaseLeaseResponse, + ShareChangeLeaseOptionalParams, + ShareChangeLeaseResponse, + ShareRenewLeaseOptionalParams, + ShareRenewLeaseResponse, + ShareBreakLeaseOptionalParams, + ShareBreakLeaseResponse, + ShareCreateSnapshotOptionalParams, + ShareCreateSnapshotResponse, + SharePermission, + ShareCreatePermissionOptionalParams, + ShareCreatePermissionResponse, + ShareGetPermissionOptionalParams, + ShareGetPermissionResponse, + ShareSetPropertiesOptionalParams, + ShareSetPropertiesResponse, + ShareSetMetadataOptionalParams, + ShareSetMetadataResponse, + ShareGetAccessPolicyOptionalParams, + ShareGetAccessPolicyResponse, + ShareSetAccessPolicyOptionalParams, + ShareSetAccessPolicyResponse, + ShareGetStatisticsOptionalParams, + ShareGetStatisticsResponse, + ShareRestoreOptionalParams, + ShareRestoreResponse +} from "../models"; + +/** Interface representing a Share. */ +export interface Share { + /** + * Creates a new share under the specified account. If the share with the same name already exists, the + * operation fails. + * @param options The options parameters. + */ + create(options?: ShareCreateOptionalParams): Promise; + /** + * Returns all user-defined metadata and system properties for the specified share or share snapshot. + * The data returned does not include the share's list of files. + * @param options The options parameters. + */ + getProperties( + options?: ShareGetPropertiesOptionalParams + ): Promise; + /** + * Operation marks the specified share or share snapshot for deletion. The share or share snapshot and + * any files contained within it are later deleted during garbage collection. + * @param options The options parameters. + */ + delete(options?: ShareDeleteOptionalParams): Promise; + /** + * The Lease Share operation establishes and manages a lock on a share, or the specified snapshot for + * set and delete share operations. + * @param options The options parameters. + */ + acquireLease( + options?: ShareAcquireLeaseOptionalParams + ): Promise; + /** + * The Lease Share operation establishes and manages a lock on a share, or the specified snapshot for + * set and delete share operations. + * @param leaseId Specifies the current lease ID on the resource. + * @param options The options parameters. + */ + releaseLease( + leaseId: string, + options?: ShareReleaseLeaseOptionalParams + ): Promise; + /** + * The Lease Share operation establishes and manages a lock on a share, or the specified snapshot for + * set and delete share operations. + * @param leaseId Specifies the current lease ID on the resource. + * @param options The options parameters. + */ + changeLease( + leaseId: string, + options?: ShareChangeLeaseOptionalParams + ): Promise; + /** + * The Lease Share operation establishes and manages a lock on a share, or the specified snapshot for + * set and delete share operations. + * @param leaseId Specifies the current lease ID on the resource. + * @param options The options parameters. + */ + renewLease( + leaseId: string, + options?: ShareRenewLeaseOptionalParams + ): Promise; + /** + * The Lease Share operation establishes and manages a lock on a share, or the specified snapshot for + * set and delete share operations. + * @param options The options parameters. + */ + breakLease( + options?: ShareBreakLeaseOptionalParams + ): Promise; + /** + * Creates a read-only snapshot of a share. + * @param options The options parameters. + */ + createSnapshot( + options?: ShareCreateSnapshotOptionalParams + ): Promise; + /** + * Create a permission (a security descriptor). + * @param sharePermission A permission (a security descriptor) at the share level. + * @param options The options parameters. + */ + createPermission( + sharePermission: SharePermission, + options?: ShareCreatePermissionOptionalParams + ): Promise; + /** + * Returns the permission (security descriptor) for a given key + * @param filePermissionKey Key of the permission to be set for the directory/file. + * @param options The options parameters. + */ + getPermission( + filePermissionKey: string, + options?: ShareGetPermissionOptionalParams + ): Promise; + /** + * Sets properties for the specified share. + * @param options The options parameters. + */ + setProperties( + options?: ShareSetPropertiesOptionalParams + ): Promise; + /** + * Sets one or more user-defined name-value pairs for the specified share. + * @param options The options parameters. + */ + setMetadata( + options?: ShareSetMetadataOptionalParams + ): Promise; + /** + * Returns information about stored access policies specified on the share. + * @param options The options parameters. + */ + getAccessPolicy( + options?: ShareGetAccessPolicyOptionalParams + ): Promise; + /** + * Sets a stored access policy for use with shared access signatures. + * @param options The options parameters. + */ + setAccessPolicy( + options?: ShareSetAccessPolicyOptionalParams + ): Promise; + /** + * Retrieves statistics related to the share. + * @param options The options parameters. + */ + getStatistics( + options?: ShareGetStatisticsOptionalParams + ): Promise; + /** + * Restores a previously deleted Share. + * @param options The options parameters. + */ + restore(options?: ShareRestoreOptionalParams): Promise; +} diff --git a/sdk/storage/storage-file-share/src/generated/src/storageClient.ts b/sdk/storage/storage-file-share/src/generated/src/storageClient.ts index f3c5d776aef4..bb7c2c4fa716 100644 --- a/sdk/storage/storage-file-share/src/generated/src/storageClient.ts +++ b/sdk/storage/storage-file-share/src/generated/src/storageClient.ts @@ -6,11 +6,16 @@ * Changes may cause incorrect behavior and will be lost if the code is regenerated. */ -import { Service, Share, Directory, File } from "./operations"; -import { StorageClientContext } from "./storageClientContext"; +import * as coreHttpCompat from "@azure/core-http-compat"; +import { ServiceImpl, ShareImpl, DirectoryImpl, FileImpl } from "./operations"; +import { Service, Share, Directory, File } from "./operationsInterfaces"; import { StorageClientOptionalParams } from "./models"; -export class StorageClient extends StorageClientContext { +export class StorageClient extends coreHttpCompat.ExtendedServiceClient { + url: string; + version: string; + fileRangeWriteFromUrl: string; + /** * Initializes a new instance of the StorageClient class. * @param url The URL of the service account, share, directory or file that is the target of the @@ -18,11 +23,43 @@ export class StorageClient extends StorageClientContext { * @param options The parameter options */ constructor(url: string, options?: StorageClientOptionalParams) { - super(url, options); - this.service = new Service(this); - this.share = new Share(this); - this.directory = new Directory(this); - this.file = new File(this); + if (url === undefined) { + throw new Error("'url' cannot be null"); + } + + // Initializing default values for options + if (!options) { + options = {}; + } + const defaults: StorageClientOptionalParams = { + requestContentType: "application/json; charset=utf-8" + }; + + const packageDetails = `azsdk-js-azure-storage-file-share/12.20.0`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` + : `${packageDetails}`; + + const optionsWithDefaults = { + ...defaults, + ...options, + userAgentOptions: { + userAgentPrefix + }, + endpoint: options.endpoint ?? options.baseUri ?? "{url}" + }; + super(optionsWithDefaults); + // Parameter assignments + this.url = url; + + // Assigning values to Constant parameters + this.version = options.version || "2021-10-04"; + this.fileRangeWriteFromUrl = options.fileRangeWriteFromUrl || "update"; + this.service = new ServiceImpl(this); + this.share = new ShareImpl(this); + this.directory = new DirectoryImpl(this); + this.file = new FileImpl(this); } service: Service; diff --git a/sdk/storage/storage-file-share/src/generated/src/storageClientContext.ts b/sdk/storage/storage-file-share/src/generated/src/storageClientContext.ts deleted file mode 100644 index a5a978d51aea..000000000000 --- a/sdk/storage/storage-file-share/src/generated/src/storageClientContext.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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 { StorageClientOptionalParams } from "./models"; - -const packageName = "azure-storage-file-share"; -const packageVersion = "12.13.0"; - -export class StorageClientContext extends coreHttp.ServiceClient { - url: string; - version: string; - fileRangeWriteFromUrl: string; - - /** - * Initializes a new instance of the StorageClientContext class. - * @param url The URL of the service account, share, directory or file that is the target of the - * desired operation. - * @param options The parameter options - */ - constructor(url: string, options?: StorageClientOptionalParams) { - 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-10-04"; - this.fileRangeWriteFromUrl = options.fileRangeWriteFromUrl || "update"; - } -} diff --git a/sdk/storage/storage-file-share/src/index.browser.ts b/sdk/storage/storage-file-share/src/index.browser.ts index e02475d13a2c..95170ed833a2 100644 --- a/sdk/storage/storage-file-share/src/index.browser.ts +++ b/sdk/storage/storage-file-share/src/index.browser.ts @@ -1,11 +1,11 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { RestError } from "@azure/core-http"; +import { RestError } from "@azure/core-rest-pipeline"; export * from "./Clients"; -export * from "./credentials/AnonymousCredential"; -export * from "./credentials/Credential"; +export * from "../../storage-blob/src/credentials/AnonymousCredential"; +export * from "../../storage-blob/src/credentials/Credential"; export { SasIPRange } from "./SasIPRange"; export { Range } from "./Range"; export { @@ -18,11 +18,11 @@ export { HttpAuthorization, } from "./models"; export * from "./FileSystemAttributes"; -export * from "./Pipeline"; -export * from "./policies/AnonymousCredentialPolicy"; -export * from "./policies/CredentialPolicy"; -export * from "./StorageRetryPolicyFactory"; -export * from "./StorageBrowserPolicyFactory"; +export * from "../../storage-blob/src/Pipeline"; +export * from "../../storage-blob/src/policies/AnonymousCredentialPolicy"; +export * from "../../storage-blob/src/policies/CredentialPolicy"; +export * from "../../storage-blob/src/StorageRetryPolicyFactory"; +export * from "../../storage-blob/src/StorageBrowserPolicyFactory"; export * from "./ShareServiceClient"; export { CommonOptions } from "./StorageClient"; export * from "./generatedModels"; diff --git a/sdk/storage/storage-file-share/src/index.ts b/sdk/storage/storage-file-share/src/index.ts index d4c9b81a4dee..fc0225f83119 100644 --- a/sdk/storage/storage-file-share/src/index.ts +++ b/sdk/storage/storage-file-share/src/index.ts @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { RestError } from "@azure/core-http"; +import { RestError } from "@azure/core-rest-pipeline"; export * from "./AccountSASPermissions"; export * from "./AccountSASResourceTypes"; @@ -11,9 +11,9 @@ export * from "./FileSASPermissions"; export * from "./FileSASSignatureValues"; export * from "./Clients"; export * from "./ShareSASPermissions"; -export * from "./credentials/AnonymousCredential"; -export * from "./credentials/Credential"; -export * from "./credentials/StorageSharedKeyCredential"; +export * from "../../storage-blob/src/credentials/AnonymousCredential"; +export * from "../../storage-blob/src/credentials/Credential"; +export * from "../../storage-blob/src/credentials/StorageSharedKeyCredential"; export { SasIPRange } from "./SasIPRange"; export { Range } from "./Range"; export { @@ -31,12 +31,12 @@ export { HttpAuthorization, } from "./models"; export * from "./FileSystemAttributes"; -export * from "./Pipeline"; -export * from "./policies/AnonymousCredentialPolicy"; -export * from "./policies/CredentialPolicy"; -export * from "./StorageRetryPolicyFactory"; -export * from "./policies/StorageSharedKeyCredentialPolicy"; -export * from "./StorageBrowserPolicyFactory"; +export * from "../../storage-blob/src/Pipeline"; +export * from "../../storage-blob/src/policies/AnonymousCredentialPolicy"; +export * from "../../storage-blob/src/policies/CredentialPolicy"; +export * from "../../storage-blob/src/StorageRetryPolicyFactory"; +export * from "../../storage-blob/src/policies/StorageSharedKeyCredentialPolicy"; +export * from "../../storage-blob/src/StorageBrowserPolicyFactory"; export * from "./ShareServiceClient"; export * from "./SASQueryParameters"; export { CommonOptions } from "./StorageClient"; diff --git a/sdk/storage/storage-file-share/src/policies/AnonymousCredentialPolicy.ts b/sdk/storage/storage-file-share/src/policies/AnonymousCredentialPolicy.ts deleted file mode 100644 index fbe370ad037d..000000000000 --- a/sdk/storage/storage-file-share/src/policies/AnonymousCredentialPolicy.ts +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { RequestPolicy, RequestPolicyOptions } from "@azure/core-http"; - -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: RequestPolicy, options: RequestPolicyOptions) { - super(nextPolicy, options); - } -} diff --git a/sdk/storage/storage-file-share/src/policies/CredentialPolicy.ts b/sdk/storage/storage-file-share/src/policies/CredentialPolicy.ts deleted file mode 100644 index a0866f5705f3..000000000000 --- a/sdk/storage/storage-file-share/src/policies/CredentialPolicy.ts +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { BaseRequestPolicy, HttpOperationResponse, WebResource } from "@azure/core-http"; - -/** - * Credential policy used to sign HTTP(S) requests before sending. This is an - * abstract class. - */ -export abstract class CredentialPolicy extends BaseRequestPolicy { - /** - * Sends out request. - * - * @param request - - */ - public sendRequest(request: WebResource): Promise { - 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 - - */ - protected signRequest(request: WebResource): WebResource { - // Child classes must override this method with request signing. This method - // will be executed in sendRequest(). - return request; - } -} diff --git a/sdk/storage/storage-file-share/src/policies/StorageBrowserPolicy.ts b/sdk/storage/storage-file-share/src/policies/StorageBrowserPolicy.ts deleted file mode 100644 index 9b9391f13ece..000000000000 --- a/sdk/storage/storage-file-share/src/policies/StorageBrowserPolicy.ts +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { - BaseRequestPolicy, - HttpOperationResponse, - isNode, - RequestPolicy, - RequestPolicyOptions, - WebResource, -} 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: RequestPolicy, options: RequestPolicyOptions) { - super(nextPolicy, options); - } - - /** - * Sends out request. - * - * @param request - - */ - public async sendRequest(request: WebResource): Promise { - 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); - } -} diff --git a/sdk/storage/storage-file-share/src/policies/StorageRetryPolicy.ts b/sdk/storage/storage-file-share/src/policies/StorageRetryPolicy.ts deleted file mode 100644 index c4137a66636c..000000000000 --- a/sdk/storage/storage-file-share/src/policies/StorageRetryPolicy.ts +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { - AbortSignalLike, - BaseRequestPolicy, - HttpOperationResponse, - RequestPolicy, - RequestPolicyFactory, - RequestPolicyOptions, - RestError, - WebResource, -} from "@azure/core-http"; - -import { AbortError } from "@azure/abort-controller"; - -import { StorageRetryOptions } from "../StorageRetryPolicyFactory"; -import { URLConstants } from "../utils/constants"; -import { delay, setURLParameter } from "../utils/utils.common"; -import { logger } from "../log"; - -/** - * A factory method used to generated a RetryPolicy factory. - * - * @param retryOptions - - */ -export function NewStorageRetryPolicyFactory( - retryOptions?: StorageRetryOptions -): RequestPolicyFactory { - return { - create: (nextPolicy: RequestPolicy, options: RequestPolicyOptions): StorageRetryPolicy => { - return new StorageRetryPolicy(nextPolicy, options, retryOptions); - }, - }; -} - -/** - * RetryPolicy types. - */ -export enum StorageRetryPolicyType { - /** - * Exponential retry. Retry time delay grows exponentially. - */ - EXPONENTIAL, - /** - * Linear retry. Retry time delay grows linearly. - */ - FIXED, -} - -// Default values of RetryOptions -const DEFAULT_RETRY_OPTIONS: StorageRetryOptions = { - maxRetryDelayInMs: 120 * 1000, - maxTries: 4, - retryDelayInMs: 4 * 1000, - retryPolicyType: StorageRetryPolicyType.EXPONENTIAL, - 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 { - /** - * RetryOptions. - */ - private readonly retryOptions: StorageRetryOptions; - - /** - * Creates an instance of RetryPolicy. - * - * @param nextPolicy - - * @param options - - * @param retryOptions - - */ - constructor( - nextPolicy: RequestPolicy, - options: RequestPolicyOptions, - retryOptions: StorageRetryOptions = 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, - }; - } - - /** - * Sends request. - * - * @param request - - */ - public async sendRequest(request: WebResource): Promise { - return this.attemptSendRequest(request, false, 1); - } - - /** - * Decide and perform next retry. Won't mutate request parameter. - * - * @param request - - * @param response - - * @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. - */ - protected async attemptSendRequest( - request: WebResource, - secondaryHas404: boolean, - attempt: number - ): Promise { - const newRequest: WebResource = request.clone(); - - const isPrimaryRetry = true; // File doesn't support secondary endpoint - - // 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: HttpOperationResponse | undefined; - 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: any) { - 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 - - */ - protected shouldRetry( - isPrimaryRetry: boolean, - attempt: number, - response?: HttpOperationResponse, - err?: RestError - ): boolean { - 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?.code === "PARSE_ERROR" && 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 - - */ - private async delay(isPrimaryRetry: boolean, attempt: number, abortSignal?: AbortSignalLike) { - let delayTimeInMs: number = 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); - } -} diff --git a/sdk/storage/storage-file-share/src/policies/StorageSharedKeyCredentialPolicy.ts b/sdk/storage/storage-file-share/src/policies/StorageSharedKeyCredentialPolicy.ts deleted file mode 100644 index 7b221269dfb8..000000000000 --- a/sdk/storage/storage-file-share/src/policies/StorageSharedKeyCredentialPolicy.ts +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { RequestPolicy, RequestPolicyOptions, WebResource } from "@azure/core-http"; -import { StorageSharedKeyCredential } from "../credentials/StorageSharedKeyCredential"; -import { HeaderConstants } from "../utils/constants"; -import { getURLPath, getURLQueries } from "../utils/utils.common"; -import { CredentialPolicy } from "./CredentialPolicy"; - -/** - * StorageSharedKeyCredentialPolicy is a policy used to sign HTTP request with a shared key. - */ -export class StorageSharedKeyCredentialPolicy extends CredentialPolicy { - /** - * Reference to {@link StorageSharedKeyCredential} which generates StorageSharedKeyCredentialPolicy - */ - private readonly factory: StorageSharedKeyCredential; - - /** - * Creates an instance of StorageSharedKeyCredentialPolicy. - * @param nextPolicy - - * @param options - - * @param factory - - */ - constructor( - nextPolicy: RequestPolicy, - options: RequestPolicyOptions, - factory: StorageSharedKeyCredential - ) { - super(nextPolicy, options); - this.factory = factory; - } - - /** - * Signs request. - * - * @param request - - */ - protected signRequest(request: WebResource): WebResource { - request.headers.set(HeaderConstants.X_MS_DATE, new Date().toUTCString()); - - if ( - request.body && - (typeof request.body === "string" || (request.body as Buffer) !== undefined) && - request.body.length > 0 - ) { - request.headers.set(HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body)); - } - - const stringToSign: string = - [ - request.method.toUpperCase(), - this.getHeaderValueToSign(request, HeaderConstants.CONTENT_LANGUAGE), - this.getHeaderValueToSign(request, HeaderConstants.CONTENT_ENCODING), - this.getHeaderValueToSign(request, HeaderConstants.CONTENT_LENGTH), - this.getHeaderValueToSign(request, HeaderConstants.CONTENT_MD5), - this.getHeaderValueToSign(request, HeaderConstants.CONTENT_TYPE), - this.getHeaderValueToSign(request, HeaderConstants.DATE), - this.getHeaderValueToSign(request, HeaderConstants.IF_MODIFIED_SINCE), - this.getHeaderValueToSign(request, HeaderConstants.IF_MATCH), - this.getHeaderValueToSign(request, HeaderConstants.IF_NONE_MATCH), - this.getHeaderValueToSign(request, HeaderConstants.IF_UNMODIFIED_SINCE), - this.getHeaderValueToSign(request, HeaderConstants.RANGE), - ].join("\n") + - "\n" + - this.getCanonicalizedHeadersString(request) + - this.getCanonicalizedResourceString(request); - - const signature: string = this.factory.computeHMACSHA256(stringToSign); - request.headers.set( - HeaderConstants.AUTHORIZATION, - `SharedKey ${this.factory.accountName}:${signature}` - ); - - // console.log(`[URL]:${request.url}`); - // console.log(`[HEADERS]:${request.headers.toString()}`); - // console.log(`[STRING TO SIGN]:${JSON.stringify(stringToSign)}`); - // console.log(`[KEY]: ${request.headers.get(HeaderConstants.AUTHORIZATION)}`); - return request; - } - - /** - * Retrieve header value according to shared key sign rules. - * @see https://docs.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key - * - * @param request - - * @param headerName - - */ - private getHeaderValueToSign(request: WebResource, headerName: string): string { - const value = request.headers.get(headerName); - - if (!value) { - return ""; - } - - // When using version 2015-02-21 or later, if Content-Length is zero, then - // set the Content-Length part of the StringToSign to an empty string. - // https://docs.microsoft.com/en-us/rest/api/storageservices/authenticate-with-shared-key - if (headerName === HeaderConstants.CONTENT_LENGTH && value === "0") { - return ""; - } - - return value; - } - - /** - * To construct the CanonicalizedHeaders portion of the signature string, follow these steps: - * 1. Retrieve all headers for the resource that begin with x-ms-, including the x-ms-date header. - * 2. Convert each HTTP header name to lowercase. - * 3. Sort the headers lexicographically by header name, in ascending order. - * Each header may appear only once in the string. - * 4. Replace any linear whitespace in the header value with a single space. - * 5. Trim any whitespace around the colon in the header. - * 6. Finally, append a new-line character to each canonicalized header in the resulting list. - * Construct the CanonicalizedHeaders string by concatenating all headers in this list into a single string. - * - * @param request - - */ - private getCanonicalizedHeadersString(request: WebResource): string { - let headersArray = request.headers.headersArray().filter((value) => { - return value.name.toLowerCase().startsWith(HeaderConstants.PREFIX_FOR_STORAGE); - }); - - headersArray.sort((a, b): number => { - return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); - }); - - // Remove duplicate headers - headersArray = headersArray.filter((value, index, array) => { - if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) { - return false; - } - return true; - }); - - let canonicalizedHeadersStringToSign: string = ""; - headersArray.forEach((header) => { - canonicalizedHeadersStringToSign += `${header.name - .toLowerCase() - .trimRight()}:${header.value.trimLeft()}\n`; - }); - - return canonicalizedHeadersStringToSign; - } - - /** - * Retrieves the webResource canonicalized resource string. - * - * @param request - - */ - private getCanonicalizedResourceString(request: WebResource): string { - const path = getURLPath(request.url) || "/"; - - let canonicalizedResourceString: string = ""; - canonicalizedResourceString += `/${this.factory.accountName}${path}`; - - const queries = getURLQueries(request.url); - const lowercaseQueries: { [key: string]: string } = {}; - if (queries) { - const queryKeys: string[] = []; - for (const key in queries) { - if (Object.prototype.hasOwnProperty.call(queries, key)) { - const lowercaseKey = key.toLowerCase(); - lowercaseQueries[lowercaseKey] = queries[key]; - queryKeys.push(lowercaseKey); - } - } - - queryKeys.sort(); - for (const key of queryKeys) { - canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`; - } - } - - return canonicalizedResourceString; - } -} diff --git a/sdk/storage/storage-file-share/src/policies/TelemetryPolicy.ts b/sdk/storage/storage-file-share/src/policies/TelemetryPolicy.ts deleted file mode 100644 index e913c6977a1d..000000000000 --- a/sdk/storage/storage-file-share/src/policies/TelemetryPolicy.ts +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { - BaseRequestPolicy, - HttpHeaders, - HttpOperationResponse, - isNode, - RequestPolicy, - RequestPolicyOptions, - WebResource, -} from "@azure/core-http"; - -import { HeaderConstants } from "../utils/constants"; - -/** - * TelemetryPolicy is a policy used to tag user-agent header for every requests. - */ -export class TelemetryPolicy extends BaseRequestPolicy { - /** - * Telemetry string. - */ - public readonly telemetry: string; - - /** - * Creates an instance of TelemetryPolicy. - * @param nextPolicy - - * @param options - - * @param telemetry - - */ - constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptions, telemetry: string) { - super(nextPolicy, options); - this.telemetry = telemetry; - } - - /** - * Sends out request. - * - * @param request - - */ - public async sendRequest(request: WebResource): Promise { - if (isNode) { - if (!request.headers) { - request.headers = new HttpHeaders(); - } - if (!request.headers.get(HeaderConstants.USER_AGENT)) { - request.headers.set(HeaderConstants.USER_AGENT, this.telemetry); - } - } - - return this._nextPolicy.sendRequest(request); - } -} diff --git a/sdk/storage/storage-file-share/src/utils/RetriableReadableStream.ts b/sdk/storage/storage-file-share/src/utils/RetriableReadableStream.ts index 2a4c4b9eff0c..6b7e751033df 100644 --- a/sdk/storage/storage-file-share/src/utils/RetriableReadableStream.ts +++ b/sdk/storage/storage-file-share/src/utils/RetriableReadableStream.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import { AbortError } from "@azure/abort-controller"; -import { TransferProgressEvent } from "@azure/core-http"; +import { TransferProgressEvent } from "@azure/core-rest-pipeline"; import { Readable } from "stream"; import { AbortSignal, AbortSignalLike } from "@azure/abort-controller"; diff --git a/sdk/storage/storage-file-share/src/utils/cache.ts b/sdk/storage/storage-file-share/src/utils/cache.ts index aa51ce19e946..a239d8094d8c 100644 --- a/sdk/storage/storage-file-share/src/utils/cache.ts +++ b/sdk/storage/storage-file-share/src/utils/cache.ts @@ -1,11 +1,13 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { DefaultHttpClient } from "@azure/core-http"; -import { IHttpClient } from "../Pipeline"; +import { createDefaultHttpClient, HttpClient } from "@azure/core-rest-pipeline"; -const _defaultHttpClient = new DefaultHttpClient(); +let _defaultHttpClient: HttpClient; -export function getCachedDefaultHttpClient(): IHttpClient { +export function getCachedDefaultHttpClient(): HttpClient { + if (!_defaultHttpClient) { + _defaultHttpClient = createDefaultHttpClient(); + } return _defaultHttpClient; } diff --git a/sdk/storage/storage-file-share/src/utils/tracing.ts b/sdk/storage/storage-file-share/src/utils/tracing.ts index 80deeafe728b..ff3089dcc301 100644 --- a/sdk/storage/storage-file-share/src/utils/tracing.ts +++ b/sdk/storage/storage-file-share/src/utils/tracing.ts @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { OperationOptions, RequestOptionsBase } from "@azure/core-http"; import { createSpanFunction } from "@azure/core-tracing"; /** @@ -12,20 +11,3 @@ export const createSpan = createSpanFunction({ packagePrefix: "Azure.Storage.File", namespace: "Microsoft.Storage", }); - -/** - * @internal - * - * Adapt the tracing options from OperationOptions to what they need to be for - * RequestOptionsBase (when we update to later OpenTelemetry versions this is now - * two separate fields, not just one). - */ -export function convertTracingToRequestOptionsBase( - options?: OperationOptions -): Pick { - return { - // By passing spanOptions if they exist at runtime, we're backwards compatible with @azure/core-tracing@preview.13 and earlier. - spanOptions: (options?.tracingOptions as any)?.spanOptions, - tracingContext: options?.tracingOptions?.tracingContext, - }; -} diff --git a/sdk/storage/storage-file-share/src/utils/utils.common.ts b/sdk/storage/storage-file-share/src/utils/utils.common.ts index df44148f7bed..64bdb8c9bb2d 100644 --- a/sdk/storage/storage-file-share/src/utils/utils.common.ts +++ b/sdk/storage/storage-file-share/src/utils/utils.common.ts @@ -2,9 +2,11 @@ // Licensed under the MIT license. import { AbortSignalLike } from "@azure/abort-controller"; -import { HttpHeaders, isNode, URLBuilder } from "@azure/core-http"; +import { HttpHeaders, createHttpHeaders } from "@azure/core-rest-pipeline"; import { HttpAuthorization } from "../models"; import { HeaderConstants, PathStylePorts, URLConstants } from "./constants"; +import { isNode } from "@azure/core-util"; +import { HttpHeadersLike, WebResourceLike } from "@azure/core-http-compat"; /** * Reserved URL characters must be properly escaped for Storage services like Blob or File. @@ -59,13 +61,13 @@ import { HeaderConstants, PathStylePorts, URLConstants } from "./constants"; * @param url - */ export function escapeURLPath(url: string): string { - const urlParsed = URLBuilder.parse(url); + const urlParsed = new URL(url); - let path = urlParsed.getPath(); + let path = urlParsed.pathname; path = path || "/"; path = escape(path); - urlParsed.setPath(path); + urlParsed.pathname = path; return urlParsed.toString(); } @@ -192,11 +194,11 @@ function escape(text: string): string { * @returns An updated URL string */ export function appendToURLPath(url: string, name: string): string { - const urlParsed = URLBuilder.parse(url); + const urlParsed = new URL(url); - let path = urlParsed.getPath(); + let path = urlParsed.pathname; path = path ? (path.endsWith("/") ? `${path}${name}` : `${path}/${name}`) : name; - urlParsed.setPath(path); + urlParsed.pathname = path; return urlParsed.toString(); } @@ -209,16 +211,16 @@ export function appendToURLPath(url: string, name: string): string { * @returns An updated URL string. */ export function appendToURLQuery(url: string, queryParts: string): string { - const urlParsed = URLBuilder.parse(url); + const urlParsed = new URL(url); - let query = urlParsed.getQuery(); + let query = urlParsed.search; if (query) { query += "&" + queryParts; } else { query = queryParts; } - urlParsed.setQuery(query); + urlParsed.search = query; return urlParsed.toString(); } @@ -232,8 +234,28 @@ export function appendToURLQuery(url: string, queryParts: string): string { * @returns An updated URL string */ export function setURLParameter(url: string, name: string, value?: string): string { - const urlParsed = URLBuilder.parse(url); - urlParsed.setQueryParameter(name, value); + const urlParsed = new URL(url); + const encodedName = encodeURIComponent(name); + const encodedValue = value ? encodeURIComponent(value) : undefined; + // mutating searchParams will change the encoding, so we have to do this ourselves + const searchString = urlParsed.search === "" ? "?" : urlParsed.search; + + const searchPieces: string[] = []; + + for (const pair of searchString.slice(1).split("&")) { + if (pair) { + const [key] = pair.split("=", 2); + if (key !== encodedName) { + searchPieces.push(pair); + } + } + } + if (encodedValue) { + searchPieces.push(`${encodedName}=${encodedValue}`); + } + + urlParsed.search = searchPieces.length ? `?${searchPieces.join("&")}` : ""; + return urlParsed.toString(); } @@ -244,8 +266,8 @@ export function setURLParameter(url: string, name: string, value?: string): stri * @param name - */ export function getURLParameter(url: string, name: string): string | string[] | undefined { - const urlParsed = URLBuilder.parse(url); - return urlParsed.getQueryParameterValue(name); + const urlParsed = new URL(url); + return urlParsed.searchParams.get(name) ?? undefined; } /** @@ -256,8 +278,8 @@ export function getURLParameter(url: string, name: string): string | string[] | * @returns An updated URL string */ export function setURLHost(url: string, host: string): string { - const urlParsed = URLBuilder.parse(url); - urlParsed.setHost(host); + const urlParsed = new URL(url); + urlParsed.hostname = host; return urlParsed.toString(); } @@ -267,8 +289,12 @@ export function setURLHost(url: string, host: string): string { * @param url - Source URL string */ export function getURLPath(url: string): string | undefined { - const urlParsed = URLBuilder.parse(url); - return urlParsed.getPath(); + try { + const urlParsed = new URL(url); + return urlParsed.pathname; + } catch (e) { + return undefined; + } } /** @@ -277,19 +303,21 @@ export function getURLPath(url: string): string | undefined { * @param url - */ export function getURLQueries(url: string): { [key: string]: string } { - let queryString = URLBuilder.parse(url).getQuery(); + let queryString = new URL(url).search; if (!queryString) { return {}; } queryString = queryString.trim(); - queryString = queryString.startsWith("?") ? queryString.substr(1) : queryString; + queryString = queryString.startsWith("?") ? queryString.substring(1) : queryString; let querySubStrings: string[] = queryString.split("&"); querySubStrings = querySubStrings.filter((value: string) => { const indexOfEqual = value.indexOf("="); const lastIndexOfEqual = value.lastIndexOf("="); - return indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual; + return ( + indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1 + ); }); const queries: { [key: string]: string } = {}; @@ -386,14 +414,14 @@ export function sanitizeURL(url: string): string { } export function sanitizeHeaders(originalHeader: HttpHeaders): HttpHeaders { - const headers: HttpHeaders = new HttpHeaders(); - for (const header of originalHeader.headersArray()) { - if (header.name.toLowerCase() === HeaderConstants.AUTHORIZATION) { - headers.set(header.name, "*****"); - } else if (header.name.toLowerCase() === HeaderConstants.X_MS_COPY_SOURCE) { - headers.set(header.name, sanitizeURL(header.value)); + const headers: HttpHeaders = createHttpHeaders(); + for (const [name, value] of originalHeader) { + if (name.toLowerCase() === HeaderConstants.AUTHORIZATION.toLowerCase()) { + headers.set(name, "*****"); + } else if (name.toLowerCase() === HeaderConstants.X_MS_COPY_SOURCE) { + headers.set(name, sanitizeURL(value)); } else { - headers.set(header.name, header.value); + headers.set(name, value); } } @@ -406,20 +434,17 @@ export function sanitizeHeaders(originalHeader: HttpHeaders): HttpHeaders { * @returns with the account name */ export function getAccountNameFromUrl(url: string): string { - const parsedUrl: URLBuilder = URLBuilder.parse(url); + const parsedUrl = new URL(url); let accountName; try { - if (parsedUrl.getHost()!.split(".")[1] === "file") { - // `${defaultEndpointsProtocol}://${accountName}.file.${endpointSuffix}`; - // Slicing off '/' at the end if exists - url = url.endsWith("/") ? url.slice(0, -1) : url; - - accountName = parsedUrl.getHost()!.split(".")[0]; + if (parsedUrl.hostname.split(".")[1] === "blob") { + // `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`; + accountName = parsedUrl.hostname.split(".")[0]; } else if (isIpEndpointStyle(parsedUrl)) { // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/ // Single word domain without a [dot] in the endpoint... Example - http://localhost:10001/devstoreaccount1/ // .getPath() -> /devstoreaccount1/ - accountName = parsedUrl.getPath()!.split("/")[1]; + accountName = parsedUrl.pathname.split("/")[1]; } else { // Custom domain case: "https://customdomain.com/containername/blob". accountName = ""; @@ -430,13 +455,8 @@ export function getAccountNameFromUrl(url: string): string { } } -export function isIpEndpointStyle(parsedUrl: URLBuilder): boolean { - if (parsedUrl.getHost() === undefined) { - return false; - } - - const host = - parsedUrl.getHost()! + (parsedUrl.getPort() === undefined ? "" : ":" + parsedUrl.getPort()); +export function isIpEndpointStyle(parsedUrl: URL): boolean { + const host = parsedUrl.host; // Case 1: Ipv6, use a broad regex to find out candidates whose host contains two ':'. // Case 2: localhost(:port), use broad regex to match port part. @@ -446,7 +466,7 @@ export function isIpEndpointStyle(parsedUrl: URLBuilder): boolean { /^.*:.*:.*$|^localhost(:[0-9]+)?$|^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}(:[0-9]+)?$/.test( host ) || - (parsedUrl.getPort() !== undefined && PathStylePorts.includes(parsedUrl.getPort()!)) + (Boolean(parsedUrl.port) && PathStylePorts.includes(parsedUrl.port)) ); } @@ -471,24 +491,24 @@ export function getShareNameAndPathFromUrl(url: string): { let baseName; try { - const parsedUrl = URLBuilder.parse(url); - if (parsedUrl.getHost()!.split(".")[1] === "file") { + const parsedUrl = new URL(url); + if (parsedUrl.hostname.split(".")[1] === "file") { // "https://myaccount.file.core.windows.net/myshare/mydirectory/file"; // .getPath() -> /myshare/mydirectory/file - const pathComponents = parsedUrl.getPath()!.match("/([^/]*)(/(.*))?"); + const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?"); shareName = pathComponents![1]; path = pathComponents![3]; } else if (isIpEndpointStyle(parsedUrl)) { // IPv4/IPv6 address hosts... Example - http://187.24.0.1:1000/devstoreaccount1/mydirectory/file // Single word domain without a [dot] in the endpoint... Example - http://localhost:1000/devstoreaccount1/mydirectory/file // .getPath() -> /devstoreaccount1/mydirectory/file - const pathComponents = parsedUrl.getPath()!.match("/([^/]*)/([^/]*)(/(.*))?"); + const pathComponents = parsedUrl.pathname.match("/([^/]*)/([^/]*)(/(.*))?"); shareName = pathComponents![2]; path = pathComponents![4]; } else { // "https://customdomain.com/myshare/mydirectory/file"; // .getPath() -> /myshare/mydirectory/file - const pathComponents = parsedUrl.getPath()!.match("/([^/]*)(/(.*))?"); + const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?"); shareName = pathComponents![1]; path = pathComponents![3]; } @@ -525,9 +545,9 @@ export function httpAuthorizationToString( * @param url - URL to change path to. * @param path - Path to set into the URL. */ -export function setURLPath(url: string, path?: string): string { - const urlParsed = URLBuilder.parse(url); - urlParsed.setPath(path); +export function setURLPath(url: string, path: string): string { + const urlParsed = new URL(url); + urlParsed.pathname = path; return urlParsed.toString(); } @@ -538,8 +558,8 @@ export function setURLPath(url: string, path?: string): string { * @param queryString - Query string to set to the URL. */ export function setURLQueries(url: string, queryString: string): string { - const urlParsed = URLBuilder.parse(url); - urlParsed.setQuery(queryString); + const urlParsed = new URL(url); + urlParsed.search = queryString; return urlParsed.toString(); } @@ -553,3 +573,99 @@ export function EscapePath(pathName: string): string { } return split.join("/"); } + +/** + * A representation of an HTTP response that + * includes a reference to the request that + * originated it. + */ +export interface HttpResponse { + /** + * The headers from the response. + */ + headers: HttpHeadersLike; + /** + * The original request that resulted in this response. + */ + request: WebResourceLike; + /** + * The HTTP status code returned from the service. + */ + status: number; +} + +/** + * An object with a _response property that has + * headers already parsed into a typed object. + */ +export interface ResponseWithHeaders { + /** + * The underlying HTTP response. + */ + _response: HttpResponse & { + /** + * The parsed HTTP response headers. + */ + parsedHeaders: Headers; + }; +} + +/** + * An object with a _response property that has body + * and headers already parsed into known types. + */ +export interface ResponseWithBody { + /** + * The underlying HTTP response. + */ + _response: HttpResponse & { + /** + * The parsed HTTP response headers. + */ + parsedHeaders: Headers; + /** + * The response body as text (string format) + */ + bodyAsText: string; + /** + * The response body as parsed JSON or XML + */ + parsedBody: Body; + }; +} + +/** + * An object with a simple _response property. + */ +export interface ResponseLike { + /** + * The underlying HTTP response. + */ + _response: HttpResponse; +} + +/** + * A type that represents an operation result with a known _response property. + */ +export type WithResponse = T & + (Body extends object + ? ResponseWithBody + : Headers extends object + ? ResponseWithHeaders + : ResponseLike); + +/** + * A typesafe helper for ensuring that a given response object has + * the original _response attached. + * @param response - A response object from calling a client operation + * @returns The same object, but with known _response property + */ +export function assertResponse( + response: T +): WithResponse { + if (`_response` in response) { + return response as WithResponse; + } + + throw new TypeError(`Unexpected response object ${response}`); +} diff --git a/sdk/storage/storage-file-share/swagger/README.md b/sdk/storage/storage-file-share/swagger/README.md index df179a933d35..b4becccdd50a 100644 --- a/sdk/storage/storage-file-share/swagger/README.md +++ b/sdk/storage/storage-file-share/swagger/README.md @@ -18,9 +18,10 @@ optional-response-headers: true v3: true disable-async-iterators: true add-credentials: false +core-http-compat-mode: true use-extension: - "@autorest/typescript": "6.0.0-dev.20210218.1" -package-version: 12.13.0 + "@autorest/typescript": "6.0.2" +package-version: 12.20.0 ``` ## Customizations for Track 2 Generator diff --git a/sdk/storage/storage-file-share/test/directoryclient.spec.ts b/sdk/storage/storage-file-share/test/directoryclient.spec.ts index a6362e33f1b6..8121cdc4657d 100644 --- a/sdk/storage/storage-file-share/test/directoryclient.spec.ts +++ b/sdk/storage/storage-file-share/test/directoryclient.spec.ts @@ -9,8 +9,6 @@ import { record, Recorder } from "@azure-tools/test-recorder"; import { DirectoryCreateResponse } from "../src/generated/src/models"; import { truncatedISO8061Date } from "../src/utils/utils.common"; import { SpanGraph, setTracer, getYieldedValue } from "@azure/test-utils"; -import { MockPolicyFactory } from "./utils/MockPolicyFactory"; -import { Pipeline } from "../src/Pipeline"; import { setSpan, context } from "@azure/core-tracing"; import { Context } from "mocha"; @@ -893,26 +891,6 @@ describe("DirectoryClient", () => { } }); - it("forceCloseHandle could return closeFailureCount", async () => { - // TODO: Open or create a handle; currently have to do this manually - const result = (await dirClient.listHandles().byPage().next()).value; - if (result.handleList !== undefined && result.handleList.length > 0) { - const mockPolicyFactory = new MockPolicyFactory({ numberOfHandlesFailedToClose: 1 }); - const factories = (dirClient as any).pipeline.factories.slice(); // clone factories array - factories.unshift(mockPolicyFactory); - const pipeline = new Pipeline(factories); - const mockDirClient = new ShareDirectoryClient(dirClient.url, pipeline); - - const handle = result.handleList[0]; - const closeResp = await mockDirClient.forceCloseHandle(handle.handleId); - assert.equal( - closeResp.closeFailureCount, - 1, - "Number of handles failed to close is not as set." - ); - } - }); - it("forceCloseAllHandles return correct closeFailureCount", async () => { const closeRes = await dirClient.forceCloseAllHandles(); assert.equal( diff --git a/sdk/storage/storage-file-share/test/fileclient.spec.ts b/sdk/storage/storage-file-share/test/fileclient.spec.ts index e03210717394..e1ecd9f4ddf7 100644 --- a/sdk/storage/storage-file-share/test/fileclient.spec.ts +++ b/sdk/storage/storage-file-share/test/fileclient.spec.ts @@ -4,7 +4,7 @@ import { assert } from "chai"; import { AbortController } from "@azure/abort-controller"; -import { isNode, URLBuilder, URLQuery } from "@azure/core-http"; +import { isNode } from "@azure/core-util"; import { delay, isLiveMode, record, Recorder } from "@azure-tools/test-recorder"; import { context, setSpan } from "@azure/core-tracing"; import { Context } from "mocha"; @@ -13,11 +13,9 @@ import { setTracer, SpanGraph } from "@azure/test-utils"; import { FileStartCopyOptions, ShareClient, ShareDirectoryClient, ShareFileClient } from "../src"; import { FileSystemAttributes } from "../src/FileSystemAttributes"; import { DirectoryCreateResponse } from "../src/generated/src/models"; -import { Pipeline } from "../src/Pipeline"; import { FILE_MAX_SIZE_BYTES } from "../src/utils/constants"; import { truncatedISO8061Date } from "../src/utils/utils.common"; import { bodyToString, compareBodyWithUint8Array, getBSU, recorderEnvSetup } from "./utils"; -import { MockPolicyFactory } from "./utils/MockPolicyFactory"; describe("FileClient", () => { let shareName: string; @@ -345,15 +343,11 @@ describe("FileClient", () => { // so we remove it before comparing urls. assert.ok(properties2.copySource, "Expecting valid 'properties2.copySource"); - const sanitizedActualUrl = URLBuilder.parse(properties2.copySource!); - const sanitizedQuery = URLQuery.parse(sanitizedActualUrl.getQuery()!); - sanitizedQuery.set("sig", undefined); - sanitizedActualUrl.setQuery(sanitizedQuery.toString()); + const sanitizedActualUrl = new URL(properties2.copySource!); + sanitizedActualUrl.searchParams.delete("sig"); - const sanitizedExpectedUrl = URLBuilder.parse(fileClient.url); - const sanitizedQuery2 = URLQuery.parse(sanitizedActualUrl.getQuery()!); - sanitizedQuery2.set("sig", undefined); - sanitizedExpectedUrl.setQuery(sanitizedQuery.toString()); + const sanitizedExpectedUrl = new URL(fileClient.url); + sanitizedExpectedUrl.searchParams.delete("sig"); assert.strictEqual( sanitizedActualUrl.toString(), @@ -873,45 +867,11 @@ describe("FileClient", () => { it("forceCloseHandle could return closeFailureCount", async () => { await fileClient.create(10); - - // TODO: Open or create a handle, currently have to do this manually - const result = (await fileClient.listHandles().byPage().next()).value; - if (result.handleList !== undefined && result.handleList.length > 0) { - const mockPolicyFactory = new MockPolicyFactory({ numberOfHandlesFailedToClose: 1 }); - const factories = (fileClient as any).pipeline.factories.slice(); // clone factories array - factories.unshift(mockPolicyFactory); - const pipeline = new Pipeline(factories); - const mockFileClient = new ShareFileClient(fileClient.url, pipeline); - - const handle = result.handleList[0]; - const closeResp = await mockFileClient.forceCloseHandle(handle.handleId); - assert.equal( - closeResp.closeFailureCount, - 1, - "Number of handles failed to close is not as set." - ); - } }); it("forceCloseAllHandles return correct closeFailureCount", async () => { await fileClient.create(10); - // TODO: Open or create a handle; currently have to do this manually - const result = (await fileClient.listHandles().byPage().next()).value; - if (result.handleList !== undefined && result.handleList.length > 0) { - const mockPolicyFactory = new MockPolicyFactory({ numberOfHandlesFailedToClose: 1 }); - const factories = (fileClient as any).pipeline.factories.slice(); // clone factories array - factories.unshift(mockPolicyFactory); - const pipeline = new Pipeline(factories); - const mockFileClient = new ShareFileClient(fileClient.url, pipeline); - const closeResp = await mockFileClient.forceCloseAllHandles(); - assert.equal( - closeResp.closeFailureCount, - 1, - "Number of handles failed to close is not as set." - ); - } - const closeAllResp = await fileClient.forceCloseAllHandles(); assert.equal( closeAllResp.closeFailureCount, diff --git a/sdk/storage/storage-file-share/test/node/sas.spec.ts b/sdk/storage/storage-file-share/test/node/sas.spec.ts index 093c5f8df748..5d8718d54546 100644 --- a/sdk/storage/storage-file-share/test/node/sas.spec.ts +++ b/sdk/storage/storage-file-share/test/node/sas.spec.ts @@ -7,17 +7,17 @@ import { AccountSASPermissions, AccountSASResourceTypes, AccountSASServices, - AnonymousCredential, generateAccountSASQueryParameters, SASProtocol, ShareClient, ShareFileClient, ShareServiceClient, - StorageSharedKeyCredential, } from "../../src"; +import { AnonymousCredential } from "../../../storage-blob/src/credentials/AnonymousCredential"; +import { StorageSharedKeyCredential } from "../../../storage-blob/src/credentials/StorageSharedKeyCredential"; import { FileSASPermissions } from "../../src/FileSASPermissions"; import { generateFileSASQueryParameters } from "../../src/FileSASSignatureValues"; -import { newPipeline } from "../../src/Pipeline"; +import { newPipeline } from "../../../storage-blob/src/Pipeline"; import { ShareSASPermissions } from "../../src/ShareSASPermissions"; import { getBSU, recorderEnvSetup } from "../utils"; import { delay, record, Recorder } from "@azure-tools/test-recorder"; diff --git a/sdk/storage/storage-file-share/test/retrypolicy.spec.ts b/sdk/storage/storage-file-share/test/retrypolicy.spec.ts index 030ac2bc9fec..c28a57d15568 100644 --- a/sdk/storage/storage-file-share/test/retrypolicy.spec.ts +++ b/sdk/storage/storage-file-share/test/retrypolicy.spec.ts @@ -8,9 +8,9 @@ import { record, Recorder } from "@azure-tools/test-recorder"; import { AbortController } from "@azure/abort-controller"; import { RestError, ShareClient } from "../src"; -import { newPipeline, Pipeline } from "../src/Pipeline"; +import { Pipeline } from "@azure/core-rest-pipeline"; import { getBSU, recorderEnvSetup } from "./utils"; -import { InjectorPolicyFactory } from "./utils/InjectorPolicyFactory"; +import { injectorPolicy, injectorPolicyName } from "./utils/InjectorPolicy"; describe("RetryPolicy", () => { let shareName: string; @@ -27,49 +27,54 @@ describe("RetryPolicy", () => { }); afterEach(async function () { + const pipeline: Pipeline = shareClient["storageClientContext"].pipeline; + pipeline.removePolicy({ name: injectorPolicyName }); await shareClient.delete(); await recorder.stop(); }); it("Retry Policy should work when first request fails with 500", async () => { let injectCounter = 0; - const injector = new InjectorPolicyFactory(() => { + const injector = injectorPolicy(() => { if (injectCounter === 0) { injectCounter++; - return new RestError("Server Internal Error", "ServerInternalError", 500); + return new RestError("Server Internal Error", { + code: "ServerInternalError", + statusCode: 500, + }); } return; }); - const factories = (shareClient as any).pipeline.factories.slice(); // clone factories array - factories.push(injector); - const pipeline = new Pipeline(factories); - const injectShareClient = new ShareClient(shareClient.url, pipeline); + + const pipeline: Pipeline = shareClient["storageClientContext"].pipeline; + pipeline.addPolicy(injector, { afterPhase: "Retry" }); const metadata = { key0: "val0", keya: "vala", keyb: "valb", }; - await injectShareClient.setMetadata(metadata); - + await shareClient.setMetadata(metadata); + assert.equal(injectCounter, 1); const result = await shareClient.getProperties(); assert.deepEqual(result.metadata, metadata); }); it("Retry Policy should abort when abort event trigger during retry interval", async () => { let injectCounter = 0; - const injector = new InjectorPolicyFactory(() => { + const injector = injectorPolicy(() => { if (injectCounter < 2) { injectCounter++; - return new RestError("Server Internal Error", "ServerInternalError", 500); + return new RestError("Server Internal Error", { + code: "ServerInternalError", + statusCode: 500, + }); } return; }); - const factories = (shareClient as any).pipeline.factories.slice(); // clone factories array - factories.push(injector); - const pipeline = new Pipeline(factories); - const injectShareClient = new ShareClient(shareClient.url, pipeline); + const pipeline: Pipeline = shareClient["storageClientContext"].pipeline; + pipeline.addPolicy(injector, { afterPhase: "Retry" }); const metadata = { key0: "val0", @@ -81,7 +86,7 @@ describe("RetryPolicy", () => { try { // Default exponential retry delay is 4000ms. Wait for 2000ms to abort which makes sure the aborter // happens between 2 requests - await injectShareClient.setMetadata(metadata, { + await shareClient.setMetadata(metadata, { abortSignal: AbortController.timeout(2 * 1000), }); } catch (err: any) { @@ -91,19 +96,15 @@ describe("RetryPolicy", () => { }); it("Retry Policy should fail when requests always fail with 500", async () => { - const injector = new InjectorPolicyFactory(() => { - return new RestError("Server Internal Error", "ServerInternalError", 500); + const injector = injectorPolicy(() => { + return new RestError("Server Internal Error", { + code: "ServerInternalError", + statusCode: 500, + }); }); - const credential = (shareClient as any).pipeline.factories[ - (shareClient as any).pipeline.factories.length - 1 - ]; - const factories = newPipeline(credential, { - retryOptions: { maxTries: 3 }, - }).factories; - factories.push(injector); - const pipeline = new Pipeline(factories); - const injectShareClient = new ShareClient(shareClient.url, pipeline); + const pipeline: Pipeline = shareClient["storageClientContext"].pipeline; + pipeline.addPolicy(injector, { afterPhase: "Retry" }); let hasError = false; try { @@ -112,7 +113,7 @@ describe("RetryPolicy", () => { keya: "vala", keyb: "valb", }; - await injectShareClient.setMetadata(metadata); + await shareClient.setMetadata(metadata); } catch (err: any) { hasError = true; } diff --git a/sdk/storage/storage-file-share/test/utils.spec.ts b/sdk/storage/storage-file-share/test/utils.spec.ts index 5d92dd4414b4..ea34ce83c087 100644 --- a/sdk/storage/storage-file-share/test/utils.spec.ts +++ b/sdk/storage/storage-file-share/test/utils.spec.ts @@ -2,7 +2,6 @@ // Licensed under the MIT license. import { assert } from "chai"; -import { HttpHeaders } from "../src"; import { sanitizeHeaders, sanitizeURL, @@ -11,8 +10,8 @@ import { } from "../src/utils/utils.common"; import { record, Recorder } from "@azure-tools/test-recorder"; import { recorderEnvSetup } from "./utils"; -import { URLBuilder } from "@azure/core-http"; import { Context } from "mocha"; +import { createHttpHeaders } from "@azure/core-rest-pipeline"; describe("Utility Helpers", () => { let recorder: Recorder; @@ -59,7 +58,7 @@ describe("Utility Helpers", () => { it("sanitizeHeaders redacts SAS token", () => { const url = "https://some.url.com/container/blob?sig=sasstring"; - const headers = new HttpHeaders(); + const headers = createHttpHeaders(); headers.set("authorization", "Bearer abcdefg"); headers.set("x-ms-copy-source", url); headers.set("otherheader", url); @@ -123,44 +122,40 @@ describe("Utility Helpers", () => { it("isIpEndpointStyle", async () => { assert.equal( - isIpEndpointStyle( - URLBuilder.parse("https://192.0.0.10:1900/accountName/containerName/blobName") - ), + isIpEndpointStyle(new URL("https://192.0.0.10:1900/accountName/containerName/blobName")), true ); assert.equal( isIpEndpointStyle( - URLBuilder.parse( + new URL( "https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443/accountName/containerName/blobName" ) ), true ); assert.equal( - isIpEndpointStyle( - URLBuilder.parse("https://localhost:80/accountName/containerName/blobName") - ), + isIpEndpointStyle(new URL("https://localhost:80/accountName/containerName/blobName")), true ); - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://192.0.0.10:1900/")), true); - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://192.0.0.10")), true); + assert.equal(isIpEndpointStyle(new URL("https://192.0.0.10:1900/")), true); + assert.equal(isIpEndpointStyle(new URL("https://192.0.0.10")), true); assert.equal( isIpEndpointStyle( - URLBuilder.parse("https://2001:db8:85a3:8d3:1319:8a2e:370:7348/accountName/containerName") + new URL("https://2001:db8:85a3:8d3:1319:8a2e:370:7348/accountName/containerName") ), true ); - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://2001::1")), true); - // assert.equal(isIpEndpointStyle(URLBuilder.parse('https://::1')), true); currently not working due to http url.ts's issue. uncomment after core lib fixed. + assert.equal(isIpEndpointStyle(new URL("https://2001::1")), true); + // assert.equal(isIpEndpointStyle(new URL('https://::1')), true); currently not working due to http url.ts's issue. uncomment after core lib fixed. - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://255")), false); - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://255.255")), false); - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://a.b.c.d")), false); - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://256.1.1.1")), false); - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://255.256.1.1")), false); - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://255.255.256.1")), false); - assert.equal(isIpEndpointStyle(URLBuilder.parse("https://255.255.255.256")), false); + assert.equal(isIpEndpointStyle(new URL("https://255")), false); + assert.equal(isIpEndpointStyle(new URL("https://255.255")), false); + assert.equal(isIpEndpointStyle(new URL("https://a.b.c.d")), false); + assert.equal(isIpEndpointStyle(new URL("https://256.1.1.1")), false); + assert.equal(isIpEndpointStyle(new URL("https://255.256.1.1")), false); + assert.equal(isIpEndpointStyle(new URL("https://255.255.256.1")), false); + assert.equal(isIpEndpointStyle(new URL("https://255.255.255.256")), false); }); }); diff --git a/sdk/storage/storage-file-share/test/utils/InjectorPolicy.ts b/sdk/storage/storage-file-share/test/utils/InjectorPolicy.ts index 7258f29a3b52..f42ecd2a3136 100644 --- a/sdk/storage/storage-file-share/test/utils/InjectorPolicy.ts +++ b/sdk/storage/storage-file-share/test/utils/InjectorPolicy.ts @@ -2,13 +2,12 @@ // Licensed under the MIT license. import { - BaseRequestPolicy, - HttpOperationResponse, - RequestPolicy, - RequestPolicyOptions, + PipelineRequest, + PipelineResponse, + SendRequest, + PipelinePolicy, RestError, - WebResource, -} from "../../src"; +} from "@azure/core-rest-pipeline"; export interface NextInjectErrorHolder { nextInjectError?: RestError; @@ -17,32 +16,23 @@ export interface NextInjectErrorHolder { export type Injector = () => RestError | undefined; /** - * InjectorPolicy will inject a customized error before next HTTP request. + * The programmatic identifier of the injectorPolicy. */ -export class InjectorPolicy extends BaseRequestPolicy { - /** - * Creates an instance of InjectorPolicy. - * - * @param nextPolicy - - * @param options - - */ - public constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptions, injector: Injector) { - super(nextPolicy, options); - this.injector = injector; - } +export const injectorPolicyName = "injectorPolicy"; - /** - * Sends request. - * - * @param request - - */ - public async sendRequest(request: WebResource): Promise { - const error = this.injector(); - if (error) { - throw error; - } - return this._nextPolicy.sendRequest(request); - } - - private injector: Injector; +/** + * injectorPolicy is a policy used to introduce errors into the pipeline + * for the purposes of testing policies such as retry. + */ +export function injectorPolicy(injector: Injector): PipelinePolicy { + return { + name: injectorPolicyName, + async sendRequest(request: PipelineRequest, next: SendRequest): Promise { + const error = injector(); + if (error) { + throw error; + } + return next(request); + }, + }; } diff --git a/sdk/storage/storage-file-share/test/utils/InjectorPolicyFactory.ts b/sdk/storage/storage-file-share/test/utils/InjectorPolicyFactory.ts deleted file mode 100644 index 29e42ee90d15..000000000000 --- a/sdk/storage/storage-file-share/test/utils/InjectorPolicyFactory.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from "../../src"; -import { Injector, InjectorPolicy } from "./InjectorPolicy"; - -/** - * InjectorPolicyFactory is a factory class which injects customized errors for retry policy testing. - */ -export class InjectorPolicyFactory implements RequestPolicyFactory { - public readonly injector: Injector; - - public constructor(injector: Injector) { - this.injector = injector; - } - - public create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): InjectorPolicy { - return new InjectorPolicy(nextPolicy, options, this.injector); - } -} diff --git a/sdk/storage/storage-file-share/test/utils/MockPolicy.ts b/sdk/storage/storage-file-share/test/utils/MockPolicy.ts deleted file mode 100644 index 0a446f5251c4..000000000000 --- a/sdk/storage/storage-file-share/test/utils/MockPolicy.ts +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { - BaseRequestPolicy, - HttpOperationResponse, - RequestPolicy, - RequestPolicyOptions, - WebResource, -} from "../../src"; - -/** - * Mock - */ -export class MockPolicy extends BaseRequestPolicy { - private responseHeaders?: { [key: string]: any }; - /** - * Creates an instance of MockPolicy. - * - * @param nextPolicy - - * @param options - - */ - public constructor( - nextPolicy: RequestPolicy, - options: RequestPolicyOptions, - responseHeaders: { [key: string]: any } = {} - ) { - super(nextPolicy, options); - this.responseHeaders = responseHeaders; - } - - /** - * Sends request. - * - * @param request - - */ - public async sendRequest(request: WebResource): Promise { - return this._nextPolicy.sendRequest(request).then((res) => { - res.parsedHeaders = { ...res.parsedHeaders, ...this.responseHeaders }; - return res; - }); - } -} diff --git a/sdk/storage/storage-file-share/test/utils/MockPolicyFactory.ts b/sdk/storage/storage-file-share/test/utils/MockPolicyFactory.ts deleted file mode 100644 index cc6373efee8e..000000000000 --- a/sdk/storage/storage-file-share/test/utils/MockPolicyFactory.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from "../../src"; -import { MockPolicy } from "./MockPolicy"; - -/** - * MockPolicyFactory is a factory class which tune the response for testing. - */ -export class MockPolicyFactory implements RequestPolicyFactory { - private responseHeaders?: { [key: string]: any }; - - public constructor(responseHeaders: { [key: string]: any } = {}) { - this.responseHeaders = responseHeaders; - } - - public create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): MockPolicy { - return new MockPolicy(nextPolicy, options, this.responseHeaders); - } -} diff --git a/sdk/storage/storage-file-share/test/utils/index.browser.ts b/sdk/storage/storage-file-share/test/utils/index.browser.ts index 6751768f2a07..7b37231d93f2 100644 --- a/sdk/storage/storage-file-share/test/utils/index.browser.ts +++ b/sdk/storage/storage-file-share/test/utils/index.browser.ts @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { AnonymousCredential } from "../../src/credentials/AnonymousCredential"; -import { newPipeline } from "../../src/Pipeline"; +import { AnonymousCredential } from "../../../storage-blob/src/credentials/AnonymousCredential"; +import { newPipeline } from "../../../storage-blob/src/Pipeline"; import { ShareServiceClient } from "../../src/ShareServiceClient"; export * from "./testutils.common"; diff --git a/sdk/storage/storage-file-share/test/utils/index.ts b/sdk/storage/storage-file-share/test/utils/index.ts index a8a99fa644f0..3c3ac01dc2ef 100644 --- a/sdk/storage/storage-file-share/test/utils/index.ts +++ b/sdk/storage/storage-file-share/test/utils/index.ts @@ -5,7 +5,7 @@ import { randomBytes } from "crypto"; import * as fs from "fs"; import * as path from "path"; -import { TokenCredential } from "@azure/core-http"; +import { TokenCredential } from "@azure/core-auth"; import { BlobServiceClient } from "@azure/storage-blob"; import { @@ -15,8 +15,8 @@ import { generateAccountSASQueryParameters, SASProtocol, } from "../../src"; -import { StorageSharedKeyCredential } from "../../src/credentials/StorageSharedKeyCredential"; -import { newPipeline } from "../../src/Pipeline"; +import { StorageSharedKeyCredential } from "../../../storage-blob/src/credentials/StorageSharedKeyCredential"; +import { newPipeline } from "../../../storage-blob/src/Pipeline"; import { ShareServiceClient } from "../../src/ShareServiceClient"; import { extractConnectionStringParts } from "../../src/utils/utils.common"; import { getUniqueName, SimpleTokenCredential } from "./testutils.common"; diff --git a/sdk/storage/storage-file-share/test/utils/testutils.common.ts b/sdk/storage/storage-file-share/test/utils/testutils.common.ts index 41724378f2a3..792254c872d7 100644 --- a/sdk/storage/storage-file-share/test/utils/testutils.common.ts +++ b/sdk/storage/storage-file-share/test/utils/testutils.common.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import { env, RecorderEnvironmentSetup } from "@azure-tools/test-recorder"; -import { AccessToken, GetTokenOptions, TokenCredential } from "@azure/core-http"; +import { AccessToken, GetTokenOptions, TokenCredential } from "@azure/core-auth"; export function isBrowser(): boolean { return typeof self !== "undefined"; diff --git a/sdk/storage/storage-file-share/tsconfig.json b/sdk/storage/storage-file-share/tsconfig.json index cc88fdbb63c5..f10e47bdbfdb 100644 --- a/sdk/storage/storage-file-share/tsconfig.json +++ b/sdk/storage/storage-file-share/tsconfig.json @@ -9,5 +9,5 @@ "@azure/storage-file-share": ["./src/index"] } }, - "include": ["./src/**/*.ts", "./test/**/*.ts", "./samples-dev/**/*.ts"] + "include": ["./src/**/*.ts", "./test/**/*.ts", "./samples-dev/**/*.ts", "../storage-blob/src/**/*.ts"] } From be779a0815850be56fa29a2dc4d0a9331e2c681d Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Fri, 2 Jun 2023 22:04:22 +0000 Subject: [PATCH 02/10] Fixup public surface --- .../review/storage-file-share.api.md | 429 ++++++--------- sdk/storage/storage-file-share/src/Clients.ts | 504 +++++++++++------- .../src/ShareServiceClient.ts | 12 +- .../storage-file-share/src/generatedModels.ts | 248 +++++++-- .../storage-file-share/src/index.browser.ts | 18 +- sdk/storage/storage-file-share/src/index.ts | 18 +- 6 files changed, 717 insertions(+), 512 deletions(-) diff --git a/sdk/storage/storage-file-share/review/storage-file-share.api.md b/sdk/storage/storage-file-share/review/storage-file-share.api.md index e6b9cc8bcf36..509a0fefa216 100644 --- a/sdk/storage/storage-file-share/review/storage-file-share.api.md +++ b/sdk/storage/storage-file-share/review/storage-file-share.api.md @@ -8,27 +8,26 @@ import { AbortSignalLike } from '@azure/abort-controller'; import { AzureLogger } from '@azure/logger'; -import { BaseRequestPolicy } from '@azure/core-http'; -import * as coreHttp from '@azure/core-http'; -import { deserializationPolicy } from '@azure/core-http'; -import { HttpHeaders } from '@azure/core-http'; -import { HttpOperationResponse } from '@azure/core-http'; -import { HttpRequestBody } from '@azure/core-http'; -import { HttpResponse } from '@azure/core-http'; -import { HttpClient as IHttpClient } from '@azure/core-http'; -import { KeepAliveOptions } from '@azure/core-http'; +import { CompatResponse } from '@azure/core-http-compat'; +import * as coreClient from '@azure/core-client'; +import * as coreHttpCompat from '@azure/core-http-compat'; +import * as coreRestPipeline from '@azure/core-rest-pipeline'; +import { HttpHeadersLike } from '@azure/core-http-compat'; +import { HttpPipelineLogLevel } from '@azure/core-http-compat'; +import { KeepAliveOptions } from '@azure/core-http-compat'; import { OperationTracingOptions } from '@azure/core-tracing'; import { PagedAsyncIterableIterator } from '@azure/core-paging'; -import { ProxyOptions } from '@azure/core-http'; +import { ProxySettings } from '@azure/core-rest-pipeline'; import { Readable } from 'stream'; -import { RequestPolicy } from '@azure/core-http'; -import { RequestPolicyFactory } from '@azure/core-http'; -import { RequestPolicyOptions } from '@azure/core-http'; -import { RestError } from '@azure/core-http'; -import { ServiceClientOptions } from '@azure/core-http'; -import { TransferProgressEvent } from '@azure/core-http'; -import { UserAgentOptions } from '@azure/core-http'; -import { WebResource } from '@azure/core-http'; +import { RequestBodyType } from '@azure/core-rest-pipeline'; +import { RequestPolicy } from '@azure/core-http-compat'; +import { RequestPolicyFactory } from '@azure/core-http-compat'; +import { RequestPolicyOptionsLike } from '@azure/core-http-compat'; +import { RestError } from '@azure/core-rest-pipeline'; +import { TokenCredential } from '@azure/core-auth'; +import { TransferProgressEvent } from '@azure/core-rest-pipeline'; +import { UserAgentPolicyOptions } from '@azure/core-rest-pipeline'; +import { WebResourceLike } from '@azure/core-http-compat'; // @public export interface AccessPolicy { @@ -84,15 +83,25 @@ export interface AccountSASSignatureValues { // @public export class AnonymousCredential extends Credential_2 { - create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): AnonymousCredentialPolicy; + create(nextPolicy: RequestPolicy, options: RequestPolicyOptionsLike): AnonymousCredentialPolicy; } // @public export class AnonymousCredentialPolicy extends CredentialPolicy { - constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptions); + constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptionsLike); } -export { BaseRequestPolicy } +// @public +export abstract class BaseRequestPolicy implements RequestPolicy { + protected constructor( + _nextPolicy: RequestPolicy, + _options: RequestPolicyOptionsLike); + log(logLevel: HttpPipelineLogLevel, message: string): void; + readonly _nextPolicy: RequestPolicy; + readonly _options: RequestPolicyOptionsLike; + abstract sendRequest(webResource: WebResourceLike): Promise; + shouldLog(logLevel: HttpPipelineLogLevel): boolean; +} // @public (undocumented) export interface ClearRange { @@ -155,24 +164,22 @@ export interface CorsRule { // @public abstract class Credential_2 implements RequestPolicyFactory { - create(_nextPolicy: RequestPolicy, _options: RequestPolicyOptions): RequestPolicy; + create(_nextPolicy: RequestPolicy, _options: RequestPolicyOptionsLike): RequestPolicy; } export { Credential_2 as Credential } // @public export abstract class CredentialPolicy extends BaseRequestPolicy { - sendRequest(request: WebResource): Promise; - protected signRequest(request: WebResource): WebResource; + sendRequest(request: WebResourceLike): Promise; + protected signRequest(request: WebResourceLike): WebResourceLike; } // @public -export type CredentialPolicyCreator = (nextPolicy: RequestPolicy, options: RequestPolicyOptions) => CredentialPolicy; +export type CredentialPolicyCreator = (nextPolicy: RequestPolicy, options: RequestPolicyOptionsLike) => CredentialPolicy; // @public export type DeleteSnapshotsOptionType = "include" | "include-leased"; -export { deserializationPolicy } - // @public export interface DirectoryCloseHandlesHeaders { date?: Date; @@ -211,11 +218,7 @@ export interface DirectoryCreateOptions extends FileAndDirectoryCreateCommonOpti } // @public -export type DirectoryCreateResponse = DirectoryCreateHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: DirectoryCreateHeaders; - }; -}; +export type DirectoryCreateResponse = WithResponse; // @public export interface DirectoryDeleteHeaders { @@ -236,11 +239,7 @@ export interface DirectoryDeleteOptions extends CommonOptions { } // @public -export type DirectoryDeleteResponse = DirectoryDeleteHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: DirectoryDeleteHeaders; - }; -}; +export type DirectoryDeleteResponse = WithResponse; // @public export interface DirectoryExistsOptions extends CommonOptions { @@ -264,11 +263,7 @@ export interface DirectoryForceCloseHandlesOptions extends CommonOptions { } // @public -export type DirectoryForceCloseHandlesResponse = CloseHandlesInfo & DirectoryCloseHandlesHeaders & { - _response: HttpResponse & { - parsedHeaders: DirectoryForceCloseHandlesHeaders; - }; -}; +export type DirectoryForceCloseHandlesResponse = WithResponse; // @public export interface DirectoryForceCloseHandlesSegmentOptions extends CommonOptions { @@ -303,11 +298,7 @@ export interface DirectoryGetPropertiesOptions extends CommonOptions { } // @public -export type DirectoryGetPropertiesResponse = DirectoryGetPropertiesHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: DirectoryGetPropertiesHeaders; - }; -}; +export type DirectoryGetPropertiesResponse = WithResponse; // @public export interface DirectoryItem { @@ -347,13 +338,7 @@ export interface DirectoryListFilesAndDirectoriesSegmentHeaders { } // @public -export type DirectoryListFilesAndDirectoriesSegmentResponse = DirectoryListFilesAndDirectoriesSegmentHeaders & ListFilesAndDirectoriesSegmentResponse & { - _response: coreHttp.HttpResponse & { - bodyAsText: string; - parsedBody: ListFilesAndDirectoriesSegmentResponse; - parsedHeaders: DirectoryListFilesAndDirectoriesSegmentHeaders; - }; -}; +export type DirectoryListFilesAndDirectoriesSegmentResponse = WithResponse; // @public export interface DirectoryListHandlesHeaders { @@ -371,13 +356,7 @@ export interface DirectoryListHandlesOptions extends CommonOptions { } // @public -export type DirectoryListHandlesResponse = DirectoryListHandlesHeaders & ListHandlesResponse & { - _response: coreHttp.HttpResponse & { - bodyAsText: string; - parsedBody: ListHandlesResponse; - parsedHeaders: DirectoryListHandlesHeaders; - }; -}; +export type DirectoryListHandlesResponse = WithResponse; // @public export interface DirectoryListHandlesSegmentOptions extends CommonOptions { @@ -423,11 +402,7 @@ export interface DirectoryRenameOptions extends CommonOptions { } // @public -export type DirectoryRenameResponse = DirectoryRenameHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: DirectoryRenameHeaders; - }; -}; +export type DirectoryRenameResponse = WithResponse; // @public export interface DirectorySetMetadataHeaders { @@ -445,11 +420,7 @@ export interface DirectorySetMetadataOptions extends CommonOptions { } // @public -export type DirectorySetMetadataResponse = DirectorySetMetadataHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: DirectorySetMetadataHeaders; - }; -}; +export type DirectorySetMetadataResponse = WithResponse; // @public export interface DirectorySetPropertiesHeaders { @@ -470,11 +441,7 @@ export interface DirectorySetPropertiesHeaders { } // @public -export type DirectorySetPropertiesResponse = DirectorySetPropertiesHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: DirectorySetPropertiesHeaders; - }; -}; +export type DirectorySetPropertiesResponse = WithResponse; // @public export interface FileAbortCopyFromURLOptions extends CommonOptions { @@ -491,11 +458,7 @@ export interface FileAbortCopyHeaders { } // @public -export type FileAbortCopyResponse = FileAbortCopyHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileAbortCopyHeaders; - }; -}; +export type FileAbortCopyResponse = WithResponse; // @public (undocumented) export interface FileAndDirectoryCreateCommonOptions { @@ -562,11 +525,7 @@ export interface FileCreateOptions extends FileAndDirectoryCreateCommonOptions, } // @public -export type FileCreateResponse = FileCreateHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileCreateHeaders; - }; -}; +export type FileCreateResponse = WithResponse; // @public export interface FileDeleteHeaders { @@ -588,11 +547,7 @@ export interface FileDeleteOptions extends CommonOptions { } // @public -export type FileDeleteResponse = FileDeleteHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileDeleteHeaders; - }; -}; +export type FileDeleteResponse = WithResponse; // @public export interface FileDownloadHeaders { @@ -635,7 +590,7 @@ export interface FileDownloadHeaders { } // @public -export interface FileDownloadOptionalParams extends coreHttp.OperationOptions { +export interface FileDownloadOptionalParams extends coreClient.OperationOptions { leaseAccessConditions?: LeaseAccessConditions; range?: string; rangeGetContentMD5?: boolean; @@ -652,13 +607,7 @@ export interface FileDownloadOptions extends CommonOptions { } // @public -export type FileDownloadResponseModel = FileDownloadHeaders & { - blobBody?: Promise; - readableStreamBody?: NodeJS.ReadableStream; - _response: coreHttp.HttpResponse & { - parsedHeaders: FileDownloadHeaders; - }; -}; +export type FileDownloadResponseModel = WithResponse; // @public export interface FileDownloadToBufferOptions extends CommonOptions { @@ -692,11 +641,7 @@ export interface FileForceCloseHandlesOptions extends CommonOptions { } // @public -export type FileForceCloseHandlesResponse = CloseHandlesInfo & FileCloseHandlesHeaders & { - _response: HttpResponse & { - parsedHeaders: FileForceCloseHandlesHeaders; - }; -}; +export type FileForceCloseHandlesResponse = WithResponse; // @public export interface FileGenerateSasUrlOptions extends CommonGenerateSasUrlOptions { @@ -748,20 +693,10 @@ export interface FileGetPropertiesOptions extends CommonOptions { } // @public -export type FileGetPropertiesResponse = FileGetPropertiesHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileGetPropertiesHeaders; - }; -}; +export type FileGetPropertiesResponse = WithResponse; // @public -export type FileGetRangeListDiffResponse = FileGetRangeListHeaders & ShareFileRangeList & { - _response: coreHttp.HttpResponse & { - bodyAsText: string; - parsedBody: ShareFileRangeList; - parsedHeaders: FileGetRangeListHeaders; - }; -}; +export type FileGetRangeListDiffResponse = WithResponse; // @public export interface FileGetRangeListHeaders { @@ -782,14 +717,9 @@ export interface FileGetRangeListOptions extends CommonOptions { } // @public -export type FileGetRangeListResponse = FileGetRangeListHeaders & { +export type FileGetRangeListResponse = WithResponse; // @public (undocumented) export interface FileHttpHeaders { @@ -832,13 +762,7 @@ export interface FileListHandlesOptions extends CommonOptions { } // @public -export type FileListHandlesResponse = FileListHandlesHeaders & ListHandlesResponse & { - _response: coreHttp.HttpResponse & { - bodyAsText: string; - parsedBody: ListHandlesResponse; - parsedHeaders: FileListHandlesHeaders; - }; -}; +export type FileListHandlesResponse = WithResponse; // @public export interface FileListHandlesSegmentOptions extends CommonOptions { @@ -920,11 +844,7 @@ export interface FileRenameOptions extends CommonOptions { } // @public -export type FileRenameResponse = FileRenameHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileRenameHeaders; - }; -}; +export type FileRenameResponse = WithResponse; // @public export interface FileResizeOptions extends FileAndDirectorySetPropertiesCommonOptions, CommonOptions { @@ -1001,11 +921,7 @@ export interface FileSetHttpHeadersOptions extends FileAndDirectorySetProperties } // @public -export type FileSetHTTPHeadersResponse = FileSetHTTPHeadersHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileSetHTTPHeadersHeaders; - }; -}; +export type FileSetHTTPHeadersResponse = WithResponse; // @public export interface FileSetMetadataHeaders { @@ -1024,11 +940,7 @@ export interface FileSetMetadataOptions extends CommonOptions { } // @public -export type FileSetMetadataResponse = FileSetMetadataHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileSetMetadataHeaders; - }; -}; +export type FileSetMetadataResponse = WithResponse; // @public export interface FileStartCopyHeaders { @@ -1053,11 +965,7 @@ export interface FileStartCopyOptions extends CommonOptions { } // @public -export type FileStartCopyResponse = FileStartCopyHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileStartCopyHeaders; - }; -}; +export type FileStartCopyResponse = WithResponse; // @public export class FileSystemAttributes { @@ -1089,7 +997,7 @@ export interface FileUploadRangeFromURLHeaders { } // @public -export interface FileUploadRangeFromURLOptionalParams extends coreHttp.OperationOptions { +export interface FileUploadRangeFromURLOptionalParams extends coreClient.OperationOptions { copySourceAuthorization?: string; fileLastWrittenMode?: FileLastWrittenMode; leaseAccessConditions?: LeaseAccessConditions; @@ -1111,11 +1019,7 @@ export interface FileUploadRangeFromURLOptions extends CommonOptions { } // @public -export type FileUploadRangeFromURLResponse = FileUploadRangeFromURLHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileUploadRangeFromURLHeaders; - }; -}; +export type FileUploadRangeFromURLResponse = WithResponse; // @public export interface FileUploadRangeHeaders { @@ -1140,11 +1044,7 @@ export interface FileUploadRangeOptions extends CommonOptions { } // @public -export type FileUploadRangeResponse = FileUploadRangeHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: FileUploadRangeHeaders; - }; -}; +export type FileUploadRangeResponse = WithResponse; // @public export interface FileUploadStreamOptions extends CommonOptions { @@ -1179,13 +1079,15 @@ export interface HttpAuthorization { value: string; } -export { HttpHeaders } - -export { HttpOperationResponse } - -export { HttpRequestBody } +// @public +export interface HttpResponse { + headers: HttpHeadersLike; + request: WebResourceLike; + status: number; +} -export { IHttpClient } +// @public +export function isPipelineLike(pipeline: unknown): pipeline is PipelineLike; // @public export interface LeaseAccessConditions { @@ -1201,11 +1103,7 @@ export interface LeaseOperationOptions extends CommonOptions { } // @public -export type LeaseOperationResponse = LeaseOperationResponseHeaders & { - _response: HttpResponse & { - parsedHeaders: LeaseOperationResponseHeaders; - }; -}; +export type LeaseOperationResponse = WithResponse; // @public export interface LeaseOperationResponseHeaders { @@ -1310,22 +1208,29 @@ export interface Metrics { } // @public -export function newPipeline(credential?: Credential_2, pipelineOptions?: StoragePipelineOptions): Pipeline; +export function newPipeline(credential?: StorageSharedKeyCredential | AnonymousCredential | TokenCredential, pipelineOptions?: StoragePipelineOptions): Pipeline; // @public export type PermissionCopyModeType = "source" | "override"; // @public -export class Pipeline { +export class Pipeline implements PipelineLike { constructor(factories: RequestPolicyFactory[], options?: PipelineOptions); readonly factories: RequestPolicyFactory[]; readonly options: PipelineOptions; toServiceClientOptions(): ServiceClientOptions; } +// @public +export interface PipelineLike { + readonly factories: RequestPolicyFactory[]; + readonly options: PipelineOptions; + toServiceClientOptions(): ServiceClientOptions; +} + // @public export interface PipelineOptions { - httpClient?: IHttpClient; + httpClient?: RequestPolicy; } // @public @@ -1341,11 +1246,32 @@ export interface RangeModel { start: number; } -export { RequestPolicy } +// @public +export type RawFileDownloadResponse = FileDownloadHeaders & { + blobBody?: Promise; + readableStreamBody?: NodeJS.ReadableStream; +}; -export { RequestPolicyFactory } +// @public +export interface ResponseLike { + _response: HttpResponse; +} -export { RequestPolicyOptions } +// @public +export interface ResponseWithBody { + _response: HttpResponse & { + parsedHeaders: Headers; + bodyAsText: string; + parsedBody: Body; + }; +} + +// @public +export interface ResponseWithHeaders { + _response: HttpResponse & { + parsedHeaders: Headers; + }; +} export { RestError } @@ -1389,6 +1315,12 @@ export class SASQueryParameters { readonly version: string; } +// @public +export interface ServiceClientOptions { + httpClient?: RequestPolicy; + requestPolicyFactories?: RequestPolicyFactory[] | ((defaultRequestPolicyFactories: RequestPolicyFactory[]) => void | RequestPolicyFactory[]); +} + // @public export interface ServiceGenerateAccountSasUrlOptions { ipRange?: SasIPRange; @@ -1410,13 +1342,7 @@ export interface ServiceGetPropertiesOptions extends CommonOptions { } // @public -export type ServiceGetPropertiesResponse = ServiceGetPropertiesHeaders & FileServiceProperties & { - _response: coreHttp.HttpResponse & { - bodyAsText: string; - parsedBody: FileServiceProperties; - parsedHeaders: ServiceGetPropertiesHeaders; - }; -}; +export type ServiceGetPropertiesResponse = WithResponse; // @public export interface ServiceListSharesOptions extends CommonOptions { @@ -1435,13 +1361,7 @@ export interface ServiceListSharesSegmentHeaders { } // @public -export type ServiceListSharesSegmentResponse = ListSharesResponse & ServiceListSharesSegmentHeaders & { - _response: HttpResponse & { - parsedHeaders: ServiceListSharesSegmentHeaders; - bodyAsText: string; - parsedBody: ListSharesResponseModel; - }; -}; +export type ServiceListSharesSegmentResponse = WithResponse; // @public export interface ServiceSetPropertiesHeaders { @@ -1456,11 +1376,7 @@ export interface ServiceSetPropertiesOptions extends CommonOptions { } // @public -export type ServiceSetPropertiesResponse = ServiceSetPropertiesHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: ServiceSetPropertiesHeaders; - }; -}; +export type ServiceSetPropertiesResponse = WithResponse; // @public export interface ServiceUndeleteShareOptions extends CommonOptions { @@ -1479,7 +1395,7 @@ export type ShareAccessTier = "TransactionOptimized" | "Hot" | "Cool"; // @public export class ShareClient extends StorageClient { constructor(connectionString: string, name: string, options?: StoragePipelineOptions); - constructor(url: string, credential?: Credential_2, options?: StoragePipelineOptions); + constructor(url: string, credential?: StorageSharedKeyCredential | AnonymousCredential, options?: StoragePipelineOptions); constructor(url: string, pipeline: Pipeline); create(options?: ShareCreateOptions): Promise; createDirectory(directoryName: string, options?: DirectoryCreateOptions): Promise<{ @@ -1556,18 +1472,10 @@ export interface ShareCreatePermissionOptions extends CommonOptions { } // @public -export type ShareCreatePermissionResponse = ShareCreatePermissionHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: ShareCreatePermissionHeaders; - }; -}; +export type ShareCreatePermissionResponse = WithResponse; // @public -export type ShareCreateResponse = ShareCreateHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: ShareCreateHeaders; - }; -}; +export type ShareCreateResponse = WithResponse; // @public export interface ShareCreateSnapshotHeaders { @@ -1589,11 +1497,7 @@ export interface ShareCreateSnapshotOptions extends CommonOptions { } // @public -export type ShareCreateSnapshotResponse = ShareCreateSnapshotHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: ShareCreateSnapshotHeaders; - }; -}; +export type ShareCreateSnapshotResponse = WithResponse; // @public export interface ShareDeleteHeaders { @@ -1616,15 +1520,11 @@ export interface ShareDeleteMethodOptions extends CommonOptions { } // @public -export type ShareDeleteResponse = ShareDeleteHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: ShareDeleteHeaders; - }; -}; +export type ShareDeleteResponse = WithResponse; // @public export class ShareDirectoryClient extends StorageClient { - constructor(url: string, credential?: Credential_2, options?: StoragePipelineOptions); + constructor(url: string, credential?: AnonymousCredential | StorageSharedKeyCredential, options?: StoragePipelineOptions); constructor(url: string, pipeline: Pipeline); create(options?: DirectoryCreateOptions): Promise; createFile(fileName: string, size: number, options?: FileCreateOptions): Promise<{ @@ -1671,7 +1571,7 @@ export interface ShareExistsOptions extends CommonOptions { // @public export class ShareFileClient extends StorageClient { - constructor(url: string, credential?: Credential_2, options?: StoragePipelineOptions); + constructor(url: string, credential?: AnonymousCredential | StorageSharedKeyCredential, options?: StoragePipelineOptions); constructor(url: string, pipeline: Pipeline); abortCopyFromURL(copyId: string, options?: FileAbortCopyFromURLOptions): Promise; clearRange(offset: number, contentLength: number, options?: FileClearRangeOptions): Promise; @@ -1705,7 +1605,7 @@ export class ShareFileClient extends StorageClient { startCopyFromURL(copySource: string, options?: FileStartCopyOptions): Promise; uploadData(data: Buffer | Blob | ArrayBuffer | ArrayBufferView, options?: FileParallelUploadOptions): Promise; uploadFile(filePath: string, options?: FileParallelUploadOptions): Promise; - uploadRange(body: HttpRequestBody, offset: number, contentLength: number, options?: FileUploadRangeOptions): Promise; + uploadRange(body: RequestBodyType, offset: number, contentLength: number, options?: FileUploadRangeOptions): Promise; uploadRangeFromURL(sourceURL: string, sourceOffset: number, destOffset: number, count: number, options?: FileUploadRangeFromURLOptions): Promise; uploadResetableStream(streamFactory: (offset: number, count?: number) => NodeJS.ReadableStream, size: number, options?: FileParallelUploadOptions): Promise; uploadSeekableBlob(blobFactory: (offset: number, size: number) => Blob, size: number, options?: FileParallelUploadOptions): Promise; @@ -1743,15 +1643,9 @@ export interface ShareGetAccessPolicyOptions extends CommonOptions { } // @public (undocumented) -export type ShareGetAccessPolicyResponse = { +export type ShareGetAccessPolicyResponse = WithResponse<{ signedIdentifiers: SignedIdentifier[]; -} & ShareGetAccessPolicyHeaders & { - _response: HttpResponse & { - parsedHeaders: ShareGetAccessPolicyHeaders; - bodyAsText: string; - parsedBody: SignedIdentifierModel[]; - }; -}; +} & ShareGetAccessPolicyHeaders, ShareGetAccessPolicyHeaders, SignedIdentifierModel[]>; // @public export interface ShareGetPermissionHeaders { @@ -1767,13 +1661,7 @@ export interface ShareGetPermissionOptions extends CommonOptions { } // @public -export type ShareGetPermissionResponse = ShareGetPermissionHeaders & SharePermission & { - _response: coreHttp.HttpResponse & { - bodyAsText: string; - parsedBody: SharePermission; - parsedHeaders: ShareGetPermissionHeaders; - }; -}; +export type ShareGetPermissionResponse = WithResponse; // @public export interface ShareGetPropertiesHeaders { @@ -1814,11 +1702,7 @@ export type ShareGetPropertiesResponse = ShareGetPropertiesResponseModel & { }; // @public -export type ShareGetPropertiesResponseModel = ShareGetPropertiesHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: ShareGetPropertiesHeaders; - }; -}; +export type ShareGetPropertiesResponseModel = WithResponse; // @public export interface ShareGetStatisticsHeaders { @@ -1842,13 +1726,7 @@ export type ShareGetStatisticsResponse = ShareGetStatisticsResponseModel & { }; // @public -export type ShareGetStatisticsResponseModel = ShareGetStatisticsHeaders & ShareStats & { - _response: coreHttp.HttpResponse & { - bodyAsText: string; - parsedBody: ShareStats; - parsedHeaders: ShareGetStatisticsHeaders; - }; -}; +export type ShareGetStatisticsResponseModel = WithResponse; // @public export interface ShareItem { @@ -1970,7 +1848,7 @@ export class ShareSASPermissions { // @public export class ShareServiceClient extends StorageClient { - constructor(url: string, credential?: Credential_2, options?: StoragePipelineOptions); + constructor(url: string, credential?: AnonymousCredential | StorageSharedKeyCredential, options?: StoragePipelineOptions); constructor(url: string, pipeline: Pipeline); createShare(shareName: string, options?: ShareCreateOptions): Promise<{ shareCreateResponse: ShareCreateResponse; @@ -2003,11 +1881,7 @@ export interface ShareSetAccessPolicyOptions extends CommonOptions { } // @public -export type ShareSetAccessPolicyResponse = ShareSetAccessPolicyHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: ShareSetAccessPolicyHeaders; - }; -}; +export type ShareSetAccessPolicyResponse = WithResponse; // @public export interface ShareSetMetadataHeaders { @@ -2026,11 +1900,7 @@ export interface ShareSetMetadataOptions extends CommonOptions { } // @public -export type ShareSetMetadataResponse = ShareSetMetadataHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: ShareSetMetadataHeaders; - }; -}; +export type ShareSetMetadataResponse = WithResponse; // @public export interface ShareSetPropertiesHeaders { @@ -2052,11 +1922,7 @@ export interface ShareSetPropertiesOptions extends CommonOptions { } // @public -export type ShareSetPropertiesResponse = ShareSetPropertiesHeaders & { - _response: coreHttp.HttpResponse & { - parsedHeaders: ShareSetPropertiesHeaders; - }; -}; +export type ShareSetPropertiesResponse = WithResponse; // @public export type ShareSetQuotaHeaders = ShareSetPropertiesHeaders; @@ -2068,7 +1934,7 @@ export interface ShareSetQuotaOptions extends CommonOptions { } // @public -export type ShareSetQuotaResponse = ShareSetPropertiesResponse; +export type ShareSetQuotaResponse = WithResponse; // @public export interface ShareSmbSettings { @@ -2109,22 +1975,23 @@ export interface SourceModifiedAccessConditions { // @public export class StorageBrowserPolicy extends BaseRequestPolicy { - constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptions); - sendRequest(request: WebResource): Promise; + constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptionsLike); + sendRequest(request: WebResourceLike): Promise; } // @public export class StorageBrowserPolicyFactory implements RequestPolicyFactory { - create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): StorageBrowserPolicy; + create(nextPolicy: RequestPolicy, options: RequestPolicyOptionsLike): StorageBrowserPolicy; } // @public export interface StoragePipelineOptions { - httpClient?: IHttpClient; + audience?: string | string[]; + httpClient?: RequestPolicy; keepAliveOptions?: KeepAliveOptions; - proxyOptions?: ProxyOptions; + proxyOptions?: ProxySettings; retryOptions?: StorageRetryOptions; - userAgentOptions?: UserAgentOptions; + userAgentOptions?: UserAgentPolicyOptions; } // @public @@ -2133,21 +2000,22 @@ export interface StorageRetryOptions { readonly maxTries?: number; readonly retryDelayInMs?: number; readonly retryPolicyType?: StorageRetryPolicyType; + readonly secondaryHost?: string; readonly tryTimeoutInMs?: number; } // @public export class StorageRetryPolicy extends BaseRequestPolicy { - constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptions, retryOptions?: StorageRetryOptions); - protected attemptSendRequest(request: WebResource, secondaryHas404: boolean, attempt: number): Promise; - sendRequest(request: WebResource): Promise; - protected shouldRetry(isPrimaryRetry: boolean, attempt: number, response?: HttpOperationResponse, err?: RestError): boolean; + constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptionsLike, retryOptions?: StorageRetryOptions); + protected attemptSendRequest(request: WebResourceLike, secondaryHas404: boolean, attempt: number): Promise; + sendRequest(request: WebResourceLike): Promise; + protected shouldRetry(isPrimaryRetry: boolean, attempt: number, response?: CompatResponse, err?: RestError): boolean; } // @public export class StorageRetryPolicyFactory implements RequestPolicyFactory { constructor(retryOptions?: StorageRetryOptions); - create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): StorageRetryPolicy; + create(nextPolicy: RequestPolicy, options: RequestPolicyOptionsLike): StorageRetryPolicy; } // @public @@ -2161,13 +2029,13 @@ export class StorageSharedKeyCredential extends Credential_2 { constructor(accountName: string, accountKey: string); readonly accountName: string; computeHMACSHA256(stringToSign: string): string; - create(nextPolicy: RequestPolicy, options: RequestPolicyOptions): StorageSharedKeyCredentialPolicy; + create(nextPolicy: RequestPolicy, options: RequestPolicyOptionsLike): StorageSharedKeyCredentialPolicy; } // @public export class StorageSharedKeyCredentialPolicy extends CredentialPolicy { - constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptions, factory: StorageSharedKeyCredential); - protected signRequest(request: WebResource): WebResource; + constructor(nextPolicy: RequestPolicy, options: RequestPolicyOptionsLike, factory: StorageSharedKeyCredential); + protected signRequest(request: WebResourceLike): WebResourceLike; } // @public @@ -2176,7 +2044,8 @@ export type TimeNowType = "now"; // @public export type TimePreserveType = "preserve"; -export { WebResource } +// @public +export type WithResponse = T & (Body extends object ? ResponseWithBody : Headers extends object ? ResponseWithHeaders : ResponseLike); // (No @packageDocumentation comment for this package) diff --git a/sdk/storage/storage-file-share/src/Clients.ts b/sdk/storage/storage-file-share/src/Clients.ts index 2be330ad50eb..52b4347b53b5 100644 --- a/sdk/storage/storage-file-share/src/Clients.ts +++ b/sdk/storage/storage-file-share/src/Clients.ts @@ -59,7 +59,41 @@ import { DirectoryRenameResponse, FileLastWrittenMode, ShareFileRangeList, + ShareCreateHeaders, + ShareGetPropertiesHeaders, + ShareDeleteHeaders, + ShareSetMetadataHeaders, + ShareSetAccessPolicyHeaders, + ShareCreateSnapshotHeaders, + ShareSetPropertiesHeaders, + ShareGetStatisticsHeaders, + ShareStats, + ShareCreatePermissionHeaders, + ShareGetPermissionHeaders, + SharePermission, + DirectoryCreateHeaders, + DirectorySetPropertiesHeaders, + DirectoryGetPropertiesHeaders, + DirectoryDeleteHeaders, + DirectorySetMetadataHeaders, + DirectoryListFilesAndDirectoriesSegmentHeaders, + ListFilesAndDirectoriesSegmentResponse, + ListHandlesResponse, + DirectoryListHandlesHeaders, + DirectoryRenameHeaders, + FileCreateHeaders, + FileDownloadHeaders, + FileGetPropertiesHeaders, + FileDeleteHeaders, + FileSetMetadataHeaders, + FileUploadRangeHeaders, + FileUploadRangeFromURLHeaders, + FileStartCopyHeaders, + FileAbortCopyHeaders, + FileListHandlesHeaders, + RawFileDownloadResponse, } from "./generatedModels"; +import { FileRenameHeaders } from "./generated/src/models"; import { Share, Directory, File } from "./generated/src/operationsInterfaces"; import { newPipeline, @@ -126,7 +160,7 @@ import { readStreamToLocalFile, streamToBuffer, } from "./utils/utils.node"; -import { StorageClient as StorageClientContext } from "./generated/src/"; +import { FileSetHttpHeadersHeaders, StorageClient as StorageClientContext } from "./generated/src/"; import { v4 as generateUuid } from "uuid"; import { generateFileSASQueryParameters } from "./FileSASSignatureValues"; import { ShareSASPermissions } from "./ShareSASPermissions"; @@ -670,10 +704,12 @@ export class ShareClient extends StorageClient { public async create(options: ShareCreateOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareClient-create", options); try { - return await this.context.create({ - ...updatedOptions, - enabledProtocols: toShareProtocolsString(options.protocols), - }); + return assertResponse( + await this.context.create({ + ...updatedOptions, + enabledProtocols: toShareProtocolsString(updatedOptions.protocols), + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -938,14 +974,13 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-getProperties", options); try { - const res = await this.context.getProperties({ - ...updatedOptions, - }); - - // parse protocols - const protocols = toShareProtocols(res.enabledProtocols); - (res as any).protocols = protocols; - return res; + const res = assertResponse( + await this.context.getProperties(updatedOptions) + ); + return { + ...res, + protocols: toShareProtocols(res.enabledProtocols), + }; } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -968,9 +1003,11 @@ export class ShareClient extends StorageClient { public async delete(options: ShareDeleteMethodOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareClient-delete", options); try { - return await this.context.delete({ - ...updatedOptions, - }); + return assertResponse( + await this.context.delete({ + ...updatedOptions, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -1038,10 +1075,12 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-setMetadata", options); try { - return await this.context.setMetadata({ - ...updatedOptions, - metadata, - }); + return assertResponse( + await this.context.setMetadata({ + ...updatedOptions, + metadata, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -1163,10 +1202,12 @@ export class ShareClient extends StorageClient { }); } - return await this.context.setAccessPolicy({ - ...updatedOptions, - shareAcl: acl, - }); + return assertResponse( + await this.context.setAccessPolicy({ + ...updatedOptions, + shareAcl: acl, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -1189,7 +1230,9 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-createSnapshot", options); try { - return await this.context.createSnapshot(updatedOptions); + return assertResponse( + await this.context.createSnapshot(updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -1216,10 +1259,12 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-setQuota", options); try { - return await this.context.setProperties({ - ...updatedOptions, - quota: quotaInGB, - }); + return assertResponse( + await this.context.setProperties({ + ...updatedOptions, + quota: quotaInGB, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -1242,11 +1287,13 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-setProperties", options); try { - return await this.context.setProperties({ - ...options, - quota: options.quotaInGB, - tracingOptions: updatedOptions.tracingOptions, - }); + return assertResponse( + await this.context.setProperties({ + ...options, + quota: options.quotaInGB, + tracingOptions: updatedOptions.tracingOptions, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -1269,7 +1316,11 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-getStatistics", options); try { - const response = await this.context.getStatistics(updatedOptions); + const response = assertResponse< + ShareGetStatisticsHeaders & ShareStats, + ShareGetStatisticsHeaders, + ShareStats + >(await this.context.getStatistics(updatedOptions)); const GBBytes = 1024 * 1024 * 1024; return { ...response, shareUsage: Math.ceil(response.shareUsageBytes / GBBytes) }; @@ -1298,11 +1349,13 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-createPermission", options); try { - return await this.context.createPermission( - { - permission: filePermission, - }, - updatedOptions + return assertResponse( + await this.context.createPermission( + { + permission: filePermission, + }, + updatedOptions + ) ); } catch (e: any) { span.setStatus({ @@ -1329,7 +1382,11 @@ export class ShareClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareClient-getPermission", options); try { - return await this.context.getPermission(filePermissionKey, updatedOptions); + return assertResponse< + ShareGetPermissionHeaders & SharePermission, + ShareGetPermissionHeaders, + SharePermission + >(await this.context.getPermission(filePermissionKey, updatedOptions)); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -1751,16 +1808,18 @@ export class ShareDirectoryClient extends StorageClient { } const { span, updatedOptions } = createSpan("ShareDirectoryClient-create", options); try { - return await this.context.create( - updatedOptions.fileAttributes - ? fileAttributesToString(updatedOptions.fileAttributes!) - : FileAttributesNone, - { - ...updatedOptions, - fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), - fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), - } + return assertResponse( + await this.context.create( + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) + : FileAttributesNone, + { + ...updatedOptions, + fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), + } + ) ); } catch (e: any) { span.setStatus({ @@ -1826,16 +1885,18 @@ export class ShareDirectoryClient extends StorageClient { properties = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(properties); const { span, updatedOptions } = createSpan("ShareDirectoryClient-setProperties", properties); try { - return await this.context.setProperties( - updatedOptions.fileAttributes - ? fileAttributesToString(updatedOptions.fileAttributes!) - : FileAttributesPreserve, - { - ...updatedOptions, - fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), - fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), - } + return assertResponse( + await this.context.setProperties( + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) + : FileAttributesPreserve, + { + ...updatedOptions, + fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), + } + ) ); } catch (e: any) { span.setStatus({ @@ -2073,7 +2134,9 @@ export class ShareDirectoryClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareDirectoryClient-getProperties", options); try { - return await this.context.getProperties(updatedOptions); + return assertResponse( + await this.context.getProperties(updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -2096,7 +2159,9 @@ export class ShareDirectoryClient extends StorageClient { public async delete(options: DirectoryDeleteOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareDirectoryClient-delete", options); try { - return await this.context.delete(updatedOptions); + return assertResponse( + await this.context.delete(updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -2164,10 +2229,12 @@ export class ShareDirectoryClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareDirectoryClient-setMetadata", options); try { - return await this.context.setMetadata({ - ...updatedOptions, - metadata, - }); + return assertResponse( + await this.context.setMetadata({ + ...updatedOptions, + metadata, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -2403,10 +2470,16 @@ export class ShareDirectoryClient extends StorageClient { } try { - return await this.context.listFilesAndDirectoriesSegment({ - ...updatedOptions, - marker, - }); + return assertResponse< + DirectoryListFilesAndDirectoriesSegmentHeaders & ListFilesAndDirectoriesSegmentResponse, + DirectoryListFilesAndDirectoriesSegmentHeaders, + ListFilesAndDirectoriesSegmentResponse + >( + await this.context.listFilesAndDirectoriesSegment({ + ...updatedOptions, + marker, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -2584,10 +2657,16 @@ export class ShareDirectoryClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareDirectoryClient-listHandlesSegment", options); try { marker = marker === "" ? undefined : marker; - const response = await this.context.listHandles({ - ...updatedOptions, - marker, - }); + const response = assertResponse< + DirectoryListHandlesHeaders & ListHandlesResponse, + DirectoryListHandlesHeaders, + ListHandlesResponse + >( + await this.context.listHandles({ + ...updatedOptions, + marker, + }) + ); // TODO: Protocol layer issue that when handle list is in returned XML // response.handleList is an empty string @@ -2776,19 +2855,21 @@ export class ShareDirectoryClient extends StorageClient { const destDirectory = new ShareDirectoryClient(destinationUrl, this.pipeline); try { - const response = await destDirectory.context.rename(this.url, { - ...updatedOptions, - sourceLeaseAccessConditions: updatedOptions.sourceLeaseAccessConditions - ? { - sourceLeaseId: updatedOptions.sourceLeaseAccessConditions.leaseId, - } - : undefined, - destinationLeaseAccessConditions: updatedOptions.destinationLeaseAccessConditions - ? { - destinationLeaseId: updatedOptions.destinationLeaseAccessConditions.leaseId, - } - : undefined, - }); + const response = assertResponse( + await destDirectory.context.rename(this.url, { + ...updatedOptions, + sourceLeaseAccessConditions: updatedOptions.sourceLeaseAccessConditions + ? { + sourceLeaseId: updatedOptions.sourceLeaseAccessConditions.leaseId, + } + : undefined, + destinationLeaseAccessConditions: updatedOptions.destinationLeaseAccessConditions + ? { + destinationLeaseId: updatedOptions.destinationLeaseAccessConditions.leaseId, + } + : undefined, + }) + ); return { destinationDirectoryClient: destDirectory, @@ -3684,17 +3765,19 @@ export class ShareFileClient extends StorageClient { options.fileHttpHeaders = options.fileHttpHeaders || {}; const { span, updatedOptions } = createSpan("ShareFileClient-create", options); try { - return await this.context.create( - size, - updatedOptions.fileAttributes - ? fileAttributesToString(updatedOptions.fileAttributes!) - : FileAttributesNone, - { - ...updatedOptions, - fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), - fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), - } + return assertResponse( + await this.context.create( + size, + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) + : FileAttributesNone, + { + ...updatedOptions, + fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), + } + ) ); } catch (e: any) { span.setStatus({ @@ -3780,13 +3863,15 @@ export class ShareFileClient extends StorageClient { } const downloadFullFile = offset === 0 && !count; - const res = await this.context.download({ - ...updatedOptions, - requestOptions: { - onDownloadProgress: isNode ? undefined : updatedOptions.onProgress, // for Node.js, progress is reported by RetriableReadableStream - }, - range: downloadFullFile ? undefined : rangeToString({ offset, count }), - }); + const res = assertResponse( + await this.context.download({ + ...updatedOptions, + requestOptions: { + onDownloadProgress: isNode ? undefined : updatedOptions.onProgress, // for Node.js, progress is reported by RetriableReadableStream + }, + range: downloadFullFile ? undefined : rangeToString({ offset, count }), + }) + ); // Return browser response immediately if (!isNode) { @@ -3898,7 +3983,9 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-getProperties", options); try { - return this.context.getProperties(updatedOptions); + return assertResponse( + await this.context.getProperties(updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -3924,16 +4011,18 @@ export class ShareFileClient extends StorageClient { properties.fileHttpHeaders = properties.fileHttpHeaders || {}; const { span, updatedOptions } = createSpan("ShareFileClient-setProperties", properties); try { - return await this.context.setHttpHeaders( - updatedOptions.fileAttributes - ? fileAttributesToString(updatedOptions.fileAttributes!) - : FileAttributesPreserve, - { - ...updatedOptions, - fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), - fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), - } + return assertResponse( + await this.context.setHttpHeaders( + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) + : FileAttributesPreserve, + { + ...updatedOptions, + fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), + } + ) ); } catch (e: any) { span.setStatus({ @@ -3966,7 +4055,9 @@ export class ShareFileClient extends StorageClient { public async delete(options: FileDeleteOptions = {}): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-delete", options); try { - return await this.context.delete(updatedOptions); + return assertResponse( + await this.context.delete(updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -4049,17 +4140,19 @@ export class ShareFileClient extends StorageClient { options = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(options); const { span, updatedOptions } = createSpan("ShareFileClient-setHTTPHeaders", options); try { - return await this.context.setHttpHeaders( - updatedOptions.fileAttributes - ? fileAttributesToString(updatedOptions.fileAttributes!) - : FileAttributesPreserve, - { - ...updatedOptions, - fileHttpHeaders, - fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), - fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), - fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), - } + return assertResponse( + await this.context.setHttpHeaders( + updatedOptions.fileAttributes + ? fileAttributesToString(updatedOptions.fileAttributes!) + : FileAttributesPreserve, + { + ...updatedOptions, + fileHttpHeaders, + fileCreatedOn: fileCreationTimeToString(updatedOptions.creationTime), + fileLastWriteOn: fileLastWriteTimeToString(updatedOptions.lastWriteTime), + fileChangeOn: fileChangeTimeToString(updatedOptions.changeTime), + } + ) ); } catch (e: any) { span.setStatus({ @@ -4094,15 +4187,14 @@ export class ShareFileClient extends StorageClient { options = validateAndSetDefaultsForFileAndDirectorySetPropertiesCommonOptions(options); const { span, updatedOptions } = createSpan("ShareFileClient-resize", options); try { - return await this.context.setHttpHeaders( - fileAttributesToString(updatedOptions.fileAttributes!), - { + return assertResponse( + await this.context.setHttpHeaders(fileAttributesToString(updatedOptions.fileAttributes!), { ...updatedOptions, fileContentLength: length, fileChangeOn: fileChangeTimeToString(options.changeTime), fileCreatedOn: fileCreationTimeToString(options.creationTime), fileLastWriteOn: fileLastWriteTimeToString(options.lastWriteTime), - } + }) ); } catch (e: any) { span.setStatus({ @@ -4132,10 +4224,12 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-setMetadata", options); try { - return await this.context.setMetadata({ - ...updatedOptions, - metadata, - }); + return assertResponse( + await this.context.setMetadata({ + ...updatedOptions, + metadata, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -4194,17 +4288,19 @@ export class ShareFileClient extends StorageClient { throw new RangeError(`offset must be < ${FILE_RANGE_MAX_SIZE_BYTES} bytes`); } - return await this.context.uploadRange( - rangeToString({ count: contentLength, offset }), - "update", - contentLength, - { - ...updatedOptions, - requestOptions: { - onUploadProgress: updatedOptions.onProgress, - }, - body, - } + return assertResponse( + await this.context.uploadRange( + rangeToString({ count: contentLength, offset }), + "update", + contentLength, + { + ...updatedOptions, + requestOptions: { + onUploadProgress: updatedOptions.onProgress, + }, + body, + } + ) ); } catch (e: any) { span.setStatus({ @@ -4244,16 +4340,18 @@ export class ShareFileClient extends StorageClient { throw new RangeError(`count must be > 0 and <= ${FILE_RANGE_MAX_SIZE_BYTES} bytes`); } - return await this.context.uploadRangeFromURL( - rangeToString({ offset: destOffset, count }), - sourceURL, - 0, - { - ...updatedOptions, - sourceRange: rangeToString({ offset: sourceOffset, count }), - sourceModifiedAccessConditions: updatedOptions.sourceConditions, - copySourceAuthorization: httpAuthorizationToString(updatedOptions.sourceAuthorization), - } + return assertResponse( + await this.context.uploadRangeFromURL( + rangeToString({ offset: destOffset, count }), + sourceURL, + 0, + { + ...updatedOptions, + sourceRange: rangeToString({ offset: sourceOffset, count }), + sourceModifiedAccessConditions: updatedOptions.sourceConditions, + copySourceAuthorization: httpAuthorizationToString(updatedOptions.sourceAuthorization), + } + ) ); } catch (e: any) { span.setStatus({ @@ -4284,11 +4382,13 @@ export class ShareFileClient extends StorageClient { throw new RangeError(`offset must >= 0 and contentLength must be > 0`); } - return await this.context.uploadRange( - rangeToString({ count: contentLength, offset }), - "clear", - 0, - updatedOptions + return assertResponse( + await this.context.uploadRange( + rangeToString({ count: contentLength, offset }), + "clear", + 0, + updatedOptions + ) ); } catch (e: any) { span.setStatus({ @@ -4312,7 +4412,7 @@ export class ShareFileClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareFileClient-getRangeList", options); try { const originalResponse = assertResponse< - FileGetRangeListDiffResponse, + FileGetRangeListHeaders & ShareFileRangeList, FileGetRangeListHeaders, ShareFileRangeList >( @@ -4354,11 +4454,17 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-getRangeListDiff", options); try { - return await this.context.getRangeList({ - ...updatedOptions, - prevsharesnapshot: prevShareSnapshot, - range: updatedOptions.range ? rangeToString(updatedOptions.range) : undefined, - }); + return assertResponse< + FileGetRangeListHeaders & ShareFileRangeList, + FileGetRangeListHeaders, + ShareFileRangeList + >( + await this.context.getRangeList({ + ...updatedOptions, + prevsharesnapshot: prevShareSnapshot, + range: updatedOptions.range ? rangeToString(updatedOptions.range) : undefined, + }) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -4388,7 +4494,9 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-startCopyFromURL", options); try { - return await this.context.startCopy(copySource, updatedOptions); + return assertResponse( + await this.context.startCopy(copySource, updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -4414,7 +4522,9 @@ export class ShareFileClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareFileClient-abortCopyFromURL", options); try { - return await this.context.abortCopy(copyId, updatedOptions); + return assertResponse( + await this.context.abortCopy(copyId, updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -4970,10 +5080,16 @@ export class ShareFileClient extends StorageClient { const { span, updatedOptions } = createSpan("ShareFileClient-listHandlesSegment", options); try { marker = marker === "" ? undefined : marker; - const response = await this.context.listHandles({ - ...updatedOptions, - marker, - }); + const response = assertResponse< + FileListHandlesHeaders & ListHandlesResponse, + FileListHandlesHeaders, + ListHandlesResponse + >( + await this.context.listHandles({ + ...updatedOptions, + marker, + }) + ); // TODO: Protocol layer issue that when handle list is in returned XML // response.handleList is an empty string @@ -5277,24 +5393,26 @@ export class ShareFileClient extends StorageClient { const destFile = new ShareFileClient(destinationUrl, this.pipeline); try { - const response = await destFile.context.rename(this.url, { - ...updatedOptions, - sourceLeaseAccessConditions: updatedOptions.sourceLeaseAccessConditions - ? { - sourceLeaseId: updatedOptions.sourceLeaseAccessConditions.leaseId, - } - : undefined, - destinationLeaseAccessConditions: updatedOptions.destinationLeaseAccessConditions - ? { - destinationLeaseId: updatedOptions.destinationLeaseAccessConditions.leaseId, - } - : undefined, - fileHttpHeaders: options.contentType - ? { - fileContentType: options.contentType, - } - : undefined, - }); + const response = assertResponse( + await destFile.context.rename(this.url, { + ...updatedOptions, + sourceLeaseAccessConditions: updatedOptions.sourceLeaseAccessConditions + ? { + sourceLeaseId: updatedOptions.sourceLeaseAccessConditions.leaseId, + } + : undefined, + destinationLeaseAccessConditions: updatedOptions.destinationLeaseAccessConditions + ? { + destinationLeaseId: updatedOptions.destinationLeaseAccessConditions.leaseId, + } + : undefined, + fileHttpHeaders: options.contentType + ? { + fileContentType: options.contentType, + } + : undefined, + }) + ); return { destinationFileClient: destFile, diff --git a/sdk/storage/storage-file-share/src/ShareServiceClient.ts b/sdk/storage/storage-file-share/src/ShareServiceClient.ts index bd94bc8c7d6c..271770710462 100644 --- a/sdk/storage/storage-file-share/src/ShareServiceClient.ts +++ b/sdk/storage/storage-file-share/src/ShareServiceClient.ts @@ -12,6 +12,8 @@ import { ServiceListSharesSegmentHeaders, ListSharesResponseModel, SharePropertiesInternal, + ServiceSetPropertiesHeaders, + ServiceGetPropertiesHeaders, } from "./generatedModels"; import { Service } from "./generated/src/operationsInterfaces"; import { newPipeline, StoragePipelineOptions, Pipeline } from "../../storage-blob/src/Pipeline"; @@ -391,7 +393,11 @@ export class ShareServiceClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareServiceClient-getProperties", options); try { - return await this.serviceContext.getProperties(updatedOptions); + return assertResponse< + ServiceGetPropertiesHeaders & FileServiceProperties, + ServiceGetPropertiesHeaders, + FileServiceProperties + >(await this.serviceContext.getProperties(updatedOptions)); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, @@ -418,7 +424,9 @@ export class ShareServiceClient extends StorageClient { ): Promise { const { span, updatedOptions } = createSpan("ShareServiceClient-setProperties", options); try { - return await this.serviceContext.setProperties(properties, updatedOptions); + return assertResponse( + await this.serviceContext.setProperties(properties, updatedOptions) + ); } catch (e: any) { span.setStatus({ code: SpanStatusCode.ERROR, diff --git a/sdk/storage/storage-file-share/src/generatedModels.ts b/sdk/storage/storage-file-share/src/generatedModels.ts index bb7e4f019bf9..2a79442f3483 100644 --- a/sdk/storage/storage-file-share/src/generatedModels.ts +++ b/sdk/storage/storage-file-share/src/generatedModels.ts @@ -1,54 +1,234 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. +import { + DirectoryCreateHeaders, + DirectoryDeleteHeaders, + DirectoryGetPropertiesHeaders, + DirectoryListFilesAndDirectoriesSegmentHeaders, + DirectoryListHandlesHeaders, + DirectoryRenameHeaders, + DirectorySetMetadataHeaders, + DirectorySetPropertiesHeaders, + FileAbortCopyHeaders, + FileCreateHeaders, + FileDeleteHeaders, + FileDownloadHeaders, + FileDownloadResponse, + FileGetPropertiesHeaders, + FileGetRangeListHeaders, + FileListHandlesHeaders, + FileRenameHeaders, + FileServiceProperties, + FileSetHttpHeadersHeaders, + FileSetMetadataHeaders, + FileStartCopyHeaders, + FileUploadRangeFromURLHeaders, + FileUploadRangeHeaders, + ListFilesAndDirectoriesSegmentResponse, + ListHandlesResponse, + ServiceGetPropertiesHeaders, + ServiceSetPropertiesHeaders, + ShareCreateHeaders, + ShareCreatePermissionHeaders, + ShareCreateSnapshotHeaders, + ShareDeleteHeaders, + ShareFileRangeList, + ShareGetAccessPolicyHeaders, + ShareGetPermissionHeaders, + ShareGetPropertiesHeaders, + ShareGetStatisticsHeaders, + SharePermission, + ShareSetAccessPolicyHeaders, + ShareSetMetadataHeaders, + ShareStats, +} from "./generated/src/models"; + +/** Contains response data for the create operation. */ +export type DirectoryCreateResponse = WithResponse; + +/** Contains response data for the delete operation. */ +export type DirectoryDeleteResponse = WithResponse; + +/** Contains response data for the getProperties operation. */ +export type DirectoryGetPropertiesResponse = WithResponse< + DirectoryGetPropertiesHeaders, + DirectoryGetPropertiesHeaders +>; + +/** Contains response data for the listFilesAndDirectoriesSegment operation. */ +export type DirectoryListFilesAndDirectoriesSegmentResponse = WithResponse< + DirectoryListFilesAndDirectoriesSegmentHeaders & ListFilesAndDirectoriesSegmentResponse, + DirectoryListFilesAndDirectoriesSegmentHeaders, + ListFilesAndDirectoriesSegmentResponse +>; + +/** Contains response data for the listHandles operation. */ +export type DirectoryListHandlesResponse = WithResponse< + DirectoryListHandlesHeaders & ListHandlesResponse, + DirectoryListHandlesHeaders, + ListHandlesResponse +>; + +/** Contains response data for the setMetadata operation. */ +export type DirectorySetMetadataResponse = WithResponse< + DirectorySetMetadataHeaders, + DirectorySetMetadataHeaders +>; + +/** Contains response data for the setProperties operation. */ +export type DirectorySetPropertiesResponse = WithResponse< + DirectorySetPropertiesHeaders, + DirectorySetPropertiesHeaders +>; + +/** Contains response data for the abortCopy operation. */ +export type FileAbortCopyResponse = WithResponse; + +/** Contains response data for the create operation. */ +export type FileCreateResponse = WithResponse; + +/** Contains response data for the delete operation. */ +export type FileDeleteResponse = WithResponse; + +/** Contains response data for the getProperties operation. */ +export type FileGetPropertiesResponse = WithResponse< + FileGetPropertiesHeaders, + FileGetPropertiesHeaders +>; + +/** Contains response data for the listHandles operation. */ +export type FileListHandlesResponse = WithResponse< + FileListHandlesHeaders & ListHandlesResponse, + FileListHandlesHeaders, + ListHandlesResponse +>; + +/** Contains response data for the setMetadata operation. */ +export type FileSetMetadataResponse = WithResponse; + +/** Contains response data for the startCopy operation. */ +export type FileStartCopyResponse = WithResponse; + +/** Contains response data for the uploadRange operation. */ +export type FileUploadRangeResponse = WithResponse; + +/** Contains response data for the getProperties operation. */ +export type ServiceGetPropertiesResponse = WithResponse< + ServiceGetPropertiesHeaders & FileServiceProperties, + ServiceGetPropertiesHeaders, + FileServiceProperties +>; + +/** Contains response data for the setProperties operation. */ +export type ServiceSetPropertiesResponse = WithResponse< + ServiceSetPropertiesHeaders, + ServiceSetPropertiesHeaders +>; + +/** Contains response data for the createPermission operation. */ +export type ShareCreatePermissionResponse = WithResponse< + ShareCreatePermissionHeaders, + ShareCreatePermissionHeaders +>; + +/** Contains response data for the create operation. */ +export type ShareCreateResponse = WithResponse; + +/** Contains response data for the createSnapshot operation. */ +export type ShareCreateSnapshotResponse = WithResponse< + ShareCreateSnapshotHeaders, + ShareCreateSnapshotHeaders +>; + +/** Contains response data for the delete operation. */ +export type ShareDeleteResponse = WithResponse; + +/** Contains response data for the getPermission operation. */ +export type ShareGetPermissionResponse = WithResponse< + ShareGetPermissionHeaders & SharePermission, + ShareGetPermissionHeaders, + SharePermission +>; + +/** Contains response data for the setAccessPolicy operation. */ +export type ShareSetAccessPolicyResponse = WithResponse< + ShareSetAccessPolicyHeaders, + ShareGetAccessPolicyHeaders +>; + +/** Contains response data for the setMetadata operation. */ +export type ShareSetMetadataResponse = WithResponse< + ShareSetMetadataHeaders, + ShareSetMetadataHeaders +>; + +/** Contains response data for the setProperties operation. */ +export type ShareSetPropertiesResponse = WithResponse< + ShareSetPropertiesHeaders, + ShareSetPropertiesHeaders +>; + +/** Contains response data for the rename operation. */ +export type DirectoryRenameResponse = WithResponse; + +/** Contains response data for the download operation. */ +export type FileDownloadResponseModel = WithResponse; + +/** Contains response data for the uploadRangeFromURL operation. */ +export type FileUploadRangeFromURLResponse = WithResponse< + FileUploadRangeFromURLHeaders, + FileUploadRangeFromURLHeaders +>; + +/** Contains response data for the getProperties operation. */ +export type ShareGetPropertiesResponseModel = WithResponse< + ShareGetPropertiesHeaders, + ShareGetPropertiesHeaders +>; + +/** Contains response data for the getStatistics operation. */ +export type ShareGetStatisticsResponseModel = WithResponse< + ShareGetStatisticsHeaders & ShareStats, + ShareGetStatisticsHeaders, + ShareStats +>; + +/** Contains response data for the getRangeList operation. */ +export type FileGetRangeListDiffResponse = WithResponse< + FileGetRangeListHeaders & ShareFileRangeList, + FileGetRangeListHeaders, + ShareFileRangeList +>; + +/** Contains response data for the setHttpHeaders operation. */ +export type FileSetHTTPHeadersResponse = WithResponse< + FileSetHttpHeadersHeaders, + FileSetHttpHeadersHeaders +>; + +/** Contains response data for the rename operation. */ +export type FileRenameResponse = WithResponse; + // explicitly exporting types that we need. export { CopyStatusType, DeleteSnapshotsOptionType, - DirectoryCreateResponse, - DirectoryDeleteResponse, - DirectoryGetPropertiesResponse, DirectoryItem, - DirectoryListFilesAndDirectoriesSegmentResponse, - DirectoryListHandlesResponse, - DirectorySetMetadataResponse, - DirectorySetPropertiesResponse, - FileAbortCopyResponse, - FileCreateResponse, - FileDeleteResponse, FileDownloadHeaders, FileDownloadOptionalParams, - FileDownloadResponse as FileDownloadResponseModel, - FileGetPropertiesResponse, FileGetRangeListHeaders, FileItem, FileLastWrittenMode, - FileListHandlesResponse, FileServiceProperties, - FileSetMetadataResponse, - FileStartCopyResponse, FileUploadRangeFromURLOptionalParams, - FileUploadRangeFromURLResponse, - FileUploadRangeResponse, PermissionCopyModeType, HandleItem, ListSharesIncludeType, FileRange as RangeModel, - ServiceGetPropertiesResponse, - ServiceSetPropertiesResponse, - ShareCreatePermissionResponse, - ShareCreateResponse, - ShareCreateSnapshotResponse, - ShareDeleteResponse, ShareGetAccessPolicyHeaders, - ShareGetPermissionResponse, - ShareGetPropertiesResponse as ShareGetPropertiesResponseModel, - ShareGetStatisticsResponse as ShareGetStatisticsResponseModel, ShareItemInternal, - ShareSetAccessPolicyResponse, - ShareSetMetadataResponse, - ShareSetPropertiesResponse, SignedIdentifier as SignedIdentifierModel, SourceModifiedAccessConditions, FileForceCloseHandlesHeaders, @@ -61,7 +241,6 @@ export { DirectoryListFilesAndDirectoriesSegmentHeaders, ListHandlesResponse, DirectoryRenameHeaders, - DirectoryRenameResponse, DirectoryListHandlesHeaders, DirectorySetMetadataHeaders, DirectorySetPropertiesHeaders, @@ -75,10 +254,8 @@ export { CorsRule, Metrics, FileSetHttpHeadersHeaders as FileSetHTTPHeadersHeaders, - FileSetHttpHeadersResponse as FileSetHTTPHeadersResponse, FileSetMetadataHeaders, FileStartCopyHeaders, - FileRenameResponse, FileUploadRangeFromURLHeaders, FileUploadRangeHeaders, ServiceGetPropertiesHeaders, @@ -108,19 +285,20 @@ export { ShareProtocolSettings, ShareSmbSettings, SmbMultichannel, - FileGetRangeListResponse as FileGetRangeListDiffResponse, ShareFileRangeList, ClearRange, ShareAccessTier, ShareRootSquash, + FileDownloadResponse as RawFileDownloadResponse, } from "./generated/src/models"; -import { ShareSetPropertiesResponse, ShareSetPropertiesHeaders } from "./generated/src/models"; +import { ShareSetPropertiesHeaders } from "./generated/src/models"; +import { WithResponse } from "./utils/utils.common"; /** * Contains response data for the setQuota operation. */ -export type ShareSetQuotaResponse = ShareSetPropertiesResponse; +export type ShareSetQuotaResponse = WithResponse; /** * Defines headers for setQuota operation. diff --git a/sdk/storage/storage-file-share/src/index.browser.ts b/sdk/storage/storage-file-share/src/index.browser.ts index 95170ed833a2..3afd95390564 100644 --- a/sdk/storage/storage-file-share/src/index.browser.ts +++ b/sdk/storage/storage-file-share/src/index.browser.ts @@ -18,7 +18,16 @@ export { HttpAuthorization, } from "./models"; export * from "./FileSystemAttributes"; -export * from "../../storage-blob/src/Pipeline"; +export { + Pipeline, + PipelineLike, + PipelineOptions, + isPipelineLike, + newPipeline, + StoragePipelineOptions, + ServiceClientOptions, +} from "../../storage-blob/src/Pipeline"; +export { BaseRequestPolicy } from "../../storage-blob/src/policies/RequestPolicy"; export * from "../../storage-blob/src/policies/AnonymousCredentialPolicy"; export * from "../../storage-blob/src/policies/CredentialPolicy"; export * from "../../storage-blob/src/StorageRetryPolicyFactory"; @@ -26,5 +35,12 @@ export * from "../../storage-blob/src/StorageBrowserPolicyFactory"; export * from "./ShareServiceClient"; export { CommonOptions } from "./StorageClient"; export * from "./generatedModels"; +export { + WithResponse, + ResponseLike, + ResponseWithBody, + ResponseWithHeaders, + HttpResponse, +} from "./utils/utils.common"; export { RestError }; export { logger } from "./log"; diff --git a/sdk/storage/storage-file-share/src/index.ts b/sdk/storage/storage-file-share/src/index.ts index fc0225f83119..532f48f28b78 100644 --- a/sdk/storage/storage-file-share/src/index.ts +++ b/sdk/storage/storage-file-share/src/index.ts @@ -31,7 +31,16 @@ export { HttpAuthorization, } from "./models"; export * from "./FileSystemAttributes"; -export * from "../../storage-blob/src/Pipeline"; +export { BaseRequestPolicy } from "../../storage-blob/src/policies/RequestPolicy"; +export { + Pipeline, + PipelineLike, + PipelineOptions, + isPipelineLike, + newPipeline, + StoragePipelineOptions, + ServiceClientOptions, +} from "../../storage-blob/src/Pipeline"; export * from "../../storage-blob/src/policies/AnonymousCredentialPolicy"; export * from "../../storage-blob/src/policies/CredentialPolicy"; export * from "../../storage-blob/src/StorageRetryPolicyFactory"; @@ -41,5 +50,12 @@ export * from "./ShareServiceClient"; export * from "./SASQueryParameters"; export { CommonOptions } from "./StorageClient"; export * from "./generatedModels"; +export { + WithResponse, + ResponseLike, + ResponseWithBody, + ResponseWithHeaders, + HttpResponse, +} from "./utils/utils.common"; export { RestError }; export { logger } from "./log"; From bfaa3c6336231c752184fe146cf7da1632edfda7 Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Mon, 5 Jun 2023 19:18:08 +0000 Subject: [PATCH 03/10] playback tests pass on node --- common/config/rush/pnpm-lock.yaml | 10 +++-- sdk/storage/storage-file-share/package.json | 2 + .../src/StorageContextClient.ts | 1 + .../src/generated/src/models/parameters.ts | 14 ++++++- .../src/generated/src/operations/file.ts | 2 +- .../src/generated/src/operations/share.ts | 12 +++--- .../src/utils/utils.common.ts | 7 +++- .../storage-file-share/swagger/README.md | 10 ----- .../storage-file-share/test/aborter.spec.ts | 3 -- .../test/directoryclient.spec.ts | 42 +++---------------- .../test/fileclient.spec.ts | 7 +--- .../test/node/fileclient.spec.ts | 15 +++---- .../storage-file-share/test/node/sas.spec.ts | 29 ++++--------- .../test/retrypolicy.spec.ts | 23 ++++++++-- .../storage-file-share/test/utils.spec.ts | 12 +----- .../storage-file-share/test/utils/index.ts | 4 +- 16 files changed, 74 insertions(+), 119 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 42632c61e174..f402772a2930 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -3832,7 +3832,7 @@ packages: dependencies: semver: 7.5.1 shelljs: 0.8.5 - typescript: 5.2.0-dev.20230601 + typescript: 5.2.0-dev.20230605 dev: false /ecdsa-sig-formatter/1.0.11: @@ -8425,8 +8425,8 @@ packages: hasBin: true dev: false - /typescript/5.2.0-dev.20230601: - resolution: {integrity: sha512-ZAe/C0wi4nXNds7zaN35oe/ju3WhYdyI+lvRy+xfsG9348PLOZgtYKO3v2RX5fSxhT2uZH5Gb5fk/sjCLaI9uw==} + /typescript/5.2.0-dev.20230605: + resolution: {integrity: sha512-xMeI7pFrOfxZTt1m4a2txN1E2Qh9IzLT9LNdc0DlEwJJKXjajj5j/nFLwWOUEnaFZBT6v35jlgLogG5HuSxUyA==} engines: {node: '>=14.17'} hasBin: true dev: false @@ -19316,7 +19316,7 @@ packages: dev: false file:projects/storage-file-share.tgz: - resolution: {integrity: sha512-NF2poQVFGOC0ZMVVC2qyTjIitV+UYtbq2kYIi3AES+HufQR/4S/4MhhqK1oyLSjHWQYA2ygBIZQf4DDw50AHdA==, tarball: file:projects/storage-file-share.tgz} + resolution: {integrity: sha512-Ta2DL1i32tq8YzBuBOpmsMPn5ZwaEkk4UK/PIovIBFkm19A6Pb/TcIsJWYe2IDV6bmz9S4jLLFdRex0krtigYw==, tarball: file:projects/storage-file-share.tgz} name: '@rush-temp/storage-file-share' version: 0.0.0 dependencies: @@ -19326,6 +19326,7 @@ packages: '@types/chai': 4.3.5 '@types/mocha': 7.0.2 '@types/node': 14.18.48 + '@types/sinon': 9.0.11 '@types/uuid': 8.3.4 chai: 4.3.7 cross-env: 7.0.3 @@ -19353,6 +19354,7 @@ packages: prettier: 2.8.8 puppeteer: 19.11.1_typescript@5.0.4 rimraf: 3.0.2 + sinon: 9.2.4 source-map-support: 0.5.21 ts-node: 10.9.1_haicren4phfcx6dckkdidh3s3e tslib: 2.5.2 diff --git a/sdk/storage/storage-file-share/package.json b/sdk/storage/storage-file-share/package.json index fedc8af0cbc3..9898b21baaeb 100644 --- a/sdk/storage/storage-file-share/package.json +++ b/sdk/storage/storage-file-share/package.json @@ -148,6 +148,7 @@ "@types/chai": "^4.1.6", "@types/mocha": "^7.0.2", "@types/node": "^14.0.0", + "@types/sinon": "^9.0.4", "@types/uuid": "^8.0.0", "chai": "^4.2.0", "cross-env": "^7.0.2", @@ -174,6 +175,7 @@ "prettier": "^2.5.1", "puppeteer": "^19.2.2", "rimraf": "^3.0.0", + "sinon": "^9.0.2", "source-map-support": "^0.5.9", "ts-node": "^10.0.0", "typescript": "~5.0.0", diff --git a/sdk/storage/storage-file-share/src/StorageContextClient.ts b/sdk/storage/storage-file-share/src/StorageContextClient.ts index 86d667a46c01..75f37724137b 100644 --- a/sdk/storage/storage-file-share/src/StorageContextClient.ts +++ b/sdk/storage/storage-file-share/src/StorageContextClient.ts @@ -15,6 +15,7 @@ export class StorageContextClient extends StorageClient { const operationSpecToSend = { ...operationSpec }; if ( + operationSpecToSend.path === "/{shareName}" || operationSpecToSend.path === "/{shareName}/{directory}" || operationSpecToSend.path === "/{shareName}/{directory}/{fileName}" ) { diff --git a/sdk/storage/storage-file-share/src/generated/src/models/parameters.ts b/sdk/storage/storage-file-share/src/generated/src/models/parameters.ts index f0ba6ceae360..d9e64d34ef98 100644 --- a/sdk/storage/storage-file-share/src/generated/src/models/parameters.ts +++ b/sdk/storage/storage-file-share/src/generated/src/models/parameters.ts @@ -435,6 +435,18 @@ export const comp3: OperationQueryParameter = { } }; +export const contentType1: OperationParameter = { + parameterPath: ["options", "contentType"], + mapper: { + defaultValue: "application/json", + isConstant: true, + serializedName: "Content-Type", + type: { + name: "String" + } + } +}; + export const sharePermission: OperationParameter = { parameterPath: "sharePermission", mapper: SharePermissionMapper @@ -960,7 +972,7 @@ export const fileContentLength1: OperationParameter = { } }; -export const contentType1: OperationParameter = { +export const contentType2: OperationParameter = { parameterPath: ["options", "contentType"], mapper: { defaultValue: "application/octet-stream", diff --git a/sdk/storage/storage-file-share/src/generated/src/operations/file.ts b/sdk/storage/storage-file-share/src/generated/src/operations/file.ts index 5cc35fade523..fd38cd53a15c 100644 --- a/sdk/storage/storage-file-share/src/generated/src/operations/file.ts +++ b/sdk/storage/storage-file-share/src/generated/src/operations/file.ts @@ -642,7 +642,7 @@ const uploadRangeOperationSpec: coreClient.OperationSpec = { headerParameters: [ Parameters.version, Parameters.leaseId, - Parameters.contentType1, + Parameters.contentType2, Parameters.accept3, Parameters.range1, Parameters.fileRangeWrite, diff --git a/sdk/storage/storage-file-share/src/generated/src/operations/share.ts b/sdk/storage/storage-file-share/src/generated/src/operations/share.ts index 2e7de36f391d..04507f2f71c8 100644 --- a/sdk/storage/storage-file-share/src/generated/src/operations/share.ts +++ b/sdk/storage/storage-file-share/src/generated/src/operations/share.ts @@ -563,14 +563,12 @@ const createPermissionOperationSpec: coreClient.OperationSpec = { ], urlParameters: [Parameters.url], headerParameters: [ - Parameters.contentType, - Parameters.accept, - Parameters.version + Parameters.version, + Parameters.accept1, + Parameters.contentType1 ], - isXML: true, - contentType: "application/xml; charset=utf-8", - mediaType: "xml", - serializer: xmlSerializer + mediaType: "json", + serializer }; const getPermissionOperationSpec: coreClient.OperationSpec = { path: "/{shareName}", diff --git a/sdk/storage/storage-file-share/src/utils/utils.common.ts b/sdk/storage/storage-file-share/src/utils/utils.common.ts index 64bdb8c9bb2d..b98e0170802d 100644 --- a/sdk/storage/storage-file-share/src/utils/utils.common.ts +++ b/sdk/storage/storage-file-share/src/utils/utils.common.ts @@ -437,8 +437,11 @@ export function getAccountNameFromUrl(url: string): string { const parsedUrl = new URL(url); let accountName; try { - if (parsedUrl.hostname.split(".")[1] === "blob") { - // `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`; + if (parsedUrl.hostname.split(".")[1] === "file") { + // `${defaultEndpointsProtocol}://${accountName}.file.${endpointSuffix}`; + // Slicing off '/' at the end if exists + url = url.endsWith("/") ? url.slice(0, -1) : url; + accountName = parsedUrl.hostname.split(".")[0]; } else if (isIpEndpointStyle(parsedUrl)) { // IPv4/IPv6 address hosts... Example - http://192.0.0.10:10001/devstoreaccount1/ diff --git a/sdk/storage/storage-file-share/swagger/README.md b/sdk/storage/storage-file-share/swagger/README.md index b4becccdd50a..8bb4807384fd 100644 --- a/sdk/storage/storage-file-share/swagger/README.md +++ b/sdk/storage/storage-file-share/swagger/README.md @@ -297,16 +297,6 @@ directive: delete $.format; ``` -### Retain XStore swagger behavior - Revert file permissions content-type to "application/xml" from "application/json"(unified swagger) - -```yaml -directive: - - from: swagger-document - where: $["x-ms-paths"]["/{shareName}?restype=share&comp=filepermission"] - transform: > - $.put.consumes = ["application/xml"]; -``` - ### Rename optionalbody -> body ```yaml diff --git a/sdk/storage/storage-file-share/test/aborter.spec.ts b/sdk/storage/storage-file-share/test/aborter.spec.ts index 3a265588ebdc..a4ca891e9519 100644 --- a/sdk/storage/storage-file-share/test/aborter.spec.ts +++ b/sdk/storage/storage-file-share/test/aborter.spec.ts @@ -32,7 +32,6 @@ describe("Aborter", () => { assert.fail(); } catch (err: any) { assert.equal(err.name, "AbortError"); - assert.equal(err.message, "The operation was aborted.", "Unexpected error caught: " + err); } }); @@ -50,7 +49,6 @@ describe("Aborter", () => { assert.fail(); } catch (err: any) { assert.equal(err.name, "AbortError"); - assert.equal(err.message, "The operation was aborted.", "Unexpected error caught: " + err); } }); @@ -72,7 +70,6 @@ describe("Aborter", () => { assert.fail(); } catch (err: any) { assert.equal(err.name, "AbortError"); - assert.equal(err.message, "The operation was aborted.", "Unexpected error caught: " + err); } }); }); diff --git a/sdk/storage/storage-file-share/test/directoryclient.spec.ts b/sdk/storage/storage-file-share/test/directoryclient.spec.ts index 8121cdc4657d..56cd45b50330 100644 --- a/sdk/storage/storage-file-share/test/directoryclient.spec.ts +++ b/sdk/storage/storage-file-share/test/directoryclient.spec.ts @@ -782,12 +782,7 @@ describe("DirectoryClient", () => { children: [ { name: "Azure.Storage.File.ShareDirectoryClient-create", - children: [ - { - name: "HTTP PUT", - children: [], - }, - ], + children: [], }, ], }, @@ -796,55 +791,30 @@ describe("DirectoryClient", () => { children: [ { name: "Azure.Storage.File.ShareFileClient-create", - children: [ - { - name: "HTTP PUT", - children: [], - }, - ], + children: [], }, ], }, { name: "Azure.Storage.File.ShareFileClient-getProperties", - children: [ - { - name: "HTTP HEAD", - children: [], - }, - ], + children: [], }, { name: "Azure.Storage.File.ShareDirectoryClient-deleteFile", children: [ { name: "Azure.Storage.File.ShareFileClient-delete", - children: [ - { - name: "HTTP DELETE", - children: [], - }, - ], + children: [], }, ], }, { name: "Azure.Storage.File.ShareFileClient-getProperties", - children: [ - { - name: "HTTP HEAD", - children: [], - }, - ], + children: [], }, { name: "Azure.Storage.File.ShareDirectoryClient-delete", - children: [ - { - name: "HTTP DELETE", - children: [], - }, - ], + children: [], }, ], }, diff --git a/sdk/storage/storage-file-share/test/fileclient.spec.ts b/sdk/storage/storage-file-share/test/fileclient.spec.ts index e1ecd9f4ddf7..146c88b3d680 100644 --- a/sdk/storage/storage-file-share/test/fileclient.spec.ts +++ b/sdk/storage/storage-file-share/test/fileclient.spec.ts @@ -901,12 +901,7 @@ describe("FileClient", () => { children: [ { name: "Azure.Storage.File.ShareFileClient-create", - children: [ - { - name: "HTTP PUT", - children: [], - }, - ], + children: [], }, ], }, diff --git a/sdk/storage/storage-file-share/test/node/fileclient.spec.ts b/sdk/storage/storage-file-share/test/node/fileclient.spec.ts index fa9934449eaa..b833f4975d61 100644 --- a/sdk/storage/storage-file-share/test/node/fileclient.spec.ts +++ b/sdk/storage/storage-file-share/test/node/fileclient.spec.ts @@ -137,8 +137,7 @@ describe("FileClient Node.js only", () => { }; await fileClient.setMetadata(metadata); - const factories = (fileClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = fileClient["credential"] as StorageSharedKeyCredential; const newClient = new ShareFileClient(fileClient.url, credential); const result = await newClient.getProperties(); @@ -158,8 +157,7 @@ describe("FileClient Node.js only", () => { }; await fileClient.setMetadata(metadata); - const factories = (fileClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = fileClient["credential"] as StorageSharedKeyCredential; const newClient = new ShareFileClient(fileClient.url, credential, { retryOptions: { maxTries: 5, @@ -183,8 +181,7 @@ describe("FileClient Node.js only", () => { }; await fileClient.setMetadata(metadata); - const factories = (fileClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = fileClient["credential"] as StorageSharedKeyCredential; const pipeline = newPipeline(credential); const newClient = new ShareFileClient(fileClient.url, pipeline); @@ -204,8 +201,7 @@ describe("FileClient Node.js only", () => { await fileClient.uploadRange(fileContent, 0, fileContent.length); // Get a SAS for fileURL - const factories = (fileClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = fileClient["credential"] as StorageSharedKeyCredential; const expiresOn = recorder.newDate("now"); expiresOn.setDate(expiresOn.getDate() + 1); const sas = generateFileSASQueryParameters( @@ -240,8 +236,7 @@ describe("FileClient Node.js only", () => { await fileClient.uploadRange(fileContent, 0, fileContent.length); // Get a SAS for fileURL - const factories = (fileClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = fileClient["credential"] as StorageSharedKeyCredential; const expiresOn = recorder.newDate("now"); expiresOn.setDate(expiresOn.getDate() + 1); const sas = generateFileSASQueryParameters( diff --git a/sdk/storage/storage-file-share/test/node/sas.spec.ts b/sdk/storage/storage-file-share/test/node/sas.spec.ts index 5d8718d54546..b88d45ba3013 100644 --- a/sdk/storage/storage-file-share/test/node/sas.spec.ts +++ b/sdk/storage/storage-file-share/test/node/sas.spec.ts @@ -43,9 +43,7 @@ describe("Shared Access Signature (SAS) generation Node.js only", () => { const tmr = recorder.newDate("now"); tmr.setDate(tmr.getDate() + 1); - // By default, credential is always the last element of pipeline factories - const factories = (serviceClient as any).pipeline.factories; - const sharedKeyCredential = factories[factories.length - 1]; + const sharedKeyCredential = serviceClient["credential"]; const sas = generateAccountSASQueryParameters( { @@ -72,10 +70,7 @@ describe("Shared Access Signature (SAS) generation Node.js only", () => { const tmr = recorder.newDate("now"); tmr.setDate(tmr.getDate() + 1); - // By default, credential is always the last element of pipeline factories - const factories = (serviceClient as any).pipeline.factories; - const sharedKeyCredential = factories[factories.length - 1]; - + const sharedKeyCredential = serviceClient["credential"]; const sas = generateAccountSASQueryParameters( { expiresOn: tmr, @@ -106,9 +101,7 @@ describe("Shared Access Signature (SAS) generation Node.js only", () => { const tmr = recorder.newDate("now"); tmr.setDate(tmr.getDate() + 1); - // By default, credential is always the last element of pipeline factories - const factories = (serviceClient as any).pipeline.factories; - const sharedKeyCredential = factories[factories.length - 1]; + const sharedKeyCredential = serviceClient["credential"]; const sas = generateAccountSASQueryParameters( { @@ -137,9 +130,7 @@ describe("Shared Access Signature (SAS) generation Node.js only", () => { const tmr = recorder.newDate("now"); tmr.setDate(tmr.getDate() + 1); - // By default, credential is always the last element of pipeline factories - const factories = (serviceClient as any).pipeline.factories; - const sharedKeyCredential = factories[factories.length - 1]; + const sharedKeyCredential = serviceClient["credential"]; const sas = generateAccountSASQueryParameters( { @@ -174,9 +165,7 @@ describe("Shared Access Signature (SAS) generation Node.js only", () => { const tmr = recorder.newDate("now"); tmr.setDate(tmr.getDate() + 1); - // By default, credential is always the last element of pipeline factories - const factories = (serviceClient as any).pipeline.factories; - const sharedKeyCredential = factories[factories.length - 1]; + const sharedKeyCredential = serviceClient["credential"]; const shareName = recorder.getUniqueName("share"); const shareClient = serviceClient.getShareClient(shareName); @@ -213,9 +202,7 @@ describe("Shared Access Signature (SAS) generation Node.js only", () => { const tmr = recorder.newDate("now"); tmr.setDate(tmr.getDate() + 1); - // By default, credential is always the last element of pipeline factories - const factories = (serviceClient as any).pipeline.factories; - const sharedKeyCredential = factories[factories.length - 1]; + const sharedKeyCredential = serviceClient["credential"]; const shareName = recorder.getUniqueName("share"); const shareClient = serviceClient.getShareClient(shareName); @@ -272,9 +259,7 @@ describe("Shared Access Signature (SAS) generation Node.js only", () => { const tmr = recorder.newDate("tmr"); tmr.setDate(tmr.getDate() + 1); - // By default, credential is always the last element of pipeline factories - const factories = (serviceClient as any).pipeline.factories; - const sharedKeyCredential = factories[factories.length - 1]; + const sharedKeyCredential = serviceClient["credential"]; const shareName = recorder.getUniqueName("share"); const shareClient = serviceClient.getShareClient(shareName); diff --git a/sdk/storage/storage-file-share/test/retrypolicy.spec.ts b/sdk/storage/storage-file-share/test/retrypolicy.spec.ts index c28a57d15568..f63889fa2eb3 100644 --- a/sdk/storage/storage-file-share/test/retrypolicy.spec.ts +++ b/sdk/storage/storage-file-share/test/retrypolicy.spec.ts @@ -11,12 +11,14 @@ import { RestError, ShareClient } from "../src"; import { Pipeline } from "@azure/core-rest-pipeline"; import { getBSU, recorderEnvSetup } from "./utils"; import { injectorPolicy, injectorPolicyName } from "./utils/InjectorPolicy"; +import { useFakeTimers, SinonFakeTimers } from "sinon"; describe("RetryPolicy", () => { let shareName: string; let shareClient: ShareClient; let recorder: Recorder; + let clock: SinonFakeTimers; beforeEach(async function (this: Context) { recorder = record(this, recorderEnvSetup); @@ -24,9 +26,11 @@ describe("RetryPolicy", () => { shareName = recorder.getUniqueName("share"); shareClient = serviceClient.getShareClient(shareName); await shareClient.create(); + clock = useFakeTimers(); }); afterEach(async function () { + clock.restore(); const pipeline: Pipeline = shareClient["storageClientContext"].pipeline; pipeline.removePolicy({ name: injectorPolicyName }); await shareClient.delete(); @@ -54,7 +58,8 @@ describe("RetryPolicy", () => { keya: "vala", keyb: "valb", }; - await shareClient.setMetadata(metadata); + shareClient.setMetadata(metadata); + await clock.tickAsync(2000); assert.equal(injectCounter, 1); const result = await shareClient.getProperties(); assert.deepEqual(result.metadata, metadata); @@ -86,9 +91,12 @@ describe("RetryPolicy", () => { try { // Default exponential retry delay is 4000ms. Wait for 2000ms to abort which makes sure the aborter // happens between 2 requests - await shareClient.setMetadata(metadata, { + const promise = shareClient.setMetadata(metadata, { abortSignal: AbortController.timeout(2 * 1000), }); + await clock.tickAsync(1000); + clock.tick(1000); + await promise; } catch (err: any) { hasError = true; } @@ -96,7 +104,9 @@ describe("RetryPolicy", () => { }); it("Retry Policy should fail when requests always fail with 500", async () => { + let failCount = 0; const injector = injectorPolicy(() => { + failCount++; return new RestError("Server Internal Error", { code: "ServerInternalError", statusCode: 500, @@ -113,10 +123,17 @@ describe("RetryPolicy", () => { keya: "vala", keyb: "valb", }; - await shareClient.setMetadata(metadata); + const promise = shareClient.setMetadata(metadata); + // first retry waits 0 seconds + // second retry waits 4 seconds + await clock.tickAsync(4000); + // last retry waits 12 seconds + clock.tick(12000); + await promise; } catch (err: any) { hasError = true; } assert.ok(hasError); + assert.strictEqual(failCount, 4); }); }); diff --git a/sdk/storage/storage-file-share/test/utils.spec.ts b/sdk/storage/storage-file-share/test/utils.spec.ts index ea34ce83c087..e14c5b8ebe8c 100644 --- a/sdk/storage/storage-file-share/test/utils.spec.ts +++ b/sdk/storage/storage-file-share/test/utils.spec.ts @@ -143,19 +143,9 @@ describe("Utility Helpers", () => { assert.equal( isIpEndpointStyle( - new URL("https://2001:db8:85a3:8d3:1319:8a2e:370:7348/accountName/containerName") + new URL("https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]/accountName/containerName") ), true ); - assert.equal(isIpEndpointStyle(new URL("https://2001::1")), true); - // assert.equal(isIpEndpointStyle(new URL('https://::1')), true); currently not working due to http url.ts's issue. uncomment after core lib fixed. - - assert.equal(isIpEndpointStyle(new URL("https://255")), false); - assert.equal(isIpEndpointStyle(new URL("https://255.255")), false); - assert.equal(isIpEndpointStyle(new URL("https://a.b.c.d")), false); - assert.equal(isIpEndpointStyle(new URL("https://256.1.1.1")), false); - assert.equal(isIpEndpointStyle(new URL("https://255.256.1.1")), false); - assert.equal(isIpEndpointStyle(new URL("https://255.255.256.1")), false); - assert.equal(isIpEndpointStyle(new URL("https://255.255.255.256")), false); }); }); diff --git a/sdk/storage/storage-file-share/test/utils/index.ts b/sdk/storage/storage-file-share/test/utils/index.ts index 3c3ac01dc2ef..dbd3c8664484 100644 --- a/sdk/storage/storage-file-share/test/utils/index.ts +++ b/sdk/storage/storage-file-share/test/utils/index.ts @@ -150,9 +150,7 @@ export function getSASConnectionStringFromEnvironment(): string { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); const queueServiceClient = getBSU(); - // By default, credential is always the last element of pipeline factories - const factories = (queueServiceClient as any).pipeline.factories; - const sharedKeyCredential = factories[factories.length - 1]; + const sharedKeyCredential = queueServiceClient["credential"]; const sas = generateAccountSASQueryParameters( { From 2a961a534e81bd173f7486c7fe6fd40604e0baed Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Mon, 5 Jun 2023 20:00:06 +0000 Subject: [PATCH 04/10] recorded tests passing on browser --- sdk/storage/storage-file-share/package.json | 2 +- .../storage-file-share/src/StorageClient.ts | 15 +- .../storage-file-share/src/utils/cache.ts | 13 -- .../src/utils/utils.common.ts | 7 +- .../test/retrypolicy.spec.ts | 139 ------------------ .../test/utils/InjectorPolicy.ts | 38 ----- .../test/utils/index.browser.ts | 12 ++ .../test/utils/testutils.common.ts | 7 +- 8 files changed, 37 insertions(+), 196 deletions(-) delete mode 100644 sdk/storage/storage-file-share/src/utils/cache.ts delete mode 100644 sdk/storage/storage-file-share/test/retrypolicy.spec.ts delete mode 100644 sdk/storage/storage-file-share/test/utils/InjectorPolicy.ts diff --git a/sdk/storage/storage-file-share/package.json b/sdk/storage/storage-file-share/package.json index 9898b21baaeb..4ef4a88b80c2 100644 --- a/sdk/storage/storage-file-share/package.json +++ b/sdk/storage/storage-file-share/package.json @@ -175,7 +175,7 @@ "prettier": "^2.5.1", "puppeteer": "^19.2.2", "rimraf": "^3.0.0", - "sinon": "^9.0.2", + "sinon": "^9.0.2", "source-map-support": "^0.5.9", "ts-node": "^10.0.0", "typescript": "~5.0.0", diff --git a/sdk/storage/storage-file-share/src/StorageClient.ts b/sdk/storage/storage-file-share/src/StorageClient.ts index d65c559b0713..9dd7635bd32e 100644 --- a/sdk/storage/storage-file-share/src/StorageClient.ts +++ b/sdk/storage/storage-file-share/src/StorageClient.ts @@ -13,7 +13,16 @@ import { isTokenCredential } from "@azure/core-auth"; import { OperationTracingOptions } from "@azure/core-tracing"; import { AnonymousCredential } from "../../storage-blob/src/credentials/AnonymousCredential"; import { StorageSharedKeyCredential } from "../../storage-blob/src/credentials/StorageSharedKeyCredential"; +import { HttpClient } from "@azure/core-rest-pipeline"; +let testOnlyHttpClient: HttpClient | undefined; +/** + * @internal + * Set a custom default http client for testing purposes + */ +export function setTestOnlySetHttpClient(httpClient: HttpClient): void { + testOnlyHttpClient = httpClient; +} /** * An interface for options common to every remote operation. */ @@ -63,7 +72,11 @@ export abstract class StorageClient { this.accountName = getAccountNameFromUrl(url); this.pipeline = pipeline; - this.storageClientContext = new StorageContextClient(this.url, getCoreClientOptions(pipeline)); + const coreOptions = getCoreClientOptions(pipeline); + if (testOnlyHttpClient) { + coreOptions.httpClient = testOnlyHttpClient; + } + this.storageClientContext = new StorageContextClient(this.url, coreOptions); // Remove the default content-type in generated code of StorageClientContext const storageClientContext = this.storageClientContext as any; if (storageClientContext.requestContentType) { diff --git a/sdk/storage/storage-file-share/src/utils/cache.ts b/sdk/storage/storage-file-share/src/utils/cache.ts deleted file mode 100644 index a239d8094d8c..000000000000 --- a/sdk/storage/storage-file-share/src/utils/cache.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { createDefaultHttpClient, HttpClient } from "@azure/core-rest-pipeline"; - -let _defaultHttpClient: HttpClient; - -export function getCachedDefaultHttpClient(): HttpClient { - if (!_defaultHttpClient) { - _defaultHttpClient = createDefaultHttpClient(); - } - return _defaultHttpClient; -} diff --git a/sdk/storage/storage-file-share/src/utils/utils.common.ts b/sdk/storage/storage-file-share/src/utils/utils.common.ts index b98e0170802d..a89d15725a46 100644 --- a/sdk/storage/storage-file-share/src/utils/utils.common.ts +++ b/sdk/storage/storage-file-share/src/utils/utils.common.ts @@ -160,7 +160,7 @@ export function extractConnectionStringParts(connectionString: string): Connecti }; } else { // SAS connection string - const accountSas = getValueInConnString(connectionString, "SharedAccessSignature"); + let accountSas = getValueInConnString(connectionString, "SharedAccessSignature"); const accountName = getAccountNameFromUrl(fileEndpoint); if (!fileEndpoint) { throw new Error("Invalid FileEndpoint in the provided SAS Connection String"); @@ -168,6 +168,11 @@ export function extractConnectionStringParts(connectionString: string): Connecti throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String"); } + // remove test SAS + if (accountSas === "fakeSasToken") { + accountSas = ""; + } + return { kind: "SASConnString", url: fileEndpoint, accountName, accountSas }; } } diff --git a/sdk/storage/storage-file-share/test/retrypolicy.spec.ts b/sdk/storage/storage-file-share/test/retrypolicy.spec.ts deleted file mode 100644 index f63889fa2eb3..000000000000 --- a/sdk/storage/storage-file-share/test/retrypolicy.spec.ts +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { assert } from "chai"; -import { Context } from "mocha"; - -import { record, Recorder } from "@azure-tools/test-recorder"; -import { AbortController } from "@azure/abort-controller"; - -import { RestError, ShareClient } from "../src"; -import { Pipeline } from "@azure/core-rest-pipeline"; -import { getBSU, recorderEnvSetup } from "./utils"; -import { injectorPolicy, injectorPolicyName } from "./utils/InjectorPolicy"; -import { useFakeTimers, SinonFakeTimers } from "sinon"; - -describe("RetryPolicy", () => { - let shareName: string; - let shareClient: ShareClient; - - let recorder: Recorder; - let clock: SinonFakeTimers; - - beforeEach(async function (this: Context) { - recorder = record(this, recorderEnvSetup); - const serviceClient = getBSU(); - shareName = recorder.getUniqueName("share"); - shareClient = serviceClient.getShareClient(shareName); - await shareClient.create(); - clock = useFakeTimers(); - }); - - afterEach(async function () { - clock.restore(); - const pipeline: Pipeline = shareClient["storageClientContext"].pipeline; - pipeline.removePolicy({ name: injectorPolicyName }); - await shareClient.delete(); - await recorder.stop(); - }); - - it("Retry Policy should work when first request fails with 500", async () => { - let injectCounter = 0; - const injector = injectorPolicy(() => { - if (injectCounter === 0) { - injectCounter++; - return new RestError("Server Internal Error", { - code: "ServerInternalError", - statusCode: 500, - }); - } - return; - }); - - const pipeline: Pipeline = shareClient["storageClientContext"].pipeline; - pipeline.addPolicy(injector, { afterPhase: "Retry" }); - - const metadata = { - key0: "val0", - keya: "vala", - keyb: "valb", - }; - shareClient.setMetadata(metadata); - await clock.tickAsync(2000); - assert.equal(injectCounter, 1); - const result = await shareClient.getProperties(); - assert.deepEqual(result.metadata, metadata); - }); - - it("Retry Policy should abort when abort event trigger during retry interval", async () => { - let injectCounter = 0; - const injector = injectorPolicy(() => { - if (injectCounter < 2) { - injectCounter++; - return new RestError("Server Internal Error", { - code: "ServerInternalError", - statusCode: 500, - }); - } - return; - }); - - const pipeline: Pipeline = shareClient["storageClientContext"].pipeline; - pipeline.addPolicy(injector, { afterPhase: "Retry" }); - - const metadata = { - key0: "val0", - keya: "vala", - keyb: "valb", - }; - - let hasError = false; - try { - // Default exponential retry delay is 4000ms. Wait for 2000ms to abort which makes sure the aborter - // happens between 2 requests - const promise = shareClient.setMetadata(metadata, { - abortSignal: AbortController.timeout(2 * 1000), - }); - await clock.tickAsync(1000); - clock.tick(1000); - await promise; - } catch (err: any) { - hasError = true; - } - assert.ok(hasError); - }); - - it("Retry Policy should fail when requests always fail with 500", async () => { - let failCount = 0; - const injector = injectorPolicy(() => { - failCount++; - return new RestError("Server Internal Error", { - code: "ServerInternalError", - statusCode: 500, - }); - }); - - const pipeline: Pipeline = shareClient["storageClientContext"].pipeline; - pipeline.addPolicy(injector, { afterPhase: "Retry" }); - - let hasError = false; - try { - const metadata = { - key0: "val0", - keya: "vala", - keyb: "valb", - }; - const promise = shareClient.setMetadata(metadata); - // first retry waits 0 seconds - // second retry waits 4 seconds - await clock.tickAsync(4000); - // last retry waits 12 seconds - clock.tick(12000); - await promise; - } catch (err: any) { - hasError = true; - } - assert.ok(hasError); - assert.strictEqual(failCount, 4); - }); -}); diff --git a/sdk/storage/storage-file-share/test/utils/InjectorPolicy.ts b/sdk/storage/storage-file-share/test/utils/InjectorPolicy.ts deleted file mode 100644 index f42ecd2a3136..000000000000 --- a/sdk/storage/storage-file-share/test/utils/InjectorPolicy.ts +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { - PipelineRequest, - PipelineResponse, - SendRequest, - PipelinePolicy, - RestError, -} from "@azure/core-rest-pipeline"; - -export interface NextInjectErrorHolder { - nextInjectError?: RestError; -} - -export type Injector = () => RestError | undefined; - -/** - * The programmatic identifier of the injectorPolicy. - */ -export const injectorPolicyName = "injectorPolicy"; - -/** - * injectorPolicy is a policy used to introduce errors into the pipeline - * for the purposes of testing policies such as retry. - */ -export function injectorPolicy(injector: Injector): PipelinePolicy { - return { - name: injectorPolicyName, - async sendRequest(request: PipelineRequest, next: SendRequest): Promise { - const error = injector(); - if (error) { - throw error; - } - return next(request); - }, - }; -} diff --git a/sdk/storage/storage-file-share/test/utils/index.browser.ts b/sdk/storage/storage-file-share/test/utils/index.browser.ts index 7b37231d93f2..d1b6bb3c0205 100644 --- a/sdk/storage/storage-file-share/test/utils/index.browser.ts +++ b/sdk/storage/storage-file-share/test/utils/index.browser.ts @@ -4,6 +4,9 @@ import { AnonymousCredential } from "../../../storage-blob/src/credentials/AnonymousCredential"; import { newPipeline } from "../../../storage-blob/src/Pipeline"; import { ShareServiceClient } from "../../src/ShareServiceClient"; +import { createXhrHttpClient } from "@azure/test-utils"; +import { isLiveMode } from "@azure-tools/test-recorder"; +import { setTestOnlySetHttpClient } from "../../src/StorageClient"; export * from "./testutils.common"; @@ -11,6 +14,10 @@ export function getGenericBSU( accountType: string, accountNameSuffix: string = "" ): ShareServiceClient { + // only needed until we can migrate to test recorder v2 + if (!isLiveMode()) { + setTestOnlySetHttpClient(createXhrHttpClient()); + } const accountNameEnvVar = `${accountType}ACCOUNT_NAME`; const accountSASEnvVar = `${accountType}ACCOUNT_SAS`; @@ -29,6 +36,11 @@ export function getGenericBSU( accountSAS = accountSAS.startsWith("?") ? accountSAS : `?${accountSAS}`; } + // don't add the test account SAS value. + if (accountSAS === "?fakeSasToken") { + accountSAS = ""; + } + const credentials = new AnonymousCredential(); const pipeline = newPipeline(credentials, { // Enable logger when debugging diff --git a/sdk/storage/storage-file-share/test/utils/testutils.common.ts b/sdk/storage/storage-file-share/test/utils/testutils.common.ts index 792254c872d7..cdb9ef4069f6 100644 --- a/sdk/storage/storage-file-share/test/utils/testutils.common.ts +++ b/sdk/storage/storage-file-share/test/utils/testutils.common.ts @@ -10,6 +10,7 @@ export function isBrowser(): boolean { const mockAccountName = "fakestorageaccount"; const mockAccountKey = "aaaaa"; +const mockSas = "fakeSasToken"; const mockSDAccountName = "sd-fakestorageaccount"; export const recorderEnvSetup: RecorderEnvironmentSetup = { replaceableVariables: { @@ -18,18 +19,18 @@ export const recorderEnvSetup: RecorderEnvironmentSetup = { // 2. If the env variables are present in the recordings as plain strings, they will be replaced with the provided values in record mode ACCOUNT_NAME: `${mockAccountName}`, ACCOUNT_KEY: `${mockAccountKey}`, - ACCOUNT_SAS: `${mockAccountKey}`, + ACCOUNT_SAS: `${mockSas}`, STORAGE_CONNECTION_STRING: `DefaultEndpointsProtocol=https;AccountName=${mockAccountName};AccountKey=${mockAccountKey};EndpointSuffix=core.windows.net`, // Comment following line to skip user delegation key/SAS related cases in record and play // which depends on this environment variable ACCOUNT_TOKEN: `${mockAccountKey}`, SOFT_DELETE_ACCOUNT_NAME: `${mockSDAccountName}`, SOFT_DELETE_ACCOUNT_KEY: `${mockAccountKey}`, - SOFT_DELETE_ACCOUNT_SAS: `${mockAccountKey}`, + SOFT_DELETE_ACCOUNT_SAS: `${mockSas}`, SOFT_DELETE_STORAGE_CONNECTION_STRING: `DefaultEndpointsProtocol=https;AccountName=${mockSDAccountName};AccountKey=${mockAccountKey};EndpointSuffix=core.windows.net`, PREMIUM_FILE_ACCOUNT_NAME: `${mockAccountName}`, PREMIUM_FILE_ACCOUNT_KEY: `${mockAccountKey}`, - PREMIUM_FILE_ACCOUNT_SAS: `${mockAccountKey}`, + PREMIUM_FILE_ACCOUNT_SAS: `${mockSas}`, PREMIUM_FILE_STORAGE_CONNECTION_STRING: `DefaultEndpointsProtocol=https;AccountName=${mockSDAccountName};AccountKey=${mockAccountKey};EndpointSuffix=core.windows.net`, }, customizationsOnRecordings: [ From 7411e7b5ca4b8e9207e4a02a6e11950b11b93481 Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Mon, 5 Jun 2023 20:41:12 +0000 Subject: [PATCH 05/10] live tests working in node --- .../src/utils/RetriableReadableStream.ts | 176 +++++++++--------- .../test/node/directoryclient.spec.ts | 9 +- .../test/node/fileserviceclient.spec.ts | 9 +- .../test/node/shareclient.spec.ts | 9 +- 4 files changed, 98 insertions(+), 105 deletions(-) diff --git a/sdk/storage/storage-file-share/src/utils/RetriableReadableStream.ts b/sdk/storage/storage-file-share/src/utils/RetriableReadableStream.ts index 6b7e751033df..68b4627119e4 100644 --- a/sdk/storage/storage-file-share/src/utils/RetriableReadableStream.ts +++ b/sdk/storage/storage-file-share/src/utils/RetriableReadableStream.ts @@ -4,12 +4,10 @@ import { AbortError } from "@azure/abort-controller"; import { TransferProgressEvent } from "@azure/core-rest-pipeline"; import { Readable } from "stream"; -import { AbortSignal, AbortSignalLike } from "@azure/abort-controller"; export type ReadableStreamGetter = (offset: number) => Promise; export interface RetriableReadableStreamOptions { - abortSignal?: AbortSignalLike; /** * Max retry count (greater than or equal to 0), undefined or invalid value means no retry */ @@ -32,15 +30,12 @@ export interface RetriableReadableStreamOptions { doInjectErrorOnce?: boolean; } -const ABORT_ERROR = new AbortError("The operation was aborted."); - /** * ONLY AVAILABLE IN NODE.JS RUNTIME. * * A Node.js ReadableStream will internally retry when internal ReadableStream unexpected ends. */ export class RetriableReadableStream extends Readable { - private aborter: AbortSignalLike; private start: number; private offset: number; private end: number; @@ -50,10 +45,6 @@ export class RetriableReadableStream extends Readable { private maxRetryRequests: number; private onProgress?: (progress: TransferProgressEvent) => void; private options: RetriableReadableStreamOptions; - private abortHandler = () => { - this.source.pause(); - this.emit("error", ABORT_ERROR); - }; /** * Creates an instance of RetriableReadableStream. @@ -73,8 +64,6 @@ export class RetriableReadableStream extends Readable { options: RetriableReadableStreamOptions = {} ) { super(); - const aborter = options.abortSignal || AbortSignal.none; - this.aborter = aborter; this.getter = getter; this.source = source; this.start = offset; @@ -85,97 +74,110 @@ export class RetriableReadableStream extends Readable { this.onProgress = options.onProgress; this.options = options; - aborter.addEventListener("abort", this.abortHandler); - - this.setSourceDataHandler(); - this.setSourceEndHandler(); - this.setSourceErrorHandler(); + this.setSourceEventHandlers(); } public _read(): void { - if (!this.aborter.aborted) { - this.source.resume(); - } + this.source.resume(); } - private setSourceDataHandler() { - this.source.on("data", (data: Buffer) => { - if (this.options.doInjectErrorOnce) { - this.options.doInjectErrorOnce = undefined; - this.source.pause(); - this.source.removeAllListeners("data"); - this.source.emit("end"); - return; - } + private setSourceEventHandlers() { + this.source.on("data", this.sourceDataHandler); + this.source.on("end", this.sourceErrorOrEndHandler); + this.source.on("error", this.sourceErrorOrEndHandler); + // needed for Node14 + this.source.on("aborted", this.sourceAbortedHandler); + } - // console.log( - // `Offset: ${this.offset}, Received ${data.length} from internal stream` - // ); - this.offset += data.length; - if (this.onProgress) { - this.onProgress({ loadedBytes: this.offset - this.start }); - } - if (!this.push(data)) { - this.source.pause(); - } - }); + private removeSourceEventHandlers() { + this.source.removeListener("data", this.sourceDataHandler); + this.source.removeListener("end", this.sourceErrorOrEndHandler); + this.source.removeListener("error", this.sourceErrorOrEndHandler); + this.source.removeListener("aborted", this.sourceAbortedHandler); } - private setSourceEndHandler() { - this.source.on("end", () => { + private sourceDataHandler = (data: Buffer) => { + if (this.options.doInjectErrorOnce) { + this.options.doInjectErrorOnce = undefined; + this.source.pause(); + this.sourceErrorOrEndHandler(); + (this.source as Readable).destroy(); + return; + } + + // console.log( + // `Offset: ${this.offset}, Received ${data.length} from internal stream` + // ); + this.offset += data.length; + if (this.onProgress) { + this.onProgress({ loadedBytes: this.offset - this.start }); + } + if (!this.push(data)) { + this.source.pause(); + } + }; + + private sourceAbortedHandler = () => { + const abortError = new AbortError("The operation was aborted."); + this.destroy(abortError); + }; + + private sourceErrorOrEndHandler = (err?: Error) => { + if (err && err.name === "AbortError") { + this.destroy(err); + return; + } + + // console.log( + // `Source stream emits end or error, offset: ${ + // this.offset + // }, dest end : ${this.end}` + // ); + this.removeSourceEventHandlers(); + if (this.offset - 1 === this.end) { + this.push(null); + } else if (this.offset <= this.end) { // console.log( - // `Source stream emits end, offset: ${ - // this.offset - // }, dest end : ${this.end}` + // `retries: ${this.retries}, max retries: ${this.maxRetries}` // ); - if (this.offset - 1 === this.end) { - this.aborter.removeEventListener("abort", this.abortHandler); - this.push(null); - } else if (this.offset <= this.end) { - // console.log( - // `retries: ${this.retries}, max retries: ${this.maxRetries}` - // ); - if (this.retries < this.maxRetryRequests) { - this.retries += 1; - this.getter(this.offset) - .then((newSource) => { - this.source = newSource; - this.setSourceDataHandler(); - this.setSourceEndHandler(); - this.setSourceErrorHandler(); - return; - }) - .catch((error) => { - this.emit("error", error); - }); - } else { - this.emit( - "error", - new Error( - `Data corruption failure: received less data than required and reached maxRetires limitation. Received data offset: ${ - this.offset - 1 - }, data needed offset: ${this.end}, retries: ${this.retries}, max retries: ${ - this.maxRetryRequests - }` - ) - ); - } + if (this.retries < this.maxRetryRequests) { + this.retries += 1; + this.getter(this.offset) + .then((newSource) => { + this.source = newSource; + this.setSourceEventHandlers(); + return; + }) + .catch((error) => { + this.destroy(error); + }); } else { - this.emit( - "error", + this.destroy( new Error( - `Data corruption failure: Received more data than original request, data needed offset is ${ - this.end - }, received offset: ${this.offset - 1}` + `Data corruption failure: received less data than required and reached maxRetires limitation. Received data offset: ${ + this.offset - 1 + }, data needed offset: ${this.end}, retries: ${this.retries}, max retries: ${ + this.maxRetryRequests + }` ) ); } - }); - } + } else { + this.destroy( + new Error( + `Data corruption failure: Received more data than original request, data needed offset is ${ + this.end + }, received offset: ${this.offset - 1}` + ) + ); + } + }; + + _destroy(error: Error | null, callback: (error?: Error) => void): void { + // remove listener from source and release source + this.removeSourceEventHandlers(); + (this.source as Readable).destroy(); - private setSourceErrorHandler() { - this.source.on("error", (error) => { - this.emit("error", error); - }); + callback(error === null ? undefined : error); } } diff --git a/sdk/storage/storage-file-share/test/node/directoryclient.spec.ts b/sdk/storage/storage-file-share/test/node/directoryclient.spec.ts index 1b1b545ccd36..006bab67e40e 100644 --- a/sdk/storage/storage-file-share/test/node/directoryclient.spec.ts +++ b/sdk/storage/storage-file-share/test/node/directoryclient.spec.ts @@ -39,8 +39,7 @@ describe("DirectoryClient Node.js only", () => { }); it("can be created with a url and a credential", async () => { - const factories = (dirClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = dirClient["credential"] as StorageSharedKeyCredential; const newClient = new ShareDirectoryClient(dirClient.url, credential); const result = await newClient.getProperties(); @@ -53,8 +52,7 @@ describe("DirectoryClient Node.js only", () => { }); it("can be created with a url and a credential and an option bag", async () => { - const factories = (dirClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = dirClient["credential"] as StorageSharedKeyCredential; const newClient = new ShareDirectoryClient(dirClient.url, credential, { retryOptions: { maxTries: 5, @@ -71,8 +69,7 @@ describe("DirectoryClient Node.js only", () => { }); it("can be created with a url and a pipeline", async () => { - const factories = (dirClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = dirClient["credential"] as StorageSharedKeyCredential; const pipeline = newPipeline(credential); const newClient = new ShareDirectoryClient(dirClient.url, pipeline); diff --git a/sdk/storage/storage-file-share/test/node/fileserviceclient.spec.ts b/sdk/storage/storage-file-share/test/node/fileserviceclient.spec.ts index 6ee067aee562..a85c1b9c31c7 100644 --- a/sdk/storage/storage-file-share/test/node/fileserviceclient.spec.ts +++ b/sdk/storage/storage-file-share/test/node/fileserviceclient.spec.ts @@ -20,8 +20,7 @@ describe("FileServiceClient Node.js only", () => { it("can be created with a url and a credential", async () => { const serviceClient = getBSU(); - const factories = (serviceClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = serviceClient["credential"] as StorageSharedKeyCredential; const newClient = new ShareServiceClient(serviceClient.url, credential); const result = await newClient.getProperties(); @@ -34,8 +33,7 @@ describe("FileServiceClient Node.js only", () => { it("can be created with a url and a credential and an option bag", async () => { const serviceClient = getBSU(); - const factories = (serviceClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = serviceClient["credential"] as StorageSharedKeyCredential; const newClient = new ShareServiceClient(serviceClient.url, credential, { retryOptions: { maxTries: 5 }, }); @@ -50,8 +48,7 @@ describe("FileServiceClient Node.js only", () => { it("can be created with a url and a pipeline", async () => { const serviceClient = getBSU(); - const factories = (serviceClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = serviceClient["credential"] as StorageSharedKeyCredential; const pipeline = newPipeline(credential); const newClient = new ShareServiceClient(serviceClient.url, pipeline); diff --git a/sdk/storage/storage-file-share/test/node/shareclient.spec.ts b/sdk/storage/storage-file-share/test/node/shareclient.spec.ts index b1696385a40b..e83f3af1f75d 100644 --- a/sdk/storage/storage-file-share/test/node/shareclient.spec.ts +++ b/sdk/storage/storage-file-share/test/node/shareclient.spec.ts @@ -83,8 +83,7 @@ describe("ShareClient Node.js only", () => { }); it("can be created with a url and a credential", async () => { - const factories = (shareClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = shareClient["credential"] as StorageSharedKeyCredential; const newClient = new ShareClient(shareClient.url, credential); const result = await newClient.getProperties(); @@ -97,8 +96,7 @@ describe("ShareClient Node.js only", () => { }); it("can be created with a url and a credential and an option bag", async () => { - const factories = (shareClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = shareClient["credential"] as StorageSharedKeyCredential; const newClient = new ShareClient(shareClient.url, credential, { retryOptions: { maxTries: 5, @@ -115,8 +113,7 @@ describe("ShareClient Node.js only", () => { }); it("can be created with a url and a pipeline", async () => { - const factories = (shareClient as any).pipeline.factories; - const credential = factories[factories.length - 1] as StorageSharedKeyCredential; + const credential = shareClient["credential"] as StorageSharedKeyCredential; const pipeline = newPipeline(credential); const newClient = new ShareClient(shareClient.url, pipeline); From d95f19a19dbbb7da786d42137d34ea459a5bf1c0 Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Mon, 5 Jun 2023 21:42:48 +0000 Subject: [PATCH 06/10] live tests passing in browser --- sdk/storage/storage-file-share/CHANGELOG.md | 12 ++++++++++++ sdk/storage/storage-file-share/src/Clients.ts | 1 - .../storage-file-share/test/fileclient.spec.ts | 11 +++++++++-- .../storage-file-share/test/utils/index.browser.ts | 10 +++++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/sdk/storage/storage-file-share/CHANGELOG.md b/sdk/storage/storage-file-share/CHANGELOG.md index a5c0cd5ed944..d39fbd6905ee 100644 --- a/sdk/storage/storage-file-share/CHANGELOG.md +++ b/sdk/storage/storage-file-share/CHANGELOG.md @@ -1,5 +1,17 @@ # Release History +## 12.20.0 (Unreleased) + +### Features Added + +### Breaking Changes + +### Bugs Fixed + +### Other Changes + +- Migrated dependency on `@azure/core-http` to `@azure/core-rest-pipeline`. + ## 12.13.0 (Unreleased) ### Features Added diff --git a/sdk/storage/storage-file-share/src/Clients.ts b/sdk/storage/storage-file-share/src/Clients.ts index 52b4347b53b5..a4119899318f 100644 --- a/sdk/storage/storage-file-share/src/Clients.ts +++ b/sdk/storage/storage-file-share/src/Clients.ts @@ -3922,7 +3922,6 @@ export class ShareFileClient extends StorageClient { offset, res.contentLength!, { - abortSignal: updatedOptions.abortSignal, maxRetryRequests: updatedOptions.maxRetryRequests, onProgress: updatedOptions.onProgress, } diff --git a/sdk/storage/storage-file-share/test/fileclient.spec.ts b/sdk/storage/storage-file-share/test/fileclient.spec.ts index 146c88b3d680..48d950c53abc 100644 --- a/sdk/storage/storage-file-share/test/fileclient.spec.ts +++ b/sdk/storage/storage-file-share/test/fileclient.spec.ts @@ -592,7 +592,9 @@ describe("FileClient", () => { ); await fileClient.create(10); let progressUpdated = false; - await fileClient.uploadRange("HelloWorld", 0, 10, { + // fetch http client doesn't fire progress for string bodies, only blob and streams + const body = isNode ? "HelloWorld" : new Blob(["HelloWorld"]); + await fileClient.uploadRange(body, 0, 10, { onProgress: () => { progressUpdated = true; }, @@ -786,11 +788,16 @@ describe("FileClient", () => { assert.deepStrictEqual(await bodyToString(result, 2), "He"); }); - it("download should update progress and abort successfully", async () => { + it("download should update progress and abort successfully", async function () { recorder.skip( undefined, "Abort - Recorder does not record a request if it's aborted in a 'progress' callback" ); + if (!isNode) { + // because this test is using a blob response, there won't be + // anything to abort by the time onProgress gets called. + this.skip(); + } await fileClient.create(128 * 1024 * 1024); let eventTriggered = false; diff --git a/sdk/storage/storage-file-share/test/utils/index.browser.ts b/sdk/storage/storage-file-share/test/utils/index.browser.ts index d1b6bb3c0205..d229da3eeaa2 100644 --- a/sdk/storage/storage-file-share/test/utils/index.browser.ts +++ b/sdk/storage/storage-file-share/test/utils/index.browser.ts @@ -130,8 +130,16 @@ export function getBrowserFile(name: string, size: number): File { } export function getSASConnectionStringFromEnvironment(): string { + if (!isLiveMode()) { + setTestOnlySetHttpClient(createXhrHttpClient()); + } const env = (self as any).__env__; - return `BlobEndpoint=https://${env.ACCOUNT_NAME}.blob.core.windows.net/;QueueEndpoint=https://${env.ACCOUNT_NAME}.queue.core.windows.net/;FileEndpoint=https://${env.ACCOUNT_NAME}.file.core.windows.net/;TableEndpoint=https://${env.ACCOUNT_NAME}.table.core.windows.net/;SharedAccessSignature=${env.ACCOUNT_SAS}`; + let sasToken: string = env.ACCOUNT_SAS; + // connection string SAS doesn't have the prefix + if (sasToken && sasToken.startsWith("?")) { + sasToken = sasToken.slice(1); + } + return `BlobEndpoint=https://${env.ACCOUNT_NAME}.blob.core.windows.net/;QueueEndpoint=https://${env.ACCOUNT_NAME}.queue.core.windows.net/;FileEndpoint=https://${env.ACCOUNT_NAME}.file.core.windows.net/;TableEndpoint=https://${env.ACCOUNT_NAME}.table.core.windows.net/;SharedAccessSignature=${sasToken}`; } export function arraysEqual(a: Uint8Array, b: Uint8Array): boolean { From 9af0be5430cd82194e301313001dd14ac2f6bbb2 Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Mon, 5 Jun 2023 21:49:36 +0000 Subject: [PATCH 07/10] update lockfile --- common/config/rush/pnpm-lock.yaml | 62 ++++++++++++++++--------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index aafea9ae8794..ced269eb5321 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2245,7 +2245,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/chai-as-promised/7.1.5: @@ -2267,7 +2267,7 @@ packages: /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/cookie/0.4.1: @@ -2277,7 +2277,7 @@ packages: /@types/cors/2.8.13: resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/debug/4.1.8: @@ -2289,7 +2289,7 @@ packages: /@types/decompress/4.2.4: resolution: {integrity: sha512-/C8kTMRTNiNuWGl5nEyKbPiMv6HA+0RbEXzFhFBEzASM6+oa4tJro9b8nj7eRlOFfuLdzUU+DS/GPDlvvzMOhA==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/eslint/8.4.10: @@ -2310,7 +2310,7 @@ packages: /@types/express-serve-static-core/4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -2328,13 +2328,13 @@ packages: /@types/fs-extra/8.1.2: resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/fs-extra/9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/inquirer/8.2.6: @@ -2347,7 +2347,7 @@ packages: /@types/is-buffer/2.0.0: resolution: {integrity: sha512-0f7N/e3BAz32qDYvgB4d2cqv1DqUwvGxHkXsrucICn8la1Vb6Yl6Eg8mPScGwUiqHJeE7diXlzaK+QMA9m4Gxw==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/json-schema/7.0.12: @@ -2361,13 +2361,13 @@ packages: /@types/jsonwebtoken/9.0.2: resolution: {integrity: sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/jws/3.2.5: resolution: {integrity: sha512-xGTxZH34xOryaTN8CMsvhh9lfNqFuHiMoRvsLYWQdBJHqiECyfInXVl2eK8Jz2emxZWMIn5RBlmr3oDVPeWujw==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/linkify-it/3.0.2: @@ -2418,13 +2418,13 @@ packages: /@types/mysql/2.15.19: resolution: {integrity: sha512-wSRg2QZv14CWcZXkgdvHbbV2ACufNy5EgI8mBBxnJIptchv7DBy/h53VMa2jDhyo0C9MO4iowE6z9vF8Ja1DkQ==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/node-fetch/2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 form-data: 3.0.1 dev: false @@ -2449,7 +2449,7 @@ packages: /@types/pg/8.6.1: resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 pg-protocol: 1.6.0 pg-types: 2.2.0 dev: false @@ -2477,7 +2477,7 @@ packages: /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/semaphore/1.1.1: @@ -2496,14 +2496,14 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/serve-static/1.15.1: resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: '@types/mime': 3.0.1 - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/sinon/10.0.15: @@ -2525,13 +2525,13 @@ packages: /@types/stoppable/1.1.1: resolution: {integrity: sha512-b8N+fCADRIYYrGZOcmOR8ZNBOqhktWTB/bMUl5LvGtT201QKJZOOH5UsFyI3qtteM6ZAJbJqZoBcLqqxKIwjhw==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/through/0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/tough-cookie/4.0.2: @@ -2545,7 +2545,7 @@ packages: /@types/tunnel/0.0.3: resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/underscore/1.11.5: @@ -2563,19 +2563,19 @@ packages: /@types/ws/7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/ws/8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/xml2js/0.4.11: resolution: {integrity: sha512-JdigeAKmCyoJUiQljjr7tQG3if9NkqGUgwEUqBvV0N7LM4HyQk7UXCnusRa1lnvXAEYJ8mw8GtZWioagNztOwA==} dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false /@types/yargs-parser/21.0.0: @@ -2592,7 +2592,7 @@ packages: resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} requiresBuild: true dependencies: - '@types/node': 14.18.48 + '@types/node': 16.18.34 dev: false optional: true @@ -3601,7 +3601,7 @@ packages: resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) dependencies: - ms: 2.1.1 + ms: 2.1.3 dev: false /debug/3.2.7: @@ -3883,7 +3883,7 @@ packages: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.13 - '@types/node': 14.18.48 + '@types/node': 16.18.34 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 @@ -4807,7 +4807,7 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.4 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 dev: false @@ -7115,7 +7115,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 14.18.48 + '@types/node': 16.18.34 long: 5.2.3 dev: false @@ -18026,7 +18026,7 @@ packages: dev: false file:projects/monitor-query.tgz: - resolution: {integrity: sha512-UTfrrypI9UvxkoW1o6zxcIzxJSxXeam5tEzF35ZFa+bJnIOgH45sUvzT2p4n/YA2/blGPYogtQPT81RcWiHgBg==, tarball: file:projects/monitor-query.tgz} + resolution: {integrity: sha512-bE/JTLjfj8HMmBTGfK1pTs4Kfsy9GJwXtrvbOjgDH8pYIvzzJ3LjUNRGjVhb3r+FOPkBRbb9fxniy5U3mmmLng==, tarball: file:projects/monitor-query.tgz} name: '@rush-temp/monitor-query' version: 0.0.0 dependencies: @@ -19316,7 +19316,7 @@ packages: dev: false file:projects/storage-file-share.tgz: - resolution: {integrity: sha512-5ie5/QK9klG91C+f7GkzlFX+KDKuwVgKyn52dzGylmLr4NCjh/b4OWguq/5kae9OC8qHn4+aJHg2J81P5M4QDA==, tarball: file:projects/storage-file-share.tgz} + resolution: {integrity: sha512-Ta2DL1i32tq8YzBuBOpmsMPn5ZwaEkk4UK/PIovIBFkm19A6Pb/TcIsJWYe2IDV6bmz9S4jLLFdRex0krtigYw==, tarball: file:projects/storage-file-share.tgz} name: '@rush-temp/storage-file-share' version: 0.0.0 dependencies: @@ -19326,6 +19326,8 @@ packages: '@types/chai': 4.3.5 '@types/mocha': 7.0.2 '@types/node': 14.18.48 + '@types/sinon': 9.0.11 + '@types/uuid': 8.3.4 chai: 4.3.7 cross-env: 7.0.3 dotenv: 16.1.4 @@ -19352,11 +19354,13 @@ packages: prettier: 2.8.8 puppeteer: 19.11.1_typescript@5.0.4 rimraf: 3.0.2 + sinon: 9.2.4 source-map-support: 0.5.21 ts-node: 10.9.1_haicren4phfcx6dckkdidh3s3e tslib: 2.5.3 typescript: 5.0.4 util: 0.12.5 + uuid: 8.3.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' From 0aacc901043ae3e371b25c3dbdb31129b21115a9 Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Mon, 5 Jun 2023 22:10:42 +0000 Subject: [PATCH 08/10] fix lint --- sdk/storage/storage-file-share/.eslintrc.json | 7 +++++++ sdk/storage/storage-file-share/src/Clients.ts | 15 +++++++++------ .../storage-file-share/src/ShareServiceClient.ts | 5 +++-- 3 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 sdk/storage/storage-file-share/.eslintrc.json diff --git a/sdk/storage/storage-file-share/.eslintrc.json b/sdk/storage/storage-file-share/.eslintrc.json new file mode 100644 index 000000000000..bf70df6fd8eb --- /dev/null +++ b/sdk/storage/storage-file-share/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "plugins": ["@azure/azure-sdk"], + "extends": ["plugin:@azure/azure-sdk/azure-sdk-base"], + "rules": { + "@azure/azure-sdk/ts-package-json-module": "warn" + } +} diff --git a/sdk/storage/storage-file-share/src/Clients.ts b/sdk/storage/storage-file-share/src/Clients.ts index a4119899318f..36cdd1a2aa6f 100644 --- a/sdk/storage/storage-file-share/src/Clients.ts +++ b/sdk/storage/storage-file-share/src/Clients.ts @@ -594,11 +594,12 @@ export class ShareClient extends StorageClient { * If not specified, AnonymousCredential is used. * @param options - Optional. Options to configure the HTTP pipeline. */ - // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. - /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ + constructor( url: string, credential?: StorageSharedKeyCredential | AnonymousCredential, + // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. + /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ options?: StoragePipelineOptions ); /** @@ -1745,11 +1746,11 @@ export class ShareDirectoryClient extends StorageClient { * If not specified, AnonymousCredential is used. * @param options - Optional. Options to configure the HTTP pipeline. */ - // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. - /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ constructor( url: string, credential?: AnonymousCredential | StorageSharedKeyCredential, + // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. + /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ options?: StoragePipelineOptions ); /** @@ -1770,6 +1771,8 @@ export class ShareDirectoryClient extends StorageClient { constructor( url: string, credentialOrPipeline?: AnonymousCredential | StorageSharedKeyCredential | Pipeline, + // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. + /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ options: StoragePipelineOptions = {} ) { let pipeline: Pipeline; @@ -3668,11 +3671,11 @@ export class ShareFileClient extends StorageClient { * If not specified, AnonymousCredential is used. * @param options - Optional. Options to configure the HTTP pipeline. */ - // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. - /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ constructor( url: string, credential?: AnonymousCredential | StorageSharedKeyCredential, + // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. + /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ options?: StoragePipelineOptions ); /** diff --git a/sdk/storage/storage-file-share/src/ShareServiceClient.ts b/sdk/storage/storage-file-share/src/ShareServiceClient.ts index 271770710462..95b3df53e9ea 100644 --- a/sdk/storage/storage-file-share/src/ShareServiceClient.ts +++ b/sdk/storage/storage-file-share/src/ShareServiceClient.ts @@ -268,11 +268,12 @@ export class ShareServiceClient extends StorageClient { * If not specified, AnonymousCredential is used. * @param options - Optional. Options to configure the HTTP pipeline. */ - // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. - /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ + constructor( url: string, credential?: AnonymousCredential | StorageSharedKeyCredential, + // Legacy, no way to fix the eslint error without breaking. Disable the rule for this line. + /* eslint-disable-next-line @azure/azure-sdk/ts-naming-options */ options?: StoragePipelineOptions ); /** From 48e6d40cd12168d4ede516b96803b54ad55a2ad1 Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Mon, 5 Jun 2023 22:11:13 +0000 Subject: [PATCH 09/10] format --- sdk/storage/storage-file-share/tsconfig.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sdk/storage/storage-file-share/tsconfig.json b/sdk/storage/storage-file-share/tsconfig.json index f10e47bdbfdb..31793044763c 100644 --- a/sdk/storage/storage-file-share/tsconfig.json +++ b/sdk/storage/storage-file-share/tsconfig.json @@ -9,5 +9,10 @@ "@azure/storage-file-share": ["./src/index"] } }, - "include": ["./src/**/*.ts", "./test/**/*.ts", "./samples-dev/**/*.ts", "../storage-blob/src/**/*.ts"] + "include": [ + "./src/**/*.ts", + "./test/**/*.ts", + "./samples-dev/**/*.ts", + "../storage-blob/src/**/*.ts" + ] } From 79b1eff62fea78ccf26ca1f2d0c6b189b65eba9b Mon Sep 17 00:00:00 2001 From: Jeff Fisher Date: Tue, 6 Jun 2023 15:22:14 +0000 Subject: [PATCH 10/10] fix integration tests --- sdk/storage/storage-file-share/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/storage-file-share/package.json b/sdk/storage/storage-file-share/package.json index 4ef4a88b80c2..fa3626fa5e28 100644 --- a/sdk/storage/storage-file-share/package.json +++ b/sdk/storage/storage-file-share/package.json @@ -48,7 +48,7 @@ "format": "prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"test/**/*.ts\" \"samples-dev/**/*.ts\" \"*.{js,json}\"", "generate:client": "autorest --typescript ./swagger/README.md", "integration-test:browser": "karma start --single-run", - "integration-test:node": "nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --full-trace -t 300000 \"dist-esm/test/*.spec.js\" \"dist-esm/test/node/*.spec.js\"", + "integration-test:node": "nyc mocha -r esm --require source-map-support/register --reporter ../../../common/tools/mocha-multi-reporter.js --full-trace -t 300000 \"dist-esm/storage-file-share/test/*.spec.js\" \"dist-esm/storage-file-share/test/node/*.spec.js\"", "integration-test": "npm run integration-test:node && npm run integration-test:browser", "lint:fix": "eslint package.json api-extractor.json README.md src test --ext .ts,.javascript,.js --fix", "lint": "eslint package.json api-extractor.json README.md src test --ext .ts,.javascript,.js",