{"version":3,"file":"aws4fetch.mjs","names":["match"],"sources":["../../src/aws/aws4fetch.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Original implementation https://github.com/mhart/aws4fetch, inlined to reduce external dependencies\n * @license MIT <https://opensource.org/licenses/MIT>\n * @copyright Michael Hart 2024\n */\n\nconst encoder = new TextEncoder();\n\n/** @type {Record<string, string>} */\nconst HOST_SERVICES: Record<string, string> = {\n\tappstream2: 'appstream',\n\tcloudhsmv2: 'cloudhsm',\n\temail: 'ses',\n\tmarketplace: 'aws-marketplace',\n\tmobile: 'AWSMobileHubService',\n\tpinpoint: 'mobiletargeting',\n\tqueue: 'sqs',\n\t'git-codecommit': 'codecommit',\n\t'mturk-requester-sandbox': 'mturk-requester',\n\t'personalize-runtime': 'personalize',\n};\n\n// https://github.com/aws/aws-sdk-js/blob/cc29728c1c4178969ebabe3bbe6b6f3159436394/lib/signers/v4.js#L190-L198\nconst UNSIGNABLE_HEADERS = new Set([\n\t'authorization',\n\t'content-type',\n\t'content-length',\n\t'user-agent',\n\t'presigned-expires',\n\t'expect',\n\t'x-amzn-trace-id',\n\t'range',\n\t'connection',\n]);\n\ntype AwsRequestInit = RequestInit & {\n\taws?: {\n\t\taccessKeyId?: string;\n\t\tsecretAccessKey?: string;\n\t\tsessionToken?: string;\n\t\tservice?: string;\n\t\tregion?: string;\n\t\tcache?: Map<string, ArrayBuffer>;\n\t\tdatetime?: string;\n\t\tsignQuery?: boolean;\n\t\tappendSessionToken?: boolean;\n\t\tallHeaders?: boolean;\n\t\tsingleEncode?: boolean;\n\t};\n};\n\nexport class AwsClient {\n\taccessKeyId: string;\n\tsecretAccessKey: string;\n\tsessionToken: string | undefined;\n\tservice: string | undefined;\n\tregion: string | undefined;\n\tcache: Map<any, any>;\n\tretries: number;\n\tinitRetryMs: number;\n\t/**\n\t * @param {} options\n\t */\n\tconstructor({\n\t\taccessKeyId,\n\t\tsecretAccessKey,\n\t\tsessionToken,\n\t\tservice,\n\t\tregion,\n\t\tcache,\n\t\tretries,\n\t\tinitRetryMs,\n\t}: {\n\t\taccessKeyId: string;\n\t\tsecretAccessKey: string;\n\t\tsessionToken?: string;\n\t\tservice?: string;\n\t\tregion?: string;\n\t\tcache?: Map<string, ArrayBuffer>;\n\t\tretries?: number;\n\t\tinitRetryMs?: number;\n\t}) {\n\t\tif (accessKeyId == null) throw new TypeError('accessKeyId is a required option');\n\t\tif (secretAccessKey == null) throw new TypeError('secretAccessKey is a required option');\n\t\tthis.accessKeyId = accessKeyId;\n\t\tthis.secretAccessKey = secretAccessKey;\n\t\tthis.sessionToken = sessionToken;\n\t\tthis.service = service;\n\t\tthis.region = region;\n\t\t/** @type {Map<string, ArrayBuffer>} */\n\t\tthis.cache = cache || new Map();\n\t\tthis.retries = retries != null ? retries : 10; // Up to 25.6 secs\n\t\tthis.initRetryMs = initRetryMs || 50;\n\t}\n\n\tasync sign(input: Request | { toString: () => string }, init: AwsRequestInit): Promise<Request> {\n\t\tif (input instanceof Request) {\n\t\t\tconst { method, url, headers, body } = input;\n\t\t\tinit = Object.assign({ method, url, headers }, init);\n\t\t\tif (init.body == null && headers.has('Content-Type')) {\n\t\t\t\tinit.body =\n\t\t\t\t\tbody != null && headers.has('X-Amz-Content-Sha256')\n\t\t\t\t\t\t? body\n\t\t\t\t\t\t: await input.clone().arrayBuffer();\n\t\t\t}\n\t\t\tinput = url;\n\t\t}\n\t\tconst signer = new AwsV4Signer(\n\t\t\tObject.assign({ url: input.toString() }, init, this, init && init.aws),\n\t\t);\n\t\tconst signed = Object.assign({}, init, await signer.sign());\n\t\tdelete signed.aws;\n\t\ttry {\n\t\t\treturn new Request(signed.url.toString(), signed);\n\t\t} catch (e) {\n\t\t\tif (e instanceof TypeError) {\n\t\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=1360943\n\t\t\t\treturn new Request(signed.url.toString(), Object.assign({ duplex: 'half' }, signed));\n\t\t\t}\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t/**\n\t * @param {Request | { toString: () => string }} input\n\t * @param {?AwsRequestInit} [init]\n\t * @returns {Promise<Response>}\n\t */\n\tasync fetch(input: Request | { toString: () => string }, init: AwsRequestInit) {\n\t\tfor (let i = 0; i <= this.retries; i++) {\n\t\t\tconst fetched = fetch(await this.sign(input, init));\n\t\t\tif (i === this.retries) {\n\t\t\t\treturn fetched; // No need to await if we're returning anyway\n\t\t\t}\n\t\t\tconst res = await fetched;\n\t\t\tif (res.status < 500 && res.status !== 429) {\n\t\t\t\treturn res;\n\t\t\t}\n\t\t\tawait new Promise((resolve) =>\n\t\t\t\tsetTimeout(resolve, Math.random() * this.initRetryMs * Math.pow(2, i)),\n\t\t\t);\n\t\t}\n\t\tthrow new Error('An unknown error occurred, ensure retries is not negative');\n\t}\n}\n\nexport class AwsV4Signer {\n\tmethod: any;\n\turl: URL;\n\theaders: Headers;\n\tbody: any;\n\taccessKeyId: any;\n\tsecretAccessKey: any;\n\tsessionToken: any;\n\tservice: any;\n\tregion: any;\n\tcache: any;\n\tdatetime: any;\n\tsignQuery: any;\n\tappendSessionToken: any;\n\tsignableHeaders: any[];\n\tsignedHeaders: any;\n\tcanonicalHeaders: any;\n\tcredentialString: string;\n\tencodedPath: string;\n\tencodedSearch: string;\n\t/**\n\t * @param {} options\n\t */\n\tconstructor({\n\t\tmethod,\n\t\turl,\n\t\theaders,\n\t\tbody,\n\t\taccessKeyId,\n\t\tsecretAccessKey,\n\t\tsessionToken,\n\t\tservice,\n\t\tregion,\n\t\tcache,\n\t\tdatetime,\n\t\tsignQuery,\n\t\tappendSessionToken,\n\t\tallHeaders,\n\t\tsingleEncode,\n\t}: {\n\t\tmethod?: string;\n\t\turl: string;\n\t\theaders?: HeadersInit;\n\t\tbody?: BodyInit | null;\n\t\taccessKeyId: string;\n\t\tsecretAccessKey: string;\n\t\tsessionToken?: string;\n\t\tservice?: string;\n\t\tregion?: string;\n\t\tcache?: Map<string, ArrayBuffer>;\n\t\tdatetime?: string;\n\t\tsignQuery?: boolean;\n\t\tappendSessionToken?: boolean;\n\t\tallHeaders?: boolean;\n\t\tsingleEncode?: boolean;\n\t}) {\n\t\tif (url == null) throw new TypeError('url is a required option');\n\t\tif (accessKeyId == null) throw new TypeError('accessKeyId is a required option');\n\t\tif (secretAccessKey == null) throw new TypeError('secretAccessKey is a required option');\n\n\t\tthis.method = method || (body ? 'POST' : 'GET');\n\t\tthis.url = new URL(url);\n\t\tthis.headers = new Headers(headers || {});\n\t\tthis.body = body;\n\n\t\tthis.accessKeyId = accessKeyId;\n\t\tthis.secretAccessKey = secretAccessKey;\n\t\tthis.sessionToken = sessionToken;\n\n\t\tlet guessedService, guessedRegion;\n\t\tif (!service || !region) {\n\t\t\t[guessedService, guessedRegion] = guessServiceRegion(this.url, this.headers);\n\t\t}\n\t\tthis.service = service || guessedService || '';\n\t\tthis.region = region || guessedRegion || 'us-east-1';\n\n\t\t/** @type {Map<string, ArrayBuffer>} */\n\t\tthis.cache = cache || new Map();\n\t\tthis.datetime = datetime || new Date().toISOString().replace(/[:-]|\\.\\d{3}/g, '');\n\t\tthis.signQuery = signQuery;\n\t\tthis.appendSessionToken = appendSessionToken || this.service === 'iotdevicegateway';\n\n\t\tthis.headers.delete('Host'); // Can't be set in insecure env anyway\n\n\t\tif (this.service === 's3' && !this.signQuery && !this.headers.has('X-Amz-Content-Sha256')) {\n\t\t\tthis.headers.set('X-Amz-Content-Sha256', 'UNSIGNED-PAYLOAD');\n\t\t}\n\n\t\tconst params = this.signQuery ? this.url.searchParams : this.headers;\n\n\t\tparams.set('X-Amz-Date', this.datetime);\n\t\tif (this.sessionToken && !this.appendSessionToken) {\n\t\t\tparams.set('X-Amz-Security-Token', this.sessionToken);\n\t\t}\n\n\t\t// headers are always lowercase in keys()\n\n\t\tthis.signableHeaders = ['host', ...((this.headers as any).keys() as string[])]\n\t\t\t.filter((header) => allHeaders || !UNSIGNABLE_HEADERS.has(header))\n\t\t\t.sort();\n\n\t\tthis.signedHeaders = this.signableHeaders.join(';');\n\n\t\t// headers are always trimmed:\n\t\t// https://fetch.spec.whatwg.org/#concept-header-value-normalize\n\t\tthis.canonicalHeaders = this.signableHeaders\n\t\t\t.map(\n\t\t\t\t(header) =>\n\t\t\t\t\theader +\n\t\t\t\t\t':' +\n\t\t\t\t\t(header === 'host'\n\t\t\t\t\t\t? this.url.host\n\t\t\t\t\t\t: (this.headers.get(header) || '').replace(/\\s+/g, ' ')),\n\t\t\t)\n\t\t\t.join('\\n');\n\n\t\tthis.credentialString = [\n\t\t\tthis.datetime.slice(0, 8),\n\t\t\tthis.region,\n\t\t\tthis.service,\n\t\t\t'aws4_request',\n\t\t].join('/');\n\n\t\tif (this.signQuery) {\n\t\t\tif (this.service === 's3' && !params.has('X-Amz-Expires')) {\n\t\t\t\tparams.set('X-Amz-Expires', '86400'); // 24 hours\n\t\t\t}\n\t\t\tparams.set('X-Amz-Algorithm', 'AWS4-HMAC-SHA256');\n\t\t\tparams.set('X-Amz-Credential', this.accessKeyId + '/' + this.credentialString);\n\t\t\tparams.set('X-Amz-SignedHeaders', this.signedHeaders);\n\t\t}\n\n\t\tif (this.service === 's3') {\n\t\t\ttry {\n\t\t\t\tthis.encodedPath = decodeURIComponent(this.url.pathname.replace(/\\+/g, ' '));\n\t\t\t} catch {\n\t\t\t\tthis.encodedPath = this.url.pathname;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.encodedPath = this.url.pathname.replace(/\\/+/g, '/');\n\t\t}\n\t\tif (!singleEncode) {\n\t\t\tthis.encodedPath = encodeURIComponent(this.encodedPath).replace(/%2F/g, '/');\n\t\t}\n\t\tthis.encodedPath = encodeRfc3986(this.encodedPath);\n\n\t\tconst seenKeys = new Set();\n\t\tthis.encodedSearch = [...this.url.searchParams]\n\t\t\t.filter(([k]) => {\n\t\t\t\tif (!k) return false; // no empty keys\n\t\t\t\tif (this.service === 's3') {\n\t\t\t\t\tif (seenKeys.has(k)) return false; // first val only for S3\n\t\t\t\t\tseenKeys.add(k);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t.map((pair) => pair.map((p) => encodeRfc3986(encodeURIComponent(p))))\n\t\t\t.sort(([k1, v1], [k2, v2]) => (k1 < k2 ? -1 : k1 > k2 ? 1 : v1 < v2 ? -1 : v1 > v2 ? 1 : 0))\n\t\t\t.map((pair) => pair.join('='))\n\t\t\t.join('&');\n\t}\n\n\t/**\n\t * @returns {Promise<{\n\t *   method: string\n\t *   url: URL\n\t *   headers: Headers\n\t *   body?: BodyInit | null\n\t * }>}\n\t */\n\tasync sign() {\n\t\tif (this.signQuery) {\n\t\t\tthis.url.searchParams.set('X-Amz-Signature', await this.signature());\n\t\t\tif (this.sessionToken && this.appendSessionToken) {\n\t\t\t\tthis.url.searchParams.set('X-Amz-Security-Token', this.sessionToken);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.headers.set('Authorization', await this.authHeader());\n\t\t}\n\n\t\treturn {\n\t\t\tmethod: this.method,\n\t\t\turl: this.url,\n\t\t\theaders: this.headers,\n\t\t\tbody: this.body,\n\t\t};\n\t}\n\n\t/**\n\t * @returns {Promise<string>}\n\t */\n\tasync authHeader() {\n\t\treturn [\n\t\t\t'AWS4-HMAC-SHA256 Credential=' + this.accessKeyId + '/' + this.credentialString,\n\t\t\t'SignedHeaders=' + this.signedHeaders,\n\t\t\t'Signature=' + (await this.signature()),\n\t\t].join(', ');\n\t}\n\n\t/**\n\t * @returns {Promise<string>}\n\t */\n\tasync signature() {\n\t\tconst date = this.datetime.slice(0, 8);\n\t\tconst cacheKey = [this.secretAccessKey, date, this.region, this.service].join();\n\t\tlet kCredentials = this.cache.get(cacheKey);\n\t\tif (!kCredentials) {\n\t\t\tconst kDate = await hmac('AWS4' + this.secretAccessKey, date);\n\t\t\tconst kRegion = await hmac(kDate, this.region);\n\t\t\tconst kService = await hmac(kRegion, this.service);\n\t\t\tkCredentials = await hmac(kService, 'aws4_request');\n\t\t\tthis.cache.set(cacheKey, kCredentials);\n\t\t}\n\t\treturn buf2hex(await hmac(kCredentials, await this.stringToSign()));\n\t}\n\n\t/**\n\t * @returns {Promise<string>}\n\t */\n\tasync stringToSign() {\n\t\treturn [\n\t\t\t'AWS4-HMAC-SHA256',\n\t\t\tthis.datetime,\n\t\t\tthis.credentialString,\n\t\t\tbuf2hex(await hash(await this.canonicalString())),\n\t\t].join('\\n');\n\t}\n\n\t/**\n\t * @returns {Promise<string>}\n\t */\n\tasync canonicalString() {\n\t\treturn [\n\t\t\tthis.method.toUpperCase(),\n\t\t\tthis.encodedPath,\n\t\t\tthis.encodedSearch,\n\t\t\tthis.canonicalHeaders + '\\n',\n\t\t\tthis.signedHeaders,\n\t\t\tawait this.hexBodyHash(),\n\t\t].join('\\n');\n\t}\n\n\t/**\n\t * @returns {Promise<string>}\n\t */\n\tasync hexBodyHash() {\n\t\tlet hashHeader =\n\t\t\tthis.headers.get('X-Amz-Content-Sha256') ||\n\t\t\t(this.service === 's3' && this.signQuery ? 'UNSIGNED-PAYLOAD' : null);\n\t\tif (hashHeader == null) {\n\t\t\tif (this.body && typeof this.body !== 'string' && !('byteLength' in this.body)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'body must be a string, ArrayBuffer or ArrayBufferView, unless you include the X-Amz-Content-Sha256 header',\n\t\t\t\t);\n\t\t\t}\n\t\t\thashHeader = buf2hex(await hash(this.body || ''));\n\t\t}\n\t\treturn hashHeader;\n\t}\n}\n\n/**\n * @param {string | BufferSource} key\n * @param {string} string\n * @returns {Promise<ArrayBuffer>}\n */\nasync function hmac(key: string | BufferSource, string: string): Promise<ArrayBuffer> {\n\tconst cryptoKey = await crypto.subtle.importKey(\n\t\t'raw',\n\t\ttypeof key === 'string' ? encoder.encode(key) : key,\n\t\t{ name: 'HMAC', hash: { name: 'SHA-256' } },\n\t\tfalse,\n\t\t['sign'],\n\t);\n\treturn crypto.subtle.sign('HMAC', cryptoKey, encoder.encode(string));\n}\n\nasync function hash(content: string | ArrayBufferLike): Promise<ArrayBuffer> {\n\treturn crypto.subtle.digest(\n\t\t'SHA-256',\n\t\t(typeof content === 'string' ? encoder.encode(content) : content) as ArrayBuffer,\n\t);\n}\n\nconst HEX_CHARS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];\n\nfunction buf2hex(arrayBuffer: ArrayBufferLike): string {\n\tconst buffer = new Uint8Array(arrayBuffer);\n\tlet out = '';\n\tfor (let idx = 0; idx < buffer.length; idx++) {\n\t\tconst n = buffer[idx];\n\n\t\tout += HEX_CHARS[(n >>> 4) & 0xf];\n\t\tout += HEX_CHARS[n & 0xf];\n\t}\n\treturn out;\n}\n\nfunction encodeRfc3986(urlEncodedStr: string): string {\n\treturn urlEncodedStr.replace(/[!'()*]/g, (c) => '%' + c.charCodeAt(0).toString(16).toUpperCase());\n}\n\nfunction guessServiceRegion(url: URL, headers: Headers): [string, string] {\n\tconst { hostname, pathname } = url;\n\n\tif (hostname.endsWith('.on.aws')) {\n\t\tconst match = hostname.match(/^[^.]{1,63}\\.lambda-url\\.([^.]{1,63})\\.on\\.aws$/);\n\t\treturn match != null ? ['lambda', match[1] || ''] : ['', ''];\n\t}\n\tif (hostname.endsWith('.r2.cloudflarestorage.com')) {\n\t\treturn ['s3', 'auto'];\n\t}\n\tif (hostname.endsWith('.backblazeb2.com')) {\n\t\tconst match = hostname.match(/^(?:[^.]{1,63}\\.)?s3\\.([^.]{1,63})\\.backblazeb2\\.com$/);\n\t\treturn match != null ? ['s3', match[1] || ''] : ['', ''];\n\t}\n\tconst match = hostname\n\t\t.replace('dualstack.', '')\n\t\t.match(/([^.]{1,63})\\.(?:([^.]{0,63})\\.)?amazonaws\\.com(?:\\.cn)?$/);\n\tlet service = (match && match[1]) || '';\n\tlet region = match && match[2];\n\n\tif (region === 'us-gov') {\n\t\tregion = 'us-gov-west-1';\n\t} else if (region === 's3' || region === 's3-accelerate') {\n\t\tregion = 'us-east-1';\n\t\tservice = 's3';\n\t} else if (service === 'iot') {\n\t\tif (hostname.startsWith('iot.')) {\n\t\t\tservice = 'execute-api';\n\t\t} else if (hostname.startsWith('data.jobs.iot.')) {\n\t\t\tservice = 'iot-jobs-data';\n\t\t} else {\n\t\t\tservice = pathname === '/mqtt' ? 'iotdevicegateway' : 'iotdata';\n\t\t}\n\t} else if (service === 'autoscaling') {\n\t\tconst targetPrefix = (headers.get('X-Amz-Target') || '').split('.')[0];\n\t\tif (targetPrefix === 'AnyScaleFrontendService') {\n\t\t\tservice = 'application-autoscaling';\n\t\t} else if (targetPrefix === 'AnyScaleScalingPlannerFrontendService') {\n\t\t\tservice = 'autoscaling-plans';\n\t\t}\n\t} else if (region == null && service.startsWith('s3-')) {\n\t\tregion = service.slice(3).replace(/^fips-|^external-1/, '');\n\t\tservice = 's3';\n\t} else if (service.endsWith('-fips')) {\n\t\tservice = service.slice(0, -5);\n\t} else if (region && /-\\d$/.test(service) && !/-\\d$/.test(region)) {\n\t\t[service, region] = [region, service];\n\t}\n\n\treturn [HOST_SERVICES[service] || service, region || ''];\n}\n"],"mappings":"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"}